@smoothbricks/cli 0.10.2 → 0.10.4
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 +31 -23
- package/dist/bun/preload.d.ts +13 -0
- package/dist/bun/preload.d.ts.map +1 -0
- package/dist/bun/preload.js +12 -0
- package/dist/cli.js +36 -4
- package/dist/generate/index.d.ts.map +1 -1
- package/dist/generate/index.js +0 -6
- package/dist/github-ci/index.d.ts +17 -2
- package/dist/github-ci/index.d.ts.map +1 -1
- package/dist/github-ci/index.js +192 -26
- package/dist/github-ci/outputs.d.ts +22 -0
- package/dist/github-ci/outputs.d.ts.map +1 -0
- package/dist/github-ci/outputs.js +648 -0
- package/dist/lib/cli-package.js +2 -2
- package/dist/lib/json.d.ts +118 -11
- package/dist/lib/json.d.ts.map +1 -1
- package/dist/lib/json.js +317 -29
- package/dist/lib/workspace.d.ts +7 -14
- package/dist/lib/workspace.d.ts.map +1 -1
- package/dist/lib/workspace.js +76 -82
- 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 +28 -2
- package/dist/monorepo/git-config.js +2 -2
- package/dist/monorepo/index.d.ts +3 -1
- package/dist/monorepo/index.d.ts.map +1 -1
- package/dist/monorepo/index.js +6 -2
- package/dist/monorepo/lockfile.d.ts +13 -1
- package/dist/monorepo/lockfile.d.ts.map +1 -1
- package/dist/monorepo/lockfile.js +33 -21
- package/dist/monorepo/managed-files.d.ts +12 -0
- package/dist/monorepo/managed-files.d.ts.map +1 -1
- package/dist/monorepo/managed-files.js +86 -28
- package/dist/monorepo/package-policy.d.ts.map +1 -1
- package/dist/monorepo/package-policy.js +78 -45
- package/dist/monorepo/packed-manifest.d.ts +5 -2
- package/dist/monorepo/packed-manifest.d.ts.map +1 -1
- package/dist/monorepo/packed-manifest.js +16 -47
- package/dist/monorepo/packed-package.d.ts.map +1 -1
- package/dist/monorepo/packed-package.js +28 -16
- package/dist/monorepo/packs/index.d.ts +3 -0
- package/dist/monorepo/packs/index.d.ts.map +1 -1
- package/dist/monorepo/packs/index.js +18 -6
- package/dist/monorepo/publish-workflow.d.ts +1 -0
- package/dist/monorepo/publish-workflow.d.ts.map +1 -1
- package/dist/monorepo/publish-workflow.js +242 -3
- package/dist/monorepo/runtime.d.ts +15 -0
- package/dist/monorepo/runtime.d.ts.map +1 -1
- package/dist/monorepo/runtime.js +66 -12
- package/dist/monorepo/tool-validation.d.ts.map +1 -1
- package/dist/monorepo/tool-validation.js +32 -23
- package/dist/monorepo/wrangler.d.ts.map +1 -1
- package/dist/monorepo/wrangler.js +13 -13
- package/dist/nx/index.d.ts +12 -4
- package/dist/nx/index.d.ts.map +1 -1
- package/dist/nx/index.js +86 -19
- package/dist/pr/index.d.ts.map +1 -1
- package/dist/pr/index.js +28 -32
- package/dist/release/candidates.d.ts +3 -2
- package/dist/release/candidates.d.ts.map +1 -1
- package/dist/release/candidates.js +4 -5
- package/dist/release/github-release.d.ts +3 -0
- package/dist/release/github-release.d.ts.map +1 -1
- package/dist/release/github-release.js +11 -0
- package/dist/release/index.d.ts +20 -1
- package/dist/release/index.d.ts.map +1 -1
- package/dist/release/index.js +221 -89
- package/dist/release/orchestration.d.ts +8 -1
- package/dist/release/orchestration.d.ts.map +1 -1
- package/dist/release/orchestration.js +38 -1
- package/dist/wrangler/prepare-env.d.ts +0 -1
- package/dist/wrangler/prepare-env.d.ts.map +1 -1
- package/dist/wrangler/prepare-env.js +100 -51
- package/dist/wrangler/scaffold.d.ts.map +1 -1
- package/dist/wrangler/scaffold.js +12 -12
- package/managed/raw/git-format-staged.yml +19 -1
- package/managed/raw/tooling/direnv/github-actions-bootstrap.sh +6 -0
- package/managed/raw/tooling/direnv/merge-newer-pins.sh +3 -3
- package/managed/raw/tooling/direnv/setup-environment.ts +187 -19
- package/managed/raw/tooling/git-hooks/pre-commit.sh +0 -6
- package/managed/templates/github/actions/cache-nix-devenv/action.yml +12 -10
- package/managed/templates/github/actions/cache-node-modules/action.yml +6 -2
- package/managed/templates/github/actions/cache-nx/action.yml +2 -2
- package/managed/templates/github/actions/cache-ttsc-plugins/action.yml +19 -0
- package/managed/templates/github/actions/save-nix-devenv/action.yml +11 -3
- package/managed/templates/github/actions/setup-devenv/action.yml +5 -0
- package/managed/templates/github/workflows/managed-files.yml +80 -0
- package/package.json +18 -4
- package/src/bun/preload.ts +12 -0
- package/src/cli.ts +49 -11
- package/src/generate/index.ts +0 -6
- package/src/github-ci/index.test.ts +486 -0
- package/src/github-ci/index.ts +220 -30
- package/src/github-ci/outputs.ts +505 -0
- package/src/lib/cli-package.ts +2 -2
- package/src/lib/json.ts +291 -32
- package/src/lib/workspace.ts +88 -100
- package/src/monorepo/__tests__/ci-workflow.test.ts +14 -3
- package/src/monorepo/__tests__/publish-workflow.test.ts +222 -1
- package/src/monorepo/ci-workflow.ts +28 -2
- package/src/monorepo/git-config.ts +2 -2
- package/src/monorepo/index.ts +6 -2
- package/src/monorepo/lockfile.test.ts +35 -36
- package/src/monorepo/lockfile.ts +48 -24
- package/src/monorepo/managed-files.test.ts +63 -0
- package/src/monorepo/managed-files.ts +94 -34
- package/src/monorepo/package-policy.test.ts +70 -51
- package/src/monorepo/package-policy.ts +104 -59
- package/src/monorepo/packed-manifest.ts +18 -52
- package/src/monorepo/packed-package.ts +43 -22
- package/src/monorepo/packs/index.test.ts +18 -1
- package/src/monorepo/packs/index.ts +20 -7
- package/src/monorepo/publish-workflow.ts +482 -3
- package/src/monorepo/runtime.test.ts +42 -3
- package/src/monorepo/runtime.ts +90 -12
- package/src/monorepo/tool-validation.ts +35 -25
- package/src/monorepo/wrangler.test.ts +11 -15
- package/src/monorepo/wrangler.ts +15 -15
- package/src/nx/index.test.ts +43 -0
- package/src/nx/index.ts +110 -23
- package/src/pr/index.ts +42 -36
- package/src/release/__tests__/candidates.test.ts +5 -4
- package/src/release/__tests__/fixture-repo.test.ts +18 -16
- package/src/release/__tests__/github-release.test.ts +11 -0
- package/src/release/__tests__/orchestration.test.ts +57 -2
- package/src/release/__tests__/trust-publisher.test.ts +98 -2
- package/src/release/candidates.ts +10 -17
- package/src/release/github-release.ts +12 -0
- package/src/release/index.ts +321 -112
- package/src/release/orchestration.ts +55 -3
- package/src/wrangler/prepare-env.ts +75 -54
- package/src/wrangler/scaffold.test.ts +9 -12
- package/src/wrangler/scaffold.ts +13 -13
package/dist/lib/workspace.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { readdirSync, statSync } from 'node:fs';
|
|
2
2
|
import { dirname, join, relative } from 'node:path';
|
|
3
3
|
import { isSmoothBricksCodebasePackageName } from './cli-package.js';
|
|
4
|
-
import {
|
|
4
|
+
import { isPackageJson, readJson, readJsonObject, } from './json.js';
|
|
5
5
|
export const workspaceDependencyFields = [
|
|
6
6
|
'dependencies',
|
|
7
7
|
'devDependencies',
|
|
@@ -12,22 +12,19 @@ export function listPublicPackages(root) {
|
|
|
12
12
|
return getWorkspacePackages(root).filter((pkg) => !pkg.private && pkg.tags.includes('npm:public'));
|
|
13
13
|
}
|
|
14
14
|
export function listReleasePackages(root, rootPackage = readPackageJson(join(root, 'package.json'))) {
|
|
15
|
-
|
|
16
|
-
return [];
|
|
17
|
-
}
|
|
18
|
-
const rootRepository = repositoryInfo(rootPackage.json);
|
|
15
|
+
const rootRepository = rootPackage ? repositoryInfo(rootPackage.json) : null;
|
|
19
16
|
if (!rootRepository) {
|
|
20
17
|
return [];
|
|
21
18
|
}
|
|
22
|
-
return
|
|
19
|
+
return listPublicPackages(root).filter((pkg) => isOwnedPackage(rootRepository, pkg));
|
|
23
20
|
}
|
|
24
21
|
export function rootRepositoryInfo(root) {
|
|
25
|
-
const rootPackage =
|
|
26
|
-
return rootPackage ? repositoryInfo(rootPackage) : null;
|
|
22
|
+
const rootPackage = readPackageJson(join(root, 'package.json'));
|
|
23
|
+
return rootPackage ? repositoryInfo(rootPackage.json) : null;
|
|
27
24
|
}
|
|
28
25
|
export function rootPackageName(root) {
|
|
29
26
|
const rootPackage = readPackageJsonObject(join(root, 'package.json'));
|
|
30
|
-
return rootPackage
|
|
27
|
+
return rootPackage?.name ?? null;
|
|
31
28
|
}
|
|
32
29
|
export function isSmoothBricksCodebase(root) {
|
|
33
30
|
return isSmoothBricksCodebasePackageName(rootPackageName(root) ?? undefined);
|
|
@@ -40,62 +37,63 @@ export function isOwnedPackage(rootRepository, pkg) {
|
|
|
40
37
|
return packageRepository !== null && packageRepository.url === rootRepository.url;
|
|
41
38
|
}
|
|
42
39
|
export function getWorkspacePackages(root) {
|
|
43
|
-
|
|
44
|
-
if (!rootPackage) {
|
|
45
|
-
throw new Error('package.json not found or invalid');
|
|
46
|
-
}
|
|
47
|
-
return getWorkspacePackagesForPatterns(root, getWorkspacePatternsFromPackageJson(rootPackage.json));
|
|
40
|
+
return getWorkspacePackagesForPatterns(root, getWorkspacePatterns(root));
|
|
48
41
|
}
|
|
49
42
|
export function getWorkspacePackageManifests(root) {
|
|
50
|
-
|
|
51
|
-
if (!rootPackage) {
|
|
52
|
-
throw new Error('package.json not found or invalid');
|
|
53
|
-
}
|
|
54
|
-
return getWorkspacePackageManifestsForPatterns(root, getWorkspacePatternsFromPackageJson(rootPackage));
|
|
43
|
+
return getWorkspacePackageManifestsForPatterns(root, getWorkspacePatterns(root));
|
|
55
44
|
}
|
|
56
45
|
function getWorkspacePackagesForPatterns(root, workspacePatterns) {
|
|
57
46
|
const packages = [];
|
|
58
|
-
for (const
|
|
59
|
-
const pkg = readPackageJson(
|
|
60
|
-
if (!pkg
|
|
47
|
+
for (const path of listWorkspacePackageJsonPaths(root, workspacePatterns)) {
|
|
48
|
+
const pkg = readPackageJson(path);
|
|
49
|
+
if (!pkg) {
|
|
61
50
|
continue;
|
|
62
51
|
}
|
|
63
52
|
packages.push({
|
|
64
|
-
|
|
65
|
-
|
|
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,
|
|
53
|
+
...pkg,
|
|
54
|
+
path: relative(root, dirname(path)),
|
|
72
55
|
});
|
|
73
56
|
}
|
|
74
57
|
return packages.sort((a, b) => a.name.localeCompare(b.name));
|
|
75
58
|
}
|
|
76
59
|
function getWorkspacePackageManifestsForPatterns(root, workspacePatterns) {
|
|
77
|
-
const
|
|
78
|
-
for (const
|
|
79
|
-
const pkg = readWorkspacePackageManifest(
|
|
80
|
-
if (pkg) {
|
|
81
|
-
|
|
60
|
+
const packages = [];
|
|
61
|
+
for (const path of listWorkspacePackageJsonPaths(root, workspacePatterns)) {
|
|
62
|
+
const pkg = readWorkspacePackageManifest(path);
|
|
63
|
+
if (!pkg) {
|
|
64
|
+
continue;
|
|
82
65
|
}
|
|
66
|
+
packages.push({
|
|
67
|
+
...pkg,
|
|
68
|
+
path: relative(root, dirname(path)),
|
|
69
|
+
});
|
|
83
70
|
}
|
|
84
|
-
return
|
|
71
|
+
return packages.sort((a, b) => a.name.localeCompare(b.name));
|
|
85
72
|
}
|
|
86
73
|
function listWorkspacePackageJsonPaths(root, workspacePatterns) {
|
|
87
74
|
const paths = [];
|
|
88
75
|
for (const pattern of workspacePatterns) {
|
|
89
76
|
if (!pattern.endsWith('/*')) {
|
|
90
|
-
paths.push(join(root, pattern, 'package.json'));
|
|
91
77
|
continue;
|
|
92
78
|
}
|
|
93
79
|
const parent = join(root, pattern.slice(0, -2));
|
|
94
|
-
|
|
80
|
+
let entries;
|
|
81
|
+
try {
|
|
82
|
+
entries = readdirSync(parent);
|
|
83
|
+
}
|
|
84
|
+
catch {
|
|
95
85
|
continue;
|
|
96
86
|
}
|
|
97
|
-
for (const entry of
|
|
98
|
-
|
|
87
|
+
for (const entry of entries) {
|
|
88
|
+
const packageJsonPath = join(parent, entry, 'package.json');
|
|
89
|
+
try {
|
|
90
|
+
if (statSync(packageJsonPath).isFile()) {
|
|
91
|
+
paths.push(packageJsonPath);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
catch {
|
|
95
|
+
// skip missing package.json
|
|
96
|
+
}
|
|
99
97
|
}
|
|
100
98
|
}
|
|
101
99
|
return paths;
|
|
@@ -103,7 +101,7 @@ function listWorkspacePackageJsonPaths(root, workspacePatterns) {
|
|
|
103
101
|
export function listPackageJsonRecords(root) {
|
|
104
102
|
const rootPackage = readPackageJson(join(root, 'package.json'));
|
|
105
103
|
if (!rootPackage) {
|
|
106
|
-
|
|
104
|
+
return getWorkspacePackages(root);
|
|
107
105
|
}
|
|
108
106
|
return [
|
|
109
107
|
{ ...rootPackage, path: '.' },
|
|
@@ -112,34 +110,30 @@ export function listPackageJsonRecords(root) {
|
|
|
112
110
|
}
|
|
113
111
|
export function getWorkspacePatterns(root) {
|
|
114
112
|
const raw = readJson(join(root, 'package.json'));
|
|
115
|
-
|
|
113
|
+
const pkg = isPackageJson(raw) ? raw : null;
|
|
114
|
+
return pkg ? getWorkspacePatternsFromPackageJson(pkg) : ['packages/*'];
|
|
116
115
|
}
|
|
117
116
|
function getWorkspacePatternsFromPackageJson(pkg) {
|
|
118
|
-
if (!hasOwn(pkg, 'workspaces')) {
|
|
119
|
-
return ['packages/*'];
|
|
120
|
-
}
|
|
121
117
|
const workspaces = pkg.workspaces;
|
|
122
118
|
if (Array.isArray(workspaces)) {
|
|
123
119
|
return workspaces.filter((entry) => typeof entry === 'string');
|
|
124
120
|
}
|
|
125
|
-
if (
|
|
121
|
+
if (workspaces && typeof workspaces === 'object' && Array.isArray(workspaces.packages)) {
|
|
126
122
|
return workspaces.packages.filter((entry) => typeof entry === 'string');
|
|
127
123
|
}
|
|
128
124
|
return ['packages/*'];
|
|
129
125
|
}
|
|
130
126
|
export function readPackageJson(path) {
|
|
131
127
|
const parsed = readPackageJsonObject(path);
|
|
132
|
-
if (!
|
|
128
|
+
if (!parsed?.name || !parsed.version) {
|
|
133
129
|
return null;
|
|
134
130
|
}
|
|
135
|
-
const privateValue = hasOwn(parsed, 'private') && typeof parsed.private === 'boolean' ? parsed.private : false;
|
|
136
|
-
const tags = getNxTags(parsed);
|
|
137
131
|
return {
|
|
138
132
|
name: parsed.name,
|
|
139
133
|
projectName: packageNxProjectName(parsed),
|
|
140
134
|
version: parsed.version,
|
|
141
|
-
private:
|
|
142
|
-
tags,
|
|
135
|
+
private: parsed.private === true,
|
|
136
|
+
tags: getNxTags(parsed),
|
|
143
137
|
path: dirname(path),
|
|
144
138
|
packageJsonPath: path,
|
|
145
139
|
json: parsed,
|
|
@@ -147,70 +141,70 @@ export function readPackageJson(path) {
|
|
|
147
141
|
}
|
|
148
142
|
export function readWorkspacePackageManifest(path) {
|
|
149
143
|
const parsed = readPackageJsonObject(path);
|
|
150
|
-
if (!
|
|
144
|
+
if (!parsed?.name) {
|
|
151
145
|
return null;
|
|
152
146
|
}
|
|
153
|
-
const privateValue = hasOwn(parsed, 'private') && typeof parsed.private === 'boolean' ? parsed.private : false;
|
|
154
147
|
return {
|
|
155
148
|
name: parsed.name,
|
|
156
149
|
projectName: packageNxProjectName(parsed),
|
|
157
|
-
private:
|
|
150
|
+
private: parsed.private === true,
|
|
158
151
|
path: dirname(path),
|
|
159
152
|
packageJsonPath: path,
|
|
160
153
|
json: parsed,
|
|
161
154
|
};
|
|
162
155
|
}
|
|
163
156
|
function packageNxProjectName(pkg) {
|
|
164
|
-
|
|
165
|
-
return (nx ? stringProperty(nx, 'name') : null) ?? stringProperty(pkg, 'name') ?? '';
|
|
157
|
+
return pkg.nx?.name ?? pkg.name ?? '';
|
|
166
158
|
}
|
|
167
159
|
export function readPackageJsonObject(path) {
|
|
168
|
-
|
|
169
|
-
return parsed;
|
|
160
|
+
return readJsonObject(path);
|
|
170
161
|
}
|
|
171
162
|
export function getNxTags(pkg) {
|
|
172
|
-
|
|
163
|
+
const tags = pkg.nx?.tags;
|
|
164
|
+
if (!Array.isArray(tags)) {
|
|
173
165
|
return [];
|
|
174
166
|
}
|
|
175
|
-
return
|
|
167
|
+
return tags.filter((tag) => typeof tag === 'string');
|
|
176
168
|
}
|
|
177
169
|
export function repositoryInfo(pkg) {
|
|
178
170
|
const repository = pkg.repository;
|
|
179
171
|
if (typeof repository === 'string') {
|
|
180
172
|
return { type: 'git', url: repository };
|
|
181
173
|
}
|
|
182
|
-
if (!
|
|
174
|
+
if (!repository || typeof repository !== 'object') {
|
|
183
175
|
return null;
|
|
184
176
|
}
|
|
185
|
-
const url =
|
|
177
|
+
const url = repository.url;
|
|
186
178
|
if (!url) {
|
|
187
179
|
return null;
|
|
188
180
|
}
|
|
189
|
-
return { type:
|
|
181
|
+
return { type: repository.type ?? 'git', url };
|
|
190
182
|
}
|
|
191
183
|
export function sameRepositoryAfterNormalization(left, right) {
|
|
192
184
|
return normalizedRepositoryUrl(left) === normalizedRepositoryUrl(right);
|
|
193
185
|
}
|
|
194
186
|
function normalizedRepositoryUrl(url) {
|
|
195
|
-
const trimmed = url
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
.
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
187
|
+
const trimmed = url.trim().replace(/\.git$/i, '');
|
|
188
|
+
const ssh = /^git@github\.com:(.+)$/i.exec(trimmed);
|
|
189
|
+
if (ssh?.[1]) {
|
|
190
|
+
const [owner, repo] = ssh[1].split('/');
|
|
191
|
+
if (owner && repo) {
|
|
192
|
+
return githubRepositoryKey(owner, repo);
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
try {
|
|
196
|
+
const parsed = new URL(trimmed.includes('://') ? trimmed : `https://${trimmed}`);
|
|
197
|
+
if (parsed.hostname.replace(/^www\./i, '').toLowerCase() === 'github.com') {
|
|
198
|
+
const [owner, repo] = parsed.pathname.replace(/^\//, '').split('/');
|
|
199
|
+
if (owner && repo) {
|
|
200
|
+
return githubRepositoryKey(owner, repo);
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
catch {
|
|
205
|
+
// fall through
|
|
206
|
+
}
|
|
207
|
+
return trimmed.toLowerCase();
|
|
214
208
|
}
|
|
215
209
|
function githubRepositoryKey(owner, repo) {
|
|
216
210
|
return `github:${owner.toLowerCase()}/${repo.toLowerCase()}`;
|
|
@@ -6,6 +6,8 @@ export declare enum CiWorkflowStepKind {
|
|
|
6
6
|
Build = "build",
|
|
7
7
|
Lint = "lint",
|
|
8
8
|
UnitTests = "unit-tests",
|
|
9
|
+
ManagedFilesCheck = "managed-files-check",
|
|
10
|
+
ManagedFilesDispatch = "managed-files-dispatch",
|
|
9
11
|
Deploy = "deploy",
|
|
10
12
|
SaveNxCache = "save-nx-cache",
|
|
11
13
|
UploadTraceDbs = "upload-trace-dbs",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ci-workflow.d.ts","sourceRoot":"","sources":["../../src/monorepo/ci-workflow.ts"],"names":[],"mappings":"AAEA,oBAAY,kBAAkB;IAC5B,QAAQ,aAAa;IACrB,WAAW,iBAAiB;IAC5B,SAAS,gBAAgB;IACzB,cAAc,qBAAqB;IACnC,KAAK,UAAU;IACf,IAAI,SAAS;IACb,SAAS,eAAe;IACxB,MAAM,WAAW;IACjB,WAAW,kBAAkB;IAC7B,cAAc,qBAAqB;IACnC,aAAa,oBAAoB;CAClC;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,kBAAkB,CAAC;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,2BAA2B;IAC1C,MAAM,EAAE,OAAO,CAAC;IAChB,cAAc,CAAC,EAAE,YAAY,CAAC;IAC9B,YAAY,EAAE,MAAM,EAAE,CAAC;CACxB;AAID,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,2BAA2B,GAAG,cAAc,EAAE,
|
|
1
|
+
{"version":3,"file":"ci-workflow.d.ts","sourceRoot":"","sources":["../../src/monorepo/ci-workflow.ts"],"names":[],"mappings":"AAEA,oBAAY,kBAAkB;IAC5B,QAAQ,aAAa;IACrB,WAAW,iBAAiB;IAC5B,SAAS,gBAAgB;IACzB,cAAc,qBAAqB;IACnC,KAAK,UAAU;IACf,IAAI,SAAS;IACb,SAAS,eAAe;IACxB,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;CACxB;AAID,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,2BAA2B,GAAG,cAAc,EAAE,CAqBvF;AAED,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,2BAA2B,GAAG,MAAM,CAGjF"}
|
|
@@ -8,6 +8,8 @@ export var CiWorkflowStepKind;
|
|
|
8
8
|
CiWorkflowStepKind["Build"] = "build";
|
|
9
9
|
CiWorkflowStepKind["Lint"] = "lint";
|
|
10
10
|
CiWorkflowStepKind["UnitTests"] = "unit-tests";
|
|
11
|
+
CiWorkflowStepKind["ManagedFilesCheck"] = "managed-files-check";
|
|
12
|
+
CiWorkflowStepKind["ManagedFilesDispatch"] = "managed-files-dispatch";
|
|
11
13
|
CiWorkflowStepKind["Deploy"] = "deploy";
|
|
12
14
|
CiWorkflowStepKind["SaveNxCache"] = "save-nx-cache";
|
|
13
15
|
CiWorkflowStepKind["UploadTraceDbs"] = "upload-trace-dbs";
|
|
@@ -22,6 +24,8 @@ export function defineCiWorkflow(options) {
|
|
|
22
24
|
{ kind: CiWorkflowStepKind.Build, name: '🔨 Build' },
|
|
23
25
|
{ kind: CiWorkflowStepKind.Lint, name: '🔍 Lint' },
|
|
24
26
|
{ kind: CiWorkflowStepKind.UnitTests, name: '🧪 Unit Tests' },
|
|
27
|
+
{ kind: CiWorkflowStepKind.ManagedFilesCheck, name: '🩺 Check managed-file drift' },
|
|
28
|
+
{ kind: CiWorkflowStepKind.ManagedFilesDispatch, name: '🔁 Dispatch managed-file drift healing' },
|
|
25
29
|
];
|
|
26
30
|
if (options.deploy) {
|
|
27
31
|
steps.push({ kind: CiWorkflowStepKind.Deploy, name: '🚀 Deploy Staging' });
|
|
@@ -43,7 +47,8 @@ ${renderYamlList(options.pushBranches, 6)}
|
|
|
43
47
|
pull_request:
|
|
44
48
|
|
|
45
49
|
permissions:
|
|
46
|
-
actions:
|
|
50
|
+
# actions:write lets the drift step dispatch the managed-files workflow.
|
|
51
|
+
actions: write
|
|
47
52
|
contents: read
|
|
48
53
|
statuses: write
|
|
49
54
|
|
|
@@ -135,6 +140,27 @@ function yamlLinesForStep(step, options) {
|
|
|
135
140
|
return nxSmartStep(step, 'lint', 'Lint');
|
|
136
141
|
case CiWorkflowStepKind.UnitTests:
|
|
137
142
|
return nxSmartStep(step, 'test', 'Unit Tests');
|
|
143
|
+
case CiWorkflowStepKind.ManagedFilesCheck:
|
|
144
|
+
// The authoritative drift check is nearly free here (devenv is already
|
|
145
|
+
// up). --warn never fails the job and publishes the step output
|
|
146
|
+
// `drifted=<count>` for the dispatch step below.
|
|
147
|
+
return [
|
|
148
|
+
` - name: ${step.name}`,
|
|
149
|
+
' id: managed-drift',
|
|
150
|
+
' if:',
|
|
151
|
+
" ${{ github.event_name == 'push' && github.ref == format('refs/heads/{0}',",
|
|
152
|
+
' github.event.repository.default_branch) }}',
|
|
153
|
+
' run: smoo monorepo check --warn',
|
|
154
|
+
];
|
|
155
|
+
case CiWorkflowStepKind.ManagedFilesDispatch:
|
|
156
|
+
// Dispatches the managed-files workflow, which maintains the persistent
|
|
157
|
+
// review PR. workflow_dispatch is exempt from GitHub's GITHUB_TOKEN
|
|
158
|
+
// recursion guard, so the default token suffices.
|
|
159
|
+
return [
|
|
160
|
+
` - name: ${step.name}`,
|
|
161
|
+
" if: ${{ steps.managed-drift.outputs.drifted != '' && steps.managed-drift.outputs.drifted != '0' }}",
|
|
162
|
+
' run: gh workflow run managed-files.yml --ref "$GITHUB_REF_NAME"',
|
|
163
|
+
];
|
|
138
164
|
case CiWorkflowStepKind.Deploy:
|
|
139
165
|
return [
|
|
140
166
|
` - name: ${step.name}`,
|
|
@@ -155,7 +181,7 @@ function yamlLinesForStep(step, options) {
|
|
|
155
181
|
' path: |',
|
|
156
182
|
' .nx/cache',
|
|
157
183
|
' .nx/workspace-data/*.db*',
|
|
158
|
-
' key: ${{ runner.os }}-nx-db-v1-${{ github.sha }}',
|
|
184
|
+
' key: ${{ runner.os }}-${{ runner.arch }}-nx-db-v1-${{ github.sha }}',
|
|
159
185
|
];
|
|
160
186
|
case CiWorkflowStepKind.UploadTraceDbs:
|
|
161
187
|
return [
|
|
@@ -13,8 +13,8 @@ export async function applyWorkspaceGitConfig(root) {
|
|
|
13
13
|
// Keep the newer runtime version pins on any merge (nvfetcher overlay +
|
|
14
14
|
// devenv.lock) so a mirror sync's `git am --3way` never stalls on a version
|
|
15
15
|
// conflict. Mapped by the managed .gitattributes (merge=smoo-newer-pins);
|
|
16
|
-
// implemented in tooling/direnv/merge-newer-pins.sh.
|
|
17
|
-
//
|
|
16
|
+
// implemented in tooling/direnv/merge-newer-pins.sh. Runtime package.json
|
|
17
|
+
// pin repair is explicit via `smoo monorepo init --runtime-only`.
|
|
18
18
|
await $ `git config --local merge.smoo-newer-pins.name ${'keep the newer devenv/nvfetcher runtime pins'}`.cwd(root);
|
|
19
19
|
await $ `git config --local merge.smoo-newer-pins.driver ${'bash tooling/direnv/merge-newer-pins.sh %O %A %B %P'}`.cwd(root);
|
|
20
20
|
linkHook(gitDir, tooling, 'pre-commit');
|
package/dist/monorepo/index.d.ts
CHANGED
|
@@ -31,7 +31,9 @@ export interface SetupTestTracingShell {
|
|
|
31
31
|
export declare function initMonorepo(root: string, options: InitOptions): Promise<void>;
|
|
32
32
|
export declare function validateMonorepo(root: string, options?: ValidateOptions): Promise<void>;
|
|
33
33
|
export declare function updateManagedFiles(root: string): void;
|
|
34
|
-
export declare function checkManagedFiles(root: string
|
|
34
|
+
export declare function checkManagedFiles(root: string, options?: {
|
|
35
|
+
warn?: boolean;
|
|
36
|
+
}): void;
|
|
35
37
|
export declare function diffManagedFiles(root: string): void;
|
|
36
38
|
export declare function validateCommitMessageFile(path: string | undefined, options?: ValidateCommitMessageOptions, root?: string): void;
|
|
37
39
|
export declare function listReleaseProjectNamesForNx(root: string, options?: ListReleasePackagesOptions): string;
|
|
@@ -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;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,
|
|
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,EAAE,OAAO,GAAE;IAAE,IAAI,CAAC,EAAE,OAAO,CAAA;CAAO,GAAG,IAAI,CAUtF;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"}
|
package/dist/monorepo/index.js
CHANGED
|
@@ -5,7 +5,7 @@ import { escapeRegex, getWorkspacePackages, getWorkspacePatterns, listReleasePac
|
|
|
5
5
|
import { formatCommitMessage, validateCommitMessage } from './commit-msg.js';
|
|
6
6
|
import { applyWorkspaceGitConfig } from './git-config.js';
|
|
7
7
|
import { syncBunLockfileVersions } from './lockfile.js';
|
|
8
|
-
import { applyManagedFiles, printResults } from './managed-files.js';
|
|
8
|
+
import { applyManagedFiles, printResults, warnOnManagedFileDrift } from './managed-files.js';
|
|
9
9
|
import { listValidCommitScopes, validatePublicTags } from './package-policy.js';
|
|
10
10
|
import { runInitPacks, runValidatePacks } from './packs/index.js';
|
|
11
11
|
import { syncRootRuntimeVersions } from './runtime.js';
|
|
@@ -38,7 +38,11 @@ export async function validateMonorepo(root, options = {}) {
|
|
|
38
38
|
export function updateManagedFiles(root) {
|
|
39
39
|
printResults(applyManagedFiles(root, 'update'));
|
|
40
40
|
}
|
|
41
|
-
export function checkManagedFiles(root) {
|
|
41
|
+
export function checkManagedFiles(root, options = {}) {
|
|
42
|
+
if (options.warn === true) {
|
|
43
|
+
warnOnManagedFileDrift(root);
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
42
46
|
const results = applyManagedFiles(root, 'check');
|
|
43
47
|
printResults(results);
|
|
44
48
|
if (results.some((result) => result.action === 'drifted')) {
|
|
@@ -1,8 +1,20 @@
|
|
|
1
1
|
export interface SyncBunLockfileVersionsOptions {
|
|
2
2
|
log?: boolean;
|
|
3
|
-
/** `git add` bun.lock
|
|
3
|
+
/** `git add` bun.lock when versions were resynced. */
|
|
4
4
|
stage?: boolean;
|
|
5
|
+
/**
|
|
6
|
+
* `install` (default for validation): lockfile must match package.json.
|
|
7
|
+
* `publish`: rewrite unpublished prerelease package.json versions to the last
|
|
8
|
+
* stable git tag so `bun pm pack` embeds installable dependency versions.
|
|
9
|
+
*/
|
|
10
|
+
mode?: 'install' | 'publish';
|
|
5
11
|
}
|
|
6
12
|
export declare function syncBunLockfileVersions(root: string, options?: SyncBunLockfileVersionsOptions): number;
|
|
13
|
+
/** Install/CI invariant: bun.lock workspace versions match package.json. */
|
|
7
14
|
export declare function validateBunLockfileVersions(root: string): number;
|
|
15
|
+
/**
|
|
16
|
+
* Version Bun should embed for a workspace dependency when packing for publish.
|
|
17
|
+
* Unpublished package.json prereleases (prepare-next) map to the last stable tag.
|
|
18
|
+
*/
|
|
19
|
+
export declare function publishPackDependencyVersion(root: string, projectName: string, packageVersion: string): string;
|
|
8
20
|
//# sourceMappingURL=lockfile.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lockfile.d.ts","sourceRoot":"","sources":["../../src/monorepo/lockfile.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,8BAA8B;IAC7C,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,
|
|
1
|
+
{"version":3,"file":"lockfile.d.ts","sourceRoot":"","sources":["../../src/monorepo/lockfile.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,8BAA8B;IAC7C,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,sDAAsD;IACtD,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB;;;;OAIG;IACH,IAAI,CAAC,EAAE,SAAS,GAAG,SAAS,CAAC;CAC9B;AAmBD,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,8BAAmC,GAAG,MAAM,CAqD1G;AAED,4EAA4E;AAC5E,wBAAgB,2BAA2B,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CA8BhE;AAED;;;GAGG;AACH,wBAAgB,4BAA4B,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,MAAM,CAE9G"}
|
|
@@ -2,23 +2,26 @@ import { execSync } from 'node:child_process';
|
|
|
2
2
|
import { existsSync, readFileSync, writeFileSync } from 'node:fs';
|
|
3
3
|
import { join } from 'node:path';
|
|
4
4
|
import { escapeRegex, getWorkspacePackages } from '../lib/workspace.js';
|
|
5
|
-
// Temporary Bun workaround. Delete
|
|
6
|
-
//
|
|
7
|
-
//
|
|
8
|
-
// versions stale in bun.lock after manifest bumps. Until then, `bun pm pack`
|
|
9
|
-
// rewrites `workspace:*` dependencies using those stale lockfile versions instead
|
|
10
|
-
// of the current package.json versions. Track removal against:
|
|
5
|
+
// Temporary Bun workaround. Delete once supported Bun versions stop leaving
|
|
6
|
+
// workspace package versions stale in bun.lock after manifest bumps, and stop
|
|
7
|
+
// resolving `workspace:*` from the lockfile during `bun pm pack`:
|
|
11
8
|
// - https://github.com/oven-sh/bun/issues/18906
|
|
12
9
|
// - https://github.com/oven-sh/bun/issues/20477
|
|
13
10
|
// - https://github.com/oven-sh/bun/issues/20829
|
|
14
11
|
//
|
|
15
|
-
//
|
|
16
|
-
//
|
|
17
|
-
//
|
|
18
|
-
//
|
|
19
|
-
//
|
|
12
|
+
// Two modes, because one lockfile serves two jobs:
|
|
13
|
+
//
|
|
14
|
+
// 1) install / frozen CI → lockfile ≡ package.json (including -next)
|
|
15
|
+
// 2) pre-publish pack → for package.json prereleases that were never published
|
|
16
|
+
// (post-release "prepare next"), lockfile entry := last
|
|
17
|
+
// stable tag so a releasing package does not embed an
|
|
18
|
+
// unpublished -next dependency version.
|
|
19
|
+
//
|
|
20
|
+
// Do not run publish-mode rewrite in day-to-day validate or pre-commit: bun install
|
|
21
|
+
// rewrites lockfile back to package.json and frozen CI then fails.
|
|
20
22
|
export function syncBunLockfileVersions(root, options = {}) {
|
|
21
23
|
const log = options.log ?? true;
|
|
24
|
+
const mode = options.mode ?? 'publish';
|
|
22
25
|
const lockfilePath = join(root, 'bun.lock');
|
|
23
26
|
if (!existsSync(lockfilePath)) {
|
|
24
27
|
throw new Error('bun.lock not found');
|
|
@@ -27,12 +30,7 @@ export function syncBunLockfileVersions(root, options = {}) {
|
|
|
27
30
|
let lockfile = readFileSync(lockfilePath, 'utf8');
|
|
28
31
|
let updated = 0;
|
|
29
32
|
for (const pkg of packages) {
|
|
30
|
-
|
|
31
|
-
// never have been published. Use the latest stable git tag version so
|
|
32
|
-
// that `bun pm pack` writes an installable dependency range for consumers.
|
|
33
|
-
const targetVersion = pkg.version.includes('-')
|
|
34
|
-
? (latestStableTagVersion(root, pkg.projectName) ?? pkg.version)
|
|
35
|
-
: pkg.version;
|
|
33
|
+
const targetVersion = lockfileTargetVersion(root, pkg.projectName, pkg.version, mode);
|
|
36
34
|
const relativePath = pkg.path.replaceAll('\\', '/');
|
|
37
35
|
const escaped = escapeRegex(relativePath);
|
|
38
36
|
const pattern = new RegExp(`("${escaped}":\\s*\\{[^}]*"version":\\s*")([^"]+)(")`);
|
|
@@ -52,7 +50,9 @@ export function syncBunLockfileVersions(root, options = {}) {
|
|
|
52
50
|
}
|
|
53
51
|
lockfile = lockfile.replace(pattern, `$1${targetVersion}$3`);
|
|
54
52
|
if (log) {
|
|
55
|
-
const suffix =
|
|
53
|
+
const suffix = mode === 'publish' && targetVersion !== pkg.version
|
|
54
|
+
? ` (latest stable tag; package.json has ${pkg.version})`
|
|
55
|
+
: '';
|
|
56
56
|
console.log(`fix: ${relativePath}: ${lockVersion} -> ${targetVersion}${suffix}`);
|
|
57
57
|
}
|
|
58
58
|
updated++;
|
|
@@ -70,6 +70,7 @@ export function syncBunLockfileVersions(root, options = {}) {
|
|
|
70
70
|
}
|
|
71
71
|
return updated;
|
|
72
72
|
}
|
|
73
|
+
/** Install/CI invariant: bun.lock workspace versions match package.json. */
|
|
73
74
|
export function validateBunLockfileVersions(root) {
|
|
74
75
|
const lockfilePath = join(root, 'bun.lock');
|
|
75
76
|
if (!existsSync(lockfilePath)) {
|
|
@@ -80,9 +81,7 @@ export function validateBunLockfileVersions(root) {
|
|
|
80
81
|
const lockfile = readFileSync(lockfilePath, 'utf8');
|
|
81
82
|
let failures = 0;
|
|
82
83
|
for (const pkg of packages) {
|
|
83
|
-
const targetVersion = pkg.version
|
|
84
|
-
? (latestStableTagVersion(root, pkg.projectName) ?? pkg.version)
|
|
85
|
-
: pkg.version;
|
|
84
|
+
const targetVersion = pkg.version;
|
|
86
85
|
const relativePath = pkg.path.replaceAll('\\', '/');
|
|
87
86
|
const escaped = escapeRegex(relativePath);
|
|
88
87
|
const pattern = new RegExp(`("${escaped}":\\s*\\{[^}]*"version":\\s*")([^"]+)(")`);
|
|
@@ -103,6 +102,19 @@ export function validateBunLockfileVersions(root) {
|
|
|
103
102
|
}
|
|
104
103
|
return failures;
|
|
105
104
|
}
|
|
105
|
+
/**
|
|
106
|
+
* Version Bun should embed for a workspace dependency when packing for publish.
|
|
107
|
+
* Unpublished package.json prereleases (prepare-next) map to the last stable tag.
|
|
108
|
+
*/
|
|
109
|
+
export function publishPackDependencyVersion(root, projectName, packageVersion) {
|
|
110
|
+
return lockfileTargetVersion(root, projectName, packageVersion, 'publish');
|
|
111
|
+
}
|
|
112
|
+
function lockfileTargetVersion(root, projectName, packageVersion, mode) {
|
|
113
|
+
if (mode === 'install' || !packageVersion.includes('-')) {
|
|
114
|
+
return packageVersion;
|
|
115
|
+
}
|
|
116
|
+
return latestStableTagVersion(root, projectName) ?? packageVersion;
|
|
117
|
+
}
|
|
106
118
|
function latestStableTagVersion(root, projectName) {
|
|
107
119
|
try {
|
|
108
120
|
const output = execSync(`git tag --list '${projectName}@*' --sort=-v:refname`, {
|
|
@@ -48,7 +48,19 @@ export interface FileResult {
|
|
|
48
48
|
action: 'created' | 'updated' | 'unchanged' | 'skipped' | 'skipped-symlink' | 'drifted' | 'ok-symlink';
|
|
49
49
|
}
|
|
50
50
|
export declare function applyManagedFiles(root: string, mode: 'update' | 'check' | 'diff'): FileResult[];
|
|
51
|
+
export declare function platformTargetGlobsForTest(targetNames: Iterable<string>): string[];
|
|
51
52
|
export declare function printResults(results: FileResult[]): void;
|
|
52
53
|
export declare function validateManagedFiles(root: string): number;
|
|
54
|
+
/**
|
|
55
|
+
* Non-blocking drift report: prints the per-file table and surfaces drift as
|
|
56
|
+
* GitHub Actions warning annotations (plain stderr elsewhere) without failing
|
|
57
|
+
* the run. Managed-file drift is derived state with its own remediation flow
|
|
58
|
+
* (the persistent managed-files PR); only `monorepo check` without --warn and
|
|
59
|
+
* PR-scoped gates treat it as an error.
|
|
60
|
+
*
|
|
61
|
+
* Under GitHub Actions the drifted-file count is published as the step output
|
|
62
|
+
* `drifted`, so downstream steps gate declaratively instead of parsing logs.
|
|
63
|
+
*/
|
|
64
|
+
export declare function warnOnManagedFileDrift(root: string): void;
|
|
53
65
|
export {};
|
|
54
66
|
//# 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":"AAYA;;;;;GAKG;AACH,eAAO,MAAM,oBAAoB,yEAAyE,CAAC;AAU3G,sFAAsF;AACtF,iBAAS,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAIlF;AAED,uCAAuC;AACvC,eAAO,MAAM,wBAAwB,0BAAoB,CAAC;AAE1D;;;;;;;;;GASG;AACH,eAAO,MAAM,kBAAkB,uBAAuB,CAAC;AACvD,eAAO,MAAM,gBAAgB,qBAAqB,CAAC;AAEnD,UAAU,gBAAgB;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;8BAE8B;AAC9B,iBAAS,wBAAwB,CAAC,OAAO,EAAE,MAAM,GAAG;IAAE,aAAa,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,gBAAgB,EAAE,CAAA;CAAE,CAkCxG;AAED,wCAAwC;AACxC,eAAO,MAAM,+BAA+B,iCAA2B,CAAC;AAExE;+EAC+E;AAC/E,iBAAS,yBAAyB,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,gBAAgB,EAAE,GAAG,MAAM,CAqBtF;AAED,yCAAyC;AACzC,eAAO,MAAM,gCAAgC,kCAA4B,CAAC;AAE1E,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,SAAS,GAAG,SAAS,GAAG,WAAW,GAAG,SAAS,GAAG,iBAAiB,GAAG,SAAS,GAAG,YAAY,CAAC;CACxG;AAyHD,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,UAAU,EAAE,CAG/F;AA6FD,wBAAgB,0BAA0B,CAAC,WAAW,EAAE,QAAQ,CAAC,MAAM,CAAC,GAAG,MAAM,EAAE,CAMlF;AAgGD,wBAAgB,YAAY,CAAC,OAAO,EAAE,UAAU,EAAE,GAAG,IAAI,CAIxD;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAQzD;AAED;;;;;;;;;GASG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAkBzD"}
|