@smoothbricks/cli 0.11.13 → 0.11.15
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 +6 -1
- package/dist/monorepo/index.d.ts +2 -0
- package/dist/monorepo/index.d.ts.map +1 -1
- package/dist/monorepo/index.js +1 -1
- package/dist/monorepo/packed-package.d.ts +3 -3
- package/dist/monorepo/packed-package.d.ts.map +1 -1
- package/dist/monorepo/packed-package.js +11 -6
- package/dist/monorepo/packs/index.d.ts +8 -0
- package/dist/monorepo/packs/index.d.ts.map +1 -1
- package/dist/monorepo/packs/index.js +6 -5
- package/dist/monorepo/publish-workflow.js +5 -1
- package/dist/release/github-release.d.ts +16 -0
- package/dist/release/github-release.d.ts.map +1 -1
- package/dist/release/github-release.js +11 -2
- package/dist/release/index.d.ts.map +1 -1
- package/dist/release/index.js +3 -3
- package/managed/raw/tooling/direnv/devenv.smoo.nix +17 -13
- package/managed/raw/tooling/direnv/github-actions-bootstrap.sh +35 -0
- package/managed/raw/tooling/direnv/secret-references.ts +79 -125
- package/managed/raw/tooling/direnv/setup-environment.ts +81 -26
- package/managed/templates/github/actions/setup-devenv/action.yml +19 -6
- package/package.json +2 -2
- package/src/cli.ts +10 -1
- package/src/monorepo/__tests__/publish-workflow.test.ts +3 -0
- package/src/monorepo/index.ts +6 -1
- package/src/monorepo/packed-package.ts +21 -6
- package/src/monorepo/packs/index.ts +14 -5
- package/src/monorepo/publish-workflow.ts +8 -1
- package/src/monorepo/secret-references.test.ts +52 -131
- package/src/release/github-release.ts +31 -2
- package/src/release/index.ts +3 -2
package/dist/cli.js
CHANGED
|
@@ -84,9 +84,14 @@ function buildProgram() {
|
|
|
84
84
|
.option('--fail-fast', 'stop after the first failing validation pack')
|
|
85
85
|
.option('--only-if-new-workspace-package', 'skip validation unless a new workspace package manifest is staged')
|
|
86
86
|
.option('--verbose', 'print validation progress and successful checks')
|
|
87
|
+
.option('--projects <names>', 'comma-separated Nx project names to build and pack-validate (a release selection); default: every project')
|
|
87
88
|
.action(async (options) => {
|
|
88
89
|
const { validateMonorepo } = await import('./monorepo/index.js');
|
|
89
|
-
|
|
90
|
+
const projects = options.projects
|
|
91
|
+
?.split(',')
|
|
92
|
+
.map((name) => name.trim())
|
|
93
|
+
.filter((name) => name.length > 0);
|
|
94
|
+
await validateMonorepo(await findRepoRoot(), { ...options, projects });
|
|
90
95
|
});
|
|
91
96
|
monorepo.command('update').action(async () => {
|
|
92
97
|
const { updateManagedFiles } = await import('./monorepo/index.js');
|
package/dist/monorepo/index.d.ts
CHANGED
|
@@ -9,6 +9,8 @@ export interface ValidateOptions {
|
|
|
9
9
|
onlyIfNewWorkspacePackage?: boolean;
|
|
10
10
|
fix?: boolean;
|
|
11
11
|
verbose?: boolean;
|
|
12
|
+
/** Nx project names to build and pack-validate; see MonorepoContext.projects. */
|
|
13
|
+
projects?: readonly string[];
|
|
12
14
|
}
|
|
13
15
|
export interface ValidateCommitMessageOptions {
|
|
14
16
|
fix?: boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/monorepo/index.ts"],"names":[],"mappings":"AAWA,OAAO,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AAC1D,OAAO,EAAE,uBAAuB,EAAE,MAAM,eAAe,CAAC;AA2BxD,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;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/monorepo/index.ts"],"names":[],"mappings":"AAWA,OAAO,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AAC1D,OAAO,EAAE,uBAAuB,EAAE,MAAM,eAAe,CAAC;AA2BxD,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;IAClB,iFAAiF;IACjF,QAAQ,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CAC9B;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,CAqBjG;AAED,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAkBpE;AAED,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE;IAAE,IAAI,CAAC,EAAE,OAAO,CAAA;CAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAuBrG;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,CAoBN;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
|
@@ -24,7 +24,7 @@ export async function validateMonorepo(root, options = {}) {
|
|
|
24
24
|
if (options.onlyIfNewWorkspacePackage && !(await hasNewWorkspacePackage(root))) {
|
|
25
25
|
return;
|
|
26
26
|
}
|
|
27
|
-
const result = await runValidatePacks({ root, syncRuntime: false, verbose: options.verbose === true }, options);
|
|
27
|
+
const result = await runValidatePacks({ root, syncRuntime: false, verbose: options.verbose === true, projects: options.projects }, options);
|
|
28
28
|
if (result.failures > 0) {
|
|
29
29
|
const checkNoun = result.failedChecks === 1 ? 'check' : 'checks';
|
|
30
30
|
const problemNoun = result.failures === 1 ? 'problem' : 'problems';
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
export declare function validatePackedPublishablePackages(root: string): Promise<number>;
|
|
2
|
-
export declare function validatePackedPublishablePackagePublint(root: string): Promise<number>;
|
|
3
|
-
export declare function validatePackedPublishablePackageManifest(root: string): Promise<number>;
|
|
4
|
-
export declare function validatePackedPublishablePackageTypes(root: string): Promise<number>;
|
|
2
|
+
export declare function validatePackedPublishablePackagePublint(root: string, projects?: readonly string[]): Promise<number>;
|
|
3
|
+
export declare function validatePackedPublishablePackageManifest(root: string, projects?: readonly string[]): Promise<number>;
|
|
4
|
+
export declare function validatePackedPublishablePackageTypes(root: string, projects?: readonly string[]): Promise<number>;
|
|
5
5
|
//# sourceMappingURL=packed-package.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"packed-package.d.ts","sourceRoot":"","sources":["../../src/monorepo/packed-package.ts"],"names":[],"mappings":"AAeA,wBAAsB,iCAAiC,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAMrF;
|
|
1
|
+
{"version":3,"file":"packed-package.d.ts","sourceRoot":"","sources":["../../src/monorepo/packed-package.ts"],"names":[],"mappings":"AAeA,wBAAsB,iCAAiC,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAMrF;AAQD,wBAAsB,uCAAuC,CAC3D,IAAI,EAAE,MAAM,EACZ,QAAQ,CAAC,EAAE,SAAS,MAAM,EAAE,GAC3B,OAAO,CAAC,MAAM,CAAC,CAMjB;AAED,wBAAsB,wCAAwC,CAC5D,IAAI,EAAE,MAAM,EACZ,QAAQ,CAAC,EAAE,SAAS,MAAM,EAAE,GAC3B,OAAO,CAAC,MAAM,CAAC,CAMjB;AAED,wBAAsB,qCAAqC,CACzD,IAAI,EAAE,MAAM,EACZ,QAAQ,CAAC,EAAE,SAAS,MAAM,EAAE,GAC3B,OAAO,CAAC,MAAM,CAAC,CAMjB"}
|
|
@@ -15,23 +15,28 @@ export async function validatePackedPublishablePackages(root) {
|
|
|
15
15
|
(await validatePackedPublishablePackageManifest(root)) +
|
|
16
16
|
(await validatePackedPublishablePackageTypes(root)));
|
|
17
17
|
}
|
|
18
|
-
|
|
18
|
+
/** The publishable packages, narrowed to `projects` (Nx names) when given. */
|
|
19
|
+
function selectedPublishablePackages(root, projects) {
|
|
20
|
+
const all = listPublishablePackages(root);
|
|
21
|
+
return projects?.length ? all.filter((pkg) => projects.includes(pkg.projectName)) : all;
|
|
22
|
+
}
|
|
23
|
+
export async function validatePackedPublishablePackagePublint(root, projects) {
|
|
19
24
|
let failures = 0;
|
|
20
|
-
for (const pkg of
|
|
25
|
+
for (const pkg of selectedPublishablePackages(root, projects)) {
|
|
21
26
|
failures += await validatePackedPublishablePackageTool(root, pkg, validatePublint);
|
|
22
27
|
}
|
|
23
28
|
return failures;
|
|
24
29
|
}
|
|
25
|
-
export async function validatePackedPublishablePackageManifest(root) {
|
|
30
|
+
export async function validatePackedPublishablePackageManifest(root, projects) {
|
|
26
31
|
let failures = 0;
|
|
27
|
-
for (const pkg of
|
|
32
|
+
for (const pkg of selectedPublishablePackages(root, projects)) {
|
|
28
33
|
failures += await validatePackedPublishablePackageTool(root, pkg, validatePackedManifest);
|
|
29
34
|
}
|
|
30
35
|
return failures;
|
|
31
36
|
}
|
|
32
|
-
export async function validatePackedPublishablePackageTypes(root) {
|
|
37
|
+
export async function validatePackedPublishablePackageTypes(root, projects) {
|
|
33
38
|
let failures = 0;
|
|
34
|
-
for (const pkg of
|
|
39
|
+
for (const pkg of selectedPublishablePackages(root, projects)) {
|
|
35
40
|
failures += await validatePackedPublishablePackageTool(root, pkg, validateAttw);
|
|
36
41
|
}
|
|
37
42
|
return failures;
|
|
@@ -4,6 +4,14 @@ export interface MonorepoContext {
|
|
|
4
4
|
root: string;
|
|
5
5
|
syncRuntime: boolean;
|
|
6
6
|
verbose?: boolean;
|
|
7
|
+
/**
|
|
8
|
+
* Nx project names the validation is about, when a caller knows: the
|
|
9
|
+
* release's candidates. The build phase and the packed-package packs scope
|
|
10
|
+
* to them; manifest-level packs still see the whole repository, because a
|
|
11
|
+
* package's hygiene does not depend on which packages ship today. Absent,
|
|
12
|
+
* everything is validated and everything is built.
|
|
13
|
+
*/
|
|
14
|
+
projects?: readonly string[];
|
|
7
15
|
}
|
|
8
16
|
export interface ValidatePackOptions {
|
|
9
17
|
failFast?: boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/monorepo/packs/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,cAAc,EAAsB,MAAM,mBAAmB,CAAC;AAO5E,OAAO,EAKL,KAAK,sBAAsB,EAS5B,MAAM,sBAAsB,CAAC;AAU9B,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,OAAO,CAAC;IACrB,OAAO,CAAC,EAAE,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/monorepo/packs/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,cAAc,EAAsB,MAAM,mBAAmB,CAAC;AAO5E,OAAO,EAKL,KAAK,sBAAsB,EAS5B,MAAM,sBAAsB,CAAC;AAU9B,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,OAAO,CAAC;IACrB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;;;;;;OAMG;IACH,QAAQ,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CAC9B;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,CAAC,GAAG,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IAClD,WAAW,CAAC,CAAC,GAAG,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IACzD,YAAY,CAAC,CAAC,GAAG,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IAC1D,gBAAgB,CAAC,CAAC,GAAG,EAAE,eAAe,GAAG,OAAO,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC;IAClE,iBAAiB,CAAC,CAAC,GAAG,EAAE,eAAe,GAAG,OAAO,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC;CACpE;AAED,MAAM,WAAW,oBAAoB;IACnC,KAAK,CAAC,EAAE,SAAS,YAAY,EAAE,CAAC;IAChC,QAAQ,CAAC,EAAE,CAAC,GAAG,EAAE,eAAe,EAAE,OAAO,CAAC,EAAE,mBAAmB,KAAK,OAAO,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC;CAC9F;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;CACtB;AA8ID,0DAA0D;AAC1D,eAAO,MAAM,YAAY,gBAAQ,CAAC;AAElC,wBAAsB,YAAY,CAAC,GAAG,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAItE;AAED,wBAAsB,gBAAgB,CACpC,GAAG,EAAE,eAAe,EACpB,OAAO,GAAE,mBAAwB,EACjC,KAAK,GAAE,oBAAyB,GAC/B,OAAO,CAAC,kBAAkB,CAAC,CA0B7B;AAwMD,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,cAAc,EAAE,GAAG,GAAG,CAAC,MAAM,EAAE,sBAAsB,CAAC,CAexG"}
|
|
@@ -118,19 +118,19 @@ const packs = [
|
|
|
118
118
|
{
|
|
119
119
|
name: 'packed-package-publint',
|
|
120
120
|
validatePostBuild(ctx) {
|
|
121
|
-
return validatePackedPublishablePackagePublint(ctx.root);
|
|
121
|
+
return validatePackedPublishablePackagePublint(ctx.root, ctx.projects);
|
|
122
122
|
},
|
|
123
123
|
},
|
|
124
124
|
{
|
|
125
125
|
name: 'packed-package-manifest',
|
|
126
126
|
validatePostBuild(ctx) {
|
|
127
|
-
return validatePackedPublishablePackageManifest(ctx.root);
|
|
127
|
+
return validatePackedPublishablePackageManifest(ctx.root, ctx.projects);
|
|
128
128
|
},
|
|
129
129
|
},
|
|
130
130
|
{
|
|
131
131
|
name: 'packed-package-types',
|
|
132
132
|
validatePostBuild(ctx) {
|
|
133
|
-
return validatePackedPublishablePackageTypes(ctx.root);
|
|
133
|
+
return validatePackedPublishablePackageTypes(ctx.root, ctx.projects);
|
|
134
134
|
},
|
|
135
135
|
},
|
|
136
136
|
{
|
|
@@ -272,9 +272,10 @@ async function runBuild(ctx, options = {}) {
|
|
|
272
272
|
if (options.verbose) {
|
|
273
273
|
printCheckHeading('build', true);
|
|
274
274
|
}
|
|
275
|
+
const args = ['run-many', '-t', 'build', ...(ctx.projects?.length ? ['-p', ctx.projects.join(',')] : [])];
|
|
275
276
|
const result = options.verbose
|
|
276
|
-
? { exitCode: await runStatus('nx',
|
|
277
|
-
: await runResult('nx',
|
|
277
|
+
? { exitCode: await runStatus('nx', args, ctx.root, false), stdout: '', stderr: '' }
|
|
278
|
+
: await runResult('nx', args, ctx.root);
|
|
278
279
|
const status = result.exitCode;
|
|
279
280
|
if (status !== 0) {
|
|
280
281
|
if (!options.verbose) {
|
|
@@ -441,7 +441,11 @@ function yamlLinesForStep(step, options) {
|
|
|
441
441
|
'include-hidden-files: true',
|
|
442
442
|
], 'failure()');
|
|
443
443
|
case PublishWorkflowStepKind.ValidateMonorepoConfig:
|
|
444
|
-
|
|
444
|
+
// Scoped to the release's candidates: the build phase and the packed-package
|
|
445
|
+
// checks cover what ships. Unscoped, validate compiled every project - on a
|
|
446
|
+
// release touching no Rust that was 3m30 of the cowshed CLI on the critical
|
|
447
|
+
// path, for a binary the release did not contain.
|
|
448
|
+
return conditionalRunStep(step, `smoo monorepo validate --projects "${githubExpression('steps.version.outputs.projects')}"`);
|
|
445
449
|
case PublishWorkflowStepKind.TagRelease:
|
|
446
450
|
return tagReleaseStepLines(step.name);
|
|
447
451
|
case PublishWorkflowStepKind.PublishRelease:
|
|
@@ -45,6 +45,22 @@ export declare function nxProjectChangelogArgs(pkg: ReleasePackageInfo, previous
|
|
|
45
45
|
export declare function projectChangelogContents(result: ProjectChangelogLookupResult, projectName: string): string;
|
|
46
46
|
export declare function githubReleaseLookupExists(tag: string, exitCode: number, stdout: string, stderr: string): boolean;
|
|
47
47
|
export declare function githubReleaseCommandArgs(tag: string, notesFile: string, releaseExists: boolean, version: string): string[];
|
|
48
|
+
/**
|
|
49
|
+
* A module of the WORKSPACE's Nx, not of smoo's own dependency. smoo installs
|
|
50
|
+
* with its own `nx` in the global virtual store, where the workspace's
|
|
51
|
+
* node_modules is invisible: that Nx cannot resolve the workspace's
|
|
52
|
+
* `versionActions` plugin (`Unable to resolve the "versionActions"
|
|
53
|
+
* implementation ... "@smoothbricks/nx-plugin/version-actions"`), and it is
|
|
54
|
+
* a second Nx version driving one release. Every in-process Nx call for a
|
|
55
|
+
* workspace resolves from that workspace's root, exactly as `nx` on its PATH
|
|
56
|
+
* would.
|
|
57
|
+
*/
|
|
58
|
+
interface WorkspaceNxModules {
|
|
59
|
+
'src/utils/workspace-root.js': typeof import('nx/src/utils/workspace-root.js');
|
|
60
|
+
'src/command-line/release/version.js': typeof import('nx/src/command-line/release/version.js');
|
|
61
|
+
'src/command-line/release/changelog.js': typeof import('nx/src/command-line/release/changelog.js');
|
|
62
|
+
}
|
|
63
|
+
export declare function importWorkspaceNx<Subpath extends keyof WorkspaceNxModules>(root: string, subpath: Subpath): Promise<WorkspaceNxModules[Subpath]>;
|
|
48
64
|
export declare function withNxWorkspaceRoot<T>(root: string, run: () => Promise<T>): Promise<T>;
|
|
49
65
|
export {};
|
|
50
66
|
//# sourceMappingURL=github-release.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"github-release.d.ts","sourceRoot":"","sources":["../../src/release/github-release.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"github-release.d.ts","sourceRoot":"","sources":["../../src/release/github-release.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,KAAK,kBAAkB,EAAc,MAAM,WAAW,CAAC;AAYhE,UAAU,4BAA4B;IACpC,iBAAiB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAC1D;AAED,MAAM,WAAW,6BAA6B,CAAC,OAAO,SAAS,kBAAkB,GAAG,kBAAkB;IACpG,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,OAAO,CAAC;IACb,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,MAAM,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,uBAAuB;IACtC,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACnD,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5C,GAAG,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B;AAED,wBAAsB,gCAAgC,CAAC,KAAK,EAAE,6BAA6B,GAAG,OAAO,CAAC,MAAM,CAAC,CAS5G;AAED,wBAAsB,2BAA2B,CAC/C,GAAG,EAAE,kBAAkB,EACvB,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,uBAAuB,GAC7B,OAAO,CAAC,IAAI,CAAC,CAaf;AAED,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,kBAAkB,EAAE,WAAW,EAAE,MAAM,GAAG,IAAI,EAAE,MAAM,EAAE,OAAO;;;;;;;;;;;;;;;;;;;;;;;;EAc1G;AAED,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,4BAA4B,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,CAM1G;AAED,wBAAgB,yBAAyB,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAShH;AAED,wBAAgB,wBAAwB,CACtC,GAAG,EAAE,MAAM,EACX,SAAS,EAAE,MAAM,EACjB,aAAa,EAAE,OAAO,EACtB,OAAO,EAAE,MAAM,GACd,MAAM,EAAE,CAgBV;AAMD;;;;;;;;;GASG;AACH,UAAU,kBAAkB;IAC1B,6BAA6B,EAAE,cAAc,gCAAgC,CAAC,CAAC;IAC/E,qCAAqC,EAAE,cAAc,wCAAwC,CAAC,CAAC;IAC/F,uCAAuC,EAAE,cAAc,0CAA0C,CAAC,CAAC;CACpG;AAED,wBAAsB,iBAAiB,CAAC,OAAO,SAAS,MAAM,kBAAkB,EAC9E,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,OAAO,GACf,OAAO,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC,CAMtC;AAED,wBAAsB,mBAAmB,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAmB5F"}
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import { mkdtemp, rm, writeFile } from 'node:fs/promises';
|
|
2
|
+
import { createRequire } from 'node:module';
|
|
2
3
|
import { tmpdir } from 'node:os';
|
|
3
4
|
import { join } from 'node:path';
|
|
5
|
+
import { pathToFileURL } from 'node:url';
|
|
4
6
|
import { releaseTag } from './core.js';
|
|
5
7
|
const nxRenderOnlyReleaseConfig = {
|
|
6
8
|
changelog: {
|
|
@@ -13,7 +15,7 @@ const nxRenderOnlyReleaseConfig = {
|
|
|
13
15
|
};
|
|
14
16
|
export async function renderNxProjectChangelogContents(input) {
|
|
15
17
|
return withNxWorkspaceRoot(input.root, async () => {
|
|
16
|
-
const { createAPI } = await
|
|
18
|
+
const { createAPI } = await importWorkspaceNx(input.root, 'src/command-line/release/changelog.js');
|
|
17
19
|
const result = await createAPI(nxRenderOnlyReleaseConfig, false)(nxProjectChangelogArgs(input.pkg, input.previousTag, input.dryRun));
|
|
18
20
|
return projectChangelogContents(result, input.pkg.projectName);
|
|
19
21
|
});
|
|
@@ -84,8 +86,15 @@ export function githubReleaseCommandArgs(tag, notesFile, releaseExists, version)
|
|
|
84
86
|
function isPrereleaseVersion(version) {
|
|
85
87
|
return version.includes('-');
|
|
86
88
|
}
|
|
89
|
+
export async function importWorkspaceNx(root, subpath) {
|
|
90
|
+
const resolved = createRequire(join(root, 'package.json')).resolve(`nx/${subpath}`);
|
|
91
|
+
// A dynamic specifier types as `any`; the map above is the declared shape of
|
|
92
|
+
// the module the workspace's Nx serves at that subpath.
|
|
93
|
+
const module = await import(pathToFileURL(resolved).href);
|
|
94
|
+
return module;
|
|
95
|
+
}
|
|
87
96
|
export async function withNxWorkspaceRoot(root, run) {
|
|
88
|
-
const workspaceRootModule = await
|
|
97
|
+
const workspaceRootModule = await importWorkspaceNx(root, 'src/utils/workspace-root.js');
|
|
89
98
|
const previousWorkspaceRoot = workspaceRootModule.workspaceRoot;
|
|
90
99
|
const previousEnvWorkspaceRoot = process.env.NX_WORKSPACE_ROOT_PATH;
|
|
91
100
|
const previousCwd = process.cwd();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/release/index.ts"],"names":[],"mappings":"AA8BA,OAAO,EACL,oBAAoB,EACpB,KAAK,mBAAmB,EACxB,KAAK,kBAAkB,EACvB,KAAK,uBAAuB,EAC5B,WAAW,EACX,kBAAkB,GACnB,MAAM,WAAW,CAAC;AACnB,OAAO,EACL,oBAAoB,EACpB,mBAAmB,EACnB,gBAAgB,EAChB,KAAK,gBAAgB,EACrB,gBAAgB,IAAI,0BAA0B,EAC9C,yBAAyB,IAAI,mCAAmC,EAChE,KAAK,kBAAkB,EACvB,KAAK,6BAA6B,EAClC,KAAK,iCAAiC,EACtC,KAAK,kBAAkB,EACvB,qBAAqB,EACrB,2BAA2B,EAC3B,6BAA6B,EAC7B,KAAK,MAAM,IAAI,gBAAgB,EAC/B,yBAAyB,EACzB,yBAAyB,EACzB,wBAAwB,EACxB,wBAAwB,EACxB,wBAAwB,GACzB,MAAM,kBAAkB,CAAC;AAI1B,OAAO,EACL,KAAK,2BAA2B,EAIjC,MAAM,6BAA6B,CAAC;AAQrC,OAAO,EAQL,KAAK,kBAAkB,EAGxB,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/release/index.ts"],"names":[],"mappings":"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"}
|
package/dist/release/index.js
CHANGED
|
@@ -22,7 +22,7 @@ import { bootstrapNpmPackages, NPM_BOOTSTRAP_DIST_TAG, NPM_BOOTSTRAP_VERSION, }
|
|
|
22
22
|
import { resolveBuildInputPatterns } from './build-inputs.js';
|
|
23
23
|
import { parseReleaseProjectSelection, releaseCandidatePackages, } from './candidates.js';
|
|
24
24
|
import { classifyReleaseBranchPush, collectOwnedReleaseTagRecords, divergedReleaseBranchMessage, pendingReleaseTargets, releaseTag, releaseTagAliases, } from './core.js';
|
|
25
|
-
import { createOrUpdateGithubRelease, githubReleaseLookupExists, renderNxProjectChangelogContents, withNxWorkspaceRoot, } from './github-release.js';
|
|
25
|
+
import { createOrUpdateGithubRelease, githubReleaseLookupExists, importWorkspaceNx, renderNxProjectChangelogContents, withNxWorkspaceRoot, } from './github-release.js';
|
|
26
26
|
import { publishWithAuthDiagnostics } from './npm-auth.js';
|
|
27
27
|
import { bumpStableReleaseToNext, collectRepairPlatformOutputs, completeReleaseAtHead as completeReleaseAtHeadWithShell, prepareReleaseCandidate, repairPendingTargets, runReleaseTag, runReleaseVersion, } from './orchestration.js';
|
|
28
28
|
import { packReleaseTarball } from './pack.js';
|
|
@@ -520,8 +520,8 @@ async function runNxReleaseVersion(root, projects, bump, dryRun) {
|
|
|
520
520
|
}
|
|
521
521
|
async function runNxReleaseVersionPreview(root, projects, bump) {
|
|
522
522
|
return withNxWorkspaceRoot(root, async () => {
|
|
523
|
-
const { createAPI } = await
|
|
524
|
-
const { createAPI: createChangelogAPI } = await
|
|
523
|
+
const { createAPI } = await importWorkspaceNx(root, 'src/command-line/release/version.js');
|
|
524
|
+
const { createAPI: createChangelogAPI } = await importWorkspaceNx(root, 'src/command-line/release/changelog.js');
|
|
525
525
|
const projectNames = projects.split(',').filter(Boolean);
|
|
526
526
|
const result = await createAPI({}, false)({
|
|
527
527
|
specifier: bump === 'auto' ? undefined : bump,
|
|
@@ -274,16 +274,16 @@
|
|
|
274
274
|
# 5. The shared setup-environment.ts bootstraps repository dependencies; a
|
|
275
275
|
# failure aborts shell entry instead of yielding a half-working shell.
|
|
276
276
|
# Repo-owned enterShell bodies merge after this prologue.
|
|
277
|
-
# 6. The declared Nx remote cache (`smoo.remoteCache`)
|
|
278
|
-
#
|
|
279
|
-
#
|
|
280
|
-
#
|
|
281
|
-
#
|
|
282
|
-
#
|
|
283
|
-
#
|
|
284
|
-
#
|
|
285
|
-
#
|
|
286
|
-
#
|
|
277
|
+
# 6. The declared Nx remote cache (`smoo.remoteCache`) is NOT resolved
|
|
278
|
+
# here. Shell entry happens on every direnv reload and every
|
|
279
|
+
# `devenv shell -- <command>`, and a provider command that runs then is a
|
|
280
|
+
# credential prompt on every one of them (1Password authorises per
|
|
281
|
+
# requesting process lineage, and this one is new each time). Nx reads
|
|
282
|
+
# NX_SELF_HOSTED_REMOTE_CACHE_SERVER and _ACCESS_TOKEN from the
|
|
283
|
+
# environment when it runs: CI injects them into the job, a developer
|
|
284
|
+
# exports the token once in the terminal that wants the cache (for
|
|
285
|
+
# example `op signin`, then the declared command), and every nested
|
|
286
|
+
# shell inherits it. Absent, Nx runs with the local cache only.
|
|
287
287
|
# 7. GOROOT is unset rather than set. With devenv's Go pinned to the patch
|
|
288
288
|
# release ttsc vendors, a GOROOT crossing cannot misfire on version at all,
|
|
289
289
|
# so this is belt-and-braces rather than the fix — it keeps the isolation
|
|
@@ -322,7 +322,12 @@
|
|
|
322
322
|
# swaps the SDK a build was compiled against.
|
|
323
323
|
# Nx's fallback includes HOME or TMPDIR, either of which can exceed the
|
|
324
324
|
# Unix socket limit in a checkout. Reuse devenv's short runtime directory,
|
|
325
|
-
#
|
|
325
|
+
# which is keyed on this checkout's devenv root and so is one per
|
|
326
|
+
# workspace. Unconditionally: an inherited value is another workspace's
|
|
327
|
+
# shell (a shed entered from the host, a second repository from the first,
|
|
328
|
+
# a subprocess of either), and one socket dir for two workspaces makes the
|
|
329
|
+
# daemon refuse whichever came second ("received a message from a
|
|
330
|
+
# different workspace"). Nobody supplies this deliberately.
|
|
326
331
|
(lib.mkBefore ''
|
|
327
332
|
cd "$DEVENV_ROOT/../.."
|
|
328
333
|
export PATH="$("$PWD/tooling/direnv/repo-path")"
|
|
@@ -349,8 +354,7 @@
|
|
|
349
354
|
export GOFLAGS="''${GOFLAGS:--trimpath}"
|
|
350
355
|
unset GOROOT
|
|
351
356
|
bun "$DEVENV_ROOT/setup-environment.ts" || exit $?
|
|
352
|
-
|
|
353
|
-
export NX_SOCKET_DIR="''${NX_SOCKET_DIR:-$DEVENV_RUNTIME/nx}"
|
|
357
|
+
export NX_SOCKET_DIR="$DEVENV_RUNTIME/nx"
|
|
354
358
|
mkdir -p "$NX_SOCKET_DIR"
|
|
355
359
|
${lib.optionalString pkgs.stdenv.isDarwin ''
|
|
356
360
|
unset CC CXX
|
|
@@ -140,14 +140,49 @@ devenv_path_and_caches() {
|
|
|
140
140
|
}
|
|
141
141
|
|
|
142
142
|
build_devenv_shell() {
|
|
143
|
+
local since
|
|
144
|
+
since="$(date +%s)"
|
|
143
145
|
# One evaluation: the shell that captures the environment is the shell
|
|
144
146
|
# build. A separate `devenv shell -- date` evaluated everything twice.
|
|
145
147
|
persist_devenv_environment
|
|
148
|
+
if [ "${SMOO_HOST_RUNNER:-false}" != true ]; then
|
|
149
|
+
root_build_inputs "$since"
|
|
150
|
+
fi
|
|
146
151
|
# Add repo-local tools only after the shell exists; cleanup steps use an
|
|
147
152
|
# explicit PATH because failures before this point must still refresh caches.
|
|
148
153
|
add_repo_paths
|
|
149
154
|
}
|
|
150
155
|
|
|
156
|
+
# The store cache's post phase collects garbage down to the live roots before
|
|
157
|
+
# it saves, and the shell's own root (.devenv/gc/shell) covers only the build
|
|
158
|
+
# closure. What evaluation fetched and built - flake input sources, the
|
|
159
|
+
# import-from-derivation outputs devenv-nixpkgs-patched and cabal2nix-* - has
|
|
160
|
+
# no root, so it was collected on the miss run and every hit run rebuilt it
|
|
161
|
+
# (measured at ~80s of a 150s setup on hosted macOS, run 34427309827). devenv
|
|
162
|
+
# records no store paths in its eval cache, so the exact set is the paths this
|
|
163
|
+
# build registered: root them under .devenv/gc, which the devenv cache carries
|
|
164
|
+
# and /nix/var/nix/gcroots/auto (inside the store cache) points at.
|
|
165
|
+
root_build_inputs() {
|
|
166
|
+
local since="$1" gcdir="$PWD/.devenv/gc/build-inputs" paths
|
|
167
|
+
rm -rf "$gcdir"
|
|
168
|
+
mkdir -p "$gcdir"
|
|
169
|
+
# `nix path-info --all --json` is an object keyed by path on Nix >= 2.19 and
|
|
170
|
+
# an array of {path} objects before that.
|
|
171
|
+
paths="$(nix path-info --all --json 2>/dev/null | jq -r --argjson since "$since" '
|
|
172
|
+
(if type == "array" then map({key: .path, value: .}) | from_entries else . end)
|
|
173
|
+
| to_entries[] | select(.value.registrationTime >= $since) | select(.key | endswith(".drv") | not) | .key')"
|
|
174
|
+
if [ -z "$paths" ]; then
|
|
175
|
+
echo "no store paths registered since $since; nothing to root"
|
|
176
|
+
return 0
|
|
177
|
+
fi
|
|
178
|
+
# Store paths are installables; --out-link names the first link and numbers
|
|
179
|
+
# the rest, each an indirect gc root. Derivations are excluded: keep-derivations
|
|
180
|
+
# retains the ones whose outputs are rooted, and realising a .drv would build it.
|
|
181
|
+
# shellcheck disable=SC2086
|
|
182
|
+
nix build --out-link "$gcdir/path" $paths
|
|
183
|
+
echo "rooted $(printf '%s\n' "$paths" | wc -l | tr -d ' ') store paths registered during the shell build under $gcdir"
|
|
184
|
+
}
|
|
185
|
+
|
|
151
186
|
# Workflow steps run their commands directly — never through `devenv shell` —
|
|
152
187
|
# so nothing the shell hooks export survives this composite action on its own.
|
|
153
188
|
# Persisting a hand-picked list here proved to be whack-a-mole: the TTSC
|