@nx/js 0.0.0-pr-30418-d6cd6b6 → 0.0.0-pr-30516-4c8bfff
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/migrations.json +0 -9
- package/package.json +3 -3
- package/src/generators/library/library.js +15 -4
- package/src/generators/library/utils/add-release-config.d.ts +1 -1
- package/src/generators/library/utils/add-release-config.js +7 -21
- package/src/generators/release-version/release-version.d.ts +1 -1
- package/src/generators/release-version/release-version.js +11 -12
- package/src/generators/release-version/schema.d.ts +1 -1
- package/src/generators/release-version/schema.json +4 -23
- package/src/generators/release-version/utils/update-lock-file.d.ts +5 -0
- package/src/{release → generators/release-version}/utils/update-lock-file.js +9 -12
- package/src/plugins/typescript/plugin.js +42 -136
- package/src/plugins/typescript/util.d.ts +4 -5
- package/src/utils/buildable-libs-utils.d.ts +2 -0
- package/src/utils/buildable-libs-utils.js +33 -1
- package/src/utils/versions.d.ts +1 -1
- package/src/utils/versions.js +1 -1
- package/src/release/utils/update-lock-file.d.ts +0 -10
- package/src/release/version-actions.d.ts +0 -22
- package/src/release/version-actions.js +0 -189
package/migrations.json
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@nx/js",
|
|
3
|
-
"version": "0.0.0-pr-
|
|
3
|
+
"version": "0.0.0-pr-30516-4c8bfff",
|
|
4
4
|
"private": false,
|
|
5
5
|
"description": "The JS plugin for Nx contains executors and generators that provide the best experience for developing JavaScript and TypeScript projects. ",
|
|
6
6
|
"repository": {
|
|
@@ -39,8 +39,8 @@
|
|
|
39
39
|
"@babel/preset-env": "^7.23.2",
|
|
40
40
|
"@babel/preset-typescript": "^7.22.5",
|
|
41
41
|
"@babel/runtime": "^7.22.6",
|
|
42
|
-
"@nx/devkit": "0.0.0-pr-
|
|
43
|
-
"@nx/workspace": "0.0.0-pr-
|
|
42
|
+
"@nx/devkit": "0.0.0-pr-30516-4c8bfff",
|
|
43
|
+
"@nx/workspace": "0.0.0-pr-30516-4c8bfff",
|
|
44
44
|
"@zkochan/js-yaml": "0.0.7",
|
|
45
45
|
"babel-plugin-const-enum": "^1.0.1",
|
|
46
46
|
"babel-plugin-macros": "^3.1.0",
|
|
@@ -8,10 +8,8 @@ const project_name_and_root_utils_1 = require("@nx/devkit/src/generators/project
|
|
|
8
8
|
const prompt_1 = require("@nx/devkit/src/generators/prompt");
|
|
9
9
|
const target_defaults_utils_1 = require("@nx/devkit/src/generators/target-defaults-utils");
|
|
10
10
|
const log_show_project_command_1 = require("@nx/devkit/src/utils/log-show-project-command");
|
|
11
|
-
const use_legacy_versioning_1 = require("nx/src/command-line/release/config/use-legacy-versioning");
|
|
12
11
|
const path_1 = require("path");
|
|
13
12
|
const generator_prompts_1 = require("../../utils/generator-prompts");
|
|
14
|
-
const sort_fields_1 = require("../../utils/package-json/sort-fields");
|
|
15
13
|
const update_package_json_1 = require("../../utils/package-json/update-package-json");
|
|
16
14
|
const add_swc_config_1 = require("../../utils/swc/add-swc-config");
|
|
17
15
|
const add_swc_dependencies_1 = require("../../utils/swc/add-swc-dependencies");
|
|
@@ -23,6 +21,7 @@ const ts_config_1 = require("../../utils/typescript/ts-config");
|
|
|
23
21
|
const ts_solution_setup_1 = require("../../utils/typescript/ts-solution-setup");
|
|
24
22
|
const versions_1 = require("../../utils/versions");
|
|
25
23
|
const init_1 = require("../init/init");
|
|
24
|
+
const sort_fields_1 = require("../../utils/package-json/sort-fields");
|
|
26
25
|
const add_release_config_1 = require("./utils/add-release-config");
|
|
27
26
|
const defaultOutputDirectory = 'dist';
|
|
28
27
|
async function libraryGenerator(tree, schema) {
|
|
@@ -159,8 +158,8 @@ async function libraryGeneratorInternal(tree, schema) {
|
|
|
159
158
|
return (0, devkit_1.runTasksInSerial)(...tasks);
|
|
160
159
|
}
|
|
161
160
|
async function configureProject(tree, options) {
|
|
162
|
-
const nxJson = (0, devkit_1.readNxJson)(tree);
|
|
163
161
|
if (options.hasPlugin) {
|
|
162
|
+
const nxJson = (0, devkit_1.readNxJson)(tree);
|
|
164
163
|
(0, plugin_1.ensureProjectIsIncludedInPluginRegistrations)(nxJson, options.projectRoot, options.bundler === 'none' ? null : 'build');
|
|
165
164
|
(0, devkit_1.updateNxJson)(tree, nxJson);
|
|
166
165
|
}
|
|
@@ -218,7 +217,7 @@ async function configureProject(tree, options) {
|
|
|
218
217
|
await (0, add_release_config_1.addReleaseConfigForTsSolution)(tree, options.name, projectConfiguration);
|
|
219
218
|
}
|
|
220
219
|
else {
|
|
221
|
-
await (0, add_release_config_1.addReleaseConfigForNonTsSolution)(
|
|
220
|
+
await (0, add_release_config_1.addReleaseConfigForNonTsSolution)(tree, options.name, projectConfiguration, defaultOutputDirectory);
|
|
222
221
|
}
|
|
223
222
|
}
|
|
224
223
|
if (!options.useProjectJson) {
|
|
@@ -738,6 +737,12 @@ function createProjectTsConfigs(tree, options) {
|
|
|
738
737
|
json.references.push({
|
|
739
738
|
path: './tsconfig.lib.json',
|
|
740
739
|
});
|
|
740
|
+
// If using `tsc` to build, then we do not want a typecheck target that duplicates the work, since both run `tsc`.
|
|
741
|
+
// This applies to `@nx/js/typescript` plugin only.
|
|
742
|
+
if (options.bundler === 'tsc') {
|
|
743
|
+
json['nx'] ??= {};
|
|
744
|
+
json['nx'].addTypecheckTarget = false;
|
|
745
|
+
}
|
|
741
746
|
return json;
|
|
742
747
|
});
|
|
743
748
|
}
|
|
@@ -749,6 +754,12 @@ function createProjectTsConfigs(tree, options) {
|
|
|
749
754
|
include: [],
|
|
750
755
|
references: [{ path: './tsconfig.lib.json' }],
|
|
751
756
|
};
|
|
757
|
+
// If using `tsc` to build, then we do not want a typecheck target that duplicates the work, since both run `tsc`.
|
|
758
|
+
// This applies to `@nx/js/typescript` plugin only.
|
|
759
|
+
if (options.bundler === 'tsc') {
|
|
760
|
+
tsconfig['nx'] ??= {};
|
|
761
|
+
tsconfig['nx'].addTypecheckTarget = false;
|
|
762
|
+
}
|
|
752
763
|
(0, devkit_1.writeJson)(tree, (0, devkit_1.joinPathFragments)(options.projectRoot, 'tsconfig.json'), tsconfig);
|
|
753
764
|
// update root project tsconfig.json references with the new lib tsconfig
|
|
754
765
|
(0, devkit_1.updateJson)(tree, 'tsconfig.json', (json) => {
|
|
@@ -7,5 +7,5 @@ export declare function addReleaseConfigForTsSolution(tree: Tree, projectName: s
|
|
|
7
7
|
* Add release configuration for non-ts solution projects
|
|
8
8
|
* Add release option in project.json and add packageRoot to nx-release-publish target
|
|
9
9
|
*/
|
|
10
|
-
export declare function addReleaseConfigForNonTsSolution(
|
|
10
|
+
export declare function addReleaseConfigForNonTsSolution(tree: Tree, projectName: string, projectConfiguration: ProjectConfiguration, defaultOutputDirectory?: string): Promise<ProjectConfiguration>;
|
|
11
11
|
export declare function releaseTasks(tree: Tree): Promise<GeneratorCallback>;
|
|
@@ -91,7 +91,7 @@ async function addReleaseConfigForTsSolution(tree, projectName, projectConfigura
|
|
|
91
91
|
* Add release configuration for non-ts solution projects
|
|
92
92
|
* Add release option in project.json and add packageRoot to nx-release-publish target
|
|
93
93
|
*/
|
|
94
|
-
async function addReleaseConfigForNonTsSolution(
|
|
94
|
+
async function addReleaseConfigForNonTsSolution(tree, projectName, projectConfiguration, defaultOutputDirectory = 'dist') {
|
|
95
95
|
const packageRoot = (0, devkit_1.joinPathFragments)(defaultOutputDirectory, '{projectRoot}');
|
|
96
96
|
projectConfiguration.targets ??= {};
|
|
97
97
|
projectConfiguration.targets['nx-release-publish'] = {
|
|
@@ -99,31 +99,17 @@ async function addReleaseConfigForNonTsSolution(useLegacyVersioning, tree, proje
|
|
|
99
99
|
packageRoot,
|
|
100
100
|
},
|
|
101
101
|
};
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
packageRoot,
|
|
107
|
-
// using git tags to determine the current version is required here because
|
|
108
|
-
// the version in the package root is overridden with every build
|
|
109
|
-
currentVersionResolver: 'git-tag',
|
|
110
|
-
fallbackCurrentVersionResolver: 'disk',
|
|
111
|
-
},
|
|
112
|
-
},
|
|
113
|
-
};
|
|
114
|
-
}
|
|
115
|
-
else {
|
|
116
|
-
// TODO: re-evaluate this config in new versions
|
|
117
|
-
projectConfiguration.release = {
|
|
118
|
-
version: {
|
|
119
|
-
manifestRootsToUpdate: [packageRoot],
|
|
102
|
+
projectConfiguration.release = {
|
|
103
|
+
version: {
|
|
104
|
+
generatorOptions: {
|
|
105
|
+
packageRoot,
|
|
120
106
|
// using git tags to determine the current version is required here because
|
|
121
107
|
// the version in the package root is overridden with every build
|
|
122
108
|
currentVersionResolver: 'git-tag',
|
|
123
109
|
fallbackCurrentVersionResolver: 'disk',
|
|
124
110
|
},
|
|
125
|
-
}
|
|
126
|
-
}
|
|
111
|
+
},
|
|
112
|
+
};
|
|
127
113
|
await addReleaseConfigForTsSolution(tree, projectName, projectConfiguration);
|
|
128
114
|
return projectConfiguration;
|
|
129
115
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { Tree } from '@nx/devkit';
|
|
2
|
-
import { ReleaseVersionGeneratorResult } from 'nx/src/command-line/release/version
|
|
2
|
+
import { ReleaseVersionGeneratorResult } from 'nx/src/command-line/release/version';
|
|
3
3
|
import { ReleaseVersionGeneratorSchema } from './schema';
|
|
4
4
|
export declare function releaseVersionGenerator(tree: Tree, options: ReleaseVersionGeneratorSchema): Promise<ReleaseVersionGeneratorResult>;
|
|
5
5
|
export default releaseVersionGenerator;
|
|
@@ -11,15 +11,15 @@ const config_1 = require("nx/src/command-line/release/config/config");
|
|
|
11
11
|
const git_1 = require("nx/src/command-line/release/utils/git");
|
|
12
12
|
const resolve_semver_specifier_1 = require("nx/src/command-line/release/utils/resolve-semver-specifier");
|
|
13
13
|
const semver_1 = require("nx/src/command-line/release/utils/semver");
|
|
14
|
-
const
|
|
14
|
+
const version_1 = require("nx/src/command-line/release/version");
|
|
15
15
|
const utils_1 = require("nx/src/tasks-runner/utils");
|
|
16
16
|
const ora = require("ora");
|
|
17
17
|
const semver_2 = require("semver");
|
|
18
|
-
const update_lock_file_1 = require("../../release/utils/update-lock-file");
|
|
19
18
|
const is_locally_linked_package_version_1 = require("../../utils/is-locally-linked-package-version");
|
|
20
19
|
const npm_config_1 = require("../../utils/npm-config");
|
|
21
20
|
const resolve_local_package_dependencies_1 = require("./utils/resolve-local-package-dependencies");
|
|
22
21
|
const sort_projects_topologically_1 = require("./utils/sort-projects-topologically");
|
|
22
|
+
const update_lock_file_1 = require("./utils/update-lock-file");
|
|
23
23
|
function resolvePreIdSpecifier(currentSpecifier, preid) {
|
|
24
24
|
if (!currentSpecifier.startsWith('pre') && preid) {
|
|
25
25
|
return `pre${currentSpecifier}`;
|
|
@@ -39,10 +39,10 @@ async function releaseVersionGenerator(tree, options) {
|
|
|
39
39
|
options.specifier = options.specifier.replace(/^v/, '');
|
|
40
40
|
}
|
|
41
41
|
if (options.versionPrefix &&
|
|
42
|
-
|
|
42
|
+
version_1.validReleaseVersionPrefixes.indexOf(options.versionPrefix) === -1) {
|
|
43
43
|
throw new Error(`Invalid value for version.generatorOptions.versionPrefix: "${options.versionPrefix}"
|
|
44
44
|
|
|
45
|
-
Valid values are: ${
|
|
45
|
+
Valid values are: ${version_1.validReleaseVersionPrefixes
|
|
46
46
|
.map((s) => `"${s}"`)
|
|
47
47
|
.join(', ')}`);
|
|
48
48
|
}
|
|
@@ -54,6 +54,7 @@ Valid values are: ${version_legacy_1.validReleaseVersionPrefixes
|
|
|
54
54
|
const updateDependents = options.updateDependents ?? 'auto';
|
|
55
55
|
const updateDependentsBump = resolvePreIdSpecifier('patch', options.preid);
|
|
56
56
|
// Sort the projects topologically if update dependents is enabled
|
|
57
|
+
// TODO: maybe move this sorting to the command level?
|
|
57
58
|
const projects = updateDependents === 'never' ||
|
|
58
59
|
options.releaseGroup.projectsRelationship !== 'independent'
|
|
59
60
|
? options.projects
|
|
@@ -286,6 +287,8 @@ To fix this you will either need to add a package.json file at that location, or
|
|
|
286
287
|
logger.buffer(`🚫 No changes were detected using git history and the conventional commits standard.`);
|
|
287
288
|
break;
|
|
288
289
|
}
|
|
290
|
+
// TODO: reevaluate this prerelease logic/workflow for independent projects
|
|
291
|
+
//
|
|
289
292
|
// Always assume that if the current version is a prerelease, then the next version should be a prerelease.
|
|
290
293
|
// Users must manually graduate from a prerelease to a release by providing an explicit specifier.
|
|
291
294
|
if ((0, semver_2.prerelease)(currentVersion ?? '')) {
|
|
@@ -487,7 +490,7 @@ To fix this you will either need to add a package.json file at that location, or
|
|
|
487
490
|
}
|
|
488
491
|
continue;
|
|
489
492
|
}
|
|
490
|
-
const newVersion = (0,
|
|
493
|
+
const newVersion = (0, version_1.deriveNewSemverVersion)(currentVersion, specifier, options.preid);
|
|
491
494
|
versionData[projectName].newVersion = newVersion;
|
|
492
495
|
(0, devkit_1.writeJson)(tree, packageJsonPath, {
|
|
493
496
|
...packageJson,
|
|
@@ -553,7 +556,7 @@ To fix this you will either need to add a package.json file at that location, or
|
|
|
553
556
|
}
|
|
554
557
|
// Bump the dependent's version if applicable and record it in the version data
|
|
555
558
|
if (forceVersionBump) {
|
|
556
|
-
const newPackageVersion = (0,
|
|
559
|
+
const newPackageVersion = (0, version_1.deriveNewSemverVersion)(currentPackageVersion, forceVersionBump, options.preid);
|
|
557
560
|
json.version = newPackageVersion;
|
|
558
561
|
// Look up any dependent projects from the transitiveLocalPackageDependents list
|
|
559
562
|
const transitiveDependentProjects = transitiveLocalPackageDependents.filter((localPackageDependency) => localPackageDependency.target === dependentProject.source);
|
|
@@ -663,10 +666,7 @@ To fix this you will either need to add a package.json file at that location, or
|
|
|
663
666
|
deletedFiles.push(...(await cb(opts.dryRun)));
|
|
664
667
|
}
|
|
665
668
|
const cwd = tree.root;
|
|
666
|
-
changedFiles.push(...(await (0, update_lock_file_1.updateLockFile)(cwd,
|
|
667
|
-
...opts,
|
|
668
|
-
useLegacyVersioning: true,
|
|
669
|
-
})));
|
|
669
|
+
changedFiles.push(...(await (0, update_lock_file_1.updateLockFile)(cwd, opts)));
|
|
670
670
|
return { changedFiles, deletedFiles };
|
|
671
671
|
},
|
|
672
672
|
};
|
|
@@ -697,8 +697,7 @@ function createResolvePackageRoot(customPackageRoot) {
|
|
|
697
697
|
return projectNode.data.root;
|
|
698
698
|
}
|
|
699
699
|
if (projectNode.data.root === '.') {
|
|
700
|
-
// This is a temporary workaround to fix NXC-574 until NXC-573 is resolved
|
|
701
|
-
// This has been fixed in "versioning v2"
|
|
700
|
+
// TODO This is a temporary workaround to fix NXC-574 until NXC-573 is resolved
|
|
702
701
|
return projectNode.data.root;
|
|
703
702
|
}
|
|
704
703
|
return (0, utils_1.interpolate)(customPackageRoot, {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export { ReleaseVersionGeneratorSchema } from 'nx/src/command-line/release/version
|
|
1
|
+
export { ReleaseVersionGeneratorSchema } from 'nx/src/command-line/release/version';
|
|
@@ -8,8 +8,6 @@
|
|
|
8
8
|
"properties": {
|
|
9
9
|
"projects": {
|
|
10
10
|
"type": "array",
|
|
11
|
-
"hidden": true,
|
|
12
|
-
"$comment": "This is not configured/passed by the user. It is provided by the version command.",
|
|
13
11
|
"description": "The ProjectGraphProjectNodes being versioned in the current execution.",
|
|
14
12
|
"items": {
|
|
15
13
|
"type": "object"
|
|
@@ -17,33 +15,16 @@
|
|
|
17
15
|
},
|
|
18
16
|
"projectGraph": {
|
|
19
17
|
"type": "object",
|
|
20
|
-
"hidden": true,
|
|
21
|
-
"$comment": "This is not configured/passed by the user. It is provided by the version command.",
|
|
22
18
|
"description": "ProjectGraph instance"
|
|
23
19
|
},
|
|
24
|
-
"releaseGroup": {
|
|
25
|
-
"type": "object",
|
|
26
|
-
"hidden": true,
|
|
27
|
-
"$comment": "This is not configured/passed by the user. It is provided by the version command.",
|
|
28
|
-
"description": "The resolved release group configuration, including name, relevant to all projects in the current execution."
|
|
29
|
-
},
|
|
30
|
-
"conventionalCommitsConfig": {
|
|
31
|
-
"type": "object",
|
|
32
|
-
"hidden": true,
|
|
33
|
-
"$comment": "This is not configured/passed by the user. It is provided by the version command.",
|
|
34
|
-
"description": "The conventional commits configuration to use when determining the next version of the project.",
|
|
35
|
-
"default": {}
|
|
36
|
-
},
|
|
37
|
-
"firstRelease": {
|
|
38
|
-
"type": "boolean",
|
|
39
|
-
"hidden": true,
|
|
40
|
-
"$comment": "This is not configured/passed by the user. It is provided by the version command.",
|
|
41
|
-
"description": "Whether this is the first release of the project (which skips some validation within the generator)."
|
|
42
|
-
},
|
|
43
20
|
"specifier": {
|
|
44
21
|
"type": "string",
|
|
45
22
|
"description": "Exact version or semver keyword to apply to the selected release group. Overrides specifierSource."
|
|
46
23
|
},
|
|
24
|
+
"releaseGroup": {
|
|
25
|
+
"type": "object",
|
|
26
|
+
"description": "The resolved release group configuration, including name, relevant to all projects in the current execution."
|
|
27
|
+
},
|
|
47
28
|
"specifierSource": {
|
|
48
29
|
"type": "string",
|
|
49
30
|
"default": "prompt",
|
|
@@ -7,8 +7,8 @@ const client_1 = require("nx/src/daemon/client/client");
|
|
|
7
7
|
// eslint-disable-next-line @typescript-eslint/no-restricted-imports
|
|
8
8
|
const lock_file_1 = require("nx/src/plugins/js/lock-file/lock-file");
|
|
9
9
|
const semver_1 = require("semver");
|
|
10
|
-
async function updateLockFile(cwd, { dryRun, verbose,
|
|
11
|
-
if (
|
|
10
|
+
async function updateLockFile(cwd, { dryRun, verbose, generatorOptions, }) {
|
|
11
|
+
if (generatorOptions?.skipLockFileUpdate) {
|
|
12
12
|
if (verbose) {
|
|
13
13
|
console.log('\nSkipped lock file update because skipLockFileUpdate was set.');
|
|
14
14
|
}
|
|
@@ -36,10 +36,10 @@ async function updateLockFile(cwd, { dryRun, verbose, useLegacyVersioning, optio
|
|
|
36
36
|
await client_1.daemonClient.stop();
|
|
37
37
|
}
|
|
38
38
|
const packageManagerCommands = (0, devkit_1.getPackageManagerCommand)(packageManager);
|
|
39
|
-
let installArgs =
|
|
39
|
+
let installArgs = generatorOptions?.installArgs || '';
|
|
40
40
|
devkit_1.output.logSingleLine(`Updating ${packageManager} lock file`);
|
|
41
41
|
let env = {};
|
|
42
|
-
if (
|
|
42
|
+
if (generatorOptions?.installIgnoreScripts) {
|
|
43
43
|
if (packageManager === 'yarn') {
|
|
44
44
|
env = { YARN_ENABLE_SCRIPTS: 'false' };
|
|
45
45
|
}
|
|
@@ -62,7 +62,7 @@ async function updateLockFile(cwd, { dryRun, verbose, useLegacyVersioning, optio
|
|
|
62
62
|
if (dryRun) {
|
|
63
63
|
return [];
|
|
64
64
|
}
|
|
65
|
-
execLockFileUpdate(command, cwd, env
|
|
65
|
+
execLockFileUpdate(command, cwd, env);
|
|
66
66
|
if (isDaemonEnabled) {
|
|
67
67
|
try {
|
|
68
68
|
await client_1.daemonClient.startInBackground();
|
|
@@ -79,7 +79,7 @@ async function updateLockFile(cwd, { dryRun, verbose, useLegacyVersioning, optio
|
|
|
79
79
|
}
|
|
80
80
|
return [lockFile];
|
|
81
81
|
}
|
|
82
|
-
function execLockFileUpdate(command, cwd, env
|
|
82
|
+
function execLockFileUpdate(command, cwd, env = {}) {
|
|
83
83
|
try {
|
|
84
84
|
const LARGE_BUFFER = 1024 * 1000000;
|
|
85
85
|
(0, child_process_1.execSync)(command, {
|
|
@@ -93,16 +93,13 @@ function execLockFileUpdate(command, cwd, env, useLegacyVersioning) {
|
|
|
93
93
|
});
|
|
94
94
|
}
|
|
95
95
|
catch (e) {
|
|
96
|
-
const configPathStart = useLegacyVersioning
|
|
97
|
-
? 'release.version.generatorOptions'
|
|
98
|
-
: 'release.version.versionActionsOptions';
|
|
99
96
|
devkit_1.output.error({
|
|
100
97
|
title: `Error updating lock file with command '${command}'`,
|
|
101
98
|
bodyLines: [
|
|
102
99
|
`Verify that '${command}' succeeds when run from the workspace root.`,
|
|
103
|
-
`To configure a string of arguments to be passed to this command, set the '
|
|
104
|
-
`To ignore install lifecycle scripts, set '
|
|
105
|
-
`To disable this step entirely, set '
|
|
100
|
+
`To configure a string of arguments to be passed to this command, set the 'release.version.generatorOptions.installArgs' property in nx.json.`,
|
|
101
|
+
`To ignore install lifecycle scripts, set 'release.version.generatorOptions.installIgnoreScripts' to true in nx.json.`,
|
|
102
|
+
`To disable this step entirely, set 'release.version.generatorOptions.skipLockFileUpdate' to true in nx.json.`,
|
|
106
103
|
],
|
|
107
104
|
});
|
|
108
105
|
throw e;
|
|
@@ -3,16 +3,15 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.createNodes = exports.createNodesV2 = exports.PLUGIN_NAME = exports.createDependencies = void 0;
|
|
4
4
|
const devkit_1 = require("@nx/devkit");
|
|
5
5
|
const get_named_inputs_1 = require("@nx/devkit/src/utils/get-named-inputs");
|
|
6
|
+
const picomatch = require("picomatch");
|
|
6
7
|
const node_fs_1 = require("node:fs");
|
|
7
8
|
const node_path_1 = require("node:path");
|
|
8
9
|
const posix = require("node:path/posix");
|
|
9
10
|
const file_hasher_1 = require("nx/src/hasher/file-hasher");
|
|
10
|
-
const picomatch = require("picomatch");
|
|
11
11
|
// eslint-disable-next-line @typescript-eslint/no-restricted-imports
|
|
12
12
|
const lock_file_1 = require("nx/src/plugins/js/lock-file/lock-file");
|
|
13
13
|
const cache_directory_1 = require("nx/src/utils/cache-directory");
|
|
14
14
|
const util_1 = require("./util");
|
|
15
|
-
let ts;
|
|
16
15
|
const pmc = (0, devkit_1.getPackageManagerCommand)();
|
|
17
16
|
let tsConfigCache;
|
|
18
17
|
const tsConfigCachePath = (0, node_path_1.join)(cache_directory_1.workspaceDataDirectory, 'tsconfig-files.hash');
|
|
@@ -145,9 +144,6 @@ async function getConfigFileHash(configFilePath, workspaceRoot, projectRoot, opt
|
|
|
145
144
|
lockFileHash,
|
|
146
145
|
optionsHash,
|
|
147
146
|
...(packageJson ? [(0, file_hasher_1.hashObject)(packageJson)] : []),
|
|
148
|
-
// change this to bust the cache when making changes that would yield
|
|
149
|
-
// different results for the same hash
|
|
150
|
-
(0, file_hasher_1.hashObject)({ bust: 2 }),
|
|
151
147
|
]);
|
|
152
148
|
}
|
|
153
149
|
function checkIfConfigFileShouldBeProject(configFilePath, projectRoot, context) {
|
|
@@ -196,27 +192,13 @@ function buildTscTargets(configFilePath, projectRoot, options, context) {
|
|
|
196
192
|
// `tsc --build` does not work with `noEmit: true`
|
|
197
193
|
command = `echo "The 'typecheck' target is disabled because one or more project references set 'noEmit: true' in their tsconfig. Remove this property to resolve this issue."`;
|
|
198
194
|
}
|
|
199
|
-
const dependsOn = [`^${targetName}`];
|
|
200
|
-
if (options.build && targets[options.build.targetName]) {
|
|
201
|
-
// we already processed and have a build target
|
|
202
|
-
dependsOn.unshift(options.build.targetName);
|
|
203
|
-
}
|
|
204
|
-
else if (options.build) {
|
|
205
|
-
// check if the project will have a build target
|
|
206
|
-
const buildConfigPath = (0, devkit_1.joinPathFragments)(projectRoot, options.build.configName);
|
|
207
|
-
if (context.configFiles.some((f) => f === buildConfigPath) &&
|
|
208
|
-
(0, util_1.isValidPackageJsonBuildConfig)(retrieveTsConfigFromCache(buildConfigPath, context.workspaceRoot), context.workspaceRoot, projectRoot)) {
|
|
209
|
-
dependsOn.unshift(options.build.targetName);
|
|
210
|
-
}
|
|
211
|
-
}
|
|
212
195
|
targets[targetName] = {
|
|
213
|
-
dependsOn,
|
|
196
|
+
dependsOn: [`^${targetName}`],
|
|
214
197
|
command,
|
|
215
198
|
options: { cwd: projectRoot },
|
|
216
199
|
cache: true,
|
|
217
200
|
inputs: getInputs(namedInputs, configFilePath, tsConfig, internalProjectReferences, context.workspaceRoot, projectRoot),
|
|
218
|
-
outputs: getOutputs(configFilePath, tsConfig, internalProjectReferences, context.workspaceRoot, projectRoot,
|
|
219
|
-
/* emitDeclarationOnly */ true),
|
|
201
|
+
outputs: getOutputs(configFilePath, tsConfig, internalProjectReferences, context.workspaceRoot, projectRoot),
|
|
220
202
|
syncGenerators: ['@nx/js:typescript-sync'],
|
|
221
203
|
metadata: {
|
|
222
204
|
technologies: ['typescript'],
|
|
@@ -243,9 +225,7 @@ function buildTscTargets(configFilePath, projectRoot, options, context) {
|
|
|
243
225
|
options: { cwd: projectRoot },
|
|
244
226
|
cache: true,
|
|
245
227
|
inputs: getInputs(namedInputs, configFilePath, tsConfig, internalProjectReferences, context.workspaceRoot, projectRoot),
|
|
246
|
-
outputs: getOutputs(configFilePath, tsConfig, internalProjectReferences, context.workspaceRoot, projectRoot,
|
|
247
|
-
// should be false for build target, but providing it just in case is set to true
|
|
248
|
-
tsConfig.options.emitDeclarationOnly),
|
|
228
|
+
outputs: getOutputs(configFilePath, tsConfig, internalProjectReferences, context.workspaceRoot, projectRoot),
|
|
249
229
|
syncGenerators: ['@nx/js:typescript-sync'],
|
|
250
230
|
metadata: {
|
|
251
231
|
technologies: ['typescript'],
|
|
@@ -280,57 +260,10 @@ function getInputs(namedInputs, configFilePath, tsConfig, internalProjectReferen
|
|
|
280
260
|
...Object.entries(internalProjectReferences),
|
|
281
261
|
];
|
|
282
262
|
const absoluteProjectRoot = (0, node_path_1.join)(workspaceRoot, projectRoot);
|
|
283
|
-
if (!ts) {
|
|
284
|
-
ts = require('typescript');
|
|
285
|
-
}
|
|
286
|
-
// https://github.com/microsoft/TypeScript/blob/19b777260b26aac5707b1efd34202054164d4a9d/src/compiler/utilities.ts#L9869
|
|
287
|
-
const supportedTSExtensions = [
|
|
288
|
-
ts.Extension.Ts,
|
|
289
|
-
ts.Extension.Tsx,
|
|
290
|
-
ts.Extension.Dts,
|
|
291
|
-
ts.Extension.Cts,
|
|
292
|
-
ts.Extension.Dcts,
|
|
293
|
-
ts.Extension.Mts,
|
|
294
|
-
ts.Extension.Dmts,
|
|
295
|
-
];
|
|
296
|
-
// https://github.com/microsoft/TypeScript/blob/19b777260b26aac5707b1efd34202054164d4a9d/src/compiler/utilities.ts#L9878
|
|
297
|
-
const allSupportedExtensions = [
|
|
298
|
-
ts.Extension.Ts,
|
|
299
|
-
ts.Extension.Tsx,
|
|
300
|
-
ts.Extension.Dts,
|
|
301
|
-
ts.Extension.Js,
|
|
302
|
-
ts.Extension.Jsx,
|
|
303
|
-
ts.Extension.Cts,
|
|
304
|
-
ts.Extension.Dcts,
|
|
305
|
-
ts.Extension.Cjs,
|
|
306
|
-
ts.Extension.Mts,
|
|
307
|
-
ts.Extension.Dmts,
|
|
308
|
-
ts.Extension.Mjs,
|
|
309
|
-
];
|
|
310
|
-
const normalizeInput = (input, config) => {
|
|
311
|
-
const extensions = config.options.allowJs
|
|
312
|
-
? [...allSupportedExtensions]
|
|
313
|
-
: [...supportedTSExtensions];
|
|
314
|
-
if (config.options.resolveJsonModule) {
|
|
315
|
-
extensions.push(ts.Extension.Json);
|
|
316
|
-
}
|
|
317
|
-
const segments = input.split('/');
|
|
318
|
-
// An "includes" path "foo" is implicitly a glob "foo/**/*" if its last
|
|
319
|
-
// segment has no extension, and does not contain any glob characters
|
|
320
|
-
// itself.
|
|
321
|
-
// https://github.com/microsoft/TypeScript/blob/19b777260b26aac5707b1efd34202054164d4a9d/src/compiler/utilities.ts#L9577-L9585
|
|
322
|
-
if (!/[.*?]/.test(segments.at(-1))) {
|
|
323
|
-
return extensions.map((ext) => `${segments.join('/')}/**/*${ext}`);
|
|
324
|
-
}
|
|
325
|
-
return [input];
|
|
326
|
-
};
|
|
327
263
|
projectTsConfigFiles.forEach(([configPath, config]) => {
|
|
328
264
|
configFiles.add(configPath);
|
|
329
265
|
const offset = (0, node_path_1.relative)(absoluteProjectRoot, (0, node_path_1.dirname)(configPath));
|
|
330
|
-
(config.raw?.include ?? []).forEach((p) =>
|
|
331
|
-
const normalized = normalizeInput((0, node_path_1.join)(offset, p), config);
|
|
332
|
-
normalized.forEach((input) => includePaths.add(input));
|
|
333
|
-
});
|
|
266
|
+
(config.raw?.include ?? []).forEach((p) => includePaths.add((0, node_path_1.join)(offset, p)));
|
|
334
267
|
if (config.raw?.exclude) {
|
|
335
268
|
/**
|
|
336
269
|
* We need to filter out the exclude paths that are already included in
|
|
@@ -378,7 +311,7 @@ function getInputs(namedInputs, configFilePath, tsConfig, internalProjectReferen
|
|
|
378
311
|
inputs.push({ externalDependencies });
|
|
379
312
|
return inputs;
|
|
380
313
|
}
|
|
381
|
-
function getOutputs(configFilePath, tsConfig, internalProjectReferences, workspaceRoot, projectRoot
|
|
314
|
+
function getOutputs(configFilePath, tsConfig, internalProjectReferences, workspaceRoot, projectRoot) {
|
|
382
315
|
const outputs = new Set();
|
|
383
316
|
// We could have more surgical outputs based on the tsconfig options, but the
|
|
384
317
|
// user could override them through the command line and that wouldn't be
|
|
@@ -400,18 +333,9 @@ function getOutputs(configFilePath, tsConfig, internalProjectReferences, workspa
|
|
|
400
333
|
: pathToInputOrOutput((0, devkit_1.joinPathFragments)(outDir, `${outFileName}.tsbuildinfo`), workspaceRoot, projectRoot));
|
|
401
334
|
}
|
|
402
335
|
else if (config.options.outDir) {
|
|
403
|
-
|
|
404
|
-
outputs.add(pathToInputOrOutput((0, devkit_1.joinPathFragments)(config.options.outDir, '**/*.d.ts'), workspaceRoot, projectRoot));
|
|
405
|
-
if (tsConfig.options.declarationMap) {
|
|
406
|
-
outputs.add(pathToInputOrOutput((0, devkit_1.joinPathFragments)(config.options.outDir, '**/*.d.ts.map'), workspaceRoot, projectRoot));
|
|
407
|
-
}
|
|
408
|
-
}
|
|
409
|
-
else {
|
|
410
|
-
outputs.add(pathToInputOrOutput(config.options.outDir, workspaceRoot, projectRoot));
|
|
411
|
-
}
|
|
336
|
+
outputs.add(pathToInputOrOutput(config.options.outDir, workspaceRoot, projectRoot));
|
|
412
337
|
if (config.options.tsBuildInfoFile) {
|
|
413
|
-
if (
|
|
414
|
-
!(0, node_path_1.normalize)(config.options.tsBuildInfoFile).startsWith(`${(0, node_path_1.normalize)(config.options.outDir)}${node_path_1.sep}`)) {
|
|
338
|
+
if (!(0, node_path_1.normalize)(config.options.tsBuildInfoFile).startsWith(`${(0, node_path_1.normalize)(config.options.outDir)}${node_path_1.sep}`)) {
|
|
415
339
|
// https://www.typescriptlang.org/tsconfig#tsBuildInfoFile
|
|
416
340
|
outputs.add(pathToInputOrOutput(config.options.tsBuildInfoFile, workspaceRoot, projectRoot));
|
|
417
341
|
}
|
|
@@ -421,11 +345,6 @@ function getOutputs(configFilePath, tsConfig, internalProjectReferences, workspa
|
|
|
421
345
|
const relativeRootDir = (0, node_path_1.relative)(config.options.rootDir, (0, node_path_1.join)(workspaceRoot, projectRoot));
|
|
422
346
|
outputs.add(pathToInputOrOutput((0, devkit_1.joinPathFragments)(config.options.outDir, relativeRootDir, `*.tsbuildinfo`), workspaceRoot, projectRoot));
|
|
423
347
|
}
|
|
424
|
-
else if (emitDeclarationOnly) {
|
|
425
|
-
// https://www.typescriptlang.org/tsconfig#tsBuildInfoFile
|
|
426
|
-
const name = (0, node_path_1.basename)(configFilePath, '.json');
|
|
427
|
-
outputs.add(pathToInputOrOutput((0, devkit_1.joinPathFragments)(config.options.outDir, `${name}.tsbuildinfo`), workspaceRoot, projectRoot));
|
|
428
|
-
}
|
|
429
348
|
}
|
|
430
349
|
else if (config.raw?.include?.length ||
|
|
431
350
|
config.raw?.files?.length ||
|
|
@@ -461,15 +380,17 @@ function pathToInputOrOutput(path, workspaceRoot, projectRoot) {
|
|
|
461
380
|
}
|
|
462
381
|
return (0, devkit_1.joinPathFragments)('{projectRoot}', pathRelativeToProjectRoot);
|
|
463
382
|
}
|
|
464
|
-
function getExtendedConfigFiles(tsConfig, workspaceRoot
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
}
|
|
383
|
+
function getExtendedConfigFiles(tsConfig, workspaceRoot) {
|
|
384
|
+
const extendedConfigFiles = new Set();
|
|
385
|
+
const extendedExternalPackages = new Set();
|
|
386
|
+
let currentExtendedConfigFile = tsConfig.extendedConfigFile;
|
|
387
|
+
while (currentExtendedConfigFile) {
|
|
388
|
+
if (currentExtendedConfigFile.externalPackage) {
|
|
389
|
+
extendedExternalPackages.add(currentExtendedConfigFile.externalPackage);
|
|
390
|
+
break;
|
|
391
|
+
}
|
|
392
|
+
extendedConfigFiles.add(currentExtendedConfigFile.filePath);
|
|
393
|
+
currentExtendedConfigFile = retrieveTsConfigFromCache(currentExtendedConfigFile.filePath, workspaceRoot).extendedConfigFile;
|
|
473
394
|
}
|
|
474
395
|
return {
|
|
475
396
|
files: Array.from(extendedConfigFiles),
|
|
@@ -605,54 +526,44 @@ function readTsConfigAndCache(tsConfigPath, workspaceRoot) {
|
|
|
605
526
|
let extendedFilesHash;
|
|
606
527
|
if (tsConfigCache[relativePath] &&
|
|
607
528
|
tsConfigCache[relativePath].hash === hash) {
|
|
608
|
-
extendedFilesHash = getExtendedFilesHash(tsConfigCache[relativePath].data.
|
|
529
|
+
extendedFilesHash = getExtendedFilesHash(tsConfigCache[relativePath].data.extendedConfigFile, workspaceRoot);
|
|
609
530
|
if (tsConfigCache[relativePath].extendedFilesHash === extendedFilesHash) {
|
|
610
531
|
return tsConfigCache[relativePath].data;
|
|
611
532
|
}
|
|
612
533
|
}
|
|
613
534
|
const tsConfig = readTsConfig(tsConfigPath, workspaceRoot);
|
|
614
|
-
const
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
: tsConfig.raw.extends;
|
|
619
|
-
for (const extendsPath of extendsArray) {
|
|
620
|
-
const extendedConfigFile = resolveExtendedTsConfigPath(extendsPath, (0, node_path_1.dirname)(tsConfigPath));
|
|
621
|
-
if (extendedConfigFile) {
|
|
622
|
-
extendedConfigFiles.push(extendedConfigFile);
|
|
623
|
-
}
|
|
624
|
-
}
|
|
625
|
-
}
|
|
626
|
-
extendedFilesHash ??= getExtendedFilesHash(extendedConfigFiles, workspaceRoot);
|
|
535
|
+
const extendedConfigFile = tsConfig.raw?.extends
|
|
536
|
+
? resolveExtendedTsConfigPath(tsConfig.raw.extends, (0, node_path_1.dirname)(tsConfigPath))
|
|
537
|
+
: null;
|
|
538
|
+
extendedFilesHash ??= getExtendedFilesHash(extendedConfigFile, workspaceRoot);
|
|
627
539
|
tsConfigCache[relativePath] = {
|
|
628
540
|
data: {
|
|
629
541
|
options: tsConfig.options,
|
|
630
542
|
projectReferences: tsConfig.projectReferences,
|
|
631
543
|
raw: tsConfig.raw,
|
|
632
|
-
|
|
544
|
+
extendedConfigFile: extendedConfigFile ?? null,
|
|
633
545
|
},
|
|
634
546
|
hash,
|
|
635
547
|
extendedFilesHash,
|
|
636
548
|
};
|
|
637
549
|
return tsConfigCache[relativePath].data;
|
|
638
550
|
}
|
|
639
|
-
function getExtendedFilesHash(
|
|
551
|
+
function getExtendedFilesHash(extendedConfigFile, workspaceRoot) {
|
|
640
552
|
const hashes = [];
|
|
641
|
-
if (!
|
|
553
|
+
if (!extendedConfigFile) {
|
|
642
554
|
return '';
|
|
643
555
|
}
|
|
644
|
-
|
|
645
|
-
|
|
646
|
-
|
|
647
|
-
|
|
648
|
-
|
|
649
|
-
|
|
650
|
-
|
|
651
|
-
.extendedConfigFiles, workspaceRoot));
|
|
652
|
-
}
|
|
556
|
+
if (extendedConfigFile.externalPackage) {
|
|
557
|
+
hashes.push(extendedConfigFile.externalPackage);
|
|
558
|
+
}
|
|
559
|
+
else if (extendedConfigFile.filePath) {
|
|
560
|
+
hashes.push(getFileHash(extendedConfigFile.filePath, workspaceRoot));
|
|
561
|
+
hashes.push(getExtendedFilesHash(readTsConfigAndCache(extendedConfigFile.filePath, workspaceRoot)
|
|
562
|
+
.extendedConfigFile, workspaceRoot));
|
|
653
563
|
}
|
|
654
564
|
return hashes.join('|');
|
|
655
565
|
}
|
|
566
|
+
let ts;
|
|
656
567
|
function readTsConfig(tsConfigPath, workspaceRoot) {
|
|
657
568
|
if (!ts) {
|
|
658
569
|
ts = require('typescript');
|
|
@@ -712,8 +623,7 @@ function resolveExtendedTsConfigPath(tsConfigPath, directory) {
|
|
|
712
623
|
const resolvedPath = require.resolve(tsConfigPath, {
|
|
713
624
|
paths: directory ? [directory] : undefined,
|
|
714
625
|
});
|
|
715
|
-
if (tsConfigPath.startsWith('.')
|
|
716
|
-
!resolvedPath.includes('/node_modules/')) {
|
|
626
|
+
if (tsConfigPath.startsWith('.')) {
|
|
717
627
|
return { filePath: resolvedPath };
|
|
718
628
|
}
|
|
719
629
|
// parse the package from the tsconfig path
|
|
@@ -751,7 +661,7 @@ function toAbsolutePaths(cache, workspaceRoot) {
|
|
|
751
661
|
raw: {
|
|
752
662
|
nx: { addTypecheckTarget: data.raw?.['nx']?.addTypecheckTarget },
|
|
753
663
|
},
|
|
754
|
-
|
|
664
|
+
extendedConfigFile: data.extendedConfigFile,
|
|
755
665
|
},
|
|
756
666
|
extendedFilesHash,
|
|
757
667
|
hash,
|
|
@@ -768,10 +678,8 @@ function toAbsolutePaths(cache, workspaceRoot) {
|
|
|
768
678
|
if (data.options.tsBuildInfoFile) {
|
|
769
679
|
updatedCache[key].data.options.tsBuildInfoFile = (0, node_path_1.join)(workspaceRoot, data.options.tsBuildInfoFile);
|
|
770
680
|
}
|
|
771
|
-
if (data.
|
|
772
|
-
updatedCache[key].data.
|
|
773
|
-
file.filePath = (0, node_path_1.join)(workspaceRoot, file.filePath);
|
|
774
|
-
});
|
|
681
|
+
if (data.extendedConfigFile?.filePath) {
|
|
682
|
+
updatedCache[key].data.extendedConfigFile.filePath = (0, node_path_1.join)(workspaceRoot, data.extendedConfigFile.filePath);
|
|
775
683
|
}
|
|
776
684
|
if (data.projectReferences) {
|
|
777
685
|
updatedCache[key].data.projectReferences = data.projectReferences.map((ref) => ({ ...ref, path: (0, node_path_1.join)(workspaceRoot, ref.path) }));
|
|
@@ -788,7 +696,7 @@ function toRelativePaths(cache, workspaceRoot) {
|
|
|
788
696
|
raw: {
|
|
789
697
|
nx: { addTypecheckTarget: data.raw?.['nx']?.addTypecheckTarget },
|
|
790
698
|
},
|
|
791
|
-
|
|
699
|
+
extendedConfigFile: data.extendedConfigFile,
|
|
792
700
|
},
|
|
793
701
|
extendedFilesHash,
|
|
794
702
|
hash,
|
|
@@ -805,10 +713,8 @@ function toRelativePaths(cache, workspaceRoot) {
|
|
|
805
713
|
if (data.options.tsBuildInfoFile) {
|
|
806
714
|
updatedCache[key].data.options.tsBuildInfoFile = posixRelative(workspaceRoot, data.options.tsBuildInfoFile);
|
|
807
715
|
}
|
|
808
|
-
if (data.
|
|
809
|
-
updatedCache[key].data.
|
|
810
|
-
file.filePath = posixRelative(workspaceRoot, file.filePath);
|
|
811
|
-
});
|
|
716
|
+
if (data.extendedConfigFile?.filePath) {
|
|
717
|
+
updatedCache[key].data.extendedConfigFile.filePath = posixRelative(workspaceRoot, data.extendedConfigFile.filePath);
|
|
812
718
|
}
|
|
813
719
|
if (data.projectReferences) {
|
|
814
720
|
updatedCache[key].data.projectReferences = data.projectReferences.map((ref) => ({
|
|
@@ -1,12 +1,11 @@
|
|
|
1
1
|
import { type TargetConfiguration } from '@nx/devkit';
|
|
2
2
|
import { type PackageManagerCommands } from 'nx/src/utils/package-manager';
|
|
3
3
|
import { type ParsedCommandLine } from 'typescript';
|
|
4
|
-
export type ExtendedConfigFile = {
|
|
5
|
-
filePath: string;
|
|
6
|
-
externalPackage?: string;
|
|
7
|
-
};
|
|
8
4
|
export type ParsedTsconfigData = Pick<ParsedCommandLine, 'options' | 'projectReferences' | 'raw'> & {
|
|
9
|
-
|
|
5
|
+
extendedConfigFile: {
|
|
6
|
+
filePath: string;
|
|
7
|
+
externalPackage?: string;
|
|
8
|
+
} | null;
|
|
10
9
|
};
|
|
11
10
|
/**
|
|
12
11
|
* Allow uses that use incremental builds to run `nx watch-deps` to continuously build all dependencies.
|
|
@@ -33,6 +33,8 @@ export declare function calculateDependenciesFromTaskGraph(taskGraph: TaskGraph,
|
|
|
33
33
|
*/
|
|
34
34
|
export declare function computeCompilerOptionsPaths(tsConfig: string | ts.ParsedCommandLine, dependencies: DependentBuildableProjectNode[]): ts.MapLike<string[]>;
|
|
35
35
|
export declare function createTmpTsConfig(tsconfigPath: string, workspaceRoot: string, projectRoot: string, dependencies: DependentBuildableProjectNode[], useWorkspaceAsBaseUrl?: boolean): string;
|
|
36
|
+
export declare function checkDependentProjectsHaveBeenBuilt(root: string, projectName: string, targetName: string, projectDependencies: DependentBuildableProjectNode[]): boolean;
|
|
37
|
+
export declare function findMissingBuildDependencies(root: string, projectName: string, targetName: string, projectDependencies: DependentBuildableProjectNode[]): DependentBuildableProjectNode[];
|
|
36
38
|
export declare function updatePaths(dependencies: DependentBuildableProjectNode[], paths: Record<string, string[]>): void;
|
|
37
39
|
/**
|
|
38
40
|
* Updates the peerDependencies section in the `dist/lib/xyz/package.json` with
|
|
@@ -5,6 +5,8 @@ exports.calculateProjectDependencies = calculateProjectDependencies;
|
|
|
5
5
|
exports.calculateDependenciesFromTaskGraph = calculateDependenciesFromTaskGraph;
|
|
6
6
|
exports.computeCompilerOptionsPaths = computeCompilerOptionsPaths;
|
|
7
7
|
exports.createTmpTsConfig = createTmpTsConfig;
|
|
8
|
+
exports.checkDependentProjectsHaveBeenBuilt = checkDependentProjectsHaveBeenBuilt;
|
|
9
|
+
exports.findMissingBuildDependencies = findMissingBuildDependencies;
|
|
8
10
|
exports.updatePaths = updatePaths;
|
|
9
11
|
exports.updateBuildableProjectPackageJsonDependencies = updateBuildableProjectPackageJsonDependencies;
|
|
10
12
|
const devkit_1 = require("@nx/devkit");
|
|
@@ -250,6 +252,36 @@ function cleanupTmpTsConfigFile(tmpTsConfigPath) {
|
|
|
250
252
|
}
|
|
251
253
|
catch (e) { }
|
|
252
254
|
}
|
|
255
|
+
function checkDependentProjectsHaveBeenBuilt(root, projectName, targetName, projectDependencies) {
|
|
256
|
+
const missing = findMissingBuildDependencies(root, projectName, targetName, projectDependencies);
|
|
257
|
+
if (missing.length > 0) {
|
|
258
|
+
console.error((0, devkit_1.stripIndents) `
|
|
259
|
+
It looks like all of ${projectName}'s dependencies have not been built yet:
|
|
260
|
+
${missing.map((x) => ` - ${x.node.name}`).join('\n')}
|
|
261
|
+
|
|
262
|
+
You might be missing a "targetDefaults" configuration in your root nx.json (https://nx.dev/reference/project-configuration#target-defaults),
|
|
263
|
+
or "dependsOn" configured in ${projectName}'s project.json (https://nx.dev/reference/project-configuration#dependson)
|
|
264
|
+
`);
|
|
265
|
+
return false;
|
|
266
|
+
}
|
|
267
|
+
else {
|
|
268
|
+
return true;
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
function findMissingBuildDependencies(root, projectName, targetName, projectDependencies) {
|
|
272
|
+
const depLibsToBuildFirst = [];
|
|
273
|
+
// verify whether all dependent libraries have been built
|
|
274
|
+
projectDependencies.forEach((dep) => {
|
|
275
|
+
if (dep.node.type !== 'lib') {
|
|
276
|
+
return;
|
|
277
|
+
}
|
|
278
|
+
const paths = dep.outputs.map((p) => (0, path_1.join)(root, p));
|
|
279
|
+
if (!paths.some(fileutils_1.directoryExists)) {
|
|
280
|
+
depLibsToBuildFirst.push(dep);
|
|
281
|
+
}
|
|
282
|
+
});
|
|
283
|
+
return depLibsToBuildFirst;
|
|
284
|
+
}
|
|
253
285
|
function updatePaths(dependencies, paths) {
|
|
254
286
|
const pathsKeys = Object.keys(paths);
|
|
255
287
|
// For each registered dependency
|
|
@@ -259,7 +291,7 @@ function updatePaths(dependencies, paths) {
|
|
|
259
291
|
// If there are outputs
|
|
260
292
|
if (dep.outputs && dep.outputs.length > 0) {
|
|
261
293
|
// Directly map the dependency name to the output paths (dist/packages/..., etc.)
|
|
262
|
-
paths[dep.name] = dep.outputs
|
|
294
|
+
paths[dep.name] = dep.outputs;
|
|
263
295
|
// check for secondary entrypoints
|
|
264
296
|
// For each registered path
|
|
265
297
|
for (const path of pathsKeys) {
|
package/src/utils/versions.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
export declare const nxVersion: any;
|
|
2
2
|
export declare const esbuildVersion = "^0.19.2";
|
|
3
3
|
export declare const prettierVersion = "^2.6.2";
|
|
4
|
-
export declare const swcCliVersion = "~0.
|
|
4
|
+
export declare const swcCliVersion = "~0.3.12";
|
|
5
5
|
export declare const swcCoreVersion = "~1.5.7";
|
|
6
6
|
export declare const swcHelpersVersion = "~0.5.11";
|
|
7
7
|
export declare const swcNodeVersion = "~1.9.1";
|
package/src/utils/versions.js
CHANGED
|
@@ -4,7 +4,7 @@ exports.supportedTypescriptVersions = exports.typescriptVersion = exports.verdac
|
|
|
4
4
|
exports.nxVersion = require('../../package.json').version;
|
|
5
5
|
exports.esbuildVersion = '^0.19.2';
|
|
6
6
|
exports.prettierVersion = '^2.6.2';
|
|
7
|
-
exports.swcCliVersion = '~0.
|
|
7
|
+
exports.swcCliVersion = '~0.3.12';
|
|
8
8
|
exports.swcCoreVersion = '~1.5.7';
|
|
9
9
|
exports.swcHelpersVersion = '~0.5.11';
|
|
10
10
|
exports.swcNodeVersion = '~1.9.1';
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
export declare function updateLockFile(cwd: string, { dryRun, verbose, useLegacyVersioning, options, }: {
|
|
2
|
-
dryRun?: boolean;
|
|
3
|
-
verbose?: boolean;
|
|
4
|
-
useLegacyVersioning?: boolean;
|
|
5
|
-
options?: {
|
|
6
|
-
skipLockFileUpdate?: boolean;
|
|
7
|
-
installArgs?: string;
|
|
8
|
-
installIgnoreScripts?: boolean;
|
|
9
|
-
};
|
|
10
|
-
}): Promise<string[]>;
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
import { ProjectGraph, Tree } from '@nx/devkit';
|
|
2
|
-
import { AfterAllProjectsVersioned, VersionActions } from 'nx/release';
|
|
3
|
-
import type { NxReleaseVersionV2Configuration } from 'nx/src/config/nx-json';
|
|
4
|
-
export declare const afterAllProjectsVersioned: AfterAllProjectsVersioned;
|
|
5
|
-
export default class JsVersionActions extends VersionActions {
|
|
6
|
-
validManifestFilenames: string[];
|
|
7
|
-
readCurrentVersionFromSourceManifest(tree: Tree): Promise<{
|
|
8
|
-
currentVersion: string;
|
|
9
|
-
manifestPath: string;
|
|
10
|
-
}>;
|
|
11
|
-
readCurrentVersionFromRegistry(tree: Tree, currentVersionResolverMetadata: NxReleaseVersionV2Configuration['currentVersionResolverMetadata']): Promise<{
|
|
12
|
-
currentVersion: string;
|
|
13
|
-
logText: string;
|
|
14
|
-
}>;
|
|
15
|
-
readCurrentVersionOfDependency(tree: Tree, projectGraph: ProjectGraph, dependencyProjectName: string): Promise<{
|
|
16
|
-
currentVersion: string | null;
|
|
17
|
-
dependencyCollection: string | null;
|
|
18
|
-
}>;
|
|
19
|
-
isLocalDependencyProtocol(versionSpecifier: string): Promise<boolean>;
|
|
20
|
-
updateProjectVersion(tree: Tree, newVersion: string): Promise<string[]>;
|
|
21
|
-
updateProjectDependencies(tree: Tree, projectGraph: ProjectGraph, dependenciesToUpdate: Record<string, string>): Promise<string[]>;
|
|
22
|
-
}
|
|
@@ -1,189 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.afterAllProjectsVersioned = void 0;
|
|
4
|
-
const devkit_1 = require("@nx/devkit");
|
|
5
|
-
const node_child_process_1 = require("node:child_process");
|
|
6
|
-
const node_path_1 = require("node:path");
|
|
7
|
-
const release_1 = require("nx/release");
|
|
8
|
-
const npm_config_1 = require("../utils/npm-config");
|
|
9
|
-
const update_lock_file_1 = require("./utils/update-lock-file");
|
|
10
|
-
const chalk = require("chalk");
|
|
11
|
-
const afterAllProjectsVersioned = async (cwd, opts) => {
|
|
12
|
-
return {
|
|
13
|
-
changedFiles: await (0, update_lock_file_1.updateLockFile)(cwd, {
|
|
14
|
-
...opts,
|
|
15
|
-
useLegacyVersioning: false,
|
|
16
|
-
}),
|
|
17
|
-
deletedFiles: [],
|
|
18
|
-
};
|
|
19
|
-
};
|
|
20
|
-
exports.afterAllProjectsVersioned = afterAllProjectsVersioned;
|
|
21
|
-
// Cache at the module level to avoid re-detecting the package manager for each instance
|
|
22
|
-
let pm;
|
|
23
|
-
class JsVersionActions extends release_1.VersionActions {
|
|
24
|
-
constructor() {
|
|
25
|
-
super(...arguments);
|
|
26
|
-
this.validManifestFilenames = ['package.json'];
|
|
27
|
-
}
|
|
28
|
-
async readCurrentVersionFromSourceManifest(tree) {
|
|
29
|
-
const sourcePackageJsonPath = (0, node_path_1.join)(this.projectGraphNode.data.root, 'package.json');
|
|
30
|
-
try {
|
|
31
|
-
const packageJson = (0, devkit_1.readJson)(tree, sourcePackageJsonPath);
|
|
32
|
-
return {
|
|
33
|
-
manifestPath: sourcePackageJsonPath,
|
|
34
|
-
currentVersion: packageJson.version,
|
|
35
|
-
};
|
|
36
|
-
}
|
|
37
|
-
catch {
|
|
38
|
-
throw new Error(`Unable to determine the current version for project "${this.projectGraphNode.name}" from ${sourcePackageJsonPath}, please ensure that the "version" field is set within the package.json file`);
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
async readCurrentVersionFromRegistry(tree, currentVersionResolverMetadata) {
|
|
42
|
-
const sourcePackageJsonPath = (0, node_path_1.join)(this.projectGraphNode.data.root, 'package.json');
|
|
43
|
-
const packageJson = (0, devkit_1.readJson)(tree, sourcePackageJsonPath);
|
|
44
|
-
const packageName = packageJson.name;
|
|
45
|
-
const metadata = currentVersionResolverMetadata;
|
|
46
|
-
const registryArg = typeof metadata?.registry === 'string' ? metadata.registry : undefined;
|
|
47
|
-
const tagArg = typeof metadata?.tag === 'string' ? metadata.tag : undefined;
|
|
48
|
-
const warnFn = (message) => {
|
|
49
|
-
console.log(chalk.keyword('orange')(message));
|
|
50
|
-
};
|
|
51
|
-
const { registry, tag, registryConfigKey } = await (0, npm_config_1.parseRegistryOptions)(devkit_1.workspaceRoot, {
|
|
52
|
-
packageRoot: this.projectGraphNode.data.root,
|
|
53
|
-
packageJson,
|
|
54
|
-
}, {
|
|
55
|
-
registry: registryArg,
|
|
56
|
-
tag: tagArg,
|
|
57
|
-
}, warnFn);
|
|
58
|
-
let currentVersion = null;
|
|
59
|
-
try {
|
|
60
|
-
// Must be non-blocking async to allow spinner to render
|
|
61
|
-
currentVersion = await new Promise((resolve, reject) => {
|
|
62
|
-
(0, node_child_process_1.exec)(`npm view ${packageName} version --"${registryConfigKey}=${registry}" --tag=${tag}`, {
|
|
63
|
-
windowsHide: false,
|
|
64
|
-
}, (error, stdout, stderr) => {
|
|
65
|
-
if (error) {
|
|
66
|
-
return reject(error);
|
|
67
|
-
}
|
|
68
|
-
if (stderr) {
|
|
69
|
-
return reject(stderr);
|
|
70
|
-
}
|
|
71
|
-
return resolve(stdout.trim());
|
|
72
|
-
});
|
|
73
|
-
});
|
|
74
|
-
}
|
|
75
|
-
catch { }
|
|
76
|
-
return {
|
|
77
|
-
currentVersion,
|
|
78
|
-
// Make troubleshooting easier by including the registry and tag data in the log text
|
|
79
|
-
logText: `"${registryConfigKey}=${registry}" tag=${tag}`,
|
|
80
|
-
};
|
|
81
|
-
}
|
|
82
|
-
async readCurrentVersionOfDependency(tree, projectGraph, dependencyProjectName) {
|
|
83
|
-
const sourcePackageJsonPath = (0, node_path_1.join)(this.projectGraphNode.data.root, 'package.json');
|
|
84
|
-
const json = (0, devkit_1.readJson)(tree, sourcePackageJsonPath);
|
|
85
|
-
// Resolve the package name from the project graph metadata, as it may not match the project name
|
|
86
|
-
const dependencyPackageName = projectGraph.nodes[dependencyProjectName].data.metadata?.js?.packageName;
|
|
87
|
-
const dependencyTypes = [
|
|
88
|
-
'dependencies',
|
|
89
|
-
'devDependencies',
|
|
90
|
-
'peerDependencies',
|
|
91
|
-
'optionalDependencies',
|
|
92
|
-
];
|
|
93
|
-
let currentVersion = null;
|
|
94
|
-
let dependencyCollection = null;
|
|
95
|
-
for (const depType of dependencyTypes) {
|
|
96
|
-
if (json[depType] && json[depType][dependencyPackageName]) {
|
|
97
|
-
currentVersion = json[depType][dependencyPackageName];
|
|
98
|
-
dependencyCollection = depType;
|
|
99
|
-
break;
|
|
100
|
-
}
|
|
101
|
-
}
|
|
102
|
-
return {
|
|
103
|
-
currentVersion,
|
|
104
|
-
dependencyCollection,
|
|
105
|
-
};
|
|
106
|
-
}
|
|
107
|
-
// NOTE: The TODOs were carried over from the original implementation, they are not yet implemented
|
|
108
|
-
async isLocalDependencyProtocol(versionSpecifier) {
|
|
109
|
-
const localPackageProtocols = [
|
|
110
|
-
'file:', // all package managers
|
|
111
|
-
'workspace:', // not npm
|
|
112
|
-
// TODO: Support portal protocol at the project graph level before enabling here
|
|
113
|
-
// 'portal:', // modern yarn only
|
|
114
|
-
];
|
|
115
|
-
// Not using a supported local protocol
|
|
116
|
-
if (!localPackageProtocols.some((protocol) => versionSpecifier.startsWith(protocol))) {
|
|
117
|
-
return false;
|
|
118
|
-
}
|
|
119
|
-
// Supported by all package managers
|
|
120
|
-
if (versionSpecifier.startsWith('file:')) {
|
|
121
|
-
return true;
|
|
122
|
-
}
|
|
123
|
-
// Determine specific package manager in use
|
|
124
|
-
if (!pm) {
|
|
125
|
-
pm = (0, devkit_1.detectPackageManager)();
|
|
126
|
-
// pmVersion = getPackageManagerVersion(pm);
|
|
127
|
-
}
|
|
128
|
-
if (pm === 'npm' && versionSpecifier.startsWith('workspace:')) {
|
|
129
|
-
throw new Error(`The "workspace:" protocol is not yet supported by npm (https://github.com/npm/rfcs/issues/765). Please ensure you have a valid setup according to your package manager before attempting to release packages.`);
|
|
130
|
-
}
|
|
131
|
-
// TODO: Support portal protocol at the project graph level before enabling here
|
|
132
|
-
// if (
|
|
133
|
-
// version.startsWith('portal:') &&
|
|
134
|
-
// (pm !== 'yarn' || lt(pmVersion, '2.0.0'))
|
|
135
|
-
// ) {
|
|
136
|
-
// throw new Error(
|
|
137
|
-
// `The "portal:" protocol is only supported by yarn@2.0.0 and above. Please ensure you have a valid setup according to your package manager before attempting to release packages.`
|
|
138
|
-
// );
|
|
139
|
-
// }
|
|
140
|
-
return true;
|
|
141
|
-
}
|
|
142
|
-
async updateProjectVersion(tree, newVersion) {
|
|
143
|
-
const logMessages = [];
|
|
144
|
-
for (const manifestPath of this.manifestsToUpdate) {
|
|
145
|
-
(0, devkit_1.updateJson)(tree, manifestPath, (json) => {
|
|
146
|
-
json.version = newVersion;
|
|
147
|
-
return json;
|
|
148
|
-
});
|
|
149
|
-
logMessages.push(`✍️ New version ${newVersion} written to manifest: ${manifestPath}`);
|
|
150
|
-
}
|
|
151
|
-
return logMessages;
|
|
152
|
-
}
|
|
153
|
-
async updateProjectDependencies(tree, projectGraph, dependenciesToUpdate) {
|
|
154
|
-
const numDependenciesToUpdate = Object.keys(dependenciesToUpdate).length;
|
|
155
|
-
const depText = numDependenciesToUpdate === 1 ? 'dependency' : 'dependencies';
|
|
156
|
-
if (numDependenciesToUpdate === 0) {
|
|
157
|
-
return [];
|
|
158
|
-
}
|
|
159
|
-
const logMessages = [];
|
|
160
|
-
for (const manifestPath of this.manifestsToUpdate) {
|
|
161
|
-
(0, devkit_1.updateJson)(tree, manifestPath, (json) => {
|
|
162
|
-
const dependencyTypes = [
|
|
163
|
-
'dependencies',
|
|
164
|
-
'devDependencies',
|
|
165
|
-
'peerDependencies',
|
|
166
|
-
'optionalDependencies',
|
|
167
|
-
];
|
|
168
|
-
for (const depType of dependencyTypes) {
|
|
169
|
-
if (json[depType]) {
|
|
170
|
-
for (const [dep, version] of Object.entries(dependenciesToUpdate)) {
|
|
171
|
-
// Resolve the package name from the project graph metadata, as it may not match the project name
|
|
172
|
-
const packageName = projectGraph.nodes[dep].data.metadata?.js?.packageName;
|
|
173
|
-
if (!packageName) {
|
|
174
|
-
throw new Error(`Unable to determine the package name for project "${dep}" from the project graph metadata, please ensure that the "@nx/js" plugin is installed and the project graph has been built. If the issue persists, please report this issue on https://github.com/nrwl/nx/issues`);
|
|
175
|
-
}
|
|
176
|
-
if (json[depType][packageName]) {
|
|
177
|
-
json[depType][packageName] = version;
|
|
178
|
-
}
|
|
179
|
-
}
|
|
180
|
-
}
|
|
181
|
-
}
|
|
182
|
-
return json;
|
|
183
|
-
});
|
|
184
|
-
logMessages.push(`✍️ Updated ${numDependenciesToUpdate} ${depText} in manifest: ${manifestPath}`);
|
|
185
|
-
}
|
|
186
|
-
return logMessages;
|
|
187
|
-
}
|
|
188
|
-
}
|
|
189
|
-
exports.default = JsVersionActions;
|