@ts-dev-tools/core 1.9.14 → 1.11.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/dist/install/command.js +4 -0
- package/dist/services/PackageManagerService.d.ts +3 -5
- package/dist/services/PackageManagerService.js +23 -208
- package/dist/services/PeerDependenciesService.d.ts +14 -0
- package/dist/services/PeerDependenciesService.js +234 -0
- package/dist/services/SymlinkDependenciesService.js +9 -4
- package/dist/services/package-manager/AbstractPackageManagerAdapter.d.ts +16 -0
- package/dist/services/package-manager/AbstractPackageManagerAdapter.js +155 -0
- package/dist/services/package-manager/NpmPackageManagerAdapter.d.ts +7 -0
- package/dist/services/package-manager/NpmPackageManagerAdapter.js +165 -0
- package/dist/services/package-manager/PackageManagerAdapter.d.ts +6 -0
- package/dist/services/package-manager/PackageManagerAdapter.js +2 -0
- package/dist/services/package-manager/PackageManagerType.d.ts +4 -0
- package/dist/services/package-manager/PackageManagerType.js +8 -0
- package/dist/services/package-manager/YarnPackageManagerAdapter.d.ts +14 -0
- package/dist/services/package-manager/YarnPackageManagerAdapter.js +321 -0
- package/package.json +2 -2
package/dist/install/command.js
CHANGED
|
@@ -43,6 +43,7 @@ var constants_1 = require("../constants");
|
|
|
43
43
|
var DuplicateDependenciesService_1 = require("../services/DuplicateDependenciesService");
|
|
44
44
|
var MigrationsService_1 = require("../services/MigrationsService");
|
|
45
45
|
var PackageJson_1 = require("../services/PackageJson");
|
|
46
|
+
var PeerDependenciesService_1 = require("../services/PeerDependenciesService");
|
|
46
47
|
var SymlinkDependenciesService_1 = require("../services/SymlinkDependenciesService");
|
|
47
48
|
function install(_a) {
|
|
48
49
|
return __awaiter(this, arguments, void 0, function (_b) {
|
|
@@ -70,6 +71,9 @@ function install(_a) {
|
|
|
70
71
|
_d.sent();
|
|
71
72
|
return [4 /*yield*/, SymlinkDependenciesService_1.SymlinkDependenciesService.executeSymlinking(absoluteProjectDir)];
|
|
72
73
|
case 2:
|
|
74
|
+
_d.sent();
|
|
75
|
+
return [4 /*yield*/, PeerDependenciesService_1.PeerDependenciesService.executeResolution(absoluteProjectDir)];
|
|
76
|
+
case 3:
|
|
73
77
|
_d.sent();
|
|
74
78
|
DuplicateDependenciesService_1.DuplicateDependenciesService.executeDeduplication(absoluteProjectDir);
|
|
75
79
|
console.info("Installation done!");
|
|
@@ -1,12 +1,10 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
npm = "npm"
|
|
4
|
-
}
|
|
1
|
+
import { PackageManagerType } from "./package-manager/PackageManagerType";
|
|
2
|
+
export { PackageManagerType } from "./package-manager/PackageManagerType";
|
|
5
3
|
export declare class PackageManagerService {
|
|
6
4
|
static detectPackageManager(dirPath: string): PackageManagerType;
|
|
7
5
|
static addDevPackage(packageName: string, dirPath: string): Promise<void>;
|
|
8
6
|
static isMonorepo(dirPath: string): Promise<boolean>;
|
|
9
7
|
static isPackageInstalled(packageName: string, dirPath: string): Promise<boolean>;
|
|
10
8
|
static getNodeModulesPath(dirPath: string): Promise<string>;
|
|
11
|
-
private static
|
|
9
|
+
private static getAdapter;
|
|
12
10
|
}
|
|
@@ -37,246 +37,61 @@ var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
|
37
37
|
};
|
|
38
38
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
39
|
exports.PackageManagerService = exports.PackageManagerType = void 0;
|
|
40
|
-
var child_process_1 = require("child_process");
|
|
41
40
|
var fs_1 = require("fs");
|
|
42
41
|
var path_1 = require("path");
|
|
43
|
-
var
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
42
|
+
var NpmPackageManagerAdapter_1 = require("./package-manager/NpmPackageManagerAdapter");
|
|
43
|
+
var PackageManagerType_1 = require("./package-manager/PackageManagerType");
|
|
44
|
+
var YarnPackageManagerAdapter_1 = require("./package-manager/YarnPackageManagerAdapter");
|
|
45
|
+
var PackageManagerType_2 = require("./package-manager/PackageManagerType");
|
|
46
|
+
Object.defineProperty(exports, "PackageManagerType", { enumerable: true, get: function () { return PackageManagerType_2.PackageManagerType; } });
|
|
48
47
|
var PackageManagerService = /** @class */ (function () {
|
|
49
48
|
function PackageManagerService() {
|
|
50
49
|
}
|
|
51
50
|
PackageManagerService.detectPackageManager = function (dirPath) {
|
|
52
51
|
if ((0, fs_1.existsSync)((0, path_1.join)(dirPath, "yarn.lock"))) {
|
|
53
|
-
return PackageManagerType.yarn;
|
|
52
|
+
return PackageManagerType_1.PackageManagerType.yarn;
|
|
54
53
|
}
|
|
55
|
-
return PackageManagerType.npm;
|
|
54
|
+
return PackageManagerType_1.PackageManagerType.npm;
|
|
56
55
|
};
|
|
57
56
|
PackageManagerService.addDevPackage = function (packageName, dirPath) {
|
|
58
57
|
return __awaiter(this, void 0, void 0, function () {
|
|
59
|
-
var packageManager, isMonorepo, args;
|
|
60
58
|
return __generator(this, function (_a) {
|
|
61
|
-
|
|
62
|
-
case 0:
|
|
63
|
-
packageManager = PackageManagerService.detectPackageManager(dirPath);
|
|
64
|
-
return [4 /*yield*/, PackageManagerService.isMonorepo(dirPath)];
|
|
65
|
-
case 1:
|
|
66
|
-
isMonorepo = _a.sent();
|
|
67
|
-
args = [packageManager];
|
|
68
|
-
switch (packageManager) {
|
|
69
|
-
case PackageManagerType.yarn:
|
|
70
|
-
args.push("add", "--dev");
|
|
71
|
-
if (isMonorepo) {
|
|
72
|
-
args.push("--ignore-workspace-root-check");
|
|
73
|
-
}
|
|
74
|
-
break;
|
|
75
|
-
case PackageManagerType.npm:
|
|
76
|
-
args.push("install", "--save-dev");
|
|
77
|
-
if (isMonorepo) {
|
|
78
|
-
args.push("--no-workspaces");
|
|
79
|
-
}
|
|
80
|
-
break;
|
|
81
|
-
}
|
|
82
|
-
args.push(packageName);
|
|
83
|
-
return [4 /*yield*/, PackageManagerService.execCommand(args, dirPath, true)];
|
|
84
|
-
case 2:
|
|
85
|
-
_a.sent();
|
|
86
|
-
return [2 /*return*/];
|
|
87
|
-
}
|
|
59
|
+
return [2 /*return*/, PackageManagerService.getAdapter(dirPath).addDevPackage(packageName, dirPath)];
|
|
88
60
|
});
|
|
89
61
|
});
|
|
90
62
|
};
|
|
91
63
|
PackageManagerService.isMonorepo = function (dirPath) {
|
|
92
64
|
return __awaiter(this, void 0, void 0, function () {
|
|
93
|
-
var packageManager, args, output;
|
|
94
65
|
return __generator(this, function (_a) {
|
|
95
|
-
|
|
96
|
-
case 0:
|
|
97
|
-
packageManager = PackageManagerService.detectPackageManager(dirPath);
|
|
98
|
-
args = [packageManager];
|
|
99
|
-
switch (packageManager) {
|
|
100
|
-
case PackageManagerType.yarn:
|
|
101
|
-
args.push("workspaces", "info");
|
|
102
|
-
break;
|
|
103
|
-
case PackageManagerType.npm:
|
|
104
|
-
args.push("--workspaces", "list");
|
|
105
|
-
break;
|
|
106
|
-
}
|
|
107
|
-
args.push("> /dev/null 2>&1 && echo true || echo false;");
|
|
108
|
-
return [4 /*yield*/, PackageManagerService.execCommand(args, dirPath, true)];
|
|
109
|
-
case 1:
|
|
110
|
-
output = _a.sent();
|
|
111
|
-
return [2 /*return*/, output.trim() === "true"];
|
|
112
|
-
}
|
|
66
|
+
return [2 /*return*/, PackageManagerService.getAdapter(dirPath).isMonorepo(dirPath)];
|
|
113
67
|
});
|
|
114
68
|
});
|
|
115
69
|
};
|
|
116
70
|
PackageManagerService.isPackageInstalled = function (packageName, dirPath) {
|
|
117
71
|
return __awaiter(this, void 0, void 0, function () {
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
return __generator(this, function (_c) {
|
|
121
|
-
switch (_c.label) {
|
|
122
|
-
case 0:
|
|
123
|
-
packageManager = PackageManagerService.detectPackageManager(dirPath);
|
|
124
|
-
args = [packageManager, "list", "--depth=1", "--json"];
|
|
125
|
-
switch (packageManager) {
|
|
126
|
-
case PackageManagerType.yarn:
|
|
127
|
-
args.push("--pattern=".concat(packageName));
|
|
128
|
-
break;
|
|
129
|
-
case PackageManagerType.npm:
|
|
130
|
-
args.push("--no-progress", "--non-interactive", packageName);
|
|
131
|
-
break;
|
|
132
|
-
}
|
|
133
|
-
_c.label = 1;
|
|
134
|
-
case 1:
|
|
135
|
-
_c.trys.push([1, 3, , 4]);
|
|
136
|
-
return [4 /*yield*/, PackageManagerService.execCommand(args, dirPath, true)];
|
|
137
|
-
case 2:
|
|
138
|
-
output = _c.sent();
|
|
139
|
-
return [3 /*break*/, 4];
|
|
140
|
-
case 3:
|
|
141
|
-
error_1 = _c.sent();
|
|
142
|
-
// npm returns non-zero exit code when package is not found, but still outputs valid JSON
|
|
143
|
-
if (typeof error_1 === "string") {
|
|
144
|
-
try {
|
|
145
|
-
// Try to parse as JSON - if successful, use it as output
|
|
146
|
-
JSON.parse(error_1.trim());
|
|
147
|
-
output = error_1;
|
|
148
|
-
}
|
|
149
|
-
catch (_d) {
|
|
150
|
-
// If it's not valid JSON, the package is not installed
|
|
151
|
-
return [2 /*return*/, false];
|
|
152
|
-
}
|
|
153
|
-
}
|
|
154
|
-
else {
|
|
155
|
-
return [2 /*return*/, false];
|
|
156
|
-
}
|
|
157
|
-
return [3 /*break*/, 4];
|
|
158
|
-
case 4:
|
|
159
|
-
installedPackages = JSON.parse(output);
|
|
160
|
-
switch (packageManager) {
|
|
161
|
-
case PackageManagerType.yarn:
|
|
162
|
-
return [2 /*return*/, (_b = (_a = installedPackages === null || installedPackages === void 0 ? void 0 : installedPackages.data) === null || _a === void 0 ? void 0 : _a.trees) === null || _b === void 0 ? void 0 : _b.some(function (tree) {
|
|
163
|
-
return tree.name.startsWith(packageName + "@");
|
|
164
|
-
})];
|
|
165
|
-
case PackageManagerType.npm:
|
|
166
|
-
return [2 /*return*/, installedPackages.dependencies
|
|
167
|
-
? Object.prototype.hasOwnProperty.call(installedPackages.dependencies, packageName)
|
|
168
|
-
: false];
|
|
169
|
-
}
|
|
170
|
-
return [2 /*return*/];
|
|
171
|
-
}
|
|
72
|
+
return __generator(this, function (_a) {
|
|
73
|
+
return [2 /*return*/, PackageManagerService.getAdapter(dirPath).isPackageInstalled(packageName, dirPath)];
|
|
172
74
|
});
|
|
173
75
|
});
|
|
174
76
|
};
|
|
175
77
|
PackageManagerService.getNodeModulesPath = function (dirPath) {
|
|
176
78
|
return __awaiter(this, void 0, void 0, function () {
|
|
177
|
-
var packageManager, nodeModulesPath, _a;
|
|
178
|
-
return __generator(this, function (_b) {
|
|
179
|
-
switch (_b.label) {
|
|
180
|
-
case 0:
|
|
181
|
-
packageManager = PackageManagerService.detectPackageManager(dirPath);
|
|
182
|
-
_a = packageManager;
|
|
183
|
-
switch (_a) {
|
|
184
|
-
case PackageManagerType.yarn: return [3 /*break*/, 1];
|
|
185
|
-
case PackageManagerType.npm: return [3 /*break*/, 2];
|
|
186
|
-
}
|
|
187
|
-
return [3 /*break*/, 4];
|
|
188
|
-
case 1:
|
|
189
|
-
nodeModulesPath = (0, path_1.join)(dirPath, "node_modules");
|
|
190
|
-
return [3 /*break*/, 4];
|
|
191
|
-
case 2: return [4 /*yield*/, PackageManagerService.execCommand([packageManager, "root", "--no-progress", "--non-interactive"], dirPath, true)];
|
|
192
|
-
case 3:
|
|
193
|
-
nodeModulesPath = (_b.sent()).trim();
|
|
194
|
-
return [3 /*break*/, 4];
|
|
195
|
-
case 4:
|
|
196
|
-
if (nodeModulesPath) {
|
|
197
|
-
return [2 /*return*/, nodeModulesPath];
|
|
198
|
-
}
|
|
199
|
-
throw new Error("Node modules path not found for package manager ".concat(packageManager));
|
|
200
|
-
}
|
|
201
|
-
});
|
|
202
|
-
});
|
|
203
|
-
};
|
|
204
|
-
PackageManagerService.execCommand = function (args_1, cwd_1) {
|
|
205
|
-
return __awaiter(this, arguments, void 0, function (args, cwd, silent) {
|
|
206
|
-
var cmd, cmdArgs, useShell, SHELL_OPERATORS_1, hasShellSyntax;
|
|
207
|
-
if (silent === void 0) { silent = false; }
|
|
208
79
|
return __generator(this, function (_a) {
|
|
209
|
-
|
|
210
|
-
if (Array.isArray(args) && args.length === 0) {
|
|
211
|
-
throw new Error("Command args must not be empty");
|
|
212
|
-
}
|
|
213
|
-
if (typeof args === "string" && args.trim().length === 0) {
|
|
214
|
-
throw new Error("Command args must not be empty");
|
|
215
|
-
}
|
|
216
|
-
if (cwd && !(0, fs_1.existsSync)(cwd)) {
|
|
217
|
-
throw new Error("Directory \"".concat(cwd, "\" does not exist"));
|
|
218
|
-
}
|
|
219
|
-
useShell = false;
|
|
220
|
-
if (Array.isArray(args)) {
|
|
221
|
-
SHELL_OPERATORS_1 = [">", "|", "&&", "||", ";", "<", ">>", "2>", "&", "$("];
|
|
222
|
-
hasShellSyntax = args.some(function (arg) {
|
|
223
|
-
var trimmedArg = arg.trim();
|
|
224
|
-
return SHELL_OPERATORS_1.some(function (op) {
|
|
225
|
-
return trimmedArg.startsWith(op) ||
|
|
226
|
-
trimmedArg.endsWith(op) ||
|
|
227
|
-
trimmedArg.includes(" ".concat(op, " ")) ||
|
|
228
|
-
trimmedArg.includes(" ".concat(op)) ||
|
|
229
|
-
trimmedArg.includes("".concat(op, " "));
|
|
230
|
-
});
|
|
231
|
-
});
|
|
232
|
-
if (hasShellSyntax) {
|
|
233
|
-
// Use shell mode for commands with shell syntax
|
|
234
|
-
cmd = args.join(" ").trim();
|
|
235
|
-
cmdArgs = [];
|
|
236
|
-
useShell = true;
|
|
237
|
-
}
|
|
238
|
-
else {
|
|
239
|
-
// Use array mode for normal commands
|
|
240
|
-
cmd = args[0];
|
|
241
|
-
cmdArgs = args.slice(1);
|
|
242
|
-
}
|
|
243
|
-
}
|
|
244
|
-
else {
|
|
245
|
-
cmd = args;
|
|
246
|
-
cmdArgs = [];
|
|
247
|
-
useShell = true;
|
|
248
|
-
}
|
|
249
|
-
return [2 /*return*/, new Promise(function (resolve, reject) {
|
|
250
|
-
var child = (0, child_process_1.spawn)(cmd, cmdArgs, {
|
|
251
|
-
stdio: silent ? "pipe" : "inherit",
|
|
252
|
-
shell: useShell,
|
|
253
|
-
windowsVerbatimArguments: true,
|
|
254
|
-
cwd: cwd,
|
|
255
|
-
});
|
|
256
|
-
var output = "";
|
|
257
|
-
var error = "";
|
|
258
|
-
child.on("exit", function (code) {
|
|
259
|
-
if (code) {
|
|
260
|
-
// For commands that output to stdout even on error (like npm list),
|
|
261
|
-
// reject with the output so caller can handle it
|
|
262
|
-
return reject(output.length > 0 ? output : error);
|
|
263
|
-
}
|
|
264
|
-
resolve(output);
|
|
265
|
-
});
|
|
266
|
-
if (child.stdout) {
|
|
267
|
-
child.stdout.on("data", function (data) {
|
|
268
|
-
output += "\n".concat(data);
|
|
269
|
-
});
|
|
270
|
-
}
|
|
271
|
-
if (child.stderr) {
|
|
272
|
-
child.stderr.on("data", function (data) {
|
|
273
|
-
error += "\n".concat(data);
|
|
274
|
-
});
|
|
275
|
-
}
|
|
276
|
-
})];
|
|
80
|
+
return [2 /*return*/, PackageManagerService.getAdapter(dirPath).getNodeModulesPath(dirPath)];
|
|
277
81
|
});
|
|
278
82
|
});
|
|
279
83
|
};
|
|
84
|
+
PackageManagerService.getAdapter = function (dirPath) {
|
|
85
|
+
var packageManager = PackageManagerService.detectPackageManager(dirPath);
|
|
86
|
+
switch (packageManager) {
|
|
87
|
+
case PackageManagerType_1.PackageManagerType.yarn:
|
|
88
|
+
return new YarnPackageManagerAdapter_1.YarnPackageManagerAdapter();
|
|
89
|
+
case PackageManagerType_1.PackageManagerType.npm:
|
|
90
|
+
return new NpmPackageManagerAdapter_1.NpmPackageManagerAdapter();
|
|
91
|
+
default:
|
|
92
|
+
throw new Error("Unsupported package manager: ".concat(packageManager));
|
|
93
|
+
}
|
|
94
|
+
};
|
|
280
95
|
return PackageManagerService;
|
|
281
96
|
}());
|
|
282
97
|
exports.PackageManagerService = PackageManagerService;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export declare class PeerDependenciesService {
|
|
2
|
+
static DEPENDENCIES_FOLDER: string;
|
|
3
|
+
static executeResolution(absoluteProjectDir: string): Promise<void>;
|
|
4
|
+
private static getPackagePeerDependencies;
|
|
5
|
+
private static getPackagesToInspect;
|
|
6
|
+
private static resolveDependencyPath;
|
|
7
|
+
private static resolvePeerSourcePath;
|
|
8
|
+
private static resolveFromNestedNodeModules;
|
|
9
|
+
private static getTopLevelPackageDirs;
|
|
10
|
+
private static resolvePackagePathFrom;
|
|
11
|
+
private static canResolveFromConsumerRoot;
|
|
12
|
+
private static symlinkMissingPeers;
|
|
13
|
+
private static symlinkPeer;
|
|
14
|
+
}
|
|
@@ -0,0 +1,234 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __assign = (this && this.__assign) || function () {
|
|
3
|
+
__assign = Object.assign || function(t) {
|
|
4
|
+
for (var s, i = 1, n = arguments.length; i < n; i++) {
|
|
5
|
+
s = arguments[i];
|
|
6
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
|
|
7
|
+
t[p] = s[p];
|
|
8
|
+
}
|
|
9
|
+
return t;
|
|
10
|
+
};
|
|
11
|
+
return __assign.apply(this, arguments);
|
|
12
|
+
};
|
|
13
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
14
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
15
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
16
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
17
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
18
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
19
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
20
|
+
});
|
|
21
|
+
};
|
|
22
|
+
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
23
|
+
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype);
|
|
24
|
+
return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
25
|
+
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
26
|
+
function step(op) {
|
|
27
|
+
if (f) throw new TypeError("Generator is already executing.");
|
|
28
|
+
while (g && (g = 0, op[0] && (_ = 0)), _) try {
|
|
29
|
+
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
30
|
+
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
31
|
+
switch (op[0]) {
|
|
32
|
+
case 0: case 1: t = op; break;
|
|
33
|
+
case 4: _.label++; return { value: op[1], done: false };
|
|
34
|
+
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
35
|
+
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
36
|
+
default:
|
|
37
|
+
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
38
|
+
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
39
|
+
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
40
|
+
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
41
|
+
if (t[2]) _.ops.pop();
|
|
42
|
+
_.trys.pop(); continue;
|
|
43
|
+
}
|
|
44
|
+
op = body.call(thisArg, _);
|
|
45
|
+
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
46
|
+
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
47
|
+
}
|
|
48
|
+
};
|
|
49
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
50
|
+
exports.PeerDependenciesService = void 0;
|
|
51
|
+
var fs_1 = require("fs");
|
|
52
|
+
var path_1 = require("path");
|
|
53
|
+
var PackageJson_1 = require("./PackageJson");
|
|
54
|
+
var PluginService_1 = require("./PluginService");
|
|
55
|
+
var PeerDependenciesService = /** @class */ (function () {
|
|
56
|
+
function PeerDependenciesService() {
|
|
57
|
+
}
|
|
58
|
+
PeerDependenciesService.executeResolution = function (absoluteProjectDir) {
|
|
59
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
60
|
+
var installedPlugins, missingPeers, packagesToInspect, _i, packagesToInspect_1, packageToInspect, peers, _a, peers_1, peer, isResolvable, sourcePath;
|
|
61
|
+
return __generator(this, function (_b) {
|
|
62
|
+
console.info("Resolving peer dependencies...");
|
|
63
|
+
installedPlugins = PluginService_1.PluginService.getInstalledPlugins(absoluteProjectDir);
|
|
64
|
+
missingPeers = [];
|
|
65
|
+
packagesToInspect = PeerDependenciesService.getPackagesToInspect(absoluteProjectDir, installedPlugins);
|
|
66
|
+
for (_i = 0, packagesToInspect_1 = packagesToInspect; _i < packagesToInspect_1.length; _i++) {
|
|
67
|
+
packageToInspect = packagesToInspect_1[_i];
|
|
68
|
+
peers = PeerDependenciesService.getPackagePeerDependencies(packageToInspect.path);
|
|
69
|
+
for (_a = 0, peers_1 = peers; _a < peers_1.length; _a++) {
|
|
70
|
+
peer = peers_1[_a];
|
|
71
|
+
isResolvable = PeerDependenciesService.canResolveFromConsumerRoot(absoluteProjectDir, peer.name);
|
|
72
|
+
if (!isResolvable) {
|
|
73
|
+
sourcePath = PeerDependenciesService.resolvePeerSourcePath(absoluteProjectDir, packageToInspect.path, peer.name);
|
|
74
|
+
if (peer.optional && !(0, fs_1.existsSync)(sourcePath)) {
|
|
75
|
+
continue;
|
|
76
|
+
}
|
|
77
|
+
missingPeers.push(__assign(__assign({}, peer), { requiredBy: packageToInspect.name, sourcePath: sourcePath }));
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
if (missingPeers.length > 0) {
|
|
82
|
+
PeerDependenciesService.symlinkMissingPeers(absoluteProjectDir, missingPeers);
|
|
83
|
+
}
|
|
84
|
+
console.info("Resolving peer dependencies done!");
|
|
85
|
+
return [2 /*return*/];
|
|
86
|
+
});
|
|
87
|
+
});
|
|
88
|
+
};
|
|
89
|
+
PeerDependenciesService.getPackagePeerDependencies = function (packageDirPath) {
|
|
90
|
+
var packageJson = PackageJson_1.PackageJson.fromDirPath(packageDirPath);
|
|
91
|
+
var content = packageJson.getContent();
|
|
92
|
+
var peerDependencies = content.peerDependencies || {};
|
|
93
|
+
var peerDependenciesMeta = content.peerDependenciesMeta || {};
|
|
94
|
+
return Object.keys(peerDependencies).map(function (name) {
|
|
95
|
+
var _a;
|
|
96
|
+
return ({
|
|
97
|
+
name: name,
|
|
98
|
+
optional: ((_a = peerDependenciesMeta[name]) === null || _a === void 0 ? void 0 : _a.optional) || false,
|
|
99
|
+
});
|
|
100
|
+
});
|
|
101
|
+
};
|
|
102
|
+
PeerDependenciesService.getPackagesToInspect = function (absoluteProjectDir, installedPlugins) {
|
|
103
|
+
var packages = new Map();
|
|
104
|
+
for (var _i = 0, installedPlugins_1 = installedPlugins; _i < installedPlugins_1.length; _i++) {
|
|
105
|
+
var plugin = installedPlugins_1[_i];
|
|
106
|
+
packages.set(plugin.fullname, {
|
|
107
|
+
name: plugin.fullname,
|
|
108
|
+
path: plugin.path,
|
|
109
|
+
});
|
|
110
|
+
var pluginDependencies = PackageJson_1.PackageJson.fromDirPath(plugin.path).getDependenciesPackageNames();
|
|
111
|
+
for (var _a = 0, pluginDependencies_1 = pluginDependencies; _a < pluginDependencies_1.length; _a++) {
|
|
112
|
+
var dependencyName = pluginDependencies_1[_a];
|
|
113
|
+
var dependencyPath = PeerDependenciesService.resolveDependencyPath(absoluteProjectDir, plugin.path, dependencyName);
|
|
114
|
+
if (!dependencyPath) {
|
|
115
|
+
continue;
|
|
116
|
+
}
|
|
117
|
+
if (!packages.has(dependencyName)) {
|
|
118
|
+
packages.set(dependencyName, {
|
|
119
|
+
name: dependencyName,
|
|
120
|
+
path: dependencyPath,
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
return Array.from(packages.values());
|
|
126
|
+
};
|
|
127
|
+
PeerDependenciesService.resolveDependencyPath = function (absoluteProjectDir, pluginPath, dependencyName) {
|
|
128
|
+
var candidatePaths = [
|
|
129
|
+
(0, path_1.join)(absoluteProjectDir, PeerDependenciesService.DEPENDENCIES_FOLDER, dependencyName),
|
|
130
|
+
(0, path_1.join)(pluginPath, PeerDependenciesService.DEPENDENCIES_FOLDER, dependencyName),
|
|
131
|
+
];
|
|
132
|
+
for (var _i = 0, candidatePaths_1 = candidatePaths; _i < candidatePaths_1.length; _i++) {
|
|
133
|
+
var candidatePath = candidatePaths_1[_i];
|
|
134
|
+
if ((0, fs_1.existsSync)((0, path_1.join)(candidatePath, "package.json"))) {
|
|
135
|
+
return candidatePath;
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
return undefined;
|
|
139
|
+
};
|
|
140
|
+
PeerDependenciesService.resolvePeerSourcePath = function (absoluteProjectDir, requiredByPath, peerName) {
|
|
141
|
+
var projectNodeModulesPath = (0, path_1.join)(absoluteProjectDir, PeerDependenciesService.DEPENDENCIES_FOLDER);
|
|
142
|
+
var directResolution = PeerDependenciesService.resolvePackagePathFrom(requiredByPath, peerName);
|
|
143
|
+
if (directResolution) {
|
|
144
|
+
return directResolution;
|
|
145
|
+
}
|
|
146
|
+
var projectResolution = PeerDependenciesService.resolvePackagePathFrom(projectNodeModulesPath, peerName);
|
|
147
|
+
if (projectResolution) {
|
|
148
|
+
return projectResolution;
|
|
149
|
+
}
|
|
150
|
+
var nestedResolution = PeerDependenciesService.resolveFromNestedNodeModules(projectNodeModulesPath, peerName);
|
|
151
|
+
if (nestedResolution) {
|
|
152
|
+
return nestedResolution;
|
|
153
|
+
}
|
|
154
|
+
return (0, path_1.join)(projectNodeModulesPath, peerName);
|
|
155
|
+
};
|
|
156
|
+
PeerDependenciesService.resolveFromNestedNodeModules = function (projectNodeModulesPath, peerName) {
|
|
157
|
+
var packageDirs = PeerDependenciesService.getTopLevelPackageDirs(projectNodeModulesPath);
|
|
158
|
+
for (var _i = 0, packageDirs_1 = packageDirs; _i < packageDirs_1.length; _i++) {
|
|
159
|
+
var packageDir = packageDirs_1[_i];
|
|
160
|
+
var resolvedPath = PeerDependenciesService.resolvePackagePathFrom(packageDir, peerName);
|
|
161
|
+
if (resolvedPath) {
|
|
162
|
+
return resolvedPath;
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
return undefined;
|
|
166
|
+
};
|
|
167
|
+
PeerDependenciesService.getTopLevelPackageDirs = function (nodeModulesPath) {
|
|
168
|
+
if (!(0, fs_1.existsSync)(nodeModulesPath)) {
|
|
169
|
+
return [];
|
|
170
|
+
}
|
|
171
|
+
var packageDirs = [];
|
|
172
|
+
var entries = (0, fs_1.readdirSync)(nodeModulesPath);
|
|
173
|
+
for (var _i = 0, entries_1 = entries; _i < entries_1.length; _i++) {
|
|
174
|
+
var entry = entries_1[_i];
|
|
175
|
+
var entryPath = (0, path_1.join)(nodeModulesPath, entry);
|
|
176
|
+
if (!entry.startsWith("@")) {
|
|
177
|
+
packageDirs.push(entryPath);
|
|
178
|
+
continue;
|
|
179
|
+
}
|
|
180
|
+
var scopedEntries = (0, fs_1.readdirSync)(entryPath);
|
|
181
|
+
for (var _a = 0, scopedEntries_1 = scopedEntries; _a < scopedEntries_1.length; _a++) {
|
|
182
|
+
var scopedEntry = scopedEntries_1[_a];
|
|
183
|
+
packageDirs.push((0, path_1.join)(entryPath, scopedEntry));
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
return packageDirs;
|
|
187
|
+
};
|
|
188
|
+
PeerDependenciesService.resolvePackagePathFrom = function (fromPath, packageName) {
|
|
189
|
+
try {
|
|
190
|
+
var packageJsonPath = require.resolve((0, path_1.join)(packageName, "package.json"), {
|
|
191
|
+
paths: [fromPath],
|
|
192
|
+
});
|
|
193
|
+
return (0, path_1.dirname)(packageJsonPath);
|
|
194
|
+
}
|
|
195
|
+
catch (_a) {
|
|
196
|
+
return undefined;
|
|
197
|
+
}
|
|
198
|
+
};
|
|
199
|
+
PeerDependenciesService.canResolveFromConsumerRoot = function (absoluteProjectDir, packageName) {
|
|
200
|
+
var packagePath = (0, path_1.join)(absoluteProjectDir, PeerDependenciesService.DEPENDENCIES_FOLDER, packageName);
|
|
201
|
+
return (0, fs_1.existsSync)(packagePath);
|
|
202
|
+
};
|
|
203
|
+
PeerDependenciesService.symlinkMissingPeers = function (absoluteProjectDir, missingPeers) {
|
|
204
|
+
var projectDependencyPath = (0, path_1.join)(absoluteProjectDir, PeerDependenciesService.DEPENDENCIES_FOLDER);
|
|
205
|
+
var uniqueMissingPeers = new Map();
|
|
206
|
+
for (var _i = 0, missingPeers_1 = missingPeers; _i < missingPeers_1.length; _i++) {
|
|
207
|
+
var peer = missingPeers_1[_i];
|
|
208
|
+
if (!uniqueMissingPeers.has(peer.name)) {
|
|
209
|
+
uniqueMissingPeers.set(peer.name, peer);
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
for (var _a = 0, _b = Array.from(uniqueMissingPeers.values()); _a < _b.length; _a++) {
|
|
213
|
+
var peer = _b[_a];
|
|
214
|
+
var peerSourcePath = peer.sourcePath;
|
|
215
|
+
if (!(0, fs_1.existsSync)(peerSourcePath)) {
|
|
216
|
+
console.warn("- Peer dependency \"".concat(peer.name, "\" required by \"").concat(peer.requiredBy, "\" not found in plugin node_modules"));
|
|
217
|
+
continue;
|
|
218
|
+
}
|
|
219
|
+
var peerTargetPath = (0, path_1.join)(projectDependencyPath, peer.name);
|
|
220
|
+
console.info("- Symlinking peer dependency \"".concat(peer.name, "\" required by \"").concat(peer.requiredBy, "\""));
|
|
221
|
+
PeerDependenciesService.symlinkPeer(peerSourcePath, peerTargetPath);
|
|
222
|
+
}
|
|
223
|
+
};
|
|
224
|
+
PeerDependenciesService.symlinkPeer = function (sourcePath, targetPath) {
|
|
225
|
+
var targetParentFolder = (0, path_1.join)(targetPath, "..");
|
|
226
|
+
if (!(0, fs_1.existsSync)(targetParentFolder)) {
|
|
227
|
+
(0, fs_1.mkdirSync)(targetParentFolder, { recursive: true });
|
|
228
|
+
}
|
|
229
|
+
(0, fs_1.symlinkSync)(sourcePath, targetPath);
|
|
230
|
+
};
|
|
231
|
+
PeerDependenciesService.DEPENDENCIES_FOLDER = "node_modules";
|
|
232
|
+
return PeerDependenciesService;
|
|
233
|
+
}());
|
|
234
|
+
exports.PeerDependenciesService = PeerDependenciesService;
|
|
@@ -80,7 +80,7 @@ var SymlinkDependenciesService = /** @class */ (function () {
|
|
|
80
80
|
case 0:
|
|
81
81
|
pluginDependencies = SymlinkDependenciesService.getPluginDependencies(plugin);
|
|
82
82
|
projectDependencyPath = (0, path_1.join)(absoluteProjectDir, SymlinkDependenciesService.DEPENDENCIES_FOLDER);
|
|
83
|
-
return [4 /*yield*/, SymlinkDependenciesService.getPluginDependenciesPath(absoluteProjectDir, plugin)];
|
|
83
|
+
return [4 /*yield*/, SymlinkDependenciesService.getPluginDependenciesPath(absoluteProjectDir, plugin, pluginDependencies)];
|
|
84
84
|
case 1:
|
|
85
85
|
pluginDependenciesPath = _a.sent();
|
|
86
86
|
if (projectDependencyPath === pluginDependenciesPath) {
|
|
@@ -109,15 +109,20 @@ var SymlinkDependenciesService = /** @class */ (function () {
|
|
|
109
109
|
var pluginPackageJson = PackageJson_1.PackageJson.fromDirPath(plugin.path);
|
|
110
110
|
return pluginPackageJson.getDependenciesPackageNames();
|
|
111
111
|
};
|
|
112
|
-
SymlinkDependenciesService.getPluginDependenciesPath = function (absoluteProjectDir, plugin) {
|
|
112
|
+
SymlinkDependenciesService.getPluginDependenciesPath = function (absoluteProjectDir, plugin, pluginDependencies) {
|
|
113
113
|
return __awaiter(this, void 0, void 0, function () {
|
|
114
|
-
var pluginDependenciesPath;
|
|
114
|
+
var pluginDependenciesPath, hasAnyPluginDependency;
|
|
115
115
|
return __generator(this, function (_a) {
|
|
116
116
|
switch (_a.label) {
|
|
117
117
|
case 0:
|
|
118
118
|
pluginDependenciesPath = (0, path_1.join)(plugin.path, SymlinkDependenciesService.DEPENDENCIES_FOLDER);
|
|
119
119
|
if ((0, fs_1.existsSync)(pluginDependenciesPath)) {
|
|
120
|
-
|
|
120
|
+
hasAnyPluginDependency = pluginDependencies.some(function (pluginDependency) {
|
|
121
|
+
return (0, fs_1.existsSync)((0, path_1.join)(pluginDependenciesPath, pluginDependency));
|
|
122
|
+
});
|
|
123
|
+
if (hasAnyPluginDependency) {
|
|
124
|
+
return [2 /*return*/, pluginDependenciesPath];
|
|
125
|
+
}
|
|
121
126
|
}
|
|
122
127
|
return [4 /*yield*/, PackageManagerService_1.PackageManagerService.getNodeModulesPath(absoluteProjectDir)];
|
|
123
128
|
case 1: return [2 /*return*/, _a.sent()];
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { PackageManagerType } from "./PackageManagerType";
|
|
2
|
+
import type { PackageManagerAdapter } from "./PackageManagerAdapter";
|
|
3
|
+
export declare abstract class AbstractPackageManagerAdapter implements PackageManagerAdapter {
|
|
4
|
+
abstract addDevPackage(packageName: string, dirPath: string): Promise<void>;
|
|
5
|
+
abstract isMonorepo(dirPath: string): Promise<boolean>;
|
|
6
|
+
abstract isPackageInstalled(packageName: string, dirPath: string): Promise<boolean>;
|
|
7
|
+
abstract getNodeModulesPath(dirPath: string): Promise<string>;
|
|
8
|
+
protected getVersion(packageManager: PackageManagerType, dirPath?: string): Promise<{
|
|
9
|
+
raw: string;
|
|
10
|
+
major: number;
|
|
11
|
+
minor: number;
|
|
12
|
+
patch: number;
|
|
13
|
+
}>;
|
|
14
|
+
protected execCommand(args: string | string[], cwd?: string, silent?: boolean): Promise<string>;
|
|
15
|
+
protected parseJsonLines(output: string): unknown[];
|
|
16
|
+
}
|