diff --git a/packages/eslint-plugin-turbo/lib/utils/calculate-inputs.ts b/packages/eslint-plugin-turbo/lib/utils/calculate-inputs.ts index f32e3f925817d..ee2e9fcb95959 100644 --- a/packages/eslint-plugin-turbo/lib/utils/calculate-inputs.ts +++ b/packages/eslint-plugin-turbo/lib/utils/calculate-inputs.ts @@ -2,9 +2,8 @@ import crypto from "node:crypto"; import fs from "node:fs"; import path from "node:path"; import type { WorkspaceConfig } from "@turbo/utils"; -import { getWorkspaceConfigs } from "@turbo/utils"; +import { getWorkspaceConfigs, forEachTaskDef } from "@turbo/utils"; import type { PipelineV1, RootSchemaV1, RootSchemaV2 } from "@turbo/types"; -import { forEachTaskDef } from "@turbo/utils/src/getTurboConfigs"; import { dotEnv } from "./dotenv-processing"; import { wildcardTests } from "./wildcard-processing"; diff --git a/packages/turbo-utils/.eslintrc.js b/packages/turbo-utils/.eslintrc.cjs similarity index 100% rename from packages/turbo-utils/.eslintrc.js rename to packages/turbo-utils/.eslintrc.cjs diff --git a/packages/turbo-utils/jest.config.ts b/packages/turbo-utils/jest.config.ts index 5e62c50688bcb..39f168c522a73 100644 --- a/packages/turbo-utils/jest.config.ts +++ b/packages/turbo-utils/jest.config.ts @@ -7,6 +7,9 @@ const config = { transformIgnorePatterns: ["/node_modules/(?!(ansi-regex)/)"], verbose: process.env.RUNNER_DEBUG === "1", silent: process.env.RUNNER_DEBUG !== "1", + moduleNameMapper: { + "^(\\./.+)\\.js$": "$1", + }, } as const satisfies Config; export default config; diff --git a/packages/turbo-utils/package.json b/packages/turbo-utils/package.json index 6b7245be45d72..e0a6b2c7e2f4e 100644 --- a/packages/turbo-utils/package.json +++ b/packages/turbo-utils/package.json @@ -19,10 +19,24 @@ "bugs": { "url": "https://github.com/vercel/turborepo/issues" }, - "module": "src/index.ts", - "main": "src/index.ts", - "types": "src/index.ts", + "type": "module", + "main": "dist/cjs/index.js", + "module": "dist/esm/index.js", + "types": "dist/types/index.d.ts", + "exports": { + ".": { + "types": "./dist/types/index.d.ts", + "import": "./dist/esm/index.js", + "require": "./dist/cjs/index.js", + "default": "./dist/esm/index.js" + } + }, "scripts": { + "build": "pnpm build:esm && pnpm build:cjs && pnpm build:types && pnpm post-build", + "post-build": "echo '{ \"type\": \"commonjs\" }' > dist/cjs/package.json", + "build:esm": "tsc -p tsconfig.json", + "build:cjs": "tsc -p tsconfig.cjs.json", + "build:types": "tsc -p tsconfig.types.json", "test": "jest", "lint": "eslint src/", "check-types": "tsc --noEmit", diff --git a/packages/turbo-utils/src/createProject.ts b/packages/turbo-utils/src/createProject.ts index f5b9f547140d6..08f04ffd49410 100644 --- a/packages/turbo-utils/src/createProject.ts +++ b/packages/turbo-utils/src/createProject.ts @@ -2,7 +2,7 @@ import path from "node:path"; import retry from "async-retry"; import picocolors from "picocolors"; import fs from "fs-extra"; -import * as logger from "./logger"; +import * as logger from "./logger.js"; import { downloadAndExtractExample, downloadAndExtractRepo, @@ -10,10 +10,10 @@ import { existsInRepo, hasRepo, type RepoInfo, -} from "./examples"; -import { isWriteable } from "./isWriteable"; -import { isFolderEmpty } from "./isFolderEmpty"; -import type { PackageJson } from "./types"; +} from "./examples.js"; +import { isWriteable } from "./isWriteable.js"; +import { isFolderEmpty } from "./isFolderEmpty.js"; +import type { PackageJson } from "./types.js"; function isErrorLike(err: unknown): err is { message: string } { return ( diff --git a/packages/turbo-utils/src/examples.ts b/packages/turbo-utils/src/examples.ts index b99f6320d7f25..4c3e981a2cbe9 100644 --- a/packages/turbo-utils/src/examples.ts +++ b/packages/turbo-utils/src/examples.ts @@ -3,9 +3,11 @@ import { promisify } from "node:util"; import { join } from "node:path"; import { tmpdir } from "node:os"; import { createWriteStream, promises as fs } from "node:fs"; -import { x as extract } from "tar"; +import tar from "tar"; import got from "got"; +const { x: extract } = tar; + const pipeline = promisify(Stream.pipeline); export interface RepoInfo { diff --git a/packages/turbo-utils/src/getTurboConfigs.ts b/packages/turbo-utils/src/getTurboConfigs.ts index 45fd3bf6ce2e3..5211289c08969 100644 --- a/packages/turbo-utils/src/getTurboConfigs.ts +++ b/packages/turbo-utils/src/getTurboConfigs.ts @@ -1,7 +1,7 @@ import fs from "node:fs"; import path from "node:path"; import yaml from "js-yaml"; -import { sync } from "fast-glob"; +import glob from "fast-glob"; import JSON5 from "json5"; import type { BaseSchemaV1, @@ -10,9 +10,11 @@ import type { BaseSchemaV2, PipelineV2, } from "@turbo/types"; -import * as logger from "./logger"; -import { getTurboRoot } from "./getTurboRoot"; -import type { PackageJson, PNPMWorkspaceConfig } from "./types"; +import * as logger from "./logger.js"; +import { getTurboRoot } from "./getTurboRoot.js"; +import type { PackageJson, PNPMWorkspaceConfig } from "./types.js"; + +const { sync } = glob; const ROOT_GLOB = "{turbo.json,turbo.jsonc}"; const ROOT_WORKSPACE_GLOB = "package.json"; @@ -115,7 +117,7 @@ export function getTurboConfigs(cwd?: string, opts?: Options): TurboConfigs { if (turboRoot) { const workspaceGlobs = getWorkspaceGlobs(turboRoot); const workspaceConfigGlobs = workspaceGlobs.map( - (glob) => `${glob}/${ROOT_GLOB}` + (workspaceGlob) => `${workspaceGlob}/${ROOT_GLOB}` ); const configPaths = sync([ROOT_GLOB, ...workspaceConfigGlobs], { @@ -200,7 +202,7 @@ export function getWorkspaceConfigs( if (turboRoot) { const workspaceGlobs = getWorkspaceGlobs(turboRoot); const workspaceConfigGlobs = workspaceGlobs.map( - (glob) => `${glob}/package.json` + (workspaceGlob) => `${workspaceGlob}/package.json` ); const configPaths = sync([ROOT_WORKSPACE_GLOB, ...workspaceConfigGlobs], { diff --git a/packages/turbo-utils/src/getTurboRoot.ts b/packages/turbo-utils/src/getTurboRoot.ts index ffc729b449d1d..d30ef2d710b68 100644 --- a/packages/turbo-utils/src/getTurboRoot.ts +++ b/packages/turbo-utils/src/getTurboRoot.ts @@ -1,14 +1,13 @@ import type { Schema } from "@turbo/types"; import { findRootSync } from "@manypkg/find-root"; import json5 from "json5"; -import { searchUp } from "./searchUp"; +import { searchUp } from "./searchUp.js"; interface Options { cache?: boolean; } function contentCheck(content: string): boolean { - // eslint-disable-next-line import/no-named-as-default-member -- json5 exports different objects depending on if you're using esm or cjs (https://github.com/json5/json5/issues/240) const result: Schema | undefined = json5.parse(content); return !(result && "extends" in result); } diff --git a/packages/turbo-utils/src/index.ts b/packages/turbo-utils/src/index.ts index 118c91fb74f95..ba0384b3abcd5 100644 --- a/packages/turbo-utils/src/index.ts +++ b/packages/turbo-utils/src/index.ts @@ -1,17 +1,17 @@ // utils -export { getTurboRoot } from "./getTurboRoot"; +export { getTurboRoot } from "./getTurboRoot.js"; export { getTurboConfigs, getWorkspaceConfigs, forEachTaskDef, -} from "./getTurboConfigs"; -export { searchUp } from "./searchUp"; +} from "./getTurboConfigs.js"; +export { searchUp } from "./searchUp.js"; export { getAvailablePackageManagers, getPackageManagersBinPaths, -} from "./managers"; -export { isFolderEmpty } from "./isFolderEmpty"; -export { validateDirectory } from "./validateDirectory"; +} from "./managers.js"; +export { isFolderEmpty } from "./isFolderEmpty.js"; +export { validateDirectory } from "./validateDirectory.js"; export { isUrlOk, getRepoInfo, @@ -19,18 +19,18 @@ export { existsInRepo, downloadAndExtractRepo, downloadAndExtractExample, -} from "./examples"; -export { isWriteable } from "./isWriteable"; -export { createProject, DownloadError } from "./createProject"; -export { convertCase } from "./convertCase"; +} from "./examples.js"; +export { isWriteable } from "./isWriteable.js"; +export { createProject, DownloadError } from "./createProject.js"; +export { convertCase } from "./convertCase.js"; -export * as logger from "./logger"; +export * as logger from "./logger.js"; // types -export type { RepoInfo } from "./examples"; +export type { RepoInfo } from "./examples.js"; export type { TurboConfig, TurboConfigs, WorkspaceConfig, -} from "./getTurboConfigs"; -export * from "./types"; +} from "./getTurboConfigs.js"; +export * from "./types.js"; diff --git a/packages/turbo-utils/src/logger.ts b/packages/turbo-utils/src/logger.ts index 4e2fbac885196..466eaf8a4b0b3 100644 --- a/packages/turbo-utils/src/logger.ts +++ b/packages/turbo-utils/src/logger.ts @@ -1,13 +1,9 @@ -import { - reset, - bold as pcBold, - underline as pcUnderline, - gray, - dim, -} from "picocolors"; +import pc from "picocolors"; import ora from "ora"; import gradient from "gradient-string"; +const { reset, bold: pcBold, underline: pcUnderline, gray, dim } = pc; + const BLUE = "#0099F7"; const RED = "#F11712"; const YELLOW = "#FFFF00"; diff --git a/packages/turbo-utils/src/managers.ts b/packages/turbo-utils/src/managers.ts index c003171fbc84d..8f50b5cb2103e 100644 --- a/packages/turbo-utils/src/managers.ts +++ b/packages/turbo-utils/src/managers.ts @@ -1,7 +1,7 @@ import os from "node:os"; import type { Options } from "execa"; import execa from "execa"; -import type { PackageManager } from "./types"; +import type { PackageManager } from "./types.js"; async function exec(command: string, args: Array = [], opts?: Options) { // run the check from tmpdir to avoid corepack conflicting - diff --git a/packages/turbo-utils/src/validateDirectory.ts b/packages/turbo-utils/src/validateDirectory.ts index 14e446676ec87..2a346ad511f93 100644 --- a/packages/turbo-utils/src/validateDirectory.ts +++ b/packages/turbo-utils/src/validateDirectory.ts @@ -1,7 +1,7 @@ import path from "node:path"; import fs from "fs-extra"; import picocolors from "picocolors"; -import { isFolderEmpty } from "./isFolderEmpty"; +import { isFolderEmpty } from "./isFolderEmpty.js"; export function validateDirectory(directory: string): { valid: boolean; diff --git a/packages/turbo-utils/tsconfig.cjs.json b/packages/turbo-utils/tsconfig.cjs.json new file mode 100644 index 0000000000000..99dfd4bc90538 --- /dev/null +++ b/packages/turbo-utils/tsconfig.cjs.json @@ -0,0 +1,18 @@ +{ + "extends": "@turbo/tsconfig/library.json", + "compilerOptions": { + "rootDir": "src", + "outDir": "dist/cjs", + "module": "CommonJS", + "moduleResolution": "node", + "target": "ES2020", + "lib": ["ES2020"], + "allowSyntheticDefaultImports": true, + "esModuleInterop": true, + "resolveJsonModule": true + }, + "include": ["src/**/*"], + "ts-node": { + "esm": false + } +} \ No newline at end of file diff --git a/packages/turbo-utils/tsconfig.json b/packages/turbo-utils/tsconfig.json index 0620a3c25ef39..9690cb8c48866 100644 --- a/packages/turbo-utils/tsconfig.json +++ b/packages/turbo-utils/tsconfig.json @@ -1,6 +1,12 @@ { "extends": "@turbo/tsconfig/library.json", "compilerOptions": { - "rootDir": "." - } + "rootDir": "src", + "outDir": "dist/esm", + "module": "ESNext", + "moduleResolution": "bundler", + "target": "ESNext", + "lib": ["ESNext"] + }, + "include": ["src/**/*"] } diff --git a/packages/turbo-utils/tsconfig.types.json b/packages/turbo-utils/tsconfig.types.json new file mode 100644 index 0000000000000..599a745493e94 --- /dev/null +++ b/packages/turbo-utils/tsconfig.types.json @@ -0,0 +1,14 @@ +{ + "extends": "@turbo/tsconfig/library.json", + "compilerOptions": { + "rootDir": "src", + "outDir": "dist/types", + "declaration": true, + "emitDeclarationOnly": true, + "module": "ESNext", + "moduleResolution": "bundler", + "target": "ESNext", + "lib": ["ESNext"] + }, + "include": ["src/**/*"] +} \ No newline at end of file