@smoothbricks/cli 0.1.1 → 0.3.0
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 +161 -32
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +110 -10
- package/dist/devenv/index.d.ts +10 -0
- package/dist/devenv/index.d.ts.map +1 -0
- package/dist/devenv/index.js +27 -0
- 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/cli-package.d.ts +4 -0
- package/dist/lib/cli-package.d.ts.map +1 -0
- package/dist/lib/cli-package.js +15 -0
- package/dist/lib/run.d.ts +6 -0
- package/dist/lib/run.d.ts.map +1 -1
- package/dist/lib/run.js +32 -0
- package/dist/lib/workspace.d.ts +25 -1
- package/dist/lib/workspace.d.ts.map +1 -1
- package/dist/lib/workspace.js +79 -17
- package/dist/monorepo/commit-msg.d.ts +8 -1
- package/dist/monorepo/commit-msg.d.ts.map +1 -1
- package/dist/monorepo/commit-msg.js +85 -7
- package/dist/monorepo/index.d.ts +19 -2
- package/dist/monorepo/index.d.ts.map +1 -1
- package/dist/monorepo/index.js +104 -16
- package/dist/monorepo/lockfile.d.ts.map +1 -1
- package/dist/monorepo/lockfile.js +9 -0
- package/dist/monorepo/managed-files.js +1 -1
- package/dist/monorepo/nx-sync.d.ts +2 -1
- package/dist/monorepo/nx-sync.d.ts.map +1 -1
- package/dist/monorepo/nx-sync.js +8 -2
- package/dist/monorepo/package-hygiene.d.ts +6 -2
- package/dist/monorepo/package-hygiene.d.ts.map +1 -1
- package/dist/monorepo/package-hygiene.js +12 -4
- package/dist/monorepo/package-policy.d.ts +13 -4
- package/dist/monorepo/package-policy.d.ts.map +1 -1
- package/dist/monorepo/package-policy.js +208 -113
- package/dist/monorepo/packed-package.d.ts +3 -0
- package/dist/monorepo/packed-package.d.ts.map +1 -1
- package/dist/monorepo/packed-package.js +68 -36
- package/dist/monorepo/packs/index.d.ts +20 -1
- package/dist/monorepo/packs/index.d.ts.map +1 -1
- package/dist/monorepo/packs/index.js +238 -19
- package/dist/monorepo/publish-workflow.d.ts +0 -4
- package/dist/monorepo/publish-workflow.d.ts.map +1 -1
- package/dist/monorepo/publish-workflow.js +7 -15
- package/dist/monorepo/tool-validation.d.ts +22 -0
- package/dist/monorepo/tool-validation.d.ts.map +1 -0
- package/dist/monorepo/tool-validation.js +399 -0
- package/dist/nx/index.d.ts +25 -0
- package/dist/nx/index.d.ts.map +1 -0
- package/dist/nx/index.js +112 -0
- package/dist/release/bootstrap-npm-packages.d.ts +19 -0
- package/dist/release/bootstrap-npm-packages.d.ts.map +1 -0
- package/dist/release/bootstrap-npm-packages.js +58 -0
- package/dist/release/candidates.d.ts +11 -0
- package/dist/release/candidates.d.ts.map +1 -0
- package/dist/release/candidates.js +181 -0
- package/dist/release/core.d.ts +4 -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 +3 -3
- package/dist/release/index.d.ts +32 -1
- package/dist/release/index.d.ts.map +1 -1
- package/dist/release/index.js +488 -64
- package/dist/release/npm-auth.d.ts +0 -1
- package/dist/release/npm-auth.d.ts.map +1 -1
- package/dist/release/npm-auth.js +4 -16
- package/dist/release/orchestration.d.ts +11 -2
- package/dist/release/orchestration.d.ts.map +1 -1
- package/dist/release/orchestration.js +41 -3
- package/dist/release/publish-plan.js +1 -1
- package/managed/raw/git-format-staged.yml +54 -0
- package/managed/raw/tooling/git-hooks/commit-msg.sh +1 -1
- package/managed/templates/github/actions/setup-devenv/action.yml +1 -7
- package/managed/templates/github/workflows/ci.yml +4 -2
- package/package.json +15 -8
- package/src/cli.ts +153 -22
- package/src/devenv/index.test.ts +49 -0
- package/src/devenv/index.ts +38 -0
- package/src/generate/index.ts +92 -0
- package/src/lib/cli-package.ts +18 -0
- package/src/lib/run.ts +44 -0
- package/src/lib/workspace.ts +112 -17
- package/src/monorepo/__tests__/publish-workflow.test.ts +16 -9
- package/src/monorepo/commit-msg.test.ts +45 -0
- package/src/monorepo/commit-msg.ts +107 -7
- package/src/monorepo/index.ts +142 -16
- package/src/monorepo/lockfile.ts +9 -0
- package/src/monorepo/managed-files.ts +1 -1
- package/src/monorepo/nx-sync.ts +9 -2
- package/src/monorepo/package-hygiene.test.ts +34 -0
- package/src/monorepo/package-hygiene.ts +26 -4
- package/src/monorepo/package-policy.test.ts +1130 -0
- package/src/monorepo/package-policy.ts +237 -114
- package/src/monorepo/packed-package.ts +89 -37
- package/src/monorepo/packs/index.test.ts +189 -0
- package/src/monorepo/packs/index.ts +311 -20
- package/src/monorepo/publish-workflow.ts +10 -19
- package/src/monorepo/setup-test-tracing.test.ts +120 -0
- package/src/monorepo/tool-validation.test.ts +261 -0
- package/src/monorepo/tool-validation.ts +462 -0
- package/src/nx/index.test.ts +73 -0
- package/src/nx/index.ts +139 -0
- package/src/release/__tests__/bootstrap-npm-packages.test.ts +127 -0
- package/src/release/__tests__/candidates.test.ts +262 -0
- package/src/release/__tests__/core-properties.test.ts +6 -6
- package/src/release/__tests__/core-scenarios.test.ts +27 -20
- package/src/release/__tests__/core.test.ts +52 -5
- package/src/release/__tests__/fixture-repo.test.ts +90 -31
- package/src/release/__tests__/github-release.test.ts +22 -24
- package/src/release/__tests__/helpers/fixture-repo.ts +1 -0
- package/src/release/__tests__/npm-auth.test.ts +12 -21
- package/src/release/__tests__/orchestration.test.ts +142 -12
- package/src/release/__tests__/publish-plan.test.ts +9 -3
- package/src/release/__tests__/retag-unpublished.test.ts +10 -10
- package/src/release/__tests__/trust-publisher.test.ts +165 -0
- package/src/release/bootstrap-npm-packages.ts +88 -0
- package/src/release/candidates.ts +225 -0
- package/src/release/core.ts +96 -10
- package/src/release/github-release.ts +3 -3
- package/src/release/index.ts +658 -74
- package/src/release/npm-auth.ts +4 -33
- package/src/release/orchestration.ts +60 -5
- package/src/release/publish-plan.ts +1 -1
- 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/managed/raw/.git-format-staged.yml +0 -47
- package/src/nx-version-actions.cts +0 -36
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { run } from '../lib/run.js';
|
|
2
|
+
const plugin = '@smoothbricks/nx-plugin';
|
|
3
|
+
export const variants = {
|
|
4
|
+
'ts-lib': {
|
|
5
|
+
generator: 'create-package',
|
|
6
|
+
description: 'Create a TypeScript library package',
|
|
7
|
+
args: (name) => ['--name', name, '--variant', 'ts-lib'],
|
|
8
|
+
options: [{ flag: '--public', description: 'configure for npm publication' }],
|
|
9
|
+
},
|
|
10
|
+
'ts-zig': {
|
|
11
|
+
generator: 'create-package',
|
|
12
|
+
description: 'Create a TypeScript + Zig/WASM hybrid package',
|
|
13
|
+
args: (name) => ['--name', name, '--variant', 'ts-zig'],
|
|
14
|
+
options: [{ flag: '--public', description: 'configure for npm publication' }],
|
|
15
|
+
},
|
|
16
|
+
'make-public': {
|
|
17
|
+
generator: 'make-public',
|
|
18
|
+
description: 'Promote a private package to npm publication',
|
|
19
|
+
args: (name) => ['--project', name],
|
|
20
|
+
},
|
|
21
|
+
};
|
|
22
|
+
// ---------------------------------------------------------------------------
|
|
23
|
+
// Dispatch
|
|
24
|
+
// ---------------------------------------------------------------------------
|
|
25
|
+
export async function generate(root, variantName, name, options) {
|
|
26
|
+
const variant = variants[variantName];
|
|
27
|
+
if (!variant) {
|
|
28
|
+
const known = Object.keys(variants).join(', ');
|
|
29
|
+
throw new Error(`Unknown generator variant "${variantName}". Available: ${known}`);
|
|
30
|
+
}
|
|
31
|
+
const args = ['g', `${plugin}:${variant.generator}`, ...variant.args(name)];
|
|
32
|
+
for (const opt of variant.options ?? []) {
|
|
33
|
+
const key = opt.flag.replace(/^--/, '');
|
|
34
|
+
if (options[key]) {
|
|
35
|
+
args.push(opt.flag);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
if (options.dryRun) {
|
|
39
|
+
args.push('--dry-run');
|
|
40
|
+
}
|
|
41
|
+
await run('nx', args, root);
|
|
42
|
+
// Sync TypeScript project references so the new package is immediately
|
|
43
|
+
// visible in the build graph without a manual `nx sync` step.
|
|
44
|
+
if (!options.dryRun) {
|
|
45
|
+
await run('nx', ['sync'], root);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli-package.d.ts","sourceRoot":"","sources":["../../src/lib/cli-package.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,+BAA+B,2BAA2B,CAAC;AACxE,eAAO,MAAM,iBAAiB,QAA0B,CAAC;AAWzD,wBAAgB,iCAAiC,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAEnF"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { fileURLToPath } from 'node:url';
|
|
2
|
+
import { readJsonObject, stringProperty } from './json.js';
|
|
3
|
+
export const smoothBricksCodebasePackageName = '@smoothbricks/codebase';
|
|
4
|
+
export const cliPackageVersion = readCliPackageVersion();
|
|
5
|
+
function readCliPackageVersion() {
|
|
6
|
+
const pkg = readJsonObject(fileURLToPath(new URL('../../package.json', import.meta.url)));
|
|
7
|
+
const version = pkg ? stringProperty(pkg, 'version') : null;
|
|
8
|
+
if (!version) {
|
|
9
|
+
throw new Error('Unable to read @smoothbricks/cli package version.');
|
|
10
|
+
}
|
|
11
|
+
return version;
|
|
12
|
+
}
|
|
13
|
+
export function isSmoothBricksCodebasePackageName(name) {
|
|
14
|
+
return name === smoothBricksCodebasePackageName;
|
|
15
|
+
}
|
package/dist/lib/run.d.ts
CHANGED
|
@@ -1,5 +1,11 @@
|
|
|
1
1
|
export declare function run(command: string, args: string[], cwd: string, env?: Record<string, string>): Promise<void>;
|
|
2
2
|
export declare function runStatus(command: string, args: string[], cwd: string, quiet?: boolean, env?: Record<string, string>): Promise<number>;
|
|
3
|
+
export declare function runInteractiveStatus(command: string, args: string[], cwd: string, env?: Record<string, string>): Promise<number>;
|
|
4
|
+
export declare function runResult(command: string, args: string[], cwd: string, env?: Record<string, string>): Promise<{
|
|
5
|
+
exitCode: number;
|
|
6
|
+
stdout: string;
|
|
7
|
+
stderr: string;
|
|
8
|
+
}>;
|
|
3
9
|
export declare function findRepoRoot(): Promise<string>;
|
|
4
10
|
export declare function decode(bytes: Uint8Array): string;
|
|
5
11
|
//# sourceMappingURL=run.d.ts.map
|
package/dist/lib/run.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../src/lib/run.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../src/lib/run.ts"],"names":[],"mappings":"AAMA,wBAAsB,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAKnH;AAED,wBAAsB,SAAS,CAC7B,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,EAAE,EACd,GAAG,EAAE,MAAM,EACX,KAAK,UAAQ,EACb,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC3B,OAAO,CAAC,MAAM,CAAC,CAQjB;AAED,wBAAsB,oBAAoB,CACxC,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,EAAE,EACd,GAAG,EAAE,MAAM,EACX,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC3B,OAAO,CAAC,MAAM,CAAC,CAiBjB;AAED,wBAAsB,SAAS,CAC7B,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,EAAE,EACd,GAAG,EAAE,MAAM,EACX,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC3B,OAAO,CAAC;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CAY/D;AAuCD,wBAAsB,YAAY,IAAI,OAAO,CAAC,MAAM,CAAC,CAMpD;AAED,wBAAgB,MAAM,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,CAEhD"}
|
package/dist/lib/run.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { spawn } from 'node:child_process';
|
|
1
2
|
import { existsSync } from 'node:fs';
|
|
2
3
|
import { dirname, join } from 'node:path';
|
|
3
4
|
import { fileURLToPath } from 'node:url';
|
|
@@ -17,6 +18,37 @@ export async function runStatus(command, args, cwd, quiet = false, env) {
|
|
|
17
18
|
const result = quiet ? await shell.quiet() : await shell;
|
|
18
19
|
return result.exitCode;
|
|
19
20
|
}
|
|
21
|
+
export async function runInteractiveStatus(command, args, cwd, env) {
|
|
22
|
+
const invocation = resolveCommandInvocation(cwd, command, args);
|
|
23
|
+
return new Promise((resolve, reject) => {
|
|
24
|
+
const child = spawn(invocation.command, invocation.args, {
|
|
25
|
+
cwd,
|
|
26
|
+
env: env ? mergeEnv(env) : process.env,
|
|
27
|
+
stdio: 'inherit',
|
|
28
|
+
});
|
|
29
|
+
child.on('error', reject);
|
|
30
|
+
child.on('close', (code, signal) => {
|
|
31
|
+
if (signal) {
|
|
32
|
+
reject(new Error(`${command} ${args.join(' ')} terminated by signal ${signal}`));
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
resolve(code ?? 1);
|
|
36
|
+
});
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
export async function runResult(command, args, cwd, env) {
|
|
40
|
+
const invocation = resolveCommandInvocation(cwd, command, args);
|
|
41
|
+
let shell = $ `${invocation.command} ${invocation.args}`.cwd(cwd).nothrow().quiet();
|
|
42
|
+
if (env) {
|
|
43
|
+
shell = shell.env(mergeEnv(env));
|
|
44
|
+
}
|
|
45
|
+
const result = await shell;
|
|
46
|
+
return {
|
|
47
|
+
exitCode: result.exitCode,
|
|
48
|
+
stdout: decode(result.stdout),
|
|
49
|
+
stderr: decode(result.stderr),
|
|
50
|
+
};
|
|
51
|
+
}
|
|
20
52
|
function mergeEnv(env) {
|
|
21
53
|
const merged = {};
|
|
22
54
|
for (const [key, value] of Object.entries(process.env)) {
|
package/dist/lib/workspace.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
export interface PackageInfo {
|
|
2
2
|
name: string;
|
|
3
|
+
projectName: string;
|
|
3
4
|
version: string;
|
|
4
5
|
private: boolean;
|
|
5
6
|
tags: string[];
|
|
@@ -7,20 +8,43 @@ export interface PackageInfo {
|
|
|
7
8
|
packageJsonPath: string;
|
|
8
9
|
json: Record<string, unknown>;
|
|
9
10
|
}
|
|
11
|
+
export interface WorkspacePackageManifest {
|
|
12
|
+
name: string;
|
|
13
|
+
projectName: string;
|
|
14
|
+
private: boolean;
|
|
15
|
+
path: string;
|
|
16
|
+
packageJsonPath: string;
|
|
17
|
+
json: Record<string, unknown>;
|
|
18
|
+
}
|
|
19
|
+
export interface PackageJson extends Record<string, unknown> {
|
|
20
|
+
name?: string;
|
|
21
|
+
version?: string;
|
|
22
|
+
private?: boolean;
|
|
23
|
+
workspaces?: unknown;
|
|
24
|
+
devDependencies?: unknown;
|
|
25
|
+
dependencies?: unknown;
|
|
26
|
+
nx?: unknown;
|
|
27
|
+
repository?: unknown;
|
|
28
|
+
}
|
|
10
29
|
export interface RepositoryInfo {
|
|
11
30
|
type: string;
|
|
12
31
|
url: string;
|
|
13
32
|
}
|
|
14
|
-
export declare const workspaceDependencyFields: readonly ["dependencies", "devDependencies", "optionalDependencies"];
|
|
33
|
+
export declare const workspaceDependencyFields: readonly ["dependencies", "devDependencies", "peerDependencies", "optionalDependencies"];
|
|
15
34
|
export declare function listPublicPackages(root: string): PackageInfo[];
|
|
16
35
|
export declare function listReleasePackages(root: string, rootPackage?: PackageInfo | null): PackageInfo[];
|
|
17
36
|
export declare function rootRepositoryInfo(root: string): RepositoryInfo | null;
|
|
37
|
+
export declare function rootPackageName(root: string): string | null;
|
|
38
|
+
export declare function isSmoothBricksCodebase(root: string): boolean;
|
|
18
39
|
export declare function packageRepositoryInfo(pkg: PackageInfo): RepositoryInfo | null;
|
|
19
40
|
export declare function isOwnedPackage(rootRepository: RepositoryInfo, pkg: PackageInfo): boolean;
|
|
20
41
|
export declare function getWorkspacePackages(root: string): PackageInfo[];
|
|
42
|
+
export declare function getWorkspacePackageManifests(root: string): WorkspacePackageManifest[];
|
|
21
43
|
export declare function listPackageJsonRecords(root: string): PackageInfo[];
|
|
22
44
|
export declare function getWorkspacePatterns(root: string): string[];
|
|
23
45
|
export declare function readPackageJson(path: string): PackageInfo | null;
|
|
46
|
+
export declare function readWorkspacePackageManifest(path: string): WorkspacePackageManifest | null;
|
|
47
|
+
export declare function readPackageJsonObject(path: string): PackageJson | null;
|
|
24
48
|
export declare function getNxTags(pkg: Record<string, unknown>): string[];
|
|
25
49
|
export declare function repositoryInfo(pkg: Record<string, unknown>): RepositoryInfo | null;
|
|
26
50
|
export declare function sameRepositoryAfterNormalization(left: string, right: string): boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workspace.d.ts","sourceRoot":"","sources":["../../src/lib/workspace.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"workspace.d.ts","sourceRoot":"","sources":["../../src/lib/workspace.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/workspace.js
CHANGED
|
@@ -1,7 +1,13 @@
|
|
|
1
1
|
import { readdirSync, statSync } from 'node:fs';
|
|
2
2
|
import { dirname, join, relative } from 'node:path';
|
|
3
|
+
import { isSmoothBricksCodebasePackageName } from './cli-package.js';
|
|
3
4
|
import { hasOwn, hasOwnString, isRecord, readJson, readJsonObject, stringProperty } from './json.js';
|
|
4
|
-
export const workspaceDependencyFields = [
|
|
5
|
+
export const workspaceDependencyFields = [
|
|
6
|
+
'dependencies',
|
|
7
|
+
'devDependencies',
|
|
8
|
+
'peerDependencies',
|
|
9
|
+
'optionalDependencies',
|
|
10
|
+
];
|
|
5
11
|
export function listPublicPackages(root) {
|
|
6
12
|
return getWorkspacePackages(root).filter((pkg) => !pkg.private && pkg.tags.includes('npm:public'));
|
|
7
13
|
}
|
|
@@ -19,6 +25,13 @@ export function rootRepositoryInfo(root) {
|
|
|
19
25
|
const rootPackage = readJsonObject(join(root, 'package.json'));
|
|
20
26
|
return rootPackage ? repositoryInfo(rootPackage) : null;
|
|
21
27
|
}
|
|
28
|
+
export function rootPackageName(root) {
|
|
29
|
+
const rootPackage = readPackageJsonObject(join(root, 'package.json'));
|
|
30
|
+
return rootPackage ? stringProperty(rootPackage, 'name') : null;
|
|
31
|
+
}
|
|
32
|
+
export function isSmoothBricksCodebase(root) {
|
|
33
|
+
return isSmoothBricksCodebasePackageName(rootPackageName(root) ?? undefined);
|
|
34
|
+
}
|
|
22
35
|
export function packageRepositoryInfo(pkg) {
|
|
23
36
|
return repositoryInfo(pkg.json);
|
|
24
37
|
}
|
|
@@ -33,10 +46,48 @@ export function getWorkspacePackages(root) {
|
|
|
33
46
|
}
|
|
34
47
|
return getWorkspacePackagesForPatterns(root, getWorkspacePatternsFromPackageJson(rootPackage.json));
|
|
35
48
|
}
|
|
49
|
+
export function getWorkspacePackageManifests(root) {
|
|
50
|
+
const rootPackage = readPackageJsonObject(join(root, 'package.json'));
|
|
51
|
+
if (!rootPackage) {
|
|
52
|
+
throw new Error('package.json not found or invalid');
|
|
53
|
+
}
|
|
54
|
+
return getWorkspacePackageManifestsForPatterns(root, getWorkspacePatternsFromPackageJson(rootPackage));
|
|
55
|
+
}
|
|
36
56
|
function getWorkspacePackagesForPatterns(root, workspacePatterns) {
|
|
37
57
|
const packages = [];
|
|
58
|
+
for (const pkgPath of listWorkspacePackageJsonPaths(root, workspacePatterns)) {
|
|
59
|
+
const pkg = readPackageJson(pkgPath);
|
|
60
|
+
if (!pkg?.name || !pkg.version) {
|
|
61
|
+
continue;
|
|
62
|
+
}
|
|
63
|
+
packages.push({
|
|
64
|
+
name: pkg.name,
|
|
65
|
+
projectName: pkg.projectName,
|
|
66
|
+
version: pkg.version,
|
|
67
|
+
private: pkg.private,
|
|
68
|
+
tags: pkg.tags,
|
|
69
|
+
path: relative(root, dirname(pkgPath)),
|
|
70
|
+
packageJsonPath: pkg.packageJsonPath,
|
|
71
|
+
json: pkg.json,
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
return packages.sort((a, b) => a.name.localeCompare(b.name));
|
|
75
|
+
}
|
|
76
|
+
function getWorkspacePackageManifestsForPatterns(root, workspacePatterns) {
|
|
77
|
+
const manifests = [];
|
|
78
|
+
for (const pkgPath of listWorkspacePackageJsonPaths(root, workspacePatterns)) {
|
|
79
|
+
const pkg = readWorkspacePackageManifest(pkgPath);
|
|
80
|
+
if (pkg) {
|
|
81
|
+
manifests.push(pkg);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
return manifests.sort((a, b) => a.name.localeCompare(b.name));
|
|
85
|
+
}
|
|
86
|
+
function listWorkspacePackageJsonPaths(root, workspacePatterns) {
|
|
87
|
+
const paths = [];
|
|
38
88
|
for (const pattern of workspacePatterns) {
|
|
39
89
|
if (!pattern.endsWith('/*')) {
|
|
90
|
+
paths.push(join(root, pattern, 'package.json'));
|
|
40
91
|
continue;
|
|
41
92
|
}
|
|
42
93
|
const parent = join(root, pattern.slice(0, -2));
|
|
@@ -44,23 +95,10 @@ function getWorkspacePackagesForPatterns(root, workspacePatterns) {
|
|
|
44
95
|
continue;
|
|
45
96
|
}
|
|
46
97
|
for (const entry of readdirSync(parent)) {
|
|
47
|
-
|
|
48
|
-
const pkg = readPackageJson(pkgPath);
|
|
49
|
-
if (!pkg?.name || !pkg.version) {
|
|
50
|
-
continue;
|
|
51
|
-
}
|
|
52
|
-
packages.push({
|
|
53
|
-
name: pkg.name,
|
|
54
|
-
version: pkg.version,
|
|
55
|
-
private: pkg.private,
|
|
56
|
-
tags: pkg.tags,
|
|
57
|
-
path: relative(root, dirname(pkgPath)),
|
|
58
|
-
packageJsonPath: pkg.packageJsonPath,
|
|
59
|
-
json: pkg.json,
|
|
60
|
-
});
|
|
98
|
+
paths.push(join(parent, entry, 'package.json'));
|
|
61
99
|
}
|
|
62
100
|
}
|
|
63
|
-
return
|
|
101
|
+
return paths;
|
|
64
102
|
}
|
|
65
103
|
export function listPackageJsonRecords(root) {
|
|
66
104
|
const rootPackage = readPackageJson(join(root, 'package.json'));
|
|
@@ -90,7 +128,7 @@ function getWorkspacePatternsFromPackageJson(pkg) {
|
|
|
90
128
|
return ['packages/*'];
|
|
91
129
|
}
|
|
92
130
|
export function readPackageJson(path) {
|
|
93
|
-
const parsed =
|
|
131
|
+
const parsed = readPackageJsonObject(path);
|
|
94
132
|
if (!isRecord(parsed) || !hasOwnString(parsed, 'name') || !hasOwnString(parsed, 'version')) {
|
|
95
133
|
return null;
|
|
96
134
|
}
|
|
@@ -98,6 +136,7 @@ export function readPackageJson(path) {
|
|
|
98
136
|
const tags = getNxTags(parsed);
|
|
99
137
|
return {
|
|
100
138
|
name: parsed.name,
|
|
139
|
+
projectName: packageNxProjectName(parsed),
|
|
101
140
|
version: parsed.version,
|
|
102
141
|
private: privateValue,
|
|
103
142
|
tags,
|
|
@@ -106,6 +145,29 @@ export function readPackageJson(path) {
|
|
|
106
145
|
json: parsed,
|
|
107
146
|
};
|
|
108
147
|
}
|
|
148
|
+
export function readWorkspacePackageManifest(path) {
|
|
149
|
+
const parsed = readPackageJsonObject(path);
|
|
150
|
+
if (!isRecord(parsed) || !hasOwnString(parsed, 'name')) {
|
|
151
|
+
return null;
|
|
152
|
+
}
|
|
153
|
+
const privateValue = hasOwn(parsed, 'private') && typeof parsed.private === 'boolean' ? parsed.private : false;
|
|
154
|
+
return {
|
|
155
|
+
name: parsed.name,
|
|
156
|
+
projectName: packageNxProjectName(parsed),
|
|
157
|
+
private: privateValue,
|
|
158
|
+
path: dirname(path),
|
|
159
|
+
packageJsonPath: path,
|
|
160
|
+
json: parsed,
|
|
161
|
+
};
|
|
162
|
+
}
|
|
163
|
+
function packageNxProjectName(pkg) {
|
|
164
|
+
const nx = isRecord(pkg.nx) ? pkg.nx : null;
|
|
165
|
+
return (nx ? stringProperty(nx, 'name') : null) ?? stringProperty(pkg, 'name') ?? '';
|
|
166
|
+
}
|
|
167
|
+
export function readPackageJsonObject(path) {
|
|
168
|
+
const parsed = readJsonObject(path);
|
|
169
|
+
return parsed;
|
|
170
|
+
}
|
|
109
171
|
export function getNxTags(pkg) {
|
|
110
172
|
if (!hasOwn(pkg, 'nx') || !isRecord(pkg.nx) || !hasOwn(pkg.nx, 'tags') || !Array.isArray(pkg.nx.tags)) {
|
|
111
173
|
return [];
|
|
@@ -1,2 +1,9 @@
|
|
|
1
|
-
export
|
|
1
|
+
export interface FormatCommitMessageOptions {
|
|
2
|
+
wrapBody?: (paragraph: string) => string;
|
|
3
|
+
}
|
|
4
|
+
export interface ValidateCommitMessageOptions {
|
|
5
|
+
validScopes?: ReadonlySet<string>;
|
|
6
|
+
}
|
|
7
|
+
export declare function validateCommitMessage(message: string, options?: ValidateCommitMessageOptions): string | null;
|
|
8
|
+
export declare function formatCommitMessage(message: string, options?: FormatCommitMessageOptions): string;
|
|
2
9
|
//# sourceMappingURL=commit-msg.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"commit-msg.d.ts","sourceRoot":"","sources":["../../src/monorepo/commit-msg.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"commit-msg.d.ts","sourceRoot":"","sources":["../../src/monorepo/commit-msg.ts"],"names":[],"mappings":"AAiBA,MAAM,WAAW,0BAA0B;IACzC,QAAQ,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,MAAM,CAAC;CAC1C;AAED,MAAM,WAAW,4BAA4B;IAC3C,WAAW,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;CACnC;AAED,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,4BAAiC,GAAG,MAAM,GAAG,IAAI,CA+BhH;AAED,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,0BAA+B,GAAG,MAAM,CA2CrG"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { spawnSync } from 'node:child_process';
|
|
1
2
|
const validCommitTypes = new Set([
|
|
2
3
|
'build',
|
|
3
4
|
'chore',
|
|
@@ -10,25 +11,102 @@ const validCommitTypes = new Set([
|
|
|
10
11
|
'revert',
|
|
11
12
|
'style',
|
|
12
13
|
'test',
|
|
14
|
+
'types',
|
|
13
15
|
]);
|
|
14
|
-
export function validateCommitMessage(message) {
|
|
16
|
+
export function validateCommitMessage(message, options = {}) {
|
|
15
17
|
const subject = message.split('\n', 1)[0]?.trim() ?? '';
|
|
16
18
|
if (!subject) {
|
|
17
19
|
return 'Commit message subject is empty.';
|
|
18
20
|
}
|
|
19
|
-
if (
|
|
21
|
+
if (isGitGeneratedSubject(subject)) {
|
|
20
22
|
return null;
|
|
21
23
|
}
|
|
22
|
-
const match = /^(?<type>[a-z]+)(\([a-z0-9._
|
|
24
|
+
const match = /^(?<type>[a-z]+)(\((?<scope>[a-z0-9._/@-]+(?:,[a-z0-9._/@-]+)*)\))?(?<breaking>!)?: .+$/.exec(subject);
|
|
23
25
|
const type = match?.groups?.type;
|
|
24
|
-
if (type
|
|
25
|
-
return
|
|
26
|
-
}
|
|
27
|
-
return `Invalid conventional commit subject: ${subject}
|
|
26
|
+
if (!type || !validCommitTypes.has(type)) {
|
|
27
|
+
return `Invalid conventional commit subject: ${subject}
|
|
28
28
|
|
|
29
29
|
Expected examples:
|
|
30
30
|
feat(statebus-core): add optimistic transactions
|
|
31
31
|
fix(money): round negative amounts consistently
|
|
32
32
|
chore(release): publish 1.2.3
|
|
33
33
|
feat!: remove deprecated API`;
|
|
34
|
+
}
|
|
35
|
+
const scope = match.groups?.scope;
|
|
36
|
+
if (scope && options.validScopes) {
|
|
37
|
+
const invalidScopes = scope.split(',').filter((entry) => !options.validScopes?.has(entry));
|
|
38
|
+
if (invalidScopes.length > 0) {
|
|
39
|
+
return `Invalid conventional commit scope: ${invalidScopes.join(',')}
|
|
40
|
+
|
|
41
|
+
Use package.json nx.name values, for example:
|
|
42
|
+
feat(statebus-core): add optimistic transactions
|
|
43
|
+
fix(money): round negative amounts consistently`;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
return null;
|
|
47
|
+
}
|
|
48
|
+
export function formatCommitMessage(message, options = {}) {
|
|
49
|
+
const wrapBody = options.wrapBody ?? wrapBodyWithFmt;
|
|
50
|
+
const normalized = message.replace(/\r\n?/g, '\n');
|
|
51
|
+
const lines = normalized.split('\n');
|
|
52
|
+
const subject = lines.shift()?.trimEnd() ?? '';
|
|
53
|
+
const formatted = [subject];
|
|
54
|
+
let paragraph = [];
|
|
55
|
+
let inFence = false;
|
|
56
|
+
const flushParagraph = () => {
|
|
57
|
+
if (paragraph.length === 0) {
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
formatted.push(wrapBody(paragraph.join('\n')).trimEnd());
|
|
61
|
+
paragraph = [];
|
|
62
|
+
};
|
|
63
|
+
for (const line of lines) {
|
|
64
|
+
const trimmedEnd = line.trimEnd();
|
|
65
|
+
if (trimmedEnd.startsWith('```') || trimmedEnd.startsWith('~~~')) {
|
|
66
|
+
flushParagraph();
|
|
67
|
+
inFence = !inFence;
|
|
68
|
+
formatted.push(trimmedEnd);
|
|
69
|
+
continue;
|
|
70
|
+
}
|
|
71
|
+
if (inFence || shouldPreserveLine(trimmedEnd)) {
|
|
72
|
+
flushParagraph();
|
|
73
|
+
formatted.push(trimmedEnd);
|
|
74
|
+
continue;
|
|
75
|
+
}
|
|
76
|
+
if (trimmedEnd === '') {
|
|
77
|
+
flushParagraph();
|
|
78
|
+
formatted.push('');
|
|
79
|
+
continue;
|
|
80
|
+
}
|
|
81
|
+
paragraph.push(trimmedEnd);
|
|
82
|
+
}
|
|
83
|
+
flushParagraph();
|
|
84
|
+
while (formatted.length > 1 && formatted.at(-1) === '') {
|
|
85
|
+
formatted.pop();
|
|
86
|
+
}
|
|
87
|
+
return `${formatted.join('\n')}\n`;
|
|
88
|
+
}
|
|
89
|
+
function wrapBodyWithFmt(paragraph) {
|
|
90
|
+
const result = spawnSync('fmt', ['-w', '72'], { input: `${paragraph}\n`, encoding: 'utf8' });
|
|
91
|
+
if (result.error) {
|
|
92
|
+
throw new Error(`fmt is required to format commit messages. Install it through devenv and retry.\n${result.error.message}`);
|
|
93
|
+
}
|
|
94
|
+
if (result.status !== 0) {
|
|
95
|
+
throw new Error([result.stderr.trim(), result.stdout.trim()].filter(Boolean).join('\n') ||
|
|
96
|
+
'fmt failed to wrap commit message body.');
|
|
97
|
+
}
|
|
98
|
+
return result.stdout;
|
|
99
|
+
}
|
|
100
|
+
function shouldPreserveLine(line) {
|
|
101
|
+
return (line.startsWith('#') ||
|
|
102
|
+
line.startsWith('>') ||
|
|
103
|
+
/^\s/.test(line) ||
|
|
104
|
+
/^[-*+]\s+/.test(line) ||
|
|
105
|
+
/^\d+\.\s+/.test(line) ||
|
|
106
|
+
/^https?:\/\//.test(line) ||
|
|
107
|
+
/^[A-Za-z][A-Za-z0-9-]*: /.test(line) ||
|
|
108
|
+
/^BREAKING CHANGE: /.test(line));
|
|
109
|
+
}
|
|
110
|
+
function isGitGeneratedSubject(subject) {
|
|
111
|
+
return /^(Merge|Revert ")/.test(subject) || /^(fixup|squash)! /.test(subject);
|
|
34
112
|
}
|
package/dist/monorepo/index.d.ts
CHANGED
|
@@ -7,18 +7,35 @@ export interface InitOptions {
|
|
|
7
7
|
export interface ValidateOptions {
|
|
8
8
|
failFast?: boolean;
|
|
9
9
|
onlyIfNewWorkspacePackage?: boolean;
|
|
10
|
+
fix?: boolean;
|
|
11
|
+
verbose?: boolean;
|
|
12
|
+
}
|
|
13
|
+
export interface ValidateCommitMessageOptions {
|
|
14
|
+
fix?: boolean;
|
|
10
15
|
}
|
|
11
16
|
export interface ListReleasePackagesOptions {
|
|
12
17
|
failEmpty?: boolean;
|
|
13
18
|
githubOutput?: string;
|
|
14
19
|
}
|
|
20
|
+
export interface SetupTestTracingOptions {
|
|
21
|
+
all?: boolean;
|
|
22
|
+
projects?: string;
|
|
23
|
+
opContextExport?: string;
|
|
24
|
+
tracerModule?: string;
|
|
25
|
+
dryRun?: boolean;
|
|
26
|
+
}
|
|
27
|
+
export interface SetupTestTracingShell {
|
|
28
|
+
run(command: string, args: string[], cwd: string): Promise<void>;
|
|
29
|
+
log(message: string): void;
|
|
30
|
+
}
|
|
15
31
|
export declare function initMonorepo(root: string, options: InitOptions): Promise<void>;
|
|
16
32
|
export declare function validateMonorepo(root: string, options?: ValidateOptions): Promise<void>;
|
|
17
33
|
export declare function updateManagedFiles(root: string): void;
|
|
18
34
|
export declare function checkManagedFiles(root: string): void;
|
|
19
35
|
export declare function diffManagedFiles(root: string): void;
|
|
20
|
-
export declare function validateCommitMessageFile(path: string | undefined): void;
|
|
21
|
-
export declare function
|
|
36
|
+
export declare function validateCommitMessageFile(path: string | undefined, options?: ValidateCommitMessageOptions, root?: string): void;
|
|
37
|
+
export declare function listReleaseProjectNamesForNx(root: string, options?: ListReleasePackagesOptions): string;
|
|
22
38
|
export declare function validatePublicPackageTags(root: string): void;
|
|
39
|
+
export declare function setupTestTracing(root: string, options: SetupTestTracingOptions, shell?: SetupTestTracingShell): Promise<void>;
|
|
23
40
|
export { applyWorkspaceGitConfig, syncBunLockfileVersions };
|
|
24
41
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -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;AAMxD,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;
|
|
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;AAMxD,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,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAErD;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAMpD;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAEnD;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"}
|