@smoothbricks/cli 0.2.0 → 0.3.1
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/README.md +29 -24
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +19 -3
- package/dist/generate/index.d.ts +20 -0
- package/dist/generate/index.d.ts.map +1 -0
- package/dist/generate/index.js +47 -0
- package/dist/lib/run.d.ts +1 -0
- package/dist/lib/run.d.ts.map +1 -1
- package/dist/lib/run.js +19 -0
- package/dist/lib/workspace.d.ts +10 -0
- package/dist/lib/workspace.d.ts.map +1 -1
- package/dist/lib/workspace.js +55 -16
- package/dist/monorepo/lockfile.d.ts.map +1 -1
- package/dist/monorepo/lockfile.js +9 -0
- package/dist/monorepo/package-policy.d.ts +6 -17
- package/dist/monorepo/package-policy.d.ts.map +1 -1
- package/dist/monorepo/package-policy.js +63 -1127
- package/dist/monorepo/publish-workflow.js +2 -3
- package/dist/nx/index.d.ts +1 -0
- package/dist/nx/index.d.ts.map +1 -1
- package/dist/nx/index.js +23 -5
- package/dist/release/candidates.d.ts +1 -0
- package/dist/release/candidates.d.ts.map +1 -1
- package/dist/release/candidates.js +12 -0
- package/dist/release/core.d.ts +3 -1
- package/dist/release/core.d.ts.map +1 -1
- package/dist/release/core.js +76 -9
- package/dist/release/github-release.d.ts +1 -0
- package/dist/release/github-release.d.ts.map +1 -1
- package/dist/release/github-release.js +1 -1
- package/dist/release/index.d.ts +9 -3
- package/dist/release/index.d.ts.map +1 -1
- package/dist/release/index.js +287 -39
- package/dist/release/orchestration.d.ts +10 -2
- package/dist/release/orchestration.d.ts.map +1 -1
- package/dist/release/orchestration.js +33 -3
- package/managed/raw/tooling/git-hooks/commit-msg.sh +7 -1
- package/managed/raw/tooling/git-hooks/pre-commit.sh +7 -1
- package/managed/templates/github/workflows/ci.yml +3 -2
- package/package.json +7 -12
- package/src/cli.ts +21 -4
- package/src/generate/index.ts +92 -0
- package/src/lib/run.ts +25 -0
- package/src/lib/workspace.ts +72 -16
- package/src/monorepo/lockfile.ts +9 -0
- package/src/monorepo/package-policy.test.ts +254 -26
- package/src/monorepo/package-policy.ts +88 -1351
- package/src/monorepo/publish-workflow.ts +2 -3
- package/src/nx/index.test.ts +9 -0
- package/src/nx/index.ts +25 -5
- package/src/release/__tests__/candidates.test.ts +109 -8
- package/src/release/__tests__/core-properties.test.ts +2 -2
- package/src/release/__tests__/core-scenarios.test.ts +12 -15
- package/src/release/__tests__/core.test.ts +50 -3
- package/src/release/__tests__/fixture-repo.test.ts +68 -18
- package/src/release/__tests__/github-release.test.ts +9 -16
- package/src/release/__tests__/orchestration.test.ts +91 -5
- package/src/release/__tests__/retag-unpublished.test.ts +9 -9
- package/src/release/__tests__/trust-publisher.test.ts +65 -33
- package/src/release/candidates.ts +13 -0
- package/src/release/core.ts +95 -10
- package/src/release/github-release.ts +1 -1
- package/src/release/index.ts +366 -49
- package/src/release/orchestration.ts +50 -5
- package/dist/nx-version-actions.cjs +0 -25
- package/dist/nx-version-actions.d.cts +0 -6
- package/dist/nx-version-actions.d.cts.map +0 -1
- package/src/nx-version-actions.cts +0 -36
|
@@ -266,8 +266,7 @@ function yamlLinesForStep(step) {
|
|
|
266
266
|
case PublishWorkflowStepKind.BuildSelfHostedCli:
|
|
267
267
|
return [
|
|
268
268
|
` - name: ${step.name}`,
|
|
269
|
-
' # SmoothBricks self-hosts smoo from source
|
|
270
|
-
' # @smoothbricks/cli/nx-version-actions through the built package export.',
|
|
269
|
+
' # SmoothBricks self-hosts smoo from source for release commands.',
|
|
271
270
|
' run: nx build cli',
|
|
272
271
|
];
|
|
273
272
|
case PublishWorkflowStepKind.RepairPendingReleases:
|
|
@@ -295,7 +294,7 @@ function yamlLinesForStep(step) {
|
|
|
295
294
|
return [
|
|
296
295
|
` - name: ${step.name}`,
|
|
297
296
|
` if: ${githubExpression('failure()')}`,
|
|
298
|
-
' uses: actions/upload-artifact@
|
|
297
|
+
' uses: actions/upload-artifact@v7.0.1',
|
|
299
298
|
' with:',
|
|
300
299
|
` name: trace-results-${githubExpression('github.run_id')}`,
|
|
301
300
|
' path: packages/*/.trace-results.db',
|
package/dist/nx/index.d.ts
CHANGED
|
@@ -14,6 +14,7 @@ export declare function targetNamesFromNxProjectJson(value: unknown): string[];
|
|
|
14
14
|
export declare function buildDependsOnFromNxProjectJson(value: unknown): string[] | undefined;
|
|
15
15
|
export declare function formatProjectTargetLines(projects: ProjectTargets[]): string;
|
|
16
16
|
export declare function projectNamesWithTarget(projects: ProjectTargets[], target: string): string[];
|
|
17
|
+
export declare function projectNamesFromNxShowProjectsOutput(output: string): string[];
|
|
17
18
|
export declare function listTargets(root: string): Promise<void>;
|
|
18
19
|
export declare function listProjects(root: string, options: {
|
|
19
20
|
withTarget?: string;
|
package/dist/nx/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/nx/index.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;CAC3B;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,EAAE,CAAC;CAChB;AAED,wBAAgB,cAAc,IAAI,iBAAiB,CAElD;AAED,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,GAAG,iBAAiB,CAEvE;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAEzD;AAED,wBAAgB,4BAA4B,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,EAAE,CAGrE;AAED,wBAAgB,+BAA+B,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,EAAE,GAAG,SAAS,CAOpF;AAED,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,cAAc,EAAE,GAAG,MAAM,CAK3E;AAED,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,cAAc,EAAE,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAK3F;AAED,wBAAsB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAK7D;AAED,wBAAsB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE;IAAE,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAQhG;AAED,wBAAsB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAG5D;AAED,wBAAsB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAa5D;AAED,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC,CAGhF"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/nx/index.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;CAC3B;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,EAAE,CAAC;CAChB;AAED,wBAAgB,cAAc,IAAI,iBAAiB,CAElD;AAED,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,GAAG,iBAAiB,CAEvE;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAEzD;AAED,wBAAgB,4BAA4B,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,EAAE,CAGrE;AAED,wBAAgB,+BAA+B,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,EAAE,GAAG,SAAS,CAOpF;AAED,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,cAAc,EAAE,GAAG,MAAM,CAK3E;AAED,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,cAAc,EAAE,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAK3F;AAED,wBAAgB,oCAAoC,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAsB7E;AAED,wBAAsB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAK7D;AAED,wBAAsB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE;IAAE,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAQhG;AAED,wBAAsB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAG5D;AAED,wBAAsB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAa5D;AAED,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC,CAGhF"}
|
package/dist/nx/index.js
CHANGED
|
@@ -37,6 +37,28 @@ export function projectNamesWithTarget(projects, target) {
|
|
|
37
37
|
.map((project) => project.project)
|
|
38
38
|
.sort((a, b) => a.localeCompare(b));
|
|
39
39
|
}
|
|
40
|
+
export function projectNamesFromNxShowProjectsOutput(output) {
|
|
41
|
+
const trimmed = output.trim();
|
|
42
|
+
if (!trimmed) {
|
|
43
|
+
return [];
|
|
44
|
+
}
|
|
45
|
+
if (trimmed.startsWith('[')) {
|
|
46
|
+
try {
|
|
47
|
+
const parsed = JSON.parse(trimmed);
|
|
48
|
+
if (Array.isArray(parsed) && parsed.every((entry) => typeof entry === 'string')) {
|
|
49
|
+
return parsed.sort((a, b) => a.localeCompare(b));
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
catch {
|
|
53
|
+
// Fall through to legacy newline parsing for older Nx output shapes.
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
return trimmed
|
|
57
|
+
.split('\n')
|
|
58
|
+
.map((line) => line.trim())
|
|
59
|
+
.filter(Boolean)
|
|
60
|
+
.sort((a, b) => a.localeCompare(b));
|
|
61
|
+
}
|
|
40
62
|
export async function listTargets(root) {
|
|
41
63
|
const output = formatProjectTargetLines(await readProjectTargets(root));
|
|
42
64
|
if (output) {
|
|
@@ -76,11 +98,7 @@ export async function readProjectTargets(root) {
|
|
|
76
98
|
}
|
|
77
99
|
async function readNxProjectNames(root) {
|
|
78
100
|
const result = await $ `nx show projects`.cwd(root).quiet();
|
|
79
|
-
return decode(result.stdout)
|
|
80
|
-
.split('\n')
|
|
81
|
-
.map((line) => line.trim())
|
|
82
|
-
.filter(Boolean)
|
|
83
|
-
.sort((a, b) => a.localeCompare(b));
|
|
101
|
+
return projectNamesFromNxShowProjectsOutput(decode(result.stdout));
|
|
84
102
|
}
|
|
85
103
|
async function readProjectTarget(root, project) {
|
|
86
104
|
const command = nxShowProjectCommand(project);
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import type { ReleasePackageInfo } from './core.js';
|
|
2
2
|
export interface AutoReleaseCandidateShell {
|
|
3
3
|
gitRefExists(ref: string): Promise<boolean>;
|
|
4
|
+
latestStableReleaseRef(projectName: string): Promise<string | null>;
|
|
4
5
|
packageChangedFilesSince(ref: string, packagePath: string): Promise<string[]>;
|
|
5
6
|
packageJsonAtRef(ref: string, packagePath: string): Promise<Record<string, unknown> | null>;
|
|
6
7
|
currentPackageJson(packagePath: string): Promise<Record<string, unknown> | null>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"candidates.d.ts","sourceRoot":"","sources":["../../src/release/candidates.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AAGpD,MAAM,WAAW,yBAAyB;IACxC,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC5C,wBAAwB,CAAC,GAAG,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAC9E,gBAAgB,CAAC,GAAG,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC;IAC5F,kBAAkB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC;IACjF,yBAAyB,CAAC,WAAW,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IACvF,iBAAiB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CAC1D;AAgCD,wBAAsB,4BAA4B,CAAC,OAAO,SAAS,kBAAkB,EACnF,KAAK,EAAE,yBAAyB,EAChC,QAAQ,EAAE,OAAO,EAAE,GAClB,OAAO,CAAC,OAAO,EAAE,CAAC,CAQpB"}
|
|
1
|
+
{"version":3,"file":"candidates.d.ts","sourceRoot":"","sources":["../../src/release/candidates.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AAGpD,MAAM,WAAW,yBAAyB;IACxC,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC5C,sBAAsB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IACpE,wBAAwB,CAAC,GAAG,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAC9E,gBAAgB,CAAC,GAAG,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC;IAC5F,kBAAkB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC;IACjF,yBAAyB,CAAC,WAAW,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IACvF,iBAAiB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CAC1D;AAgCD,wBAAsB,4BAA4B,CAAC,OAAO,SAAS,kBAAkB,EACnF,KAAK,EAAE,yBAAyB,EAChC,QAAQ,EAAE,OAAO,EAAE,GAClB,OAAO,CAAC,OAAO,EAAE,CAAC,CAQpB"}
|
|
@@ -43,6 +43,18 @@ async function isAutoReleaseCandidate(shell, pkg) {
|
|
|
43
43
|
if (await shell.gitRefExists(tagRef)) {
|
|
44
44
|
return packageHasReleasableChangesSince(shell, tagRef, pkg);
|
|
45
45
|
}
|
|
46
|
+
if (pkg.version.includes('-')) {
|
|
47
|
+
// Prerelease version (e.g. 1.0.1-next.0) without its own tag: check for
|
|
48
|
+
// releasable changes since the last stable release. The prerelease bump is
|
|
49
|
+
// added after every release to make it obvious during development that the
|
|
50
|
+
// working version is unreleased — it should not suppress the next release.
|
|
51
|
+
const stableRef = await shell.latestStableReleaseRef(pkg.projectName);
|
|
52
|
+
if (stableRef) {
|
|
53
|
+
return packageHasReleasableChangesSince(shell, stableRef, pkg);
|
|
54
|
+
}
|
|
55
|
+
// No prior stable release — first release must be intentional, not auto.
|
|
56
|
+
return false;
|
|
57
|
+
}
|
|
46
58
|
return shell.packageHasHistory(pkg.path);
|
|
47
59
|
}
|
|
48
60
|
async function packageHasReleasableChangesSince(shell, ref, pkg) {
|
package/dist/release/core.d.ts
CHANGED
|
@@ -36,7 +36,9 @@ export interface ReleasePlanningShell {
|
|
|
36
36
|
packageVersionAtRef(packagePath: string, ref: string): Promise<string | null>;
|
|
37
37
|
durableTagState(pkg: ReleasePackageInfo, tag: string): Promise<DurableTagState>;
|
|
38
38
|
}
|
|
39
|
-
export declare function releaseTag(pkg: Pick<ReleasePackageInfo, '
|
|
39
|
+
export declare function releaseTag(pkg: Pick<ReleasePackageInfo, 'projectName' | 'version'>): string;
|
|
40
|
+
export declare function legacyReleaseTag(pkg: Pick<ReleasePackageInfo, 'name' | 'version'>): string;
|
|
41
|
+
export declare function releaseTagAliases(pkg: Pick<ReleasePackageInfo, 'name' | 'projectName' | 'version'>): string[];
|
|
40
42
|
export declare function npmDistTagForVersion(version: string): string;
|
|
41
43
|
export declare function releasePackageForTag<Package extends Omit<ReleasePackageInfo, 'version'>>(packages: Package[], tag: string): {
|
|
42
44
|
pkg: Package;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"core.d.ts","sourceRoot":"","sources":["../../src/release/core.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,iBAAiB,CAAC,OAAO,SAAS,kBAAkB,GAAG,kBAAkB;IACxF,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,EAAE,OAAO,CAAC;CACd;AAED,MAAM,WAAW,gBAAgB,CAAC,OAAO,SAAS,kBAAkB,GAAG,kBAAkB,CACvF,SAAQ,iBAAiB,CAAC,OAAO,CAAC;IAClC,eAAe,EAAE,OAAO,CAAC;IACzB,kBAAkB,EAAE,OAAO,CAAC;CAC7B;AAED,MAAM,WAAW,aAAa,CAAC,OAAO,SAAS,kBAAkB,GAAG,kBAAkB;IACpF,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,WAAW,EAAE,OAAO,EAAE,CAAC;IACvB,cAAc,EAAE,OAAO,EAAE,CAAC;CAC3B;AAED,MAAM,WAAW,eAAe;IAC9B,YAAY,EAAE,OAAO,CAAC;IACtB,mBAAmB,EAAE,OAAO,CAAC;CAC9B;AAED,MAAM,WAAW,oBAAoB;IACnC,4BAA4B,IAAI,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAAC;IAC7D,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACnE,mBAAmB,CAAC,WAAW,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAC9E,eAAe,CAAC,GAAG,EAAE,kBAAkB,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;CACjF;AAED,wBAAgB,UAAU,CAAC,GAAG,EAAE,IAAI,CAAC,kBAAkB,EAAE,MAAM,GAAG,SAAS,CAAC,GAAG,MAAM,
|
|
1
|
+
{"version":3,"file":"core.d.ts","sourceRoot":"","sources":["../../src/release/core.ts"],"names":[],"mappings":"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"}
|
package/dist/release/core.js
CHANGED
|
@@ -1,12 +1,18 @@
|
|
|
1
1
|
export function releaseTag(pkg) {
|
|
2
|
+
return `${pkg.projectName}@${pkg.version}`;
|
|
3
|
+
}
|
|
4
|
+
export function legacyReleaseTag(pkg) {
|
|
2
5
|
return `${pkg.name}@${pkg.version}`;
|
|
3
6
|
}
|
|
7
|
+
export function releaseTagAliases(pkg) {
|
|
8
|
+
return [...new Set([releaseTag(pkg), legacyReleaseTag(pkg)])];
|
|
9
|
+
}
|
|
4
10
|
export function npmDistTagForVersion(version) {
|
|
5
11
|
return version.includes('-') ? 'next' : 'latest';
|
|
6
12
|
}
|
|
7
13
|
export function releasePackageForTag(packages, tag) {
|
|
8
14
|
for (const pkg of packages) {
|
|
9
|
-
const prefix = `${pkg.
|
|
15
|
+
const prefix = `${pkg.projectName}@`;
|
|
10
16
|
if (tag.startsWith(prefix)) {
|
|
11
17
|
const version = tag.slice(prefix.length);
|
|
12
18
|
if (!version) {
|
|
@@ -25,13 +31,10 @@ export function classifyReleaseTag(tag, state) {
|
|
|
25
31
|
};
|
|
26
32
|
}
|
|
27
33
|
export async function collectOwnedReleaseTagRecords(packages, ref, shell) {
|
|
28
|
-
const
|
|
29
|
-
const
|
|
34
|
+
const candidates = [];
|
|
35
|
+
const durableStates = new BoundedPromiseRunner(8);
|
|
30
36
|
for (const tag of await shell.listReleaseTagsByCreatorDate()) {
|
|
31
37
|
const match = releasePackageForTag(packages, tag.name);
|
|
32
|
-
if (match && completedPackages.has(match.pkg.name)) {
|
|
33
|
-
continue;
|
|
34
|
-
}
|
|
35
38
|
if (!match || !(await shell.isAncestor(tag.sha, ref))) {
|
|
36
39
|
continue;
|
|
37
40
|
}
|
|
@@ -40,14 +43,78 @@ export async function collectOwnedReleaseTagRecords(packages, ref, shell) {
|
|
|
40
43
|
throw new Error(`Release tag ${tag.name} points at ${tag.sha.slice(0, 12)}, but ${match.pkg.path}/package.json has version ${versionAtTag ?? 'missing'}.`);
|
|
41
44
|
}
|
|
42
45
|
const pkg = { ...match.pkg, version: match.version };
|
|
43
|
-
|
|
44
|
-
|
|
46
|
+
candidates.push({ tag, pkg });
|
|
47
|
+
}
|
|
48
|
+
const records = [];
|
|
49
|
+
const completedPackages = new Set();
|
|
50
|
+
const activePackages = new Set();
|
|
51
|
+
const states = new Map();
|
|
52
|
+
// Run durable-state checks concurrently across packages, but do not query an
|
|
53
|
+
// older tag for the same package until its newer tag proves incomplete.
|
|
54
|
+
const scheduleFrom = (startIndex) => {
|
|
55
|
+
for (let index = startIndex; index < candidates.length; index += 1) {
|
|
56
|
+
if (states.size >= 8) {
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
const candidate = candidates[index];
|
|
60
|
+
if (!candidate || states.has(index) || completedPackages.has(candidate.pkg.name)) {
|
|
61
|
+
continue;
|
|
62
|
+
}
|
|
63
|
+
if (activePackages.has(candidate.pkg.name)) {
|
|
64
|
+
continue;
|
|
65
|
+
}
|
|
66
|
+
activePackages.add(candidate.pkg.name);
|
|
67
|
+
states.set(index, durableStates.run(() => shell.durableTagState(candidate.pkg, candidate.tag.name)));
|
|
68
|
+
}
|
|
69
|
+
};
|
|
70
|
+
for (const candidate of candidates) {
|
|
71
|
+
const index = candidates.indexOf(candidate);
|
|
72
|
+
scheduleFrom(index);
|
|
73
|
+
if (completedPackages.has(candidate.pkg.name)) {
|
|
74
|
+
continue;
|
|
75
|
+
}
|
|
76
|
+
const state = await states.get(index);
|
|
77
|
+
if (!state) {
|
|
78
|
+
throw new Error(`Release tag ${candidate.tag.name} lost durable state planning.`);
|
|
79
|
+
}
|
|
80
|
+
activePackages.delete(candidate.pkg.name);
|
|
81
|
+
states.delete(index);
|
|
82
|
+
records.push(classifyReleaseTag({ tag: candidate.tag.name, sha: candidate.tag.sha, timestamp: candidate.tag.timestamp, pkg: candidate.pkg }, state));
|
|
45
83
|
if (state.npmPublished && state.githubReleaseExists) {
|
|
46
|
-
completedPackages.add(pkg.name);
|
|
84
|
+
completedPackages.add(candidate.pkg.name);
|
|
47
85
|
}
|
|
48
86
|
}
|
|
49
87
|
return records;
|
|
50
88
|
}
|
|
89
|
+
class BoundedPromiseRunner {
|
|
90
|
+
limit;
|
|
91
|
+
active = 0;
|
|
92
|
+
waiting = [];
|
|
93
|
+
constructor(limit) {
|
|
94
|
+
this.limit = limit;
|
|
95
|
+
}
|
|
96
|
+
async run(operation) {
|
|
97
|
+
await this.acquire();
|
|
98
|
+
try {
|
|
99
|
+
return await operation();
|
|
100
|
+
}
|
|
101
|
+
finally {
|
|
102
|
+
this.release();
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
async acquire() {
|
|
106
|
+
if (this.active < this.limit) {
|
|
107
|
+
this.active += 1;
|
|
108
|
+
return;
|
|
109
|
+
}
|
|
110
|
+
await new Promise((resolve) => this.waiting.push(resolve));
|
|
111
|
+
this.active += 1;
|
|
112
|
+
}
|
|
113
|
+
release() {
|
|
114
|
+
this.active -= 1;
|
|
115
|
+
this.waiting.shift()?.();
|
|
116
|
+
}
|
|
117
|
+
}
|
|
51
118
|
export function groupReleaseTargets(records) {
|
|
52
119
|
const targets = new Map();
|
|
53
120
|
const packageNamesByTarget = new Map();
|
|
@@ -42,5 +42,6 @@ export declare function nxProjectChangelogArgs(pkg: ReleasePackageInfo, previous
|
|
|
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[];
|
|
45
|
+
export declare function withNxWorkspaceRoot<T>(root: string, run: () => Promise<T>): Promise<T>;
|
|
45
46
|
export {};
|
|
46
47
|
//# 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":"AAKA,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;;;;;;;;;;;;;;;;;;;;;;EAa1G;AAED,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,4BAA4B,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,CAM1G;AAED,wBAAgB,wBAAwB,CACtC,GAAG,EAAE,MAAM,EACX,SAAS,EAAE,MAAM,EACjB,aAAa,EAAE,OAAO,EACtB,OAAO,EAAE,MAAM,GACd,MAAM,EAAE,CAgBV"}
|
|
1
|
+
{"version":3,"file":"github-release.d.ts","sourceRoot":"","sources":["../../src/release/github-release.ts"],"names":[],"mappings":"AAKA,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;;;;;;;;;;;;;;;;;;;;;;EAa1G;AAED,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,4BAA4B,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,CAM1G;AAED,wBAAgB,wBAAwB,CACtC,GAAG,EAAE,MAAM,EACX,SAAS,EAAE,MAAM,EACjB,aAAa,EAAE,OAAO,EACtB,OAAO,EAAE,MAAM,GACd,MAAM,EAAE,CAgBV;AAMD,wBAAsB,mBAAmB,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAmB5F"}
|
|
@@ -73,7 +73,7 @@ export function githubReleaseCommandArgs(tag, notesFile, releaseExists, version)
|
|
|
73
73
|
function isPrereleaseVersion(version) {
|
|
74
74
|
return version.includes('-');
|
|
75
75
|
}
|
|
76
|
-
async function withNxWorkspaceRoot(root, run) {
|
|
76
|
+
export async function withNxWorkspaceRoot(root, run) {
|
|
77
77
|
const workspaceRootModule = await import('nx/src/utils/workspace-root.js');
|
|
78
78
|
const previousWorkspaceRoot = workspaceRootModule.workspaceRoot;
|
|
79
79
|
const previousEnvWorkspaceRoot = process.env.NX_WORKSPACE_ROOT_PATH;
|
package/dist/release/index.d.ts
CHANGED
|
@@ -15,9 +15,9 @@ export interface ReleaseRepairPendingOptions {
|
|
|
15
15
|
export interface ReleaseTrustPublisherOptions {
|
|
16
16
|
dryRun?: boolean;
|
|
17
17
|
bootstrap?: boolean;
|
|
18
|
-
otp?: string;
|
|
19
18
|
bootstrapOtp?: string;
|
|
20
19
|
skipLogin?: boolean;
|
|
20
|
+
packages?: string[];
|
|
21
21
|
}
|
|
22
22
|
export interface ReleaseBootstrapNpmPackagesOptions {
|
|
23
23
|
dryRun?: boolean;
|
|
@@ -44,15 +44,21 @@ export interface TrustPublisherShell<Package extends ReleasePackageInfo = Releas
|
|
|
44
44
|
listReleasePackages(): Package[];
|
|
45
45
|
packageExists(name: string): Promise<boolean>;
|
|
46
46
|
bootstrapNpmPackages(options: BootstrapNpmPackagesOptions): Promise<Package[]>;
|
|
47
|
-
login(): Promise<void>;
|
|
48
47
|
trustPublisher(pkg: Package, dryRun: boolean, env?: Record<string, string>): Promise<TrustPublisherResult>;
|
|
49
|
-
|
|
48
|
+
trustedPublishers(pkg: Package): Promise<TrustedPublisher[]>;
|
|
50
49
|
log(message: string): void;
|
|
51
50
|
error(message: string): void;
|
|
52
51
|
}
|
|
53
52
|
export type TrustPublisherResult = 'configured' | 'already-configured';
|
|
53
|
+
export interface TrustedPublisher {
|
|
54
|
+
id: string;
|
|
55
|
+
type: string;
|
|
56
|
+
file?: string;
|
|
57
|
+
repository?: string;
|
|
58
|
+
}
|
|
54
59
|
export declare function configureTrustedPublishers<Package extends ReleasePackageInfo>(shell: TrustPublisherShell<Package>, options: ReleaseTrustPublisherOptions): Promise<void>;
|
|
55
60
|
export declare function releaseBootstrapNpmPackages(root: string, options: ReleaseBootstrapNpmPackagesOptions): Promise<void>;
|
|
56
61
|
export declare function releaseRetagUnpublished(root: string, options: ReleaseRetagUnpublishedOptions): Promise<void>;
|
|
57
62
|
export declare function printReleaseState(root: string): Promise<void>;
|
|
63
|
+
export declare function parseTrustedPublishers(stdout: string, packageName: string): TrustedPublisher[];
|
|
58
64
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/release/index.ts"],"names":[],"mappings":"AAWA,OAAO,EACL,KAAK,2BAA2B,EAIjC,MAAM,6BAA6B,CAAC;AAErC,OAAO,EAML,KAAK,kBAAkB,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/release/index.ts"],"names":[],"mappings":"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"}
|