@smoothbricks/cli 0.1.0 → 0.1.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 +208 -83
- package/dist/cli.js +50 -20
- package/dist/lib/devenv.d.ts +6 -0
- package/dist/lib/devenv.d.ts.map +1 -0
- package/dist/lib/devenv.js +82 -0
- package/dist/lib/workspace.d.ts +5 -0
- package/dist/lib/workspace.d.ts.map +1 -1
- package/dist/lib/workspace.js +62 -5
- package/dist/monorepo/index.d.ts +6 -1
- package/dist/monorepo/index.d.ts.map +1 -1
- package/dist/monorepo/index.js +38 -5
- package/dist/monorepo/lockfile.d.ts +5 -1
- package/dist/monorepo/lockfile.d.ts.map +1 -1
- package/dist/monorepo/lockfile.js +45 -5
- package/dist/monorepo/managed-files.d.ts +1 -1
- package/dist/monorepo/managed-files.d.ts.map +1 -1
- package/dist/monorepo/managed-files.js +27 -10
- package/dist/monorepo/package-hygiene.js +1 -1
- package/dist/monorepo/package-policy.d.ts +3 -0
- package/dist/monorepo/package-policy.d.ts.map +1 -1
- package/dist/monorepo/package-policy.js +122 -19
- package/dist/monorepo/packed-manifest.d.ts +4 -0
- package/dist/monorepo/packed-manifest.d.ts.map +1 -0
- package/dist/monorepo/packed-manifest.js +51 -0
- package/dist/monorepo/packed-package.d.ts.map +1 -1
- package/dist/monorepo/packed-package.js +6 -0
- package/dist/monorepo/packs/index.d.ts.map +1 -1
- package/dist/monorepo/packs/index.js +4 -1
- package/dist/monorepo/publish-workflow.d.ts +86 -0
- package/dist/monorepo/publish-workflow.d.ts.map +1 -0
- package/dist/monorepo/publish-workflow.js +343 -0
- package/dist/nx-version-actions.cjs +25 -0
- package/dist/nx-version-actions.d.cts +6 -0
- package/dist/nx-version-actions.d.cts.map +1 -0
- package/dist/release/core.d.ts +50 -0
- package/dist/release/core.d.ts.map +1 -0
- package/dist/release/core.js +97 -0
- package/dist/release/github-release.d.ts +46 -0
- package/dist/release/github-release.d.ts.map +1 -0
- package/dist/release/github-release.js +97 -0
- package/dist/release/index.d.ts +14 -5
- package/dist/release/index.d.ts.map +1 -1
- package/dist/release/index.js +544 -109
- package/dist/release/npm-auth.d.ts +17 -0
- package/dist/release/npm-auth.d.ts.map +1 -0
- package/dist/release/npm-auth.js +51 -0
- package/dist/release/orchestration.d.ts +48 -0
- package/dist/release/orchestration.d.ts.map +1 -0
- package/dist/release/orchestration.js +105 -0
- package/dist/release/publish-plan.d.ts +17 -0
- package/dist/release/publish-plan.d.ts.map +1 -0
- package/dist/release/publish-plan.js +15 -0
- package/dist/release/retag-unpublished.d.ts +34 -0
- package/dist/release/retag-unpublished.d.ts.map +1 -0
- package/dist/release/retag-unpublished.js +77 -0
- package/managed/raw/tooling/git-hooks/pre-commit.sh +2 -7
- package/managed/templates/github/workflows/ci.yml +2 -0
- package/package.json +24 -3
- package/src/cli.ts +64 -25
- package/src/lib/devenv.test.ts +28 -0
- package/src/lib/devenv.ts +89 -0
- package/src/lib/workspace.ts +76 -5
- package/src/monorepo/__tests__/nx-version-actions.test.ts +75 -0
- package/src/monorepo/__tests__/publish-workflow.test.ts +315 -0
- package/src/monorepo/index.ts +45 -5
- package/src/monorepo/lockfile.ts +52 -7
- package/src/monorepo/managed-files.ts +42 -12
- package/src/monorepo/package-hygiene.ts +1 -1
- package/src/monorepo/package-policy.ts +134 -18
- package/src/monorepo/packed-manifest.ts +67 -0
- package/src/monorepo/packed-package.ts +7 -0
- package/src/monorepo/packs/index.ts +4 -0
- package/src/monorepo/publish-workflow.ts +430 -0
- package/src/nx-version-actions.cts +36 -0
- package/src/release/__tests__/core-properties.test.ts +149 -0
- package/src/release/__tests__/core-scenarios.test.ts +177 -0
- package/src/release/__tests__/core.test.ts +73 -0
- package/src/release/__tests__/fixture-repo.test.ts +305 -0
- package/src/release/__tests__/github-release.test.ts +144 -0
- package/src/release/__tests__/helpers/fixture-repo.ts +113 -0
- package/src/release/__tests__/npm-auth.test.ts +129 -0
- package/src/release/__tests__/orchestration.test.ts +202 -0
- package/src/release/__tests__/publish-plan.test.ts +61 -0
- package/src/release/__tests__/retag-unpublished.test.ts +160 -0
- package/src/release/core.ts +170 -0
- package/src/release/github-release.ts +134 -0
- package/src/release/index.ts +662 -116
- package/src/release/npm-auth.ts +122 -0
- package/src/release/orchestration.ts +186 -0
- package/src/release/publish-plan.ts +37 -0
- package/src/release/retag-unpublished.ts +122 -0
- package/managed/templates/github/workflows/publish.yml +0 -136
|
@@ -1,24 +1,30 @@
|
|
|
1
1
|
import { join } from 'node:path';
|
|
2
2
|
import { getOrCreateRecord, hasOwnString, isRecord, readJsonObject, recordProperty, requiredJsonObject, setMissingStringProperty, setStringProperty, stringProperty, writeJsonObject, } from '../lib/json.js';
|
|
3
|
-
import { getWorkspacePackages, listPackageJsonRecords, listPublicPackages, repositoryInfo, workspaceDependencyFields, } from '../lib/workspace.js';
|
|
3
|
+
import { getWorkspacePackages, listPackageJsonRecords, listPublicPackages, packageRepositoryInfo, repositoryInfo, sameRepositoryAfterNormalization, workspaceDependencyFields, } from '../lib/workspace.js';
|
|
4
|
+
export const SMOO_NX_VERSION_ACTIONS = '@smoothbricks/cli/nx-version-actions';
|
|
5
|
+
export const SMOO_NX_RELEASE_TAG_PATTERN = '{projectName}@{version}';
|
|
4
6
|
export function applyPublicPackageDefaults(root) {
|
|
5
7
|
const rootPackage = requiredJsonObject(join(root, 'package.json'));
|
|
6
8
|
const rootLicense = stringProperty(rootPackage, 'license');
|
|
7
9
|
const rootRepository = repositoryInfo(rootPackage);
|
|
8
|
-
if (!rootLicense) {
|
|
9
|
-
throw new Error('Root package.json must define license before public package defaults can be applied.');
|
|
10
|
-
}
|
|
11
|
-
if (!rootRepository) {
|
|
12
|
-
throw new Error('Root package.json must define repository.url before public package defaults can be applied.');
|
|
13
|
-
}
|
|
14
10
|
for (const pkg of listPublicPackages(root)) {
|
|
15
11
|
let changed = false;
|
|
16
|
-
|
|
12
|
+
const existingRepository = packageRepositoryInfo(pkg);
|
|
13
|
+
if (existingRepository &&
|
|
14
|
+
rootRepository &&
|
|
15
|
+
existingRepository.url === rootRepository.url &&
|
|
16
|
+
rootLicense &&
|
|
17
|
+
rootLicense !== 'UNLICENSED') {
|
|
18
|
+
changed = setMissingStringProperty(pkg.json, 'license', rootLicense) || changed;
|
|
19
|
+
}
|
|
17
20
|
const publishConfig = getOrCreateRecord(pkg.json, 'publishConfig');
|
|
18
21
|
changed = setStringProperty(publishConfig, 'access', 'public') || changed;
|
|
19
22
|
const repository = getOrCreateRecord(pkg.json, 'repository');
|
|
20
|
-
changed =
|
|
21
|
-
|
|
23
|
+
changed =
|
|
24
|
+
setStringProperty(repository, 'type', existingRepository?.type ?? rootRepository?.type ?? 'git') || changed;
|
|
25
|
+
if (existingRepository && !stringProperty(repository, 'url')) {
|
|
26
|
+
changed = setStringProperty(repository, 'url', existingRepository.url) || changed;
|
|
27
|
+
}
|
|
22
28
|
changed = setStringProperty(repository, 'directory', pkg.path.replaceAll('\\', '/')) || changed;
|
|
23
29
|
changed = normalizeExportConditionOrder(pkg.json.exports) || changed;
|
|
24
30
|
if (hasDevelopmentSourceExport(pkg.json.exports)) {
|
|
@@ -46,6 +52,44 @@ export function applyWorkspaceDependencyDefaults(root) {
|
|
|
46
52
|
}
|
|
47
53
|
}
|
|
48
54
|
}
|
|
55
|
+
export function applyNxReleaseDefaults(root) {
|
|
56
|
+
const nxJsonPath = join(root, 'nx.json');
|
|
57
|
+
const nxJson = requiredJsonObject(nxJsonPath);
|
|
58
|
+
let changed = false;
|
|
59
|
+
const release = getOrCreateRecord(nxJson, 'release');
|
|
60
|
+
changed = setStringProperty(release, 'projectsRelationship', 'independent') || changed;
|
|
61
|
+
const version = getOrCreateRecord(release, 'version');
|
|
62
|
+
changed = setStringProperty(version, 'specifierSource', 'conventional-commits') || changed;
|
|
63
|
+
changed = setStringProperty(version, 'currentVersionResolver', 'git-tag') || changed;
|
|
64
|
+
changed = setStringProperty(version, 'fallbackCurrentVersionResolver', 'disk') || changed;
|
|
65
|
+
changed = setStringProperty(version, 'versionActions', SMOO_NX_VERSION_ACTIONS) || changed;
|
|
66
|
+
if (delete version.preVersionCommand) {
|
|
67
|
+
changed = true;
|
|
68
|
+
}
|
|
69
|
+
const releaseTag = getOrCreateRecord(release, 'releaseTag');
|
|
70
|
+
changed = setStringProperty(releaseTag, 'pattern', SMOO_NX_RELEASE_TAG_PATTERN) || changed;
|
|
71
|
+
const changelog = getOrCreateRecord(release, 'changelog');
|
|
72
|
+
changed = setBooleanProperty(changelog, 'workspaceChangelog', false) || changed;
|
|
73
|
+
const projectChangelogs = getOrCreateRecord(changelog, 'projectChangelogs');
|
|
74
|
+
changed = setBooleanProperty(projectChangelogs, 'createRelease', false) || changed;
|
|
75
|
+
changed = setBooleanProperty(projectChangelogs, 'file', false) || changed;
|
|
76
|
+
const renderOptions = getOrCreateRecord(projectChangelogs, 'renderOptions');
|
|
77
|
+
if (typeof renderOptions.authors !== 'boolean') {
|
|
78
|
+
renderOptions.authors = true;
|
|
79
|
+
changed = true;
|
|
80
|
+
}
|
|
81
|
+
if (typeof renderOptions.applyUsernameToAuthors !== 'boolean') {
|
|
82
|
+
renderOptions.applyUsernameToAuthors = true;
|
|
83
|
+
changed = true;
|
|
84
|
+
}
|
|
85
|
+
if (changed) {
|
|
86
|
+
writeJsonObject(nxJsonPath, nxJson);
|
|
87
|
+
console.log('updated nx.json release config');
|
|
88
|
+
}
|
|
89
|
+
else {
|
|
90
|
+
console.log('unchanged nx.json release config');
|
|
91
|
+
}
|
|
92
|
+
}
|
|
49
93
|
export function validateRootPackagePolicy(root) {
|
|
50
94
|
const rootPackage = readJsonObject(join(root, 'package.json'));
|
|
51
95
|
if (!rootPackage) {
|
|
@@ -91,6 +135,10 @@ export function validateNxReleaseConfig(root) {
|
|
|
91
135
|
}
|
|
92
136
|
const release = recordProperty(nxJson, 'release');
|
|
93
137
|
const version = release ? recordProperty(release, 'version') : null;
|
|
138
|
+
const releaseTag = release ? recordProperty(release, 'releaseTag') : null;
|
|
139
|
+
const changelog = release ? recordProperty(release, 'changelog') : null;
|
|
140
|
+
const projectChangelogs = changelog ? recordProperty(changelog, 'projectChangelogs') : null;
|
|
141
|
+
const renderOptions = projectChangelogs ? recordProperty(projectChangelogs, 'renderOptions') : null;
|
|
94
142
|
let failures = 0;
|
|
95
143
|
if (!release) {
|
|
96
144
|
console.error('nx.json release config is missing');
|
|
@@ -118,8 +166,44 @@ export function validateNxReleaseConfig(root) {
|
|
|
118
166
|
console.error('nx.json release.version.fallbackCurrentVersionResolver must be disk');
|
|
119
167
|
failures++;
|
|
120
168
|
}
|
|
121
|
-
if (version &&
|
|
122
|
-
console.error(
|
|
169
|
+
if (version && stringProperty(version, 'versionActions') !== SMOO_NX_VERSION_ACTIONS) {
|
|
170
|
+
console.error(`nx.json release.version.versionActions must be ${SMOO_NX_VERSION_ACTIONS}`);
|
|
171
|
+
failures++;
|
|
172
|
+
}
|
|
173
|
+
if (version && stringProperty(version, 'preVersionCommand')) {
|
|
174
|
+
console.error('nx.json release.version.preVersionCommand must not be defined; smoo builds npm-missing packages before publish');
|
|
175
|
+
failures++;
|
|
176
|
+
}
|
|
177
|
+
if (!releaseTag) {
|
|
178
|
+
console.error('nx.json release.releaseTag config is missing');
|
|
179
|
+
failures++;
|
|
180
|
+
}
|
|
181
|
+
if (releaseTag && stringProperty(releaseTag, 'pattern') !== SMOO_NX_RELEASE_TAG_PATTERN) {
|
|
182
|
+
console.error(`nx.json release.releaseTag.pattern must be ${SMOO_NX_RELEASE_TAG_PATTERN}`);
|
|
183
|
+
failures++;
|
|
184
|
+
}
|
|
185
|
+
if (!changelog) {
|
|
186
|
+
console.error('nx.json release.changelog config is missing');
|
|
187
|
+
failures++;
|
|
188
|
+
}
|
|
189
|
+
if (changelog && changelog.workspaceChangelog !== false) {
|
|
190
|
+
console.error('nx.json release.changelog.workspaceChangelog must be false');
|
|
191
|
+
failures++;
|
|
192
|
+
}
|
|
193
|
+
if (!projectChangelogs) {
|
|
194
|
+
console.error('nx.json release.changelog.projectChangelogs config is missing');
|
|
195
|
+
failures++;
|
|
196
|
+
}
|
|
197
|
+
if (projectChangelogs && projectChangelogs.createRelease !== false) {
|
|
198
|
+
console.error('nx.json release.changelog.projectChangelogs.createRelease must be false');
|
|
199
|
+
failures++;
|
|
200
|
+
}
|
|
201
|
+
if (projectChangelogs && projectChangelogs.file !== false) {
|
|
202
|
+
console.error('nx.json release.changelog.projectChangelogs.file must be false');
|
|
203
|
+
failures++;
|
|
204
|
+
}
|
|
205
|
+
if (!renderOptions) {
|
|
206
|
+
console.error('nx.json release.changelog.projectChangelogs.renderOptions config is missing');
|
|
123
207
|
failures++;
|
|
124
208
|
}
|
|
125
209
|
return failures;
|
|
@@ -132,10 +216,6 @@ export function validatePublicTags(root) {
|
|
|
132
216
|
console.error(`${pkg.path}: private package must not have nx tag npm:public`);
|
|
133
217
|
failures++;
|
|
134
218
|
}
|
|
135
|
-
if (!pkg.private && !hasPublicTag) {
|
|
136
|
-
console.error(`${pkg.path}: public package must have nx tag npm:public`);
|
|
137
|
-
failures++;
|
|
138
|
-
}
|
|
139
219
|
}
|
|
140
220
|
if (failures > 0) {
|
|
141
221
|
return failures;
|
|
@@ -148,6 +228,10 @@ export function validatePublicPackageMetadata(root) {
|
|
|
148
228
|
const rootRepository = rootPackage ? repositoryInfo(rootPackage) : null;
|
|
149
229
|
let failures = 0;
|
|
150
230
|
for (const pkg of listPublicPackages(root)) {
|
|
231
|
+
if (pkg.private) {
|
|
232
|
+
console.error(`${pkg.path}: npm:public package must not be private`);
|
|
233
|
+
failures++;
|
|
234
|
+
}
|
|
151
235
|
if (!stringProperty(pkg.json, 'license')) {
|
|
152
236
|
console.error(`${pkg.path}: public package must define license`);
|
|
153
237
|
failures++;
|
|
@@ -158,9 +242,21 @@ export function validatePublicPackageMetadata(root) {
|
|
|
158
242
|
failures++;
|
|
159
243
|
}
|
|
160
244
|
const repository = recordProperty(pkg.json, 'repository');
|
|
161
|
-
const packageRepository =
|
|
162
|
-
if (!
|
|
163
|
-
console.error(`${pkg.path}: public package
|
|
245
|
+
const packageRepository = packageRepositoryInfo(pkg);
|
|
246
|
+
if (!packageRepository) {
|
|
247
|
+
console.error(`${pkg.path}: public package must define repository.url`);
|
|
248
|
+
failures++;
|
|
249
|
+
}
|
|
250
|
+
if (rootRepository &&
|
|
251
|
+
packageRepository &&
|
|
252
|
+
packageRepository.url !== rootRepository.url &&
|
|
253
|
+
sameRepositoryAfterNormalization(packageRepository.url, rootRepository.url)) {
|
|
254
|
+
console.error(`${pkg.path}: repository.url refers to the root repository but is not an exact match. ` +
|
|
255
|
+
`Use ${rootRepository.url}`);
|
|
256
|
+
failures++;
|
|
257
|
+
}
|
|
258
|
+
if (!repository || !stringProperty(repository, 'type')) {
|
|
259
|
+
console.error(`${pkg.path}: public package must define repository.type`);
|
|
164
260
|
failures++;
|
|
165
261
|
}
|
|
166
262
|
if (!repository || stringProperty(repository, 'directory') !== pkg.path.replaceAll('\\', '/')) {
|
|
@@ -220,6 +316,13 @@ function fixWorkspaceDependencyRanges(pkg, workspaceNames) {
|
|
|
220
316
|
}
|
|
221
317
|
return changed;
|
|
222
318
|
}
|
|
319
|
+
function setBooleanProperty(record, key, value) {
|
|
320
|
+
if (record[key] === value) {
|
|
321
|
+
return false;
|
|
322
|
+
}
|
|
323
|
+
record[key] = value;
|
|
324
|
+
return true;
|
|
325
|
+
}
|
|
223
326
|
function normalizeExportConditionOrder(value) {
|
|
224
327
|
if (!isRecord(value)) {
|
|
225
328
|
return false;
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { PackageInfo } from '../lib/workspace.js';
|
|
2
|
+
export declare function readPackedPackageJson(root: string, tarball: string, packageName: string): Promise<Record<string, unknown>>;
|
|
3
|
+
export declare function validatePackedWorkspaceDependencies(root: string, sourcePackage: PackageInfo, packedPackage: Record<string, unknown>): string[];
|
|
4
|
+
//# sourceMappingURL=packed-manifest.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"packed-manifest.d.ts","sourceRoot":"","sources":["../../src/monorepo/packed-manifest.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAGvD,wBAAsB,qBAAqB,CACzC,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAUlC;AAED,wBAAgB,mCAAmC,CACjD,IAAI,EAAE,MAAM,EACZ,aAAa,EAAE,WAAW,EAC1B,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACrC,MAAM,EAAE,CAoCV"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { $ } from 'bun';
|
|
2
|
+
import { isRecord, recordProperty } from '../lib/json.js';
|
|
3
|
+
import { decode } from '../lib/run.js';
|
|
4
|
+
import { getWorkspacePackages, workspaceDependencyFields } from '../lib/workspace.js';
|
|
5
|
+
export async function readPackedPackageJson(root, tarball, packageName) {
|
|
6
|
+
const result = await $ `tar -xOf ${tarball} package/package.json`.cwd(root).quiet().nothrow();
|
|
7
|
+
if (result.exitCode !== 0) {
|
|
8
|
+
throw new Error(`${packageName}: unable to inspect packed package.json.`);
|
|
9
|
+
}
|
|
10
|
+
const parsed = JSON.parse(decode(result.stdout));
|
|
11
|
+
if (!isRecord(parsed)) {
|
|
12
|
+
throw new Error(`${packageName}: packed package.json is not an object.`);
|
|
13
|
+
}
|
|
14
|
+
return parsed;
|
|
15
|
+
}
|
|
16
|
+
export function validatePackedWorkspaceDependencies(root, sourcePackage, packedPackage) {
|
|
17
|
+
const workspaceVersions = new Map(getWorkspacePackages(root).map((pkg) => [pkg.name, pkg.version]));
|
|
18
|
+
const failures = [];
|
|
19
|
+
for (const field of workspaceDependencyFields) {
|
|
20
|
+
const sourceDependencies = recordProperty(sourcePackage.json, field);
|
|
21
|
+
const packedDependencies = recordProperty(packedPackage, field);
|
|
22
|
+
if (!sourceDependencies && !packedDependencies) {
|
|
23
|
+
continue;
|
|
24
|
+
}
|
|
25
|
+
for (const [name, range] of Object.entries(packedDependencies ?? {})) {
|
|
26
|
+
if (typeof range === 'string' && range.startsWith('workspace:')) {
|
|
27
|
+
failures.push(`${sourcePackage.path}: packed ${field}.${name} must not contain ${range}`);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
if (!sourceDependencies) {
|
|
31
|
+
continue;
|
|
32
|
+
}
|
|
33
|
+
for (const [name, sourceRange] of Object.entries(sourceDependencies)) {
|
|
34
|
+
const workspaceVersion = workspaceVersions.get(name);
|
|
35
|
+
if (!workspaceVersion) {
|
|
36
|
+
continue;
|
|
37
|
+
}
|
|
38
|
+
const packedRange = packedDependencies?.[name];
|
|
39
|
+
if (sourceRange !== 'workspace:*') {
|
|
40
|
+
failures.push(`${sourcePackage.path}: source ${field}.${name} must use workspace:*`);
|
|
41
|
+
}
|
|
42
|
+
if (packedRange !== workspaceVersion) {
|
|
43
|
+
failures.push(`${sourcePackage.path}: packed ${field}.${name} must be ${workspaceVersion}, got ${formatRange(packedRange)}`);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
return failures;
|
|
48
|
+
}
|
|
49
|
+
function formatRange(value) {
|
|
50
|
+
return typeof value === 'string' ? value : '<missing>';
|
|
51
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"packed-package.d.ts","sourceRoot":"","sources":["../../src/monorepo/packed-package.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"packed-package.d.ts","sourceRoot":"","sources":["../../src/monorepo/packed-package.ts"],"names":[],"mappings":"AAUA,wBAAsB,4BAA4B,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAMhF"}
|
|
@@ -5,6 +5,7 @@ import { formatMessage } from 'publint/utils';
|
|
|
5
5
|
import { isRecord } from '../lib/json.js';
|
|
6
6
|
import { runStatus } from '../lib/run.js';
|
|
7
7
|
import { listPublicPackages } from '../lib/workspace.js';
|
|
8
|
+
import { readPackedPackageJson, validatePackedWorkspaceDependencies } from './packed-manifest.js';
|
|
8
9
|
export async function validatePackedPublicPackages(root) {
|
|
9
10
|
let failures = 0;
|
|
10
11
|
for (const pkg of listPublicPackages(root)) {
|
|
@@ -21,6 +22,11 @@ async function validatePackedPublicPackage(root, pkg) {
|
|
|
21
22
|
console.error(`${pkg.path}: publint ${message.type} ${message.code}: ${formatMessage(message, lint.pkg)}`);
|
|
22
23
|
failures++;
|
|
23
24
|
}
|
|
25
|
+
const packedPackage = await readPackedPackageJson(root, packed.path, pkg.name);
|
|
26
|
+
for (const message of validatePackedWorkspaceDependencies(root, pkg, packedPackage)) {
|
|
27
|
+
console.error(message);
|
|
28
|
+
failures++;
|
|
29
|
+
}
|
|
24
30
|
const attwArgs = [
|
|
25
31
|
packed.path,
|
|
26
32
|
'--format',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/monorepo/packs/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/monorepo/packs/index.ts"],"names":[],"mappings":"AAmBA,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,OAAO,CAAC;CACtB;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAyDD,wBAAsB,YAAY,CAAC,GAAG,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAItE;AAED,wBAAsB,gBAAgB,CAAC,GAAG,EAAE,eAAe,EAAE,OAAO,GAAE,mBAAwB,GAAG,OAAO,CAAC,MAAM,CAAC,CAgB/G"}
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import { chmodSync, existsSync, statSync } from 'node:fs';
|
|
2
2
|
import { join } from 'node:path';
|
|
3
|
+
import { validateBunLockfileVersions } from '../lockfile.js';
|
|
3
4
|
import { validateManagedFiles } from '../managed-files.js';
|
|
4
5
|
import { validateNxSync } from '../nx-sync.js';
|
|
5
6
|
import { fixPackageHygiene, validatePackageHygiene } from '../package-hygiene.js';
|
|
6
|
-
import { applyPublicPackageDefaults, applyWorkspaceDependencyDefaults, validateNxReleaseConfig, validatePublicPackageMetadata, validatePublicTags, validateRootPackagePolicy, validateWorkspaceDependencies, } from '../package-policy.js';
|
|
7
|
+
import { applyNxReleaseDefaults, applyPublicPackageDefaults, applyWorkspaceDependencyDefaults, validateNxReleaseConfig, validatePublicPackageMetadata, validatePublicTags, validateRootPackagePolicy, validateWorkspaceDependencies, } from '../package-policy.js';
|
|
7
8
|
import { validatePackedPublicPackages } from '../packed-package.js';
|
|
8
9
|
import { syncRootRuntimeVersions } from '../runtime.js';
|
|
9
10
|
const packs = [
|
|
@@ -11,6 +12,7 @@ const packs = [
|
|
|
11
12
|
name: 'core',
|
|
12
13
|
async init(ctx) {
|
|
13
14
|
ensureLocalSmooShim(ctx.root);
|
|
15
|
+
applyNxReleaseDefaults(ctx.root);
|
|
14
16
|
if (ctx.syncRuntime) {
|
|
15
17
|
await syncRootRuntimeVersions(ctx.root);
|
|
16
18
|
}
|
|
@@ -22,6 +24,7 @@ const packs = [
|
|
|
22
24
|
return (validateManagedFiles(ctx.root) +
|
|
23
25
|
validateRootPackagePolicy(ctx.root) +
|
|
24
26
|
validateNxReleaseConfig(ctx.root) +
|
|
27
|
+
validateBunLockfileVersions(ctx.root) +
|
|
25
28
|
(await validateNxSync(ctx.root)));
|
|
26
29
|
},
|
|
27
30
|
},
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
export type PublishWorkflowBump = 'auto' | 'patch' | 'minor' | 'major' | 'prerelease';
|
|
2
|
+
export type PublishWorkflowCondition = 'version-mode-not-none' | 'failure' | 'always';
|
|
3
|
+
export type PublishWorkflowNxTarget = 'build' | 'lint' | 'test';
|
|
4
|
+
export declare enum PublishWorkflowStepKind {
|
|
5
|
+
Checkout = "checkout",
|
|
6
|
+
SetupDevenv = "setup-devenv",
|
|
7
|
+
ConfigureReleaseAuthor = "configure-release-author",
|
|
8
|
+
BuildSelfHostedCli = "build-self-hosted-cli",
|
|
9
|
+
RepairPendingReleases = "repair-pending-releases",
|
|
10
|
+
VersionRelease = "version-release",
|
|
11
|
+
CheckManagedMonorepoFiles = "check-managed-monorepo-files",
|
|
12
|
+
Build = "build",
|
|
13
|
+
Lint = "lint",
|
|
14
|
+
UnitTests = "unit-tests",
|
|
15
|
+
UploadTraceDbs = "upload-trace-dbs",
|
|
16
|
+
ValidateMonorepoConfig = "validate-monorepo-config",
|
|
17
|
+
PublishRelease = "publish-release",
|
|
18
|
+
SaveNixDevenv = "save-nix-devenv"
|
|
19
|
+
}
|
|
20
|
+
export interface PublishWorkflowStep {
|
|
21
|
+
kind: PublishWorkflowStepKind;
|
|
22
|
+
name: string;
|
|
23
|
+
number: number;
|
|
24
|
+
id?: string;
|
|
25
|
+
condition?: PublishWorkflowCondition;
|
|
26
|
+
nxTarget?: PublishWorkflowNxTarget;
|
|
27
|
+
needsNodeAuthToken?: boolean;
|
|
28
|
+
}
|
|
29
|
+
export interface PublishWorkflowDefinition {
|
|
30
|
+
steps: PublishWorkflowStep[];
|
|
31
|
+
}
|
|
32
|
+
export interface PublishWorkflowDefinitionOptions {
|
|
33
|
+
repoName?: string;
|
|
34
|
+
}
|
|
35
|
+
export interface PublishWorkflowInputs {
|
|
36
|
+
bump: PublishWorkflowBump;
|
|
37
|
+
dryRun: boolean;
|
|
38
|
+
}
|
|
39
|
+
export interface PublishWorkflowVersionOutputs {
|
|
40
|
+
mode: 'new' | 'none';
|
|
41
|
+
projects: string[];
|
|
42
|
+
}
|
|
43
|
+
export interface PublishWorkflowSetupOutputs {
|
|
44
|
+
nixCacheHit: string;
|
|
45
|
+
devenvCacheHit: string;
|
|
46
|
+
}
|
|
47
|
+
export interface PublishWorkflowCallbacks {
|
|
48
|
+
checkout(): Promise<void>;
|
|
49
|
+
setupDevenv(): Promise<PublishWorkflowSetupOutputs>;
|
|
50
|
+
configureReleaseAuthor(): Promise<void>;
|
|
51
|
+
buildSelfHostedCli(): Promise<void>;
|
|
52
|
+
repairPendingReleases(input: {
|
|
53
|
+
dryRun: boolean;
|
|
54
|
+
nodeAuthToken: boolean;
|
|
55
|
+
}): Promise<void>;
|
|
56
|
+
versionRelease(input: {
|
|
57
|
+
bump: PublishWorkflowBump;
|
|
58
|
+
dryRun: boolean;
|
|
59
|
+
}): Promise<PublishWorkflowVersionOutputs>;
|
|
60
|
+
checkManagedMonorepoFiles(): Promise<void>;
|
|
61
|
+
nxRunMany(input: {
|
|
62
|
+
target: PublishWorkflowNxTarget;
|
|
63
|
+
projects: string[];
|
|
64
|
+
}): Promise<void>;
|
|
65
|
+
uploadTraceDbs(): Promise<void>;
|
|
66
|
+
validateMonorepoConfig(): Promise<void>;
|
|
67
|
+
publishRelease(input: {
|
|
68
|
+
bump: PublishWorkflowBump;
|
|
69
|
+
dryRun: boolean;
|
|
70
|
+
nodeAuthToken: boolean;
|
|
71
|
+
}): Promise<void>;
|
|
72
|
+
saveNixDevenv(input: PublishWorkflowSetupOutputs): Promise<void>;
|
|
73
|
+
}
|
|
74
|
+
export interface PublishWorkflowRunContext {
|
|
75
|
+
inputs: PublishWorkflowInputs;
|
|
76
|
+
nodeAuthToken: boolean;
|
|
77
|
+
callbacks: PublishWorkflowCallbacks;
|
|
78
|
+
}
|
|
79
|
+
export interface PublishWorkflowRunResult {
|
|
80
|
+
version: PublishWorkflowVersionOutputs;
|
|
81
|
+
failed: boolean;
|
|
82
|
+
}
|
|
83
|
+
export declare function definePublishWorkflow(options?: PublishWorkflowDefinitionOptions): PublishWorkflowDefinition;
|
|
84
|
+
export declare function runPublishWorkflow(workflow: PublishWorkflowDefinition, context: PublishWorkflowRunContext): Promise<PublishWorkflowRunResult>;
|
|
85
|
+
export declare function renderPublishWorkflowYaml(options?: PublishWorkflowDefinitionOptions): string;
|
|
86
|
+
//# sourceMappingURL=publish-workflow.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"publish-workflow.d.ts","sourceRoot":"","sources":["../../src/monorepo/publish-workflow.ts"],"names":[],"mappings":"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"}
|