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
package/README.md
ADDED
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
# SimpleMDG Dev Tool
|
|
2
|
+
|
|
3
|
+
CLI helper for SimpleMDG local development.
|
|
4
|
+
|
|
5
|
+
## Install local test
|
|
6
|
+
|
|
7
|
+
```powershell
|
|
8
|
+
npm install
|
|
9
|
+
npm run build
|
|
10
|
+
npm link
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
## NPMRC commands
|
|
14
|
+
|
|
15
|
+
Create `.npmrc`:
|
|
16
|
+
|
|
17
|
+
```powershell
|
|
18
|
+
smdg npmrc create
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
Create with known values:
|
|
22
|
+
|
|
23
|
+
```powershell
|
|
24
|
+
smdg npmrc create --package-id 123 --package-name simplemdg-ui --token xxx
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
Import package IDs with names:
|
|
28
|
+
|
|
29
|
+
```powershell
|
|
30
|
+
smdg npmrc import --ids "simplemdg-ui|123
|
|
31
|
+
simplemdg-core|456"
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
Import from file:
|
|
35
|
+
|
|
36
|
+
```powershell
|
|
37
|
+
smdg npmrc import --file packages.txt
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
File formats supported:
|
|
41
|
+
|
|
42
|
+
```txt
|
|
43
|
+
simplemdg-ui|123
|
|
44
|
+
simplemdg-core,456
|
|
45
|
+
simplemdg-public;789
|
|
46
|
+
123
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
Update cached token for scope/host:
|
|
50
|
+
|
|
51
|
+
```powershell
|
|
52
|
+
smdg npmrc token
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
Or:
|
|
56
|
+
|
|
57
|
+
```powershell
|
|
58
|
+
smdg npmrc token --scope @simplemdg --host gitlab.simplemdg.com --token xxx --label simplemdg-main-token
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
List cache with package names:
|
|
62
|
+
|
|
63
|
+
```powershell
|
|
64
|
+
smdg npmrc list
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
## Existing commands
|
|
68
|
+
|
|
69
|
+
```powershell
|
|
70
|
+
smdg i
|
|
71
|
+
smdg cf login
|
|
72
|
+
smdg cf apps
|
|
73
|
+
smdg cf bind
|
|
74
|
+
smdg cf env
|
|
75
|
+
smdg cds watch
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
## Required external tools
|
|
79
|
+
|
|
80
|
+
Some commands call SAP CAP CLI (`cds`) or Cloud Foundry CLI (`cf`).
|
|
81
|
+
|
|
82
|
+
For CAP commands, the CLI first looks for a project-local `node_modules/.bin/cds`, then falls back to `cds` from PATH. Recommended install:
|
|
83
|
+
|
|
84
|
+
```powershell
|
|
85
|
+
npm install --save-dev @sap/cds-dk
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
Or install globally:
|
|
89
|
+
|
|
90
|
+
```powershell
|
|
91
|
+
npm install -g @sap/cds-dk
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
For Cloud Foundry commands, install Cloud Foundry CLI v8 and make sure `cf version` works in a new terminal. If `cds` or `cf` is missing, `smdg` now prints a clear installation hint instead of failing with a low-level command-not-found error.
|
|
95
|
+
|
|
96
|
+
Check required tools:
|
|
97
|
+
|
|
98
|
+
```powershell
|
|
99
|
+
smdg doctor --tools
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
## Cloud Foundry logs
|
|
103
|
+
|
|
104
|
+
Realtime logs:
|
|
105
|
+
|
|
106
|
+
```powershell
|
|
107
|
+
smdg cf logs
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
Realtime logs for a specific app:
|
|
111
|
+
|
|
112
|
+
```powershell
|
|
113
|
+
smdg cf logs --app simplemdg-srv-config-main
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
Recent logs and exit:
|
|
117
|
+
|
|
118
|
+
```powershell
|
|
119
|
+
smdg cf logs --recent
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
Export recent logs to file:
|
|
123
|
+
|
|
124
|
+
```powershell
|
|
125
|
+
smdg cf logs --recent --out logs/config-main.log
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
Stream realtime logs and append to file until Ctrl+C:
|
|
129
|
+
|
|
130
|
+
```powershell
|
|
131
|
+
smdg cf logs --follow --out logs/config-main-live.log
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
Filter by instance:
|
|
135
|
+
|
|
136
|
+
```powershell
|
|
137
|
+
smdg cf logs --app simplemdg-srv-config-main --instance 0
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
Filter by process:
|
|
141
|
+
|
|
142
|
+
```powershell
|
|
143
|
+
smdg cf logs --app simplemdg-srv-config-main --process WEB
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
## Cloud Foundry org helper
|
|
147
|
+
|
|
148
|
+
List orgs for the current logged-in CF user:
|
|
149
|
+
|
|
150
|
+
```bash
|
|
151
|
+
smdg cf org --list
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
Open an interactive menu with two choices: List orgs or Switch org:
|
|
155
|
+
|
|
156
|
+
```bash
|
|
157
|
+
smdg cf org
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
Switch org and then select space without entering username/password again:
|
|
161
|
+
|
|
162
|
+
```bash
|
|
163
|
+
smdg cf org --switch
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
Switch directly:
|
|
167
|
+
|
|
168
|
+
```bash
|
|
169
|
+
smdg cf org --switch --org <org-name> --space <space-name>
|
|
170
|
+
```
|
|
@@ -0,0 +1,377 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
import fs from "fs-extra";
|
|
3
|
+
import chalk from "chalk";
|
|
4
|
+
import { buildDefaultCompileOutputFileNames, buildDefaultEdmxOutputFileName, resolveDefaultCdsModel, scanCapProfiles, scanCapServices, } from "../core/cds.js";
|
|
5
|
+
import { readCache, rememberCdsEdmxOutputFileName, rememberCdsModel, rememberCdsPort, rememberCdsProfile, rememberCdsService, } from "../core/cache.js";
|
|
6
|
+
import { runCommand, runCommandInherit } from "../core/process.js";
|
|
7
|
+
import { resolveRepositoryPath } from "../core/repository.js";
|
|
8
|
+
import { searchableSelectChoice, searchableSelectOrInput } from "../core/prompts.js";
|
|
9
|
+
const NO_PROFILE_VALUE = "__SMDG_NO_PROFILE__";
|
|
10
|
+
const NO_PORT_VALUE = "__SMDG_NO_PORT__";
|
|
11
|
+
const DEFAULT_PORTS = ["4004", "4005", "4010", "4002", "4003", "4006"];
|
|
12
|
+
const DEFAULT_CDS_COMPILE_FORMATS = ["edmx", "edm", "csn", "json", "sql", "yaml"];
|
|
13
|
+
function uniqueValues(values) {
|
|
14
|
+
return [...new Set(values.map((value) => value?.trim() ?? "").filter(Boolean))];
|
|
15
|
+
}
|
|
16
|
+
function validateRequired(value) {
|
|
17
|
+
return value.trim() ? true : "Value is required";
|
|
18
|
+
}
|
|
19
|
+
function validatePort(value) {
|
|
20
|
+
if (!value.trim()) {
|
|
21
|
+
return "Port is required";
|
|
22
|
+
}
|
|
23
|
+
const port = Number(value);
|
|
24
|
+
if (!Number.isInteger(port) || port < 1 || port > 65535) {
|
|
25
|
+
return "Port must be a number from 1 to 65535";
|
|
26
|
+
}
|
|
27
|
+
return true;
|
|
28
|
+
}
|
|
29
|
+
function isServiceOptionRequired(to) {
|
|
30
|
+
return ["edmx", "edm"].includes(to);
|
|
31
|
+
}
|
|
32
|
+
function normalizeCompileFormat(value) {
|
|
33
|
+
return (value?.trim() || "edmx").replace(/^--to\s+/, "");
|
|
34
|
+
}
|
|
35
|
+
async function resolveProfile(options) {
|
|
36
|
+
if (options.skipProfile) {
|
|
37
|
+
return undefined;
|
|
38
|
+
}
|
|
39
|
+
if (options.profile?.trim()) {
|
|
40
|
+
await rememberCdsProfile(options.profile.trim());
|
|
41
|
+
return options.profile.trim();
|
|
42
|
+
}
|
|
43
|
+
const cache = await readCache();
|
|
44
|
+
const scannedProfiles = await scanCapProfiles(options.repositoryPath);
|
|
45
|
+
const profiles = uniqueValues([...cache.cds.profiles, ...scannedProfiles]);
|
|
46
|
+
const selectedProfile = await searchableSelectChoice({
|
|
47
|
+
message: "Select CAP profile",
|
|
48
|
+
choices: [
|
|
49
|
+
...profiles.map((profile) => ({ title: profile, value: profile })),
|
|
50
|
+
{ title: "Run without --profile", value: NO_PROFILE_VALUE },
|
|
51
|
+
],
|
|
52
|
+
validateCustomValue: validateRequired,
|
|
53
|
+
customValueTitle: (value) => `Use typed CAP profile: ${value}`,
|
|
54
|
+
});
|
|
55
|
+
if (selectedProfile === NO_PROFILE_VALUE) {
|
|
56
|
+
return undefined;
|
|
57
|
+
}
|
|
58
|
+
await rememberCdsProfile(selectedProfile);
|
|
59
|
+
return selectedProfile;
|
|
60
|
+
}
|
|
61
|
+
async function resolvePort(options) {
|
|
62
|
+
if (options.skipPort) {
|
|
63
|
+
return undefined;
|
|
64
|
+
}
|
|
65
|
+
if (options.port?.trim()) {
|
|
66
|
+
const validationResult = validatePort(options.port.trim());
|
|
67
|
+
if (validationResult !== true) {
|
|
68
|
+
throw new Error(validationResult);
|
|
69
|
+
}
|
|
70
|
+
await rememberCdsPort(options.port.trim());
|
|
71
|
+
return options.port.trim();
|
|
72
|
+
}
|
|
73
|
+
const cache = await readCache();
|
|
74
|
+
const ports = uniqueValues([...cache.cds.ports, ...DEFAULT_PORTS]);
|
|
75
|
+
const selectedPort = await searchableSelectChoice({
|
|
76
|
+
message: "Select CAP port",
|
|
77
|
+
choices: [
|
|
78
|
+
...ports.map((port) => ({ title: port, value: port })),
|
|
79
|
+
{ title: "Run without --port", value: NO_PORT_VALUE },
|
|
80
|
+
],
|
|
81
|
+
validateCustomValue: validatePort,
|
|
82
|
+
customValueTitle: (value) => `Use typed port: ${value}`,
|
|
83
|
+
});
|
|
84
|
+
if (selectedPort === NO_PORT_VALUE) {
|
|
85
|
+
return undefined;
|
|
86
|
+
}
|
|
87
|
+
await rememberCdsPort(selectedPort);
|
|
88
|
+
return selectedPort;
|
|
89
|
+
}
|
|
90
|
+
async function resolveCompileFormat(options) {
|
|
91
|
+
if (options.to?.trim()) {
|
|
92
|
+
return normalizeCompileFormat(options.to);
|
|
93
|
+
}
|
|
94
|
+
return searchableSelectChoice({
|
|
95
|
+
message: "Select cds compile --to format",
|
|
96
|
+
choices: DEFAULT_CDS_COMPILE_FORMATS.map((format) => ({ title: format, value: format })),
|
|
97
|
+
validateCustomValue: validateRequired,
|
|
98
|
+
customValueTitle: (value) => `Use typed --to format: ${value}`,
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
async function resolveCompileService(options) {
|
|
102
|
+
const scannedServices = await scanCapServices(options.repositoryPath);
|
|
103
|
+
if (options.service?.trim()) {
|
|
104
|
+
const inputServiceName = options.service.trim();
|
|
105
|
+
const serviceDefinition = scannedServices.find((item) => {
|
|
106
|
+
return item.serviceName === inputServiceName || item.fullServiceName === inputServiceName;
|
|
107
|
+
});
|
|
108
|
+
await rememberCdsService(inputServiceName);
|
|
109
|
+
return {
|
|
110
|
+
serviceName: serviceDefinition?.fullServiceName ?? inputServiceName,
|
|
111
|
+
serviceDefinition,
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
if (!scannedServices.length) {
|
|
115
|
+
if (options.required) {
|
|
116
|
+
throw new Error("No CAP service was found in srv/app/db. Please pass --service manually.");
|
|
117
|
+
}
|
|
118
|
+
return {};
|
|
119
|
+
}
|
|
120
|
+
const choices = scannedServices.map((serviceDefinition) => {
|
|
121
|
+
const titleServiceName = serviceDefinition.fullServiceName === serviceDefinition.serviceName
|
|
122
|
+
? serviceDefinition.serviceName
|
|
123
|
+
: `${serviceDefinition.fullServiceName} (${serviceDefinition.serviceName})`;
|
|
124
|
+
return {
|
|
125
|
+
title: `${titleServiceName} (${serviceDefinition.relativeFilePath})`,
|
|
126
|
+
value: serviceDefinition.fullServiceName,
|
|
127
|
+
description: serviceDefinition.relativeFilePath,
|
|
128
|
+
};
|
|
129
|
+
});
|
|
130
|
+
const selectedServiceName = await searchableSelectChoice({
|
|
131
|
+
message: "Select CAP service",
|
|
132
|
+
choices,
|
|
133
|
+
validateCustomValue: validateRequired,
|
|
134
|
+
customValueTitle: (value) => `Use typed service: ${value}`,
|
|
135
|
+
limit: 20,
|
|
136
|
+
});
|
|
137
|
+
const serviceDefinition = scannedServices.find((item) => item.fullServiceName === selectedServiceName || item.serviceName === selectedServiceName);
|
|
138
|
+
const serviceName = serviceDefinition?.fullServiceName ?? selectedServiceName;
|
|
139
|
+
await rememberCdsService(serviceName);
|
|
140
|
+
return {
|
|
141
|
+
serviceName,
|
|
142
|
+
serviceDefinition,
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
async function resolveCompileModel(options) {
|
|
146
|
+
if (options.model?.trim()) {
|
|
147
|
+
await rememberCdsModel(options.model.trim());
|
|
148
|
+
return options.model.trim();
|
|
149
|
+
}
|
|
150
|
+
const cache = await readCache();
|
|
151
|
+
const defaultModel = options.serviceDefinition?.relativeFilePath ?? await resolveDefaultCdsModel(options.repositoryPath);
|
|
152
|
+
const fallbackModel = await resolveDefaultCdsModel(options.repositoryPath);
|
|
153
|
+
const model = await searchableSelectOrInput({
|
|
154
|
+
message: "Select CDS model/path",
|
|
155
|
+
values: uniqueValues([defaultModel, fallbackModel, ".", ...cache.cds.models]),
|
|
156
|
+
initialValue: defaultModel,
|
|
157
|
+
validate: validateRequired,
|
|
158
|
+
customValueTitle: (value) => `Use typed model/path: ${value}`,
|
|
159
|
+
});
|
|
160
|
+
await rememberCdsModel(model);
|
|
161
|
+
return model;
|
|
162
|
+
}
|
|
163
|
+
async function resolveCompileOutputFile(options) {
|
|
164
|
+
if (options.out?.trim()) {
|
|
165
|
+
await rememberCdsEdmxOutputFileName(options.out.trim());
|
|
166
|
+
return options.out.trim();
|
|
167
|
+
}
|
|
168
|
+
const cache = await readCache();
|
|
169
|
+
const defaultOutputFiles = await buildDefaultCompileOutputFileNames({
|
|
170
|
+
repositoryPath: options.repositoryPath,
|
|
171
|
+
serviceName: options.serviceName,
|
|
172
|
+
to: options.to,
|
|
173
|
+
});
|
|
174
|
+
const outputFile = await searchableSelectOrInput({
|
|
175
|
+
message: "Select output file",
|
|
176
|
+
values: uniqueValues([...defaultOutputFiles, ...cache.cds.edmxOutputFileNames]),
|
|
177
|
+
initialValue: defaultOutputFiles[0] ?? "metadata.xml",
|
|
178
|
+
validate: validateRequired,
|
|
179
|
+
customValueTitle: (value) => `Use typed output file: ${value}`,
|
|
180
|
+
});
|
|
181
|
+
await rememberCdsEdmxOutputFileName(outputFile);
|
|
182
|
+
return outputFile;
|
|
183
|
+
}
|
|
184
|
+
async function compileCds(options) {
|
|
185
|
+
const args = ["compile", options.model, "--to", options.to];
|
|
186
|
+
if (options.serviceName) {
|
|
187
|
+
args.push("--service", options.serviceName);
|
|
188
|
+
}
|
|
189
|
+
if (options.profile) {
|
|
190
|
+
args.push("--profile", options.profile);
|
|
191
|
+
}
|
|
192
|
+
console.log(chalk.gray(`Running: cds ${args.join(" ")}`));
|
|
193
|
+
console.log(chalk.gray(`CWD: ${options.repositoryPath}`));
|
|
194
|
+
if (options.outputFile && options.to === "edmx") {
|
|
195
|
+
console.log(chalk.gray(`Equivalent PowerShell: cds ${args.join(" ")} | Out-File -Encoding utf8 ${options.outputFile}`));
|
|
196
|
+
}
|
|
197
|
+
const result = await runCommand("cds", args, { cwd: options.repositoryPath, reject: false });
|
|
198
|
+
if (result.exitCode === 127) {
|
|
199
|
+
throw new Error(result.stderr);
|
|
200
|
+
}
|
|
201
|
+
if (result.stderr.trim()) {
|
|
202
|
+
console.error(result.stderr);
|
|
203
|
+
}
|
|
204
|
+
if (result.exitCode !== 0) {
|
|
205
|
+
if (options.serviceName) {
|
|
206
|
+
const services = await scanCapServices(options.repositoryPath);
|
|
207
|
+
const serviceList = services.map((service) => `- ${service.fullServiceName} (${service.relativeFilePath})`).join("\n");
|
|
208
|
+
if (serviceList) {
|
|
209
|
+
console.log(chalk.yellow("Available services detected in this repository:"));
|
|
210
|
+
console.log(serviceList);
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
throw new Error(`cds compile failed with exit code ${result.exitCode}`);
|
|
214
|
+
}
|
|
215
|
+
if (options.print) {
|
|
216
|
+
console.log(result.stdout);
|
|
217
|
+
return;
|
|
218
|
+
}
|
|
219
|
+
if (!options.outputFile) {
|
|
220
|
+
throw new Error("Output file is required");
|
|
221
|
+
}
|
|
222
|
+
const outputPath = path.isAbsolute(options.outputFile)
|
|
223
|
+
? options.outputFile
|
|
224
|
+
: path.join(options.repositoryPath, options.outputFile);
|
|
225
|
+
await fs.ensureDir(path.dirname(outputPath));
|
|
226
|
+
await fs.writeFile(outputPath, result.stdout, { encoding: "utf8" });
|
|
227
|
+
console.log(chalk.green(`Metadata exported with utf8 encoding: ${outputPath}`));
|
|
228
|
+
}
|
|
229
|
+
async function runCdsWatchCommand(extraArguments, options) {
|
|
230
|
+
const repositoryPath = await resolveRepositoryPath(options.cwd ?? process.cwd());
|
|
231
|
+
const profile = await resolveProfile({
|
|
232
|
+
repositoryPath,
|
|
233
|
+
profile: options.profile,
|
|
234
|
+
skipProfile: options.skipProfile,
|
|
235
|
+
});
|
|
236
|
+
const port = await resolvePort({
|
|
237
|
+
port: options.port,
|
|
238
|
+
skipPort: options.skipPort,
|
|
239
|
+
});
|
|
240
|
+
const args = ["watch"];
|
|
241
|
+
if (profile) {
|
|
242
|
+
args.push("--profile", profile);
|
|
243
|
+
}
|
|
244
|
+
if (port) {
|
|
245
|
+
args.push("--port", port);
|
|
246
|
+
}
|
|
247
|
+
args.push(...extraArguments);
|
|
248
|
+
console.log(chalk.gray(`Running: cds ${args.join(" ")}`));
|
|
249
|
+
console.log(chalk.gray(`CWD: ${repositoryPath}`));
|
|
250
|
+
console.log("");
|
|
251
|
+
const exitCode = await runCommandInherit("cds", args, { cwd: repositoryPath });
|
|
252
|
+
process.exitCode = exitCode;
|
|
253
|
+
}
|
|
254
|
+
async function runCdsProfilesCommand(options) {
|
|
255
|
+
const repositoryPath = await resolveRepositoryPath(options.cwd ?? process.cwd());
|
|
256
|
+
const profiles = await scanCapProfiles(repositoryPath);
|
|
257
|
+
for (const profile of profiles) {
|
|
258
|
+
console.log(profile);
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
async function runCdsServicesCommand(options) {
|
|
262
|
+
const repositoryPath = await resolveRepositoryPath(options.cwd ?? process.cwd());
|
|
263
|
+
const services = await scanCapServices(repositoryPath);
|
|
264
|
+
if (!services.length) {
|
|
265
|
+
console.log(chalk.yellow("No CAP services found."));
|
|
266
|
+
return;
|
|
267
|
+
}
|
|
268
|
+
for (const service of services) {
|
|
269
|
+
console.log(`${service.fullServiceName}\t${service.relativeFilePath}`);
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
async function runCdsCompileCommand(options) {
|
|
273
|
+
const repositoryPath = await resolveRepositoryPath(options.cwd ?? process.cwd());
|
|
274
|
+
const to = await resolveCompileFormat({ to: options.to });
|
|
275
|
+
const service = await resolveCompileService({
|
|
276
|
+
repositoryPath,
|
|
277
|
+
service: options.service,
|
|
278
|
+
required: isServiceOptionRequired(to),
|
|
279
|
+
});
|
|
280
|
+
const model = await resolveCompileModel({
|
|
281
|
+
repositoryPath,
|
|
282
|
+
model: options.model,
|
|
283
|
+
serviceDefinition: service.serviceDefinition,
|
|
284
|
+
});
|
|
285
|
+
const profile = options.profile?.trim();
|
|
286
|
+
if (profile) {
|
|
287
|
+
await rememberCdsProfile(profile);
|
|
288
|
+
}
|
|
289
|
+
if (options.all) {
|
|
290
|
+
const services = await scanCapServices(repositoryPath);
|
|
291
|
+
if (!services.length) {
|
|
292
|
+
throw new Error("No CAP services found to export");
|
|
293
|
+
}
|
|
294
|
+
const outputDirectory = options.out?.trim() || "metadata";
|
|
295
|
+
await rememberCdsEdmxOutputFileName(outputDirectory);
|
|
296
|
+
for (const serviceDefinition of services) {
|
|
297
|
+
const outputFile = path.join(outputDirectory, buildDefaultEdmxOutputFileName(serviceDefinition.fullServiceName));
|
|
298
|
+
await rememberCdsService(serviceDefinition.fullServiceName);
|
|
299
|
+
await compileCds({
|
|
300
|
+
repositoryPath,
|
|
301
|
+
model: serviceDefinition.relativeFilePath,
|
|
302
|
+
to,
|
|
303
|
+
serviceName: serviceDefinition.fullServiceName,
|
|
304
|
+
outputFile,
|
|
305
|
+
profile,
|
|
306
|
+
print: false,
|
|
307
|
+
});
|
|
308
|
+
}
|
|
309
|
+
return;
|
|
310
|
+
}
|
|
311
|
+
const outputFile = options.print
|
|
312
|
+
? undefined
|
|
313
|
+
: await resolveCompileOutputFile({
|
|
314
|
+
repositoryPath,
|
|
315
|
+
serviceName: service.serviceName,
|
|
316
|
+
to,
|
|
317
|
+
out: options.out,
|
|
318
|
+
});
|
|
319
|
+
await compileCds({
|
|
320
|
+
repositoryPath,
|
|
321
|
+
model,
|
|
322
|
+
to,
|
|
323
|
+
serviceName: service.serviceName,
|
|
324
|
+
outputFile,
|
|
325
|
+
profile,
|
|
326
|
+
print: options.print,
|
|
327
|
+
});
|
|
328
|
+
}
|
|
329
|
+
export function registerCdsCommands(program) {
|
|
330
|
+
const cdsCommand = program.command("cds").description("SAP CAP helper commands for SimpleMDG");
|
|
331
|
+
cdsCommand
|
|
332
|
+
.command("watch [extraArguments...]")
|
|
333
|
+
.description("Run cds watch with searchable profile and optional port")
|
|
334
|
+
.option("--cwd <path>", "Repository path", process.cwd())
|
|
335
|
+
.option("--profile <profile>", "CAP profile, for example hybrid")
|
|
336
|
+
.option("--port <port>", "Port, for example 4005")
|
|
337
|
+
.option("--skip-profile", "Run without --profile")
|
|
338
|
+
.option("--skip-port", "Run without --port")
|
|
339
|
+
.allowUnknownOption(true)
|
|
340
|
+
.action(runCdsWatchCommand);
|
|
341
|
+
cdsCommand
|
|
342
|
+
.command("profiles")
|
|
343
|
+
.description("Scan available CAP profiles in the current repository")
|
|
344
|
+
.option("--cwd <path>", "Repository path", process.cwd())
|
|
345
|
+
.action(runCdsProfilesCommand);
|
|
346
|
+
cdsCommand
|
|
347
|
+
.command("services")
|
|
348
|
+
.description("Scan available CAP services in the current repository")
|
|
349
|
+
.option("--cwd <path>", "Repository path", process.cwd())
|
|
350
|
+
.action(runCdsServicesCommand);
|
|
351
|
+
cdsCommand
|
|
352
|
+
.command("compline")
|
|
353
|
+
.alias("compile")
|
|
354
|
+
.description("Run cds compile and export result with utf8 encoding")
|
|
355
|
+
.option("--cwd <path>", "Repository path", process.cwd())
|
|
356
|
+
.option("--model <model>", "CDS model/path, for example srv, . or srv/main-service.cds")
|
|
357
|
+
.option("--service <service>", "CAP service name to export")
|
|
358
|
+
.option("--to <format>", "cds compile output format, default edmx", "edmx")
|
|
359
|
+
.option("--out <fileOrDirectory>", "Output file, or output directory when --all is used")
|
|
360
|
+
.option("--profile <profile>", "CAP profile used by cds compile")
|
|
361
|
+
.option("--all", "Export all scanned services to a directory")
|
|
362
|
+
.option("--print", "Print output to terminal instead of writing a file")
|
|
363
|
+
.action(runCdsCompileCommand);
|
|
364
|
+
cdsCommand
|
|
365
|
+
.command("edmx")
|
|
366
|
+
.alias("metadata")
|
|
367
|
+
.description("Export CAP service metadata EDMX XML. Alias of smdg cds compline --to edmx")
|
|
368
|
+
.option("--cwd <path>", "Repository path", process.cwd())
|
|
369
|
+
.option("--model <model>", "CDS model/path, for example srv, . or srv/main-service.cds")
|
|
370
|
+
.option("--service <service>", "CAP service name to export")
|
|
371
|
+
.option("--out <fileOrDirectory>", "Output XML file, or output directory when --all is used")
|
|
372
|
+
.option("--profile <profile>", "CAP profile used by cds compile")
|
|
373
|
+
.option("--all", "Export all scanned services to a directory")
|
|
374
|
+
.option("--print", "Print EDMX to terminal instead of writing a file")
|
|
375
|
+
.action((options) => runCdsCompileCommand({ ...options, to: "edmx" }));
|
|
376
|
+
}
|
|
377
|
+
//# sourceMappingURL=cds.command.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cds.command.js","sourceRoot":"","sources":["../../src/commands/cds.command.ts"],"names":[],"mappings":"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"}
|