@smoothbricks/cli 0.10.1 → 0.10.2

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 (33) hide show
  1. package/dist/github-ci/index.js +4 -3
  2. package/dist/lib/conflict-markers.d.ts.map +1 -1
  3. package/dist/lib/workspace.d.ts +1 -1
  4. package/dist/lib/workspace.d.ts.map +1 -1
  5. package/dist/monorepo/ci-workflow.d.ts.map +1 -1
  6. package/dist/monorepo/ci-workflow.js +1 -0
  7. package/dist/monorepo/managed-files.d.ts +1 -0
  8. package/dist/monorepo/managed-files.d.ts.map +1 -1
  9. package/dist/monorepo/managed-files.js +12 -5
  10. package/dist/monorepo/publish-workflow.d.ts.map +1 -1
  11. package/dist/monorepo/publish-workflow.js +1 -0
  12. package/dist/monorepo/tool-validation.d.ts.map +1 -1
  13. package/dist/monorepo/tool-validation.js +20 -7
  14. package/dist/release/github-release.d.ts +2 -2
  15. package/dist/wrangler/prepare-env.d.ts.map +1 -1
  16. package/dist/wrangler/prepare-env.js +1 -1
  17. package/dist/wrangler/scaffold.d.ts.map +1 -1
  18. package/dist/wrangler/scaffold.js +1 -1
  19. package/managed/raw/tooling/direnv/setup-environment.ts +2 -8
  20. package/package.json +3 -13
  21. package/src/github-ci/index.ts +5 -3
  22. package/src/monorepo/__tests__/ci-workflow.test.ts +2 -0
  23. package/src/monorepo/__tests__/publish-workflow.test.ts +12 -4
  24. package/src/monorepo/ci-workflow.ts +2 -0
  25. package/src/monorepo/managed-files.test.ts +13 -0
  26. package/src/monorepo/managed-files.ts +20 -5
  27. package/src/monorepo/package-policy.test.ts +7 -37
  28. package/src/monorepo/publish-workflow.ts +2 -0
  29. package/src/monorepo/tool-validation.test.ts +59 -24
  30. package/src/monorepo/tool-validation.ts +21 -7
  31. package/src/monorepo/wrangler.test.ts +9 -2
  32. package/src/wrangler/prepare-env.ts +14 -4
  33. package/src/wrangler/scaffold.ts +8 -3
@@ -185,9 +185,10 @@ function nxProjectList(output) {
185
185
  return Array.isArray(parsed) ? parsed.filter((project) => typeof project === 'string') : [];
186
186
  }
187
187
  function recordValue(value) {
188
- return value !== null && typeof value === 'object' && !Array.isArray(value)
189
- ? value
190
- : undefined;
188
+ return isRecord(value) ? value : undefined;
189
+ }
190
+ function isRecord(value) {
191
+ return value !== null && typeof value === 'object' && !Array.isArray(value);
191
192
  }
192
193
  async function createGithubStatus(name, step) {
193
194
  await postGithubStatus(name, 'pending', `Running ${name}...`, step);
@@ -1 +1 @@
1
- {"version":3,"file":"conflict-markers.d.ts","sourceRoot":"","sources":["../../src/lib/conflict-markers.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,eAAO,MAAM,uBAAuB,gDAAgD,CAAC;AAIrF,MAAM,WAAW,iBAAiB;IAChC,gDAAgD;IAChD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,uDAAuD;IACvD,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC;CAC1B;AAED,oEAAoE;AACpE,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAStD;AAED,MAAM,WAAW,eAAe;IAC9B,SAAS,CACP,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,EAAE,EACd,GAAG,EAAE,MAAM,GACV,OAAO,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAClE;AAED;;;GAGG;AACH,wBAAsB,qBAAqB,CACzC,KAAK,EAAE,eAAe,EACtB,IAAI,EAAE,MAAM,EACZ,SAAS,GAAE,MAAM,EAAO,GACvB,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAW9B;AAED,uFAAuF;AACvF,qBAAa,oBAAqB,SAAQ,KAAK;IAE3C,QAAQ,CAAC,IAAI,EAAE,iBAAiB,EAAE;gBAAzB,IAAI,EAAE,iBAAiB,EAAE,EAClC,OAAO,EAAE,MAAM;CAKlB;AAED;;;;GAIG;AACH,wBAAsB,uBAAuB,CAAC,KAAK,EAAE,eAAe,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAKlH;AAED;;;;GAIG;AACH,wBAAsB,wBAAwB,CAC5C,KAAK,EAAE,eAAe,EACtB,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAkB9B;AAED,4EAA4E;AAC5E,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,iBAAiB,EAAE,CA2BhE;AAED,4EAA4E;AAC5E,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,iBAAiB,EAAE,GAAG,MAAM,CAElE"}
1
+ {"version":3,"file":"conflict-markers.d.ts","sourceRoot":"","sources":["../../src/lib/conflict-markers.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,eAAO,MAAM,uBAAuB,gDAAgD,CAAC;AAIrF,MAAM,WAAW,iBAAiB;IAChC,gDAAgD;IAChD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,uDAAuD;IACvD,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC;CAC1B;AAED,oEAAoE;AACpE,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAStD;AAED,MAAM,WAAW,eAAe;IAC9B,SAAS,CACP,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,EAAE,EACd,GAAG,EAAE,MAAM,GACV,OAAO,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAClE;AAED;;;GAGG;AACH,wBAAsB,qBAAqB,CACzC,KAAK,EAAE,eAAe,EACtB,IAAI,EAAE,MAAM,EACZ,SAAS,GAAE,MAAM,EAAO,GACvB,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAW9B;AAED,uFAAuF;AACvF,qBAAa,oBAAqB,SAAQ,KAAK;IAE3C,QAAQ,CAAC,IAAI,EAAE,iBAAiB,EAAE;IADpC,YACW,IAAI,EAAE,iBAAiB,EAAE,EAClC,OAAO,EAAE,MAAM,EAIhB;CACF;AAED;;;;GAIG;AACH,wBAAsB,uBAAuB,CAAC,KAAK,EAAE,eAAe,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAKlH;AAED;;;;GAIG;AACH,wBAAsB,wBAAwB,CAC5C,KAAK,EAAE,eAAe,EACtB,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAkB9B;AAED,4EAA4E;AAC5E,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,iBAAiB,EAAE,CA2BhE;AAED,4EAA4E;AAC5E,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,iBAAiB,EAAE,GAAG,MAAM,CAElE"}
@@ -30,7 +30,7 @@ export interface RepositoryInfo {
30
30
  type: string;
31
31
  url: string;
32
32
  }
33
- export declare const workspaceDependencyFields: readonly ["dependencies", "devDependencies", "peerDependencies", "optionalDependencies"];
33
+ export declare const workspaceDependencyFields: readonly ['dependencies', 'devDependencies', 'peerDependencies', 'optionalDependencies'];
34
34
  export declare function listPublicPackages(root: string): PackageInfo[];
35
35
  export declare function listReleasePackages(root: string, rootPackage?: PackageInfo | null): PackageInfo[];
36
36
  export declare function rootRepositoryInfo(root: string): RepositoryInfo | null;
@@ -1 +1 @@
1
- {"version":3,"file":"workspace.d.ts","sourceRoot":"","sources":["../../src/lib/workspace.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"workspace.d.ts","sourceRoot":"","sources":["../../src/lib/workspace.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"ci-workflow.d.ts","sourceRoot":"","sources":["../../src/monorepo/ci-workflow.ts"],"names":[],"mappings":"AAAA,oBAAY,kBAAkB;IAC5B,QAAQ,aAAa;IACrB,WAAW,iBAAiB;IAC5B,SAAS,gBAAgB;IACzB,cAAc,qBAAqB;IACnC,KAAK,UAAU;IACf,IAAI,SAAS;IACb,SAAS,eAAe;IACxB,MAAM,WAAW;IACjB,WAAW,kBAAkB;IAC7B,cAAc,qBAAqB;IACnC,aAAa,oBAAoB;CAClC;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,kBAAkB,CAAC;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,2BAA2B;IAC1C,MAAM,EAAE,OAAO,CAAC;IAChB,cAAc,CAAC,EAAE,YAAY,CAAC;IAC9B,YAAY,EAAE,MAAM,EAAE,CAAC;CACxB;AAID,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,2BAA2B,GAAG,cAAc,EAAE,CAmBvF;AAED,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,2BAA2B,GAAG,MAAM,CAGjF"}
1
+ {"version":3,"file":"ci-workflow.d.ts","sourceRoot":"","sources":["../../src/monorepo/ci-workflow.ts"],"names":[],"mappings":"AAEA,oBAAY,kBAAkB;IAC5B,QAAQ,aAAa;IACrB,WAAW,iBAAiB;IAC5B,SAAS,gBAAgB;IACzB,cAAc,qBAAqB;IACnC,KAAK,UAAU;IACf,IAAI,SAAS;IACb,SAAS,eAAe;IACxB,MAAM,WAAW;IACjB,WAAW,kBAAkB;IAC7B,cAAc,qBAAqB;IACnC,aAAa,oBAAoB;CAClC;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,kBAAkB,CAAC;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,2BAA2B;IAC1C,MAAM,EAAE,OAAO,CAAC;IAChB,cAAc,CAAC,EAAE,YAAY,CAAC;IAC9B,YAAY,EAAE,MAAM,EAAE,CAAC;CACxB;AAID,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,2BAA2B,GAAG,cAAc,EAAE,CAmBvF;AAED,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,2BAA2B,GAAG,MAAM,CAGjF"}
@@ -1,3 +1,4 @@
1
+ /* biome-ignore-all lint/suspicious/noTemplateCurlyInString: GitHub Actions expressions are emitted literally. */
1
2
  export var CiWorkflowStepKind;
2
3
  (function (CiWorkflowStepKind) {
3
4
  CiWorkflowStepKind["Checkout"] = "checkout";
@@ -27,6 +27,7 @@ export declare const INLINE_LOCAL_END = "# smoo-local-end";
27
27
  interface InlineLocalBlock {
28
28
  anchor: string;
29
29
  lines: string;
30
+ markerIndent?: string;
30
31
  }
31
32
  /** Pull inline local blocks out of a managed section, returning the section
32
33
  * with each block (and its markers) removed, plus the extracted blocks in
@@ -1 +1 @@
1
- {"version":3,"file":"managed-files.d.ts","sourceRoot":"","sources":["../../src/monorepo/managed-files.ts"],"names":[],"mappings":"AAUA;;;;;GAKG;AACH,eAAO,MAAM,oBAAoB,yEAAyE,CAAC;AAU3G,sFAAsF;AACtF,iBAAS,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAIlF;AAED,uCAAuC;AACvC,eAAO,MAAM,wBAAwB,0BAAoB,CAAC;AAE1D;;;;;;;;;GASG;AACH,eAAO,MAAM,kBAAkB,uBAAuB,CAAC;AACvD,eAAO,MAAM,gBAAgB,qBAAqB,CAAC;AAEnD,UAAU,gBAAgB;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;8BAE8B;AAC9B,iBAAS,wBAAwB,CAAC,OAAO,EAAE,MAAM,GAAG;IAAE,aAAa,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,gBAAgB,EAAE,CAAA;CAAE,CA6BxG;AAED,wCAAwC;AACxC,eAAO,MAAM,+BAA+B,iCAA2B,CAAC;AAExE;+EAC+E;AAC/E,iBAAS,yBAAyB,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,gBAAgB,EAAE,GAAG,MAAM,CActF;AAED,yCAAyC;AACzC,eAAO,MAAM,gCAAgC,kCAA4B,CAAC;AAE1E,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,SAAS,GAAG,SAAS,GAAG,WAAW,GAAG,SAAS,GAAG,iBAAiB,GAAG,SAAS,GAAG,YAAY,CAAC;CACxG;AA8GD,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,UAAU,EAAE,CAG/F;AAgLD,wBAAgB,YAAY,CAAC,OAAO,EAAE,UAAU,EAAE,GAAG,IAAI,CAIxD;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAQzD"}
1
+ {"version":3,"file":"managed-files.d.ts","sourceRoot":"","sources":["../../src/monorepo/managed-files.ts"],"names":[],"mappings":"AAUA;;;;;GAKG;AACH,eAAO,MAAM,oBAAoB,yEAAyE,CAAC;AAU3G,sFAAsF;AACtF,iBAAS,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAIlF;AAED,uCAAuC;AACvC,eAAO,MAAM,wBAAwB,0BAAoB,CAAC;AAE1D;;;;;;;;;GASG;AACH,eAAO,MAAM,kBAAkB,uBAAuB,CAAC;AACvD,eAAO,MAAM,gBAAgB,qBAAqB,CAAC;AAEnD,UAAU,gBAAgB;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;8BAE8B;AAC9B,iBAAS,wBAAwB,CAAC,OAAO,EAAE,MAAM,GAAG;IAAE,aAAa,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,gBAAgB,EAAE,CAAA;CAAE,CAkCxG;AAED,wCAAwC;AACxC,eAAO,MAAM,+BAA+B,iCAA2B,CAAC;AAExE;+EAC+E;AAC/E,iBAAS,yBAAyB,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,gBAAgB,EAAE,GAAG,MAAM,CAqBtF;AAED,yCAAyC;AACzC,eAAO,MAAM,gCAAgC,kCAA4B,CAAC;AAE1E,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,SAAS,GAAG,SAAS,GAAG,WAAW,GAAG,SAAS,GAAG,iBAAiB,GAAG,SAAS,GAAG,YAAY,CAAC;CACxG;AA8GD,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,UAAU,EAAE,CAG/F;AAkLD,wBAAgB,YAAY,CAAC,OAAO,EAAE,UAAU,EAAE,GAAG,IAAI,CAIxD;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAQzD"}
@@ -57,7 +57,12 @@ function extractInlineLocalBlocks(managed) {
57
57
  if (i >= lines.length) {
58
58
  throw new Error(`${INLINE_LOCAL_BEGIN} anchored on "${anchor}" has no matching ${INLINE_LOCAL_END}`);
59
59
  }
60
- blocks.push({ anchor, lines: blockLines.join('\n') });
60
+ const markerIndent = line.slice(0, line.length - line.trimStart().length);
61
+ blocks.push({
62
+ anchor,
63
+ lines: blockLines.join('\n'),
64
+ ...(markerIndent === '' ? {} : { markerIndent }),
65
+ });
61
66
  i += 1; // skip the END marker line itself
62
67
  continue;
63
68
  }
@@ -80,7 +85,8 @@ function reinsertInlineLocalBlocks(content, blocks) {
80
85
  throw new Error(`${INLINE_LOCAL_BEGIN} block anchored on "${block.anchor}" no longer matches any line in the updated ` +
81
86
  'template — reconcile the repo-owned block manually');
82
87
  }
83
- lines.splice(index + 1, 0, INLINE_LOCAL_BEGIN, ...block.lines.split('\n'), INLINE_LOCAL_END);
88
+ const markerIndent = block.markerIndent ?? '';
89
+ lines.splice(index + 1, 0, `${markerIndent}${INLINE_LOCAL_BEGIN}`, ...block.lines.split('\n'), `${markerIndent}${INLINE_LOCAL_END}`);
84
90
  }
85
91
  return lines.join('\n');
86
92
  }
@@ -325,9 +331,10 @@ function readCiPushBranches(packageJson) {
325
331
  return branches.filter((branch) => typeof branch === 'string' && branch.length > 0);
326
332
  }
327
333
  function recordValue(value) {
328
- return value !== null && typeof value === 'object' && !Array.isArray(value)
329
- ? value
330
- : undefined;
334
+ return isRecord(value) ? value : undefined;
335
+ }
336
+ function isRecord(value) {
337
+ return value !== null && typeof value === 'object' && !Array.isArray(value);
331
338
  }
332
339
  function renderYamlFlowList(values) {
333
340
  return JSON.stringify(values);
@@ -1 +1 @@
1
- {"version":3,"file":"publish-workflow.d.ts","sourceRoot":"","sources":["../../src/monorepo/publish-workflow.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"publish-workflow.d.ts","sourceRoot":"","sources":["../../src/monorepo/publish-workflow.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,4 @@
1
+ /* biome-ignore-all lint/suspicious/noTemplateCurlyInString: GitHub Actions expressions are emitted literally. */
1
2
  import { isSmoothBricksCodebasePackageName } from '../lib/cli-package.js';
2
3
  export var PublishWorkflowStepKind;
3
4
  (function (PublishWorkflowStepKind) {
@@ -1 +1 @@
1
- {"version":3,"file":"tool-validation.d.ts","sourceRoot":"","sources":["../../src/monorepo/tool-validation.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,WAAW,EAAyB,MAAM,qBAAqB,CAAC;AAU9E,MAAM,WAAW,UAAU;IACzB,sBAAsB,EAAE,OAAO,CAAC;IAChC,kBAAkB,EAAE,MAAM,CAAC;IAC3B,kBAAkB,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,WAAW;IAC1B,WAAW,EAAE,WAAW,GAAG,IAAI,CAAC;IAChC,MAAM,EAAE,UAAU,CAAC;CACpB;AA8BD,wBAAsB,uBAAuB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAKzE;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAQvD;AAED,wBAAsB,8BAA8B,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAuBtG;AAoCD,wBAAgB,2BAA2B,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,GAAG,IAAI,CAkBlF;AAED,wBAAgB,4BAA4B,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAY/D;AAED,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CA0B7D;AAED,wBAAgB,2BAA2B,CAAC,MAAM,EAAE,UAAU,EAAE,WAAW,EAAE,WAAW,GAAG,IAAI,GAAG,MAAM,CAyBvG;AAED,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,GAAG,MAAM,CAoB/E;AAED,wBAAgB,wBAAwB,CAAC,WAAW,EAAE,WAAW,GAAG,IAAI,GAAG,MAAM,CAWhF;AAED,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAmB3D;AA0DD,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,CAGzD"}
1
+ {"version":3,"file":"tool-validation.d.ts","sourceRoot":"","sources":["../../src/monorepo/tool-validation.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,WAAW,EAAyB,MAAM,qBAAqB,CAAC;AAU9E,MAAM,WAAW,UAAU;IACzB,sBAAsB,EAAE,OAAO,CAAC;IAChC,kBAAkB,EAAE,MAAM,CAAC;IAC3B,kBAAkB,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,WAAW;IAC1B,WAAW,EAAE,WAAW,GAAG,IAAI,CAAC;IAChC,MAAM,EAAE,UAAU,CAAC;CACpB;AAiCD,wBAAsB,uBAAuB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAKzE;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAQvD;AAED,wBAAsB,8BAA8B,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAuBtG;AAoCD,wBAAgB,2BAA2B,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,GAAG,IAAI,CAkBlF;AAED,wBAAgB,4BAA4B,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAY/D;AAED,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CA0B7D;AAED,wBAAgB,2BAA2B,CAAC,MAAM,EAAE,UAAU,EAAE,WAAW,EAAE,WAAW,GAAG,IAAI,GAAG,MAAM,CAyBvG;AAED,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,GAAG,MAAM,CAoB/E;AAED,wBAAgB,wBAAwB,CAAC,WAAW,EAAE,WAAW,GAAG,IAAI,GAAG,MAAM,CAWhF;AAED,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAmB3D;AA0DD,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,CAQzD"}
@@ -5,11 +5,11 @@ import { getOrCreateRecord, readJsonObject, recordProperty, setStringProperty, w
5
5
  import { readPackageJsonObject } from '../lib/workspace.js';
6
6
  const rootDevDependencies = [
7
7
  { name: '@biomejs/biome', fallbackVersion: '^2.3.5', minimumVersion: '2.3.0', prefix: '^' },
8
- { name: '@nx/js', fallbackVersion: '22.0.3', minimumVersion: '22.0.0' },
8
+ { name: '@nx/js', fallbackVersion: '23.1.0', minimumVersion: '23.1.0' },
9
9
  {
10
10
  name: '@smoothbricks/nx-plugin',
11
- fallbackVersion: '^0.0.1',
12
- minimumVersion: '0.0.1',
11
+ fallbackVersion: '^0.3.0',
12
+ minimumVersion: '0.3.0',
13
13
  prefix: '^',
14
14
  useWorkspaceRangeInCodebase: true,
15
15
  },
@@ -21,8 +21,11 @@ const rootDevDependencies = [
21
21
  prefix: '^',
22
22
  useWorkspaceRangeInCodebase: true,
23
23
  },
24
- { name: 'nx', fallbackVersion: '22.5.4', minimumVersion: '22.5.0' },
24
+ { name: 'nx', fallbackVersion: '23.1.0', minimumVersion: '23.1.0' },
25
25
  { name: 'prettier', fallbackVersion: '^3.6.1', minimumVersion: '3.6.0', prefix: '^' },
26
+ { name: 'ttsc', fallbackVersion: '^0.18.4', minimumVersion: '0.18.4', prefix: '^' },
27
+ // Nx and typescript-eslint still load the TypeScript 5.x JavaScript API.
28
+ // Compilation is exclusively delegated to ttsc by the Nx plugin targets.
26
29
  { name: 'typescript', fallbackVersion: '^5.9.3', minimumVersion: '5.9.0', prefix: '^' },
27
30
  ];
28
31
  const cliPackageName = '@smoothbricks/cli';
@@ -287,16 +290,26 @@ function formatExpectedDependency(policy, dependency) {
287
290
  }
288
291
  export function readToolContext(root) {
289
292
  const rootPackage = readPackageJsonObject(join(root, 'package.json'));
290
- return { rootPackage, policy: toolPolicy(rootPackage) };
293
+ const toolingPackage = readJsonObject(join(root, 'tooling', 'package.json'));
294
+ const configuredCliRange = recordProperty(toolingPackage ?? {}, 'dependencies')?.[cliPackageName];
295
+ return {
296
+ rootPackage,
297
+ policy: toolPolicy(rootPackage, typeof configuredCliRange === 'string' ? configuredCliRange : null),
298
+ };
291
299
  }
292
- function toolPolicy(rootPackage) {
300
+ function toolPolicy(rootPackage, configuredCliRange) {
293
301
  const name = typeof rootPackage?.name === 'string' ? rootPackage.name : null;
294
302
  const isCodebase = isSmoothBricksCodebasePackageName(name ?? undefined);
295
303
  const toolingName = toolingPackageName(name);
304
+ // A locally linked prerelease can be newer than every published CLI. Keep an existing
305
+ // installable range instead of rewriting the consumer manifest to an unpublished version.
306
+ const publishedCliRange = cliPackageVersion.includes('-') && configuredCliRange && parseVersion(configuredCliRange)
307
+ ? configuredCliRange
308
+ : `^${cliPackageVersion}`;
296
309
  return {
297
310
  isSmoothBricksCodebase: isCodebase,
298
311
  toolingPackageName: toolingName,
299
- cliDependencyRange: isCodebase ? 'workspace:*' : `^${cliPackageVersion}`,
312
+ cliDependencyRange: isCodebase ? 'workspace:*' : publishedCliRange,
300
313
  };
301
314
  }
302
315
  function toolingPackageName(rootName) {
@@ -18,7 +18,6 @@ export interface GithubReleaseWriteShell {
18
18
  export declare function renderNxProjectChangelogContents(input: RenderNxProjectChangelogInput): Promise<string>;
19
19
  export declare function createOrUpdateGithubRelease(pkg: ReleasePackageInfo, contents: string, shell: GithubReleaseWriteShell): Promise<void>;
20
20
  export declare function nxProjectChangelogArgs(pkg: ReleasePackageInfo, previousTag: string | null, dryRun: boolean): {
21
- from: string;
22
21
  version: string;
23
22
  projects: string[];
24
23
  gitCommit: false;
@@ -28,8 +27,8 @@ export declare function nxProjectChangelogArgs(pkg: ReleasePackageInfo, previous
28
27
  createRelease: false;
29
28
  deleteVersionPlans: false;
30
29
  dryRun: boolean;
30
+ from: string;
31
31
  } | {
32
- firstRelease: boolean;
33
32
  version: string;
34
33
  projects: string[];
35
34
  gitCommit: false;
@@ -39,6 +38,7 @@ export declare function nxProjectChangelogArgs(pkg: ReleasePackageInfo, previous
39
38
  createRelease: false;
40
39
  deleteVersionPlans: false;
41
40
  dryRun: boolean;
41
+ firstRelease: boolean;
42
42
  };
43
43
  export declare function projectChangelogContents(result: ProjectChangelogLookupResult, projectName: string): string;
44
44
  export declare function githubReleaseCommandArgs(tag: string, notesFile: string, releaseExists: boolean, version: string): string[];
@@ -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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"}
@@ -295,7 +295,7 @@ export async function ensureNamespace(logical, existing, cwd) {
295
295
  await $ `bunx wrangler kv namespace create ${logical}`.cwd(cwd).quiet();
296
296
  }
297
297
  catch (err) {
298
- return errText(err).includes('already') ? (await reList(logical, cwd)) : null;
298
+ return errText(err).includes('already') ? await reList(logical, cwd) : null;
299
299
  }
300
300
  return reList(logical, cwd);
301
301
  }
@@ -1 +1 @@
1
- {"version":3,"file":"scaffold.d.ts","sourceRoot":"","sources":["../../src/wrangler/scaffold.ts"],"names":[],"mappings":"AAYA,MAAM,WAAW,eAAe;IAC9B,oDAAoD;IACpD,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAmMD,4FAA4F;AAC5F,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,eAAoB,GAAG,MAAM,CA2B7F"}
1
+ {"version":3,"file":"scaffold.d.ts","sourceRoot":"","sources":["../../src/wrangler/scaffold.ts"],"names":[],"mappings":"AAYA,MAAM,WAAW,eAAe;IAC9B,oDAAoD;IACpD,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAsMD,4FAA4F;AAC5F,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,eAAoB,GAAG,MAAM,CA6B7F"}
@@ -76,7 +76,7 @@ async function checkMode(env: string): Promise<void> {
76
76
  for (const binding of kvBindings) {
77
77
  const inToml = pe.getKvId(toml, env, binding);
78
78
  const liveId = live.find((n) => n.title === kvTitle(binding, env))?.id ?? null;
79
- p.log.message(\` KV \${binding}: \${!liveId ? '✗ not created' : inToml === liveId ? \`✓ \${liveId}\` : \`⚠ drift (live \${liveId}, toml \${inToml ?? 'unset'})\`}\`);
79
+ p.log.message(\` KV \${binding}: \${!liveId ? '✗ not created' : inToml === liveId ? \`✓ \${liveId}\` : \`! drift (live \${liveId}, toml \${inToml ?? 'unset'})\`}\`);
80
80
  }
81
81
  for (const name of vars) {
82
82
  p.log.message(\` var \${name}: \${pe.getVar(toml, env, name) ? '✓ set' : '✗ empty'}\`);
@@ -67,9 +67,7 @@ try {
67
67
  }
68
68
 
69
69
  async function installLocalDependencies(): Promise<void> {
70
- // bun install runs the root prepare script, which patches TypeScript with
71
- // ts-patch. Multiple concurrent direnv activations can otherwise race while
72
- // mutating the same files under node_modules.
70
+ // Serialize concurrent direnv activations installing into the same node_modules.
73
71
  await withSetupLock(async () => {
74
72
  await runSetupCommand('bun install --no-summary', $`bun install --no-summary`);
75
73
  });
@@ -106,7 +104,7 @@ async function acquireLock(lockDir: string): Promise<void> {
106
104
  await mkdir(lockDir, { recursive: false });
107
105
  return;
108
106
  } catch (error) {
109
- if (!isFileExistsError(error) || Date.now() > deadline) {
107
+ if (!(error instanceof Error && 'code' in error && error.code === 'EEXIST') || Date.now() > deadline) {
110
108
  throw error;
111
109
  }
112
110
  await Bun.sleep(100);
@@ -114,10 +112,6 @@ async function acquireLock(lockDir: string): Promise<void> {
114
112
  }
115
113
  }
116
114
 
117
- function isFileExistsError(error: unknown): boolean {
118
- return error instanceof Error && 'code' in error && error.code === 'EEXIST';
119
- }
120
-
121
115
  function replayCapturedOutput(error: unknown): void {
122
116
  if (!(error instanceof CapturedCommandError)) {
123
117
  return;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@smoothbricks/cli",
3
- "version": "0.10.1",
3
+ "version": "0.10.2",
4
4
  "type": "module",
5
5
  "description": "SmoothBricks monorepo automation CLI",
6
6
  "bin": {
@@ -52,8 +52,8 @@
52
52
  ],
53
53
  "dependencies": {
54
54
  "@arethetypeswrong/core": "^0.18.2",
55
- "@smoothbricks/nx-plugin": "0.3.0",
56
- "@smoothbricks/validation": "0.1.1",
55
+ "@smoothbricks/nx-plugin": "0.3.1",
56
+ "@smoothbricks/validation": "0.1.2",
57
57
  "commander": "^14.0.3",
58
58
  "publint": "^0.3.18",
59
59
  "semver": "^7.7.4",
@@ -67,16 +67,6 @@
67
67
  "nx": {
68
68
  "targets": {
69
69
  "lint": {},
70
- "typecheck-tests": {
71
- "executor": "nx:run-commands",
72
- "options": {
73
- "command": "tsc --noEmit -p tsconfig.test.json",
74
- "cwd": "packages/cli"
75
- },
76
- "dependsOn": [
77
- "build"
78
- ]
79
- },
80
70
  "test": {
81
71
  "executor": "@smoothbricks/nx-plugin:bounded-exec",
82
72
  "options": {
@@ -220,9 +220,11 @@ function nxProjectList(output: string): string[] {
220
220
  }
221
221
 
222
222
  function recordValue(value: unknown): Record<string, unknown> | undefined {
223
- return value !== null && typeof value === 'object' && !Array.isArray(value)
224
- ? (value as Record<string, unknown>)
225
- : undefined;
223
+ return isRecord(value) ? value : undefined;
224
+ }
225
+
226
+ function isRecord(value: unknown): value is Record<string, unknown> {
227
+ return value !== null && typeof value === 'object' && !Array.isArray(value);
226
228
  }
227
229
 
228
230
  async function createGithubStatus(name: string, step: string): Promise<void> {
@@ -1,3 +1,5 @@
1
+ /* biome-ignore-all lint/suspicious/noTemplateCurlyInString: Assertions cover literal GitHub Actions expressions. */
2
+
1
3
  import { describe, expect, it } from 'bun:test';
2
4
  import { readFile } from 'node:fs/promises';
3
5
  import { join } from 'node:path';
@@ -1,3 +1,5 @@
1
+ /* biome-ignore-all lint/suspicious/noTemplateCurlyInString: Assertions cover literal GitHub Actions expressions. */
2
+
1
3
  import { describe, expect, it } from 'bun:test';
2
4
  import { readFile } from 'node:fs/promises';
3
5
  import { join } from 'node:path';
@@ -250,11 +252,17 @@ class WorkflowScenarioState {
250
252
  private readonly repairBuilds = new Set<string>();
251
253
  private readonly publishedCurrent = new Set<string>();
252
254
  private readonly durableGaps = new Set<string>();
253
- private readonly validationState = {
255
+ private readonly validationState: {
256
+ checks: number;
257
+ builds: string[];
258
+ lints: string[];
259
+ tests: string[];
260
+ validates: number;
261
+ } = {
254
262
  checks: 0,
255
- builds: [] as string[],
256
- lints: [] as string[],
257
- tests: [] as string[],
263
+ builds: [],
264
+ lints: [],
265
+ tests: [],
258
266
  validates: 0,
259
267
  };
260
268
 
@@ -1,3 +1,5 @@
1
+ /* biome-ignore-all lint/suspicious/noTemplateCurlyInString: GitHub Actions expressions are emitted literally. */
2
+
1
3
  export enum CiWorkflowStepKind {
2
4
  Checkout = 'checkout',
3
5
  SetupDevenv = 'setup-devenv',
@@ -93,6 +93,19 @@ describe('managed-file inline local blocks', () => {
93
93
  );
94
94
  });
95
95
 
96
+ it('preserves marker indentation when refreshing nested configuration', () => {
97
+ const markerIndent = ' ';
98
+ const current = [
99
+ 'patterns:',
100
+ " - '*.html'",
101
+ `${markerIndent}${INLINE_LOCAL_BEGIN}`,
102
+ " - '!**/templates/*.html'",
103
+ `${markerIndent}${INLINE_LOCAL_END}`,
104
+ ].join('\n');
105
+ const { withoutInline, blocks } = extractInlineLocalBlocksForTest(current);
106
+ expect(reinsertInlineLocalBlocksForTest(withoutInline, blocks)).toBe(current);
107
+ });
108
+
96
109
  it("reinserting refuses when the anchor no longer appears — never silently drops the repo's customization", () => {
97
110
  const fresh = ['a:', ' - one', 'b:'].join('\n'); // ' - two' is gone
98
111
  expect(() => reinsertInlineLocalBlocksForTest(fresh, [{ anchor: ' - two', lines: ' - repo-owned' }])).toThrow(
@@ -50,6 +50,7 @@ export const INLINE_LOCAL_END = '# smoo-local-end';
50
50
  interface InlineLocalBlock {
51
51
  anchor: string;
52
52
  lines: string;
53
+ markerIndent?: string;
53
54
  }
54
55
 
55
56
  /** Pull inline local blocks out of a managed section, returning the section
@@ -76,7 +77,12 @@ function extractInlineLocalBlocks(managed: string): { withoutInline: string; blo
76
77
  if (i >= lines.length) {
77
78
  throw new Error(`${INLINE_LOCAL_BEGIN} anchored on "${anchor}" has no matching ${INLINE_LOCAL_END}`);
78
79
  }
79
- blocks.push({ anchor, lines: blockLines.join('\n') });
80
+ const markerIndent = line.slice(0, line.length - line.trimStart().length);
81
+ blocks.push({
82
+ anchor,
83
+ lines: blockLines.join('\n'),
84
+ ...(markerIndent === '' ? {} : { markerIndent }),
85
+ });
80
86
  i += 1; // skip the END marker line itself
81
87
  continue;
82
88
  }
@@ -102,7 +108,14 @@ function reinsertInlineLocalBlocks(content: string, blocks: InlineLocalBlock[]):
102
108
  'template — reconcile the repo-owned block manually',
103
109
  );
104
110
  }
105
- lines.splice(index + 1, 0, INLINE_LOCAL_BEGIN, ...block.lines.split('\n'), INLINE_LOCAL_END);
111
+ const markerIndent = block.markerIndent ?? '';
112
+ lines.splice(
113
+ index + 1,
114
+ 0,
115
+ `${markerIndent}${INLINE_LOCAL_BEGIN}`,
116
+ ...block.lines.split('\n'),
117
+ `${markerIndent}${INLINE_LOCAL_END}`,
118
+ );
106
119
  }
107
120
  return lines.join('\n');
108
121
  }
@@ -388,9 +401,11 @@ function readCiPushBranches(packageJson: unknown): string[] {
388
401
  }
389
402
 
390
403
  function recordValue(value: unknown): Record<string, unknown> | undefined {
391
- return value !== null && typeof value === 'object' && !Array.isArray(value)
392
- ? (value as Record<string, unknown>)
393
- : undefined;
404
+ return isRecord(value) ? value : undefined;
405
+ }
406
+
407
+ function isRecord(value: unknown): value is Record<string, unknown> {
408
+ return value !== null && typeof value === 'object' && !Array.isArray(value);
394
409
  }
395
410
 
396
411
  function renderYamlFlowList(values: string[]): string {
@@ -70,21 +70,7 @@ describe('root smoo monorepo policy', () => {
70
70
  expect(rootPackage).toMatchObject({ nx: { includedScripts: [] } });
71
71
  expect(nxJson.namedInputs).toEqual(validNamedInputs());
72
72
  expect(nxJson.targetDefaults).toEqual(validTargetDefaults());
73
- expect(nxJson.plugins).toEqual([
74
- {
75
- plugin: '@nx/js/typescript',
76
- options: {
77
- typecheck: { targetName: 'typecheck' },
78
- build: {
79
- targetName: 'tsc-js',
80
- configName: 'tsconfig.lib.json',
81
- buildDepsName: 'build-deps',
82
- watchDepsName: 'watch-deps',
83
- },
84
- },
85
- },
86
- '@smoothbricks/nx-plugin',
87
- ]);
73
+ expect(nxJson.plugins).toEqual(['@smoothbricks/nx-plugin']);
88
74
  expect(validateRootPackagePolicy(root)).toBe(0);
89
75
  expect(validateNxReleaseConfig(root)).toBe(0);
90
76
  } finally {
@@ -167,7 +153,7 @@ describe('root smoo monorepo policy', () => {
167
153
  }
168
154
  });
169
155
 
170
- it('explains Nx plugin conventions when nx.json is not configured', async () => {
156
+ it('explains SmoothBricks Nx plugin conventions when nx.json is not configured', async () => {
171
157
  const root = await mkdtemp(join(tmpdir(), 'smoo-package-policy-'));
172
158
  try {
173
159
  await writeJson(join(root, 'package.json'), validRootPackage());
@@ -177,10 +163,8 @@ describe('root smoo monorepo policy', () => {
177
163
  });
178
164
  const errors = captureConsoleErrors();
179
165
 
180
- expect(validateNxReleaseConfig(root)).toBe(2);
166
+ expect(validateNxReleaseConfig(root)).toBe(1);
181
167
 
182
- expect(errors.join('\n')).toContain('Official Nx owns TypeScript library inference');
183
- expect(errors.join('\n')).toContain('tsconfig.lib.json produces tsc-js');
184
168
  expect(errors.join('\n')).toContain('Smoo relies on this plugin to infer convention targets');
185
169
  expect(errors.join('\n')).not.toContain('Fix:');
186
170
  } finally {
@@ -188,7 +172,7 @@ describe('root smoo monorepo policy', () => {
188
172
  }
189
173
  });
190
174
 
191
- it('explains why TypeScript build targetName is tsc-js', async () => {
175
+ it('rejects the official Nx TypeScript plugin because it bypasses ttsc transforms', async () => {
192
176
  const root = await mkdtemp(join(tmpdir(), 'smoo-package-policy-'));
193
177
  try {
194
178
  await writeJson(join(root, 'package.json'), validRootPackage());
@@ -206,8 +190,8 @@ describe('root smoo monorepo policy', () => {
206
190
 
207
191
  expect(validateNxReleaseConfig(root)).toBe(1);
208
192
 
209
- expect(errors.join('\n')).toContain('build.targetName must be tsc-js');
210
- expect(errors.join('\n')).toContain('build is reserved for aggregate targets');
193
+ expect(errors.join('\n')).toContain('plugins must not configure @nx/js/typescript');
194
+ expect(errors.join('\n')).toContain('Smoo owns transformer-aware TypeScript targets');
211
195
  expect(errors.join('\n')).not.toContain('Fix:');
212
196
  } finally {
213
197
  await rm(root, { recursive: true, force: true });
@@ -1100,21 +1084,7 @@ function validConfiguredNxJson(): Record<string, unknown> {
1100
1084
  ...validNxJson(),
1101
1085
  namedInputs: validNamedInputs(),
1102
1086
  targetDefaults: validTargetDefaults(),
1103
- plugins: [
1104
- {
1105
- plugin: '@nx/js/typescript',
1106
- options: {
1107
- typecheck: { targetName: 'typecheck' },
1108
- build: {
1109
- targetName: 'tsc-js',
1110
- configName: 'tsconfig.lib.json',
1111
- buildDepsName: 'build-deps',
1112
- watchDepsName: 'watch-deps',
1113
- },
1114
- },
1115
- },
1116
- '@smoothbricks/nx-plugin',
1117
- ],
1087
+ plugins: ['@smoothbricks/nx-plugin'],
1118
1088
  };
1119
1089
  }
1120
1090
 
@@ -1,3 +1,5 @@
1
+ /* biome-ignore-all lint/suspicious/noTemplateCurlyInString: GitHub Actions expressions are emitted literally. */
2
+
1
3
  import { isSmoothBricksCodebasePackageName } from '../lib/cli-package.js';
2
4
 
3
5
  export type PublishWorkflowBump = 'auto' | 'patch' | 'minor' | 'major' | 'prerelease';
@@ -12,12 +12,13 @@ import {
12
12
 
13
13
  const registryVersions: Record<string, string[]> = {
14
14
  '@biomejs/biome': ['2.3.5'],
15
- '@nx/js': ['22.5.4'],
16
- '@smoothbricks/nx-plugin': ['0.0.1'],
15
+ '@nx/js': ['23.1.0'],
16
+ '@smoothbricks/nx-plugin': ['0.3.0'],
17
17
  eslint: ['9.39.1'],
18
18
  'eslint-stdout': ['1.1.1', '1.1.2'],
19
- nx: ['22.5.4'],
19
+ nx: ['23.1.0'],
20
20
  prettier: ['3.6.1'],
21
+ ttsc: ['0.18.4'],
21
22
  typescript: ['5.9.3'],
22
23
  };
23
24
 
@@ -25,7 +26,7 @@ const realFetch = globalThis.fetch;
25
26
 
26
27
  describe('tool configuration validation', () => {
27
28
  beforeEach(() => {
28
- globalThis.fetch = mockRegistryFetch as typeof fetch;
29
+ globalThis.fetch = mockRegistryFetch;
29
30
  });
30
31
 
31
32
  afterEach(() => {
@@ -67,7 +68,7 @@ describe('tool configuration validation', () => {
67
68
  expect(rootPackage.devDependencies['@smoothbricks/cli']).toBeUndefined();
68
69
  expect(rootPackage.devDependencies['@smoothbricks/nx-plugin']).toBe('workspace:*');
69
70
  expect(rootPackage.devDependencies['eslint-stdout']).toBe('workspace:*');
70
- expect(rootPackage.devDependencies.nx).toBe('22.5.4');
71
+ expect(rootPackage.devDependencies.nx).toBe('23.1.0');
71
72
  expect(rootPackage.workspaces).toContain('tooling');
72
73
  expect(toolingPackage.name).toBe('@smoothbricks/tooling');
73
74
  expect(toolingPackage.dependencies['@smoothbricks/cli']).toBe('workspace:*');
@@ -89,13 +90,14 @@ describe('tool configuration validation', () => {
89
90
  workspaces: ['packages/*', 'tooling'],
90
91
  devDependencies: {
91
92
  '@biomejs/biome': '^3.0.0',
92
- '@nx/js': '22.6.0',
93
- '@smoothbricks/nx-plugin': '^0.1.0',
93
+ '@nx/js': '23.2.0',
94
+ '@smoothbricks/nx-plugin': '^0.4.0',
94
95
  '@types/bun': '1.3.99',
95
96
  eslint: '^10.0.0',
96
97
  'eslint-stdout': await currentEslintStdoutRange(),
97
- nx: '23.0.0',
98
+ nx: '24.0.0',
98
99
  prettier: '^3.7.0',
100
+ ttsc: '^0.19.0',
99
101
  typescript: '^6.0.0',
100
102
  },
101
103
  });
@@ -132,6 +134,35 @@ describe('tool configuration validation', () => {
132
134
  }
133
135
  });
134
136
 
137
+ it('preserves an installable CLI range when the running CLI is a linked prerelease', async () => {
138
+ const root = await mkdtemp(join(tmpdir(), 'smoo-tool-validation-'));
139
+ try {
140
+ const configuredRange = '^0.10.1';
141
+ const runningRange = await currentCliRange();
142
+ const expectedRange = runningRange.includes('-') ? configuredRange : runningRange;
143
+ await writeJson(join(root, 'package.json'), {
144
+ name: '@fixture/app',
145
+ version: '0.0.0',
146
+ private: true,
147
+ workspaces: ['packages/*', 'tooling'],
148
+ });
149
+ await writeJson(join(root, 'tooling/package.json'), {
150
+ name: '@fixture/tooling',
151
+ private: true,
152
+ dependencies: { '@smoothbricks/cli': configuredRange },
153
+ });
154
+
155
+ const context = readToolContext(root);
156
+ expect(context.policy.cliDependencyRange).toBe(expectedRange);
157
+ applyToolingPackageDefaults(root, context.policy);
158
+
159
+ const toolingPackage = JSON.parse(await readFile(join(root, 'tooling/package.json'), 'utf8'));
160
+ expect(toolingPackage.dependencies['@smoothbricks/cli']).toBe(expectedRange);
161
+ } finally {
162
+ await rm(root, { recursive: true, force: true });
163
+ }
164
+ });
165
+
135
166
  it('uses workspace smoo in the SmoothBricks codebase repo', async () => {
136
167
  const root = await mkdtemp(join(tmpdir(), 'smoo-tool-validation-'));
137
168
  try {
@@ -161,10 +192,11 @@ describe('tool configuration validation', () => {
161
192
  workspaces: ['packages/*', 'tooling'],
162
193
  devDependencies: {
163
194
  '@biomejs/biome': '^3.0.0',
164
- '@nx/js': '22.6.0',
195
+ '@nx/js': '23.2.0',
165
196
  eslint: '^10.0.0',
166
- nx: '23.0.0',
197
+ nx: '24.0.0',
167
198
  prettier: '^3.7.0',
199
+ ttsc: '^0.19.0',
168
200
  typescript: '^6.0.0',
169
201
  },
170
202
  });
@@ -195,20 +227,23 @@ async function currentEslintStdoutRange(): Promise<string> {
195
227
  return `^${latestPatchVersion('eslint-stdout', pkg.version) ?? pkg.version}`;
196
228
  }
197
229
 
198
- function mockRegistryFetch(input: Parameters<typeof fetch>[0]): Promise<Response> {
199
- const url = typeof input === 'string' ? input : input instanceof URL ? input.toString() : input.url;
200
- const packageName = decodeURIComponent(new URL(url).pathname.slice(1));
201
- const versions = registryVersions[packageName];
202
- if (!versions) {
203
- return Promise.resolve(new Response('{}', { status: 404 }));
204
- }
205
- return Promise.resolve(
206
- new Response(JSON.stringify({ versions: Object.fromEntries(versions.map((version) => [version, {}])) }), {
207
- status: 200,
208
- headers: { 'content-type': 'application/json' },
209
- }),
210
- );
211
- }
230
+ const mockRegistryFetch = Object.assign(
231
+ (input: string | URL | Request): Promise<Response> => {
232
+ const url = typeof input === 'string' ? input : input instanceof URL ? input.toString() : input.url;
233
+ const packageName = decodeURIComponent(new URL(url).pathname.slice(1));
234
+ const versions = registryVersions[packageName];
235
+ if (!versions) {
236
+ return Promise.resolve(new Response('{}', { status: 404 }));
237
+ }
238
+ return Promise.resolve(
239
+ new Response(JSON.stringify({ versions: Object.fromEntries(versions.map((version) => [version, {}])) }), {
240
+ status: 200,
241
+ headers: { 'content-type': 'application/json' },
242
+ }),
243
+ );
244
+ },
245
+ { preconnect: realFetch.preconnect },
246
+ ) satisfies typeof fetch;
212
247
 
213
248
  function latestPatchVersion(packageName: string, version: string): string | null {
214
249
  const [major, minor] = version.split('.');
@@ -25,11 +25,11 @@ export interface ToolContext {
25
25
 
26
26
  const rootDevDependencies: RequiredDependency[] = [
27
27
  { name: '@biomejs/biome', fallbackVersion: '^2.3.5', minimumVersion: '2.3.0', prefix: '^' },
28
- { name: '@nx/js', fallbackVersion: '22.0.3', minimumVersion: '22.0.0' },
28
+ { name: '@nx/js', fallbackVersion: '23.1.0', minimumVersion: '23.1.0' },
29
29
  {
30
30
  name: '@smoothbricks/nx-plugin',
31
- fallbackVersion: '^0.0.1',
32
- minimumVersion: '0.0.1',
31
+ fallbackVersion: '^0.3.0',
32
+ minimumVersion: '0.3.0',
33
33
  prefix: '^',
34
34
  useWorkspaceRangeInCodebase: true,
35
35
  },
@@ -41,8 +41,11 @@ const rootDevDependencies: RequiredDependency[] = [
41
41
  prefix: '^',
42
42
  useWorkspaceRangeInCodebase: true,
43
43
  },
44
- { name: 'nx', fallbackVersion: '22.5.4', minimumVersion: '22.5.0' },
44
+ { name: 'nx', fallbackVersion: '23.1.0', minimumVersion: '23.1.0' },
45
45
  { name: 'prettier', fallbackVersion: '^3.6.1', minimumVersion: '3.6.0', prefix: '^' },
46
+ { name: 'ttsc', fallbackVersion: '^0.18.4', minimumVersion: '0.18.4', prefix: '^' },
47
+ // Nx and typescript-eslint still load the TypeScript 5.x JavaScript API.
48
+ // Compilation is exclusively delegated to ttsc by the Nx plugin targets.
46
49
  { name: 'typescript', fallbackVersion: '^5.9.3', minimumVersion: '5.9.0', prefix: '^' },
47
50
  ];
48
51
 
@@ -330,17 +333,28 @@ function formatExpectedDependency(policy: ToolPolicy, dependency: RequiredDepend
330
333
 
331
334
  export function readToolContext(root: string): ToolContext {
332
335
  const rootPackage = readPackageJsonObject(join(root, 'package.json'));
333
- return { rootPackage, policy: toolPolicy(rootPackage) };
336
+ const toolingPackage = readJsonObject(join(root, 'tooling', 'package.json'));
337
+ const configuredCliRange = recordProperty(toolingPackage ?? {}, 'dependencies')?.[cliPackageName];
338
+ return {
339
+ rootPackage,
340
+ policy: toolPolicy(rootPackage, typeof configuredCliRange === 'string' ? configuredCliRange : null),
341
+ };
334
342
  }
335
343
 
336
- function toolPolicy(rootPackage: PackageJson | null): ToolPolicy {
344
+ function toolPolicy(rootPackage: PackageJson | null, configuredCliRange: string | null): ToolPolicy {
337
345
  const name = typeof rootPackage?.name === 'string' ? rootPackage.name : null;
338
346
  const isCodebase = isSmoothBricksCodebasePackageName(name ?? undefined);
339
347
  const toolingName = toolingPackageName(name);
348
+ // A locally linked prerelease can be newer than every published CLI. Keep an existing
349
+ // installable range instead of rewriting the consumer manifest to an unpublished version.
350
+ const publishedCliRange =
351
+ cliPackageVersion.includes('-') && configuredCliRange && parseVersion(configuredCliRange)
352
+ ? configuredCliRange
353
+ : `^${cliPackageVersion}`;
340
354
  return {
341
355
  isSmoothBricksCodebase: isCodebase,
342
356
  toolingPackageName: toolingName,
343
- cliDependencyRange: isCodebase ? 'workspace:*' : `^${cliPackageVersion}`,
357
+ cliDependencyRange: isCodebase ? 'workspace:*' : publishedCliRange,
344
358
  };
345
359
  }
346
360
 
@@ -21,7 +21,12 @@ describe('firstWranglerEnv', () => {
21
21
  describe('applyWranglerDefaults', () => {
22
22
  it('injects the wrangler-types target and wires typecheck, idempotently', async () => {
23
23
  const root = await createWorkspace([
24
- { dir: 'api', name: '@acme/api', toml: '[env.production]\n', nx: { targets: { typecheck: { dependsOn: ['^build'] } } } },
24
+ {
25
+ dir: 'api',
26
+ name: '@acme/api',
27
+ toml: '[env.production]\n',
28
+ nx: { targets: { typecheck: { dependsOn: ['^build'] } } },
29
+ },
25
30
  ]);
26
31
  try {
27
32
  applyWranglerDefaults(root);
@@ -51,7 +56,9 @@ describe('applyWranglerDefaults', () => {
51
56
  });
52
57
 
53
58
  it('omits --env from the command when the wrangler.toml declares no env block', async () => {
54
- const root = await createWorkspace([{ dir: 'api', name: '@acme/api', toml: 'name = "svc"\nmain = "src/index.ts"\n' }]);
59
+ const root = await createWorkspace([
60
+ { dir: 'api', name: '@acme/api', toml: 'name = "svc"\nmain = "src/index.ts"\n' },
61
+ ]);
55
62
  captureConsoleLogs();
56
63
  try {
57
64
  applyWranglerDefaults(root);
@@ -60,7 +60,13 @@ function kvIn(toml: string, table: AST.TOMLTable, key: string): AST.TOMLKeyValue
60
60
  }
61
61
 
62
62
  /** The `<field>` KV of the `[[env.<env>.<arrayKey>]]` table whose `binding` matches, or null. */
63
- function arrayTableKv(toml: string, env: string, arrayKey: string, binding: string, field: string): AST.TOMLKeyValue | null {
63
+ function arrayTableKv(
64
+ toml: string,
65
+ env: string,
66
+ arrayKey: string,
67
+ binding: string,
68
+ field: string,
69
+ ): AST.TOMLKeyValue | null {
64
70
  const block = envRecord(toml, env);
65
71
  const rows = isRecord(block) && Array.isArray(block[arrayKey]) ? block[arrayKey] : [];
66
72
  const index = rows.findIndex((r) => isRecord(r) && r.binding === binding);
@@ -173,7 +179,8 @@ export function getD1Name(toml: string, env: string, binding: string): string |
173
179
  const block = envRecord(toml, env);
174
180
  const rows = isRecord(block) && Array.isArray(block.d1_databases) ? block.d1_databases : [];
175
181
  for (const row of rows) {
176
- if (isRecord(row) && row.binding === binding && typeof row.database_name === 'string') return row.database_name || null;
182
+ if (isRecord(row) && row.binding === binding && typeof row.database_name === 'string')
183
+ return row.database_name || null;
177
184
  }
178
185
  return null;
179
186
  }
@@ -193,7 +200,10 @@ export function blankD1Ids(toml: string, env: string): string {
193
200
  /** Blank one field across every `[[env.<env>.<arrayKey>]]` table (value..EOL -> `""`). */
194
201
  function blankArrayField(toml: string, env: string, arrayKey: string, field: string): string {
195
202
  const edits = tables(toml)
196
- .filter((t) => t.kind === 'array' && t.resolvedKey[0] === 'env' && t.resolvedKey[1] === env && t.resolvedKey[2] === arrayKey)
203
+ .filter(
204
+ (t) =>
205
+ t.kind === 'array' && t.resolvedKey[0] === 'env' && t.resolvedKey[1] === env && t.resolvedKey[2] === arrayKey,
206
+ )
197
207
  .map((t) => kvIn(toml, t, field))
198
208
  .flatMap((kv) => (kv ? [{ start: kv.value.range[0], end: endOfLine(toml, kv.value.range[1]) }] : []));
199
209
  return applyBlanks(toml, edits);
@@ -332,7 +342,7 @@ export async function ensureNamespace(logical: string, existing: KvNamespace[],
332
342
  try {
333
343
  await $`bunx wrangler kv namespace create ${logical}`.cwd(cwd).quiet();
334
344
  } catch (err) {
335
- return errText(err).includes('already') ? (await reList(logical, cwd)) : null;
345
+ return errText(err).includes('already') ? await reList(logical, cwd) : null;
336
346
  }
337
347
  return reList(logical, cwd);
338
348
  }
@@ -16,7 +16,10 @@ export interface ScaffoldOptions {
16
16
  }
17
17
 
18
18
  /** Locate a workspace package by nx name, package name, or relative path; must have a wrangler.toml. */
19
- function resolveProject(root: string, project: string): { dir: string; label: string; packageJsonPath: string; json: Record<string, unknown> } {
19
+ function resolveProject(
20
+ root: string,
21
+ project: string,
22
+ ): { dir: string; label: string; packageJsonPath: string; json: Record<string, unknown> } {
20
23
  const manifests = getWorkspacePackageManifests(root);
21
24
  const match = manifests.find((m) => {
22
25
  const nx = recordProperty(m.json, 'nx');
@@ -83,7 +86,7 @@ async function checkMode(env: string): Promise<void> {
83
86
  for (const binding of kvBindings) {
84
87
  const inToml = pe.getKvId(toml, env, binding);
85
88
  const liveId = live.find((n) => n.title === kvTitle(binding, env))?.id ?? null;
86
- p.log.message(\` KV \${binding}: \${!liveId ? '✗ not created' : inToml === liveId ? \`✓ \${liveId}\` : \`⚠ drift (live \${liveId}, toml \${inToml ?? 'unset'})\`}\`);
89
+ p.log.message(\` KV \${binding}: \${!liveId ? '✗ not created' : inToml === liveId ? \`✓ \${liveId}\` : \`! drift (live \${liveId}, toml \${inToml ?? 'unset'})\`}\`);
87
90
  }
88
91
  for (const name of vars) {
89
92
  p.log.message(\` var \${name}: \${pe.getVar(toml, env, name) ? '✓ set' : '✗ empty'}\`);
@@ -234,6 +237,8 @@ export function scaffold(root: string, project: string, options: ScaffoldOptions
234
237
  console.log(`updated ${label}/package.json prepare-env target`);
235
238
  }
236
239
 
237
- console.log(`\nnext: fill secret NAMES in ${label}/.dev.vars.example, then\n bunx nx run ${project}:prepare-env -- <env>`);
240
+ console.log(
241
+ `\nnext: fill secret NAMES in ${label}/.dev.vars.example, then\n bunx nx run ${project}:prepare-env -- <env>`,
242
+ );
238
243
  return scriptPath;
239
244
  }