diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index aa1e388f..71e75e6b 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -56,6 +56,9 @@ jobs: - name: Lint run: pnpm lint + - name: Build Cache Config + run: pnpm check:build-cache + - name: Build run: pnpm build diff --git a/package.json b/package.json index 4daa4935..aab8008d 100644 --- a/package.json +++ b/package.json @@ -22,7 +22,8 @@ "scripts": { "build": "turbo run build", "check": "turbo run check", - "ci:validate": "pnpm lint && pnpm build && pnpm typecheck && pnpm test && pnpm test:release-publish && pnpm test:upload-release-assets && node scripts/check-docs.mjs && pnpm pack:check && pnpm verify:harness:self-test && pnpm verify:harness", + "check:build-cache": "node scripts/check-build-cache-config.mjs", + "ci:validate": "pnpm lint && pnpm check:build-cache && pnpm build && pnpm typecheck && pnpm test && pnpm test:release-publish && pnpm test:upload-release-assets && node scripts/check-docs.mjs && pnpm pack:check && pnpm verify:harness:self-test && pnpm verify:harness", "dev": "turbo run dev --parallel", "lint": "pnpm exec biome check --config-path packages/config-biome/biome.json package.json scripts && turbo run lint", "lint:fix": "pnpm exec biome check --write --unsafe --config-path packages/config-biome/biome.json package.json scripts && turbo run lint -- --write", diff --git a/packages/cli/tsconfig.build.json b/packages/cli/tsconfig.build.json index a4f396b9..1686f00d 100644 --- a/packages/cli/tsconfig.build.json +++ b/packages/cli/tsconfig.build.json @@ -4,6 +4,7 @@ "compilerOptions": { "noEmit": false, "outDir": "dist", + "tsBuildInfoFile": "dist/tsconfig.tsbuildinfo", "paths": { "@dawn-ai/core": ["../core/src/index.ts"], "@dawn-ai/langchain": ["../langchain/src/index.ts"], diff --git a/packages/core/tsconfig.json b/packages/core/tsconfig.json index 7abb9356..dd4b84e5 100644 --- a/packages/core/tsconfig.json +++ b/packages/core/tsconfig.json @@ -3,7 +3,8 @@ "extends": "../config-typescript/node.json", "compilerOptions": { "outDir": "dist", - "rootDir": "src" + "rootDir": "src", + "tsBuildInfoFile": "dist/tsconfig.tsbuildinfo" }, "include": ["src/**/*.ts"], "references": [ diff --git a/packages/create-dawn-app/tsconfig.json b/packages/create-dawn-app/tsconfig.json index 14e64fcd..38fad1c0 100644 --- a/packages/create-dawn-app/tsconfig.json +++ b/packages/create-dawn-app/tsconfig.json @@ -3,7 +3,8 @@ "extends": "../config-typescript/node.json", "compilerOptions": { "outDir": "dist", - "rootDir": "src" + "rootDir": "src", + "tsBuildInfoFile": "dist/tsconfig.tsbuildinfo" }, "include": ["src/**/*.ts"], "references": [ diff --git a/packages/devkit/tsconfig.json b/packages/devkit/tsconfig.json index 0681480b..59a03710 100644 --- a/packages/devkit/tsconfig.json +++ b/packages/devkit/tsconfig.json @@ -3,7 +3,8 @@ "extends": "../config-typescript/node.json", "compilerOptions": { "outDir": "dist", - "rootDir": "src" + "rootDir": "src", + "tsBuildInfoFile": "dist/tsconfig.tsbuildinfo" }, "include": ["src/**/*.ts"] } diff --git a/packages/evals/tsconfig.json b/packages/evals/tsconfig.json index 0681480b..59a03710 100644 --- a/packages/evals/tsconfig.json +++ b/packages/evals/tsconfig.json @@ -3,7 +3,8 @@ "extends": "../config-typescript/node.json", "compilerOptions": { "outDir": "dist", - "rootDir": "src" + "rootDir": "src", + "tsBuildInfoFile": "dist/tsconfig.tsbuildinfo" }, "include": ["src/**/*.ts"] } diff --git a/packages/langchain/tsconfig.json b/packages/langchain/tsconfig.json index 0681480b..59a03710 100644 --- a/packages/langchain/tsconfig.json +++ b/packages/langchain/tsconfig.json @@ -3,7 +3,8 @@ "extends": "../config-typescript/node.json", "compilerOptions": { "outDir": "dist", - "rootDir": "src" + "rootDir": "src", + "tsBuildInfoFile": "dist/tsconfig.tsbuildinfo" }, "include": ["src/**/*.ts"] } diff --git a/packages/langgraph/tsconfig.json b/packages/langgraph/tsconfig.json index 0681480b..59a03710 100644 --- a/packages/langgraph/tsconfig.json +++ b/packages/langgraph/tsconfig.json @@ -3,7 +3,8 @@ "extends": "../config-typescript/node.json", "compilerOptions": { "outDir": "dist", - "rootDir": "src" + "rootDir": "src", + "tsBuildInfoFile": "dist/tsconfig.tsbuildinfo" }, "include": ["src/**/*.ts"] } diff --git a/packages/memory/tsconfig.json b/packages/memory/tsconfig.json index d84a794d..6e091f6b 100644 --- a/packages/memory/tsconfig.json +++ b/packages/memory/tsconfig.json @@ -1,7 +1,11 @@ { "$schema": "https://json.schemastore.org/tsconfig", "extends": "../config-typescript/node.json", - "compilerOptions": { "outDir": "dist", "rootDir": "src" }, + "compilerOptions": { + "outDir": "dist", + "rootDir": "src", + "tsBuildInfoFile": "dist/tsconfig.tsbuildinfo" + }, "references": [{ "path": "../sqlite-storage" }], "include": ["src/**/*.ts"] } diff --git a/packages/permissions/tsconfig.json b/packages/permissions/tsconfig.json index 0681480b..59a03710 100644 --- a/packages/permissions/tsconfig.json +++ b/packages/permissions/tsconfig.json @@ -3,7 +3,8 @@ "extends": "../config-typescript/node.json", "compilerOptions": { "outDir": "dist", - "rootDir": "src" + "rootDir": "src", + "tsBuildInfoFile": "dist/tsconfig.tsbuildinfo" }, "include": ["src/**/*.ts"] } diff --git a/packages/sdk/tsconfig.contracts.json b/packages/sdk/tsconfig.contracts.json index ab732803..0fac6194 100644 --- a/packages/sdk/tsconfig.contracts.json +++ b/packages/sdk/tsconfig.contracts.json @@ -3,7 +3,8 @@ "extends": "./tsconfig.json", "compilerOptions": { "noEmit": true, - "rootDir": "." + "rootDir": ".", + "tsBuildInfoFile": "dist/tsconfig.contracts.tsbuildinfo" }, "include": ["src/**/*.ts", "test/*.contract.ts"] } diff --git a/packages/sdk/tsconfig.json b/packages/sdk/tsconfig.json index 0681480b..59a03710 100644 --- a/packages/sdk/tsconfig.json +++ b/packages/sdk/tsconfig.json @@ -3,7 +3,8 @@ "extends": "../config-typescript/node.json", "compilerOptions": { "outDir": "dist", - "rootDir": "src" + "rootDir": "src", + "tsBuildInfoFile": "dist/tsconfig.tsbuildinfo" }, "include": ["src/**/*.ts"] } diff --git a/packages/sqlite-storage/tsconfig.json b/packages/sqlite-storage/tsconfig.json index a112f0e1..59a03710 100644 --- a/packages/sqlite-storage/tsconfig.json +++ b/packages/sqlite-storage/tsconfig.json @@ -1,6 +1,10 @@ { "$schema": "https://json.schemastore.org/tsconfig", "extends": "../config-typescript/node.json", - "compilerOptions": { "outDir": "dist", "rootDir": "src" }, + "compilerOptions": { + "outDir": "dist", + "rootDir": "src", + "tsBuildInfoFile": "dist/tsconfig.tsbuildinfo" + }, "include": ["src/**/*.ts"] } diff --git a/packages/testing/tsconfig.json b/packages/testing/tsconfig.json index c3570085..3ac52036 100644 --- a/packages/testing/tsconfig.json +++ b/packages/testing/tsconfig.json @@ -1,7 +1,11 @@ { "$schema": "https://json.schemastore.org/tsconfig", "extends": "../config-typescript/node.json", - "compilerOptions": { "outDir": "dist", "rootDir": "src" }, + "compilerOptions": { + "outDir": "dist", + "rootDir": "src", + "tsBuildInfoFile": "dist/tsconfig.tsbuildinfo" + }, "references": [{ "path": "../memory" }], "include": ["src/**/*.ts"] } diff --git a/packages/vite-plugin/tsconfig.json b/packages/vite-plugin/tsconfig.json index 0681480b..59a03710 100644 --- a/packages/vite-plugin/tsconfig.json +++ b/packages/vite-plugin/tsconfig.json @@ -3,7 +3,8 @@ "extends": "../config-typescript/node.json", "compilerOptions": { "outDir": "dist", - "rootDir": "src" + "rootDir": "src", + "tsBuildInfoFile": "dist/tsconfig.tsbuildinfo" }, "include": ["src/**/*.ts"] } diff --git a/packages/workspace/tsconfig.json b/packages/workspace/tsconfig.json index 0681480b..59a03710 100644 --- a/packages/workspace/tsconfig.json +++ b/packages/workspace/tsconfig.json @@ -3,7 +3,8 @@ "extends": "../config-typescript/node.json", "compilerOptions": { "outDir": "dist", - "rootDir": "src" + "rootDir": "src", + "tsBuildInfoFile": "dist/tsconfig.tsbuildinfo" }, "include": ["src/**/*.ts"] } diff --git a/scripts/check-build-cache-config.mjs b/scripts/check-build-cache-config.mjs new file mode 100644 index 00000000..275eb0ee --- /dev/null +++ b/scripts/check-build-cache-config.mjs @@ -0,0 +1,76 @@ +import { readdirSync, readFileSync, statSync } from "node:fs" +import { dirname, join, posix, resolve } from "node:path" +import { fileURLToPath } from "node:url" + +const repoRoot = resolve(dirname(fileURLToPath(import.meta.url)), "..") +const packageRoot = join(repoRoot, "packages") + +const readJson = (path) => JSON.parse(readFileSync(path, "utf8")) +const toPosix = (path) => path.split(/[/\\]+/).join(posix.sep) + +const errors = [] +const checkedConfigs = [] + +for (const packageDirName of readdirSync(packageRoot).sort()) { + const packageDir = join(packageRoot, packageDirName) + + if (!statSync(packageDir).isDirectory()) { + continue + } + + for (const fileName of readdirSync(packageDir).sort()) { + if (!/^tsconfig(?:\..+)?\.json$/.test(fileName)) { + continue + } + + const configPath = join(packageDir, fileName) + const relativeConfigPath = toPosix(configPath.slice(repoRoot.length + 1)) + const config = readJson(configPath) + const compilerOptions = config.compilerOptions ?? {} + const outDir = compilerOptions.outDir + const tsBuildInfoFile = compilerOptions.tsBuildInfoFile + + if (typeof outDir === "string" && compilerOptions.noEmit !== true) { + const expectedBuildInfoFile = `${outDir.replace(/\/+$/, "")}/tsconfig.tsbuildinfo` + + checkedConfigs.push(relativeConfigPath) + + if (tsBuildInfoFile !== expectedBuildInfoFile) { + errors.push( + `${relativeConfigPath} must set compilerOptions.tsBuildInfoFile to ${expectedBuildInfoFile}`, + ) + } + } + + if ( + typeof tsBuildInfoFile === "string" && + !toPosix(tsBuildInfoFile).startsWith(`${toPosix(outDir ?? "dist")}/`) + ) { + errors.push( + `${relativeConfigPath} writes compilerOptions.tsBuildInfoFile outside its build output: ${tsBuildInfoFile}`, + ) + } + } +} + +const turboConfig = readJson(join(repoRoot, "turbo.json")) +const buildOutputs = turboConfig.tasks?.build?.outputs ?? [] + +if (!buildOutputs.includes("dist/**")) { + errors.push('turbo.json build task must include "dist/**" in outputs') +} + +if (errors.length > 0) { + console.error("Build cache config check failed.") + console.error("") + + for (const error of errors) { + console.error(`- ${error}`) + } + + process.exit(1) +} + +console.log( + `Build cache config check passed (${checkedConfigs.length} emitting tsconfig file(s), dist/** cached).`, +)