@nx/js 0.0.0-pr-22179-271588f

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 (204) hide show
  1. package/LICENSE +22 -0
  2. package/README.md +68 -0
  3. package/babel.d.ts +13 -0
  4. package/babel.js +91 -0
  5. package/executors.json +32 -0
  6. package/generators.json +46 -0
  7. package/migrations.json +159 -0
  8. package/package.json +76 -0
  9. package/plugins/jest/local-registry.d.ts +1 -0
  10. package/plugins/jest/local-registry.js +4 -0
  11. package/src/executors/node/lib/kill-tree.d.ts +2 -0
  12. package/src/executors/node/lib/kill-tree.js +114 -0
  13. package/src/executors/node/node-with-require-overrides.d.ts +7 -0
  14. package/src/executors/node/node-with-require-overrides.js +21 -0
  15. package/src/executors/node/node.impl.d.ts +7 -0
  16. package/src/executors/node/node.impl.js +288 -0
  17. package/src/executors/node/schema.d.ts +18 -0
  18. package/src/executors/node/schema.json +92 -0
  19. package/src/executors/release-publish/format-bytes.d.ts +1 -0
  20. package/src/executors/release-publish/format-bytes.js +28 -0
  21. package/src/executors/release-publish/log-tar.d.ts +1 -0
  22. package/src/executors/release-publish/log-tar.js +68 -0
  23. package/src/executors/release-publish/release-publish.impl.d.ts +5 -0
  24. package/src/executors/release-publish/release-publish.impl.js +198 -0
  25. package/src/executors/release-publish/schema.d.ts +8 -0
  26. package/src/executors/release-publish/schema.json +26 -0
  27. package/src/executors/swc/schema.json +154 -0
  28. package/src/executors/swc/swc.impl.d.ts +10 -0
  29. package/src/executors/swc/swc.impl.js +149 -0
  30. package/src/executors/tsc/lib/batch/build-task-info-per-tsconfig-map.d.ts +5 -0
  31. package/src/executors/tsc/lib/batch/build-task-info-per-tsconfig-map.js +62 -0
  32. package/src/executors/tsc/lib/batch/index.d.ts +4 -0
  33. package/src/executors/tsc/lib/batch/index.js +7 -0
  34. package/src/executors/tsc/lib/batch/normalize-tasks-options.d.ts +3 -0
  35. package/src/executors/tsc/lib/batch/normalize-tasks-options.js +14 -0
  36. package/src/executors/tsc/lib/batch/types.d.ts +17 -0
  37. package/src/executors/tsc/lib/batch/types.js +2 -0
  38. package/src/executors/tsc/lib/batch/watch.d.ts +3 -0
  39. package/src/executors/tsc/lib/batch/watch.js +56 -0
  40. package/src/executors/tsc/lib/get-custom-transformers-factory.d.ts +3 -0
  41. package/src/executors/tsc/lib/get-custom-transformers-factory.js +13 -0
  42. package/src/executors/tsc/lib/get-task-options.d.ts +3 -0
  43. package/src/executors/tsc/lib/get-task-options.js +34 -0
  44. package/src/executors/tsc/lib/get-tsconfig.d.ts +4 -0
  45. package/src/executors/tsc/lib/get-tsconfig.js +86 -0
  46. package/src/executors/tsc/lib/index.d.ts +4 -0
  47. package/src/executors/tsc/lib/index.js +7 -0
  48. package/src/executors/tsc/lib/normalize-options.d.ts +2 -0
  49. package/src/executors/tsc/lib/normalize-options.js +39 -0
  50. package/src/executors/tsc/lib/typescript-compilation.d.ts +29 -0
  51. package/src/executors/tsc/lib/typescript-compilation.js +203 -0
  52. package/src/executors/tsc/lib/typescript-diagnostic-reporters.d.ts +3 -0
  53. package/src/executors/tsc/lib/typescript-diagnostic-reporters.js +37 -0
  54. package/src/executors/tsc/schema.json +163 -0
  55. package/src/executors/tsc/tsc.batch-impl.d.ts +5 -0
  56. package/src/executors/tsc/tsc.batch-impl.js +180 -0
  57. package/src/executors/tsc/tsc.impl.d.ts +7 -0
  58. package/src/executors/tsc/tsc.impl.js +97 -0
  59. package/src/executors/verdaccio/schema.d.ts +7 -0
  60. package/src/executors/verdaccio/schema.json +35 -0
  61. package/src/executors/verdaccio/verdaccio.impl.d.ts +12 -0
  62. package/src/executors/verdaccio/verdaccio.impl.js +220 -0
  63. package/src/generators/convert-to-swc/convert-to-swc.d.ts +4 -0
  64. package/src/generators/convert-to-swc/convert-to-swc.js +59 -0
  65. package/src/generators/convert-to-swc/schema.d.ts +4 -0
  66. package/src/generators/convert-to-swc/schema.json +36 -0
  67. package/src/generators/init/files/__fileName__ +20 -0
  68. package/src/generators/init/init.d.ts +4 -0
  69. package/src/generators/init/init.js +114 -0
  70. package/src/generators/init/schema.d.ts +7 -0
  71. package/src/generators/init/schema.json +36 -0
  72. package/src/generators/library/files/jest-config/jest.config.__ext__ +30 -0
  73. package/src/generators/library/files/lib/src/index.ts__tmpl__ +1 -0
  74. package/src/generators/library/files/lib/src/lib/__fileName__.spec.ts__tmpl__ +7 -0
  75. package/src/generators/library/files/lib/src/lib/__fileName__.ts__tmpl__ +3 -0
  76. package/src/generators/library/files/lib/tsconfig.lib.json__tmpl__ +14 -0
  77. package/src/generators/library/files/readme/README.md +19 -0
  78. package/src/generators/library/library.d.ts +16 -0
  79. package/src/generators/library/library.js +751 -0
  80. package/src/generators/library/schema.json +151 -0
  81. package/src/generators/release-version/release-version.d.ts +5 -0
  82. package/src/generators/release-version/release-version.js +390 -0
  83. package/src/generators/release-version/schema.d.ts +1 -0
  84. package/src/generators/release-version/schema.json +67 -0
  85. package/src/generators/release-version/test-utils/create-workspace-with-package-dependencies.d.ts +16 -0
  86. package/src/generators/release-version/test-utils/create-workspace-with-package-dependencies.js +40 -0
  87. package/src/generators/release-version/utils/package.d.ts +12 -0
  88. package/src/generators/release-version/utils/package.js +34 -0
  89. package/src/generators/release-version/utils/resolve-local-package-dependencies.d.ts +12 -0
  90. package/src/generators/release-version/utils/resolve-local-package-dependencies.js +78 -0
  91. package/src/generators/release-version/utils/resolve-version-spec.d.ts +1 -0
  92. package/src/generators/release-version/utils/resolve-version-spec.js +29 -0
  93. package/src/generators/release-version/utils/update-lock-file.d.ts +5 -0
  94. package/src/generators/release-version/utils/update-lock-file.js +105 -0
  95. package/src/generators/setup-build/generator.d.ts +4 -0
  96. package/src/generators/setup-build/generator.js +142 -0
  97. package/src/generators/setup-build/schema.d.ts +7 -0
  98. package/src/generators/setup-build/schema.json +42 -0
  99. package/src/generators/setup-verdaccio/files/config.yml +28 -0
  100. package/src/generators/setup-verdaccio/generator.d.ts +4 -0
  101. package/src/generators/setup-verdaccio/generator.js +56 -0
  102. package/src/generators/setup-verdaccio/schema.d.ts +3 -0
  103. package/src/generators/setup-verdaccio/schema.json +16 -0
  104. package/src/index.d.ts +17 -0
  105. package/src/index.js +28 -0
  106. package/src/internal.d.ts +4 -0
  107. package/src/internal.js +15 -0
  108. package/src/migrations/update-15-8-0/rename-swcrc-config.d.ts +2 -0
  109. package/src/migrations/update-15-8-0/rename-swcrc-config.js +77 -0
  110. package/src/migrations/update-16-0-0-add-nx-packages/update-16-0-0-add-nx-packages.d.ts +2 -0
  111. package/src/migrations/update-16-0-0-add-nx-packages/update-16-0-0-add-nx-packages.js +9 -0
  112. package/src/migrations/update-16-6-0/explicitly-set-projects-to-update-buildable-deps.d.ts +2 -0
  113. package/src/migrations/update-16-6-0/explicitly-set-projects-to-update-buildable-deps.js +34 -0
  114. package/src/migrations/update-16-8-2/update-swcrc.d.ts +2 -0
  115. package/src/migrations/update-16-8-2/update-swcrc.js +23 -0
  116. package/src/migrations/update-17-0-0/remove-deprecated-build-options.d.ts +6 -0
  117. package/src/migrations/update-17-0-0/remove-deprecated-build-options.js +30 -0
  118. package/src/plugins/jest/start-local-registry.d.ts +12 -0
  119. package/src/plugins/jest/start-local-registry.js +63 -0
  120. package/src/plugins/rollup/type-definitions.d.ts +8 -0
  121. package/src/plugins/rollup/type-definitions.js +48 -0
  122. package/src/utils/add-babel-inputs.d.ts +3 -0
  123. package/src/utils/add-babel-inputs.js +23 -0
  124. package/src/utils/add-local-registry-scripts.d.ts +5 -0
  125. package/src/utils/add-local-registry-scripts.js +77 -0
  126. package/src/utils/assets/assets.d.ts +10 -0
  127. package/src/utils/assets/assets.js +36 -0
  128. package/src/utils/assets/copy-assets-handler.d.ts +32 -0
  129. package/src/utils/assets/copy-assets-handler.js +154 -0
  130. package/src/utils/assets/index.d.ts +16 -0
  131. package/src/utils/assets/index.js +27 -0
  132. package/src/utils/buildable-libs-utils.d.ts +43 -0
  133. package/src/utils/buildable-libs-utils.js +375 -0
  134. package/src/utils/check-dependencies.d.ts +8 -0
  135. package/src/utils/check-dependencies.js +23 -0
  136. package/src/utils/code-frames/highlight.d.ts +1 -0
  137. package/src/utils/code-frames/highlight.js +86 -0
  138. package/src/utils/code-frames/identifiers.d.ts +5 -0
  139. package/src/utils/code-frames/identifiers.js +52 -0
  140. package/src/utils/compiler-helper-dependency.d.ts +18 -0
  141. package/src/utils/compiler-helper-dependency.js +120 -0
  142. package/src/utils/find-npm-dependencies.d.ts +9 -0
  143. package/src/utils/find-npm-dependencies.js +140 -0
  144. package/src/utils/generate-globs.d.ts +6 -0
  145. package/src/utils/generate-globs.js +80 -0
  146. package/src/utils/get-import-path.d.ts +5 -0
  147. package/src/utils/get-import-path.js +14 -0
  148. package/src/utils/get-main-file-dir.d.ts +1 -0
  149. package/src/utils/get-main-file-dir.js +11 -0
  150. package/src/utils/inline.d.ts +19 -0
  151. package/src/utils/inline.js +210 -0
  152. package/src/utils/package-json/create-entry-points.d.ts +1 -0
  153. package/src/utils/package-json/create-entry-points.js +23 -0
  154. package/src/utils/package-json/get-npm-scope.d.ts +5 -0
  155. package/src/utils/package-json/get-npm-scope.js +16 -0
  156. package/src/utils/package-json/index.d.ts +13 -0
  157. package/src/utils/package-json/index.js +30 -0
  158. package/src/utils/package-json/update-package-json.d.ts +30 -0
  159. package/src/utils/package-json/update-package-json.js +179 -0
  160. package/src/utils/prettier.d.ts +6 -0
  161. package/src/utils/prettier.js +34 -0
  162. package/src/utils/schema.d.ts +87 -0
  163. package/src/utils/swc/add-swc-config.d.ts +3 -0
  164. package/src/utils/swc/add-swc-config.js +41 -0
  165. package/src/utils/swc/add-swc-dependencies.d.ts +3 -0
  166. package/src/utils/swc/add-swc-dependencies.js +18 -0
  167. package/src/utils/swc/compile-swc.d.ts +13 -0
  168. package/src/utils/swc/compile-swc.js +160 -0
  169. package/src/utils/swc/get-swcrc-path.d.ts +5 -0
  170. package/src/utils/swc/get-swcrc-path.js +15 -0
  171. package/src/utils/swc/inline.d.ts +2 -0
  172. package/src/utils/swc/inline.js +11 -0
  173. package/src/utils/typescript/__mocks__/plugin-a.d.ts +1 -0
  174. package/src/utils/typescript/__mocks__/plugin-a.js +5 -0
  175. package/src/utils/typescript/__mocks__/plugin-b.d.ts +1 -0
  176. package/src/utils/typescript/__mocks__/plugin-b.js +5 -0
  177. package/src/utils/typescript/add-tslib-dependencies.d.ts +2 -0
  178. package/src/utils/typescript/add-tslib-dependencies.js +11 -0
  179. package/src/utils/typescript/ast-utils.d.ts +32 -0
  180. package/src/utils/typescript/ast-utils.js +266 -0
  181. package/src/utils/typescript/compile-typescript-files.d.ts +10 -0
  182. package/src/utils/typescript/compile-typescript-files.js +43 -0
  183. package/src/utils/typescript/create-ts-config.d.ts +18 -0
  184. package/src/utils/typescript/create-ts-config.js +48 -0
  185. package/src/utils/typescript/ensure-typescript.d.ts +1 -0
  186. package/src/utils/typescript/ensure-typescript.js +9 -0
  187. package/src/utils/typescript/get-source-nodes.d.ts +2 -0
  188. package/src/utils/typescript/get-source-nodes.js +18 -0
  189. package/src/utils/typescript/load-ts-transformers.d.ts +5 -0
  190. package/src/utils/typescript/load-ts-transformers.js +62 -0
  191. package/src/utils/typescript/print-diagnostics.d.ts +1 -0
  192. package/src/utils/typescript/print-diagnostics.js +18 -0
  193. package/src/utils/typescript/run-type-check.d.ts +32 -0
  194. package/src/utils/typescript/run-type-check.js +128 -0
  195. package/src/utils/typescript/ts-config.d.ts +9 -0
  196. package/src/utils/typescript/ts-config.js +85 -0
  197. package/src/utils/typescript/tsnode-register.d.ts +1 -0
  198. package/src/utils/typescript/tsnode-register.js +24 -0
  199. package/src/utils/typescript/types.d.ts +18 -0
  200. package/src/utils/typescript/types.js +2 -0
  201. package/src/utils/versions.d.ts +17 -0
  202. package/src/utils/versions.js +21 -0
  203. package/src/utils/watch-for-single-file-changes.d.ts +1 -0
  204. package/src/utils/watch-for-single-file-changes.js +22 -0
@@ -0,0 +1,151 @@
1
+ {
2
+ "$schema": "https://json-schema.org/schema",
3
+ "$id": "NxTypescriptLibrary",
4
+ "cli": "nx",
5
+ "title": "Create a TypeScript Library",
6
+ "description": "Create a TypeScript Library.",
7
+ "type": "object",
8
+ "properties": {
9
+ "name": {
10
+ "type": "string",
11
+ "description": "Library name.",
12
+ "$default": {
13
+ "$source": "argv",
14
+ "index": 0
15
+ },
16
+ "x-prompt": "What name would you like to use for the library?",
17
+ "pattern": "(?:^@[a-zA-Z0-9-*~][a-zA-Z0-9-*._~]*\\/[a-zA-Z0-9-~][a-zA-Z0-9-._~]*|^[a-zA-Z][^:]*)$"
18
+ },
19
+ "directory": {
20
+ "type": "string",
21
+ "description": "A directory where the lib is placed.",
22
+ "x-priority": "important"
23
+ },
24
+ "projectNameAndRootFormat": {
25
+ "description": "Whether to generate the project name and root directory as provided (`as-provided`) or generate them composing their values and taking the configured layout into account (`derived`).",
26
+ "type": "string",
27
+ "enum": ["as-provided", "derived"]
28
+ },
29
+ "linter": {
30
+ "description": "The tool to use for running lint checks.",
31
+ "type": "string",
32
+ "enum": ["eslint", "none"],
33
+ "default": "eslint"
34
+ },
35
+ "unitTestRunner": {
36
+ "type": "string",
37
+ "enum": ["jest", "vitest", "none"],
38
+ "description": "Test runner to use for unit tests.",
39
+ "x-prompt": "Which unit test runner would you like to use?"
40
+ },
41
+ "tags": {
42
+ "type": "string",
43
+ "description": "Add tags to the library (used for linting)."
44
+ },
45
+ "skipFormat": {
46
+ "description": "Skip formatting files.",
47
+ "type": "boolean",
48
+ "default": false,
49
+ "x-priority": "internal"
50
+ },
51
+ "skipPackageJson": {
52
+ "description": "Do not add dependencies to `package.json`.",
53
+ "type": "boolean",
54
+ "default": false,
55
+ "x-priority": "internal"
56
+ },
57
+ "skipTsConfig": {
58
+ "type": "boolean",
59
+ "description": "Do not update tsconfig.json for development experience.",
60
+ "default": false,
61
+ "x-priority": "internal"
62
+ },
63
+ "includeBabelRc": {
64
+ "type": "boolean",
65
+ "description": "Include a .babelrc configuration to compile TypeScript files"
66
+ },
67
+ "testEnvironment": {
68
+ "type": "string",
69
+ "enum": ["jsdom", "node"],
70
+ "description": "The test environment to use if unitTestRunner is set to jest or vitest.",
71
+ "default": "node"
72
+ },
73
+ "pascalCaseFiles": {
74
+ "type": "boolean",
75
+ "description": "Use pascal case file names.",
76
+ "alias": "P",
77
+ "default": false
78
+ },
79
+ "js": {
80
+ "type": "boolean",
81
+ "description": "Generate JavaScript files rather than TypeScript files.",
82
+ "default": false
83
+ },
84
+ "strict": {
85
+ "type": "boolean",
86
+ "description": "Whether to enable tsconfig strict mode or not.",
87
+ "default": true
88
+ },
89
+ "publishable": {
90
+ "type": "boolean",
91
+ "default": false,
92
+ "description": "Configure the library ready for use with `nx release` (https://nx.dev/core-features/manage-releases).",
93
+ "x-priority": "important"
94
+ },
95
+ "importPath": {
96
+ "type": "string",
97
+ "description": "The library name used to import it, like @myorg/my-awesome-lib. Required for publishable library.",
98
+ "x-priority": "important"
99
+ },
100
+ "buildable": {
101
+ "type": "boolean",
102
+ "default": true,
103
+ "description": "Generate a buildable library.",
104
+ "x-deprecated": "Use the `bundler` option for greater control (swc, tsc, rollup, vite, esbuild, none)."
105
+ },
106
+ "setParserOptionsProject": {
107
+ "type": "boolean",
108
+ "description": "Whether or not to configure the ESLint `parserOptions.project` option. We do not do this by default for lint performance reasons.",
109
+ "default": false
110
+ },
111
+ "config": {
112
+ "type": "string",
113
+ "enum": ["workspace", "project", "npm-scripts"],
114
+ "default": "project",
115
+ "description": "Determines whether the project's executors should be configured in `workspace.json`, `project.json` or as npm scripts.",
116
+ "x-priority": "internal"
117
+ },
118
+ "compiler": {
119
+ "type": "string",
120
+ "enum": ["tsc", "swc"],
121
+ "default": "tsc",
122
+ "description": "The compiler used by the build and test targets",
123
+ "x-deprecated": "Use the `bundler` option for greater control (swc, tsc, rollup, vite, esbuild, none)."
124
+ },
125
+ "bundler": {
126
+ "description": "The bundler to use. Choosing 'none' means this library is not buildable.",
127
+ "type": "string",
128
+ "enum": ["swc", "tsc", "rollup", "vite", "esbuild", "none"],
129
+ "default": "tsc",
130
+ "x-prompt": "Which bundler would you like to use to build the library? Choose 'none' to skip build setup.",
131
+ "x-priority": "important"
132
+ },
133
+ "skipTypeCheck": {
134
+ "type": "boolean",
135
+ "description": "Whether to skip TypeScript type checking for SWC compiler.",
136
+ "default": false
137
+ },
138
+ "minimal": {
139
+ "type": "boolean",
140
+ "description": "Generate a library with a minimal setup. No README.md generated.",
141
+ "default": false
142
+ },
143
+ "simpleName": {
144
+ "description": "Don't include the directory in the generated file name.",
145
+ "type": "boolean",
146
+ "default": false
147
+ }
148
+ },
149
+ "required": ["name"],
150
+ "examplesFile": "../../../docs/library-examples.md"
151
+ }
@@ -0,0 +1,5 @@
1
+ import { Tree } from '@nx/devkit';
2
+ import { ReleaseVersionGeneratorResult } from 'nx/src/command-line/release/version';
3
+ import { ReleaseVersionGeneratorSchema } from './schema';
4
+ export declare function releaseVersionGenerator(tree: Tree, options: ReleaseVersionGeneratorSchema): Promise<ReleaseVersionGeneratorResult>;
5
+ export default releaseVersionGenerator;
@@ -0,0 +1,390 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.releaseVersionGenerator = void 0;
4
+ const devkit_1 = require("@nx/devkit");
5
+ const chalk = require("chalk");
6
+ const node_child_process_1 = require("node:child_process");
7
+ const node_path_1 = require("node:path");
8
+ const config_1 = require("nx/src/command-line/release/config/config");
9
+ const git_1 = require("nx/src/command-line/release/utils/git");
10
+ const resolve_semver_specifier_1 = require("nx/src/command-line/release/utils/resolve-semver-specifier");
11
+ const semver_1 = require("nx/src/command-line/release/utils/semver");
12
+ const version_1 = require("nx/src/command-line/release/version");
13
+ const utils_1 = require("nx/src/tasks-runner/utils");
14
+ const ora = require("ora");
15
+ const semver_2 = require("semver");
16
+ const resolve_local_package_dependencies_1 = require("./utils/resolve-local-package-dependencies");
17
+ const update_lock_file_1 = require("./utils/update-lock-file");
18
+ async function releaseVersionGenerator(tree, options) {
19
+ try {
20
+ const versionData = {};
21
+ // If the user provided a specifier, validate that it is valid semver or a relative semver keyword
22
+ if (options.specifier) {
23
+ if (!(0, semver_1.isValidSemverSpecifier)(options.specifier)) {
24
+ throw new Error(`The given version specifier "${options.specifier}" is not valid. You provide an exact version or a valid semver keyword such as "major", "minor", "patch", etc.`);
25
+ }
26
+ // The node semver library classes a leading `v` as valid, but we want to ensure it is not present in the final version
27
+ options.specifier = options.specifier.replace(/^v/, '');
28
+ }
29
+ if (options.versionPrefix &&
30
+ version_1.validReleaseVersionPrefixes.indexOf(options.versionPrefix) === -1) {
31
+ throw new Error(`Invalid value for version.generatorOptions.versionPrefix: "${options.versionPrefix}"
32
+
33
+ Valid values are: ${version_1.validReleaseVersionPrefixes
34
+ .map((s) => `"${s}"`)
35
+ .join(', ')}`);
36
+ }
37
+ if (options.firstRelease) {
38
+ // always use disk as a fallback for the first release
39
+ options.fallbackCurrentVersionResolver = 'disk';
40
+ }
41
+ const projects = options.projects;
42
+ const resolvePackageRoot = createResolvePackageRoot(options.packageRoot);
43
+ // Resolve any custom package roots for each project upfront as they will need to be reused during dependency resolution
44
+ const projectNameToPackageRootMap = new Map();
45
+ for (const project of projects) {
46
+ projectNameToPackageRootMap.set(project.name, resolvePackageRoot(project));
47
+ }
48
+ let currentVersion = undefined;
49
+ let currentVersionResolvedFromFallback = false;
50
+ // only used for options.currentVersionResolver === 'git-tag', but
51
+ // must be declared here in order to reuse it for additional projects
52
+ let latestMatchingGitTag = undefined;
53
+ // if specifier is undefined, then we haven't resolved it yet
54
+ // if specifier is null, then it has been resolved and no changes are necessary
55
+ let specifier = options.specifier
56
+ ? options.specifier
57
+ : undefined;
58
+ for (const project of projects) {
59
+ const projectName = project.name;
60
+ const packageRoot = projectNameToPackageRootMap.get(projectName);
61
+ if (!packageRoot) {
62
+ throw new Error(`The project "${projectName}" does not have a packageRoot available. Please report this issue on https://github.com/nrwl/nx`);
63
+ }
64
+ const packageJsonPath = (0, devkit_1.joinPathFragments)(packageRoot, 'package.json');
65
+ const workspaceRelativePackageJsonPath = (0, node_path_1.relative)(devkit_1.workspaceRoot, packageJsonPath);
66
+ const color = getColor(projectName);
67
+ const log = (msg) => {
68
+ console.log(color.instance.bold(projectName) + ' ' + msg);
69
+ };
70
+ if (!tree.exists(packageJsonPath)) {
71
+ throw new Error(`The project "${projectName}" does not have a package.json available at ${workspaceRelativePackageJsonPath}.
72
+
73
+ To fix this you will either need to add a package.json file at that location, or configure "release" within your nx.json to exclude "${projectName}" from the current release group, or amend the packageRoot configuration to point to where the package.json should be.`);
74
+ }
75
+ devkit_1.output.logSingleLine(`Running release version for project: ${color.instance.bold(project.name)}`);
76
+ const projectPackageJson = (0, devkit_1.readJson)(tree, packageJsonPath);
77
+ log(`🔍 Reading data for package "${projectPackageJson.name}" from ${workspaceRelativePackageJsonPath}`);
78
+ const { name: packageName, version: currentVersionFromDisk } = projectPackageJson;
79
+ switch (options.currentVersionResolver) {
80
+ case 'registry': {
81
+ const metadata = options.currentVersionResolverMetadata;
82
+ const registry = metadata?.registry ??
83
+ (await getNpmRegistry()) ??
84
+ 'https://registry.npmjs.org';
85
+ const tag = metadata?.tag ?? 'latest';
86
+ /**
87
+ * If the currentVersionResolver is set to registry, and the projects are not independent, we only want to make the request once for the whole batch of projects.
88
+ * For independent projects, we need to make a request for each project individually as they will most likely have different versions.
89
+ */
90
+ if (!currentVersion ||
91
+ options.releaseGroup.projectsRelationship === 'independent') {
92
+ const spinner = ora(`${Array.from(new Array(projectName.length + 3)).join(' ')}Resolving the current version for tag "${tag}" on ${registry}`);
93
+ spinner.color =
94
+ color.spinnerColor;
95
+ spinner.start();
96
+ try {
97
+ // Must be non-blocking async to allow spinner to render
98
+ currentVersion = await new Promise((resolve, reject) => {
99
+ (0, node_child_process_1.exec)(`npm view ${packageName} version --registry=${registry} --tag=${tag}`, (error, stdout, stderr) => {
100
+ if (error) {
101
+ return reject(error);
102
+ }
103
+ if (stderr) {
104
+ return reject(stderr);
105
+ }
106
+ return resolve(stdout.trim());
107
+ });
108
+ });
109
+ spinner.stop();
110
+ log(`📄 Resolved the current version as ${currentVersion} for tag "${tag}" from registry ${registry}`);
111
+ }
112
+ catch (e) {
113
+ spinner.stop();
114
+ if (options.fallbackCurrentVersionResolver === 'disk') {
115
+ log(`📄 Unable to resolve the current version from the registry ${registry}. Falling back to the version on disk of ${currentVersionFromDisk}`);
116
+ currentVersion = currentVersionFromDisk;
117
+ currentVersionResolvedFromFallback = true;
118
+ }
119
+ else {
120
+ throw new Error(`Unable to resolve the current version from the registry ${registry}. Please ensure that the package exists in the registry in order to use the "registry" currentVersionResolver. Alternatively, you can use the --first-release option or set "release.version.generatorOptions.fallbackCurrentVersionResolver" to "disk" in order to fallback to the version on disk when the registry lookup fails.`);
121
+ }
122
+ }
123
+ }
124
+ else {
125
+ if (currentVersionResolvedFromFallback) {
126
+ log(`📄 Using the current version ${currentVersion} already resolved from disk fallback.`);
127
+ }
128
+ else {
129
+ log(`📄 Using the current version ${currentVersion} already resolved from the registry ${registry}`);
130
+ }
131
+ }
132
+ break;
133
+ }
134
+ case 'disk':
135
+ currentVersion = currentVersionFromDisk;
136
+ log(`📄 Resolved the current version as ${currentVersion} from ${packageJsonPath}`);
137
+ break;
138
+ case 'git-tag': {
139
+ if (!currentVersion ||
140
+ // We always need to independently resolve the current version from git tag per project if the projects are independent
141
+ options.releaseGroup.projectsRelationship === 'independent') {
142
+ const releaseTagPattern = options.releaseGroup.releaseTagPattern;
143
+ latestMatchingGitTag = await (0, git_1.getLatestGitTagForPattern)(releaseTagPattern, {
144
+ projectName: project.name,
145
+ });
146
+ if (!latestMatchingGitTag) {
147
+ if (options.fallbackCurrentVersionResolver === 'disk') {
148
+ log(`📄 Unable to resolve the current version from git tag using pattern "${releaseTagPattern}". Falling back to the version on disk of ${currentVersionFromDisk}`);
149
+ currentVersion = currentVersionFromDisk;
150
+ currentVersionResolvedFromFallback = true;
151
+ }
152
+ else {
153
+ throw new Error(`No git tags matching pattern "${releaseTagPattern}" for project "${project.name}" were found. You will need to create an initial matching tag to use as a base for determining the next version. Alternatively, you can use the --first-release option or set "release.version.generatorOptions.fallbackCurrentVersionResolver" to "disk" in order to fallback to the version on disk when no matching git tags are found.`);
154
+ }
155
+ }
156
+ else {
157
+ currentVersion = latestMatchingGitTag.extractedVersion;
158
+ log(`📄 Resolved the current version as ${currentVersion} from git tag "${latestMatchingGitTag.tag}".`);
159
+ }
160
+ }
161
+ else {
162
+ if (currentVersionResolvedFromFallback) {
163
+ log(`📄 Using the current version ${currentVersion} already resolved from disk fallback.`);
164
+ }
165
+ else {
166
+ log(
167
+ // In this code path we know that latestMatchingGitTag is defined, because we are not relying on the fallbackCurrentVersionResolver, so we can safely use the non-null assertion operator
168
+ `📄 Using the current version ${currentVersion} already resolved from git tag "${latestMatchingGitTag.tag}".`);
169
+ }
170
+ }
171
+ break;
172
+ }
173
+ default:
174
+ throw new Error(`Invalid value for options.currentVersionResolver: ${options.currentVersionResolver}`);
175
+ }
176
+ if (options.specifier) {
177
+ log(`📄 Using the provided version specifier "${options.specifier}".`);
178
+ }
179
+ /**
180
+ * If we are versioning independently then we always need to determine the specifier for each project individually, except
181
+ * for the case where the user has provided an explicit specifier on the command.
182
+ *
183
+ * Otherwise, if versioning the projects together we only need to perform this logic if the specifier is still unset from
184
+ * previous iterations of the loop.
185
+ *
186
+ * NOTE: In the case that we have previously determined via conventional commits that no changes are necessary, the specifier
187
+ * will be explicitly set to `null`, so that is why we only check for `undefined` explicitly here.
188
+ */
189
+ if (specifier === undefined ||
190
+ (options.releaseGroup.projectsRelationship === 'independent' &&
191
+ !options.specifier)) {
192
+ const specifierSource = options.specifierSource;
193
+ switch (specifierSource) {
194
+ case 'conventional-commits': {
195
+ if (options.currentVersionResolver !== 'git-tag') {
196
+ throw new Error(`Invalid currentVersionResolver "${options.currentVersionResolver}" provided for release group "${options.releaseGroup.name}". Must be "git-tag" when "specifierSource" is "conventional-commits"`);
197
+ }
198
+ const affectedProjects = options.releaseGroup.projectsRelationship === 'independent'
199
+ ? [projectName]
200
+ : projects.map((p) => p.name);
201
+ // latestMatchingGitTag will be undefined if the current version was resolved from the disk fallback.
202
+ // In this case, we want to use the first commit as the ref to be consistent with the changelog command.
203
+ const previousVersionRef = latestMatchingGitTag
204
+ ? latestMatchingGitTag.tag
205
+ : options.fallbackCurrentVersionResolver === 'disk'
206
+ ? await (0, git_1.getFirstGitCommit)()
207
+ : undefined;
208
+ if (!previousVersionRef) {
209
+ // This should never happen since the checks above should catch if the current version couldn't be resolved
210
+ throw new Error(`Unable to determine previous version ref for the projects ${affectedProjects.join(', ')}. This is likely a bug in Nx.`);
211
+ }
212
+ specifier = await (0, resolve_semver_specifier_1.resolveSemverSpecifierFromConventionalCommits)(previousVersionRef, options.projectGraph, affectedProjects);
213
+ if (!specifier) {
214
+ log(`🚫 No changes were detected using git history and the conventional commits standard.`);
215
+ break;
216
+ }
217
+ // TODO: reevaluate this logic/workflow for independent projects
218
+ //
219
+ // Always assume that if the current version is a prerelease, then the next version should be a prerelease.
220
+ // Users must manually graduate from a prerelease to a release by providing an explicit specifier.
221
+ if ((0, semver_2.prerelease)(currentVersion ?? '')) {
222
+ specifier = 'prerelease';
223
+ log(`📄 Resolved the specifier as "${specifier}" since the current version is a prerelease.`);
224
+ }
225
+ else {
226
+ log(`📄 Resolved the specifier as "${specifier}" using git history and the conventional commits standard.`);
227
+ }
228
+ break;
229
+ }
230
+ case 'prompt': {
231
+ // Only add the release group name to the log if it is one set by the user, otherwise it is useless noise
232
+ const maybeLogReleaseGroup = (log) => {
233
+ if (options.releaseGroup.name === config_1.IMPLICIT_DEFAULT_RELEASE_GROUP) {
234
+ return log;
235
+ }
236
+ return `${log} within release group "${options.releaseGroup.name}"`;
237
+ };
238
+ if (options.releaseGroup.projectsRelationship === 'independent') {
239
+ specifier = await (0, resolve_semver_specifier_1.resolveSemverSpecifierFromPrompt)(`${maybeLogReleaseGroup(`What kind of change is this for project "${projectName}"`)}?`, `${maybeLogReleaseGroup(`What is the exact version for project "${projectName}"`)}?`);
240
+ }
241
+ else {
242
+ specifier = await (0, resolve_semver_specifier_1.resolveSemverSpecifierFromPrompt)(`${maybeLogReleaseGroup(`What kind of change is this for the ${projects.length} matched projects(s)`)}?`, `${maybeLogReleaseGroup(`What is the exact version for the ${projects.length} matched project(s)`)}?`);
243
+ }
244
+ break;
245
+ }
246
+ default:
247
+ throw new Error(`Invalid specifierSource "${specifierSource}" provided. Must be one of "prompt" or "conventional-commits"`);
248
+ }
249
+ }
250
+ // Resolve any local package dependencies for this project (before applying the new version or updating the versionData)
251
+ const localPackageDependencies = (0, resolve_local_package_dependencies_1.resolveLocalPackageDependencies)(tree, options.projectGraph, projects, projectNameToPackageRootMap, resolvePackageRoot,
252
+ // includeAll when the release group is independent, as we may be filtering to a specific subset of projects, but we still want to update their dependents
253
+ options.releaseGroup.projectsRelationship === 'independent');
254
+ const dependentProjects = Object.values(localPackageDependencies)
255
+ .flat()
256
+ .filter((localPackageDependency) => {
257
+ return localPackageDependency.target === project.name;
258
+ });
259
+ if (!currentVersion) {
260
+ throw new Error(`The current version for project "${project.name}" could not be resolved. Please report this on https://github.com/nrwl/nx`);
261
+ }
262
+ versionData[projectName] = {
263
+ currentVersion,
264
+ dependentProjects,
265
+ // @ts-ignore: The types will be updated in a future version of Nx
266
+ newVersion: null, // will stay as null in the final result in the case that no changes are detected
267
+ };
268
+ if (!specifier) {
269
+ log(`🚫 Skipping versioning "${projectPackageJson.name}" as no changes were detected.`);
270
+ continue;
271
+ }
272
+ const newVersion = (0, version_1.deriveNewSemverVersion)(currentVersion, specifier, options.preid);
273
+ versionData[projectName].newVersion = newVersion;
274
+ (0, devkit_1.writeJson)(tree, packageJsonPath, {
275
+ ...projectPackageJson,
276
+ version: newVersion,
277
+ });
278
+ log(`✍️ New version ${newVersion} written to ${workspaceRelativePackageJsonPath}`);
279
+ if (dependentProjects.length > 0) {
280
+ log(`✍️ Applying new version ${newVersion} to ${dependentProjects.length} ${dependentProjects.length > 1
281
+ ? 'packages which depend'
282
+ : 'package which depends'} on ${project.name}`);
283
+ }
284
+ for (const dependentProject of dependentProjects) {
285
+ const dependentPackageRoot = projectNameToPackageRootMap.get(dependentProject.source);
286
+ if (!dependentPackageRoot) {
287
+ throw new Error(`The dependent project "${dependentProject.source}" does not have a packageRoot available. Please report this issue on https://github.com/nrwl/nx`);
288
+ }
289
+ (0, devkit_1.updateJson)(tree, (0, devkit_1.joinPathFragments)(dependentPackageRoot, 'package.json'), (json) => {
290
+ // Auto (i.e.infer existing) by default
291
+ let versionPrefix = options.versionPrefix ?? 'auto';
292
+ // For auto, we infer the prefix based on the current version of the dependent
293
+ if (versionPrefix === 'auto') {
294
+ versionPrefix = ''; // we don't want to end up printing auto
295
+ const current = json[dependentProject.dependencyCollection][packageName];
296
+ if (current) {
297
+ const prefixMatch = current.match(/^[~^]/);
298
+ if (prefixMatch) {
299
+ versionPrefix = prefixMatch[0];
300
+ }
301
+ else {
302
+ versionPrefix = '';
303
+ }
304
+ }
305
+ }
306
+ json[dependentProject.dependencyCollection][packageName] = `${versionPrefix}${newVersion}`;
307
+ return json;
308
+ });
309
+ }
310
+ }
311
+ /**
312
+ * Ensure that formatting is applied so that version bump diffs are as minimal as possible
313
+ * within the context of the user's workspace.
314
+ */
315
+ await (0, devkit_1.formatFiles)(tree);
316
+ // Return the version data so that it can be leveraged by the overall version command
317
+ return {
318
+ data: versionData,
319
+ callback: async (tree, opts) => {
320
+ const cwd = tree.root;
321
+ const updatedFiles = await (0, update_lock_file_1.updateLockFile)(cwd, opts);
322
+ return updatedFiles;
323
+ },
324
+ };
325
+ }
326
+ catch (e) {
327
+ if (process.env.NX_VERBOSE_LOGGING === 'true') {
328
+ devkit_1.output.error({
329
+ title: e.message,
330
+ });
331
+ // Dump the full stack trace in verbose mode
332
+ console.error(e);
333
+ }
334
+ else {
335
+ devkit_1.output.error({
336
+ title: e.message,
337
+ });
338
+ }
339
+ process.exit(1);
340
+ }
341
+ }
342
+ exports.releaseVersionGenerator = releaseVersionGenerator;
343
+ exports.default = releaseVersionGenerator;
344
+ function createResolvePackageRoot(customPackageRoot) {
345
+ return (projectNode) => {
346
+ // Default to the project root if no custom packageRoot
347
+ if (!customPackageRoot) {
348
+ return projectNode.data.root;
349
+ }
350
+ return (0, utils_1.interpolate)(customPackageRoot, {
351
+ workspaceRoot: '',
352
+ projectRoot: projectNode.data.root,
353
+ projectName: projectNode.name,
354
+ });
355
+ };
356
+ }
357
+ const colors = [
358
+ { instance: chalk.green, spinnerColor: 'green' },
359
+ { instance: chalk.greenBright, spinnerColor: 'green' },
360
+ { instance: chalk.red, spinnerColor: 'red' },
361
+ { instance: chalk.redBright, spinnerColor: 'red' },
362
+ { instance: chalk.cyan, spinnerColor: 'cyan' },
363
+ { instance: chalk.cyanBright, spinnerColor: 'cyan' },
364
+ { instance: chalk.yellow, spinnerColor: 'yellow' },
365
+ { instance: chalk.yellowBright, spinnerColor: 'yellow' },
366
+ { instance: chalk.magenta, spinnerColor: 'magenta' },
367
+ { instance: chalk.magentaBright, spinnerColor: 'magenta' },
368
+ ];
369
+ function getColor(projectName) {
370
+ let code = 0;
371
+ for (let i = 0; i < projectName.length; ++i) {
372
+ code += projectName.charCodeAt(i);
373
+ }
374
+ const colorIndex = code % colors.length;
375
+ return colors[colorIndex];
376
+ }
377
+ async function getNpmRegistry() {
378
+ // Must be non-blocking async to allow spinner to render
379
+ return await new Promise((resolve, reject) => {
380
+ (0, node_child_process_1.exec)('npm config get registry', (error, stdout, stderr) => {
381
+ if (error) {
382
+ return reject(error);
383
+ }
384
+ if (stderr) {
385
+ return reject(stderr);
386
+ }
387
+ return resolve(stdout.trim());
388
+ });
389
+ });
390
+ }
@@ -0,0 +1 @@
1
+ export { ReleaseVersionGeneratorSchema } from 'nx/src/command-line/release/version';
@@ -0,0 +1,67 @@
1
+ {
2
+ "$schema": "https://json-schema.org/schema",
3
+ "$id": "NxJSReleaseVersionGenerator",
4
+ "cli": "nx",
5
+ "title": "Implementation details of `nx release version`",
6
+ "description": "DO NOT INVOKE DIRECTLY WITH `nx generate`. Use `nx release version` instead.",
7
+ "type": "object",
8
+ "properties": {
9
+ "projects": {
10
+ "type": "array",
11
+ "description": "The ProjectGraphProjectNodes being versioned in the current execution.",
12
+ "items": {
13
+ "type": "object"
14
+ }
15
+ },
16
+ "projectGraph": {
17
+ "type": "object",
18
+ "description": "ProjectGraph instance"
19
+ },
20
+ "specifier": {
21
+ "type": "string",
22
+ "description": "Exact version or semver keyword to apply to the selected release group. Overrides specifierSource."
23
+ },
24
+ "releaseGroup": {
25
+ "type": "object",
26
+ "description": "The resolved release group configuration, including name, relevant to all projects in the current execution."
27
+ },
28
+ "specifierSource": {
29
+ "type": "string",
30
+ "default": "prompt",
31
+ "description": "Which approach to use to determine the semver specifier used to bump the version of the project.",
32
+ "enum": ["prompt", "conventional-commits"]
33
+ },
34
+ "preid": {
35
+ "type": "string",
36
+ "description": "The optional prerelease identifier to apply to the version, in the case that specifier has been set to prerelease."
37
+ },
38
+ "packageRoot": {
39
+ "type": "string",
40
+ "description": "The root directory of the directory (containing a manifest file at its root) to publish. Defaults to the project root"
41
+ },
42
+ "currentVersionResolver": {
43
+ "type": "string",
44
+ "default": "disk",
45
+ "description": "Which approach to use to determine the current version of the project.",
46
+ "enum": ["registry", "disk", "git-tag"]
47
+ },
48
+ "currentVersionResolverMetadata": {
49
+ "type": "object",
50
+ "description": "Additional metadata to pass to the current version resolver.",
51
+ "default": {}
52
+ },
53
+ "skipLockFileUpdate": {
54
+ "type": "boolean",
55
+ "description": "Whether to skip updating the lock file after updating the version."
56
+ },
57
+ "installArgs": {
58
+ "type": "string",
59
+ "description": "Additional arguments to pass to the package manager when updating the lock file with an install command."
60
+ },
61
+ "installIgnoreScripts": {
62
+ "type": "boolean",
63
+ "description": "Whether to ignore install lifecycle scripts when updating the lock file with an install command."
64
+ }
65
+ },
66
+ "required": ["projects", "projectGraph", "releaseGroup"]
67
+ }
@@ -0,0 +1,16 @@
1
+ import { ProjectGraph, Tree } from '@nx/devkit';
2
+ interface ProjectAndPackageData {
3
+ [projectName: string]: {
4
+ projectRoot: string;
5
+ packageName: string;
6
+ version: string;
7
+ packageJsonPath: string;
8
+ localDependencies: {
9
+ projectName: string;
10
+ dependencyCollection: 'dependencies' | 'devDependencies' | 'optionalDependencies';
11
+ version: string;
12
+ }[];
13
+ };
14
+ }
15
+ export declare function createWorkspaceWithPackageDependencies(tree: Tree, projectAndPackageData: ProjectAndPackageData): ProjectGraph;
16
+ export {};