diff --git a/packages/client/package.json b/packages/client/package.json index caa6be2..d1ad262 100644 --- a/packages/client/package.json +++ b/packages/client/package.json @@ -50,7 +50,7 @@ "scripts": { "build": "tsup", "prepack": "node ../../scripts/assert-pnpm.mjs", - "prepublishOnly": "pnpm build", + "prepublishOnly": "node ../../scripts/assert-built.mjs", "test": "vitest run", "typecheck": "tsc --noEmit" }, diff --git a/packages/protocol/package.json b/packages/protocol/package.json index 783a92a..9cfc95d 100644 --- a/packages/protocol/package.json +++ b/packages/protocol/package.json @@ -48,7 +48,7 @@ "scripts": { "build": "tsup", "prepack": "node ../../scripts/assert-pnpm.mjs", - "prepublishOnly": "pnpm build", + "prepublishOnly": "node ../../scripts/assert-built.mjs", "typecheck": "tsc --noEmit" }, "devDependencies": { diff --git a/packages/react/package.json b/packages/react/package.json index 2dfb2d0..4c175d8 100644 --- a/packages/react/package.json +++ b/packages/react/package.json @@ -49,7 +49,7 @@ "scripts": { "build": "tsup", "prepack": "node ../../scripts/assert-pnpm.mjs", - "prepublishOnly": "pnpm build", + "prepublishOnly": "node ../../scripts/assert-built.mjs", "test": "vitest run", "typecheck": "tsc --noEmit" }, diff --git a/packages/widget-embed/package.json b/packages/widget-embed/package.json index 7522768..b783ca9 100644 --- a/packages/widget-embed/package.json +++ b/packages/widget-embed/package.json @@ -44,7 +44,7 @@ "scripts": { "build": "tsup", "prepack": "node ../../scripts/assert-pnpm.mjs", - "prepublishOnly": "pnpm build", + "prepublishOnly": "node ../../scripts/assert-built.mjs", "test": "echo \"covered by @fishaudio/agent-widget\" && exit 0", "typecheck": "tsc --noEmit" }, diff --git a/packages/widget/package.json b/packages/widget/package.json index 58a3355..83840b0 100644 --- a/packages/widget/package.json +++ b/packages/widget/package.json @@ -67,7 +67,7 @@ "scripts": { "build": "tsup", "prepack": "node ../../scripts/assert-pnpm.mjs", - "prepublishOnly": "pnpm build", + "prepublishOnly": "node ../../scripts/assert-built.mjs", "test": "vitest run", "typecheck": "tsc --noEmit", "demo": "vite -c demo/vite.config.ts" diff --git a/scripts/assert-built.mjs b/scripts/assert-built.mjs new file mode 100644 index 0000000..3a891b7 --- /dev/null +++ b/scripts/assert-built.mjs @@ -0,0 +1,21 @@ +// prepublishOnly guard: the package must already be built. +// +// Publishing used to rebuild each package, but `changeset publish` publishes +// packages concurrently and every build starts by emptying its dist/, so a +// sibling's types build could find a dependency's dist/ half-written. The +// release script builds everything once up front; this only checks that it +// happened. +import { existsSync } from "node:fs"; +import { join } from "node:path"; + +const manifest = JSON.parse( + await import("node:fs/promises").then((fs) => fs.readFile("package.json", "utf8")), +); +const entry = manifest.main ?? manifest.module ?? manifest.types; +if (!entry || !existsSync(join(process.cwd(), entry))) { + console.error( + `${manifest.name}: ${entry ?? "dist/"} is missing. Run \`pnpm build\` at the repo root ` + + "(or `pnpm release`, which builds first) before publishing.", + ); + process.exit(1); +}