@pnpm/core 6.0.2 → 7.0.0
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/lib/api.d.ts +0 -2
- package/lib/api.js +1 -6
- package/lib/api.js.map +1 -1
- package/lib/getPeerDependencyIssues.js +6 -31
- package/lib/getPeerDependencyIssues.js.map +1 -1
- package/lib/install/allProjectsAreUpToDate.d.ts +1 -1
- package/lib/install/allProjectsAreUpToDate.js +3 -2
- package/lib/install/allProjectsAreUpToDate.js.map +1 -1
- package/lib/install/extendInstallOptions.d.ts +3 -2
- package/lib/install/extendInstallOptions.js +12 -36
- package/lib/install/extendInstallOptions.js.map +1 -1
- package/lib/install/index.d.ts +12 -7
- package/lib/install/index.js +114 -99
- package/lib/install/index.js.map +1 -1
- package/lib/install/link.d.ts +1 -1
- package/lib/install/link.js +11 -33
- package/lib/install/link.js.map +1 -1
- package/lib/install/reportPeerDependencyIssues.d.ts +2 -2
- package/lib/install/reportPeerDependencyIssues.js +5 -5
- package/lib/install/reportPeerDependencyIssues.js.map +1 -1
- package/lib/link/index.d.ts +1 -1
- package/lib/link/index.js +8 -30
- package/lib/link/index.js.map +1 -1
- package/lib/link/options.js +2 -25
- package/lib/link/options.js.map +1 -1
- package/lib/parseWantedDependencies.d.ts +1 -1
- package/lib/parseWantedDependencies.js +6 -8
- package/lib/parseWantedDependencies.js.map +1 -1
- package/lib/pnpmPkgJson.d.ts +2 -2
- package/lib/pnpmPkgJson.js +5 -4
- package/lib/pnpmPkgJson.js.map +1 -1
- package/lib/uninstall/removeDeps.d.ts +1 -1
- package/lib/uninstall/removeDeps.js +3 -2
- package/lib/uninstall/removeDeps.js.map +1 -1
- package/package.json +41 -41
- package/lib/err.d.ts +0 -1
- package/lib/err.js +0 -15
- package/lib/err.js.map +0 -1
package/lib/install/index.js
CHANGED
|
@@ -1,53 +1,30 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
-
if (k2 === undefined) k2 = k;
|
|
4
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
-
}
|
|
8
|
-
Object.defineProperty(o, k2, desc);
|
|
9
|
-
}) : (function(o, m, k, k2) {
|
|
10
|
-
if (k2 === undefined) k2 = k;
|
|
11
|
-
o[k2] = m[k];
|
|
12
|
-
}));
|
|
13
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
-
}) : function(o, v) {
|
|
16
|
-
o["default"] = v;
|
|
17
|
-
});
|
|
18
|
-
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
-
if (mod && mod.__esModule) return mod;
|
|
20
|
-
var result = {};
|
|
21
|
-
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
-
__setModuleDefault(result, mod);
|
|
23
|
-
return result;
|
|
24
|
-
};
|
|
25
2
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
26
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
27
4
|
};
|
|
28
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
29
|
-
exports.addDependenciesToPackage = exports.createObjectChecksum = exports.mutateModules = exports.install = void 0;
|
|
6
|
+
exports.addDependenciesToPackage = exports.createObjectChecksum = exports.mutateModules = exports.mutateModulesInSingleProject = exports.install = void 0;
|
|
30
7
|
const crypto_1 = __importDefault(require("crypto"));
|
|
31
8
|
const path_1 = __importDefault(require("path"));
|
|
32
|
-
const build_modules_1 =
|
|
9
|
+
const build_modules_1 = require("@pnpm/build-modules");
|
|
33
10
|
const constants_1 = require("@pnpm/constants");
|
|
34
11
|
const core_loggers_1 = require("@pnpm/core-loggers");
|
|
35
12
|
const crypto_base32_hash_1 = require("@pnpm/crypto.base32-hash");
|
|
36
|
-
const error_1 =
|
|
37
|
-
const get_context_1 =
|
|
38
|
-
const headless_1 =
|
|
39
|
-
const lifecycle_1 =
|
|
40
|
-
const link_bins_1 =
|
|
13
|
+
const error_1 = require("@pnpm/error");
|
|
14
|
+
const get_context_1 = require("@pnpm/get-context");
|
|
15
|
+
const headless_1 = require("@pnpm/headless");
|
|
16
|
+
const lifecycle_1 = require("@pnpm/lifecycle");
|
|
17
|
+
const link_bins_1 = require("@pnpm/link-bins");
|
|
41
18
|
const lockfile_file_1 = require("@pnpm/lockfile-file");
|
|
42
19
|
const lockfile_to_pnp_1 = require("@pnpm/lockfile-to-pnp");
|
|
43
20
|
const lockfile_utils_1 = require("@pnpm/lockfile-utils");
|
|
44
|
-
const logger_1 =
|
|
21
|
+
const logger_1 = require("@pnpm/logger");
|
|
45
22
|
const manifest_utils_1 = require("@pnpm/manifest-utils");
|
|
46
23
|
const modules_yaml_1 = require("@pnpm/modules-yaml");
|
|
47
|
-
const read_modules_dir_1 =
|
|
24
|
+
const read_modules_dir_1 = require("@pnpm/read-modules-dir");
|
|
48
25
|
const read_project_manifest_1 = require("@pnpm/read-project-manifest");
|
|
49
26
|
const remove_bins_1 = require("@pnpm/remove-bins");
|
|
50
|
-
const resolve_dependencies_1 =
|
|
27
|
+
const resolve_dependencies_1 = require("@pnpm/resolve-dependencies");
|
|
51
28
|
const rimraf_1 = __importDefault(require("@zkochan/rimraf"));
|
|
52
29
|
const is_inner_link_1 = __importDefault(require("is-inner-link"));
|
|
53
30
|
const p_filter_1 = __importDefault(require("p-filter"));
|
|
@@ -59,49 +36,66 @@ const isEmpty_1 = __importDefault(require("ramda/src/isEmpty"));
|
|
|
59
36
|
const pipeWith_1 = __importDefault(require("ramda/src/pipeWith"));
|
|
60
37
|
const props_1 = __importDefault(require("ramda/src/props"));
|
|
61
38
|
const unnest_1 = __importDefault(require("ramda/src/unnest"));
|
|
62
|
-
const parseWantedDependencies_1 =
|
|
63
|
-
const removeDeps_1 =
|
|
64
|
-
const allProjectsAreUpToDate_1 =
|
|
65
|
-
const extendInstallOptions_1 =
|
|
39
|
+
const parseWantedDependencies_1 = require("../parseWantedDependencies");
|
|
40
|
+
const removeDeps_1 = require("../uninstall/removeDeps");
|
|
41
|
+
const allProjectsAreUpToDate_1 = require("./allProjectsAreUpToDate");
|
|
42
|
+
const extendInstallOptions_1 = require("./extendInstallOptions");
|
|
66
43
|
const getPreferredVersions_1 = require("./getPreferredVersions");
|
|
67
|
-
const link_1 =
|
|
68
|
-
const reportPeerDependencyIssues_1 =
|
|
44
|
+
const link_1 = require("./link");
|
|
45
|
+
const reportPeerDependencyIssues_1 = require("./reportPeerDependencyIssues");
|
|
69
46
|
const BROKEN_LOCKFILE_INTEGRITY_ERRORS = new Set([
|
|
70
47
|
'ERR_PNPM_UNEXPECTED_PKG_CONTENT_IN_STORE',
|
|
71
48
|
'ERR_PNPM_TARBALL_INTEGRITY',
|
|
72
49
|
]);
|
|
73
50
|
const DEV_PREINSTALL = 'pnpm:devPreinstall';
|
|
74
51
|
async function install(manifest, opts) {
|
|
52
|
+
const rootDir = opts.dir ?? process.cwd();
|
|
75
53
|
const projects = await mutateModules([
|
|
76
54
|
{
|
|
77
|
-
buildIndex: 0,
|
|
78
|
-
manifest,
|
|
79
55
|
mutation: 'install',
|
|
80
56
|
pruneDirectDependencies: opts.pruneDirectDependencies,
|
|
81
|
-
rootDir
|
|
57
|
+
rootDir,
|
|
82
58
|
},
|
|
83
|
-
],
|
|
59
|
+
], {
|
|
60
|
+
...opts,
|
|
61
|
+
allProjects: [{
|
|
62
|
+
buildIndex: 0,
|
|
63
|
+
manifest,
|
|
64
|
+
rootDir,
|
|
65
|
+
}],
|
|
66
|
+
});
|
|
84
67
|
return projects[0].manifest;
|
|
85
68
|
}
|
|
86
69
|
exports.install = install;
|
|
70
|
+
async function mutateModulesInSingleProject(project, maybeOpts) {
|
|
71
|
+
const [updatedProject] = await mutateModules([project], {
|
|
72
|
+
...maybeOpts,
|
|
73
|
+
allProjects: [{
|
|
74
|
+
buildIndex: 0,
|
|
75
|
+
...project,
|
|
76
|
+
}],
|
|
77
|
+
});
|
|
78
|
+
return updatedProject;
|
|
79
|
+
}
|
|
80
|
+
exports.mutateModulesInSingleProject = mutateModulesInSingleProject;
|
|
87
81
|
async function mutateModules(projects, maybeOpts) {
|
|
88
82
|
const reporter = maybeOpts?.reporter;
|
|
89
83
|
if ((reporter != null) && typeof reporter === 'function') {
|
|
90
84
|
logger_1.streamParser.on('data', reporter);
|
|
91
85
|
}
|
|
92
|
-
const opts = await (0, extendInstallOptions_1.
|
|
86
|
+
const opts = await (0, extendInstallOptions_1.extendOptions)(maybeOpts);
|
|
93
87
|
if (!opts.include.dependencies && opts.include.optionalDependencies) {
|
|
94
|
-
throw new error_1.
|
|
88
|
+
throw new error_1.PnpmError('OPTIONAL_DEPS_REQUIRE_PROD_DEPS', 'Optional dependencies cannot be installed without production dependencies');
|
|
95
89
|
}
|
|
96
90
|
const installsOnly = projects.every((project) => project.mutation === 'install');
|
|
97
91
|
if (!installsOnly)
|
|
98
92
|
opts.strictPeerDependencies = false;
|
|
99
93
|
opts['forceNewModules'] = installsOnly;
|
|
100
|
-
const rootProjectManifest =
|
|
94
|
+
const rootProjectManifest = opts.allProjects.find(({ rootDir }) => rootDir === opts.lockfileDir)?.manifest ??
|
|
101
95
|
// When running install/update on a subset of projects, the root project might not be included,
|
|
102
96
|
// so reading its manifest explicitly here.
|
|
103
97
|
await (0, read_project_manifest_1.safeReadProjectManifestOnly)(opts.lockfileDir);
|
|
104
|
-
const ctx = await (0, get_context_1.
|
|
98
|
+
const ctx = await (0, get_context_1.getContext)(opts);
|
|
105
99
|
if (opts.hooks.preResolution) {
|
|
106
100
|
await opts.hooks.preResolution({
|
|
107
101
|
currentLockfile: ctx.currentLockfile,
|
|
@@ -116,7 +110,7 @@ async function mutateModules(projects, maybeOpts) {
|
|
|
116
110
|
? cacheExpired(ctx.modulesFile.prunedAt, opts.modulesCacheMaxAge)
|
|
117
111
|
: true;
|
|
118
112
|
if (!maybeOpts.ignorePackageManifest) {
|
|
119
|
-
for (const { manifest, rootDir } of ctx.projects) {
|
|
113
|
+
for (const { manifest, rootDir } of Object.values(ctx.projects)) {
|
|
120
114
|
if (!manifest) {
|
|
121
115
|
throw new Error(`No package.json found in "${rootDir}"`);
|
|
122
116
|
}
|
|
@@ -146,7 +140,7 @@ async function mutateModules(projects, maybeOpts) {
|
|
|
146
140
|
unsafePerm: opts.unsafePerm || false,
|
|
147
141
|
};
|
|
148
142
|
if (!opts.ignoreScripts && !opts.ignorePackageManifest && rootProjectManifest?.scripts?.[DEV_PREINSTALL]) {
|
|
149
|
-
await (0, lifecycle_1.
|
|
143
|
+
await (0, lifecycle_1.runLifecycleHook)(DEV_PREINSTALL, rootProjectManifest, {
|
|
150
144
|
...scriptsOpts,
|
|
151
145
|
depPath: opts.lockfileDir,
|
|
152
146
|
pkgRoot: opts.lockfileDir,
|
|
@@ -189,37 +183,37 @@ async function mutateModules(projects, maybeOpts) {
|
|
|
189
183
|
opts.ignorePackageManifest ||
|
|
190
184
|
!needsFullResolution &&
|
|
191
185
|
opts.preferFrozenLockfile &&
|
|
192
|
-
(!opts.pruneLockfileImporters || Object.keys(ctx.wantedLockfile.importers).length === ctx.projects.length) &&
|
|
186
|
+
(!opts.pruneLockfileImporters || Object.keys(ctx.wantedLockfile.importers).length === Object.keys(ctx.projects).length) &&
|
|
193
187
|
ctx.existsWantedLockfile &&
|
|
194
188
|
ctx.wantedLockfile.lockfileVersion === constants_1.LOCKFILE_VERSION &&
|
|
195
|
-
await (0, allProjectsAreUpToDate_1.
|
|
189
|
+
await (0, allProjectsAreUpToDate_1.allProjectsAreUpToDate)(Object.values(ctx.projects), {
|
|
196
190
|
autoInstallPeers: opts.autoInstallPeers,
|
|
197
191
|
linkWorkspacePackages: opts.linkWorkspacePackagesDepth >= 0,
|
|
198
192
|
wantedLockfile: ctx.wantedLockfile,
|
|
199
193
|
workspacePackages: opts.workspacePackages,
|
|
200
194
|
}))) {
|
|
201
195
|
if (needsFullResolution) {
|
|
202
|
-
throw new error_1.
|
|
196
|
+
throw new error_1.PnpmError('FROZEN_LOCKFILE_WITH_OUTDATED_LOCKFILE', 'Cannot perform a frozen installation because the lockfile needs updates', {
|
|
203
197
|
hint: 'Note that in CI environments this setting is true by default. If you still need to run install in such cases, use "pnpm install --no-frozen-lockfile"',
|
|
204
198
|
});
|
|
205
199
|
}
|
|
206
200
|
if (opts.lockfileOnly) {
|
|
207
|
-
return projects;
|
|
201
|
+
return projects.map((mutatedProject) => ctx.projects[mutatedProject.rootDir]);
|
|
208
202
|
}
|
|
209
203
|
if (!ctx.existsWantedLockfile) {
|
|
210
|
-
if (ctx.projects.some((project) => pkgHasDependencies(project.manifest))) {
|
|
204
|
+
if (Object.values(ctx.projects).some((project) => pkgHasDependencies(project.manifest))) {
|
|
211
205
|
throw new Error(`Headless installation requires a ${constants_1.WANTED_LOCKFILE} file`);
|
|
212
206
|
}
|
|
213
207
|
}
|
|
214
208
|
else {
|
|
215
209
|
if (maybeOpts.ignorePackageManifest) {
|
|
216
|
-
logger_1.
|
|
210
|
+
logger_1.logger.info({ message: 'Importing packages to virtual store', prefix: opts.lockfileDir });
|
|
217
211
|
}
|
|
218
212
|
else {
|
|
219
|
-
logger_1.
|
|
213
|
+
logger_1.logger.info({ message: 'Lockfile is up to date, resolution step is skipped', prefix: opts.lockfileDir });
|
|
220
214
|
}
|
|
221
215
|
try {
|
|
222
|
-
await (0, headless_1.
|
|
216
|
+
await (0, headless_1.headlessInstall)({
|
|
223
217
|
...ctx,
|
|
224
218
|
...opts,
|
|
225
219
|
currentEngine: {
|
|
@@ -227,7 +221,8 @@ async function mutateModules(projects, maybeOpts) {
|
|
|
227
221
|
pnpmVersion: opts.packageManager.name === 'pnpm' ? opts.packageManager.version : '',
|
|
228
222
|
},
|
|
229
223
|
patchedDependencies: patchedDependenciesWithResolvedPath,
|
|
230
|
-
|
|
224
|
+
selectedProjectDirs: projects.map((project) => project.rootDir),
|
|
225
|
+
allProjects: ctx.projects,
|
|
231
226
|
prunedAt: ctx.modulesFile?.prunedAt,
|
|
232
227
|
pruneVirtualStore,
|
|
233
228
|
wantedLockfile: maybeOpts.ignorePackageManifest ? undefined : ctx.wantedLockfile,
|
|
@@ -244,7 +239,13 @@ async function mutateModules(projects, maybeOpts) {
|
|
|
244
239
|
mergeGitBranchLockfiles: opts.mergeGitBranchLockfiles,
|
|
245
240
|
});
|
|
246
241
|
}
|
|
247
|
-
return projects
|
|
242
|
+
return projects.map((mutatedProject) => {
|
|
243
|
+
const project = ctx.projects[mutatedProject.rootDir];
|
|
244
|
+
return {
|
|
245
|
+
...project,
|
|
246
|
+
manifest: project.originalManifest ?? project.manifest,
|
|
247
|
+
};
|
|
248
|
+
});
|
|
248
249
|
}
|
|
249
250
|
catch (error) { // eslint-disable-line
|
|
250
251
|
if (frozenLockfile ||
|
|
@@ -256,24 +257,28 @@ async function mutateModules(projects, maybeOpts) {
|
|
|
256
257
|
opts.update = true;
|
|
257
258
|
}
|
|
258
259
|
// A broken lockfile may be caused by a badly resolved Git conflict
|
|
259
|
-
logger_1.
|
|
260
|
+
logger_1.logger.warn({
|
|
260
261
|
error,
|
|
261
262
|
message: error.message,
|
|
262
263
|
prefix: ctx.lockfileDir,
|
|
263
264
|
});
|
|
264
|
-
logger_1.
|
|
265
|
+
logger_1.logger.error(new error_1.PnpmError(error.code, 'The lockfile is broken! Resolution step will be performed to fix it.'));
|
|
265
266
|
}
|
|
266
267
|
}
|
|
267
268
|
}
|
|
268
269
|
const projectsToInstall = [];
|
|
269
270
|
let preferredSpecs = null;
|
|
270
271
|
// TODO: make it concurrent
|
|
271
|
-
for (const project of
|
|
272
|
+
for (const project of projects) {
|
|
273
|
+
const projectOpts = {
|
|
274
|
+
...project,
|
|
275
|
+
...ctx.projects[project.rootDir],
|
|
276
|
+
};
|
|
272
277
|
switch (project.mutation) {
|
|
273
278
|
case 'uninstallSome':
|
|
274
279
|
projectsToInstall.push({
|
|
275
280
|
pruneDirectDependencies: false,
|
|
276
|
-
...
|
|
281
|
+
...projectOpts,
|
|
277
282
|
removePackages: project.dependencyNames,
|
|
278
283
|
updatePackageManifest: true,
|
|
279
284
|
wantedDependencies: [],
|
|
@@ -281,46 +286,47 @@ async function mutateModules(projects, maybeOpts) {
|
|
|
281
286
|
break;
|
|
282
287
|
case 'install': {
|
|
283
288
|
await installCase({
|
|
284
|
-
...
|
|
289
|
+
...projectOpts,
|
|
285
290
|
updatePackageManifest: opts.updatePackageManifest ?? opts.update,
|
|
286
291
|
});
|
|
287
292
|
break;
|
|
288
293
|
}
|
|
289
294
|
case 'installSome': {
|
|
290
295
|
await installSome({
|
|
291
|
-
...
|
|
296
|
+
...projectOpts,
|
|
292
297
|
updatePackageManifest: opts.updatePackageManifest !== false,
|
|
293
298
|
});
|
|
294
299
|
break;
|
|
295
300
|
}
|
|
296
301
|
case 'unlink': {
|
|
297
|
-
const packageDirs = await (0, read_modules_dir_1.
|
|
298
|
-
const externalPackages = await (0, p_filter_1.default)(packageDirs, async (packageDir) => isExternalLink(ctx.storeDir,
|
|
299
|
-
const allDeps = (0, manifest_utils_1.getAllDependenciesFromManifest)(
|
|
302
|
+
const packageDirs = await (0, read_modules_dir_1.readModulesDir)(projectOpts.modulesDir);
|
|
303
|
+
const externalPackages = await (0, p_filter_1.default)(packageDirs, async (packageDir) => isExternalLink(ctx.storeDir, projectOpts.modulesDir, packageDir));
|
|
304
|
+
const allDeps = (0, manifest_utils_1.getAllDependenciesFromManifest)(projectOpts.manifest);
|
|
300
305
|
const packagesToInstall = [];
|
|
301
306
|
for (const pkgName of externalPackages) {
|
|
302
|
-
await (0, rimraf_1.default)(path_1.default.join(
|
|
307
|
+
await (0, rimraf_1.default)(path_1.default.join(projectOpts.modulesDir, pkgName));
|
|
303
308
|
if (allDeps[pkgName]) {
|
|
304
309
|
packagesToInstall.push(pkgName);
|
|
305
310
|
}
|
|
306
311
|
}
|
|
307
|
-
if (packagesToInstall.length === 0)
|
|
308
|
-
return projects;
|
|
312
|
+
if (packagesToInstall.length === 0) {
|
|
313
|
+
return projects.map((mutatedProject) => ctx.projects[mutatedProject.rootDir]);
|
|
314
|
+
}
|
|
309
315
|
// TODO: install only those that were unlinked
|
|
310
316
|
// but don't update their version specs in package.json
|
|
311
|
-
await installCase({ ...
|
|
317
|
+
await installCase({ ...projectOpts, mutation: 'install' });
|
|
312
318
|
break;
|
|
313
319
|
}
|
|
314
320
|
case 'unlinkSome': {
|
|
315
|
-
if (
|
|
316
|
-
await (0, remove_bins_1.removeBin)(path_1.default.join(opts.globalBin,
|
|
321
|
+
if (projectOpts.manifest?.name && opts.globalBin) {
|
|
322
|
+
await (0, remove_bins_1.removeBin)(path_1.default.join(opts.globalBin, projectOpts.manifest?.name));
|
|
317
323
|
}
|
|
318
324
|
const packagesToInstall = [];
|
|
319
|
-
const allDeps = (0, manifest_utils_1.getAllDependenciesFromManifest)(
|
|
325
|
+
const allDeps = (0, manifest_utils_1.getAllDependenciesFromManifest)(projectOpts.manifest);
|
|
320
326
|
for (const depName of project.dependencyNames) {
|
|
321
327
|
try {
|
|
322
|
-
if (!await isExternalLink(ctx.storeDir,
|
|
323
|
-
logger_1.
|
|
328
|
+
if (!await isExternalLink(ctx.storeDir, projectOpts.modulesDir, depName)) {
|
|
329
|
+
logger_1.logger.warn({
|
|
324
330
|
message: `${depName} is not an external link`,
|
|
325
331
|
prefix: project.rootDir,
|
|
326
332
|
});
|
|
@@ -331,17 +337,18 @@ async function mutateModules(projects, maybeOpts) {
|
|
|
331
337
|
if (err['code'] !== 'ENOENT')
|
|
332
338
|
throw err;
|
|
333
339
|
}
|
|
334
|
-
await (0, rimraf_1.default)(path_1.default.join(
|
|
340
|
+
await (0, rimraf_1.default)(path_1.default.join(projectOpts.modulesDir, depName));
|
|
335
341
|
if (allDeps[depName]) {
|
|
336
342
|
packagesToInstall.push(depName);
|
|
337
343
|
}
|
|
338
344
|
}
|
|
339
|
-
if (packagesToInstall.length === 0)
|
|
340
|
-
return projects;
|
|
345
|
+
if (packagesToInstall.length === 0) {
|
|
346
|
+
return projects.map((mutatedProject) => ctx.projects[mutatedProject.rootDir]);
|
|
347
|
+
}
|
|
341
348
|
// TODO: install only those that were unlinked
|
|
342
349
|
// but don't update their version specs in package.json
|
|
343
350
|
await installSome({
|
|
344
|
-
...
|
|
351
|
+
...projectOpts,
|
|
345
352
|
dependencySelectors: packagesToInstall,
|
|
346
353
|
mutation: 'installSome',
|
|
347
354
|
updatePackageManifest: false,
|
|
@@ -381,7 +388,7 @@ async function mutateModules(projects, maybeOpts) {
|
|
|
381
388
|
if (preferredSpecs == null) {
|
|
382
389
|
preferredSpecs = (0, getPreferredVersions_1.getAllUniqueSpecs)((0, flatten_1.default)(Object.values(opts.workspacePackages).map(obj => Object.values(obj))).map(({ manifest }) => manifest));
|
|
383
390
|
}
|
|
384
|
-
const wantedDeps = (0, parseWantedDependencies_1.
|
|
391
|
+
const wantedDeps = (0, parseWantedDependencies_1.parseWantedDependencies)(project.dependencySelectors, {
|
|
385
392
|
allowNew: project.allowNew !== false,
|
|
386
393
|
currentPrefs,
|
|
387
394
|
defaultTag: opts.tag,
|
|
@@ -472,28 +479,35 @@ function forgetResolutionsOfPrevWantedDeps(importer, wantedDeps) {
|
|
|
472
479
|
}
|
|
473
480
|
}
|
|
474
481
|
async function addDependenciesToPackage(manifest, dependencySelectors, opts) {
|
|
482
|
+
const rootDir = opts.dir ?? process.cwd();
|
|
475
483
|
const projects = await mutateModules([
|
|
476
484
|
{
|
|
477
|
-
binsDir: opts.bin,
|
|
478
485
|
allowNew: opts.allowNew,
|
|
479
486
|
dependencySelectors,
|
|
480
|
-
manifest,
|
|
481
487
|
mutation: 'installSome',
|
|
482
488
|
peer: opts.peer,
|
|
483
489
|
pinnedVersion: opts.pinnedVersion,
|
|
484
|
-
rootDir
|
|
490
|
+
rootDir,
|
|
485
491
|
targetDependenciesField: opts.targetDependenciesField,
|
|
486
492
|
},
|
|
487
493
|
], {
|
|
488
494
|
...opts,
|
|
489
495
|
lockfileDir: opts.lockfileDir ?? opts.dir,
|
|
496
|
+
allProjects: [
|
|
497
|
+
{
|
|
498
|
+
buildIndex: 0,
|
|
499
|
+
binsDir: opts.bin,
|
|
500
|
+
manifest,
|
|
501
|
+
rootDir,
|
|
502
|
+
},
|
|
503
|
+
],
|
|
490
504
|
});
|
|
491
505
|
return projects[0].manifest;
|
|
492
506
|
}
|
|
493
507
|
exports.addDependenciesToPackage = addDependenciesToPackage;
|
|
494
508
|
const _installInContext = async (projects, ctx, opts) => {
|
|
495
509
|
if (opts.lockfileOnly && ctx.existsCurrentLockfile) {
|
|
496
|
-
logger_1.
|
|
510
|
+
logger_1.logger.warn({
|
|
497
511
|
message: '`node_modules` is present. Lockfile only installation will make it out-of-date',
|
|
498
512
|
prefix: ctx.lockfileDir,
|
|
499
513
|
});
|
|
@@ -516,7 +530,7 @@ const _installInContext = async (projects, ctx, opts) => {
|
|
|
516
530
|
.map(async (project) => {
|
|
517
531
|
if (project.mutation !== 'uninstallSome')
|
|
518
532
|
return;
|
|
519
|
-
const _removeDeps = async (manifest) => (0, removeDeps_1.
|
|
533
|
+
const _removeDeps = async (manifest) => (0, removeDeps_1.removeDeps)(manifest, project.dependencyNames, { prefix: project.rootDir, saveType: project.targetDependenciesField });
|
|
520
534
|
project.manifest = await _removeDeps(project.manifest);
|
|
521
535
|
if (project.originalManifest != null) {
|
|
522
536
|
project.originalManifest = await _removeDeps(project.originalManifest);
|
|
@@ -552,7 +566,7 @@ const _installInContext = async (projects, ctx, opts) => {
|
|
|
552
566
|
},
|
|
553
567
|
}), {});
|
|
554
568
|
}
|
|
555
|
-
let { dependenciesGraph, dependenciesByProjectId, finishLockfileUpdates, linkedDependenciesByProjectId, newLockfile, outdatedDependencies, peerDependencyIssuesByProjects, wantedToBeSkippedPackageIds, waitTillAllFetchingsFinish, } = await (0, resolve_dependencies_1.
|
|
569
|
+
let { dependenciesGraph, dependenciesByProjectId, finishLockfileUpdates, linkedDependenciesByProjectId, newLockfile, outdatedDependencies, peerDependencyIssuesByProjects, wantedToBeSkippedPackageIds, waitTillAllFetchingsFinish, } = await (0, resolve_dependencies_1.resolveDependencies)(projects, {
|
|
556
570
|
allowBuild: createAllowBuildFunction(opts),
|
|
557
571
|
allowedDeprecatedVersions: opts.allowedDeprecatedVersions,
|
|
558
572
|
allowNonAppliedPatches: opts.allowNonAppliedPatches,
|
|
@@ -623,7 +637,7 @@ const _installInContext = async (projects, ctx, opts) => {
|
|
|
623
637
|
mergeGitBranchLockfiles: opts.mergeGitBranchLockfiles,
|
|
624
638
|
};
|
|
625
639
|
if (!opts.lockfileOnly && opts.enableModulesDir) {
|
|
626
|
-
const result = await (0, link_1.
|
|
640
|
+
const result = await (0, link_1.linkPackages)(projects, dependenciesGraph, {
|
|
627
641
|
currentLockfile: ctx.currentLockfile,
|
|
628
642
|
dependenciesByProjectId,
|
|
629
643
|
depsStateCache,
|
|
@@ -685,7 +699,7 @@ const _installInContext = async (projects, ctx, opts) => {
|
|
|
685
699
|
...(0, lifecycle_1.makeNodeRequireOption)(path_1.default.join(opts.lockfileDir, '.pnp.cjs')),
|
|
686
700
|
};
|
|
687
701
|
}
|
|
688
|
-
await (0, build_modules_1.
|
|
702
|
+
await (0, build_modules_1.buildModules)(dependenciesGraph, rootNodes, {
|
|
689
703
|
childConcurrency: opts.childConcurrency,
|
|
690
704
|
depsStateCache,
|
|
691
705
|
depsToBuild: new Set(result.newDepPaths),
|
|
@@ -708,7 +722,7 @@ const _installInContext = async (projects, ctx, opts) => {
|
|
|
708
722
|
});
|
|
709
723
|
}
|
|
710
724
|
}
|
|
711
|
-
const binWarn = (prefix, message) => logger_1.
|
|
725
|
+
const binWarn = (prefix, message) => logger_1.logger.info({ message, prefix });
|
|
712
726
|
if (result.newDepPaths?.length) {
|
|
713
727
|
const newPkgs = (0, props_1.default)(result.newDepPaths, dependenciesGraph);
|
|
714
728
|
await linkAllBins(newPkgs, dependenciesGraph, {
|
|
@@ -727,7 +741,7 @@ const _installInContext = async (projects, ctx, opts) => {
|
|
|
727
741
|
}
|
|
728
742
|
return prev;
|
|
729
743
|
}, {});
|
|
730
|
-
linkedPackages = await (0, link_bins_1.
|
|
744
|
+
linkedPackages = await (0, link_bins_1.linkBins)(project.modulesDir, project.binsDir, {
|
|
731
745
|
allowExoticManifests: true,
|
|
732
746
|
preferSymlinkedExecutables: opts.preferSymlinkedExecutables,
|
|
733
747
|
projectManifest: project.manifest,
|
|
@@ -765,7 +779,7 @@ const _installInContext = async (projects, ctx, opts) => {
|
|
|
765
779
|
if (opts.global && projectToInstall.mutation.includes('install')) {
|
|
766
780
|
projectToInstall.wantedDependencies.forEach(pkg => {
|
|
767
781
|
if (!linkedPackages?.includes(pkg.alias)) {
|
|
768
|
-
logger_1.
|
|
782
|
+
logger_1.logger.warn({ message: `${pkg.alias ?? pkg.pref} has no binaries`, prefix: opts.lockfileDir });
|
|
769
783
|
}
|
|
770
784
|
});
|
|
771
785
|
}
|
|
@@ -791,7 +805,7 @@ const _installInContext = async (projects, ctx, opts) => {
|
|
|
791
805
|
injectedDeps[project.id] = project.targetDirs.map((targetDir) => path_1.default.relative(opts.lockfileDir, targetDir));
|
|
792
806
|
}
|
|
793
807
|
}
|
|
794
|
-
return (0, modules_yaml_1.
|
|
808
|
+
return (0, modules_yaml_1.writeModulesManifest)(ctx.rootModulesDir, {
|
|
795
809
|
...ctx.modulesFile,
|
|
796
810
|
hoistedDependencies: result.newHoistedDependencies,
|
|
797
811
|
hoistPattern: ctx.hoistPattern,
|
|
@@ -839,7 +853,7 @@ const _installInContext = async (projects, ctx, opts) => {
|
|
|
839
853
|
await waitTillAllFetchingsFinish();
|
|
840
854
|
core_loggers_1.summaryLogger.debug({ prefix: opts.lockfileDir });
|
|
841
855
|
await opts.storeController.close();
|
|
842
|
-
(0, reportPeerDependencyIssues_1.
|
|
856
|
+
(0, reportPeerDependencyIssues_1.reportPeerDependencyIssues)(peerDependencyIssuesByProjects, {
|
|
843
857
|
lockfileDir: opts.lockfileDir,
|
|
844
858
|
strictPeerDependencies: opts.strictPeerDependencies,
|
|
845
859
|
});
|
|
@@ -870,14 +884,15 @@ const installInContext = async (projects, ctx, opts) => {
|
|
|
870
884
|
...opts,
|
|
871
885
|
lockfileOnly: true,
|
|
872
886
|
});
|
|
873
|
-
await (0, headless_1.
|
|
887
|
+
await (0, headless_1.headlessInstall)({
|
|
874
888
|
...ctx,
|
|
875
889
|
...opts,
|
|
876
890
|
currentEngine: {
|
|
877
891
|
nodeVersion: opts.nodeVersion,
|
|
878
892
|
pnpmVersion: opts.packageManager.name === 'pnpm' ? opts.packageManager.version : '',
|
|
879
893
|
},
|
|
880
|
-
|
|
894
|
+
selectedProjectDirs: projects.map((project) => project.rootDir),
|
|
895
|
+
allProjects: ctx.projects,
|
|
881
896
|
prunedAt: ctx.modulesFile?.prunedAt,
|
|
882
897
|
wantedLockfile: result.newLockfile,
|
|
883
898
|
});
|
|
@@ -891,12 +906,12 @@ const installInContext = async (projects, ctx, opts) => {
|
|
|
891
906
|
opts.needsFullResolution = true;
|
|
892
907
|
// Ideally, we would not update but currently there is no other way to redownload the integrity of the package
|
|
893
908
|
opts.update = true;
|
|
894
|
-
logger_1.
|
|
909
|
+
logger_1.logger.warn({
|
|
895
910
|
error,
|
|
896
911
|
message: error.message,
|
|
897
912
|
prefix: ctx.lockfileDir,
|
|
898
913
|
});
|
|
899
|
-
logger_1.
|
|
914
|
+
logger_1.logger.error(new error_1.PnpmError(error.code, 'The lockfile is broken! A full installation will be performed in an attempt to fix it.'));
|
|
900
915
|
return _installInContext(projects, ctx, opts);
|
|
901
916
|
}
|
|
902
917
|
};
|