@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.
@@ -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
- export declare enum PackageManagerType {
2
- yarn = "yarn",
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 execCommand;
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 PackageManagerType;
44
- (function (PackageManagerType) {
45
- PackageManagerType["yarn"] = "yarn";
46
- PackageManagerType["npm"] = "npm";
47
- })(PackageManagerType || (exports.PackageManagerType = PackageManagerType = {}));
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
- switch (_a.label) {
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
- switch (_a.label) {
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
- var packageManager, args, output, error_1, installedPackages;
119
- var _a, _b;
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
- // Handle empty args check for both string and array
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
- return [2 /*return*/, pluginDependenciesPath];
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
+ }