@smoothbricks/cli 0.10.3 → 0.10.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (115) hide show
  1. package/README.md +9 -13
  2. package/dist/bun/preload.d.ts +13 -0
  3. package/dist/bun/preload.d.ts.map +1 -0
  4. package/dist/bun/preload.js +12 -0
  5. package/dist/cli.js +13 -5
  6. package/dist/generate/index.d.ts.map +1 -1
  7. package/dist/generate/index.js +0 -6
  8. package/dist/github-ci/index.d.ts.map +1 -1
  9. package/dist/github-ci/index.js +52 -16
  10. package/dist/github-ci/outputs.d.ts.map +1 -1
  11. package/dist/github-ci/outputs.js +1 -2
  12. package/dist/lib/cli-package.js +2 -2
  13. package/dist/lib/json.d.ts +120 -11
  14. package/dist/lib/json.d.ts.map +1 -1
  15. package/dist/lib/json.js +319 -29
  16. package/dist/lib/workspace.d.ts +7 -14
  17. package/dist/lib/workspace.d.ts.map +1 -1
  18. package/dist/lib/workspace.js +76 -82
  19. package/dist/monorepo/ci-workflow.d.ts +2 -0
  20. package/dist/monorepo/ci-workflow.d.ts.map +1 -1
  21. package/dist/monorepo/ci-workflow.js +27 -1
  22. package/dist/monorepo/git-config.js +2 -2
  23. package/dist/monorepo/index.d.ts +4 -2
  24. package/dist/monorepo/index.d.ts.map +1 -1
  25. package/dist/monorepo/index.js +19 -3
  26. package/dist/monorepo/lockfile.d.ts +14 -1
  27. package/dist/monorepo/lockfile.d.ts.map +1 -1
  28. package/dist/monorepo/lockfile.js +33 -21
  29. package/dist/monorepo/managed-files.d.ts +11 -0
  30. package/dist/monorepo/managed-files.d.ts.map +1 -1
  31. package/dist/monorepo/managed-files.js +57 -32
  32. package/dist/monorepo/package-policy.d.ts.map +1 -1
  33. package/dist/monorepo/package-policy.js +52 -45
  34. package/dist/monorepo/packed-manifest.d.ts +5 -2
  35. package/dist/monorepo/packed-manifest.d.ts.map +1 -1
  36. package/dist/monorepo/packed-manifest.js +16 -47
  37. package/dist/monorepo/packed-package.d.ts.map +1 -1
  38. package/dist/monorepo/packed-package.js +28 -16
  39. package/dist/monorepo/packs/index.d.ts.map +1 -1
  40. package/dist/monorepo/packs/index.js +14 -5
  41. package/dist/monorepo/publish-workflow.js +3 -1
  42. package/dist/monorepo/runtime.d.ts +15 -0
  43. package/dist/monorepo/runtime.d.ts.map +1 -1
  44. package/dist/monorepo/runtime.js +66 -12
  45. package/dist/monorepo/tool-validation.d.ts +2 -2
  46. package/dist/monorepo/tool-validation.d.ts.map +1 -1
  47. package/dist/monorepo/tool-validation.js +141 -38
  48. package/dist/monorepo/wrangler.d.ts.map +1 -1
  49. package/dist/monorepo/wrangler.js +13 -13
  50. package/dist/nx/index.d.ts +9 -7
  51. package/dist/nx/index.d.ts.map +1 -1
  52. package/dist/nx/index.js +48 -31
  53. package/dist/pr/index.d.ts.map +1 -1
  54. package/dist/pr/index.js +28 -32
  55. package/dist/release/candidates.d.ts +3 -2
  56. package/dist/release/candidates.d.ts.map +1 -1
  57. package/dist/release/candidates.js +4 -5
  58. package/dist/release/index.d.ts +1 -0
  59. package/dist/release/index.d.ts.map +1 -1
  60. package/dist/release/index.js +88 -59
  61. package/dist/wrangler/prepare-env.d.ts +0 -1
  62. package/dist/wrangler/prepare-env.d.ts.map +1 -1
  63. package/dist/wrangler/prepare-env.js +100 -51
  64. package/dist/wrangler/scaffold.d.ts.map +1 -1
  65. package/dist/wrangler/scaffold.js +12 -12
  66. package/managed/raw/envrc +5 -3
  67. package/managed/raw/git-format-staged.yml +19 -1
  68. package/managed/raw/patches/ttsc@0.19.3.patch +67 -0
  69. package/managed/raw/tooling/direnv/github-actions-bootstrap.sh +2 -1
  70. package/managed/raw/tooling/direnv/merge-newer-pins.sh +3 -3
  71. package/managed/raw/tooling/direnv/setup-environment.ts +170 -19
  72. package/managed/raw/tooling/git-hooks/pre-commit.sh +0 -6
  73. package/managed/templates/github/actions/cache-node-modules/action.yml +5 -2
  74. package/managed/templates/github/actions/cache-ttsc-plugins/action.yml +19 -0
  75. package/managed/templates/github/actions/setup-devenv/action.yml +5 -0
  76. package/managed/templates/github/workflows/managed-files.yml +80 -0
  77. package/package.json +15 -4
  78. package/src/bun/preload.ts +12 -0
  79. package/src/cli.ts +20 -8
  80. package/src/generate/index.ts +0 -6
  81. package/src/github-ci/index.ts +49 -18
  82. package/src/github-ci/outputs.ts +1 -2
  83. package/src/lib/cli-package.ts +2 -2
  84. package/src/lib/json.ts +293 -32
  85. package/src/lib/workspace.ts +88 -100
  86. package/src/monorepo/__tests__/ci-workflow.test.ts +3 -3
  87. package/src/monorepo/ci-workflow.ts +27 -1
  88. package/src/monorepo/git-config.ts +2 -2
  89. package/src/monorepo/index.ts +19 -3
  90. package/src/monorepo/lockfile.test.ts +35 -36
  91. package/src/monorepo/lockfile.ts +49 -24
  92. package/src/monorepo/managed-files.test.ts +1 -0
  93. package/src/monorepo/managed-files.ts +62 -38
  94. package/src/monorepo/package-policy.test.ts +20 -50
  95. package/src/monorepo/package-policy.ts +76 -59
  96. package/src/monorepo/packed-manifest.ts +18 -52
  97. package/src/monorepo/packed-package.ts +43 -22
  98. package/src/monorepo/packs/index.ts +14 -5
  99. package/src/monorepo/publish-workflow.ts +3 -1
  100. package/src/monorepo/runtime.test.ts +42 -3
  101. package/src/monorepo/runtime.ts +90 -12
  102. package/src/monorepo/tool-validation.test.ts +38 -16
  103. package/src/monorepo/tool-validation.ts +149 -41
  104. package/src/monorepo/wrangler.test.ts +11 -15
  105. package/src/monorepo/wrangler.ts +15 -15
  106. package/src/nx/index.test.ts +9 -5
  107. package/src/nx/index.ts +69 -42
  108. package/src/pr/index.ts +42 -36
  109. package/src/release/__tests__/candidates.test.ts +5 -4
  110. package/src/release/__tests__/trust-publisher.test.ts +7 -0
  111. package/src/release/candidates.ts +10 -17
  112. package/src/release/index.ts +110 -73
  113. package/src/wrangler/prepare-env.ts +75 -54
  114. package/src/wrangler/scaffold.test.ts +9 -12
  115. package/src/wrangler/scaffold.ts +13 -13
package/dist/pr/index.js CHANGED
@@ -1,12 +1,22 @@
1
1
  import { mkdirSync, rmSync, writeFileSync } from 'node:fs';
2
2
  import { dirname, join } from 'node:path';
3
+ import typia from 'typia';
3
4
  import { formatMarkerHits, scanRefChangedForMarkers } from '../lib/conflict-markers.js';
4
- import { isRecord, readJson } from '../lib/json.js';
5
+ import { readJson } from '../lib/json.js';
5
6
  import { run, runResult } from '../lib/run.js';
6
7
  const defaultShell = {
7
8
  runResult: (command, args, cwd) => runResult(command, args, cwd),
8
9
  run: (command, args, cwd) => run(command, args, cwd),
9
10
  };
11
+ const parseGhPrViewJson = (() => {
12
+ const _io0 = input => "number" === typeof input.number && "string" === typeof input.url && "string" === typeof input.headRefName && "string" === typeof input.baseRefName && (undefined === input.isCrossRepository || "boolean" === typeof input.isCrossRepository);
13
+ const __is = input => "object" === typeof input && null !== input && _io0(input);
14
+ return input => { input = JSON.parse(input); return __is(input) ? input : null; };
15
+ })();
16
+ const isPrResolveStateJson = (() => {
17
+ const _io0 = input => "number" === typeof input.pr && (undefined === input.url || "string" === typeof input.url) && "string" === typeof input.headBranch && "string" === typeof input.baseBranch && "string" === typeof input.remote && (undefined === input.crossRepo || "boolean" === typeof input.crossRepo) && (undefined === input.originalBranch || "string" === typeof input.originalBranch) && (undefined === input.originalSha || "string" === typeof input.originalSha) && (undefined === input.startedAt || "string" === typeof input.startedAt);
18
+ return input => "object" === typeof input && null !== input && _io0(input);
19
+ })();
10
20
  /**
11
21
  * Agent-first conflict resolution for a GitHub PR.
12
22
  *
@@ -122,23 +132,16 @@ async function prMeta(shell, root, prArg) {
122
132
  if (result.exitCode !== 0) {
123
133
  throw new Error(`Could not resolve PR '${prArg}' via gh: ${result.stderr.trim() || `exit ${result.exitCode}`}`);
124
134
  }
125
- const raw = JSON.parse(result.stdout);
126
- if (!isRecord(raw)) {
135
+ const raw = parseGhPrViewJson(result.stdout);
136
+ if (!raw) {
127
137
  throw new Error(`gh pr view returned unexpected JSON for '${prArg}'.`);
128
138
  }
129
- const { number, url, headRefName, baseRefName } = raw;
130
- if (typeof number !== 'number' ||
131
- typeof url !== 'string' ||
132
- typeof headRefName !== 'string' ||
133
- typeof baseRefName !== 'string') {
134
- throw new Error(`gh pr view JSON for '${prArg}' is missing expected fields.`);
135
- }
136
- const match = /github\.com\/([^/]+\/[^/]+)\/pull\//.exec(url);
139
+ const match = /github\.com\/([^/]+\/[^/]+)\/pull\//.exec(raw.url);
137
140
  return {
138
- number,
139
- url,
140
- headBranch: headRefName,
141
- baseBranch: baseRefName,
141
+ number: raw.number,
142
+ url: raw.url,
143
+ headBranch: raw.headRefName,
144
+ baseBranch: raw.baseRefName,
142
145
  crossRepo: raw.isCrossRepository === true,
143
146
  nameWithOwner: match ? match[1] : '',
144
147
  };
@@ -225,26 +228,19 @@ function readState(statePath) {
225
228
  catch {
226
229
  return null;
227
230
  }
228
- if (!isRecord(raw)) {
229
- return null;
230
- }
231
- const { pr, url, headBranch, baseBranch, remote, crossRepo, originalBranch, originalSha, startedAt } = raw;
232
- if (typeof pr !== 'number' ||
233
- typeof headBranch !== 'string' ||
234
- typeof baseBranch !== 'string' ||
235
- typeof remote !== 'string') {
231
+ if (!isPrResolveStateJson(raw)) {
236
232
  return null;
237
233
  }
238
234
  return {
239
- pr,
240
- url: typeof url === 'string' ? url : '',
241
- headBranch,
242
- baseBranch,
243
- remote,
244
- crossRepo: crossRepo === true,
245
- originalBranch: typeof originalBranch === 'string' ? originalBranch : '',
246
- originalSha: typeof originalSha === 'string' ? originalSha : '',
247
- startedAt: typeof startedAt === 'string' ? startedAt : '',
235
+ pr: raw.pr,
236
+ url: raw.url ?? '',
237
+ headBranch: raw.headBranch,
238
+ baseBranch: raw.baseBranch,
239
+ remote: raw.remote,
240
+ crossRepo: raw.crossRepo === true,
241
+ originalBranch: raw.originalBranch ?? '',
242
+ originalSha: raw.originalSha ?? '',
243
+ startedAt: raw.startedAt ?? '',
248
244
  };
249
245
  }
250
246
  function writeState(statePath, state) {
@@ -1,10 +1,11 @@
1
+ import type { PackageJson } from '../lib/json.js';
1
2
  import type { ReleasePackageInfo } from './core.js';
2
3
  export interface AutoReleaseCandidateShell {
3
4
  gitRefExists(ref: string): Promise<boolean>;
4
5
  latestStableReleaseRef(projectName: string): Promise<string | null>;
5
6
  packageChangedFilesSince(ref: string, packagePath: string): Promise<string[]>;
6
- packageJsonAtRef(ref: string, packagePath: string): Promise<Record<string, unknown> | null>;
7
- currentPackageJson(packagePath: string): Promise<Record<string, unknown> | null>;
7
+ packageJsonAtRef(ref: string, packagePath: string): Promise<PackageJson | null>;
8
+ currentPackageJson(packagePath: string): Promise<PackageJson | null>;
8
9
  packageBuildInputPatterns(projectName: string, packagePath: string): Promise<string[]>;
9
10
  packageHasHistory(packagePath: string): Promise<boolean>;
10
11
  }
@@ -1 +1 @@
1
- {"version":3,"file":"candidates.d.ts","sourceRoot":"","sources":["../../src/release/candidates.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AAGpD,MAAM,WAAW,yBAAyB;IACxC,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC5C,sBAAsB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IACpE,wBAAwB,CAAC,GAAG,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAC9E,gBAAgB,CAAC,GAAG,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC;IAC5F,kBAAkB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC;IACjF,yBAAyB,CAAC,WAAW,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IACvF,iBAAiB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CAC1D;AAgCD,wBAAsB,4BAA4B,CAAC,OAAO,SAAS,kBAAkB,EACnF,KAAK,EAAE,yBAAyB,EAChC,QAAQ,EAAE,OAAO,EAAE,GAClB,OAAO,CAAC,OAAO,EAAE,CAAC,CAQpB"}
1
+ {"version":3,"file":"candidates.d.ts","sourceRoot":"","sources":["../../src/release/candidates.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AAGpD,MAAM,WAAW,yBAAyB;IACxC,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC5C,sBAAsB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IACpE,wBAAwB,CAAC,GAAG,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAC9E,gBAAgB,CAAC,GAAG,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC;IAChF,kBAAkB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC;IACrE,yBAAyB,CAAC,WAAW,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IACvF,iBAAiB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CAC1D;AAgCD,wBAAsB,4BAA4B,CAAC,OAAO,SAAS,kBAAkB,EACnF,KAAK,EAAE,yBAAyB,EAChC,QAAQ,EAAE,OAAO,EAAE,GAClB,OAAO,CAAC,OAAO,EAAE,CAAC,CAQpB"}
@@ -1,4 +1,3 @@
1
- import { isRecord } from '../lib/json.js';
2
1
  import { releaseTag } from './core.js';
3
2
  const releasableManifestKeys = [
4
3
  'author',
@@ -80,7 +79,7 @@ async function packageHasReleasableChangesSince(shell, ref, pkg) {
80
79
  }
81
80
  function releasableManifestChanged(previousManifest, currentManifest) {
82
81
  for (const key of releasableManifestKeys) {
83
- if (!stableJsonEqual(previousManifest[key], currentManifest[key])) {
82
+ if (!stableJsonEqual(Reflect.get(previousManifest, key), Reflect.get(currentManifest, key))) {
84
83
  return true;
85
84
  }
86
85
  }
@@ -159,7 +158,7 @@ function isManifestFilesPath(path, manifest) {
159
158
  return false;
160
159
  }
161
160
  for (const entry of files) {
162
- if (typeof entry !== 'string' || entry.length === 0 || entry.startsWith('!')) {
161
+ if (entry.length === 0 || entry.startsWith('!')) {
163
162
  continue;
164
163
  }
165
164
  if (matchesManifestFilesEntry(path, entry)) {
@@ -182,10 +181,10 @@ function stableJson(value) {
182
181
  if (Array.isArray(value)) {
183
182
  return value.map(stableJson);
184
183
  }
185
- if (isRecord(value)) {
184
+ if (typeof value === 'object' && value !== null && !Array.isArray(value)) {
186
185
  const normalized = {};
187
186
  for (const key of Object.keys(value).sort()) {
188
- normalized[key] = stableJson(value[key]);
187
+ normalized[key] = stableJson(Reflect.get(value, key));
189
188
  }
190
189
  return normalized;
191
190
  }
@@ -77,6 +77,7 @@ export declare function configureTrustedPublishers<Package extends ReleasePackag
77
77
  export declare function releaseBootstrapNpmPackages(root: string, options: ReleaseBootstrapNpmPackagesOptions): Promise<void>;
78
78
  export declare function releaseRetagUnpublished(root: string, options: ReleaseRetagUnpublishedOptions): Promise<void>;
79
79
  export declare function printReleaseState(root: string): Promise<void>;
80
+ /** npm trust list/setup requires an authenticated package owner. */
80
81
  export declare function npmTrustListAccessDenied(stdout: string, stderr: string): boolean;
81
82
  export declare function parseTrustedPublishers(stdout: string, packageName: string): TrustedPublisher[];
82
83
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/release/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/release/index.ts"],"names":[],"mappings":"AAwBA,OAAO,EACL,KAAK,2BAA2B,EAIjC,MAAM,6BAA6B,CAAC;AAErC,OAAO,EAML,KAAK,kBAAkB,EAGxB,MAAM,WAAW,CAAC;AAsBnB,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,2BAA2B;IAC1C,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,6BAA6B;IAC5C,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,4BAA4B;IAC3C,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;CACrB;AAED,MAAM,WAAW,kCAAkC;IACjD,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;CACrB;AAED,MAAM,WAAW,8BAA8B;IAC7C,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,wBAAsB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAAC,IAAI,CAAC,CAwBhG;AAED,wBAAsB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAAC,IAAI,CAAC,CAiDhG;AAED,wBAAsB,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,2BAA2B,GAAG,OAAO,CAAC,IAAI,CAAC,CAc5G;AAED,wBAAsB,6BAA6B,CACjD,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,6BAA6B,GACrC,OAAO,CAAC,IAAI,CAAC,CA8Bf;AAED,wBAAsB,qBAAqB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,4BAA4B,GAAG,OAAO,CAAC,IAAI,CAAC,CA8B9G;AAED,wBAAgB,kBAAkB,CAChC,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,OAAO,GACd,MAAM,EAAE,CAMV;AAED,MAAM,WAAW,mBAAmB,CAAC,OAAO,SAAS,kBAAkB,GAAG,kBAAkB;IAC1F,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,mBAAmB,IAAI,OAAO,EAAE,CAAC;IACjC,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC9C,oBAAoB,CAAC,OAAO,EAAE,2BAA2B,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;IAC/E,cAAc,CAAC,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAAC;IAC3G,iBAAiB,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAAC,sBAAsB,CAAC,CAAC;IACjE,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACvB,GAAG,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B;AAED,MAAM,MAAM,oBAAoB,GAAG,YAAY,GAAG,oBAAoB,CAAC;AAEvE,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,MAAM,EAAE,eAAe,CAAC;IACjC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,MAAM,sBAAsB,GAAG,gBAAgB,EAAE,GAAG,oBAAoB,CAAC;AAE/E,wBAAsB,0BAA0B,CAAC,OAAO,SAAS,kBAAkB,EACjF,KAAK,EAAE,mBAAmB,CAAC,OAAO,CAAC,EACnC,OAAO,EAAE,4BAA4B,GACpC,OAAO,CAAC,IAAI,CAAC,CAuEf;AAkED,wBAAsB,2BAA2B,CAC/C,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,kCAAkC,GAC1C,OAAO,CAAC,IAAI,CAAC,CAiBf;AAED,wBAAsB,uBAAuB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,8BAA8B,GAAG,OAAO,CAAC,IAAI,CAAC,CAelH;AAED,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAEnE;AAkoCD,oEAAoE;AACpE,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAShF;AA8CD,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,gBAAgB,EAAE,CAkB9F"}
@@ -1,15 +1,18 @@
1
+ import { existsSync, readFileSync } from 'node:fs';
1
2
  import { appendFile, mkdtemp, rm, writeFile } from 'node:fs/promises';
2
3
  import { tmpdir } from 'node:os';
3
4
  import { join, resolve } from 'node:path';
4
5
  import { createInterface } from 'node:readline/promises';
5
6
  import { Writable } from 'node:stream';
6
7
  import { $ } from 'bun';
8
+ import typia from 'typia';
7
9
  import { githubCiApplyOutputs, githubCiNxRunMany } from '../github-ci/index.js';
8
10
  import { assertNoConflictMarkers } from '../lib/conflict-markers.js';
9
11
  import { withDevenvEnv } from '../lib/devenv.js';
10
- import { isRecord, readJsonObject, stringProperty } from '../lib/json.js';
12
+ import { parseNxJsonText, parseNxProjectJsonText, parsePackageJsonText, } from '../lib/json.js';
11
13
  import { decode, run, runInteractiveStatus, runResult } from '../lib/run.js';
12
14
  import { listReleasePackages, readPackageJson, repositoryInfo } from '../lib/workspace.js';
15
+ import { syncBunLockfileVersions } from '../monorepo/lockfile.js';
13
16
  import { readPackedPackageJson, validatePackedWorkspaceDependencies } from '../monorepo/packed-manifest.js';
14
17
  import { bootstrapNpmPackages, NPM_BOOTSTRAP_DIST_TAG, NPM_BOOTSTRAP_VERSION, } from './bootstrap-npm-packages.js';
15
18
  import { autoReleaseCandidatePackages } from './candidates.js';
@@ -299,6 +302,10 @@ async function listUnpublishedPackages(root, packages) {
299
302
  async function publishPackedPackage(root, pkg, tag, dryRun) {
300
303
  const tempDir = await mkdtemp(join(tmpdir(), 'smoo-publish-'));
301
304
  const tarball = join(tempDir, `${safeTarballPrefix(pkg.name)}-${pkg.version}.tgz`);
305
+ // bun pm pack resolves workspace:* from bun.lock. Day-to-day lock keeps -next
306
+ // (install/CI). For publish, temporarily rewrite unpublished -next entries to
307
+ // the last stable tag so the tarball embeds installable versions, then restore.
308
+ syncBunLockfileVersions(root, { mode: 'publish', log: true });
302
309
  try {
303
310
  console.log(`${pkg.name}@${pkg.version}: packing with bun pm pack`);
304
311
  await run('bun', ['pm', 'pack', '--filename', tarball, '--ignore-scripts', '--quiet'], join(root, pkg.path));
@@ -327,6 +334,7 @@ async function publishPackedPackage(root, pkg, tag, dryRun) {
327
334
  });
328
335
  }
329
336
  finally {
337
+ syncBunLockfileVersions(root, { mode: 'install', log: true });
330
338
  await rm(tempDir, { recursive: true, force: true });
331
339
  }
332
340
  }
@@ -340,7 +348,7 @@ async function publishPlaceholderPackage(root, pkg, env) {
340
348
  name: pkg.name,
341
349
  version: NPM_BOOTSTRAP_VERSION,
342
350
  description: `Bootstrap placeholder for ${pkg.name}. Real releases are published by SmoothBricks CI.`,
343
- license: stringProperty(pkg.json, 'license') ?? 'UNLICENSED',
351
+ license: pkg.json.license ?? 'UNLICENSED',
344
352
  repository: pkg.json.repository,
345
353
  publishConfig: { access: 'public' },
346
354
  }, null, 2)}\n`);
@@ -356,7 +364,7 @@ function safeTarballPrefix(name) {
356
364
  }
357
365
  async function assertPackedWorkspaceDependencies(root, tarball, pkg) {
358
366
  const manifest = await readPackedPackageJson(root, tarball, pkg.name);
359
- const failures = validatePackedWorkspaceDependencies(root, pkg, manifest);
367
+ const failures = validatePackedWorkspaceDependencies(root, pkg, manifest, { mode: 'publish' });
360
368
  if (failures.length > 0) {
361
369
  throw new Error(failures.join('\n'));
362
370
  }
@@ -499,8 +507,7 @@ async function packageVersionAtRef(root, packagePath, ref) {
499
507
  return null;
500
508
  }
501
509
  try {
502
- const parsed = JSON.parse(decode(result.stdout));
503
- return isRecord(parsed) ? stringProperty(parsed, 'version') : null;
510
+ return parsePackageJsonText(decode(result.stdout))?.version ?? null;
504
511
  }
505
512
  catch {
506
513
  return null;
@@ -927,8 +934,7 @@ async function packageJsonAtRef(root, ref, packagePath) {
927
934
  return null;
928
935
  }
929
936
  try {
930
- const parsed = JSON.parse(decode(result.stdout));
931
- return isRecord(parsed) ? parsed : null;
937
+ return parsePackageJsonText(decode(result.stdout));
932
938
  }
933
939
  catch {
934
940
  return null;
@@ -939,46 +945,59 @@ async function currentPackageJson(root, packagePath) {
939
945
  }
940
946
  async function packageBuildInputPatterns(root, projectName, _packagePath) {
941
947
  const project = await nxProjectJson(root, projectName);
942
- const nxJson = readJsonObject(join(root, 'nx.json')) ?? {};
943
- return resolveBuildInputPatterns(project, nxJson);
948
+ return resolveBuildInputPatterns(project, readNxJson(join(root, 'nx.json')));
944
949
  }
945
950
  async function nxProjectJson(root, projectName) {
946
951
  const result = await $ `nx show project ${projectName} --json`.cwd(root).quiet();
947
- const parsed = JSON.parse(decode(result.stdout));
948
- if (!isRecord(parsed)) {
952
+ const parsed = parseNxProjectJsonText(decode(result.stdout));
953
+ if (!parsed) {
949
954
  throw new Error(`Unable to inspect Nx project ${projectName}.`);
950
955
  }
951
956
  return parsed;
952
957
  }
958
+ function readNxJson(path) {
959
+ if (!existsSync(path)) {
960
+ return {};
961
+ }
962
+ try {
963
+ return parseNxJsonText(readFileSync(path, 'utf8')) ?? {};
964
+ }
965
+ catch {
966
+ return {};
967
+ }
968
+ }
953
969
  function resolveBuildInputPatterns(project, nxJson) {
954
- const targets = recordProperty(project, 'targets');
970
+ const targets = project.targets;
955
971
  if (!targets) {
956
972
  return [];
957
973
  }
958
974
  return normalizeInputPatterns(collectBuildInputs(targets), nxJson);
959
975
  }
960
976
  function collectBuildInputs(targets) {
961
- const build = recordProperty(targets, 'build');
977
+ const build = targets.build;
962
978
  if (!build) {
963
979
  return ['production'];
964
980
  }
965
- const directInputs = stringArrayProperty(build, 'inputs');
981
+ const directInputs = stringInputs(build.inputs);
966
982
  if (directInputs.length > 0) {
967
983
  return directInputs;
968
984
  }
969
985
  const inputs = [];
970
- for (const dependency of stringArrayProperty(build, 'dependsOn')) {
971
- if (dependency.startsWith('^')) {
986
+ for (const dependency of build.dependsOn ?? []) {
987
+ if (typeof dependency !== 'string' || dependency.startsWith('^')) {
972
988
  continue;
973
989
  }
974
990
  const targetName = dependency.includes(':') ? dependency.split(':')[1] : dependency;
975
991
  if (!targetName) {
976
992
  continue;
977
993
  }
978
- inputs.push(...stringArrayProperty(recordProperty(targets, targetName), 'inputs'));
994
+ inputs.push(...stringInputs(targets[targetName]?.inputs));
979
995
  }
980
996
  return inputs.length > 0 ? inputs : ['production'];
981
997
  }
998
+ function stringInputs(inputs) {
999
+ return Array.isArray(inputs) ? inputs.filter((entry) => typeof entry === 'string') : [];
1000
+ }
982
1001
  function normalizeInputPatterns(inputs, nxJson) {
983
1002
  const patterns = [];
984
1003
  const seen = new Set();
@@ -995,8 +1014,7 @@ function expandInputPattern(input, nxJson, seen) {
995
1014
  }
996
1015
  seen.add(input);
997
1016
  if (!input.includes('{')) {
998
- const namedInputs = recordProperty(nxJson, 'namedInputs');
999
- const namedInput = namedInputs?.[input];
1017
+ const namedInput = nxJson.namedInputs?.[input];
1000
1018
  if (Array.isArray(namedInput)) {
1001
1019
  return namedInput.flatMap((entry) => (typeof entry === 'string' ? expandInputPattern(entry, nxJson, seen) : []));
1002
1020
  }
@@ -1010,17 +1028,6 @@ function expandInputPattern(input, nxJson, seen) {
1010
1028
  const packageRelative = rawInput.slice('{projectRoot}/'.length);
1011
1029
  return [`${excluded ? '!' : ''}${packageRelative}`];
1012
1030
  }
1013
- function recordProperty(record, key) {
1014
- if (!record) {
1015
- return null;
1016
- }
1017
- const value = record[key];
1018
- return isRecord(value) ? value : null;
1019
- }
1020
- function stringArrayProperty(record, key) {
1021
- const value = record?.[key];
1022
- return Array.isArray(value) ? value.filter((entry) => typeof entry === 'string') : [];
1023
- }
1024
1031
  async function packageHasHistory(root, packagePath) {
1025
1032
  const result = await $ `git log --format=%H -- ${packagePath}`.cwd(root).quiet().nothrow();
1026
1033
  if (result.exitCode !== 0) {
@@ -1219,7 +1226,7 @@ async function runLatestNpmTrust(root, npmArgs, env) {
1219
1226
  if (status === 0) {
1220
1227
  return 'configured';
1221
1228
  }
1222
- throw new Error(`nix shell nixpkgs#nodejs_latest -c npm ${npmArgs.join(' ')} failed with exit code ${status}`);
1229
+ throw new Error(npmCommandFailedMessage(npmArgs, status));
1223
1230
  }
1224
1231
  async function listTrustedPublishers(root, pkg) {
1225
1232
  const args = ['trust', 'list', pkg.name, '--json'];
@@ -1227,7 +1234,7 @@ async function listTrustedPublishers(root, pkg) {
1227
1234
  if (result.exitCode !== 0 && /\bEOTP\b/.test(`${result.stdout}\n${result.stderr}`)) {
1228
1235
  const status = await runInteractiveStatus('nix', ['shell', 'nixpkgs#nodejs_latest', '-c', 'npm', ...args], root);
1229
1236
  if (status !== 0) {
1230
- throw new Error(`nix shell nixpkgs#nodejs_latest -c npm ${args.join(' ')} failed with exit code ${status}`);
1237
+ throw new Error(npmCommandFailedMessage(args, status));
1231
1238
  }
1232
1239
  result = await runResult('nix', ['shell', 'nixpkgs#nodejs_latest', '-c', 'npm', ...args], root);
1233
1240
  }
@@ -1235,12 +1242,42 @@ async function listTrustedPublishers(root, pkg) {
1235
1242
  return npmTrustAccessDetails(root, pkg.name);
1236
1243
  }
1237
1244
  if (result.exitCode !== 0) {
1238
- throw new Error(`nix shell nixpkgs#nodejs_latest -c npm ${args.join(' ')} failed with exit code ${result.exitCode}`);
1245
+ throw new Error(npmCommandFailedMessage(args, result.exitCode, result.stdout, result.stderr));
1239
1246
  }
1240
1247
  return parseTrustedPublishers(result.stdout, pkg.name);
1241
1248
  }
1249
+ /** npm trust list/setup requires an authenticated package owner. */
1242
1250
  export function npmTrustListAccessDenied(stdout, stderr) {
1243
- return /\bE403\b/.test(`${stdout}\n${stderr}`);
1251
+ const output = `${stdout}\n${stderr}`;
1252
+ // E403: authenticated but not an owner. E401 / login-required: no usable session.
1253
+ return (/\bE403\b/.test(output) ||
1254
+ /\bE401\b/.test(output) ||
1255
+ /You must be logged in to publish packages/i.test(output) ||
1256
+ /npm error 401 Unauthorized/i.test(output));
1257
+ }
1258
+ function npmCommandFailedMessage(npmArgs, exitCode, stdout = '', stderr = '') {
1259
+ const command = `nix shell nixpkgs#nodejs_latest -c npm ${npmArgs.join(' ')}`;
1260
+ const detail = npmFailureDetail(stdout, stderr);
1261
+ return detail.length > 0
1262
+ ? `${command} failed with exit code ${exitCode}\n${detail}`
1263
+ : `${command} failed with exit code ${exitCode}`;
1264
+ }
1265
+ function npmFailureDetail(stdout, stderr) {
1266
+ const chunks = [stderr.trim(), stdout.trim()].filter((chunk) => chunk.length > 0);
1267
+ if (chunks.length === 0) {
1268
+ return '';
1269
+ }
1270
+ // Prefer the actionable npm error line over notice spam when present.
1271
+ const joined = chunks.join('\n');
1272
+ const errorLines = joined
1273
+ .split('\n')
1274
+ .map((line) => line.trimEnd())
1275
+ .filter((line) => /npm error|error code|401 Unauthorized|403 Forbidden|E401|E403|logged in/i.test(line));
1276
+ if (errorLines.length > 0) {
1277
+ return errorLines.slice(0, 8).join('\n');
1278
+ }
1279
+ // Fall back to a short tail of combined output.
1280
+ return joined.split('\n').slice(-12).join('\n');
1244
1281
  }
1245
1282
  async function npmTrustAccessDetails(root, packageName) {
1246
1283
  const [identityResult, ownersResult] = await Promise.all([
@@ -1261,34 +1298,26 @@ export function parseTrustedPublishers(stdout, packageName) {
1261
1298
  if (stdout.trim().length === 0) {
1262
1299
  return [];
1263
1300
  }
1264
- const parsed = JSON.parse(stdout);
1301
+ // createIsParse returns null for non-matching shapes and bare `null`.
1302
+ const parsed = parseTrustedPublisherJson(stdout);
1265
1303
  if (parsed === null) {
1266
- return [];
1267
- }
1268
- if (Array.isArray(parsed)) {
1269
- return parsed.map((value) => parseTrustedPublisher(value, packageName));
1270
- }
1271
- if (isRecord(parsed)) {
1272
- return [parseTrustedPublisher(parsed, packageName)];
1273
- }
1274
- throw new Error(`${packageName}: npm trust list returned invalid JSON.`);
1275
- }
1276
- function parseTrustedPublisher(value, packageName) {
1277
- if (!isRecord(value)) {
1278
- throw new Error(`${packageName}: npm trust list returned invalid trusted publisher entry.`);
1279
- }
1280
- const id = stringProperty(value, 'id');
1281
- const type = stringProperty(value, 'type');
1282
- if (!id || !type) {
1283
- throw new Error(`${packageName}: npm trust list returned a trusted publisher without id or type.`);
1304
+ if (stdout.trim() === 'null') {
1305
+ return [];
1306
+ }
1307
+ throw new Error(`${packageName}: npm trust list returned invalid trusted publisher JSON.`);
1284
1308
  }
1285
- return {
1286
- id,
1287
- type,
1288
- file: stringProperty(value, 'file') ?? undefined,
1289
- repository: stringProperty(value, 'repository') ?? undefined,
1290
- };
1309
+ return (Array.isArray(parsed) ? parsed : [parsed]).map((value) => ({
1310
+ id: value.id,
1311
+ type: value.type,
1312
+ file: value.file,
1313
+ repository: value.repository,
1314
+ }));
1291
1315
  }
1316
+ const parseTrustedPublisherJson = (() => {
1317
+ const _io0 = input => "string" === typeof input.id && "string" === typeof input.type && (undefined === input.file || "string" === typeof input.file) && (undefined === input.repository || "string" === typeof input.repository);
1318
+ const __is = input => null !== input && undefined !== input && (Array.isArray(input) && input.every(elem => "object" === typeof elem && null !== elem && _io0(elem)) || "object" === typeof input && null !== input && _io0(input));
1319
+ return input => { input = JSON.parse(input); return __is(input) ? input : null; };
1320
+ })();
1292
1321
  async function runLatestNpmPublish(root, npmArgs) {
1293
1322
  await runLatestNpm(root, npmArgs, { NODE_AUTH_TOKEN: '', NPM_TOKEN: '' });
1294
1323
  }
@@ -1,4 +1,3 @@
1
- export declare function isRecord(v: unknown): v is Record<string, unknown>;
2
1
  /** First `[env.<name>]` (source order; also derived from a nested `[env.<name>.*]`), or null when no env declared. */
3
2
  export declare function firstWranglerEnv(toml: string): string | null;
4
3
  /** True if the toml declares `[env.<env>]` (or any `[env.<env>.*]` sub-table). */
@@ -1 +1 @@
1
- {"version":3,"file":"prepare-env.d.ts","sourceRoot":"","sources":["../../src/wrangler/prepare-env.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"prepare-env.d.ts","sourceRoot":"","sources":["../../src/wrangler/prepare-env.ts"],"names":[],"mappings":"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"}