@sang2x/captools 0.1.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 (40) hide show
  1. package/dist/commands/hana.d.ts +2 -0
  2. package/dist/commands/hana.js +43 -0
  3. package/dist/commands/hana.js.map +1 -0
  4. package/dist/commands/install.d.ts +3 -0
  5. package/dist/commands/install.js +131 -0
  6. package/dist/commands/install.js.map +1 -0
  7. package/dist/commands/local.d.ts +3 -0
  8. package/dist/commands/local.js +167 -0
  9. package/dist/commands/local.js.map +1 -0
  10. package/dist/commands/npmrc.d.ts +3 -0
  11. package/dist/commands/npmrc.js +142 -0
  12. package/dist/commands/npmrc.js.map +1 -0
  13. package/dist/commands/run-local.d.ts +2 -0
  14. package/dist/commands/run-local.js +20 -0
  15. package/dist/commands/run-local.js.map +1 -0
  16. package/dist/constants.d.ts +4 -0
  17. package/dist/constants.js +8 -0
  18. package/dist/constants.js.map +1 -0
  19. package/dist/index.d.ts +2 -0
  20. package/dist/index.js +21 -0
  21. package/dist/index.js.map +1 -0
  22. package/dist/utils/cf.d.ts +3 -0
  23. package/dist/utils/cf.js +33 -0
  24. package/dist/utils/cf.js.map +1 -0
  25. package/dist/utils/confirm.d.ts +1 -0
  26. package/dist/utils/confirm.js +17 -0
  27. package/dist/utils/confirm.js.map +1 -0
  28. package/dist/utils/credentials.d.ts +7 -0
  29. package/dist/utils/credentials.js +66 -0
  30. package/dist/utils/credentials.js.map +1 -0
  31. package/dist/utils/graph.d.ts +6 -0
  32. package/dist/utils/graph.js +42 -0
  33. package/dist/utils/graph.js.map +1 -0
  34. package/dist/utils/msAuth.d.ts +9 -0
  35. package/dist/utils/msAuth.js +191 -0
  36. package/dist/utils/msAuth.js.map +1 -0
  37. package/dist/utils/projects.d.ts +18 -0
  38. package/dist/utils/projects.js +74 -0
  39. package/dist/utils/projects.js.map +1 -0
  40. package/package.json +32 -0
@@ -0,0 +1,2 @@
1
+ import { Command } from 'commander';
2
+ export declare const hanaCommand: Command;
@@ -0,0 +1,43 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.hanaCommand = void 0;
7
+ const commander_1 = require("commander");
8
+ const prompts_1 = __importDefault(require("prompts"));
9
+ const projects_1 = require("../utils/projects");
10
+ function buildHanaUrl(subaccount, region) {
11
+ return `https://${subaccount}.hana-tooling.ingress.orchestration.prod-${region}.hanacloud.ondemand.com/hrtt/sap/hana/cst/catalog/cockpit-index.html`;
12
+ }
13
+ exports.hanaCommand = new commander_1.Command('hana')
14
+ .description('Get HANA Cloud cockpit URL for a project environment')
15
+ .action(async () => {
16
+ const projects = (0, projects_1.loadProjects)().filter((p) => p.environments && p.environments.length > 0);
17
+ if (projects.length === 0) {
18
+ console.error('No projects with environments found. Run: captools npmrc add');
19
+ process.exit(1);
20
+ }
21
+ const { project } = await (0, prompts_1.default)({
22
+ type: 'autocomplete',
23
+ name: 'project',
24
+ message: 'Select project (type to search):',
25
+ choices: projects.map((p) => ({ title: p.name, value: p })),
26
+ suggest: (input, choices) => Promise.resolve(choices.filter((c) => c.title.toLowerCase().includes(input.toLowerCase()))),
27
+ }, { onCancel: () => process.exit(0) });
28
+ const { environment } = await (0, prompts_1.default)({
29
+ type: 'select',
30
+ name: 'environment',
31
+ message: 'Select environment:',
32
+ choices: (project.environments ?? []).map((e) => ({
33
+ title: `${e.env}${e.region ? ` (${e.region})` : ''}`,
34
+ value: e,
35
+ })),
36
+ }, { onCancel: () => process.exit(0) });
37
+ if (!environment.subaccount || !environment.region) {
38
+ console.error('Missing subaccount or region for this environment.');
39
+ process.exit(1);
40
+ }
41
+ console.log(buildHanaUrl(environment.subaccount, environment.region));
42
+ });
43
+ //# sourceMappingURL=hana.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hana.js","sourceRoot":"","sources":["../../src/commands/hana.ts"],"names":[],"mappings":";;;;;;AAAA,yCAAoC;AACpC,sDAA8B;AAC9B,gDAAiF;AAEjF,SAAS,YAAY,CAAC,UAAkB,EAAE,MAAc;IACtD,OAAO,WAAW,UAAU,4CAA4C,MAAM,sEAAsE,CAAC;AACvJ,CAAC;AAEY,QAAA,WAAW,GAAG,IAAI,mBAAO,CAAC,MAAM,CAAC;KAC3C,WAAW,CAAC,sDAAsD,CAAC;KACnE,MAAM,CAAC,KAAK,IAAI,EAAE;IACjB,MAAM,QAAQ,GAAG,IAAA,uBAAY,GAAE,CAAC,MAAM,CACpC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,YAAY,IAAI,CAAC,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CACnD,CAAC;IAEF,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO,CAAC,KAAK,CAAC,8DAA8D,CAAC,CAAC;QAC9E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,IAAA,iBAAO,EAC/B;QACE,IAAI,EAAE,cAAc;QACpB,IAAI,EAAE,SAAS;QACf,OAAO,EAAE,kCAAkC;QAC3C,OAAO,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;QAC3D,OAAO,EAAE,CAAC,KAAa,EAAE,OAAc,EAAE,EAAE,CACzC,OAAO,CAAC,OAAO,CACb,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC,CAC3E;KACJ,EACD,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CACZ,CAAC;IAE1B,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,IAAA,iBAAO,EACnC;QACE,IAAI,EAAE,QAAQ;QACd,IAAI,EAAE,aAAa;QACnB,OAAO,EAAE,qBAAqB;QAC9B,OAAO,EAAE,CAAC,OAAO,CAAC,YAAY,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAChD,KAAK,EAAE,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;YACpD,KAAK,EAAE,CAAC;SACT,CAAC,CAAC;KACJ,EACD,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CACJ,CAAC;IAElC,IAAI,CAAC,WAAW,CAAC,UAAU,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,CAAC;QACnD,OAAO,CAAC,KAAK,CAAC,oDAAoD,CAAC,CAAC;QACpE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,WAAW,CAAC,UAAU,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC;AACxE,CAAC,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function runInstallAction(skipBuild?: boolean): Promise<void>;
3
+ export declare const installCommand: Command;
@@ -0,0 +1,131 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.installCommand = void 0;
40
+ exports.runInstallAction = runInstallAction;
41
+ const commander_1 = require("commander");
42
+ const prompts_1 = __importDefault(require("prompts"));
43
+ const fs = __importStar(require("fs"));
44
+ const path = __importStar(require("path"));
45
+ const child_process_1 = require("child_process");
46
+ const ENV_CHOICES = ['dev', 'staging', 'uat', 'qas', 'sandbox', 'prd', 'main'];
47
+ const isWindows = process.platform === 'win32';
48
+ function npmRun(args, cwd) {
49
+ const result = (0, child_process_1.spawnSync)('npm', args, { stdio: 'inherit', cwd, shell: isWindows });
50
+ if (result.status !== 0)
51
+ process.exit(result.status ?? 1);
52
+ }
53
+ function applyPackageJsonMutations(pkg, envName) {
54
+ for (const depsKey of ['dependencies', 'devDependencies']) {
55
+ if (pkg[depsKey]) {
56
+ for (const pkgName of Object.keys(pkg[depsKey])) {
57
+ if (pkgName.startsWith('@simplemdg/')) {
58
+ pkg[depsKey][pkgName] = envName;
59
+ }
60
+ }
61
+ }
62
+ }
63
+ const CDS_TYPER_KEY = '@cap-js/cds-typer';
64
+ const CDS_TYPER_VERSION = '^0.38.0';
65
+ if (pkg.dependencies?.[CDS_TYPER_KEY] !== undefined) {
66
+ pkg.dependencies[CDS_TYPER_KEY] = CDS_TYPER_VERSION;
67
+ }
68
+ if (pkg.devDependencies?.[CDS_TYPER_KEY] !== undefined) {
69
+ pkg.devDependencies[CDS_TYPER_KEY] = CDS_TYPER_VERSION;
70
+ }
71
+ pkg.overrides = {
72
+ ...(pkg.overrides ?? {}),
73
+ '@sap/cds': '9.8.3',
74
+ };
75
+ return pkg;
76
+ }
77
+ async function runInstallAction(skipBuild = false) {
78
+ const cwd = process.cwd();
79
+ const pkgPath = path.join(cwd, 'package.json');
80
+ if (!fs.existsSync(pkgPath)) {
81
+ console.error('No package.json found in current directory.');
82
+ process.exit(1);
83
+ }
84
+ const rawJson = fs.readFileSync(pkgPath, 'utf8');
85
+ const { envName } = await (0, prompts_1.default)({
86
+ type: 'autocomplete',
87
+ name: 'envName',
88
+ message: 'Select or enter environment name:',
89
+ choices: ENV_CHOICES.map((e) => ({ title: e, value: e })),
90
+ suggest: (input, choices) => {
91
+ const filtered = choices.filter((c) => c.title.toLowerCase().includes(input.toLowerCase()));
92
+ if (input && !choices.some((c) => c.value === input)) {
93
+ filtered.unshift({ title: input, value: input });
94
+ }
95
+ return Promise.resolve(filtered);
96
+ },
97
+ }, { onCancel: () => process.exit(0) });
98
+ if (!envName) {
99
+ console.error('No environment name selected.');
100
+ process.exit(1);
101
+ }
102
+ const DIRS_TO_CLEAN = ['node_modules', 'gen', '@cds-models'];
103
+ for (const dir of DIRS_TO_CLEAN) {
104
+ const target = path.join(cwd, dir);
105
+ if (fs.existsSync(target)) {
106
+ console.log(`Removing ${dir}...`);
107
+ fs.rmSync(target, { recursive: true, force: true });
108
+ }
109
+ }
110
+ const pkg = JSON.parse(rawJson);
111
+ applyPackageJsonMutations(pkg, envName);
112
+ fs.writeFileSync(pkgPath, JSON.stringify(pkg, null, 2) + '\n', 'utf8');
113
+ console.log('package.json updated.');
114
+ console.log('Running npm i...');
115
+ npmRun(['i'], cwd);
116
+ if (!skipBuild) {
117
+ const scripts = pkg.scripts ?? {};
118
+ if (scripts['build']) {
119
+ console.log('Running npm run build...');
120
+ npmRun(['run', 'build'], cwd);
121
+ }
122
+ if (scripts['build:models']) {
123
+ console.log('Running npm run build:models...');
124
+ npmRun(['run', 'build:models'], cwd);
125
+ }
126
+ }
127
+ }
128
+ exports.installCommand = new commander_1.Command('install')
129
+ .description('Prepare and install a SimpleMDG CAP project')
130
+ .action(runInstallAction);
131
+ //# sourceMappingURL=install.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"install.js","sourceRoot":"","sources":["../../src/commands/install.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function runBindLocalAction(): Promise<void>;
3
+ export declare const localCommand: Command;
@@ -0,0 +1,167 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.localCommand = void 0;
40
+ exports.runBindLocalAction = runBindLocalAction;
41
+ const commander_1 = require("commander");
42
+ const prompts_1 = __importDefault(require("prompts"));
43
+ const child_process_1 = require("child_process");
44
+ const fs = __importStar(require("fs"));
45
+ const credentials_1 = require("../utils/credentials");
46
+ const cf_1 = require("../utils/cf");
47
+ const confirm_1 = require("../utils/confirm");
48
+ function checkCli(name, hint) {
49
+ try {
50
+ (0, child_process_1.execSync)(`${name} --version`, { stdio: 'ignore' });
51
+ }
52
+ catch {
53
+ console.error(`${name} CLI not found. ${hint}`);
54
+ process.exit(1);
55
+ }
56
+ }
57
+ const isWindows = process.platform === 'win32';
58
+ function run(cmd, args) {
59
+ const result = (0, child_process_1.spawnSync)(cmd, args, { stdio: 'inherit', shell: isWindows });
60
+ if (result.status !== 0)
61
+ process.exit(result.status ?? 1);
62
+ }
63
+ async function resolveCredentials() {
64
+ const cached = (0, credentials_1.loadCredentials)();
65
+ if (cached) {
66
+ const useCached = await (0, confirm_1.confirm)(`Use saved credentials for ${cached.username}?`);
67
+ if (useCached)
68
+ return cached;
69
+ }
70
+ const input = await (0, prompts_1.default)([
71
+ { type: 'text', name: 'username', message: 'CF Username (email):' },
72
+ { type: 'password', name: 'password', message: 'CF Password:' },
73
+ ], { onCancel: () => process.exit(0) });
74
+ const save = await (0, confirm_1.confirm)('Save credentials for future use? (stored in ~/.captools/credentials.json)');
75
+ if (save) {
76
+ (0, credentials_1.saveCredentials)({ username: input.username, password: input.password });
77
+ console.log('Credentials saved to ~/.captools/credentials.json');
78
+ }
79
+ return { username: input.username, password: input.password };
80
+ }
81
+ async function runBindLocalAction() {
82
+ checkCli('cf', 'Install from: https://docs.cloudfoundry.org/cf-cli/install-go-cli.html');
83
+ checkCli('cds', 'Install: npm i -g @sap/cds-dk');
84
+ const { username, password } = await resolveCredentials();
85
+ const { region } = await (0, prompts_1.default)({ type: 'text', name: 'region', message: 'CF Region (e.g. ap10, eu10, br10):' }, { onCancel: () => process.exit(0) });
86
+ const apiEndpoint = `https://api.cf.${region}.hana.ondemand.com`;
87
+ console.log(`\nUsing API endpoint: ${apiEndpoint}`);
88
+ console.log('Authenticating...');
89
+ (0, cf_1.cfRun)(['api', apiEndpoint]);
90
+ (0, cf_1.cfRun)(['auth', username, password]);
91
+ console.log('\nFetching orgs...');
92
+ const orgs = (0, cf_1.cfCaptureList)(['orgs']);
93
+ if (orgs.length === 0) {
94
+ console.error('No orgs found. Check your credentials and region.');
95
+ process.exit(1);
96
+ }
97
+ const { org } = await (0, prompts_1.default)({
98
+ type: 'select',
99
+ name: 'org',
100
+ message: 'Select CF Org:',
101
+ choices: orgs.map((o) => ({ title: o, value: o })),
102
+ }, { onCancel: () => process.exit(0) });
103
+ (0, cf_1.cfRun)(['target', '-o', org]);
104
+ console.log('\nFetching spaces...');
105
+ const spaces = (0, cf_1.cfCaptureList)(['spaces']);
106
+ if (spaces.length === 0) {
107
+ console.error(`No spaces found in org '${org}'.`);
108
+ process.exit(1);
109
+ }
110
+ const { space } = await (0, prompts_1.default)({
111
+ type: 'select',
112
+ name: 'space',
113
+ message: 'Select CF Space:',
114
+ choices: spaces.map((s) => ({ title: s, value: s })),
115
+ }, { onCancel: () => process.exit(0) });
116
+ (0, cf_1.cfRun)(['target', '-s', space]);
117
+ console.log('\nCurrent target:');
118
+ (0, cf_1.cfRun)(['target']);
119
+ const showApps = await (0, confirm_1.confirm)(`List all apps in space '${space}'?`);
120
+ if (showApps) {
121
+ (0, cf_1.cfRun)(['apps']);
122
+ }
123
+ const { appName } = await (0, prompts_1.default)({ type: 'text', name: 'appName', message: 'App name to bind (e.g. simplemdg-srv-background):' }, { onCancel: () => process.exit(0) });
124
+ console.log(`\nBinding local service to '${appName}'...`);
125
+ run('cds', ['bind', '--to-app-services', appName]);
126
+ console.log('\nHybrid binding result:');
127
+ run('cds', ['env', 'requires', '--profile', 'hybrid']);
128
+ console.log(`\nFetching environment from '${appName}'...`);
129
+ const appGuid = (0, cf_1.cfCapture)(['app', appName, '--guid']);
130
+ const rawEnv = JSON.parse((0, cf_1.cfCapture)(['curl', `/v3/apps/${appGuid}/env`]));
131
+ const vcapServices = rawEnv?.system_env_json?.VCAP_SERVICES ?? {};
132
+ if (Object.keys(vcapServices).length === 0) {
133
+ console.warn('Warning: VCAP_SERVICES is empty. Check if the app has services bound.');
134
+ }
135
+ let destinations = [];
136
+ const destRaw = rawEnv?.environment_variables?.destinations;
137
+ if (typeof destRaw === 'string') {
138
+ try {
139
+ destinations = JSON.parse(destRaw);
140
+ }
141
+ catch {
142
+ console.warn(`Warning: Could not parse destinations. Raw value: '${destRaw}'`);
143
+ }
144
+ }
145
+ else if (Array.isArray(destRaw)) {
146
+ destinations = destRaw;
147
+ }
148
+ const defaultEnvFile = 'default-env.json';
149
+ if (fs.existsSync(defaultEnvFile)) {
150
+ const overwrite = await (0, confirm_1.confirm)('default-env.json already exists. Overwrite?');
151
+ if (!overwrite) {
152
+ console.log('\nSkipped default-env.json. Binding still active.');
153
+ console.log('\nRun your service with:');
154
+ console.log(' cds watch --profile hybrid --port 4005');
155
+ return;
156
+ }
157
+ }
158
+ fs.writeFileSync(defaultEnvFile, JSON.stringify({ VCAP_SERVICES: vcapServices, destinations }, null, 2));
159
+ console.log('\ndefault-env.json written successfully.');
160
+ console.log(`destinations: ${JSON.stringify(destinations)}`);
161
+ console.log('\nRun your service with:');
162
+ console.log(' cds watch --profile hybrid');
163
+ }
164
+ exports.localCommand = new commander_1.Command('bind-local')
165
+ .description('Bind local CAP service to Cloud Foundry app services and write default-env.json')
166
+ .action(runBindLocalAction);
167
+ //# sourceMappingURL=local.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local.js","sourceRoot":"","sources":["../../src/commands/local.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function runNpmrcAction(): Promise<void>;
3
+ export declare const npmrcCommand: Command;
@@ -0,0 +1,142 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.npmrcCommand = void 0;
40
+ exports.runNpmrcAction = runNpmrcAction;
41
+ const commander_1 = require("commander");
42
+ const prompts_1 = __importDefault(require("prompts"));
43
+ const fs = __importStar(require("fs"));
44
+ const projects_1 = require("../utils/projects");
45
+ const confirm_1 = require("../utils/confirm");
46
+ function buildNpmrc(packageId) {
47
+ return ([
48
+ `@simplemdg:registry=https://gitlab.simplemdg.com/api/v4/projects/${packageId}/packages/npm/`,
49
+ `//gitlab.simplemdg.com/api/v4/projects/${packageId}/packages/npm/:_authToken=lxU4A4Zzr9XSXn8sLLwlSW86MQp1OjJ3CA.01.0y09ntjbp`,
50
+ `registry=https://registry.npmjs.org`,
51
+ `@sap:registry=https://registry.npmjs.org`,
52
+ `//73555000100200018064.npmsrv.cdn.repositories.cloud.sap/:_auth=MDAwMTgyMTg4OC1pdmFubmd1eWVuOkpwUnlMWmdGVFNGOWphbk9meFZnSWZKZzdGV0ZtejZY=`,
53
+ `fetch-retries=5`,
54
+ `fetch-retry-maxtimeout = 60000`,
55
+ `fetch-retry-mintimeout = 10000`,
56
+ ].join('\n') + '\n');
57
+ }
58
+ async function runNpmrcAction() {
59
+ const projects = (0, projects_1.loadProjects)();
60
+ if (projects.length === 0) {
61
+ console.error('No projects found. Run: captools npmrc add');
62
+ process.exit(1);
63
+ }
64
+ const { selected } = await (0, prompts_1.default)({
65
+ type: 'autocomplete',
66
+ name: 'selected',
67
+ message: 'Select project (type to search):',
68
+ choices: projects.map((p) => ({ title: p.name || p.packageId, value: p })),
69
+ suggest: (input, choices) => Promise.resolve(choices.filter((c) => c.title.toLowerCase().includes(input.toLowerCase()))),
70
+ }, { onCancel: () => process.exit(0) });
71
+ const npmrcFile = '.npmrc';
72
+ if (fs.existsSync(npmrcFile)) {
73
+ const overwrite = await (0, confirm_1.confirm)('.npmrc already exists. Overwrite?');
74
+ if (!overwrite) {
75
+ console.log('Aborted.');
76
+ return;
77
+ }
78
+ }
79
+ fs.writeFileSync(npmrcFile, buildNpmrc(selected.packageId));
80
+ console.log(`\n.npmrc written for: ${selected.name}`);
81
+ console.log(` PACKAGEID: ${selected.packageId}`);
82
+ }
83
+ exports.npmrcCommand = new commander_1.Command('npmrc')
84
+ .description('Generate .npmrc for a SimpleMDG project')
85
+ .addCommand(new commander_1.Command('add')
86
+ .description('Add a project to ~/.captools/projects.json')
87
+ .action(async () => {
88
+ const { name } = await (0, prompts_1.default)({ type: 'text', name: 'name', message: 'Project name:' }, { onCancel: () => process.exit(0) });
89
+ const { packageId } = await (0, prompts_1.default)({ type: 'text', name: 'packageId', message: 'Package ID (numeric):' }, { onCancel: () => process.exit(0) });
90
+ if (!/^\d+$/.test(packageId)) {
91
+ console.error('packageId must be numeric');
92
+ process.exit(1);
93
+ }
94
+ const environments = [];
95
+ let addingEnvs = true;
96
+ while (addingEnvs) {
97
+ const addEnv = await (0, confirm_1.confirm)(environments.length === 0 ? 'Add an environment?' : 'Add another environment?');
98
+ if (!addEnv) {
99
+ addingEnvs = false;
100
+ break;
101
+ }
102
+ const env = await (0, prompts_1.default)([
103
+ { type: 'text', name: 'env', message: 'Environment (e.g. Dev, QAS, Prd):' },
104
+ { type: 'text', name: 'region', message: 'Region (e.g. us10-001):' },
105
+ { type: 'text', name: 'globalBtp', message: 'Global BTP / Subaccount group:' },
106
+ { type: 'text', name: 'subaccount', message: 'Subaccount:' },
107
+ { type: 'text', name: 'gitlab', message: 'GitLab (group/branch, or leave blank):' },
108
+ { type: 'text', name: 'url', message: 'URL:' },
109
+ { type: 'text', name: 'credentials', message: 'Credentials (or leave blank):' },
110
+ ], { onCancel: () => process.exit(0) });
111
+ environments.push({
112
+ env: env.env || '',
113
+ region: env.region || '',
114
+ globalBtp: env.globalBtp || '',
115
+ subaccount: env.subaccount || '',
116
+ gitlab: env.gitlab || '',
117
+ url: env.url || '',
118
+ credentials: env.credentials || '',
119
+ });
120
+ console.log(` Added environment: ${env.env}`);
121
+ }
122
+ try {
123
+ (0, projects_1.addProject)({ name, packageId, environments });
124
+ console.log(`Added "${name}" (packageId: ${packageId}) with ${environments.length} environment(s).`);
125
+ }
126
+ catch (err) {
127
+ console.error(err.message);
128
+ process.exit(1);
129
+ }
130
+ }))
131
+ .addCommand(new commander_1.Command('list')
132
+ .description('List all projects in ~/.captools/projects.json')
133
+ .action(() => {
134
+ const projects = (0, projects_1.listProjects)();
135
+ if (projects.length === 0) {
136
+ console.log('No projects found. Run: captools npmrc add');
137
+ return;
138
+ }
139
+ console.log(JSON.stringify(projects, null, 2));
140
+ }))
141
+ .action(runNpmrcAction);
142
+ //# sourceMappingURL=npmrc.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"npmrc.js","sourceRoot":"","sources":["../../src/commands/npmrc.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import { Command } from 'commander';
2
+ export declare const runLocalCommand: Command;
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.runLocalCommand = void 0;
4
+ const commander_1 = require("commander");
5
+ const child_process_1 = require("child_process");
6
+ const npmrc_1 = require("./npmrc");
7
+ const install_1 = require("./install");
8
+ const local_1 = require("./local");
9
+ exports.runLocalCommand = new commander_1.Command('run-local')
10
+ .description('Run npmrc → install → bind-local → cds watch --profile hybrid')
11
+ .action(async () => {
12
+ await (0, npmrc_1.runNpmrcAction)();
13
+ await (0, install_1.runInstallAction)(true);
14
+ await (0, local_1.runBindLocalAction)();
15
+ console.log('\nStarting: cds watch --profile hybrid');
16
+ const result = (0, child_process_1.spawnSync)('cds', ['watch', '--profile', 'hybrid'], { stdio: 'inherit', shell: process.platform === 'win32' });
17
+ if (result.status !== 0)
18
+ process.exit(result.status ?? 1);
19
+ });
20
+ //# sourceMappingURL=run-local.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-local.js","sourceRoot":"","sources":["../../src/commands/run-local.ts"],"names":[],"mappings":";;;AAAA,yCAAoC;AACpC,iDAA0C;AAC1C,mCAAyC;AACzC,uCAA6C;AAC7C,mCAA6C;AAEhC,QAAA,eAAe,GAAG,IAAI,mBAAO,CAAC,WAAW,CAAC;KACpD,WAAW,CAAC,+DAA+D,CAAC;KAC5E,MAAM,CAAC,KAAK,IAAI,EAAE;IACjB,MAAM,IAAA,sBAAc,GAAE,CAAC;IACvB,MAAM,IAAA,0BAAgB,EAAC,IAAI,CAAC,CAAC;IAC7B,MAAM,IAAA,0BAAkB,GAAE,CAAC;IAE3B,OAAO,CAAC,GAAG,CAAC,wCAAwC,CAAC,CAAC;IACtD,MAAM,MAAM,GAAG,IAAA,yBAAS,EAAC,KAAK,EAAE,CAAC,OAAO,EAAE,WAAW,EAAE,QAAQ,CAAC,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC,CAAC;IAC7H,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC;AAC5D,CAAC,CAAC,CAAC"}
@@ -0,0 +1,4 @@
1
+ export declare const MS_CLIENT_ID: string;
2
+ export declare const MS_TENANT_ID: string;
3
+ export declare const SHAREPOINT_URL: string;
4
+ export declare const PACKAGEID_SHEET: string;
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PACKAGEID_SHEET = exports.SHAREPOINT_URL = exports.MS_TENANT_ID = exports.MS_CLIENT_ID = void 0;
4
+ exports.MS_CLIENT_ID = process.env.CAPTOOLS_CLIENT_ID ?? '778aac50-ebcb-4ba7-b4fb-b6540dd899fc';
5
+ exports.MS_TENANT_ID = process.env.CAPTOOLS_TENANT_ID ?? 'ddc6e257-f88c-4362-b225-e0707e51d095';
6
+ exports.SHAREPOINT_URL = process.env.CAPTOOLS_SHAREPOINT_URL ?? 'https://laidonnam.sharepoint.com/:x:/r/sites/DevOps/_layouts/15/doc2.aspx?sourcedoc=%7B1D01A97E-7952-4828-AE06-68E166CB26F6%7D&file=%5BSAP%20BTP%5D%20Customer%20and%20internal%20environment.xlsx&action=default&mobileredirect=true&ovuser=ddc6e257-f88c-4362-b225-e0707e51d095%2Cnolan.nguyen%40laidon.com&clickparams=eyJBcHBOYW1lIjoiVGVhbXMtRGVza3RvcCIsIkFwcFZlcnNpb24iOiI0OS8yNjAyMDEwMTEyMCIsIkhhc0ZlZGVyYXRlZFVzZXIiOmZhbHNlfQ%3D%3D';
7
+ exports.PACKAGEID_SHEET = process.env.CAPTOOLS_PACKAGEID_SHEET ?? 'NPM Package ID';
8
+ //# sourceMappingURL=constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":";;;AAAa,QAAA,YAAY,GAAK,OAAO,CAAC,GAAG,CAAC,kBAAkB,IAAS,sCAAsC,CAAC;AAC/F,QAAA,YAAY,GAAK,OAAO,CAAC,GAAG,CAAC,kBAAkB,IAAS,sCAAsC,CAAC;AAC/F,QAAA,cAAc,GAAG,OAAO,CAAC,GAAG,CAAC,uBAAuB,IAAI,gbAAgb,CAAC;AACze,QAAA,eAAe,GAAO,OAAO,CAAC,GAAG,CAAC,wBAAwB,IAAQ,gBAAgB,CAAC"}
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export {};
package/dist/index.js ADDED
@@ -0,0 +1,21 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ const commander_1 = require("commander");
5
+ const local_1 = require("./commands/local");
6
+ const npmrc_1 = require("./commands/npmrc");
7
+ const hana_1 = require("./commands/hana");
8
+ const install_1 = require("./commands/install");
9
+ const run_local_1 = require("./commands/run-local");
10
+ const program = new commander_1.Command();
11
+ program
12
+ .name('captools')
13
+ .description('SAP CAP development tools')
14
+ .version('0.1.0');
15
+ program.addCommand(local_1.localCommand);
16
+ program.addCommand(npmrc_1.npmrcCommand);
17
+ program.addCommand(hana_1.hanaCommand);
18
+ program.addCommand(install_1.installCommand);
19
+ program.addCommand(run_local_1.runLocalCommand);
20
+ program.parse();
21
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAEA,yCAAoC;AACpC,4CAAgD;AAChD,4CAAgD;AAChD,0CAA8C;AAC9C,gDAAoD;AACpD,oDAAuD;AAEvD,MAAM,OAAO,GAAG,IAAI,mBAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,UAAU,CAAC;KAChB,WAAW,CAAC,2BAA2B,CAAC;KACxC,OAAO,CAAC,OAAO,CAAC,CAAC;AAEpB,OAAO,CAAC,UAAU,CAAC,oBAAY,CAAC,CAAC;AACjC,OAAO,CAAC,UAAU,CAAC,oBAAY,CAAC,CAAC;AACjC,OAAO,CAAC,UAAU,CAAC,kBAAW,CAAC,CAAC;AAChC,OAAO,CAAC,UAAU,CAAC,wBAAc,CAAC,CAAC;AACnC,OAAO,CAAC,UAAU,CAAC,2BAAe,CAAC,CAAC;AAEpC,OAAO,CAAC,KAAK,EAAE,CAAC"}
@@ -0,0 +1,3 @@
1
+ export declare function cfRun(args: string[]): void;
2
+ export declare function cfCapture(args: string[]): string;
3
+ export declare function cfCaptureList(args: string[]): string[];
@@ -0,0 +1,33 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.cfRun = cfRun;
4
+ exports.cfCapture = cfCapture;
5
+ exports.cfCaptureList = cfCaptureList;
6
+ const child_process_1 = require("child_process");
7
+ const isWindows = process.platform === 'win32';
8
+ function cfRun(args) {
9
+ const result = (0, child_process_1.spawnSync)('cf', args, { stdio: 'inherit', shell: isWindows });
10
+ if (result.status !== 0)
11
+ process.exit(result.status ?? 1);
12
+ }
13
+ function cfCapture(args) {
14
+ const result = (0, child_process_1.spawnSync)('cf', args, { encoding: 'utf8', shell: isWindows });
15
+ if (result.status !== 0) {
16
+ const err = result.stderr?.trim() || 'cf command failed';
17
+ throw new Error(err);
18
+ }
19
+ return result.stdout.trim();
20
+ }
21
+ function cfCaptureList(args) {
22
+ const output = cfCapture(args);
23
+ const lines = output.split('\n');
24
+ // CF list output: "Getting X...", blank line, "name" header, then values
25
+ const headerIdx = lines.findIndex((l) => l.trim() === 'name');
26
+ if (headerIdx === -1)
27
+ return [];
28
+ return lines
29
+ .slice(headerIdx + 1)
30
+ .map((l) => l.trim())
31
+ .filter(Boolean);
32
+ }
33
+ //# sourceMappingURL=cf.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cf.js","sourceRoot":"","sources":["../../src/utils/cf.ts"],"names":[],"mappings":";;AAIA,sBAGC;AAED,8BAOC;AAED,sCAUC;AA5BD,iDAA0C;AAE1C,MAAM,SAAS,GAAG,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC;AAE/C,SAAgB,KAAK,CAAC,IAAc;IAClC,MAAM,MAAM,GAAG,IAAA,yBAAS,EAAC,IAAI,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;IAC7E,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC;AAC5D,CAAC;AAED,SAAgB,SAAS,CAAC,IAAc;IACtC,MAAM,MAAM,GAAG,IAAA,yBAAS,EAAC,IAAI,EAAE,IAAI,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;IAC7E,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,mBAAmB,CAAC;QACzD,MAAM,IAAI,KAAK,CAAC,GAAG,CAAC,CAAC;IACvB,CAAC;IACD,OAAO,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;AAC9B,CAAC;AAED,SAAgB,aAAa,CAAC,IAAc;IAC1C,MAAM,MAAM,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;IAC/B,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACjC,yEAAyE;IACzE,MAAM,SAAS,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,MAAM,CAAC,CAAC;IAC9D,IAAI,SAAS,KAAK,CAAC,CAAC;QAAE,OAAO,EAAE,CAAC;IAChC,OAAO,KAAK;SACT,KAAK,CAAC,SAAS,GAAG,CAAC,CAAC;SACpB,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;SACpB,MAAM,CAAC,OAAO,CAAC,CAAC;AACrB,CAAC"}
@@ -0,0 +1 @@
1
+ export declare function confirm(message: string): Promise<boolean>;
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.confirm = confirm;
7
+ const prompts_1 = __importDefault(require("prompts"));
8
+ async function confirm(message) {
9
+ const { value } = await (0, prompts_1.default)({
10
+ type: 'text',
11
+ name: 'value',
12
+ message: `${message} (y/n)`,
13
+ validate: (v) => ['y', 'n'].includes(v.trim().toLowerCase()) || 'Type y or n',
14
+ }, { onCancel: () => process.exit(0) });
15
+ return (value ?? '').trim().toLowerCase() === 'y';
16
+ }
17
+ //# sourceMappingURL=confirm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"confirm.js","sourceRoot":"","sources":["../../src/utils/confirm.ts"],"names":[],"mappings":";;;;;AAEA,0BAYC;AAdD,sDAA8B;AAEvB,KAAK,UAAU,OAAO,CAAC,OAAe;IAC3C,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,IAAA,iBAAO,EAC7B;QACE,IAAI,EAAE,MAAM;QACZ,IAAI,EAAE,OAAO;QACb,OAAO,EAAE,GAAG,OAAO,QAAQ;QAC3B,QAAQ,EAAE,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,IAAI,aAAa;KACtF,EACD,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CACf,CAAC;IAEvB,OAAO,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,KAAK,GAAG,CAAC;AACpD,CAAC"}
@@ -0,0 +1,7 @@
1
+ export interface CachedCredentials {
2
+ username: string;
3
+ password: string;
4
+ }
5
+ export declare function loadCredentials(): CachedCredentials | null;
6
+ export declare function saveCredentials(creds: CachedCredentials): void;
7
+ export declare function clearCredentials(): void;
@@ -0,0 +1,66 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.loadCredentials = loadCredentials;
37
+ exports.saveCredentials = saveCredentials;
38
+ exports.clearCredentials = clearCredentials;
39
+ const fs = __importStar(require("fs"));
40
+ const os = __importStar(require("os"));
41
+ const path = __importStar(require("path"));
42
+ const CONFIG_DIR = path.join(os.homedir(), '.captools');
43
+ const CREDS_FILE = path.join(CONFIG_DIR, 'credentials.json');
44
+ function loadCredentials() {
45
+ try {
46
+ if (!fs.existsSync(CREDS_FILE))
47
+ return null;
48
+ const raw = fs.readFileSync(CREDS_FILE, 'utf8');
49
+ return JSON.parse(raw);
50
+ }
51
+ catch {
52
+ return null;
53
+ }
54
+ }
55
+ function saveCredentials(creds) {
56
+ if (!fs.existsSync(CONFIG_DIR)) {
57
+ fs.mkdirSync(CONFIG_DIR, { recursive: true });
58
+ }
59
+ fs.writeFileSync(CREDS_FILE, JSON.stringify(creds, null, 2), { mode: 0o600 });
60
+ }
61
+ function clearCredentials() {
62
+ if (fs.existsSync(CREDS_FILE)) {
63
+ fs.unlinkSync(CREDS_FILE);
64
+ }
65
+ }
66
+ //# sourceMappingURL=credentials.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"credentials.js","sourceRoot":"","sources":["../../src/utils/credentials.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAYA,0CAQC;AAED,0CAKC;AAED,4CAIC;AAjCD,uCAAyB;AACzB,uCAAyB;AACzB,2CAA6B;AAE7B,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,WAAW,CAAC,CAAC;AACxD,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,kBAAkB,CAAC,CAAC;AAO7D,SAAgB,eAAe;IAC7B,IAAI,CAAC;QACH,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC;YAAE,OAAO,IAAI,CAAC;QAC5C,MAAM,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;QAChD,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAsB,CAAC;IAC9C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAgB,eAAe,CAAC,KAAwB;IACtD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC/B,EAAE,CAAC,SAAS,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAChD,CAAC;IACD,EAAE,CAAC,aAAa,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;AAChF,CAAC;AAED,SAAgB,gBAAgB;IAC9B,IAAI,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC9B,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;IAC5B,CAAC;AACH,CAAC"}
@@ -0,0 +1,6 @@
1
+ export interface Project {
2
+ name: string;
3
+ packageId: string;
4
+ }
5
+ export declare function fetchSheetData(accessToken: string, shareUrl: string, sheetName: string): Promise<string[][]>;
6
+ export declare function parseProjects(rows: string[][]): Project[];
@@ -0,0 +1,42 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.fetchSheetData = fetchSheetData;
4
+ exports.parseProjects = parseProjects;
5
+ function encodeShareUrl(shareUrl) {
6
+ // Graph API sharing URL encoding: base64url(url), prefixed with "u!"
7
+ const b64 = Buffer.from(shareUrl).toString('base64');
8
+ const b64url = b64.replace(/\+/g, '-').replace(/\//g, '_').replace(/=+$/, '');
9
+ return `u!${b64url}`;
10
+ }
11
+ async function fetchSheetData(accessToken, shareUrl, sheetName) {
12
+ const encoded = encodeShareUrl(shareUrl);
13
+ const url = `https://graph.microsoft.com/v1.0/shares/${encoded}/driveItem/workbook/sheets/${encodeURIComponent(sheetName)}/usedRange`;
14
+ const res = await fetch(url, {
15
+ headers: { Authorization: `Bearer ${accessToken}` },
16
+ });
17
+ if (!res.ok) {
18
+ const text = await res.text();
19
+ throw new Error(`Graph API ${res.status}: ${text}`);
20
+ }
21
+ const data = (await res.json());
22
+ return data.values.map((row) => row.map((cell) => String(cell ?? '')));
23
+ }
24
+ function parseProjects(rows) {
25
+ // Find header row by looking for a cell containing "packageid"
26
+ const headerIdx = rows.findIndex((row) => row.some((cell) => cell.toLowerCase().replace(/[^a-z]/g, '').includes('packageid')));
27
+ if (headerIdx === -1)
28
+ throw new Error('Could not find PACKAGEID header row in sheet');
29
+ const header = rows[headerIdx].map((c) => c.toLowerCase().replace(/[\s_${}]/g, ''));
30
+ const nameCol = header.findIndex((h) => h.includes('name') || h.includes('project') || h.includes('subgroup'));
31
+ const pkgCol = header.findIndex((h) => h.includes('packageid'));
32
+ if (pkgCol === -1)
33
+ throw new Error('PACKAGEID column not found');
34
+ return rows
35
+ .slice(headerIdx + 1)
36
+ .filter((row) => /^\d+$/.test((row[pkgCol] ?? '').trim()))
37
+ .map((row) => ({
38
+ name: (nameCol !== -1 ? row[nameCol] : '') || row[pkgCol],
39
+ packageId: row[pkgCol].trim(),
40
+ }));
41
+ }
42
+ //# sourceMappingURL=graph.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graph.js","sourceRoot":"","sources":["../../src/utils/graph.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ interface TokenCache {
2
+ accessToken: string;
3
+ refreshToken: string;
4
+ expiresAt: number;
5
+ }
6
+ export declare function loadToken(): TokenCache | null;
7
+ export declare function loginWithBrowser(clientId: string, tenantId: string): Promise<void>;
8
+ export declare function getValidToken(clientId: string, tenantId: string): Promise<string>;
9
+ export {};
@@ -0,0 +1,191 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.loadToken = loadToken;
37
+ exports.loginWithBrowser = loginWithBrowser;
38
+ exports.getValidToken = getValidToken;
39
+ const crypto = __importStar(require("crypto"));
40
+ const http = __importStar(require("http"));
41
+ const net = __importStar(require("net"));
42
+ const fs = __importStar(require("fs"));
43
+ const os = __importStar(require("os"));
44
+ const path = __importStar(require("path"));
45
+ const child_process_1 = require("child_process");
46
+ const TOKEN_FILE = path.join(os.homedir(), '.captools', 'ms-token.json');
47
+ const SCOPE = 'Files.Read offline_access openid';
48
+ // ── PKCE helpers ──────────────────────────────────────────────────────────────
49
+ function generateCodeVerifier() {
50
+ return crypto.randomBytes(64).toString('base64url').slice(0, 128);
51
+ }
52
+ function generateCodeChallenge(verifier) {
53
+ return crypto.createHash('sha256').update(verifier).digest('base64url');
54
+ }
55
+ // ── Browser open (handles WSL, Mac, Linux, Windows) ──────────────────────────
56
+ function openBrowser(url) {
57
+ try {
58
+ const version = fs.readFileSync('/proc/version', 'utf8').toLowerCase();
59
+ if (version.includes('microsoft') || version.includes('wsl')) {
60
+ (0, child_process_1.exec)(`powershell.exe -Command "Start-Process '${url}'"`);
61
+ return;
62
+ }
63
+ }
64
+ catch { }
65
+ const cmds = {
66
+ win32: `start "" "${url}"`,
67
+ darwin: `open "${url}"`,
68
+ };
69
+ (0, child_process_1.exec)(cmds[process.platform] ?? `xdg-open "${url}"`);
70
+ }
71
+ // ── Find an available localhost port ─────────────────────────────────────────
72
+ function findAvailablePort() {
73
+ return new Promise((resolve, reject) => {
74
+ const srv = net.createServer();
75
+ srv.listen(0, '127.0.0.1', () => {
76
+ const port = srv.address().port;
77
+ srv.close(() => resolve(port));
78
+ });
79
+ srv.on('error', reject);
80
+ });
81
+ }
82
+ // ── Token persistence ─────────────────────────────────────────────────────────
83
+ function saveToken(token) {
84
+ const dir = path.dirname(TOKEN_FILE);
85
+ if (!fs.existsSync(dir))
86
+ fs.mkdirSync(dir, { recursive: true });
87
+ fs.writeFileSync(TOKEN_FILE, JSON.stringify(token, null, 2), { mode: 0o600 });
88
+ }
89
+ function loadToken() {
90
+ try {
91
+ if (!fs.existsSync(TOKEN_FILE))
92
+ return null;
93
+ return JSON.parse(fs.readFileSync(TOKEN_FILE, 'utf8'));
94
+ }
95
+ catch {
96
+ return null;
97
+ }
98
+ }
99
+ // ── Token exchange helpers ────────────────────────────────────────────────────
100
+ async function postToken(tenantId, body) {
101
+ const res = await fetch(`https://login.microsoftonline.com/${tenantId}/oauth2/v2.0/token`, {
102
+ method: 'POST',
103
+ headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
104
+ body: new URLSearchParams(body).toString(),
105
+ });
106
+ const data = (await res.json());
107
+ if (data['error'])
108
+ throw new Error(String(data['error_description'] ?? data['error']));
109
+ const token = {
110
+ accessToken: String(data['access_token']),
111
+ refreshToken: String(data['refresh_token']),
112
+ expiresAt: Date.now() + (Number(data['expires_in']) - 60) * 1000,
113
+ };
114
+ saveToken(token);
115
+ return token;
116
+ }
117
+ // ── Public API ────────────────────────────────────────────────────────────────
118
+ async function loginWithBrowser(clientId, tenantId) {
119
+ const port = await findAvailablePort();
120
+ const redirectUri = `http://localhost:${port}/callback`;
121
+ const codeVerifier = generateCodeVerifier();
122
+ const codeChallenge = generateCodeChallenge(codeVerifier);
123
+ const authUrl = new URL(`https://login.microsoftonline.com/${tenantId}/oauth2/v2.0/authorize`);
124
+ authUrl.searchParams.set('client_id', clientId);
125
+ authUrl.searchParams.set('response_type', 'code');
126
+ authUrl.searchParams.set('redirect_uri', redirectUri);
127
+ authUrl.searchParams.set('scope', SCOPE);
128
+ authUrl.searchParams.set('code_challenge', codeChallenge);
129
+ authUrl.searchParams.set('code_challenge_method', 'S256');
130
+ return new Promise((resolve, reject) => {
131
+ const server = http.createServer(async (req, res) => {
132
+ if (!req.url?.startsWith('/callback'))
133
+ return;
134
+ const params = new URL(req.url, `http://localhost:${port}`).searchParams;
135
+ const code = params.get('code');
136
+ const error = params.get('error');
137
+ const html = (msg) => `<html><body style="font-family:sans-serif;padding:2rem"><h2>${msg}</h2><p>You can close this tab.</p></body></html>`;
138
+ if (error || !code) {
139
+ res.writeHead(400, { 'Content-Type': 'text/html' });
140
+ res.end(html('Authentication failed.'));
141
+ server.close();
142
+ reject(new Error(error ?? 'No auth code received'));
143
+ return;
144
+ }
145
+ res.writeHead(200, { 'Content-Type': 'text/html' });
146
+ res.end(html('Authentication successful!'));
147
+ server.close();
148
+ try {
149
+ await postToken(tenantId, {
150
+ grant_type: 'authorization_code',
151
+ client_id: clientId,
152
+ code,
153
+ redirect_uri: redirectUri,
154
+ code_verifier: codeVerifier,
155
+ });
156
+ resolve();
157
+ }
158
+ catch (err) {
159
+ reject(err);
160
+ }
161
+ });
162
+ server.listen(port, '127.0.0.1', () => {
163
+ console.log('Opening browser for Microsoft login...\n');
164
+ console.log(`If browser does not open, visit:\n${authUrl}\n`);
165
+ openBrowser(authUrl.toString());
166
+ });
167
+ server.on('error', reject);
168
+ setTimeout(() => { server.close(); reject(new Error('Auth timed out after 5 minutes')); }, 5 * 60 * 1000);
169
+ });
170
+ }
171
+ async function getValidToken(clientId, tenantId) {
172
+ const cached = loadToken();
173
+ if (cached && Date.now() < cached.expiresAt)
174
+ return cached.accessToken;
175
+ if (cached?.refreshToken) {
176
+ try {
177
+ const t = await postToken(tenantId, {
178
+ grant_type: 'refresh_token',
179
+ client_id: clientId,
180
+ refresh_token: cached.refreshToken,
181
+ scope: SCOPE,
182
+ });
183
+ return t.accessToken;
184
+ }
185
+ catch {
186
+ // fall through to re-auth
187
+ }
188
+ }
189
+ throw new Error('TOKEN_EXPIRED');
190
+ }
191
+ //# sourceMappingURL=msAuth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"msAuth.js","sourceRoot":"","sources":["../../src/utils/msAuth.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ export interface Environment {
2
+ env: string;
3
+ region: string;
4
+ globalBtp: string;
5
+ subaccount: string;
6
+ gitlab: string;
7
+ url: string;
8
+ credentials: string;
9
+ }
10
+ export interface Project {
11
+ name: string;
12
+ packageId: string;
13
+ environments?: Environment[];
14
+ }
15
+ export declare function loadProjects(): Project[];
16
+ export declare function saveProjects(projects: Project[]): void;
17
+ export declare function addProject(project: Project): void;
18
+ export declare function listProjects(): Project[];
@@ -0,0 +1,74 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.loadProjects = loadProjects;
37
+ exports.saveProjects = saveProjects;
38
+ exports.addProject = addProject;
39
+ exports.listProjects = listProjects;
40
+ const fs = __importStar(require("fs"));
41
+ const os = __importStar(require("os"));
42
+ const path = __importStar(require("path"));
43
+ const CONFIG_DIR = path.join(os.homedir(), '.captools');
44
+ const PROJECTS_FILE = path.join(CONFIG_DIR, 'projects.json');
45
+ function loadProjects() {
46
+ try {
47
+ if (!fs.existsSync(PROJECTS_FILE))
48
+ return [];
49
+ const raw = fs.readFileSync(PROJECTS_FILE, 'utf8');
50
+ return JSON.parse(raw);
51
+ }
52
+ catch {
53
+ console.warn('Warning: could not parse projects.json, starting fresh');
54
+ return [];
55
+ }
56
+ }
57
+ function saveProjects(projects) {
58
+ if (!fs.existsSync(CONFIG_DIR)) {
59
+ fs.mkdirSync(CONFIG_DIR, { recursive: true });
60
+ }
61
+ fs.writeFileSync(PROJECTS_FILE, JSON.stringify(projects, null, 2) + '\n', { mode: 0o600 });
62
+ }
63
+ function addProject(project) {
64
+ const projects = loadProjects();
65
+ if (projects.some(p => p.packageId === project.packageId)) {
66
+ throw new Error('Project with packageId already exists');
67
+ }
68
+ projects.push(project);
69
+ saveProjects(projects);
70
+ }
71
+ function listProjects() {
72
+ return loadProjects();
73
+ }
74
+ //# sourceMappingURL=projects.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"projects.js","sourceRoot":"","sources":["../../src/utils/projects.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAuBA,oCASC;AAED,oCAKC;AAED,gCAOC;AAED,oCAEC;AApDD,uCAAyB;AACzB,uCAAyB;AACzB,2CAA6B;AAE7B,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,WAAW,CAAC,CAAC;AACxD,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,eAAe,CAAC,CAAC;AAkB7D,SAAgB,YAAY;IAC1B,IAAI,CAAC;QACH,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,aAAa,CAAC;YAAE,OAAO,EAAE,CAAC;QAC7C,MAAM,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;QACnD,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAc,CAAC;IACtC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,CAAC,IAAI,CAAC,wDAAwD,CAAC,CAAC;QACvE,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,SAAgB,YAAY,CAAC,QAAmB;IAC9C,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC/B,EAAE,CAAC,SAAS,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAChD,CAAC;IACD,EAAE,CAAC,aAAa,CAAC,aAAa,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;AAC7F,CAAC;AAED,SAAgB,UAAU,CAAC,OAAgB;IACzC,MAAM,QAAQ,GAAG,YAAY,EAAE,CAAC;IAChC,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,KAAK,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;QAC1D,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;IAC3D,CAAC;IACD,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACvB,YAAY,CAAC,QAAQ,CAAC,CAAC;AACzB,CAAC;AAED,SAAgB,YAAY;IAC1B,OAAO,YAAY,EAAE,CAAC;AACxB,CAAC"}
package/package.json ADDED
@@ -0,0 +1,32 @@
1
+ {
2
+ "name": "@sang2x/captools",
3
+ "version": "0.1.0",
4
+ "description": "SAP CAP development tools CLI",
5
+ "main": "dist/index.js",
6
+ "bin": {
7
+ "captools": "dist/index.js"
8
+ },
9
+ "scripts": {
10
+ "build": "tsc",
11
+ "dev": "ts-node src/index.ts",
12
+ "prepare": "npm run build"
13
+ },
14
+ "keywords": ["sap", "cap", "cds", "cloud-foundry", "cli"],
15
+ "license": "MIT",
16
+ "dependencies": {
17
+ "commander": "^12.0.0",
18
+ "prompts": "^2.4.2"
19
+ },
20
+ "devDependencies": {
21
+ "@types/node": "^20.0.0",
22
+ "@types/prompts": "^2.4.9",
23
+ "ts-node": "^10.9.0",
24
+ "typescript": "^5.0.0"
25
+ },
26
+ "engines": {
27
+ "node": ">=18"
28
+ },
29
+ "files": [
30
+ "dist"
31
+ ]
32
+ }