simplemdg-dev-cli 1.2.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/README.md +170 -0
- package/dist/commands/cds.command.d.ts +2 -0
- package/dist/commands/cds.command.js +377 -0
- package/dist/commands/cds.command.js.map +1 -0
- package/dist/commands/cf.command.d.ts +2 -0
- package/dist/commands/cf.command.js +667 -0
- package/dist/commands/cf.command.js.map +1 -0
- package/dist/commands/npmrc.command.d.ts +2 -0
- package/dist/commands/npmrc.command.js +447 -0
- package/dist/commands/npmrc.command.js.map +1 -0
- package/dist/core/cache.d.ts +23 -0
- package/dist/core/cache.js +269 -0
- package/dist/core/cache.js.map +1 -0
- package/dist/core/cds.d.ts +16 -0
- package/dist/core/cds.js +208 -0
- package/dist/core/cds.js.map +1 -0
- package/dist/core/cf-env-parser.d.ts +2 -0
- package/dist/core/cf-env-parser.js +109 -0
- package/dist/core/cf-env-parser.js.map +1 -0
- package/dist/core/cf.d.ts +23 -0
- package/dist/core/cf.js +188 -0
- package/dist/core/cf.js.map +1 -0
- package/dist/core/doctor.d.ts +5 -0
- package/dist/core/doctor.js +54 -0
- package/dist/core/doctor.js.map +1 -0
- package/dist/core/install.d.ts +2 -0
- package/dist/core/install.js +77 -0
- package/dist/core/install.js.map +1 -0
- package/dist/core/npmrc.d.ts +26 -0
- package/dist/core/npmrc.js +119 -0
- package/dist/core/npmrc.js.map +1 -0
- package/dist/core/process.d.ts +29 -0
- package/dist/core/process.js +183 -0
- package/dist/core/process.js.map +1 -0
- package/dist/core/prompts.d.ts +29 -0
- package/dist/core/prompts.js +159 -0
- package/dist/core/prompts.js.map +1 -0
- package/dist/core/repository.d.ts +3 -0
- package/dist/core/repository.js +27 -0
- package/dist/core/repository.js.map +1 -0
- package/dist/core/scanner.d.ts +5 -0
- package/dist/core/scanner.js +31 -0
- package/dist/core/scanner.js.map +1 -0
- package/dist/core/types.d.ts +131 -0
- package/dist/core/types.js +2 -0
- package/dist/core/types.js.map +1 -0
- package/dist/core/version-conflict.d.ts +8 -0
- package/dist/core/version-conflict.js +33 -0
- package/dist/core/version-conflict.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +320 -0
- package/dist/index.js.map +1 -0
- package/dist/types-local.d.ts +10 -0
- package/dist/types-local.js +2 -0
- package/dist/types-local.js.map +1 -0
- package/package.json +41 -0
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { TCloudFoundryApp, TCloudFoundryOrgEntry, TCloudFoundryTarget } from "./types.js";
|
|
2
|
+
export declare function buildCloudFoundryTargetKey(target: TCloudFoundryTarget): string;
|
|
3
|
+
export declare function readCloudFoundryTarget(): Promise<TCloudFoundryTarget>;
|
|
4
|
+
export declare function setCloudFoundryApiEndpoint(apiEndpoint: string): Promise<number>;
|
|
5
|
+
export declare function authenticateCloudFoundry(options: {
|
|
6
|
+
username: string;
|
|
7
|
+
password: string;
|
|
8
|
+
}): Promise<number>;
|
|
9
|
+
export declare function targetCloudFoundryOrg(org: string): Promise<number>;
|
|
10
|
+
export declare function targetCloudFoundrySpace(space: string): Promise<number>;
|
|
11
|
+
export declare function listCloudFoundryOrganizations(): Promise<string[]>;
|
|
12
|
+
export declare function listCloudFoundrySpaces(): Promise<string[]>;
|
|
13
|
+
export declare function inferCloudFoundryRegionFromApiEndpoint(apiEndpoint: string): string;
|
|
14
|
+
export declare function scanCloudFoundryOrganizationsAcrossRegions(apiEndpoints: string[]): Promise<TCloudFoundryOrgEntry[]>;
|
|
15
|
+
export declare function loginCloudFoundry(options: {
|
|
16
|
+
apiEndpoint: string;
|
|
17
|
+
username: string;
|
|
18
|
+
password: string;
|
|
19
|
+
org: string;
|
|
20
|
+
space?: string;
|
|
21
|
+
}): Promise<number>;
|
|
22
|
+
export declare function listCloudFoundryApps(): Promise<TCloudFoundryApp[]>;
|
|
23
|
+
export declare function parseCloudFoundryApps(output: string): TCloudFoundryApp[];
|
package/dist/core/cf.js
ADDED
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
import { runCommand } from "./process.js";
|
|
2
|
+
export function buildCloudFoundryTargetKey(target) {
|
|
3
|
+
return [
|
|
4
|
+
target.apiEndpoint ?? "unknown-api",
|
|
5
|
+
target.org ?? "unknown-org",
|
|
6
|
+
target.space ?? "unknown-space",
|
|
7
|
+
].join("|");
|
|
8
|
+
}
|
|
9
|
+
export async function readCloudFoundryTarget() {
|
|
10
|
+
const result = await runCommand("cf", ["target"]);
|
|
11
|
+
if (result.exitCode === 127) {
|
|
12
|
+
throw new Error(result.stderr);
|
|
13
|
+
}
|
|
14
|
+
if (result.exitCode !== 0) {
|
|
15
|
+
return {};
|
|
16
|
+
}
|
|
17
|
+
const target = {};
|
|
18
|
+
for (const line of result.stdout.split(/\r?\n/)) {
|
|
19
|
+
const [rawKey, ...rawValueParts] = line.split(":");
|
|
20
|
+
const key = rawKey.trim().toLowerCase();
|
|
21
|
+
const value = rawValueParts.join(":").trim();
|
|
22
|
+
if (key === "api endpoint")
|
|
23
|
+
target.apiEndpoint = value;
|
|
24
|
+
if (key === "user")
|
|
25
|
+
target.user = value;
|
|
26
|
+
if (key === "org")
|
|
27
|
+
target.org = value;
|
|
28
|
+
if (key === "space")
|
|
29
|
+
target.space = value;
|
|
30
|
+
}
|
|
31
|
+
return target;
|
|
32
|
+
}
|
|
33
|
+
export async function setCloudFoundryApiEndpoint(apiEndpoint) {
|
|
34
|
+
const result = await runCommand("cf", ["api", apiEndpoint]);
|
|
35
|
+
if (result.stdout)
|
|
36
|
+
console.log(result.stdout);
|
|
37
|
+
if (result.stderr)
|
|
38
|
+
console.error(result.stderr);
|
|
39
|
+
return result.exitCode;
|
|
40
|
+
}
|
|
41
|
+
export async function authenticateCloudFoundry(options) {
|
|
42
|
+
const result = await runCommand("cf", ["auth", options.username, options.password]);
|
|
43
|
+
if (result.stdout)
|
|
44
|
+
console.log(result.stdout);
|
|
45
|
+
if (result.stderr)
|
|
46
|
+
console.error(result.stderr);
|
|
47
|
+
return result.exitCode;
|
|
48
|
+
}
|
|
49
|
+
export async function targetCloudFoundryOrg(org) {
|
|
50
|
+
const result = await runCommand("cf", ["target", "-o", org]);
|
|
51
|
+
if (result.stdout)
|
|
52
|
+
console.log(result.stdout);
|
|
53
|
+
if (result.stderr)
|
|
54
|
+
console.error(result.stderr);
|
|
55
|
+
return result.exitCode;
|
|
56
|
+
}
|
|
57
|
+
export async function targetCloudFoundrySpace(space) {
|
|
58
|
+
const result = await runCommand("cf", ["target", "-s", space]);
|
|
59
|
+
if (result.stdout)
|
|
60
|
+
console.log(result.stdout);
|
|
61
|
+
if (result.stderr)
|
|
62
|
+
console.error(result.stderr);
|
|
63
|
+
return result.exitCode;
|
|
64
|
+
}
|
|
65
|
+
export async function listCloudFoundryOrganizations() {
|
|
66
|
+
const result = await runCommand("cf", ["orgs"]);
|
|
67
|
+
if (result.exitCode !== 0) {
|
|
68
|
+
throw new Error(result.stderr || result.stdout || "cf orgs failed");
|
|
69
|
+
}
|
|
70
|
+
return parseCloudFoundryNameList(result.stdout, "name");
|
|
71
|
+
}
|
|
72
|
+
export async function listCloudFoundrySpaces() {
|
|
73
|
+
const result = await runCommand("cf", ["spaces"]);
|
|
74
|
+
if (result.exitCode !== 0) {
|
|
75
|
+
throw new Error(result.stderr || result.stdout || "cf spaces failed");
|
|
76
|
+
}
|
|
77
|
+
return parseCloudFoundryNameList(result.stdout, "name");
|
|
78
|
+
}
|
|
79
|
+
function parseCloudFoundryNameList(output, headerName) {
|
|
80
|
+
const lines = output.split(/\r?\n/).map((line) => line.trim()).filter(Boolean);
|
|
81
|
+
const headerIndex = lines.findIndex((line) => line.toLowerCase() === headerName.toLowerCase());
|
|
82
|
+
if (headerIndex === -1) {
|
|
83
|
+
return [];
|
|
84
|
+
}
|
|
85
|
+
return lines
|
|
86
|
+
.slice(headerIndex + 1)
|
|
87
|
+
.filter((line) => !/^Getting\s+/i.test(line))
|
|
88
|
+
.filter((line) => !/^OK$/i.test(line))
|
|
89
|
+
.filter(Boolean);
|
|
90
|
+
}
|
|
91
|
+
export function inferCloudFoundryRegionFromApiEndpoint(apiEndpoint) {
|
|
92
|
+
const match = apiEndpoint.match(/api\.cf\.([^.]+)\./i);
|
|
93
|
+
return match?.[1] ?? apiEndpoint.replace(/^https?:\/\//, "");
|
|
94
|
+
}
|
|
95
|
+
export async function scanCloudFoundryOrganizationsAcrossRegions(apiEndpoints) {
|
|
96
|
+
const originalTarget = await readCloudFoundryTarget();
|
|
97
|
+
const orgEntries = [];
|
|
98
|
+
const uniqueApiEndpoints = [...new Set(apiEndpoints.map((apiEndpoint) => apiEndpoint.trim()).filter(Boolean))];
|
|
99
|
+
for (const apiEndpoint of uniqueApiEndpoints) {
|
|
100
|
+
const apiResult = await runCommand("cf", ["api", apiEndpoint]);
|
|
101
|
+
if (apiResult.exitCode !== 0) {
|
|
102
|
+
continue;
|
|
103
|
+
}
|
|
104
|
+
const orgResult = await runCommand("cf", ["orgs"]);
|
|
105
|
+
if (orgResult.exitCode !== 0) {
|
|
106
|
+
continue;
|
|
107
|
+
}
|
|
108
|
+
const organizations = parseCloudFoundryNameList(orgResult.stdout, "name");
|
|
109
|
+
const region = inferCloudFoundryRegionFromApiEndpoint(apiEndpoint);
|
|
110
|
+
for (const org of organizations) {
|
|
111
|
+
let spaces = [];
|
|
112
|
+
const orgTargetResult = await runCommand("cf", ["target", "-o", org]);
|
|
113
|
+
if (orgTargetResult.exitCode === 0) {
|
|
114
|
+
const spacesResult = await runCommand("cf", ["spaces"]);
|
|
115
|
+
spaces = spacesResult.exitCode === 0 ? parseCloudFoundryNameList(spacesResult.stdout, "name") : [];
|
|
116
|
+
}
|
|
117
|
+
orgEntries.push({
|
|
118
|
+
apiEndpoint,
|
|
119
|
+
region,
|
|
120
|
+
org,
|
|
121
|
+
spaceCount: spaces.length,
|
|
122
|
+
spaces,
|
|
123
|
+
updatedAt: new Date().toISOString(),
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
if (originalTarget.apiEndpoint) {
|
|
128
|
+
await runCommand("cf", ["api", originalTarget.apiEndpoint]);
|
|
129
|
+
if (originalTarget.org) {
|
|
130
|
+
await runCommand("cf", ["target", "-o", originalTarget.org]);
|
|
131
|
+
}
|
|
132
|
+
if (originalTarget.space) {
|
|
133
|
+
await runCommand("cf", ["target", "-s", originalTarget.space]);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
return orgEntries.sort((left, right) => {
|
|
137
|
+
const byOrg = left.org.localeCompare(right.org);
|
|
138
|
+
return byOrg !== 0 ? byOrg : left.region.localeCompare(right.region);
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
export async function loginCloudFoundry(options) {
|
|
142
|
+
const apiExitCode = await setCloudFoundryApiEndpoint(options.apiEndpoint);
|
|
143
|
+
if (apiExitCode !== 0) {
|
|
144
|
+
return apiExitCode;
|
|
145
|
+
}
|
|
146
|
+
const authExitCode = await authenticateCloudFoundry({
|
|
147
|
+
username: options.username,
|
|
148
|
+
password: options.password,
|
|
149
|
+
});
|
|
150
|
+
if (authExitCode !== 0) {
|
|
151
|
+
return authExitCode;
|
|
152
|
+
}
|
|
153
|
+
const orgExitCode = await targetCloudFoundryOrg(options.org);
|
|
154
|
+
if (orgExitCode !== 0) {
|
|
155
|
+
return orgExitCode;
|
|
156
|
+
}
|
|
157
|
+
if (!options.space?.trim()) {
|
|
158
|
+
return 0;
|
|
159
|
+
}
|
|
160
|
+
return targetCloudFoundrySpace(options.space.trim());
|
|
161
|
+
}
|
|
162
|
+
export async function listCloudFoundryApps() {
|
|
163
|
+
const result = await runCommand("cf", ["apps"]);
|
|
164
|
+
if (result.exitCode !== 0) {
|
|
165
|
+
throw new Error(result.stderr || result.stdout || "cf apps failed");
|
|
166
|
+
}
|
|
167
|
+
return parseCloudFoundryApps(result.stdout);
|
|
168
|
+
}
|
|
169
|
+
export function parseCloudFoundryApps(output) {
|
|
170
|
+
const lines = output.split(/\r?\n/).map((line) => line.trimEnd()).filter(Boolean);
|
|
171
|
+
const nameHeaderIndex = lines.findIndex((line) => /^name\s+/i.test(line.trim()));
|
|
172
|
+
if (nameHeaderIndex === -1) {
|
|
173
|
+
return [];
|
|
174
|
+
}
|
|
175
|
+
const result = [];
|
|
176
|
+
for (const line of lines.slice(nameHeaderIndex + 1)) {
|
|
177
|
+
if (/^Getting apps/i.test(line) || /^OK$/i.test(line)) {
|
|
178
|
+
continue;
|
|
179
|
+
}
|
|
180
|
+
const columns = line.trim().split(/\s{2,}|\t+/).filter(Boolean);
|
|
181
|
+
const [name, requestedState, processes, routes] = columns;
|
|
182
|
+
if (name && name !== "name") {
|
|
183
|
+
result.push({ name, requestedState, processes, routes });
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
return result;
|
|
187
|
+
}
|
|
188
|
+
//# sourceMappingURL=cf.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cf.js","sourceRoot":"","sources":["../../src/core/cf.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE1C,MAAM,UAAU,0BAA0B,CAAC,MAA2B;IACpE,OAAO;QACL,MAAM,CAAC,WAAW,IAAI,aAAa;QACnC,MAAM,CAAC,GAAG,IAAI,aAAa;QAC3B,MAAM,CAAC,KAAK,IAAI,eAAe;KAChC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACd,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,sBAAsB;IAC1C,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,IAAI,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;IAElD,IAAI,MAAM,CAAC,QAAQ,KAAK,GAAG,EAAE,CAAC;QAC5B,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACjC,CAAC;IAED,IAAI,MAAM,CAAC,QAAQ,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,MAAM,GAAwB,EAAE,CAAC;IAEvC,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;QAChD,MAAM,CAAC,MAAM,EAAE,GAAG,aAAa,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACnD,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QACxC,MAAM,KAAK,GAAG,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;QAE7C,IAAI,GAAG,KAAK,cAAc;YAAE,MAAM,CAAC,WAAW,GAAG,KAAK,CAAC;QACvD,IAAI,GAAG,KAAK,MAAM;YAAE,MAAM,CAAC,IAAI,GAAG,KAAK,CAAC;QACxC,IAAI,GAAG,KAAK,KAAK;YAAE,MAAM,CAAC,GAAG,GAAG,KAAK,CAAC;QACtC,IAAI,GAAG,KAAK,OAAO;YAAE,MAAM,CAAC,KAAK,GAAG,KAAK,CAAC;IAC5C,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAGD,MAAM,CAAC,KAAK,UAAU,0BAA0B,CAAC,WAAmB;IAClE,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,IAAI,EAAE,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC,CAAC;IAE5D,IAAI,MAAM,CAAC,MAAM;QAAE,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAC9C,IAAI,MAAM,CAAC,MAAM;QAAE,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAEhD,OAAO,MAAM,CAAC,QAAQ,CAAC;AACzB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAAC,OAG9C;IACC,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,IAAI,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;IAEpF,IAAI,MAAM,CAAC,MAAM;QAAE,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAC9C,IAAI,MAAM,CAAC,MAAM;QAAE,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAEhD,OAAO,MAAM,CAAC,QAAQ,CAAC;AACzB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,GAAW;IACrD,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,IAAI,EAAE,CAAC,QAAQ,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC;IAE7D,IAAI,MAAM,CAAC,MAAM;QAAE,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAC9C,IAAI,MAAM,CAAC,MAAM;QAAE,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAEhD,OAAO,MAAM,CAAC,QAAQ,CAAC;AACzB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAAC,KAAa;IACzD,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,IAAI,EAAE,CAAC,QAAQ,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC;IAE/D,IAAI,MAAM,CAAC,MAAM;QAAE,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAC9C,IAAI,MAAM,CAAC,MAAM;QAAE,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAEhD,OAAO,MAAM,CAAC,QAAQ,CAAC;AACzB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,6BAA6B;IACjD,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,IAAI,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;IAEhD,IAAI,MAAM,CAAC,QAAQ,KAAK,CAAC,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,IAAI,gBAAgB,CAAC,CAAC;IACtE,CAAC;IAED,OAAO,yBAAyB,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAC1D,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,sBAAsB;IAC1C,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,IAAI,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;IAElD,IAAI,MAAM,CAAC,QAAQ,KAAK,CAAC,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,IAAI,kBAAkB,CAAC,CAAC;IACxE,CAAC;IAED,OAAO,yBAAyB,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAC1D,CAAC;AAED,SAAS,yBAAyB,CAAC,MAAc,EAAE,UAAkB;IACnE,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAC/E,MAAM,WAAW,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,UAAU,CAAC,WAAW,EAAE,CAAC,CAAC;IAE/F,IAAI,WAAW,KAAK,CAAC,CAAC,EAAE,CAAC;QACvB,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,OAAO,KAAK;SACT,KAAK,CAAC,WAAW,GAAG,CAAC,CAAC;SACtB,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;SAC5C,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;SACrC,MAAM,CAAC,OAAO,CAAC,CAAC;AACrB,CAAC;AACD,MAAM,UAAU,sCAAsC,CAAC,WAAmB;IACxE,MAAM,KAAK,GAAG,WAAW,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC;IACvD,OAAO,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,WAAW,CAAC,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC;AAC/D,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,0CAA0C,CAAC,YAAsB;IACrF,MAAM,cAAc,GAAG,MAAM,sBAAsB,EAAE,CAAC;IACtD,MAAM,UAAU,GAA4B,EAAE,CAAC;IAC/C,MAAM,kBAAkB,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IAE/G,KAAK,MAAM,WAAW,IAAI,kBAAkB,EAAE,CAAC;QAC7C,MAAM,SAAS,GAAG,MAAM,UAAU,CAAC,IAAI,EAAE,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC,CAAC;QAE/D,IAAI,SAAS,CAAC,QAAQ,KAAK,CAAC,EAAE,CAAC;YAC7B,SAAS;QACX,CAAC;QAED,MAAM,SAAS,GAAG,MAAM,UAAU,CAAC,IAAI,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;QAEnD,IAAI,SAAS,CAAC,QAAQ,KAAK,CAAC,EAAE,CAAC;YAC7B,SAAS;QACX,CAAC;QAED,MAAM,aAAa,GAAG,yBAAyB,CAAC,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAC1E,MAAM,MAAM,GAAG,sCAAsC,CAAC,WAAW,CAAC,CAAC;QAEnE,KAAK,MAAM,GAAG,IAAI,aAAa,EAAE,CAAC;YAChC,IAAI,MAAM,GAAa,EAAE,CAAC;YAC1B,MAAM,eAAe,GAAG,MAAM,UAAU,CAAC,IAAI,EAAE,CAAC,QAAQ,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC;YAEtE,IAAI,eAAe,CAAC,QAAQ,KAAK,CAAC,EAAE,CAAC;gBACnC,MAAM,YAAY,GAAG,MAAM,UAAU,CAAC,IAAI,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;gBACxD,MAAM,GAAG,YAAY,CAAC,QAAQ,KAAK,CAAC,CAAC,CAAC,CAAC,yBAAyB,CAAC,YAAY,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YACrG,CAAC;YAED,UAAU,CAAC,IAAI,CAAC;gBACd,WAAW;gBACX,MAAM;gBACN,GAAG;gBACH,UAAU,EAAE,MAAM,CAAC,MAAM;gBACzB,MAAM;gBACN,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;aACpC,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,IAAI,cAAc,CAAC,WAAW,EAAE,CAAC;QAC/B,MAAM,UAAU,CAAC,IAAI,EAAE,CAAC,KAAK,EAAE,cAAc,CAAC,WAAW,CAAC,CAAC,CAAC;QAE5D,IAAI,cAAc,CAAC,GAAG,EAAE,CAAC;YACvB,MAAM,UAAU,CAAC,IAAI,EAAE,CAAC,QAAQ,EAAE,IAAI,EAAE,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC;QAC/D,CAAC;QAED,IAAI,cAAc,CAAC,KAAK,EAAE,CAAC;YACzB,MAAM,UAAU,CAAC,IAAI,EAAE,CAAC,QAAQ,EAAE,IAAI,EAAE,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC;QACjE,CAAC;IACH,CAAC;IAED,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;QACrC,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAChD,OAAO,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IACvE,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,OAMvC;IACC,MAAM,WAAW,GAAG,MAAM,0BAA0B,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;IAE1E,IAAI,WAAW,KAAK,CAAC,EAAE,CAAC;QACtB,OAAO,WAAW,CAAC;IACrB,CAAC;IAED,MAAM,YAAY,GAAG,MAAM,wBAAwB,CAAC;QAClD,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,QAAQ,EAAE,OAAO,CAAC,QAAQ;KAC3B,CAAC,CAAC;IAEH,IAAI,YAAY,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,YAAY,CAAC;IACtB,CAAC;IAED,MAAM,WAAW,GAAG,MAAM,qBAAqB,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAE7D,IAAI,WAAW,KAAK,CAAC,EAAE,CAAC;QACtB,OAAO,WAAW,CAAC;IACrB,CAAC;IAED,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC;QAC3B,OAAO,CAAC,CAAC;IACX,CAAC;IAED,OAAO,uBAAuB,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;AACvD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,oBAAoB;IACxC,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,IAAI,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;IAEhD,IAAI,MAAM,CAAC,QAAQ,KAAK,CAAC,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,IAAI,gBAAgB,CAAC,CAAC;IACtE,CAAC;IAED,OAAO,qBAAqB,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;AAC9C,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,MAAc;IAClD,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAClF,MAAM,eAAe,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IAEjF,IAAI,eAAe,KAAK,CAAC,CAAC,EAAE,CAAC;QAC3B,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,MAAM,GAAuB,EAAE,CAAC;IAEtC,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,KAAK,CAAC,eAAe,GAAG,CAAC,CAAC,EAAE,CAAC;QACpD,IAAI,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YACtD,SAAS;QACX,CAAC;QAED,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAChE,MAAM,CAAC,IAAI,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC;QAE1D,IAAI,IAAI,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;YAC5B,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,CAAC;QAC3D,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
import fs from "fs-extra";
|
|
3
|
+
async function findPackageJsonFiles(startPath, packageName) {
|
|
4
|
+
const packagePathParts = packageName.startsWith("@") ? packageName.split("/") : [packageName];
|
|
5
|
+
const result = [];
|
|
6
|
+
async function walk(directoryPath, depth) {
|
|
7
|
+
if (depth > 8) {
|
|
8
|
+
return;
|
|
9
|
+
}
|
|
10
|
+
const entries = await fs.readdir(directoryPath, { withFileTypes: true }).catch(() => []);
|
|
11
|
+
for (const entry of entries) {
|
|
12
|
+
if (!entry.isDirectory()) {
|
|
13
|
+
continue;
|
|
14
|
+
}
|
|
15
|
+
if (entry.name === ".git") {
|
|
16
|
+
continue;
|
|
17
|
+
}
|
|
18
|
+
const entryPath = path.join(directoryPath, entry.name);
|
|
19
|
+
if (entry.name === "node_modules") {
|
|
20
|
+
const packageJsonPath = path.join(entryPath, ...packagePathParts, "package.json");
|
|
21
|
+
if (await fs.pathExists(packageJsonPath)) {
|
|
22
|
+
result.push(packageJsonPath);
|
|
23
|
+
}
|
|
24
|
+
await walk(entryPath, depth + 1);
|
|
25
|
+
continue;
|
|
26
|
+
}
|
|
27
|
+
if (entry.name.startsWith(".")) {
|
|
28
|
+
continue;
|
|
29
|
+
}
|
|
30
|
+
await walk(entryPath, depth + 1);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
await walk(startPath, 0);
|
|
34
|
+
return result;
|
|
35
|
+
}
|
|
36
|
+
export async function doctorPackage(options) {
|
|
37
|
+
const packageJsonFiles = await findPackageJsonFiles(options.repositoryPath, options.packageName);
|
|
38
|
+
const occurrences = [];
|
|
39
|
+
for (const packageJsonFile of packageJsonFiles) {
|
|
40
|
+
const packageJson = await fs.readJson(packageJsonFile).catch(() => undefined);
|
|
41
|
+
occurrences.push({
|
|
42
|
+
version: packageJson?.version,
|
|
43
|
+
path: packageJsonFile,
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
const versions = [...new Set(occurrences.map((item) => item.version).filter((version) => Boolean(version)))];
|
|
47
|
+
return {
|
|
48
|
+
packageName: options.packageName,
|
|
49
|
+
versions,
|
|
50
|
+
occurrences,
|
|
51
|
+
hasMultipleVersions: versions.length > 1,
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=doctor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/core/doctor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import fs from "fs-extra";
|
|
2
|
+
import fastGlob from "fast-glob";
|
|
3
|
+
import { execa } from "execa";
|
|
4
|
+
import { splitCommand } from "./process.js";
|
|
5
|
+
function replaceVariables(content, variableValues) {
|
|
6
|
+
return content.replace(/\$\{([A-Za-z_][A-Za-z0-9_]*)\}/g, (fullMatch, variableName) => {
|
|
7
|
+
return variableValues[variableName] ?? fullMatch;
|
|
8
|
+
});
|
|
9
|
+
}
|
|
10
|
+
function mergePackageOverrides(packageJson, temporaryOverrides) {
|
|
11
|
+
if (Object.keys(temporaryOverrides).length === 0) {
|
|
12
|
+
return packageJson;
|
|
13
|
+
}
|
|
14
|
+
const currentOverrides = typeof packageJson.overrides === "object" && packageJson.overrides !== null && !Array.isArray(packageJson.overrides)
|
|
15
|
+
? packageJson.overrides
|
|
16
|
+
: {};
|
|
17
|
+
return {
|
|
18
|
+
...packageJson,
|
|
19
|
+
overrides: {
|
|
20
|
+
...currentOverrides,
|
|
21
|
+
...temporaryOverrides,
|
|
22
|
+
},
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
export async function installRepository(options) {
|
|
26
|
+
const filePaths = await fastGlob(options.filePatterns, {
|
|
27
|
+
cwd: options.repositoryPath,
|
|
28
|
+
absolute: true,
|
|
29
|
+
onlyFiles: true,
|
|
30
|
+
ignore: ["node_modules/**", "dist/**", ".git/**"],
|
|
31
|
+
});
|
|
32
|
+
const originalContents = new Map();
|
|
33
|
+
try {
|
|
34
|
+
for (const filePath of filePaths) {
|
|
35
|
+
const originalContent = await fs.readFile(filePath, "utf8");
|
|
36
|
+
originalContents.set(filePath, originalContent);
|
|
37
|
+
let nextContent = replaceVariables(originalContent, options.variableValues);
|
|
38
|
+
if (filePath.endsWith("package.json")) {
|
|
39
|
+
const packageJson = JSON.parse(nextContent);
|
|
40
|
+
nextContent = `${JSON.stringify(mergePackageOverrides(packageJson, options.temporaryOverrides), null, 2)}\n`;
|
|
41
|
+
}
|
|
42
|
+
if (nextContent !== originalContent) {
|
|
43
|
+
await fs.writeFile(filePath, nextContent, "utf8");
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
const { command, args } = splitCommand(options.installCommand);
|
|
47
|
+
const childProcess = execa(command, args, {
|
|
48
|
+
cwd: options.repositoryPath,
|
|
49
|
+
reject: false,
|
|
50
|
+
all: false,
|
|
51
|
+
});
|
|
52
|
+
let stdout = "";
|
|
53
|
+
let stderr = "";
|
|
54
|
+
childProcess.stdout?.on("data", (chunk) => {
|
|
55
|
+
const value = chunk.toString();
|
|
56
|
+
stdout += value;
|
|
57
|
+
options.onLog?.(value);
|
|
58
|
+
});
|
|
59
|
+
childProcess.stderr?.on("data", (chunk) => {
|
|
60
|
+
const value = chunk.toString();
|
|
61
|
+
stderr += value;
|
|
62
|
+
options.onErrorLog?.(value);
|
|
63
|
+
});
|
|
64
|
+
const result = await childProcess;
|
|
65
|
+
return {
|
|
66
|
+
stdout,
|
|
67
|
+
stderr,
|
|
68
|
+
exitCode: result.exitCode ?? 0,
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
finally {
|
|
72
|
+
for (const [filePath, content] of originalContents.entries()) {
|
|
73
|
+
await fs.writeFile(filePath, content, "utf8");
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=install.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"install.js","sourceRoot":"","sources":["../../src/core/install.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
export type TNpmrcConfig = {
|
|
2
|
+
host: string;
|
|
3
|
+
scope: string;
|
|
4
|
+
packageId: string;
|
|
5
|
+
token: string;
|
|
6
|
+
outputFileName: string;
|
|
7
|
+
alwaysAuth: boolean;
|
|
8
|
+
};
|
|
9
|
+
export declare function normalizeNpmScope(scope: string): string;
|
|
10
|
+
export declare function normalizeGitLabHost(host: string): string;
|
|
11
|
+
export declare function buildGitLabNpmRegistryUrl(options: {
|
|
12
|
+
host: string;
|
|
13
|
+
packageId: string;
|
|
14
|
+
}): string;
|
|
15
|
+
export declare function buildGitLabNpmAuthRegistryPath(options: {
|
|
16
|
+
host: string;
|
|
17
|
+
packageId: string;
|
|
18
|
+
}): string;
|
|
19
|
+
export declare function writeNpmrcFile(options: TNpmrcConfig): Promise<string>;
|
|
20
|
+
export declare function parsePackageIdList(input: string): string[];
|
|
21
|
+
export declare function readPackageJsonName(repositoryPath: string): Promise<string | undefined>;
|
|
22
|
+
export type TParsedPackageInput = {
|
|
23
|
+
packageId: string;
|
|
24
|
+
packageName: string;
|
|
25
|
+
};
|
|
26
|
+
export declare function parsePackageInputList(input: string): TParsedPackageInput[];
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
import fs from "fs-extra";
|
|
3
|
+
function trimSlashes(value) {
|
|
4
|
+
return value.trim().replace(/^\/+/, "").replace(/\/+$/, "");
|
|
5
|
+
}
|
|
6
|
+
export function normalizeNpmScope(scope) {
|
|
7
|
+
const trimmedScope = scope.trim();
|
|
8
|
+
if (!trimmedScope) {
|
|
9
|
+
throw new Error("Scope is required");
|
|
10
|
+
}
|
|
11
|
+
return trimmedScope.startsWith("@") ? trimmedScope : `@${trimmedScope}`;
|
|
12
|
+
}
|
|
13
|
+
export function normalizeGitLabHost(host) {
|
|
14
|
+
return trimSlashes(host.replace(/^https?:\/\//, ""));
|
|
15
|
+
}
|
|
16
|
+
export function buildGitLabNpmRegistryUrl(options) {
|
|
17
|
+
const host = normalizeGitLabHost(options.host);
|
|
18
|
+
const packageId = options.packageId.trim();
|
|
19
|
+
if (!/^\d+$/.test(packageId)) {
|
|
20
|
+
throw new Error("Package ID must be a number");
|
|
21
|
+
}
|
|
22
|
+
return `https://${host}/api/v4/projects/${packageId}/packages/npm/`;
|
|
23
|
+
}
|
|
24
|
+
export function buildGitLabNpmAuthRegistryPath(options) {
|
|
25
|
+
const host = normalizeGitLabHost(options.host);
|
|
26
|
+
const packageId = options.packageId.trim();
|
|
27
|
+
if (!/^\d+$/.test(packageId)) {
|
|
28
|
+
throw new Error("Package ID must be a number");
|
|
29
|
+
}
|
|
30
|
+
return `//${host}/api/v4/projects/${packageId}/packages/npm/`;
|
|
31
|
+
}
|
|
32
|
+
function removeExistingManagedLines(options) {
|
|
33
|
+
const normalizedScope = normalizeNpmScope(options.scope);
|
|
34
|
+
const normalizedHost = normalizeGitLabHost(options.host);
|
|
35
|
+
return options.currentContent
|
|
36
|
+
.split(/\r?\n/)
|
|
37
|
+
.filter((line) => {
|
|
38
|
+
const trimmedLine = line.trim();
|
|
39
|
+
if (!trimmedLine) {
|
|
40
|
+
return false;
|
|
41
|
+
}
|
|
42
|
+
if (trimmedLine.startsWith(`${normalizedScope}:registry=`)) {
|
|
43
|
+
return false;
|
|
44
|
+
}
|
|
45
|
+
if (trimmedLine.includes(`${normalizedHost}/api/v4/projects/`) && trimmedLine.includes("/packages/npm/:_authToken=")) {
|
|
46
|
+
return false;
|
|
47
|
+
}
|
|
48
|
+
if (trimmedLine === "always-auth=true" || trimmedLine === "always-auth=false") {
|
|
49
|
+
return false;
|
|
50
|
+
}
|
|
51
|
+
return true;
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
export async function writeNpmrcFile(options) {
|
|
55
|
+
const outputPath = path.resolve(process.cwd(), options.outputFileName);
|
|
56
|
+
const existingContent = await fs.pathExists(outputPath) ? await fs.readFile(outputPath, "utf8") : "";
|
|
57
|
+
const preservedLines = removeExistingManagedLines({
|
|
58
|
+
currentContent: existingContent,
|
|
59
|
+
scope: options.scope,
|
|
60
|
+
host: options.host,
|
|
61
|
+
});
|
|
62
|
+
const scope = normalizeNpmScope(options.scope);
|
|
63
|
+
const registryUrl = buildGitLabNpmRegistryUrl({ host: options.host, packageId: options.packageId });
|
|
64
|
+
const authRegistryPath = buildGitLabNpmAuthRegistryPath({ host: options.host, packageId: options.packageId });
|
|
65
|
+
const managedLines = [
|
|
66
|
+
`${scope}:registry=${registryUrl}`,
|
|
67
|
+
`${authRegistryPath}:_authToken=${options.token.trim()}`,
|
|
68
|
+
`always-auth=${options.alwaysAuth ? "true" : "false"}`,
|
|
69
|
+
];
|
|
70
|
+
const nextContent = [...preservedLines, ...managedLines].join("\n") + "\n";
|
|
71
|
+
await fs.writeFile(outputPath, nextContent, "utf8");
|
|
72
|
+
return outputPath;
|
|
73
|
+
}
|
|
74
|
+
export function parsePackageIdList(input) {
|
|
75
|
+
return [...new Set(input
|
|
76
|
+
.split(/[\s,;]+/)
|
|
77
|
+
.map((value) => value.trim())
|
|
78
|
+
.filter(Boolean)
|
|
79
|
+
.filter((value) => /^\d+$/.test(value)))];
|
|
80
|
+
}
|
|
81
|
+
export async function readPackageJsonName(repositoryPath) {
|
|
82
|
+
const packageJsonPath = path.join(repositoryPath, "package.json");
|
|
83
|
+
if (!(await fs.pathExists(packageJsonPath))) {
|
|
84
|
+
return undefined;
|
|
85
|
+
}
|
|
86
|
+
const packageJson = await fs.readJson(packageJsonPath).catch(() => undefined);
|
|
87
|
+
return packageJson?.name;
|
|
88
|
+
}
|
|
89
|
+
export function parsePackageInputList(input) {
|
|
90
|
+
const entries = [];
|
|
91
|
+
const keys = new Set();
|
|
92
|
+
for (const rawLine of input.split(/\r?\n/)) {
|
|
93
|
+
const trimmedLine = rawLine.trim();
|
|
94
|
+
if (!trimmedLine) {
|
|
95
|
+
continue;
|
|
96
|
+
}
|
|
97
|
+
const tokens = trimmedLine.split(/[|,;\t]+/).map((value) => value.trim()).filter(Boolean);
|
|
98
|
+
const firstNumericTokenIndex = tokens.findIndex((value) => /^\d+$/.test(value));
|
|
99
|
+
if (firstNumericTokenIndex >= 0) {
|
|
100
|
+
const packageId = tokens[firstNumericTokenIndex];
|
|
101
|
+
const packageNameTokens = tokens.filter((_, index) => index !== firstNumericTokenIndex);
|
|
102
|
+
const packageName = packageNameTokens.join(" - ").trim() || packageId;
|
|
103
|
+
const key = packageId;
|
|
104
|
+
if (!keys.has(key)) {
|
|
105
|
+
keys.add(key);
|
|
106
|
+
entries.push({ packageId, packageName });
|
|
107
|
+
}
|
|
108
|
+
continue;
|
|
109
|
+
}
|
|
110
|
+
for (const packageId of parsePackageIdList(trimmedLine)) {
|
|
111
|
+
if (!keys.has(packageId)) {
|
|
112
|
+
keys.add(packageId);
|
|
113
|
+
entries.push({ packageId, packageName: packageId });
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
return entries;
|
|
118
|
+
}
|
|
119
|
+
//# sourceMappingURL=npmrc.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"npmrc.js","sourceRoot":"","sources":["../../src/core/npmrc.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
export type TCommandResult = {
|
|
2
|
+
stdout: string;
|
|
3
|
+
stderr: string;
|
|
4
|
+
exitCode: number;
|
|
5
|
+
};
|
|
6
|
+
type TRunCommandOptions = {
|
|
7
|
+
cwd?: string;
|
|
8
|
+
reject?: boolean;
|
|
9
|
+
};
|
|
10
|
+
type TResolvedCommand = {
|
|
11
|
+
command: string;
|
|
12
|
+
env?: NodeJS.ProcessEnv;
|
|
13
|
+
};
|
|
14
|
+
export declare function getMissingCommandMessage(command: string): string;
|
|
15
|
+
export declare function resolveCommand(command: string, options?: {
|
|
16
|
+
cwd?: string;
|
|
17
|
+
}): Promise<TResolvedCommand | undefined>;
|
|
18
|
+
export declare function ensureCommandAvailable(command: string, options?: {
|
|
19
|
+
cwd?: string;
|
|
20
|
+
}): Promise<TResolvedCommand>;
|
|
21
|
+
export declare function runCommand(command: string, args: string[], options?: TRunCommandOptions): Promise<TCommandResult>;
|
|
22
|
+
export declare function runCommandInherit(command: string, args: string[], options?: {
|
|
23
|
+
cwd?: string;
|
|
24
|
+
}): Promise<number>;
|
|
25
|
+
export declare function splitCommand(commandLine: string): {
|
|
26
|
+
command: string;
|
|
27
|
+
args: string[];
|
|
28
|
+
};
|
|
29
|
+
export {};
|