@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.
- package/dist/github-ci/index.js +4 -3
- package/dist/lib/conflict-markers.d.ts.map +1 -1
- package/dist/lib/workspace.d.ts +1 -1
- package/dist/lib/workspace.d.ts.map +1 -1
- package/dist/monorepo/ci-workflow.d.ts.map +1 -1
- package/dist/monorepo/ci-workflow.js +1 -0
- package/dist/monorepo/managed-files.d.ts +1 -0
- package/dist/monorepo/managed-files.d.ts.map +1 -1
- package/dist/monorepo/managed-files.js +12 -5
- package/dist/monorepo/publish-workflow.d.ts.map +1 -1
- package/dist/monorepo/publish-workflow.js +1 -0
- package/dist/monorepo/tool-validation.d.ts.map +1 -1
- package/dist/monorepo/tool-validation.js +20 -7
- package/dist/release/github-release.d.ts +2 -2
- package/dist/wrangler/prepare-env.d.ts.map +1 -1
- package/dist/wrangler/prepare-env.js +1 -1
- package/dist/wrangler/scaffold.d.ts.map +1 -1
- package/dist/wrangler/scaffold.js +1 -1
- package/managed/raw/tooling/direnv/setup-environment.ts +2 -8
- package/package.json +3 -13
- package/src/github-ci/index.ts +5 -3
- package/src/monorepo/__tests__/ci-workflow.test.ts +2 -0
- package/src/monorepo/__tests__/publish-workflow.test.ts +12 -4
- package/src/monorepo/ci-workflow.ts +2 -0
- package/src/monorepo/managed-files.test.ts +13 -0
- package/src/monorepo/managed-files.ts +20 -5
- package/src/monorepo/package-policy.test.ts +7 -37
- package/src/monorepo/publish-workflow.ts +2 -0
- package/src/monorepo/tool-validation.test.ts +59 -24
- package/src/monorepo/tool-validation.ts +21 -7
- package/src/monorepo/wrangler.test.ts +9 -2
- package/src/wrangler/prepare-env.ts +14 -4
- package/src/wrangler/scaffold.ts +8 -3
package/dist/github-ci/index.js
CHANGED
|
@@ -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
|
|
189
|
-
|
|
190
|
-
|
|
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;
|
|
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"}
|
package/dist/lib/workspace.d.ts
CHANGED
|
@@ -30,7 +30,7 @@ export interface RepositoryInfo {
|
|
|
30
30
|
type: string;
|
|
31
31
|
url: string;
|
|
32
32
|
}
|
|
33
|
-
export declare const workspaceDependencyFields: readonly [
|
|
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":"AAKA,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,eAAe,EAAE,MAAM,CAAC;IACxB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC/B;AAED,MAAM,WAAW,wBAAwB;IACvC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,eAAe,EAAE,MAAM,CAAC;IACxB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC/B;AAED,MAAM,WAAW,WAAY,SAAQ,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAC1D,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,EAAE,CAAC,EAAE,OAAO,CAAC;IACb,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;CACb;AAED,eAAO,MAAM,yBAAyB,
|
|
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":"
|
|
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"}
|
|
@@ -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;
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
329
|
-
|
|
330
|
-
|
|
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":"
|
|
1
|
+
{"version":3,"file":"publish-workflow.d.ts","sourceRoot":"","sources":["../../src/monorepo/publish-workflow.ts"],"names":[],"mappings":"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"}
|
|
@@ -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;
|
|
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: '
|
|
8
|
+
{ name: '@nx/js', fallbackVersion: '23.1.0', minimumVersion: '23.1.0' },
|
|
9
9
|
{
|
|
10
10
|
name: '@smoothbricks/nx-plugin',
|
|
11
|
-
fallbackVersion: '^0.0
|
|
12
|
-
minimumVersion: '0.0
|
|
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: '
|
|
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
|
-
|
|
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:*' :
|
|
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":"AAyBA,wBAAgB,QAAQ,CAAC,CAAC,EAAE,OAAO,GAAG,CAAC,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAEjE;
|
|
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') ?
|
|
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;
|
|
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}\` :
|
|
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
|
-
//
|
|
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 (!
|
|
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.
|
|
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.
|
|
56
|
-
"@smoothbricks/validation": "0.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": {
|
package/src/github-ci/index.ts
CHANGED
|
@@ -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
|
|
224
|
-
|
|
225
|
-
|
|
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';
|
|
@@ -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: []
|
|
256
|
-
lints: []
|
|
257
|
-
tests: []
|
|
263
|
+
builds: [],
|
|
264
|
+
lints: [],
|
|
265
|
+
tests: [],
|
|
258
266
|
validates: 0,
|
|
259
267
|
};
|
|
260
268
|
|
|
@@ -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
|
-
|
|
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
|
-
|
|
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
|
|
392
|
-
|
|
393
|
-
|
|
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(
|
|
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('
|
|
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('
|
|
210
|
-
expect(errors.join('\n')).toContain('
|
|
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': ['
|
|
16
|
-
'@smoothbricks/nx-plugin': ['0.0
|
|
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: ['
|
|
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
|
|
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('
|
|
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': '
|
|
93
|
-
'@smoothbricks/nx-plugin': '^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: '
|
|
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': '
|
|
195
|
+
'@nx/js': '23.2.0',
|
|
165
196
|
eslint: '^10.0.0',
|
|
166
|
-
nx: '
|
|
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
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
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: '
|
|
28
|
+
{ name: '@nx/js', fallbackVersion: '23.1.0', minimumVersion: '23.1.0' },
|
|
29
29
|
{
|
|
30
30
|
name: '@smoothbricks/nx-plugin',
|
|
31
|
-
fallbackVersion: '^0.0
|
|
32
|
-
minimumVersion: '0.0
|
|
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: '
|
|
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
|
-
|
|
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:*' :
|
|
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
|
-
{
|
|
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([
|
|
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(
|
|
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')
|
|
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(
|
|
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') ?
|
|
345
|
+
return errText(err).includes('already') ? await reList(logical, cwd) : null;
|
|
336
346
|
}
|
|
337
347
|
return reList(logical, cwd);
|
|
338
348
|
}
|
package/src/wrangler/scaffold.ts
CHANGED
|
@@ -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(
|
|
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}\` :
|
|
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(
|
|
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
|
}
|