From 3243647aa1d7f4b8c90d3162bf1bdca3821507d1 Mon Sep 17 00:00:00 2001 From: Sterister Date: Thu, 21 May 2026 13:29:52 +0200 Subject: [PATCH] release(v4.11.1): ship pre-built dist/ to npm registry MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit publish-all.ts now does a tsc → dist/ build per package before pack, then rewrites package.json's main/types/exports to point at the built artefacts and ensures `files: ["dist"]` so the tarball ships only the built code. The in-repo package.json is restored in the finally block so dev/typecheck keep working without a build pass. Why: strict-mode consumers (Cyndr) were forced to recompile Shade source under their own tsconfig and tripped on internal `process.env.X` accesses and implicit-any parameters. Shipping pre-built `.js` + `.d.ts` makes the strictness contract live entirely inside Shade. --- packages/shade-cli/package.json | 2 +- packages/shade-core/package.json | 2 +- packages/shade-crypto-web/package.json | 2 +- packages/shade-dashboard/package.json | 2 +- packages/shade-files/package.json | 2 +- packages/shade-inbox-server/package.json | 2 +- packages/shade-inbox/package.json | 2 +- packages/shade-key-transparency/package.json | 2 +- packages/shade-keychain/package.json | 2 +- packages/shade-observability/package.json | 2 +- packages/shade-observer/package.json | 2 +- packages/shade-proto/package.json | 2 +- packages/shade-recovery/package.json | 2 +- packages/shade-sdk/package.json | 2 +- packages/shade-server/package.json | 2 +- packages/shade-storage-encrypted/package.json | 2 +- packages/shade-storage-indexeddb/package.json | 2 +- packages/shade-storage-postgres/package.json | 2 +- packages/shade-storage-sqlite/package.json | 2 +- packages/shade-streams/package.json | 2 +- packages/shade-transfer/package.json | 2 +- packages/shade-transport-bridge/package.json | 2 +- packages/shade-transport-webrtc/package.json | 2 +- packages/shade-transport/package.json | 2 +- packages/shade-widgets/package.json | 2 +- scripts/publish-all.ts | 68 ++++++++++++++++++- 26 files changed, 90 insertions(+), 28 deletions(-) diff --git a/packages/shade-cli/package.json b/packages/shade-cli/package.json index f69f38b..9f94ffc 100644 --- a/packages/shade-cli/package.json +++ b/packages/shade-cli/package.json @@ -1,6 +1,6 @@ { "name": "@shade/cli", - "version": "4.11.0", + "version": "4.11.1", "type": "module", "main": "src/cli.ts", "bin": { diff --git a/packages/shade-core/package.json b/packages/shade-core/package.json index 27f9167..af32a2d 100644 --- a/packages/shade-core/package.json +++ b/packages/shade-core/package.json @@ -1,6 +1,6 @@ { "name": "@shade/core", - "version": "4.11.0", + "version": "4.11.1", "type": "module", "main": "src/index.ts", "types": "src/index.ts", diff --git a/packages/shade-crypto-web/package.json b/packages/shade-crypto-web/package.json index a1ae887..36cfaa9 100644 --- a/packages/shade-crypto-web/package.json +++ b/packages/shade-crypto-web/package.json @@ -1,6 +1,6 @@ { "name": "@shade/crypto-web", - "version": "4.11.0", + "version": "4.11.1", "type": "module", "main": "src/index.ts", "types": "src/index.ts", diff --git a/packages/shade-dashboard/package.json b/packages/shade-dashboard/package.json index 3b009d9..1ae2bca 100644 --- a/packages/shade-dashboard/package.json +++ b/packages/shade-dashboard/package.json @@ -1,6 +1,6 @@ { "name": "@shade/dashboard", - "version": "4.11.0", + "version": "4.11.1", "type": "module", "scripts": { "dev": "vite", diff --git a/packages/shade-files/package.json b/packages/shade-files/package.json index 252ad77..e9c0f8e 100644 --- a/packages/shade-files/package.json +++ b/packages/shade-files/package.json @@ -1,6 +1,6 @@ { "name": "@shade/files", - "version": "4.11.0", + "version": "4.11.1", "type": "module", "main": "src/index.ts", "types": "src/index.ts", diff --git a/packages/shade-inbox-server/package.json b/packages/shade-inbox-server/package.json index 318550e..86e15b0 100644 --- a/packages/shade-inbox-server/package.json +++ b/packages/shade-inbox-server/package.json @@ -1,6 +1,6 @@ { "name": "@shade/inbox-server", - "version": "4.11.0", + "version": "4.11.1", "type": "module", "main": "src/index.ts", "types": "src/index.ts", diff --git a/packages/shade-inbox/package.json b/packages/shade-inbox/package.json index acc3532..0985146 100644 --- a/packages/shade-inbox/package.json +++ b/packages/shade-inbox/package.json @@ -1,6 +1,6 @@ { "name": "@shade/inbox", - "version": "4.11.0", + "version": "4.11.1", "type": "module", "main": "src/index.ts", "types": "src/index.ts", diff --git a/packages/shade-key-transparency/package.json b/packages/shade-key-transparency/package.json index 9ba085a..cd1605f 100644 --- a/packages/shade-key-transparency/package.json +++ b/packages/shade-key-transparency/package.json @@ -1,6 +1,6 @@ { "name": "@shade/key-transparency", - "version": "4.11.0", + "version": "4.11.1", "type": "module", "main": "src/index.ts", "types": "src/index.ts", diff --git a/packages/shade-keychain/package.json b/packages/shade-keychain/package.json index fcad838..dc20efb 100644 --- a/packages/shade-keychain/package.json +++ b/packages/shade-keychain/package.json @@ -1,6 +1,6 @@ { "name": "@shade/keychain", - "version": "4.11.0", + "version": "4.11.1", "type": "module", "main": "src/index.ts", "types": "src/index.ts", diff --git a/packages/shade-observability/package.json b/packages/shade-observability/package.json index 7983550..a131151 100644 --- a/packages/shade-observability/package.json +++ b/packages/shade-observability/package.json @@ -1,6 +1,6 @@ { "name": "@shade/observability", - "version": "4.11.0", + "version": "4.11.1", "type": "module", "main": "src/index.ts", "types": "src/index.ts", diff --git a/packages/shade-observer/package.json b/packages/shade-observer/package.json index 4e14945..7bbe454 100644 --- a/packages/shade-observer/package.json +++ b/packages/shade-observer/package.json @@ -1,6 +1,6 @@ { "name": "@shade/observer", - "version": "4.11.0", + "version": "4.11.1", "type": "module", "main": "src/index.ts", "types": "src/index.ts", diff --git a/packages/shade-proto/package.json b/packages/shade-proto/package.json index 10c350d..823782f 100644 --- a/packages/shade-proto/package.json +++ b/packages/shade-proto/package.json @@ -1,6 +1,6 @@ { "name": "@shade/proto", - "version": "4.11.0", + "version": "4.11.1", "type": "module", "main": "src/index.ts", "types": "src/index.ts", diff --git a/packages/shade-recovery/package.json b/packages/shade-recovery/package.json index 61a2885..b13b963 100644 --- a/packages/shade-recovery/package.json +++ b/packages/shade-recovery/package.json @@ -1,6 +1,6 @@ { "name": "@shade/recovery", - "version": "4.11.0", + "version": "4.11.1", "type": "module", "main": "src/index.ts", "types": "src/index.ts", diff --git a/packages/shade-sdk/package.json b/packages/shade-sdk/package.json index a57986a..8127f8b 100644 --- a/packages/shade-sdk/package.json +++ b/packages/shade-sdk/package.json @@ -1,6 +1,6 @@ { "name": "@shade/sdk", - "version": "4.11.0", + "version": "4.11.1", "type": "module", "main": "src/index.ts", "types": "src/index.ts", diff --git a/packages/shade-server/package.json b/packages/shade-server/package.json index 794b4d3..474490f 100644 --- a/packages/shade-server/package.json +++ b/packages/shade-server/package.json @@ -1,6 +1,6 @@ { "name": "@shade/server", - "version": "4.11.0", + "version": "4.11.1", "type": "module", "main": "src/index.ts", "types": "src/index.ts", diff --git a/packages/shade-storage-encrypted/package.json b/packages/shade-storage-encrypted/package.json index 8dc79bd..2456c17 100644 --- a/packages/shade-storage-encrypted/package.json +++ b/packages/shade-storage-encrypted/package.json @@ -1,6 +1,6 @@ { "name": "@shade/storage-encrypted", - "version": "4.11.0", + "version": "4.11.1", "type": "module", "main": "src/index.ts", "types": "src/index.ts", diff --git a/packages/shade-storage-indexeddb/package.json b/packages/shade-storage-indexeddb/package.json index 664460d..97fe1f7 100644 --- a/packages/shade-storage-indexeddb/package.json +++ b/packages/shade-storage-indexeddb/package.json @@ -1,6 +1,6 @@ { "name": "@shade/storage-indexeddb", - "version": "4.11.0", + "version": "4.11.1", "type": "module", "main": "src/index.ts", "types": "src/index.ts", diff --git a/packages/shade-storage-postgres/package.json b/packages/shade-storage-postgres/package.json index b807ac7..9a878a0 100644 --- a/packages/shade-storage-postgres/package.json +++ b/packages/shade-storage-postgres/package.json @@ -1,6 +1,6 @@ { "name": "@shade/storage-postgres", - "version": "4.11.0", + "version": "4.11.1", "type": "module", "main": "src/index.ts", "types": "src/index.ts", diff --git a/packages/shade-storage-sqlite/package.json b/packages/shade-storage-sqlite/package.json index c82c467..8a1e52f 100644 --- a/packages/shade-storage-sqlite/package.json +++ b/packages/shade-storage-sqlite/package.json @@ -1,6 +1,6 @@ { "name": "@shade/storage-sqlite", - "version": "4.11.0", + "version": "4.11.1", "type": "module", "main": "src/index.ts", "types": "src/index.ts", diff --git a/packages/shade-streams/package.json b/packages/shade-streams/package.json index dec3d27..4d1e66e 100644 --- a/packages/shade-streams/package.json +++ b/packages/shade-streams/package.json @@ -1,6 +1,6 @@ { "name": "@shade/streams", - "version": "4.11.0", + "version": "4.11.1", "type": "module", "main": "src/index.ts", "types": "src/index.ts", diff --git a/packages/shade-transfer/package.json b/packages/shade-transfer/package.json index c34ee59..98fc95a 100644 --- a/packages/shade-transfer/package.json +++ b/packages/shade-transfer/package.json @@ -1,6 +1,6 @@ { "name": "@shade/transfer", - "version": "4.11.0", + "version": "4.11.1", "type": "module", "main": "src/index.ts", "types": "src/index.ts", diff --git a/packages/shade-transport-bridge/package.json b/packages/shade-transport-bridge/package.json index 8c6c8e3..b6411b9 100644 --- a/packages/shade-transport-bridge/package.json +++ b/packages/shade-transport-bridge/package.json @@ -1,6 +1,6 @@ { "name": "@shade/transport-bridge", - "version": "4.11.0", + "version": "4.11.1", "type": "module", "main": "src/index.ts", "types": "src/index.ts", diff --git a/packages/shade-transport-webrtc/package.json b/packages/shade-transport-webrtc/package.json index 596c857..73f9c4d 100644 --- a/packages/shade-transport-webrtc/package.json +++ b/packages/shade-transport-webrtc/package.json @@ -1,6 +1,6 @@ { "name": "@shade/transport-webrtc", - "version": "4.11.0", + "version": "4.11.1", "type": "module", "main": "src/index.ts", "types": "src/index.ts", diff --git a/packages/shade-transport/package.json b/packages/shade-transport/package.json index b5248d0..ea81100 100644 --- a/packages/shade-transport/package.json +++ b/packages/shade-transport/package.json @@ -1,6 +1,6 @@ { "name": "@shade/transport", - "version": "4.11.0", + "version": "4.11.1", "type": "module", "main": "src/index.ts", "types": "src/index.ts", diff --git a/packages/shade-widgets/package.json b/packages/shade-widgets/package.json index e6d0584..2f68617 100644 --- a/packages/shade-widgets/package.json +++ b/packages/shade-widgets/package.json @@ -1,6 +1,6 @@ { "name": "@shade/widgets", - "version": "4.11.0", + "version": "4.11.1", "type": "module", "main": "src/index.ts", "types": "src/index.ts", diff --git a/scripts/publish-all.ts b/scripts/publish-all.ts index d0ddd81..09ba6f5 100644 --- a/scripts/publish-all.ts +++ b/scripts/publish-all.ts @@ -99,10 +99,23 @@ async function main() { const pkgJson = JSON.parse(originalPkgJson); console.log(`→ ${pkgJson.name}@${pkgJson.version}`); - rewriteWorkspaceSpecs(pkgJson, versionByName); - writeFileSync(pkgJsonPath, `${JSON.stringify(pkgJson, null, 2)}\n`); - try { + // Phase 1 — build. Leave `main`/`types`/`exports` pointing at `src/` + // so `tsc` can resolve cross-package `@shade/*` imports through + // workspace source (`dist/` doesn't exist yet for sibling packages + // when their package.json points there). We ship pre-built artefacts + // so strict-mode consumers (Cyndr et al.) don't recompile our source. + await $`cd ${pkgDir} && rm -rf dist && bunx tsc -p tsconfig.json`.quiet(); + + // Phase 2 — rewrite package.json for the publish surface. Swap entry + // points to `dist/`, drop `workspace:*` for real versions, ensure + // `files: ["dist"]` so npm pack ships only the built artefacts. + // Restored from `originalPkgJson` in the `finally` block at the end. + rewriteWorkspaceSpecs(pkgJson, versionByName); + rewriteEntryPointsForDist(pkgJson); + ensureFilesIncludesDist(pkgJson); + writeFileSync(pkgJsonPath, `${JSON.stringify(pkgJson, null, 2)}\n`); + if (dryRun) { await $`cd ${pkgDir} && bun pm pack --dry-run`.quiet(); } else { @@ -159,6 +172,55 @@ function rewriteWorkspaceSpecs( } } +/** + * Swap `src/*.ts` references in `main`, `types`, and every `exports.` + * entry over to `dist/*.{js,d.ts}` for the duration of the publish. The + * in-repo `package.json` is restored from `originalPkgJson` after pack so + * the source-pointing form survives in git. + * + * Why this lives at publish time instead of permanently: tooling that runs + * before any build (`tsc --noEmit`, IDE hover, the workspace dev loop) needs + * `main` to point at source so cross-package imports resolve without a + * forced build pass. Shipping dist-only is a consumer-facing concern. + */ +function rewriteEntryPointsForDist(pkgJson: Record): void { + if (typeof pkgJson.main === 'string') { + pkgJson.main = pkgJson.main.replace(/^src\//, 'dist/').replace(/\.ts$/, '.js'); + } + if (typeof pkgJson.types === 'string') { + pkgJson.types = pkgJson.types.replace(/^src\//, 'dist/').replace(/\.ts$/, '.d.ts'); + } + if (pkgJson.exports !== undefined) { + pkgJson.exports = mapExportsForDist(pkgJson.exports); + } +} + +function mapExportsForDist(node: unknown, isTypesCondition = false): unknown { + if (typeof node === 'string') { + if (!node.startsWith('./src/')) return node; + return node + .replace(/^\.\/src\//, './dist/') + .replace(/\.ts$/, isTypesCondition ? '.d.ts' : '.js'); + } + if (node === null || typeof node !== 'object' || Array.isArray(node)) { + return node; + } + const out: Record = {}; + for (const [key, value] of Object.entries(node as Record)) { + out[key] = mapExportsForDist(value, key === 'types' || isTypesCondition); + } + return out; +} + +function ensureFilesIncludesDist(pkgJson: Record): void { + const files = pkgJson['files']; + if (Array.isArray(files)) { + if (!files.includes('dist')) files.push('dist'); + } else { + pkgJson['files'] = ['dist']; + } +} + main().catch((err) => { console.error(err); process.exit(1);