@smoothbricks/cli 0.10.5 → 0.10.6
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/cli.js +2 -2
- package/dist/github-ci/index.d.ts.map +1 -1
- package/dist/github-ci/index.js +5 -3
- package/dist/lib/json.d.ts +2 -0
- package/dist/lib/json.d.ts.map +1 -1
- package/dist/lib/json.js +2 -2
- package/dist/monorepo/ci-workflow.d.ts +2 -0
- package/dist/monorepo/ci-workflow.d.ts.map +1 -1
- package/dist/monorepo/ci-workflow.js +10 -4
- package/dist/monorepo/github-runs-on.d.ts +14 -0
- package/dist/monorepo/github-runs-on.d.ts.map +1 -0
- package/dist/monorepo/github-runs-on.js +43 -0
- package/dist/monorepo/index.d.ts +2 -2
- package/dist/monorepo/index.d.ts.map +1 -1
- package/dist/monorepo/index.js +7 -7
- package/dist/monorepo/managed-files.d.ts +30 -3
- package/dist/monorepo/managed-files.d.ts.map +1 -1
- package/dist/monorepo/managed-files.js +78 -63
- package/dist/monorepo/packs/index.js +1 -1
- package/dist/monorepo/publish-workflow.d.ts +3 -0
- package/dist/monorepo/publish-workflow.d.ts.map +1 -1
- package/dist/monorepo/publish-workflow.js +17 -14
- package/managed/raw/tooling/direnv/github-actions-bootstrap.sh +24 -7
- package/managed/templates/github/actions/cache-nix-devenv/action.yml +13 -11
- package/managed/templates/github/actions/save-nix-devenv/action.yml +34 -3
- package/managed/templates/github/actions/setup-devenv/action.yml +44 -15
- package/managed/templates/github/workflows/managed-files.yml +64 -12
- package/package.json +1 -1
- package/src/cli.ts +2 -2
- package/src/github-ci/index.test.ts +3 -3
- package/src/github-ci/index.ts +6 -3
- package/src/lib/json.ts +2 -0
- package/src/monorepo/__tests__/ci-workflow.test.ts +37 -1
- package/src/monorepo/__tests__/publish-workflow.test.ts +28 -1
- package/src/monorepo/ci-workflow.ts +14 -4
- package/src/monorepo/github-runs-on.ts +45 -0
- package/src/monorepo/index.ts +7 -7
- package/src/monorepo/managed-files.test.ts +49 -0
- package/src/monorepo/managed-files.ts +100 -64
- package/src/monorepo/packs/index.ts +1 -1
- package/src/monorepo/publish-workflow.ts +23 -15
package/dist/cli.js
CHANGED
|
@@ -57,11 +57,11 @@ function buildProgram() {
|
|
|
57
57
|
.option('--warn', 'report drift as warnings (GitHub annotations) instead of failing')
|
|
58
58
|
.action(async (options) => {
|
|
59
59
|
const { checkManagedFiles } = await import('./monorepo/index.js');
|
|
60
|
-
checkManagedFiles(await findRepoRoot(), { warn: options.warn });
|
|
60
|
+
await checkManagedFiles(await findRepoRoot(), { warn: options.warn });
|
|
61
61
|
});
|
|
62
62
|
monorepo.command('diff').action(async () => {
|
|
63
63
|
const { diffManagedFiles } = await import('./monorepo/index.js');
|
|
64
|
-
diffManagedFiles(await findRepoRoot());
|
|
64
|
+
await diffManagedFiles(await findRepoRoot());
|
|
65
65
|
});
|
|
66
66
|
monorepo
|
|
67
67
|
.command('validate-commit-msg <commitMsgFile>')
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/github-ci/index.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,KAAK,cAAc,EAAsB,MAAM,gBAAgB,CAAC;AACzE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAmBhD,KAAK,WAAW,GAAG,MAAM,GAAG,UAAU,GAAG,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/github-ci/index.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,KAAK,cAAc,EAAsB,MAAM,gBAAgB,CAAC;AACzE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAmBhD,KAAK,WAAW,GAAG,MAAM,GAAG,UAAU,GAAG,UAAU,CAAC;AAKpD,wBAAsB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAwBtE;AAmFD,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,GAAG,UAAU,EAAE,aAAa,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAO3G;AAED,wBAAsB,eAAe,CACnC,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,WAAW,CAAC;IAAC,aAAa,CAAC,EAAE,MAAM,CAAA;CAAE,GACpG,OAAO,CAAC,IAAI,CAAC,CAWf;AAED,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC9B;AAED,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,WAAW,EAAE,CAAC;IACpB,cAAc,EAAE,MAAM,EAAE,CAAC;CAC1B;AAED,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,cAAc,EAAE,EAAE,OAAO,EAAE,gBAAgB,GAAG,oBAAoB,CAiC9G;AAED,wBAAgB,4BAA4B,CAAC,IAAI,EAAE,WAAW,EAAE,GAAG,WAAW,EAAE,CAwC/E;AAED,wBAAgB,aAAa,CAAC,GAAG,EAAE,WAAW,EAAE,aAAa,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAehF;AAED,wBAAsB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAGlE;AAED,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAa9F;AAED,wBAAsB,oBAAoB,CACxC,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,MAAM,EAAE,EACrB,iBAAiB,EAAE,MAAM,GACxB,OAAO,CAAC,IAAI,CAAC,CAGf;AAgCD,wBAAsB,gBAAgB,CACpC,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE;IAAE,aAAa,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,WAAW,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAA;CAAE,GACrG,OAAO,CAAC,IAAI,CAAC,CA0Bf"}
|
package/dist/github-ci/index.js
CHANGED
|
@@ -25,6 +25,8 @@ const parseNxProjectDeployConfigurations = (() => {
|
|
|
25
25
|
const __is = input => "object" === typeof input && null !== input && false === Array.isArray(input) && _io0(input);
|
|
26
26
|
return input => { input = JSON.parse(input); return __is(input) ? input : null; };
|
|
27
27
|
})();
|
|
28
|
+
/** Nx workers = host cores (CI runners sized for full machine use). */
|
|
29
|
+
const NX_PARALLEL = '100%';
|
|
28
30
|
export async function cleanupGithubCiCache(root) {
|
|
29
31
|
const githubOutput = process.env.GITHUB_OUTPUT;
|
|
30
32
|
const markCacheReady = async (ready) => {
|
|
@@ -127,7 +129,7 @@ export function nxSmartArgs(target, mode, configuration) {
|
|
|
127
129
|
if (configuration) {
|
|
128
130
|
args.push(`--configuration=${configuration}`);
|
|
129
131
|
}
|
|
130
|
-
args.push(`--exclude=tag:ci:skip:${target}`,
|
|
132
|
+
args.push(`--exclude=tag:ci:skip:${target}`, `--parallel=${NX_PARALLEL}`);
|
|
131
133
|
return args;
|
|
132
134
|
}
|
|
133
135
|
export async function githubCiNxSmart(root, options) {
|
|
@@ -226,7 +228,7 @@ export function nxRunManyArgs(run, configuration) {
|
|
|
226
228
|
if (configuration) {
|
|
227
229
|
nxArgs.push(`--configuration=${configuration}`);
|
|
228
230
|
}
|
|
229
|
-
nxArgs.push(
|
|
231
|
+
nxArgs.push(`--parallel=${NX_PARALLEL}`);
|
|
230
232
|
return nxArgs;
|
|
231
233
|
}
|
|
232
234
|
export async function readGitHeadSha(root) {
|
|
@@ -291,7 +293,7 @@ export async function githubCiNxDeploy(root, options) {
|
|
|
291
293
|
const projectList = projects.join(',');
|
|
292
294
|
const targets = options.verify === true ? ['build', 'lint', 'test', 'deploy'] : ['deploy'];
|
|
293
295
|
for (const target of targets) {
|
|
294
|
-
const nxArgs = ['run-many', '-t', target, `--projects=${projectList}`,
|
|
296
|
+
const nxArgs = ['run-many', '-t', target, `--projects=${projectList}`, `--parallel=${NX_PARALLEL}`];
|
|
295
297
|
if (target === 'deploy') {
|
|
296
298
|
nxArgs.push(`--configuration=${options.configuration}`);
|
|
297
299
|
}
|
package/dist/lib/json.d.ts
CHANGED
|
@@ -16,6 +16,8 @@ export interface PackagePublishConfig {
|
|
|
16
16
|
}
|
|
17
17
|
export interface PackageSmooGithub {
|
|
18
18
|
pushBranches?: string[];
|
|
19
|
+
/** GitHub Actions runs-on for managed CI (string or label list). Default: ubuntu-latest. */
|
|
20
|
+
runsOn?: string | string[];
|
|
19
21
|
}
|
|
20
22
|
export interface PackageSmooConfig {
|
|
21
23
|
github?: PackageSmooGithub;
|
package/dist/lib/json.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"json.d.ts","sourceRoot":"","sources":["../../src/lib/json.ts"],"names":[],"mappings":"AAGA,sDAAsD;AACtD,MAAM,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAE/C,MAAM,WAAW,iBAAiB;IAChC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAC3B,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;CAC1C;AAED,MAAM,WAAW,oBAAoB;IACnC,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,iBAAiB;IAChC,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"json.d.ts","sourceRoot":"","sources":["../../src/lib/json.ts"],"names":[],"mappings":"AAGA,sDAAsD;AACtD,MAAM,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAE/C,MAAM,WAAW,iBAAiB;IAChC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAC3B,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;CAC1C;AAED,MAAM,WAAW,oBAAoB;IACnC,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,iBAAiB;IAChC,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,4FAA4F;IAC5F,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;CAC5B;AAED,MAAM,WAAW,iBAAiB;IAChC,MAAM,CAAC,EAAE,iBAAiB,CAAC;CAC5B;AAED,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;CACrB;AAED;;;GAGG;AACH,MAAM,WAAW,WAAW;IAC1B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACzB,OAAO,CAAC,EAAE,cAAc,CAAC;IACzB,UAAU,CAAC,EAAE,MAAM,EAAE,GAAG,uBAAuB,CAAC;IAChD,YAAY,CAAC,EAAE,SAAS,CAAC;IACzB,eAAe,CAAC,EAAE,SAAS,CAAC;IAC5B,gBAAgB,CAAC,EAAE,SAAS,CAAC;IAC7B,oBAAoB,CAAC,EAAE,SAAS,CAAC;IACjC,kEAAkE;IAClE,mBAAmB,CAAC,EAAE,SAAS,CAAC;IAChC,OAAO,CAAC,EAAE,SAAS,CAAC;IACpB,OAAO,CAAC,EAAE,SAAS,CAAC;IACpB,aAAa,CAAC,EAAE,oBAAoB,CAAC;IACrC,UAAU,CAAC,EAAE,MAAM,GAAG,iBAAiB,CAAC;IACxC,EAAE,CAAC,EAAE,eAAe,CAAC;IACrB,IAAI,CAAC,EAAE,iBAAiB,CAAC;CAC1B;AAED,mEAAmE;AACnE,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,gBAAgB,GAAG,IAAI,GAAG,SAAS,CAAC;AAC1E,MAAM,WAAW,gBAAgB;IAC/B,CAAC,SAAS,EAAE,MAAM,GAAG,cAAc,CAAC;CACrC;AAED,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;CAC9B;AAED,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,iBAAiB,CAAC;AAErD,yDAAyD;AACzD,MAAM,MAAM,eAAe,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAEtD,MAAM,MAAM,OAAO,GAAG,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAEvD,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,WAAW,EAAE,CAAC;IAC1B,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,MAAM,CAAC,EAAE,OAAO,EAAE,CAAC;IACnB,OAAO,CAAC,EAAE,eAAe,CAAC;IAC1B,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IAChD,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;CAC1C;AAED,MAAM,WAAW,MAAM;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC;CAChF;AAED,8EAA8E;AAC9E,eAAO,MAAM,oBAAoB,uCAA0C,CAAC;AAE5E,4FAA4F;AAC5F,eAAO,MAAM,sBAAsB,yCAA4C,CAAC;AAEhF,yEAAyE;AACzE,eAAO,MAAM,eAAe,kCAAqC,CAAC;AAElE,8EAA8E;AAC9E,eAAO,MAAM,oBAAoB,oCAAuC,CAAC;AAIzE,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI,CAS/D;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,CAM5D;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAEjE;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEpD;AAED,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAK9C;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,WAAW,CAElE;AAED,0CAA0C;AAC1C,wBAAgB,aAAa,CAAC,GAAG,EAAE,WAAW,GAAG,SAAS,CAOzD;AAED,+EAA+E;AAC/E,wBAAgB,mBAAmB,CACjC,GAAG,EAAE,WAAW,EAChB,GAAG,EAAE,cAAc,GAAG,iBAAiB,GAAG,kBAAkB,GAAG,sBAAsB,GAAG,qBAAqB,GAC5G,SAAS,CAQX;AAED,0CAA0C;AAC1C,wBAAgB,aAAa,CAAC,GAAG,EAAE,WAAW,GAAG,SAAS,CAOzD;AAED,qCAAqC;AACrC,wBAAgB,QAAQ,CAAC,GAAG,EAAE,WAAW,GAAG,eAAe,CAO1D;AAED,6CAA6C;AAC7C,wBAAgB,eAAe,CAAC,EAAE,EAAE,eAAe,GAAG,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAOnF;AAED,gDAAgD;AAChD,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,WAAW,GAAG,oBAAoB,CAO1E;AAED,sEAAsE;AACtE,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,WAAW,GAAG,iBAAiB,CAO1E;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAMxF;AAED,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAM/F;AAED,wBAAgB,qBAAqB,CACnC,GAAG,EAAE,WAAW,EAChB,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,GAAG,OAAO,GAAG,gBAAgB,EAChE,KAAK,EAAE,MAAM,GACZ,OAAO,CAMT;AAED,wBAAgB,4BAA4B,CAC1C,GAAG,EAAE,WAAW,EAChB,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,GAAG,OAAO,GAAG,gBAAgB,EAChE,KAAK,EAAE,MAAM,GACZ,OAAO,CAMT;AAED,wBAAgB,SAAS,CAAC,EAAE,EAAE,eAAe,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAMrE;AAED,wBAAgB,gBAAgB,CAAC,aAAa,EAAE,oBAAoB,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAM5F;AAED,wBAAgB,kBAAkB,CAChC,UAAU,EAAE,iBAAiB,EAC7B,GAAG,EAAE,MAAM,GAAG,KAAK,GAAG,WAAW,EACjC,KAAK,EAAE,MAAM,GACZ,OAAO,CAMT;AAED,wBAAgB,yBAAyB,CACvC,UAAU,EAAE,iBAAiB,EAC7B,GAAG,EAAE,MAAM,GAAG,KAAK,GAAG,WAAW,EACjC,KAAK,EAAE,MAAM,GACZ,OAAO,CAMT"}
|
package/dist/lib/json.js
CHANGED
|
@@ -43,7 +43,7 @@ export const parsePackageJsonText = (() => {
|
|
|
43
43
|
return true;
|
|
44
44
|
});
|
|
45
45
|
const _io12 = (input, _vctx = {}) => undefined === input.github || "object" === typeof input.github && null !== input.github && false === Array.isArray(input.github) && _io13(input.github, _vctx);
|
|
46
|
-
const _io13 = (input, _vctx = {}) => undefined === input.pushBranches || Array.isArray(input.pushBranches) && input.pushBranches.every(elem => "string" === typeof elem);
|
|
46
|
+
const _io13 = (input, _vctx = {}) => (undefined === input.pushBranches || Array.isArray(input.pushBranches) && input.pushBranches.every(elem => "string" === typeof elem)) && (null !== input.runsOn && (undefined === input.runsOn || "string" === typeof input.runsOn || Array.isArray(input.runsOn) && input.runsOn.every(elem => "string" === typeof elem)));
|
|
47
47
|
const _io2 = (input, _vctx = {}) => (_vctx.io2 || (_vctx.io2 = new WeakSet())).has(input) ? true : (_vctx.io2.add(input), (Object.keys(input).every(key => {
|
|
48
48
|
const value = input[key];
|
|
49
49
|
if (undefined === value)
|
|
@@ -156,7 +156,7 @@ const isPackageJsonValue = (() => {
|
|
|
156
156
|
return true;
|
|
157
157
|
});
|
|
158
158
|
const _io12 = (input, _vctx = {}) => undefined === input.github || "object" === typeof input.github && null !== input.github && false === Array.isArray(input.github) && _io13(input.github, _vctx);
|
|
159
|
-
const _io13 = (input, _vctx = {}) => undefined === input.pushBranches || Array.isArray(input.pushBranches) && input.pushBranches.every(elem => "string" === typeof elem);
|
|
159
|
+
const _io13 = (input, _vctx = {}) => (undefined === input.pushBranches || Array.isArray(input.pushBranches) && input.pushBranches.every(elem => "string" === typeof elem)) && (null !== input.runsOn && (undefined === input.runsOn || "string" === typeof input.runsOn || Array.isArray(input.runsOn) && input.runsOn.every(elem => "string" === typeof elem)));
|
|
160
160
|
const _io2 = (input, _vctx = {}) => (_vctx.io2 || (_vctx.io2 = new WeakSet())).has(input) ? true : (_vctx.io2.add(input), (Object.keys(input).every(key => {
|
|
161
161
|
const value = input[key];
|
|
162
162
|
if (undefined === value)
|
|
@@ -22,6 +22,8 @@ export interface CiWorkflowDefinitionOptions {
|
|
|
22
22
|
deploy: boolean;
|
|
23
23
|
deployProvider?: 'cloudflare';
|
|
24
24
|
pushBranches: string[];
|
|
25
|
+
/** Default ubuntu-latest when omitted. */
|
|
26
|
+
runsOn?: string | string[];
|
|
25
27
|
}
|
|
26
28
|
export declare function defineCiWorkflow(options: CiWorkflowDefinitionOptions): CiWorkflowStep[];
|
|
27
29
|
export declare function renderCiWorkflowYaml(options: CiWorkflowDefinitionOptions): string;
|
|
@@ -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":"AAIA,oBAAY,kBAAkB;IAC5B,QAAQ,aAAa;IACrB,WAAW,iBAAiB;IAC5B,SAAS,gBAAgB;IACzB,cAAc,qBAAqB;IACnC,KAAK,UAAU;IACf,IAAI,SAAS;IACb,SAAS,eAAe;IACxB,iBAAiB,wBAAwB;IACzC,oBAAoB,2BAA2B;IAC/C,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;IACvB,0CAA0C;IAC1C,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;CAC5B;AAID,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,2BAA2B,GAAG,cAAc,EAAE,CAqBvF;AAED,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,2BAA2B,GAAG,MAAM,CAGjF"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
/* biome-ignore-all lint/suspicious/noTemplateCurlyInString: GitHub Actions expressions are emitted literally. */
|
|
2
|
+
import { renderRunsOnLine } from './github-runs-on.js';
|
|
2
3
|
export var CiWorkflowStepKind;
|
|
3
4
|
(function (CiWorkflowStepKind) {
|
|
4
5
|
CiWorkflowStepKind["Checkout"] = "checkout";
|
|
@@ -59,7 +60,7 @@ defaults:
|
|
|
59
60
|
jobs:
|
|
60
61
|
main:
|
|
61
62
|
name: Validate
|
|
62
|
-
|
|
63
|
+
${renderRunsOnLine(options.runsOn)}
|
|
63
64
|
timeout-minutes: 45
|
|
64
65
|
env:
|
|
65
66
|
NIX_STORE_NAR: ${githubExpression('github.workspace')}/nix-store.nar
|
|
@@ -124,6 +125,8 @@ function yamlLinesForStep(step, options) {
|
|
|
124
125
|
' fetch-depth: 0',
|
|
125
126
|
];
|
|
126
127
|
case CiWorkflowStepKind.SetupDevenv:
|
|
128
|
+
// One step everywhere. setup-devenv detects host-nix (GARM) vs ephemeral
|
|
129
|
+
// and skips GH install/cache steps internally — same for ci/publish/managed.
|
|
127
130
|
return [` - name: ${step.name}`, ' id: setup', ' uses: ./.github/actions/setup-devenv'];
|
|
128
131
|
case CiWorkflowStepKind.SetNxShas:
|
|
129
132
|
return [
|
|
@@ -158,7 +161,7 @@ function yamlLinesForStep(step, options) {
|
|
|
158
161
|
// recursion guard, so the default token suffices.
|
|
159
162
|
return [
|
|
160
163
|
` - name: ${step.name}`,
|
|
161
|
-
" if:
|
|
164
|
+
" if: steps.managed-drift.outputs.drifted != '' && steps.managed-drift.outputs.drifted != '0'",
|
|
162
165
|
' run: gh workflow run managed-files.yml --ref "$GITHUB_REF_NAME"',
|
|
163
166
|
];
|
|
164
167
|
case CiWorkflowStepKind.Deploy:
|
|
@@ -186,7 +189,8 @@ function yamlLinesForStep(step, options) {
|
|
|
186
189
|
case CiWorkflowStepKind.UploadTraceDbs:
|
|
187
190
|
return [
|
|
188
191
|
` - name: ${step.name}`,
|
|
189
|
-
'
|
|
192
|
+
' # success() is the default; always() keeps traces after a red build/test.',
|
|
193
|
+
' if: always()',
|
|
190
194
|
' uses: actions/upload-artifact@v7.0.1',
|
|
191
195
|
' with:',
|
|
192
196
|
' name: trace-results-${{ github.run_id }}',
|
|
@@ -198,7 +202,9 @@ function yamlLinesForStep(step, options) {
|
|
|
198
202
|
case CiWorkflowStepKind.SaveNixDevenv:
|
|
199
203
|
return [
|
|
200
204
|
` - name: ${step.name}`,
|
|
201
|
-
'
|
|
205
|
+
' # always() still saves after a red job. Nix NAR is ephemeral-only;',
|
|
206
|
+
' # devenv eval-cache also saves on host-nix when setup missed.',
|
|
207
|
+
' if: always()',
|
|
202
208
|
' uses: ./.github/actions/save-nix-devenv',
|
|
203
209
|
' with:',
|
|
204
210
|
' nix-cache-hit: ${{ steps.setup.outputs.nix-cache-hit }}',
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/** Shared `runs-on:` emission for generated GitHub workflow YAML. */
|
|
2
|
+
export type WorkflowRunsOn = string | string[] | undefined;
|
|
3
|
+
export declare function isNixosRunner(runsOn: WorkflowRunsOn): boolean;
|
|
4
|
+
/**
|
|
5
|
+
* Trusted jobs use configured nixos self-hosted labels; fork PRs stay on
|
|
6
|
+
* ubuntu-latest (no access to the private runner fleet).
|
|
7
|
+
*/
|
|
8
|
+
export declare function githubUsesNixosRunnerExpr(): string;
|
|
9
|
+
/**
|
|
10
|
+
* Full ` runs-on: …` line(s), indented for a job under `jobs.<id>:`.
|
|
11
|
+
* Nixos labels emit the multiline prettier-stable fork-gate expression.
|
|
12
|
+
*/
|
|
13
|
+
export declare function renderRunsOnLine(runsOn: WorkflowRunsOn): string;
|
|
14
|
+
//# sourceMappingURL=github-runs-on.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"github-runs-on.d.ts","sourceRoot":"","sources":["../../src/monorepo/github-runs-on.ts"],"names":[],"mappings":"AAAA,qEAAqE;AAErE,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,CAAC;AAE3D,wBAAgB,aAAa,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO,CAG7D;AAED;;;GAGG;AACH,wBAAgB,yBAAyB,IAAI,MAAM,CAElD;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM,CAuB/D"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/** Shared `runs-on:` emission for generated GitHub workflow YAML. */
|
|
2
|
+
export function isNixosRunner(runsOn) {
|
|
3
|
+
const labels = runsOn === undefined ? [] : typeof runsOn === 'string' ? [runsOn] : runsOn;
|
|
4
|
+
return labels.some((label) => label === 'nixos' || label.startsWith('nixos-'));
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* Trusted jobs use configured nixos self-hosted labels; fork PRs stay on
|
|
8
|
+
* ubuntu-latest (no access to the private runner fleet).
|
|
9
|
+
*/
|
|
10
|
+
export function githubUsesNixosRunnerExpr() {
|
|
11
|
+
return "(github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name == github.repository)";
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Full ` runs-on: …` line(s), indented for a job under `jobs.<id>:`.
|
|
15
|
+
* Nixos labels emit the multiline prettier-stable fork-gate expression.
|
|
16
|
+
*/
|
|
17
|
+
export function renderRunsOnLine(runsOn) {
|
|
18
|
+
if (!isNixosRunner(runsOn)) {
|
|
19
|
+
let value;
|
|
20
|
+
if (runsOn === undefined) {
|
|
21
|
+
value = 'ubuntu-latest';
|
|
22
|
+
}
|
|
23
|
+
else if (typeof runsOn === 'string') {
|
|
24
|
+
value = runsOn.length > 0 ? runsOn : 'ubuntu-latest';
|
|
25
|
+
}
|
|
26
|
+
else if (runsOn.length === 0) {
|
|
27
|
+
value = 'ubuntu-latest';
|
|
28
|
+
}
|
|
29
|
+
else if (runsOn.length === 1) {
|
|
30
|
+
value = runsOn[0] ?? 'ubuntu-latest';
|
|
31
|
+
}
|
|
32
|
+
else {
|
|
33
|
+
value = `[${runsOn.map((label) => `'${label}'`).join(', ')}]`;
|
|
34
|
+
}
|
|
35
|
+
return ` runs-on: ${value}`;
|
|
36
|
+
}
|
|
37
|
+
const labels = typeof runsOn === 'string' ? [runsOn] : runsOn;
|
|
38
|
+
// Multiline matches prettier so checked-in workflows stay byte-identical.
|
|
39
|
+
const nixosJson = JSON.stringify(labels);
|
|
40
|
+
return ` runs-on:
|
|
41
|
+
\${{ ${githubUsesNixosRunnerExpr()} &&
|
|
42
|
+
fromJSON('${nixosJson}') || 'ubuntu-latest' }}`;
|
|
43
|
+
}
|
package/dist/monorepo/index.d.ts
CHANGED
|
@@ -33,8 +33,8 @@ export declare function validateMonorepo(root: string, options?: ValidateOptions
|
|
|
33
33
|
export declare function updateManagedFiles(root: string): Promise<void>;
|
|
34
34
|
export declare function checkManagedFiles(root: string, options?: {
|
|
35
35
|
warn?: boolean;
|
|
36
|
-
}): void
|
|
37
|
-
export declare function diffManagedFiles(root: string): void
|
|
36
|
+
}): Promise<void>;
|
|
37
|
+
export declare function diffManagedFiles(root: string): Promise<void>;
|
|
38
38
|
export declare function validateCommitMessageFile(path: string | undefined, options?: ValidateCommitMessageOptions, root?: string): void;
|
|
39
39
|
export declare function listReleaseProjectNamesForNx(root: string, options?: ListReleasePackagesOptions): string;
|
|
40
40
|
export declare function validatePublicPackageTags(root: string): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/monorepo/index.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AAC1D,OAAO,EAAE,uBAAuB,EAAE,MAAM,eAAe,CAAC;AAOxD,MAAM,WAAW,WAAW;IAC1B,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,yBAAyB,CAAC,EAAE,OAAO,CAAC;IACpC,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,4BAA4B;IAC3C,GAAG,CAAC,EAAE,OAAO,CAAC;CACf;AAED,MAAM,WAAW,0BAA0B;IACzC,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,uBAAuB;IACtC,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,qBAAqB;IACpC,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACjE,GAAG,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B;AAED,wBAAsB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAQpF;AAED,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,eAAoB,GAAG,OAAO,CAAC,IAAI,CAAC,CAkBjG;AAED,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAapE;AAED,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/monorepo/index.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AAC1D,OAAO,EAAE,uBAAuB,EAAE,MAAM,eAAe,CAAC;AAOxD,MAAM,WAAW,WAAW;IAC1B,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,yBAAyB,CAAC,EAAE,OAAO,CAAC;IACpC,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,4BAA4B;IAC3C,GAAG,CAAC,EAAE,OAAO,CAAC;CACf;AAED,MAAM,WAAW,0BAA0B;IACzC,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,uBAAuB;IACtC,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,qBAAqB;IACpC,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACjE,GAAG,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B;AAED,wBAAsB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAQpF;AAED,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,eAAoB,GAAG,OAAO,CAAC,IAAI,CAAC,CAkBjG;AAED,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAapE;AAED,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE;IAAE,IAAI,CAAC,EAAE,OAAO,CAAA;CAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAUrG;AAED,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAElE;AAED,wBAAgB,yBAAyB,CACvC,IAAI,EAAE,MAAM,GAAG,SAAS,EACxB,OAAO,GAAE,4BAAiC,EAC1C,IAAI,SAAgB,GACnB,IAAI,CAgBN;AAED,wBAAgB,4BAA4B,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,0BAA+B,GAAG,MAAM,CAW3G;AAED,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAI5D;AAED,wBAAsB,gBAAgB,CACpC,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,uBAAuB,EAChC,KAAK,GAAE,qBAAoD,GAC1D,OAAO,CAAC,IAAI,CAAC,CA8Bf;AAED,OAAO,EAAE,uBAAuB,EAAE,uBAAuB,EAAE,CAAC"}
|
package/dist/monorepo/index.js
CHANGED
|
@@ -15,7 +15,7 @@ export async function initMonorepo(root, options) {
|
|
|
15
15
|
await syncRootRuntimeVersions(root);
|
|
16
16
|
return;
|
|
17
17
|
}
|
|
18
|
-
printResults(applyManagedFiles(root, 'update'));
|
|
18
|
+
printResults(await applyManagedFiles(root, 'update'));
|
|
19
19
|
await runInitPacks({ root, syncRuntime: process.env.DEVENV_ROOT !== undefined || options.syncRuntime === true });
|
|
20
20
|
}
|
|
21
21
|
export async function validateMonorepo(root, options = {}) {
|
|
@@ -37,7 +37,7 @@ export async function validateMonorepo(root, options = {}) {
|
|
|
37
37
|
}
|
|
38
38
|
}
|
|
39
39
|
export async function updateManagedFiles(root) {
|
|
40
|
-
printResults(applyManagedFiles(root, 'update'));
|
|
40
|
+
printResults(await applyManagedFiles(root, 'update'));
|
|
41
41
|
// Tool dependency policy (typescript API 6, @typescript/native for ttsc, nx, …)
|
|
42
42
|
// lives next to managed templates — update must install them, not only rewrite files.
|
|
43
43
|
await applyToolConfigDefaults(root);
|
|
@@ -50,19 +50,19 @@ export async function updateManagedFiles(root) {
|
|
|
50
50
|
throw new Error(`bun install failed after monorepo update${stderr || stdout ? `:\n${stderr || stdout}` : ''}`);
|
|
51
51
|
}
|
|
52
52
|
}
|
|
53
|
-
export function checkManagedFiles(root, options = {}) {
|
|
53
|
+
export async function checkManagedFiles(root, options = {}) {
|
|
54
54
|
if (options.warn === true) {
|
|
55
|
-
warnOnManagedFileDrift(root);
|
|
55
|
+
await warnOnManagedFileDrift(root);
|
|
56
56
|
return;
|
|
57
57
|
}
|
|
58
|
-
const results = applyManagedFiles(root, 'check');
|
|
58
|
+
const results = await applyManagedFiles(root, 'check');
|
|
59
59
|
printResults(results);
|
|
60
60
|
if (results.some((result) => result.action === 'drifted')) {
|
|
61
61
|
throw new Error('Managed monorepo files are out of date. Run: smoo monorepo update');
|
|
62
62
|
}
|
|
63
63
|
}
|
|
64
|
-
export function diffManagedFiles(root) {
|
|
65
|
-
printResults(applyManagedFiles(root, 'diff'));
|
|
64
|
+
export async function diffManagedFiles(root) {
|
|
65
|
+
printResults(await applyManagedFiles(root, 'diff'));
|
|
66
66
|
}
|
|
67
67
|
export function validateCommitMessageFile(path, options = {}, root = process.cwd()) {
|
|
68
68
|
if (!path) {
|
|
@@ -47,10 +47,37 @@ export interface FileResult {
|
|
|
47
47
|
target: string;
|
|
48
48
|
action: 'created' | 'updated' | 'unchanged' | 'skipped' | 'skipped-symlink' | 'drifted' | 'ok-symlink';
|
|
49
49
|
}
|
|
50
|
-
|
|
50
|
+
interface DeployTargetInfo {
|
|
51
|
+
exists: boolean;
|
|
52
|
+
provider?: 'cloudflare';
|
|
53
|
+
}
|
|
54
|
+
export declare function applyManagedFiles(root: string, mode: 'update' | 'check' | 'diff'): Promise<FileResult[]>;
|
|
51
55
|
export declare function platformTargetGlobsForTest(targetNames: Iterable<string>): string[];
|
|
56
|
+
/** Resolved Nx project node as returned under `graph.nodes` / project-graph.json. */
|
|
57
|
+
export type NxGraphProjectNode = {
|
|
58
|
+
data?: {
|
|
59
|
+
targets?: Record<string, NxGraphTarget>;
|
|
60
|
+
};
|
|
61
|
+
targets?: Record<string, NxGraphTarget>;
|
|
62
|
+
};
|
|
63
|
+
type NxGraphTarget = {
|
|
64
|
+
command?: string;
|
|
65
|
+
options?: {
|
|
66
|
+
command?: string;
|
|
67
|
+
};
|
|
68
|
+
configurations?: Record<string, {
|
|
69
|
+
command?: string;
|
|
70
|
+
options?: {
|
|
71
|
+
command?: string;
|
|
72
|
+
};
|
|
73
|
+
}>;
|
|
74
|
+
};
|
|
75
|
+
/** Test seam: collect target names from a graph.nodes map. */
|
|
76
|
+
export declare function targetNamesFromProjects(nodes: Record<string, NxGraphProjectNode>): string[];
|
|
77
|
+
/** Test seam: deploy configuration presence/provider from graph nodes. */
|
|
78
|
+
export declare function deployTargetInfoFromProjects(nodes: Record<string, NxGraphProjectNode>, configuration: string): DeployTargetInfo;
|
|
52
79
|
export declare function printResults(results: FileResult[]): void;
|
|
53
|
-
export declare function validateManagedFiles(root: string): number
|
|
80
|
+
export declare function validateManagedFiles(root: string): Promise<number>;
|
|
54
81
|
/**
|
|
55
82
|
* Non-blocking drift report: prints the per-file table and surfaces drift as
|
|
56
83
|
* GitHub Actions warning annotations (plain stderr elsewhere) without failing
|
|
@@ -61,6 +88,6 @@ export declare function validateManagedFiles(root: string): number;
|
|
|
61
88
|
* Under GitHub Actions the drifted-file count is published as the step output
|
|
62
89
|
* `drifted`, so downstream steps gate declaratively instead of parsing logs.
|
|
63
90
|
*/
|
|
64
|
-
export declare function warnOnManagedFileDrift(root: string): void
|
|
91
|
+
export declare function warnOnManagedFileDrift(root: string): Promise<void>;
|
|
65
92
|
export {};
|
|
66
93
|
//# sourceMappingURL=managed-files.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"managed-files.d.ts","sourceRoot":"","sources":["../../src/monorepo/managed-files.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"managed-files.d.ts","sourceRoot":"","sources":["../../src/monorepo/managed-files.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import { execFileSync } from 'node:child_process';
|
|
2
1
|
import { appendFileSync, existsSync, lstatSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
|
|
3
2
|
import { dirname, join, resolve } from 'node:path';
|
|
4
3
|
import { fileURLToPath } from 'node:url';
|
|
5
4
|
import { PLATFORM_TARGET_GLOBS } from '@smoothbricks/nx-plugin/workspace-config-policy';
|
|
6
|
-
|
|
5
|
+
// Nx package exports are CLI-oriented; this is the module the CLI uses for graph + daemon IPC.
|
|
6
|
+
import { createProjectGraphAsync } from 'nx/src/project-graph/project-graph.js';
|
|
7
7
|
import { listReleasePackages, readPackageJson } from '../lib/workspace.js';
|
|
8
8
|
import { renderCiWorkflowYaml } from './ci-workflow.js';
|
|
9
9
|
import { renderPublishWorkflowYaml } from './publish-workflow.js';
|
|
@@ -199,8 +199,8 @@ const managedFiles = [
|
|
|
199
199
|
},
|
|
200
200
|
];
|
|
201
201
|
const packageRoot = resolve(dirname(fileURLToPath(import.meta.url)), '..', '..');
|
|
202
|
-
export function applyManagedFiles(root, mode) {
|
|
203
|
-
const context = getManagedFileContext(root);
|
|
202
|
+
export async function applyManagedFiles(root, mode) {
|
|
203
|
+
const context = await getManagedFileContext(root);
|
|
204
204
|
return managedFiles.map((file) => applyManagedFile(root, file, mode, context));
|
|
205
205
|
}
|
|
206
206
|
function applyManagedFile(root, file, mode, context) {
|
|
@@ -244,6 +244,7 @@ function getManagedContent(file, context) {
|
|
|
244
244
|
deploy: context.hasStagingDeployTargets,
|
|
245
245
|
deployProvider: context.stagingDeployProvider,
|
|
246
246
|
pushBranches: context.ciPushBranches,
|
|
247
|
+
runsOn: context.ciRunsOn,
|
|
247
248
|
});
|
|
248
249
|
}
|
|
249
250
|
if (file.source === 'publish-workflow') {
|
|
@@ -252,6 +253,7 @@ function getManagedContent(file, context) {
|
|
|
252
253
|
deployProvider: context.productionDeployProvider,
|
|
253
254
|
repoName: context.repoName,
|
|
254
255
|
platformTargetGlobs: context.platformTargetGlobs,
|
|
256
|
+
runsOn: context.ciRunsOn,
|
|
255
257
|
});
|
|
256
258
|
}
|
|
257
259
|
throw new Error(`Unknown generated managed file source ${file.source}`);
|
|
@@ -264,13 +266,16 @@ function getManagedContent(file, context) {
|
|
|
264
266
|
}
|
|
265
267
|
return renderTemplate(context, content);
|
|
266
268
|
}
|
|
267
|
-
function getManagedFileContext(root) {
|
|
269
|
+
async function getManagedFileContext(root) {
|
|
268
270
|
const packageJson = readPackageJson(join(root, 'package.json'));
|
|
269
271
|
const repoName = packageJson?.name ?? 'monorepo';
|
|
270
272
|
const ciPushBranches = getCiPushBranches(packageJson?.json);
|
|
271
|
-
const
|
|
272
|
-
|
|
273
|
-
const
|
|
273
|
+
const ciRunsOn = getCiRunsOn(packageJson?.json);
|
|
274
|
+
// In-process Nx API → daemon socket (no second Node/`nx` CLI process).
|
|
275
|
+
const nxProjects = await loadNxGraphProjects(root);
|
|
276
|
+
const stagingDeploy = deployTargetInfoFromProjects(nxProjects, 'staging');
|
|
277
|
+
const productionDeploy = deployTargetInfoFromProjects(nxProjects, 'production');
|
|
278
|
+
const platformTargetGlobs = platformTargetGlobsForTest(targetNamesFromProjects(nxProjects));
|
|
274
279
|
const nodeModulesCacheKey = existsSync(join(root, 'bun.lock'))
|
|
275
280
|
? `$${"{{ hashFiles('bun.lock', 'package.json', 'packages/*/package.json') }}"}`
|
|
276
281
|
: `$${"{{ hashFiles('bun.lockb', 'package.json', 'packages/*/package.json') }}"}`;
|
|
@@ -281,6 +286,7 @@ function getManagedFileContext(root) {
|
|
|
281
286
|
stagingDeployProvider: stagingDeploy.provider,
|
|
282
287
|
productionDeployProvider: productionDeploy.provider,
|
|
283
288
|
ciPushBranches,
|
|
289
|
+
ciRunsOn,
|
|
284
290
|
nodeModulesCacheKey,
|
|
285
291
|
repoName,
|
|
286
292
|
platformTargetGlobs,
|
|
@@ -293,77 +299,86 @@ export function platformTargetGlobsForTest(targetNames) {
|
|
|
293
299
|
return names.some((name) => name.endsWith(suffix));
|
|
294
300
|
});
|
|
295
301
|
}
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
302
|
+
/**
|
|
303
|
+
* Load resolved project nodes via Nx's programmatic API.
|
|
304
|
+
*
|
|
305
|
+
* `createProjectGraphAsync` is what the CLI uses: with the daemon up it speaks the
|
|
306
|
+
* daemon unix socket instead of rebuilding the graph in a fresh Node process.
|
|
307
|
+
* Spawning `nx graph` / `nx show` only added CLI boot + plugin-worker overhead on
|
|
308
|
+
* top of that. smoo runs under Bun; Bun can import this CJS module directly.
|
|
309
|
+
*/
|
|
310
|
+
async function loadNxGraphProjects(root) {
|
|
311
|
+
const prevCwd = process.cwd();
|
|
312
|
+
process.chdir(root);
|
|
313
|
+
try {
|
|
314
|
+
const graph = (await createProjectGraphAsync());
|
|
315
|
+
const out = {};
|
|
316
|
+
for (const [name, node] of Object.entries(graph.nodes)) {
|
|
317
|
+
out[name] = { data: { targets: node.data?.targets ?? {} } };
|
|
318
|
+
}
|
|
319
|
+
return out;
|
|
320
|
+
}
|
|
321
|
+
finally {
|
|
322
|
+
process.chdir(prevCwd);
|
|
305
323
|
}
|
|
324
|
+
}
|
|
325
|
+
function targetsOfProject(node) {
|
|
326
|
+
return node.data?.targets ?? node.targets ?? {};
|
|
327
|
+
}
|
|
328
|
+
/** Test seam: collect target names from a graph.nodes map. */
|
|
329
|
+
export function targetNamesFromProjects(nodes) {
|
|
306
330
|
const targetNames = new Set();
|
|
307
|
-
for (const
|
|
308
|
-
const
|
|
309
|
-
|
|
310
|
-
encoding: 'utf8',
|
|
311
|
-
stdio: ['ignore', 'pipe', 'inherit'],
|
|
312
|
-
});
|
|
313
|
-
const projectJson = parseNxProjectJsonText(projectOutput);
|
|
314
|
-
const targets = projectJson?.targets;
|
|
315
|
-
if (targets) {
|
|
316
|
-
for (const targetName of Object.keys(targets)) {
|
|
317
|
-
targetNames.add(targetName);
|
|
318
|
-
}
|
|
331
|
+
for (const node of Object.values(nodes)) {
|
|
332
|
+
for (const name of Object.keys(targetsOfProject(node))) {
|
|
333
|
+
targetNames.add(name);
|
|
319
334
|
}
|
|
320
335
|
}
|
|
321
336
|
return [...targetNames];
|
|
322
337
|
}
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
.replaceAll('{{REPO_NAME}}', context.repoName)
|
|
326
|
-
.replaceAll('__SMOO_CI_PUSH_BRANCHES__', renderYamlFlowList(context.ciPushBranches))
|
|
327
|
-
.replaceAll('{{NODE_MODULES_CACHE_KEY}}', context.nodeModulesCacheKey);
|
|
328
|
-
}
|
|
329
|
-
function getDeployTargetInfo(root, configuration) {
|
|
330
|
-
const output = execFileSync('nx', ['show', 'projects', '--withTarget', 'deploy', '--json'], {
|
|
331
|
-
cwd: root,
|
|
332
|
-
encoding: 'utf8',
|
|
333
|
-
stdio: ['ignore', 'pipe', 'inherit'],
|
|
334
|
-
});
|
|
335
|
-
const projects = parseStringArrayText(output);
|
|
336
|
-
if (!projects) {
|
|
337
|
-
return { exists: false };
|
|
338
|
-
}
|
|
338
|
+
/** Test seam: deploy configuration presence/provider from graph nodes. */
|
|
339
|
+
export function deployTargetInfoFromProjects(nodes, configuration) {
|
|
339
340
|
let exists = false;
|
|
340
341
|
let provider;
|
|
341
|
-
for (const
|
|
342
|
-
const
|
|
343
|
-
if (!
|
|
342
|
+
for (const node of Object.values(nodes)) {
|
|
343
|
+
const info = deployTargetInfoFromTargets(targetsOfProject(node), configuration);
|
|
344
|
+
if (!info.exists) {
|
|
344
345
|
continue;
|
|
345
346
|
}
|
|
346
347
|
exists = true;
|
|
347
|
-
provider ??=
|
|
348
|
+
provider ??= info.provider;
|
|
348
349
|
}
|
|
349
350
|
return { exists, provider };
|
|
350
351
|
}
|
|
351
|
-
function
|
|
352
|
-
const
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
const projectJson = parseNxProjectJsonText(output);
|
|
358
|
-
const deploy = projectJson?.targets?.deploy;
|
|
359
|
-
const config = deploy?.configurations?.[configuration];
|
|
352
|
+
function deployTargetInfoFromTargets(targets, configuration) {
|
|
353
|
+
const deploy = targets.deploy;
|
|
354
|
+
if (!deploy) {
|
|
355
|
+
return { exists: false };
|
|
356
|
+
}
|
|
357
|
+
const config = deploy.configurations?.[configuration];
|
|
360
358
|
if (!config) {
|
|
361
359
|
return { exists: false };
|
|
362
360
|
}
|
|
363
|
-
const commandValue = config.command ?? config.options?.command ?? deploy
|
|
361
|
+
const commandValue = config.command ?? config.options?.command ?? deploy.options?.command ?? deploy.command;
|
|
364
362
|
const command = typeof commandValue === 'string' ? commandValue : '';
|
|
365
363
|
return { exists: true, provider: command.includes('wrangler ') ? 'cloudflare' : undefined };
|
|
366
364
|
}
|
|
365
|
+
function renderTemplate(context, template) {
|
|
366
|
+
return template
|
|
367
|
+
.replaceAll('{{REPO_NAME}}', context.repoName)
|
|
368
|
+
.replaceAll('__SMOO_CI_PUSH_BRANCHES__', renderYamlFlowList(context.ciPushBranches))
|
|
369
|
+
.replaceAll('{{NODE_MODULES_CACHE_KEY}}', context.nodeModulesCacheKey);
|
|
370
|
+
}
|
|
371
|
+
function getCiRunsOn(packageJson) {
|
|
372
|
+
const configured = packageJson?.smoo?.github?.runsOn;
|
|
373
|
+
if (configured === undefined) {
|
|
374
|
+
return 'ubuntu-latest';
|
|
375
|
+
}
|
|
376
|
+
if (typeof configured === 'string') {
|
|
377
|
+
return configured.length > 0 ? configured : 'ubuntu-latest';
|
|
378
|
+
}
|
|
379
|
+
const labels = configured.filter((label) => label.length > 0);
|
|
380
|
+
return labels.length > 0 ? labels : 'ubuntu-latest';
|
|
381
|
+
}
|
|
367
382
|
function getCiPushBranches(packageJson) {
|
|
368
383
|
const configured = readCiPushBranches(packageJson);
|
|
369
384
|
return configured.length > 0 ? configured : ['main'];
|
|
@@ -384,8 +399,8 @@ export function printResults(results) {
|
|
|
384
399
|
console.log(`${result.action.padEnd(15)} ${result.target}`);
|
|
385
400
|
}
|
|
386
401
|
}
|
|
387
|
-
export function validateManagedFiles(root) {
|
|
388
|
-
const results = applyManagedFiles(root, 'check');
|
|
402
|
+
export async function validateManagedFiles(root) {
|
|
403
|
+
const results = await applyManagedFiles(root, 'check');
|
|
389
404
|
printResults(results);
|
|
390
405
|
const failures = results.filter((result) => result.action === 'drifted').length;
|
|
391
406
|
if (failures > 0) {
|
|
@@ -403,8 +418,8 @@ export function validateManagedFiles(root) {
|
|
|
403
418
|
* Under GitHub Actions the drifted-file count is published as the step output
|
|
404
419
|
* `drifted`, so downstream steps gate declaratively instead of parsing logs.
|
|
405
420
|
*/
|
|
406
|
-
export function warnOnManagedFileDrift(root) {
|
|
407
|
-
const results = applyManagedFiles(root, 'check');
|
|
421
|
+
export async function warnOnManagedFileDrift(root) {
|
|
422
|
+
const results = await applyManagedFiles(root, 'check');
|
|
408
423
|
printResults(results);
|
|
409
424
|
const drifted = results.filter((result) => result.action === 'drifted');
|
|
410
425
|
if (process.env.GITHUB_OUTPUT) {
|
|
@@ -40,7 +40,7 @@ const packs = [
|
|
|
40
40
|
// Managed-file drift is derived state (CLI template x pinned version) with
|
|
41
41
|
// its own remediation flow; it warns instead of failing so validation only
|
|
42
42
|
// blocks on actual package issues. See warnOnManagedFileDrift.
|
|
43
|
-
warnOnManagedFileDrift(ctx.root);
|
|
43
|
+
await warnOnManagedFileDrift(ctx.root);
|
|
44
44
|
return (runtimeFailures +
|
|
45
45
|
validateRootPackagePolicy(ctx.root) +
|
|
46
46
|
(await validateToolConfig(ctx.root)) +
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { type WorkflowRunsOn } from './github-runs-on.js';
|
|
1
2
|
export type PublishWorkflowBump = 'auto' | 'patch' | 'minor' | 'major' | 'prerelease';
|
|
2
3
|
export type PublishWorkflowCondition = 'version-mode-not-none' | 'deploy-production' | 'failure' | 'always';
|
|
3
4
|
export type PublishWorkflowNxTarget = 'build' | 'lint' | 'test';
|
|
@@ -35,6 +36,8 @@ export interface PublishWorkflowDefinitionOptions {
|
|
|
35
36
|
deployProvider?: 'cloudflare';
|
|
36
37
|
repoName?: string;
|
|
37
38
|
platformTargetGlobs?: readonly string[];
|
|
39
|
+
/** Linux jobs only. Default ubuntu-latest. Same smoo.github.runsOn as CI. */
|
|
40
|
+
runsOn?: WorkflowRunsOn;
|
|
38
41
|
}
|
|
39
42
|
export interface PublishWorkflowInputs {
|
|
40
43
|
bump: PublishWorkflowBump;
|