@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.
Files changed (92) hide show
  1. package/README.md +208 -83
  2. package/dist/cli.js +50 -20
  3. package/dist/lib/devenv.d.ts +6 -0
  4. package/dist/lib/devenv.d.ts.map +1 -0
  5. package/dist/lib/devenv.js +82 -0
  6. package/dist/lib/workspace.d.ts +5 -0
  7. package/dist/lib/workspace.d.ts.map +1 -1
  8. package/dist/lib/workspace.js +62 -5
  9. package/dist/monorepo/index.d.ts +6 -1
  10. package/dist/monorepo/index.d.ts.map +1 -1
  11. package/dist/monorepo/index.js +38 -5
  12. package/dist/monorepo/lockfile.d.ts +5 -1
  13. package/dist/monorepo/lockfile.d.ts.map +1 -1
  14. package/dist/monorepo/lockfile.js +45 -5
  15. package/dist/monorepo/managed-files.d.ts +1 -1
  16. package/dist/monorepo/managed-files.d.ts.map +1 -1
  17. package/dist/monorepo/managed-files.js +27 -10
  18. package/dist/monorepo/package-hygiene.js +1 -1
  19. package/dist/monorepo/package-policy.d.ts +3 -0
  20. package/dist/monorepo/package-policy.d.ts.map +1 -1
  21. package/dist/monorepo/package-policy.js +122 -19
  22. package/dist/monorepo/packed-manifest.d.ts +4 -0
  23. package/dist/monorepo/packed-manifest.d.ts.map +1 -0
  24. package/dist/monorepo/packed-manifest.js +51 -0
  25. package/dist/monorepo/packed-package.d.ts.map +1 -1
  26. package/dist/monorepo/packed-package.js +6 -0
  27. package/dist/monorepo/packs/index.d.ts.map +1 -1
  28. package/dist/monorepo/packs/index.js +4 -1
  29. package/dist/monorepo/publish-workflow.d.ts +86 -0
  30. package/dist/monorepo/publish-workflow.d.ts.map +1 -0
  31. package/dist/monorepo/publish-workflow.js +343 -0
  32. package/dist/nx-version-actions.cjs +25 -0
  33. package/dist/nx-version-actions.d.cts +6 -0
  34. package/dist/nx-version-actions.d.cts.map +1 -0
  35. package/dist/release/core.d.ts +50 -0
  36. package/dist/release/core.d.ts.map +1 -0
  37. package/dist/release/core.js +97 -0
  38. package/dist/release/github-release.d.ts +46 -0
  39. package/dist/release/github-release.d.ts.map +1 -0
  40. package/dist/release/github-release.js +97 -0
  41. package/dist/release/index.d.ts +14 -5
  42. package/dist/release/index.d.ts.map +1 -1
  43. package/dist/release/index.js +544 -109
  44. package/dist/release/npm-auth.d.ts +17 -0
  45. package/dist/release/npm-auth.d.ts.map +1 -0
  46. package/dist/release/npm-auth.js +51 -0
  47. package/dist/release/orchestration.d.ts +48 -0
  48. package/dist/release/orchestration.d.ts.map +1 -0
  49. package/dist/release/orchestration.js +105 -0
  50. package/dist/release/publish-plan.d.ts +17 -0
  51. package/dist/release/publish-plan.d.ts.map +1 -0
  52. package/dist/release/publish-plan.js +15 -0
  53. package/dist/release/retag-unpublished.d.ts +34 -0
  54. package/dist/release/retag-unpublished.d.ts.map +1 -0
  55. package/dist/release/retag-unpublished.js +77 -0
  56. package/managed/raw/tooling/git-hooks/pre-commit.sh +2 -7
  57. package/managed/templates/github/workflows/ci.yml +2 -0
  58. package/package.json +24 -3
  59. package/src/cli.ts +64 -25
  60. package/src/lib/devenv.test.ts +28 -0
  61. package/src/lib/devenv.ts +89 -0
  62. package/src/lib/workspace.ts +76 -5
  63. package/src/monorepo/__tests__/nx-version-actions.test.ts +75 -0
  64. package/src/monorepo/__tests__/publish-workflow.test.ts +315 -0
  65. package/src/monorepo/index.ts +45 -5
  66. package/src/monorepo/lockfile.ts +52 -7
  67. package/src/monorepo/managed-files.ts +42 -12
  68. package/src/monorepo/package-hygiene.ts +1 -1
  69. package/src/monorepo/package-policy.ts +134 -18
  70. package/src/monorepo/packed-manifest.ts +67 -0
  71. package/src/monorepo/packed-package.ts +7 -0
  72. package/src/monorepo/packs/index.ts +4 -0
  73. package/src/monorepo/publish-workflow.ts +430 -0
  74. package/src/nx-version-actions.cts +36 -0
  75. package/src/release/__tests__/core-properties.test.ts +149 -0
  76. package/src/release/__tests__/core-scenarios.test.ts +177 -0
  77. package/src/release/__tests__/core.test.ts +73 -0
  78. package/src/release/__tests__/fixture-repo.test.ts +305 -0
  79. package/src/release/__tests__/github-release.test.ts +144 -0
  80. package/src/release/__tests__/helpers/fixture-repo.ts +113 -0
  81. package/src/release/__tests__/npm-auth.test.ts +129 -0
  82. package/src/release/__tests__/orchestration.test.ts +202 -0
  83. package/src/release/__tests__/publish-plan.test.ts +61 -0
  84. package/src/release/__tests__/retag-unpublished.test.ts +160 -0
  85. package/src/release/core.ts +170 -0
  86. package/src/release/github-release.ts +134 -0
  87. package/src/release/index.ts +662 -116
  88. package/src/release/npm-auth.ts +122 -0
  89. package/src/release/orchestration.ts +186 -0
  90. package/src/release/publish-plan.ts +37 -0
  91. package/src/release/retag-unpublished.ts +122 -0
  92. 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
- changed = setMissingStringProperty(pkg.json, 'license', rootLicense) || changed;
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 = setStringProperty(repository, 'type', rootRepository.type) || changed;
21
- changed = setStringProperty(repository, 'url', rootRepository.url) || changed;
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 && !stringProperty(version, 'preVersionCommand')) {
122
- console.error('nx.json release.version.preVersionCommand must be defined');
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 = repository ? repositoryInfo(pkg.json) : null;
162
- if (!rootRepository || !packageRepository || packageRepository.url !== rootRepository.url) {
163
- console.error(`${pkg.path}: public package repository.url must match root package.json repository.url`);
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":"AASA,wBAAsB,4BAA4B,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAMhF"}
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":"AAiBA,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;AAuDD,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
+ {"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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"}