@ts-dev-tools/core 1.9.14 → 1.10.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.
@@ -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,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
+ }
@@ -0,0 +1,155 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ var __generator = (this && this.__generator) || function (thisArg, body) {
12
+ 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);
13
+ return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
14
+ function verb(n) { return function (v) { return step([n, v]); }; }
15
+ function step(op) {
16
+ if (f) throw new TypeError("Generator is already executing.");
17
+ while (g && (g = 0, op[0] && (_ = 0)), _) try {
18
+ 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;
19
+ if (y = 0, t) op = [op[0] & 2, t.value];
20
+ switch (op[0]) {
21
+ case 0: case 1: t = op; break;
22
+ case 4: _.label++; return { value: op[1], done: false };
23
+ case 5: _.label++; y = op[1]; op = [0]; continue;
24
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
25
+ default:
26
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
27
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
28
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
29
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
30
+ if (t[2]) _.ops.pop();
31
+ _.trys.pop(); continue;
32
+ }
33
+ op = body.call(thisArg, _);
34
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
35
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
36
+ }
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.AbstractPackageManagerAdapter = void 0;
40
+ var child_process_1 = require("child_process");
41
+ var fs_1 = require("fs");
42
+ var AbstractPackageManagerAdapter = /** @class */ (function () {
43
+ function AbstractPackageManagerAdapter() {
44
+ }
45
+ AbstractPackageManagerAdapter.prototype.getVersion = function (packageManager, dirPath) {
46
+ return __awaiter(this, void 0, void 0, function () {
47
+ var raw, match;
48
+ return __generator(this, function (_a) {
49
+ switch (_a.label) {
50
+ case 0: return [4 /*yield*/, this.execCommand([packageManager, "--version"], dirPath, true)];
51
+ case 1:
52
+ raw = (_a.sent()).trim();
53
+ match = raw.match(/(\d+)\.(\d+)\.(\d+)/);
54
+ if (!match) {
55
+ return [2 /*return*/, { raw: raw, major: 0, minor: 0, patch: 0 }];
56
+ }
57
+ return [2 /*return*/, {
58
+ raw: raw,
59
+ major: Number(match[1]),
60
+ minor: Number(match[2]),
61
+ patch: Number(match[3]),
62
+ }];
63
+ }
64
+ });
65
+ });
66
+ };
67
+ AbstractPackageManagerAdapter.prototype.execCommand = function (args_1, cwd_1) {
68
+ return __awaiter(this, arguments, void 0, function (args, cwd, silent) {
69
+ var cmd, cmdArgs, useShell, shellOperators_1, hasShellSyntax;
70
+ if (silent === void 0) { silent = false; }
71
+ return __generator(this, function (_a) {
72
+ if (Array.isArray(args) && args.length === 0) {
73
+ throw new Error("Command args must not be empty");
74
+ }
75
+ if (typeof args === "string" && args.trim().length === 0) {
76
+ throw new Error("Command args must not be empty");
77
+ }
78
+ if (cwd && !(0, fs_1.existsSync)(cwd)) {
79
+ throw new Error("Directory \"".concat(cwd, "\" does not exist"));
80
+ }
81
+ useShell = false;
82
+ if (Array.isArray(args)) {
83
+ shellOperators_1 = [">", "|", "&&", "||", ";", "<", ">>", "2>", "&", "$("];
84
+ hasShellSyntax = args.some(function (arg) {
85
+ var trimmedArg = arg.trim();
86
+ return shellOperators_1.some(function (op) {
87
+ return trimmedArg.startsWith(op) ||
88
+ trimmedArg.endsWith(op) ||
89
+ trimmedArg.includes(" ".concat(op, " ")) ||
90
+ trimmedArg.includes(" ".concat(op)) ||
91
+ trimmedArg.includes("".concat(op, " "));
92
+ });
93
+ });
94
+ if (hasShellSyntax) {
95
+ cmd = args.join(" ").trim();
96
+ cmdArgs = [];
97
+ useShell = true;
98
+ }
99
+ else {
100
+ cmd = args[0];
101
+ cmdArgs = args.slice(1);
102
+ }
103
+ }
104
+ else {
105
+ cmd = args;
106
+ cmdArgs = [];
107
+ useShell = true;
108
+ }
109
+ return [2 /*return*/, new Promise(function (resolve, reject) {
110
+ var child = (0, child_process_1.spawn)(cmd, cmdArgs, {
111
+ stdio: silent ? "pipe" : "inherit",
112
+ shell: useShell,
113
+ windowsVerbatimArguments: true,
114
+ cwd: cwd,
115
+ });
116
+ var output = "";
117
+ var error = "";
118
+ child.on("exit", function (code) {
119
+ if (code) {
120
+ return reject(output.length > 0 ? output : error);
121
+ }
122
+ resolve(output);
123
+ });
124
+ if (child.stdout) {
125
+ child.stdout.on("data", function (data) {
126
+ output += "\n".concat(data);
127
+ });
128
+ }
129
+ if (child.stderr) {
130
+ child.stderr.on("data", function (data) {
131
+ error += "\n".concat(data);
132
+ });
133
+ }
134
+ })];
135
+ });
136
+ });
137
+ };
138
+ AbstractPackageManagerAdapter.prototype.parseJsonLines = function (output) {
139
+ return output
140
+ .split(/\r?\n/)
141
+ .map(function (line) { return line.trim(); })
142
+ .filter(function (line) { return line.length > 0; })
143
+ .map(function (line) {
144
+ try {
145
+ return JSON.parse(line);
146
+ }
147
+ catch (_a) {
148
+ return undefined;
149
+ }
150
+ })
151
+ .filter(function (entry) { return entry !== undefined; });
152
+ };
153
+ return AbstractPackageManagerAdapter;
154
+ }());
155
+ exports.AbstractPackageManagerAdapter = AbstractPackageManagerAdapter;
@@ -0,0 +1,7 @@
1
+ import { AbstractPackageManagerAdapter } from "./AbstractPackageManagerAdapter";
2
+ export declare class NpmPackageManagerAdapter extends AbstractPackageManagerAdapter {
3
+ addDevPackage(packageName: string, dirPath: string): Promise<void>;
4
+ isMonorepo(dirPath: string): Promise<boolean>;
5
+ isPackageInstalled(packageName: string, dirPath: string): Promise<boolean>;
6
+ getNodeModulesPath(dirPath: string): Promise<string>;
7
+ }
@@ -0,0 +1,165 @@
1
+ "use strict";
2
+ var __extends = (this && this.__extends) || (function () {
3
+ var extendStatics = function (d, b) {
4
+ extendStatics = Object.setPrototypeOf ||
5
+ ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
6
+ function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
7
+ return extendStatics(d, b);
8
+ };
9
+ return function (d, b) {
10
+ if (typeof b !== "function" && b !== null)
11
+ throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
12
+ extendStatics(d, b);
13
+ function __() { this.constructor = d; }
14
+ d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
15
+ };
16
+ })();
17
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
18
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
19
+ return new (P || (P = Promise))(function (resolve, reject) {
20
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
21
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
22
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
23
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
24
+ });
25
+ };
26
+ var __generator = (this && this.__generator) || function (thisArg, body) {
27
+ 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);
28
+ return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
29
+ function verb(n) { return function (v) { return step([n, v]); }; }
30
+ function step(op) {
31
+ if (f) throw new TypeError("Generator is already executing.");
32
+ while (g && (g = 0, op[0] && (_ = 0)), _) try {
33
+ 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;
34
+ if (y = 0, t) op = [op[0] & 2, t.value];
35
+ switch (op[0]) {
36
+ case 0: case 1: t = op; break;
37
+ case 4: _.label++; return { value: op[1], done: false };
38
+ case 5: _.label++; y = op[1]; op = [0]; continue;
39
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
40
+ default:
41
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
42
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
43
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
44
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
45
+ if (t[2]) _.ops.pop();
46
+ _.trys.pop(); continue;
47
+ }
48
+ op = body.call(thisArg, _);
49
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
50
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
51
+ }
52
+ };
53
+ Object.defineProperty(exports, "__esModule", { value: true });
54
+ exports.NpmPackageManagerAdapter = void 0;
55
+ var AbstractPackageManagerAdapter_1 = require("./AbstractPackageManagerAdapter");
56
+ var NpmPackageManagerAdapter = /** @class */ (function (_super) {
57
+ __extends(NpmPackageManagerAdapter, _super);
58
+ function NpmPackageManagerAdapter() {
59
+ return _super !== null && _super.apply(this, arguments) || this;
60
+ }
61
+ NpmPackageManagerAdapter.prototype.addDevPackage = function (packageName, dirPath) {
62
+ return __awaiter(this, void 0, void 0, function () {
63
+ var isMonorepo, args;
64
+ return __generator(this, function (_a) {
65
+ switch (_a.label) {
66
+ case 0: return [4 /*yield*/, this.isMonorepo(dirPath)];
67
+ case 1:
68
+ isMonorepo = _a.sent();
69
+ args = ["npm", "install", "--save-dev"];
70
+ if (isMonorepo) {
71
+ args.push("--no-workspaces");
72
+ }
73
+ args.push(packageName);
74
+ return [4 /*yield*/, this.execCommand(args, dirPath, true)];
75
+ case 2:
76
+ _a.sent();
77
+ return [2 /*return*/];
78
+ }
79
+ });
80
+ });
81
+ };
82
+ NpmPackageManagerAdapter.prototype.isMonorepo = function (dirPath) {
83
+ return __awaiter(this, void 0, void 0, function () {
84
+ var _a;
85
+ return __generator(this, function (_b) {
86
+ switch (_b.label) {
87
+ case 0:
88
+ _b.trys.push([0, 2, , 3]);
89
+ return [4 /*yield*/, this.execCommand(["npm", "--workspaces", "list", "--json"], dirPath, true)];
90
+ case 1:
91
+ _b.sent();
92
+ return [2 /*return*/, true];
93
+ case 2:
94
+ _a = _b.sent();
95
+ return [2 /*return*/, false];
96
+ case 3: return [2 /*return*/];
97
+ }
98
+ });
99
+ });
100
+ };
101
+ NpmPackageManagerAdapter.prototype.isPackageInstalled = function (packageName, dirPath) {
102
+ return __awaiter(this, void 0, void 0, function () {
103
+ var args, output, error_1, installedPackages;
104
+ return __generator(this, function (_a) {
105
+ switch (_a.label) {
106
+ case 0:
107
+ args = [
108
+ "npm",
109
+ "list",
110
+ "--depth=1",
111
+ "--json",
112
+ "--no-progress",
113
+ "--non-interactive",
114
+ packageName,
115
+ ];
116
+ _a.label = 1;
117
+ case 1:
118
+ _a.trys.push([1, 3, , 4]);
119
+ return [4 /*yield*/, this.execCommand(args, dirPath, true)];
120
+ case 2:
121
+ output = _a.sent();
122
+ return [3 /*break*/, 4];
123
+ case 3:
124
+ error_1 = _a.sent();
125
+ if (typeof error_1 === "string") {
126
+ try {
127
+ JSON.parse(error_1.trim());
128
+ output = error_1;
129
+ }
130
+ catch (_b) {
131
+ return [2 /*return*/, false];
132
+ }
133
+ }
134
+ else {
135
+ return [2 /*return*/, false];
136
+ }
137
+ return [3 /*break*/, 4];
138
+ case 4:
139
+ installedPackages = JSON.parse(output);
140
+ return [2 /*return*/, installedPackages.dependencies
141
+ ? Object.prototype.hasOwnProperty.call(installedPackages.dependencies, packageName)
142
+ : false];
143
+ }
144
+ });
145
+ });
146
+ };
147
+ NpmPackageManagerAdapter.prototype.getNodeModulesPath = function (dirPath) {
148
+ return __awaiter(this, void 0, void 0, function () {
149
+ var nodeModulesPath;
150
+ return __generator(this, function (_a) {
151
+ switch (_a.label) {
152
+ case 0: return [4 /*yield*/, this.execCommand(["npm", "root", "--no-progress", "--non-interactive"], dirPath, true)];
153
+ case 1:
154
+ nodeModulesPath = (_a.sent()).trim();
155
+ if (nodeModulesPath) {
156
+ return [2 /*return*/, nodeModulesPath];
157
+ }
158
+ throw new Error("Node modules path not found for package manager npm");
159
+ }
160
+ });
161
+ });
162
+ };
163
+ return NpmPackageManagerAdapter;
164
+ }(AbstractPackageManagerAdapter_1.AbstractPackageManagerAdapter));
165
+ exports.NpmPackageManagerAdapter = NpmPackageManagerAdapter;
@@ -0,0 +1,6 @@
1
+ export interface PackageManagerAdapter {
2
+ addDevPackage(packageName: string, dirPath: string): Promise<void>;
3
+ isMonorepo(dirPath: string): Promise<boolean>;
4
+ isPackageInstalled(packageName: string, dirPath: string): Promise<boolean>;
5
+ getNodeModulesPath(dirPath: string): Promise<string>;
6
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,4 @@
1
+ export declare enum PackageManagerType {
2
+ yarn = "yarn",
3
+ npm = "npm"
4
+ }
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PackageManagerType = void 0;
4
+ var PackageManagerType;
5
+ (function (PackageManagerType) {
6
+ PackageManagerType["yarn"] = "yarn";
7
+ PackageManagerType["npm"] = "npm";
8
+ })(PackageManagerType || (exports.PackageManagerType = PackageManagerType = {}));
@@ -0,0 +1,13 @@
1
+ import { AbstractPackageManagerAdapter } from "./AbstractPackageManagerAdapter";
2
+ export declare class YarnPackageManagerAdapter extends AbstractPackageManagerAdapter {
3
+ addDevPackage(packageName: string, dirPath: string): Promise<void>;
4
+ isMonorepo(dirPath: string): Promise<boolean>;
5
+ isPackageInstalled(packageName: string, dirPath: string): Promise<boolean>;
6
+ getNodeModulesPath(dirPath: string): Promise<string>;
7
+ private yarnWorkspacesOutputHasEntries;
8
+ private parseMaybeJsonString;
9
+ private hasWorkspaceMap;
10
+ private parseJsonObjectFromOutput;
11
+ private isWorkspaceListEntry;
12
+ private yarnListOutputHasPackage;
13
+ }
@@ -0,0 +1,269 @@
1
+ "use strict";
2
+ var __extends = (this && this.__extends) || (function () {
3
+ var extendStatics = function (d, b) {
4
+ extendStatics = Object.setPrototypeOf ||
5
+ ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
6
+ function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
7
+ return extendStatics(d, b);
8
+ };
9
+ return function (d, b) {
10
+ if (typeof b !== "function" && b !== null)
11
+ throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
12
+ extendStatics(d, b);
13
+ function __() { this.constructor = d; }
14
+ d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
15
+ };
16
+ })();
17
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
18
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
19
+ return new (P || (P = Promise))(function (resolve, reject) {
20
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
21
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
22
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
23
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
24
+ });
25
+ };
26
+ var __generator = (this && this.__generator) || function (thisArg, body) {
27
+ 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);
28
+ return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
29
+ function verb(n) { return function (v) { return step([n, v]); }; }
30
+ function step(op) {
31
+ if (f) throw new TypeError("Generator is already executing.");
32
+ while (g && (g = 0, op[0] && (_ = 0)), _) try {
33
+ 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;
34
+ if (y = 0, t) op = [op[0] & 2, t.value];
35
+ switch (op[0]) {
36
+ case 0: case 1: t = op; break;
37
+ case 4: _.label++; return { value: op[1], done: false };
38
+ case 5: _.label++; y = op[1]; op = [0]; continue;
39
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
40
+ default:
41
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
42
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
43
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
44
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
45
+ if (t[2]) _.ops.pop();
46
+ _.trys.pop(); continue;
47
+ }
48
+ op = body.call(thisArg, _);
49
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
50
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
51
+ }
52
+ };
53
+ Object.defineProperty(exports, "__esModule", { value: true });
54
+ exports.YarnPackageManagerAdapter = void 0;
55
+ var path_1 = require("path");
56
+ var AbstractPackageManagerAdapter_1 = require("./AbstractPackageManagerAdapter");
57
+ var PackageManagerType_1 = require("./PackageManagerType");
58
+ var YarnPackageManagerAdapter = /** @class */ (function (_super) {
59
+ __extends(YarnPackageManagerAdapter, _super);
60
+ function YarnPackageManagerAdapter() {
61
+ return _super !== null && _super.apply(this, arguments) || this;
62
+ }
63
+ YarnPackageManagerAdapter.prototype.addDevPackage = function (packageName, dirPath) {
64
+ return __awaiter(this, void 0, void 0, function () {
65
+ var isMonorepo, major, args, error_1, retryArgs;
66
+ return __generator(this, function (_a) {
67
+ switch (_a.label) {
68
+ case 0: return [4 /*yield*/, this.isMonorepo(dirPath)];
69
+ case 1:
70
+ isMonorepo = _a.sent();
71
+ return [4 /*yield*/, this.getVersion(PackageManagerType_1.PackageManagerType.yarn, dirPath)];
72
+ case 2:
73
+ major = (_a.sent()).major;
74
+ args = ["yarn", "add", "--dev"];
75
+ if (isMonorepo) {
76
+ args.push(major >= 2 ? "-W" : "--ignore-workspace-root-check");
77
+ }
78
+ args.push(packageName);
79
+ _a.label = 3;
80
+ case 3:
81
+ _a.trys.push([3, 5, , 8]);
82
+ return [4 /*yield*/, this.execCommand(args, dirPath, true)];
83
+ case 4:
84
+ _a.sent();
85
+ return [3 /*break*/, 8];
86
+ case 5:
87
+ error_1 = _a.sent();
88
+ if (!(isMonorepo && typeof error_1 === "string" && error_1.includes("Unsupported option name"))) return [3 /*break*/, 7];
89
+ retryArgs = args
90
+ .filter(function (arg) { return arg !== "--ignore-workspace-root-check" && arg !== "-W"; })
91
+ .concat(major >= 2 ? "--ignore-workspace-root-check" : "-W");
92
+ return [4 /*yield*/, this.execCommand(retryArgs, dirPath, true)];
93
+ case 6:
94
+ _a.sent();
95
+ return [2 /*return*/];
96
+ case 7: throw error_1;
97
+ case 8: return [2 /*return*/];
98
+ }
99
+ });
100
+ });
101
+ };
102
+ YarnPackageManagerAdapter.prototype.isMonorepo = function (dirPath) {
103
+ return __awaiter(this, void 0, void 0, function () {
104
+ var major, primary, fallback, yarnCommands, _i, yarnCommands_1, args, output, _a;
105
+ return __generator(this, function (_b) {
106
+ switch (_b.label) {
107
+ case 0: return [4 /*yield*/, this.getVersion(PackageManagerType_1.PackageManagerType.yarn, dirPath)];
108
+ case 1:
109
+ major = (_b.sent()).major;
110
+ primary = major >= 2 ? "list" : "info";
111
+ fallback = primary === "list" ? "info" : "list";
112
+ yarnCommands = [
113
+ ["yarn", "workspaces", primary, "--json"],
114
+ ["yarn", "workspaces", fallback, "--json"],
115
+ ];
116
+ _i = 0, yarnCommands_1 = yarnCommands;
117
+ _b.label = 2;
118
+ case 2:
119
+ if (!(_i < yarnCommands_1.length)) return [3 /*break*/, 7];
120
+ args = yarnCommands_1[_i];
121
+ _b.label = 3;
122
+ case 3:
123
+ _b.trys.push([3, 5, , 6]);
124
+ return [4 /*yield*/, this.execCommand(args, dirPath, true)];
125
+ case 4:
126
+ output = _b.sent();
127
+ if (this.yarnWorkspacesOutputHasEntries(output)) {
128
+ return [2 /*return*/, true];
129
+ }
130
+ return [3 /*break*/, 6];
131
+ case 5:
132
+ _a = _b.sent();
133
+ return [3 /*break*/, 6];
134
+ case 6:
135
+ _i++;
136
+ return [3 /*break*/, 2];
137
+ case 7: return [2 /*return*/, false];
138
+ }
139
+ });
140
+ });
141
+ };
142
+ YarnPackageManagerAdapter.prototype.isPackageInstalled = function (packageName, dirPath) {
143
+ return __awaiter(this, void 0, void 0, function () {
144
+ var output, _a, output, _b;
145
+ return __generator(this, function (_c) {
146
+ switch (_c.label) {
147
+ case 0:
148
+ _c.trys.push([0, 2, , 3]);
149
+ return [4 /*yield*/, this.execCommand(["yarn", "list", "--depth=1", "--json", "--pattern", packageName], dirPath, true)];
150
+ case 1:
151
+ output = _c.sent();
152
+ if (this.yarnListOutputHasPackage(output, packageName)) {
153
+ return [2 /*return*/, true];
154
+ }
155
+ return [3 /*break*/, 3];
156
+ case 2:
157
+ _a = _c.sent();
158
+ return [3 /*break*/, 3];
159
+ case 3:
160
+ _c.trys.push([3, 5, , 6]);
161
+ return [4 /*yield*/, this.execCommand(["yarn", "why", "--json", packageName], dirPath, true)];
162
+ case 4:
163
+ output = _c.sent();
164
+ return [2 /*return*/, this.yarnListOutputHasPackage(output, packageName)];
165
+ case 5:
166
+ _b = _c.sent();
167
+ return [2 /*return*/, false];
168
+ case 6: return [2 /*return*/];
169
+ }
170
+ });
171
+ });
172
+ };
173
+ YarnPackageManagerAdapter.prototype.getNodeModulesPath = function (dirPath) {
174
+ return __awaiter(this, void 0, void 0, function () {
175
+ return __generator(this, function (_a) {
176
+ return [2 /*return*/, (0, path_1.join)(dirPath, "node_modules")];
177
+ });
178
+ });
179
+ };
180
+ YarnPackageManagerAdapter.prototype.yarnWorkspacesOutputHasEntries = function (output) {
181
+ var _a;
182
+ var entries = this.parseJsonLines(output);
183
+ var workspaceListCount = 0;
184
+ for (var _i = 0, entries_1 = entries; _i < entries_1.length; _i++) {
185
+ var entry = entries_1[_i];
186
+ if (!entry || typeof entry !== "object") {
187
+ continue;
188
+ }
189
+ var data = (_a = entry.data) !== null && _a !== void 0 ? _a : entry;
190
+ var parsedData = this.parseMaybeJsonString(data);
191
+ if (parsedData && typeof parsedData === "object") {
192
+ if (this.hasWorkspaceMap(parsedData)) {
193
+ return true;
194
+ }
195
+ if (this.isWorkspaceListEntry(parsedData)) {
196
+ workspaceListCount += 1;
197
+ }
198
+ }
199
+ }
200
+ if (workspaceListCount > 0) {
201
+ return true;
202
+ }
203
+ var parsedOutput = this.parseJsonObjectFromOutput(output);
204
+ if (parsedOutput && typeof parsedOutput === "object") {
205
+ return Object.keys(parsedOutput).length > 0;
206
+ }
207
+ return false;
208
+ };
209
+ YarnPackageManagerAdapter.prototype.parseMaybeJsonString = function (value) {
210
+ if (typeof value !== "string") {
211
+ return value;
212
+ }
213
+ try {
214
+ return JSON.parse(value);
215
+ }
216
+ catch (_a) {
217
+ return undefined;
218
+ }
219
+ };
220
+ YarnPackageManagerAdapter.prototype.hasWorkspaceMap = function (value) {
221
+ if (!value || typeof value !== "object") {
222
+ return false;
223
+ }
224
+ var workspaces = value.workspaces;
225
+ return !!workspaces && Object.keys(workspaces).length > 0;
226
+ };
227
+ YarnPackageManagerAdapter.prototype.parseJsonObjectFromOutput = function (output) {
228
+ var start = output.indexOf("{");
229
+ var end = output.lastIndexOf("}");
230
+ if (start < 0 || end <= start) {
231
+ return undefined;
232
+ }
233
+ var slice = output.slice(start, end + 1).trim();
234
+ try {
235
+ return JSON.parse(slice);
236
+ }
237
+ catch (_a) {
238
+ return undefined;
239
+ }
240
+ };
241
+ YarnPackageManagerAdapter.prototype.isWorkspaceListEntry = function (value) {
242
+ if (!value || typeof value !== "object") {
243
+ return false;
244
+ }
245
+ var entry = value;
246
+ return typeof entry.name === "string" && typeof entry.location === "string" && entry.location !== ".";
247
+ };
248
+ YarnPackageManagerAdapter.prototype.yarnListOutputHasPackage = function (output, packageName) {
249
+ var _a;
250
+ var entries = this.parseJsonLines(output);
251
+ for (var _i = 0, entries_2 = entries; _i < entries_2.length; _i++) {
252
+ var entry = entries_2[_i];
253
+ if (!entry || typeof entry !== "object") {
254
+ continue;
255
+ }
256
+ var data = entry.data;
257
+ var trees = (_a = data === null || data === void 0 ? void 0 : data.trees) !== null && _a !== void 0 ? _a : entry.trees;
258
+ if (!trees) {
259
+ continue;
260
+ }
261
+ if (trees.some(function (tree) { return tree.name.startsWith(packageName + "@"); })) {
262
+ return true;
263
+ }
264
+ }
265
+ return false;
266
+ };
267
+ return YarnPackageManagerAdapter;
268
+ }(AbstractPackageManagerAdapter_1.AbstractPackageManagerAdapter));
269
+ exports.YarnPackageManagerAdapter = YarnPackageManagerAdapter;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ts-dev-tools/core",
3
- "version": "1.9.14",
3
+ "version": "1.10.0",
4
4
  "description": "TS dev tools Core",
5
5
  "keywords": [
6
6
  "linter",
@@ -93,5 +93,5 @@
93
93
  "github-actions"
94
94
  ]
95
95
  },
96
- "gitHead": "094bbfc6b7dc24b7efab8dddad55598ff7a36ae9"
96
+ "gitHead": "e45076a10f72cd59f296dc30abdbe692aa8684b1"
97
97
  }