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.
Files changed (56) hide show
  1. package/README.md +170 -0
  2. package/dist/commands/cds.command.d.ts +2 -0
  3. package/dist/commands/cds.command.js +377 -0
  4. package/dist/commands/cds.command.js.map +1 -0
  5. package/dist/commands/cf.command.d.ts +2 -0
  6. package/dist/commands/cf.command.js +667 -0
  7. package/dist/commands/cf.command.js.map +1 -0
  8. package/dist/commands/npmrc.command.d.ts +2 -0
  9. package/dist/commands/npmrc.command.js +447 -0
  10. package/dist/commands/npmrc.command.js.map +1 -0
  11. package/dist/core/cache.d.ts +23 -0
  12. package/dist/core/cache.js +269 -0
  13. package/dist/core/cache.js.map +1 -0
  14. package/dist/core/cds.d.ts +16 -0
  15. package/dist/core/cds.js +208 -0
  16. package/dist/core/cds.js.map +1 -0
  17. package/dist/core/cf-env-parser.d.ts +2 -0
  18. package/dist/core/cf-env-parser.js +109 -0
  19. package/dist/core/cf-env-parser.js.map +1 -0
  20. package/dist/core/cf.d.ts +23 -0
  21. package/dist/core/cf.js +188 -0
  22. package/dist/core/cf.js.map +1 -0
  23. package/dist/core/doctor.d.ts +5 -0
  24. package/dist/core/doctor.js +54 -0
  25. package/dist/core/doctor.js.map +1 -0
  26. package/dist/core/install.d.ts +2 -0
  27. package/dist/core/install.js +77 -0
  28. package/dist/core/install.js.map +1 -0
  29. package/dist/core/npmrc.d.ts +26 -0
  30. package/dist/core/npmrc.js +119 -0
  31. package/dist/core/npmrc.js.map +1 -0
  32. package/dist/core/process.d.ts +29 -0
  33. package/dist/core/process.js +183 -0
  34. package/dist/core/process.js.map +1 -0
  35. package/dist/core/prompts.d.ts +29 -0
  36. package/dist/core/prompts.js +159 -0
  37. package/dist/core/prompts.js.map +1 -0
  38. package/dist/core/repository.d.ts +3 -0
  39. package/dist/core/repository.js +27 -0
  40. package/dist/core/repository.js.map +1 -0
  41. package/dist/core/scanner.d.ts +5 -0
  42. package/dist/core/scanner.js +31 -0
  43. package/dist/core/scanner.js.map +1 -0
  44. package/dist/core/types.d.ts +131 -0
  45. package/dist/core/types.js +2 -0
  46. package/dist/core/types.js.map +1 -0
  47. package/dist/core/version-conflict.d.ts +8 -0
  48. package/dist/core/version-conflict.js +33 -0
  49. package/dist/core/version-conflict.js.map +1 -0
  50. package/dist/index.d.ts +2 -0
  51. package/dist/index.js +320 -0
  52. package/dist/index.js.map +1 -0
  53. package/dist/types-local.d.ts +10 -0
  54. package/dist/types-local.js +2 -0
  55. package/dist/types-local.js.map +1 -0
  56. package/package.json +41 -0
@@ -0,0 +1,183 @@
1
+ import { execa } from "execa";
2
+ import path from "node:path";
3
+ import fs from "fs-extra";
4
+ function getPathEnvironmentKey() {
5
+ return Object.keys(process.env).find((key) => key.toLowerCase() === "path") ?? "PATH";
6
+ }
7
+ function getExecutableCandidates(command) {
8
+ if (process.platform !== "win32" || path.extname(command)) {
9
+ return [command];
10
+ }
11
+ const extensions = (process.env.PATHEXT ?? ".COM;.EXE;.BAT;.CMD")
12
+ .split(";")
13
+ .map((extension) => extension.trim())
14
+ .filter(Boolean);
15
+ return [command, ...extensions.map((extension) => `${command}${extension.toLowerCase()}`)];
16
+ }
17
+ function isPathLike(command) {
18
+ return command.includes("/") || command.includes("\\") || path.isAbsolute(command);
19
+ }
20
+ async function findExecutableInDirectory(directoryPath, command) {
21
+ for (const candidate of getExecutableCandidates(command)) {
22
+ const candidatePath = path.join(directoryPath, candidate);
23
+ if (await fs.pathExists(candidatePath)) {
24
+ return candidatePath;
25
+ }
26
+ }
27
+ return undefined;
28
+ }
29
+ async function findLocalBinExecutable(command, cwd) {
30
+ if (!cwd || isPathLike(command)) {
31
+ return undefined;
32
+ }
33
+ let currentPath = path.resolve(cwd);
34
+ while (true) {
35
+ const executablePath = await findExecutableInDirectory(path.join(currentPath, "node_modules", ".bin"), command);
36
+ if (executablePath) {
37
+ return executablePath;
38
+ }
39
+ const parentPath = path.dirname(currentPath);
40
+ if (parentPath === currentPath) {
41
+ return undefined;
42
+ }
43
+ currentPath = parentPath;
44
+ }
45
+ }
46
+ async function findPathExecutable(command) {
47
+ if (isPathLike(command)) {
48
+ return await fs.pathExists(command) ? command : undefined;
49
+ }
50
+ const pathEnvironment = process.env[getPathEnvironmentKey()] ?? "";
51
+ const directories = pathEnvironment.split(path.delimiter).filter(Boolean);
52
+ for (const directoryPath of directories) {
53
+ const executablePath = await findExecutableInDirectory(directoryPath, command);
54
+ if (executablePath) {
55
+ return executablePath;
56
+ }
57
+ }
58
+ return undefined;
59
+ }
60
+ export function getMissingCommandMessage(command) {
61
+ if (command === "cds") {
62
+ return [
63
+ "Required command not found: cds",
64
+ "",
65
+ "Install SAP CAP CLI in one of these ways:",
66
+ "- Project-local: npm install --save-dev @sap/cds-dk",
67
+ "- Global: npm install -g @sap/cds-dk",
68
+ "",
69
+ "After installing, reopen the terminal or make sure node_modules/.bin / npm global bin is in PATH.",
70
+ ].join("\n");
71
+ }
72
+ if (command === "cf") {
73
+ return [
74
+ "Required command not found: cf",
75
+ "",
76
+ "Install Cloud Foundry CLI v8, then reopen the terminal and check:",
77
+ "cf version",
78
+ "",
79
+ "On Windows, also make sure the cf CLI install directory is in PATH.",
80
+ ].join("\n");
81
+ }
82
+ return `Required command not found: ${command}`;
83
+ }
84
+ export async function resolveCommand(command, options) {
85
+ const localExecutablePath = await findLocalBinExecutable(command, options?.cwd);
86
+ if (localExecutablePath) {
87
+ const pathKey = getPathEnvironmentKey();
88
+ const localBinDirectory = path.dirname(localExecutablePath);
89
+ return {
90
+ command: localExecutablePath,
91
+ env: {
92
+ ...process.env,
93
+ [pathKey]: [localBinDirectory, process.env[pathKey]].filter(Boolean).join(path.delimiter),
94
+ },
95
+ };
96
+ }
97
+ const pathExecutablePath = await findPathExecutable(command);
98
+ if (pathExecutablePath) {
99
+ return { command: pathExecutablePath };
100
+ }
101
+ return undefined;
102
+ }
103
+ export async function ensureCommandAvailable(command, options) {
104
+ const resolvedCommand = await resolveCommand(command, options);
105
+ if (!resolvedCommand) {
106
+ throw new Error(getMissingCommandMessage(command));
107
+ }
108
+ return resolvedCommand;
109
+ }
110
+ export async function runCommand(command, args, options) {
111
+ const resolvedCommand = await resolveCommand(command, { cwd: options?.cwd });
112
+ if (!resolvedCommand) {
113
+ const stderr = getMissingCommandMessage(command);
114
+ if (options?.reject) {
115
+ throw new Error(stderr);
116
+ }
117
+ return {
118
+ stdout: "",
119
+ stderr,
120
+ exitCode: 127,
121
+ };
122
+ }
123
+ const result = await execa(resolvedCommand.command, args, {
124
+ cwd: options?.cwd,
125
+ env: resolvedCommand.env,
126
+ reject: options?.reject ?? false,
127
+ all: false,
128
+ shell: false,
129
+ });
130
+ return {
131
+ stdout: result.stdout,
132
+ stderr: result.stderr,
133
+ exitCode: result.exitCode ?? 0,
134
+ };
135
+ }
136
+ export async function runCommandInherit(command, args, options) {
137
+ const resolvedCommand = await resolveCommand(command, { cwd: options?.cwd });
138
+ if (!resolvedCommand) {
139
+ console.error(getMissingCommandMessage(command));
140
+ return 127;
141
+ }
142
+ const result = await execa(resolvedCommand.command, args, {
143
+ cwd: options?.cwd,
144
+ env: resolvedCommand.env,
145
+ stdio: "inherit",
146
+ reject: false,
147
+ shell: false,
148
+ });
149
+ return result.exitCode ?? 0;
150
+ }
151
+ export function splitCommand(commandLine) {
152
+ const tokens = [];
153
+ let current = "";
154
+ let quote;
155
+ for (let index = 0; index < commandLine.length; index += 1) {
156
+ const character = commandLine[index];
157
+ if ((character === '"' || character === "'") && !quote) {
158
+ quote = character;
159
+ continue;
160
+ }
161
+ if (quote && character === quote) {
162
+ quote = undefined;
163
+ continue;
164
+ }
165
+ if (!quote && /\s/.test(character)) {
166
+ if (current) {
167
+ tokens.push(current);
168
+ current = "";
169
+ }
170
+ continue;
171
+ }
172
+ current += character;
173
+ }
174
+ if (current) {
175
+ tokens.push(current);
176
+ }
177
+ const [command, ...args] = tokens;
178
+ if (!command) {
179
+ throw new Error("Command is required");
180
+ }
181
+ return { command, args };
182
+ }
183
+ //# sourceMappingURL=process.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"process.js","sourceRoot":"","sources":["../../src/core/process.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ export declare function searchableSelectChoice<TValue extends string>(options: {
2
+ message: string;
3
+ choices: Array<{
4
+ title: string;
5
+ value: TValue;
6
+ description?: string;
7
+ }>;
8
+ validateCustomValue?: (value: string) => true | string;
9
+ allowCustomValue?: boolean;
10
+ customValueTitle?: (value: string) => string;
11
+ limit?: number;
12
+ }): Promise<string>;
13
+ export declare function searchableSelectOrInput(options: {
14
+ message: string;
15
+ values: string[];
16
+ initialValue?: string;
17
+ inputMessage?: string;
18
+ validate?: (value: string) => true | string;
19
+ allowCustomValue?: boolean;
20
+ customValueTitle?: (value: string) => string;
21
+ limit?: number;
22
+ }): Promise<string>;
23
+ export declare function selectFromHistoryOrInput(options: {
24
+ message: string;
25
+ values: string[];
26
+ initialValue?: string;
27
+ inputMessage?: string;
28
+ validate?: (value: string) => true | string;
29
+ }): Promise<string>;
@@ -0,0 +1,159 @@
1
+ import prompts from "prompts";
2
+ const CUSTOM_VALUE_PREFIX = "__SMDG_CUSTOM_VALUE__:";
3
+ function normalizeValue(value) {
4
+ return value.trim();
5
+ }
6
+ function uniqueValues(values) {
7
+ return [...new Set(values.map((value) => normalizeValue(value ?? "")).filter(Boolean))];
8
+ }
9
+ function scoreMatch(input, value) {
10
+ const normalizedInput = input.toLowerCase().trim();
11
+ const normalizedValue = value.toLowerCase();
12
+ if (!normalizedInput) {
13
+ return 0;
14
+ }
15
+ if (normalizedValue === normalizedInput) {
16
+ return 100;
17
+ }
18
+ if (normalizedValue.startsWith(normalizedInput)) {
19
+ return 80;
20
+ }
21
+ if (normalizedValue.includes(normalizedInput)) {
22
+ return 60;
23
+ }
24
+ const inputParts = normalizedInput.split(/\s+/).filter(Boolean);
25
+ if (inputParts.every((part) => normalizedValue.includes(part))) {
26
+ return 40;
27
+ }
28
+ return -1;
29
+ }
30
+ function buildSearchableChoices(options) {
31
+ const input = normalizeValue(options.input);
32
+ const scoredChoices = options.choices
33
+ .map((choice, index) => {
34
+ const title = String(choice.title ?? "");
35
+ const value = String(choice.value ?? choice.title ?? "");
36
+ const score = input ? Math.max(scoreMatch(input, title), scoreMatch(input, value)) : 0;
37
+ return { choice, index, score };
38
+ })
39
+ .filter((item) => !input || item.score >= 0)
40
+ .sort((left, right) => right.score - left.score || left.index - right.index)
41
+ .map((item) => item.choice);
42
+ const hasExactMatch = options.choices.some((choice) => {
43
+ const title = String(choice.title ?? "").trim().toLowerCase();
44
+ const value = String(choice.value ?? choice.title ?? "").trim().toLowerCase();
45
+ const normalizedInput = input.toLowerCase();
46
+ return title === normalizedInput || value === normalizedInput;
47
+ });
48
+ if (options.allowCustomValue && input && !hasExactMatch) {
49
+ return [
50
+ ...scoredChoices,
51
+ {
52
+ title: options.customValueTitle?.(input) ?? `Use typed value: ${input}`,
53
+ value: `${CUSTOM_VALUE_PREFIX}${input}`,
54
+ },
55
+ ];
56
+ }
57
+ return scoredChoices;
58
+ }
59
+ export async function searchableSelectChoice(options) {
60
+ const allowCustomValue = options.allowCustomValue ?? true;
61
+ const validate = options.validateCustomValue ?? ((value) => value.trim() ? true : "Value is required");
62
+ const choices = options.choices.map((choice) => ({
63
+ title: choice.title,
64
+ value: choice.value,
65
+ description: choice.description,
66
+ }));
67
+ if (choices.length === 0) {
68
+ const response = await prompts({
69
+ type: "text",
70
+ name: "value",
71
+ message: options.message,
72
+ validate,
73
+ });
74
+ if (!response.value) {
75
+ throw new Error("Cancelled");
76
+ }
77
+ return String(response.value).trim();
78
+ }
79
+ const response = await prompts({
80
+ type: "autocomplete",
81
+ name: "value",
82
+ message: options.message,
83
+ choices,
84
+ initial: 0,
85
+ limit: options.limit ?? 12,
86
+ suggest: async (input, currentChoices) => buildSearchableChoices({
87
+ input,
88
+ choices: currentChoices,
89
+ allowCustomValue,
90
+ customValueTitle: options.customValueTitle,
91
+ }),
92
+ });
93
+ if (!response.value) {
94
+ throw new Error("Cancelled");
95
+ }
96
+ const selectedValue = String(response.value);
97
+ if (selectedValue.startsWith(CUSTOM_VALUE_PREFIX)) {
98
+ const customValue = selectedValue.slice(CUSTOM_VALUE_PREFIX.length).trim();
99
+ const validationResult = validate(customValue);
100
+ if (validationResult !== true) {
101
+ throw new Error(validationResult);
102
+ }
103
+ return customValue;
104
+ }
105
+ return selectedValue;
106
+ }
107
+ export async function searchableSelectOrInput(options) {
108
+ const values = uniqueValues([options.initialValue, ...options.values]);
109
+ const choices = values.map((value) => ({ title: value, value }));
110
+ const allowCustomValue = options.allowCustomValue ?? true;
111
+ const validate = options.validate ?? ((value) => value.trim() ? true : "Value is required");
112
+ if (choices.length > 0) {
113
+ const response = await prompts({
114
+ type: "autocomplete",
115
+ name: "value",
116
+ message: options.message,
117
+ choices,
118
+ initial: 0,
119
+ limit: options.limit ?? 12,
120
+ suggest: async (input, currentChoices) => buildSearchableChoices({
121
+ input,
122
+ choices: currentChoices,
123
+ allowCustomValue,
124
+ customValueTitle: options.customValueTitle,
125
+ }),
126
+ });
127
+ if (!response.value) {
128
+ throw new Error("Cancelled");
129
+ }
130
+ const selectedValue = String(response.value);
131
+ if (selectedValue.startsWith(CUSTOM_VALUE_PREFIX)) {
132
+ const customValue = selectedValue.slice(CUSTOM_VALUE_PREFIX.length).trim();
133
+ const validationResult = validate(customValue);
134
+ if (validationResult !== true) {
135
+ throw new Error(validationResult);
136
+ }
137
+ return customValue;
138
+ }
139
+ return selectedValue;
140
+ }
141
+ const input = await prompts({
142
+ type: "text",
143
+ name: "value",
144
+ message: options.inputMessage ?? options.message,
145
+ initial: options.initialValue ?? values[0] ?? "",
146
+ validate,
147
+ });
148
+ if (!input.value) {
149
+ throw new Error("Cancelled");
150
+ }
151
+ return String(input.value).trim();
152
+ }
153
+ export async function selectFromHistoryOrInput(options) {
154
+ return searchableSelectOrInput({
155
+ ...options,
156
+ allowCustomValue: true,
157
+ });
158
+ }
159
+ //# sourceMappingURL=prompts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompts.js","sourceRoot":"","sources":["../../src/core/prompts.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { TRepositoryInfo } from "./types.js";
2
+ export declare function findNearestRepository(startPath: string): Promise<TRepositoryInfo | undefined>;
3
+ export declare function resolveRepositoryPath(cwd: string): Promise<string>;
@@ -0,0 +1,27 @@
1
+ import path from "node:path";
2
+ import fs from "fs-extra";
3
+ export async function findNearestRepository(startPath) {
4
+ let currentPath = path.resolve(startPath);
5
+ while (true) {
6
+ if (await fs.pathExists(path.join(currentPath, "package.json"))) {
7
+ return { repositoryPath: currentPath };
8
+ }
9
+ const parentPath = path.dirname(currentPath);
10
+ if (parentPath === currentPath) {
11
+ return undefined;
12
+ }
13
+ currentPath = parentPath;
14
+ }
15
+ }
16
+ export async function resolveRepositoryPath(cwd) {
17
+ const absoluteCwd = path.resolve(cwd);
18
+ const repository = await findNearestRepository(absoluteCwd);
19
+ if (repository?.repositoryPath) {
20
+ return repository.repositoryPath;
21
+ }
22
+ if (await fs.pathExists(path.join(absoluteCwd, "package.json"))) {
23
+ return absoluteCwd;
24
+ }
25
+ throw new Error(`Cannot find repository from ${absoluteCwd}`);
26
+ }
27
+ //# sourceMappingURL=repository.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"repository.js","sourceRoot":"","sources":["../../src/core/repository.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,UAAU,CAAC;AAG1B,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,SAAiB;IAC3D,IAAI,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAE1C,OAAO,IAAI,EAAE,CAAC;QACZ,IAAI,MAAM,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,cAAc,CAAC,CAAC,EAAE,CAAC;YAChE,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,CAAC;QACzC,CAAC;QAED,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;QAE7C,IAAI,UAAU,KAAK,WAAW,EAAE,CAAC;YAC/B,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,WAAW,GAAG,UAAU,CAAC;IAC3B,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,GAAW;IACrD,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACtC,MAAM,UAAU,GAAG,MAAM,qBAAqB,CAAC,WAAW,CAAC,CAAC;IAE5D,IAAI,UAAU,EAAE,cAAc,EAAE,CAAC;QAC/B,OAAO,UAAU,CAAC,cAAc,CAAC;IACnC,CAAC;IAED,IAAI,MAAM,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,cAAc,CAAC,CAAC,EAAE,CAAC;QAChE,OAAO,WAAW,CAAC;IACrB,CAAC;IAED,MAAM,IAAI,KAAK,CAAC,+BAA+B,WAAW,EAAE,CAAC,CAAC;AAChE,CAAC"}
@@ -0,0 +1,5 @@
1
+ import type { TScannedVariable } from "./types.js";
2
+ export declare function scanRepositoryVariables(options: {
3
+ repositoryPath: string;
4
+ filePatterns: string[];
5
+ }): Promise<TScannedVariable[]>;
@@ -0,0 +1,31 @@
1
+ import path from "node:path";
2
+ import fs from "fs-extra";
3
+ import fastGlob from "fast-glob";
4
+ const VARIABLE_PATTERN = /\$\{([A-Za-z_][A-Za-z0-9_]*)\}/g;
5
+ export async function scanRepositoryVariables(options) {
6
+ const filePaths = await fastGlob(options.filePatterns, {
7
+ cwd: options.repositoryPath,
8
+ absolute: true,
9
+ onlyFiles: true,
10
+ ignore: ["node_modules/**", "dist/**", ".git/**"],
11
+ });
12
+ const result = [];
13
+ for (const filePath of filePaths) {
14
+ const content = await fs.readFile(filePath, "utf8");
15
+ const occurrencesByVariable = new Map();
16
+ let match;
17
+ while ((match = VARIABLE_PATTERN.exec(content)) !== null) {
18
+ const variableName = match[1];
19
+ occurrencesByVariable.set(variableName, (occurrencesByVariable.get(variableName) ?? 0) + 1);
20
+ }
21
+ for (const [variableName, occurrences] of occurrencesByVariable.entries()) {
22
+ result.push({
23
+ variableName,
24
+ occurrences,
25
+ filePath: path.relative(options.repositoryPath, filePath),
26
+ });
27
+ }
28
+ }
29
+ return result.sort((left, right) => left.variableName.localeCompare(right.variableName));
30
+ }
31
+ //# sourceMappingURL=scanner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scanner.js","sourceRoot":"","sources":["../../src/core/scanner.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,UAAU,CAAC;AAC1B,OAAO,QAAQ,MAAM,WAAW,CAAC;AAGjC,MAAM,gBAAgB,GAAG,iCAAiC,CAAC;AAE3D,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAAC,OAG7C;IACC,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC,YAAY,EAAE;QACrD,GAAG,EAAE,OAAO,CAAC,cAAc;QAC3B,QAAQ,EAAE,IAAI;QACd,SAAS,EAAE,IAAI;QACf,MAAM,EAAE,CAAC,iBAAiB,EAAE,SAAS,EAAE,SAAS,CAAC;KAClD,CAAC,CAAC;IAEH,MAAM,MAAM,GAAuB,EAAE,CAAC;IAEtC,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;QACjC,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QACpD,MAAM,qBAAqB,GAAG,IAAI,GAAG,EAAkB,CAAC;QACxD,IAAI,KAA6B,CAAC;QAElC,OAAO,CAAC,KAAK,GAAG,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;YACzD,MAAM,YAAY,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YAC9B,qBAAqB,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC,qBAAqB,CAAC,GAAG,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAC9F,CAAC;QAED,KAAK,MAAM,CAAC,YAAY,EAAE,WAAW,CAAC,IAAI,qBAAqB,CAAC,OAAO,EAAE,EAAE,CAAC;YAC1E,MAAM,CAAC,IAAI,CAAC;gBACV,YAAY;gBACZ,WAAW;gBACX,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,cAAc,EAAE,QAAQ,CAAC;aAC1D,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,YAAY,CAAC,aAAa,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC;AAC3F,CAAC"}
@@ -0,0 +1,131 @@
1
+ export type TKeyValueMap = Record<string, string>;
2
+ export type TRepositoryInfo = {
3
+ repositoryPath: string;
4
+ };
5
+ export type TScannedVariable = {
6
+ variableName: string;
7
+ filePath: string;
8
+ occurrences: number;
9
+ };
10
+ export type TInstallRepositoryOptions = {
11
+ repositoryPath: string;
12
+ installCommand: string;
13
+ variableValues: Record<string, string>;
14
+ temporaryOverrides: Record<string, string>;
15
+ filePatterns: string[];
16
+ onLog?: (value: string) => void;
17
+ onErrorLog?: (value: string) => void;
18
+ };
19
+ export type TInstallRepositoryResult = {
20
+ stdout: string;
21
+ stderr: string;
22
+ exitCode: number;
23
+ };
24
+ export type TDoctorPackageResult = {
25
+ packageName: string;
26
+ versions: string[];
27
+ occurrences: TPackageOccurrence[];
28
+ hasMultipleVersions: boolean;
29
+ };
30
+ export type TPackageOccurrence = {
31
+ version?: string;
32
+ path?: string;
33
+ };
34
+ export type TLoadedLocationConflict = {
35
+ packageName: string;
36
+ rawMessage: string;
37
+ };
38
+ export type TPackageConflictInspection = {
39
+ packageName: string;
40
+ suggestedVersions: string[];
41
+ doctorResult: TDoctorPackageResult;
42
+ };
43
+ export type TCloudFoundryTarget = {
44
+ apiEndpoint?: string;
45
+ user?: string;
46
+ org?: string;
47
+ space?: string;
48
+ };
49
+ export type TCloudFoundryApp = {
50
+ name: string;
51
+ requestedState?: string;
52
+ processes?: string;
53
+ routes?: string;
54
+ };
55
+ export type TCloudFoundryOrgEntry = {
56
+ apiEndpoint: string;
57
+ region: string;
58
+ org: string;
59
+ spaceCount?: number;
60
+ spaces?: string[];
61
+ updatedAt: string;
62
+ };
63
+ export type TCloudFoundryLoginProfile = {
64
+ apiEndpoint: string;
65
+ org: string;
66
+ space?: string;
67
+ username: string;
68
+ password?: string;
69
+ updatedAt: string;
70
+ };
71
+ export type TCloudFoundryAppsCacheEntry = {
72
+ targetKey: string;
73
+ apps: TCloudFoundryApp[];
74
+ updatedAt: string;
75
+ };
76
+ export type TCloudFoundryCache = {
77
+ loginProfiles: TCloudFoundryLoginProfile[];
78
+ appListsByTarget: Record<string, TCloudFoundryAppsCacheEntry>;
79
+ orgsAcrossRegions: TCloudFoundryOrgEntry[];
80
+ orgsAcrossRegionsUpdatedAt?: string;
81
+ envFileNames: string[];
82
+ selectedApps: string[];
83
+ };
84
+ export type TCdsCache = {
85
+ profiles: string[];
86
+ ports: string[];
87
+ services: string[];
88
+ edmxOutputFileNames: string[];
89
+ models: string[];
90
+ };
91
+ export type TNpmrcPackageEntry = {
92
+ packageId: string;
93
+ packageName: string;
94
+ scope: string;
95
+ host: string;
96
+ updatedAt: string;
97
+ };
98
+ export type TNpmrcTokenEntry = {
99
+ scope: string;
100
+ host: string;
101
+ token: string;
102
+ label: string;
103
+ updatedAt: string;
104
+ };
105
+ export type TNpmrcProjectCache = {
106
+ projectName: string;
107
+ packageIds: string[];
108
+ packages: TNpmrcPackageEntry[];
109
+ };
110
+ export type TNpmrcCache = {
111
+ hosts: string[];
112
+ scopes: string[];
113
+ packageIds: string[];
114
+ packages: TNpmrcPackageEntry[];
115
+ packageIdsByProject: Record<string, TNpmrcProjectCache>;
116
+ tokens: string[];
117
+ tokenEntries: TNpmrcTokenEntry[];
118
+ outputFileNames: string[];
119
+ };
120
+ export type TSimpleMdgCache = {
121
+ variables: Record<string, string[]>;
122
+ overrides: Record<string, string[]>;
123
+ cloudFoundry: TCloudFoundryCache;
124
+ cds: TCdsCache;
125
+ npmrc: TNpmrcCache;
126
+ };
127
+ export type TParsedCloudFoundryEnvironment = {
128
+ VCAP_SERVICES?: unknown;
129
+ VCAP_APPLICATION?: unknown;
130
+ [key: string]: unknown;
131
+ };
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,8 @@
1
+ import { rememberResolvedOverrideVersions } from "./cache.js";
2
+ import type { TLoadedLocationConflict, TPackageConflictInspection } from "./types.js";
3
+ export { rememberResolvedOverrideVersions };
4
+ export declare function parseLoadedLocationConflicts(output: string): TLoadedLocationConflict[];
5
+ export declare function inspectPackageConflicts(options: {
6
+ repositoryPath: string;
7
+ packageNames: string[];
8
+ }): Promise<TPackageConflictInspection[]>;
@@ -0,0 +1,33 @@
1
+ import { doctorPackage } from "./doctor.js";
2
+ import { rememberResolvedOverrideVersions } from "./cache.js";
3
+ export { rememberResolvedOverrideVersions };
4
+ export function parseLoadedLocationConflicts(output) {
5
+ const result = [];
6
+ const lines = output.split(/\r?\n/);
7
+ for (const line of lines) {
8
+ if (!/loaded from different locations/i.test(line)) {
9
+ continue;
10
+ }
11
+ const packageMatch = line.match(/(@[\w.-]+\/[\w.-]+|[\w.-]+)(?=(?:\s|['"`]|,|:))/);
12
+ result.push({
13
+ packageName: packageMatch?.[1] ?? "@sap/cds",
14
+ rawMessage: line.trim(),
15
+ });
16
+ }
17
+ return result;
18
+ }
19
+ export async function inspectPackageConflicts(options) {
20
+ const result = [];
21
+ for (const packageName of options.packageNames) {
22
+ const doctorResult = await doctorPackage({ repositoryPath: options.repositoryPath, packageName });
23
+ if (doctorResult.hasMultipleVersions || doctorResult.occurrences.length > 1) {
24
+ result.push({
25
+ packageName,
26
+ doctorResult,
27
+ suggestedVersions: doctorResult.versions,
28
+ });
29
+ }
30
+ }
31
+ return result;
32
+ }
33
+ //# sourceMappingURL=version-conflict.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version-conflict.js","sourceRoot":"","sources":["../../src/core/version-conflict.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,gCAAgC,EAAE,MAAM,YAAY,CAAC;AAG9D,OAAO,EAAE,gCAAgC,EAAE,CAAC;AAE5C,MAAM,UAAU,4BAA4B,CAAC,MAAc;IACzD,MAAM,MAAM,GAA8B,EAAE,CAAC;IAC7C,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAEpC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,CAAC,kCAAkC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YACnD,SAAS;QACX,CAAC;QAED,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,iDAAiD,CAAC,CAAC;QAEnF,MAAM,CAAC,IAAI,CAAC;YACV,WAAW,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC,IAAI,UAAU;YAC5C,UAAU,EAAE,IAAI,CAAC,IAAI,EAAE;SACxB,CAAC,CAAC;IACL,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAAC,OAG7C;IACC,MAAM,MAAM,GAAiC,EAAE,CAAC;IAEhD,KAAK,MAAM,WAAW,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;QAC/C,MAAM,YAAY,GAAG,MAAM,aAAa,CAAC,EAAE,cAAc,EAAE,OAAO,CAAC,cAAc,EAAE,WAAW,EAAE,CAAC,CAAC;QAElG,IAAI,YAAY,CAAC,mBAAmB,IAAI,YAAY,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC5E,MAAM,CAAC,IAAI,CAAC;gBACV,WAAW;gBACX,YAAY;gBACZ,iBAAiB,EAAE,YAAY,CAAC,QAAQ;aACzC,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export {};