@getbrevo/cli 0.0.1-alpha.1
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/CHANGELOG.md +13 -0
- package/LICENSE +21 -0
- package/README.md +182 -0
- package/dist/api/client.d.ts +23 -0
- package/dist/api/client.d.ts.map +1 -0
- package/dist/api/client.js +186 -0
- package/dist/api/client.js.map +1 -0
- package/dist/bin/index.d.ts +3 -0
- package/dist/bin/index.d.ts.map +1 -0
- package/dist/bin/index.js +179 -0
- package/dist/bin/index.js.map +1 -0
- package/dist/commands/app/create.d.ts +7 -0
- package/dist/commands/app/create.d.ts.map +1 -0
- package/dist/commands/app/create.js +261 -0
- package/dist/commands/app/create.js.map +1 -0
- package/dist/commands/app/credentials.d.ts +6 -0
- package/dist/commands/app/credentials.d.ts.map +1 -0
- package/dist/commands/app/credentials.js +106 -0
- package/dist/commands/app/credentials.js.map +1 -0
- package/dist/commands/app/delete.d.ts +6 -0
- package/dist/commands/app/delete.d.ts.map +1 -0
- package/dist/commands/app/delete.js +146 -0
- package/dist/commands/app/delete.js.map +1 -0
- package/dist/commands/app/list.d.ts +4 -0
- package/dist/commands/app/list.d.ts.map +1 -0
- package/dist/commands/app/list.js +46 -0
- package/dist/commands/app/list.js.map +1 -0
- package/dist/commands/app/scaffold.d.ts +5 -0
- package/dist/commands/app/scaffold.d.ts.map +1 -0
- package/dist/commands/app/scaffold.js +199 -0
- package/dist/commands/app/scaffold.js.map +1 -0
- package/dist/commands/app/start.d.ts +5 -0
- package/dist/commands/app/start.d.ts.map +1 -0
- package/dist/commands/app/start.js +138 -0
- package/dist/commands/app/start.js.map +1 -0
- package/dist/commands/app/test.d.ts +6 -0
- package/dist/commands/app/test.d.ts.map +1 -0
- package/dist/commands/app/test.js +495 -0
- package/dist/commands/app/test.js.map +1 -0
- package/dist/commands/app/update.d.ts +2 -0
- package/dist/commands/app/update.d.ts.map +1 -0
- package/dist/commands/app/update.js +324 -0
- package/dist/commands/app/update.js.map +1 -0
- package/dist/commands/definitions.d.ts +4 -0
- package/dist/commands/definitions.d.ts.map +1 -0
- package/dist/commands/definitions.js +197 -0
- package/dist/commands/definitions.js.map +1 -0
- package/dist/commands/init.d.ts +2 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +90 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/login.d.ts +6 -0
- package/dist/commands/login.d.ts.map +1 -0
- package/dist/commands/login.js +219 -0
- package/dist/commands/login.js.map +1 -0
- package/dist/commands/logout.d.ts +5 -0
- package/dist/commands/logout.d.ts.map +1 -0
- package/dist/commands/logout.js +54 -0
- package/dist/commands/logout.js.map +1 -0
- package/dist/commands/whoami.d.ts +4 -0
- package/dist/commands/whoami.d.ts.map +1 -0
- package/dist/commands/whoami.js +74 -0
- package/dist/commands/whoami.js.map +1 -0
- package/dist/container.d.ts +7 -0
- package/dist/container.d.ts.map +1 -0
- package/dist/container.js +28 -0
- package/dist/container.js.map +1 -0
- package/dist/lang/en.d.ts +110 -0
- package/dist/lang/en.d.ts.map +1 -0
- package/dist/lang/en.js +133 -0
- package/dist/lang/en.js.map +1 -0
- package/dist/lib/abort.d.ts +3 -0
- package/dist/lib/abort.d.ts.map +1 -0
- package/dist/lib/abort.js +30 -0
- package/dist/lib/abort.js.map +1 -0
- package/dist/lib/auth-guard.d.ts +3 -0
- package/dist/lib/auth-guard.d.ts.map +1 -0
- package/dist/lib/auth-guard.js +25 -0
- package/dist/lib/auth-guard.js.map +1 -0
- package/dist/lib/browser.d.ts +2 -0
- package/dist/lib/browser.d.ts.map +1 -0
- package/dist/lib/browser.js +16 -0
- package/dist/lib/browser.js.map +1 -0
- package/dist/lib/command-handler.d.ts +10 -0
- package/dist/lib/command-handler.d.ts.map +1 -0
- package/dist/lib/command-handler.js +16 -0
- package/dist/lib/command-handler.js.map +1 -0
- package/dist/lib/command-registry.d.ts +28 -0
- package/dist/lib/command-registry.d.ts.map +1 -0
- package/dist/lib/command-registry.js +54 -0
- package/dist/lib/command-registry.js.map +1 -0
- package/dist/lib/config.d.ts +76 -0
- package/dist/lib/config.d.ts.map +1 -0
- package/dist/lib/config.js +314 -0
- package/dist/lib/config.js.map +1 -0
- package/dist/lib/constants.d.ts +35 -0
- package/dist/lib/constants.d.ts.map +1 -0
- package/dist/lib/constants.js +97 -0
- package/dist/lib/constants.js.map +1 -0
- package/dist/lib/errors.d.ts +30 -0
- package/dist/lib/errors.d.ts.map +1 -0
- package/dist/lib/errors.js +66 -0
- package/dist/lib/errors.js.map +1 -0
- package/dist/lib/exit-codes.d.ts +9 -0
- package/dist/lib/exit-codes.d.ts.map +1 -0
- package/dist/lib/exit-codes.js +12 -0
- package/dist/lib/exit-codes.js.map +1 -0
- package/dist/lib/hidden-input.d.ts +2 -0
- package/dist/lib/hidden-input.d.ts.map +1 -0
- package/dist/lib/hidden-input.js +78 -0
- package/dist/lib/hidden-input.js.map +1 -0
- package/dist/lib/json-output.d.ts +6 -0
- package/dist/lib/json-output.d.ts.map +1 -0
- package/dist/lib/json-output.js +11 -0
- package/dist/lib/json-output.js.map +1 -0
- package/dist/lib/logger.d.ts +11 -0
- package/dist/lib/logger.d.ts.map +1 -0
- package/dist/lib/logger.js +87 -0
- package/dist/lib/logger.js.map +1 -0
- package/dist/lib/port.d.ts +12 -0
- package/dist/lib/port.d.ts.map +1 -0
- package/dist/lib/port.js +79 -0
- package/dist/lib/port.js.map +1 -0
- package/dist/lib/ui.d.ts +14 -0
- package/dist/lib/ui.d.ts.map +1 -0
- package/dist/lib/ui.js +75 -0
- package/dist/lib/ui.js.map +1 -0
- package/dist/lib/validators.d.ts +32 -0
- package/dist/lib/validators.d.ts.map +1 -0
- package/dist/lib/validators.js +96 -0
- package/dist/lib/validators.js.map +1 -0
- package/dist/services/account.d.ts +8 -0
- package/dist/services/account.d.ts.map +1 -0
- package/dist/services/account.js +15 -0
- package/dist/services/account.js.map +1 -0
- package/dist/services/app.d.ts +35 -0
- package/dist/services/app.d.ts.map +1 -0
- package/dist/services/app.js +117 -0
- package/dist/services/app.js.map +1 -0
- package/dist/services/browser-auth.d.ts +15 -0
- package/dist/services/browser-auth.d.ts.map +1 -0
- package/dist/services/browser-auth.js +187 -0
- package/dist/services/browser-auth.js.map +1 -0
- package/dist/services/normalize-app-id.d.ts +12 -0
- package/dist/services/normalize-app-id.d.ts.map +1 -0
- package/dist/services/normalize-app-id.js +38 -0
- package/dist/services/normalize-app-id.js.map +1 -0
- package/dist/services/oauth-refresh.d.ts +14 -0
- package/dist/services/oauth-refresh.d.ts.map +1 -0
- package/dist/services/oauth-refresh.js +70 -0
- package/dist/services/oauth-refresh.js.map +1 -0
- package/dist/templates/files/AGENTS.md.tmpl +41 -0
- package/dist/templates/files/CLAUDE.md.tmpl +50 -0
- package/dist/templates/files/README.md.tmpl +77 -0
- package/dist/templates/files/app-config.json.tmpl +23 -0
- package/dist/templates/files/gitignore.tmpl +9 -0
- package/dist/templates/files/src/oauth/.env.example.tmpl +13 -0
- package/dist/templates/files/src/oauth/.env.local.tmpl +10 -0
- package/dist/templates/files/src/oauth/handler.js.tmpl +203 -0
- package/dist/templates/files/src/oauth/package.json.tmpl +15 -0
- package/dist/templates/files/src/oauth/server.js.tmpl +226 -0
- package/dist/templates/files/src/oauth/token-store.js.tmpl +39 -0
- package/dist/templates/index.d.ts +36 -0
- package/dist/templates/index.d.ts.map +1 -0
- package/dist/templates/index.js +105 -0
- package/dist/templates/index.js.map +1 -0
- package/dist/types.d.ts +30 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/package.json +81 -0
|
@@ -0,0 +1,78 @@
|
|
|
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.readHiddenInput = readHiddenInput;
|
|
37
|
+
const readline = __importStar(require("readline"));
|
|
38
|
+
function readHiddenInput(prompt) {
|
|
39
|
+
return new Promise((resolve, reject) => {
|
|
40
|
+
const rl = readline.createInterface({
|
|
41
|
+
input: process.stdin,
|
|
42
|
+
output: process.stdout,
|
|
43
|
+
});
|
|
44
|
+
let answered = false;
|
|
45
|
+
// Mute output
|
|
46
|
+
const stdout = process.stdout;
|
|
47
|
+
process.stdout.write(` ${prompt}`);
|
|
48
|
+
// Override _writeToOutput to mask user keystrokes only
|
|
49
|
+
// readline calls _writeToOutput for its own internal writes (prompt, question text)
|
|
50
|
+
// as well as echoed user input — we suppress the internal writes and mask keystrokes
|
|
51
|
+
let prompting = true;
|
|
52
|
+
rl._writeToOutput = function (str) {
|
|
53
|
+
if (prompting)
|
|
54
|
+
return; // suppress readline's own prompt/question echo
|
|
55
|
+
if (str.includes('\n') || str.includes('\r')) {
|
|
56
|
+
stdout.write('\n');
|
|
57
|
+
}
|
|
58
|
+
else {
|
|
59
|
+
stdout.write('*');
|
|
60
|
+
}
|
|
61
|
+
};
|
|
62
|
+
// After readline finishes its internal setup, start masking user input
|
|
63
|
+
process.nextTick(() => {
|
|
64
|
+
prompting = false;
|
|
65
|
+
});
|
|
66
|
+
rl.question('', (answer) => {
|
|
67
|
+
answered = true;
|
|
68
|
+
rl.close();
|
|
69
|
+
resolve(answer.trim());
|
|
70
|
+
});
|
|
71
|
+
rl.on('close', () => {
|
|
72
|
+
if (!answered) {
|
|
73
|
+
reject(new Error('readline was closed'));
|
|
74
|
+
}
|
|
75
|
+
});
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=hidden-input.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hidden-input.js","sourceRoot":"","sources":["../../src/lib/hidden-input.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEA,0CA4CC;AA9CD,mDAAqC;AAErC,SAAgB,eAAe,CAAC,MAAc;IAC5C,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,EAAE,GAAG,QAAQ,CAAC,eAAe,CAAC;YAClC,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,MAAM,EAAE,OAAO,CAAC,MAAM;SACvB,CAAC,CAAC;QAEH,IAAI,QAAQ,GAAG,KAAK,CAAC;QAErB,cAAc;QACd,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;QAE9B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,MAAM,EAAE,CAAC,CAAC;QAEpC,uDAAuD;QACvD,oFAAoF;QACpF,qFAAqF;QACrF,IAAI,SAAS,GAAG,IAAI,CAAC;QACpB,EAAU,CAAC,cAAc,GAAG,UAAU,GAAW;YAChD,IAAI,SAAS;gBAAE,OAAO,CAAC,+CAA+C;YACtE,IAAI,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC7C,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACrB,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YACpB,CAAC;QACH,CAAC,CAAC;QAEF,uEAAuE;QACvE,OAAO,CAAC,QAAQ,CAAC,GAAG,EAAE;YACpB,SAAS,GAAG,KAAK,CAAC;QACpB,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC,MAAM,EAAE,EAAE;YACzB,QAAQ,GAAG,IAAI,CAAC;YAChB,EAAE,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;QACzB,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;YAClB,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACd,MAAM,CAAC,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAC,CAAC;YAC3C,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"json-output.d.ts","sourceRoot":"","sources":["../../src/lib/json-output.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,CAE9C"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.jsonOutput = jsonOutput;
|
|
4
|
+
/**
|
|
5
|
+
* Write JSON data to stdout (for --json flag output).
|
|
6
|
+
* Centralizes the JSON serialization pattern used by all commands.
|
|
7
|
+
*/
|
|
8
|
+
function jsonOutput(data) {
|
|
9
|
+
process.stdout.write(JSON.stringify(data) + '\n');
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=json-output.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"json-output.js","sourceRoot":"","sources":["../../src/lib/json-output.ts"],"names":[],"mappings":";;AAIA,gCAEC;AAND;;;GAGG;AACH,SAAgB,UAAU,CAAC,IAAa;IACtC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC;AACpD,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
declare const isDebug: () => boolean;
|
|
2
|
+
declare const isTTY: () => boolean;
|
|
3
|
+
export declare function logHttp(method: string, path: string): void;
|
|
4
|
+
export declare function logHttpResponse(status: number, path: string): void;
|
|
5
|
+
export declare function logDebug(context: string, data: unknown): void;
|
|
6
|
+
export declare function logError(message: string, error?: unknown): void;
|
|
7
|
+
export declare function logSuccess(message: string): void;
|
|
8
|
+
export declare function logInfo(message: string): void;
|
|
9
|
+
export declare function logWarn(message: string): void;
|
|
10
|
+
export { isDebug, isTTY };
|
|
11
|
+
//# sourceMappingURL=logger.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/lib/logger.ts"],"names":[],"mappings":"AAAA,QAAA,MAAM,OAAO,QAAO,OAA8E,CAAC;AAEnG,QAAA,MAAM,KAAK,QAAO,OAAwC,CAAC;AAwC3D,wBAAgB,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAI1D;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAKlE;AAED,wBAAgB,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,IAAI,CAK7D;AAED,wBAAgB,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO,GAAG,IAAI,CAS/D;AAED,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAEhD;AAED,wBAAgB,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAE7C;AAED,wBAAgB,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAE7C;AAED,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.isTTY = exports.isDebug = void 0;
|
|
4
|
+
exports.logHttp = logHttp;
|
|
5
|
+
exports.logHttpResponse = logHttpResponse;
|
|
6
|
+
exports.logDebug = logDebug;
|
|
7
|
+
exports.logError = logError;
|
|
8
|
+
exports.logSuccess = logSuccess;
|
|
9
|
+
exports.logInfo = logInfo;
|
|
10
|
+
exports.logWarn = logWarn;
|
|
11
|
+
const isDebug = () => process.env.BREVO_DEBUG === '1' || process.argv.includes('--debug');
|
|
12
|
+
exports.isDebug = isDebug;
|
|
13
|
+
const isTTY = () => process.stdout.isTTY === true;
|
|
14
|
+
exports.isTTY = isTTY;
|
|
15
|
+
const useColor = () => process.env.NO_COLOR === undefined && (process.env.FORCE_COLOR !== undefined || isTTY());
|
|
16
|
+
function color(code, text) {
|
|
17
|
+
return useColor() ? `\x1b[${code}m${text}\x1b[0m` : text;
|
|
18
|
+
}
|
|
19
|
+
const SENSITIVE_KEYS = new Set([
|
|
20
|
+
'api-key',
|
|
21
|
+
'api_key',
|
|
22
|
+
'apikey',
|
|
23
|
+
'access_token',
|
|
24
|
+
'refresh_token',
|
|
25
|
+
'client_secret',
|
|
26
|
+
'token',
|
|
27
|
+
'password',
|
|
28
|
+
'secret',
|
|
29
|
+
'authorization',
|
|
30
|
+
]);
|
|
31
|
+
function redactSensitiveFields(data) {
|
|
32
|
+
if (data === null || data === undefined)
|
|
33
|
+
return data;
|
|
34
|
+
if (typeof data !== 'object')
|
|
35
|
+
return data;
|
|
36
|
+
if (Array.isArray(data))
|
|
37
|
+
return data.map(redactSensitiveFields);
|
|
38
|
+
const redacted = {};
|
|
39
|
+
for (const [key, value] of Object.entries(data)) {
|
|
40
|
+
if (SENSITIVE_KEYS.has(key.toLowerCase())) {
|
|
41
|
+
redacted[key] = '[REDACTED]';
|
|
42
|
+
}
|
|
43
|
+
else if (typeof value === 'object' && value !== null) {
|
|
44
|
+
redacted[key] = redactSensitiveFields(value);
|
|
45
|
+
}
|
|
46
|
+
else {
|
|
47
|
+
redacted[key] = value;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
return redacted;
|
|
51
|
+
}
|
|
52
|
+
function logHttp(method, path) {
|
|
53
|
+
if (isDebug()) {
|
|
54
|
+
process.stderr.write(` ${color('90', `→ ${method} ${path}`)}\n`);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
function logHttpResponse(status, path) {
|
|
58
|
+
if (isDebug()) {
|
|
59
|
+
const code = status >= 200 && status < 300 ? '32' : '31';
|
|
60
|
+
process.stderr.write(` ${color(code, `← ${status} ${path}`)}\n`);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
function logDebug(context, data) {
|
|
64
|
+
if (isDebug()) {
|
|
65
|
+
const safe = redactSensitiveFields(data);
|
|
66
|
+
process.stderr.write(` ${color('90', `[debug] ${context}: ${JSON.stringify(safe)}`)}\n`);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
function logError(message, error) {
|
|
70
|
+
process.stderr.write(`\n ${color('31', '✗')} ${message}\n`);
|
|
71
|
+
if (isDebug() && error) {
|
|
72
|
+
process.stderr.write(` ${color('90', error instanceof Error ? error.stack || error.message : String(error))}\n`);
|
|
73
|
+
}
|
|
74
|
+
else if (error) {
|
|
75
|
+
process.stderr.write(` ${color('90', 'Run with --debug for full details')}\n`);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
function logSuccess(message) {
|
|
79
|
+
process.stdout.write(`\n ${color('32', '✓')} ${message}\n`);
|
|
80
|
+
}
|
|
81
|
+
function logInfo(message) {
|
|
82
|
+
process.stdout.write(` ${message}\n`);
|
|
83
|
+
}
|
|
84
|
+
function logWarn(message) {
|
|
85
|
+
process.stdout.write(` ${color('33', '⚠')} ${message}\n`);
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=logger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/lib/logger.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Check whether a TCP port is available on localhost.
|
|
3
|
+
* Resolves true if the port is free, false if in use.
|
|
4
|
+
* Rejects on unexpected errors (e.g. EACCES, invalid port).
|
|
5
|
+
*/
|
|
6
|
+
export declare function isPortAvailable(port: number): Promise<boolean>;
|
|
7
|
+
/**
|
|
8
|
+
* Find the first available port starting from `startPort`.
|
|
9
|
+
* Scans up to MAX_SCAN ports. Returns `null` if no free port is found.
|
|
10
|
+
*/
|
|
11
|
+
export declare function findAvailablePort(startPort: number): Promise<number | null>;
|
|
12
|
+
//# sourceMappingURL=port.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"port.d.ts","sourceRoot":"","sources":["../../src/lib/port.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAmB9D;AAKD;;;GAGG;AACH,wBAAsB,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAKjF"}
|
package/dist/lib/port.js
ADDED
|
@@ -0,0 +1,79 @@
|
|
|
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.isPortAvailable = isPortAvailable;
|
|
37
|
+
exports.findAvailablePort = findAvailablePort;
|
|
38
|
+
const net = __importStar(require("node:net"));
|
|
39
|
+
/**
|
|
40
|
+
* Check whether a TCP port is available on localhost.
|
|
41
|
+
* Resolves true if the port is free, false if in use.
|
|
42
|
+
* Rejects on unexpected errors (e.g. EACCES, invalid port).
|
|
43
|
+
*/
|
|
44
|
+
function isPortAvailable(port) {
|
|
45
|
+
return new Promise((resolve, reject) => {
|
|
46
|
+
const server = net.createServer();
|
|
47
|
+
server.once('error', (err) => {
|
|
48
|
+
if (err.code === 'EADDRINUSE') {
|
|
49
|
+
resolve(false);
|
|
50
|
+
}
|
|
51
|
+
else {
|
|
52
|
+
reject(err);
|
|
53
|
+
}
|
|
54
|
+
});
|
|
55
|
+
server.once('listening', () => {
|
|
56
|
+
server.close(() => resolve(true));
|
|
57
|
+
});
|
|
58
|
+
try {
|
|
59
|
+
server.listen(port, '127.0.0.1');
|
|
60
|
+
}
|
|
61
|
+
catch (err) {
|
|
62
|
+
reject(err);
|
|
63
|
+
}
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
/** Maximum number of ports to scan before giving up. */
|
|
67
|
+
const MAX_SCAN = 20;
|
|
68
|
+
/**
|
|
69
|
+
* Find the first available port starting from `startPort`.
|
|
70
|
+
* Scans up to MAX_SCAN ports. Returns `null` if no free port is found.
|
|
71
|
+
*/
|
|
72
|
+
async function findAvailablePort(startPort) {
|
|
73
|
+
for (let port = startPort; port < startPort + MAX_SCAN; port++) {
|
|
74
|
+
if (await isPortAvailable(port))
|
|
75
|
+
return port;
|
|
76
|
+
}
|
|
77
|
+
return null;
|
|
78
|
+
}
|
|
79
|
+
//# sourceMappingURL=port.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"port.js","sourceRoot":"","sources":["../../src/lib/port.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAOA,0CAmBC;AASD,8CAKC;AAxCD,8CAAgC;AAEhC;;;;GAIG;AACH,SAAgB,eAAe,CAAC,IAAY;IAC1C,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,MAAM,GAAG,GAAG,CAAC,YAAY,EAAE,CAAC;QAClC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,GAA0B,EAAE,EAAE;YAClD,IAAI,GAAG,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;gBAC9B,OAAO,CAAC,KAAK,CAAC,CAAC;YACjB,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,GAAG,CAAC,CAAC;YACd,CAAC;QACH,CAAC,CAAC,CAAC;QACH,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,EAAE;YAC5B,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;QACpC,CAAC,CAAC,CAAC;QACH,IAAI,CAAC;YACH,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;QACnC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,CAAC,GAAG,CAAC,CAAC;QACd,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC;AAED,wDAAwD;AACxD,MAAM,QAAQ,GAAG,EAAE,CAAC;AAEpB;;;GAGG;AACI,KAAK,UAAU,iBAAiB,CAAC,SAAiB;IACvD,KAAK,IAAI,IAAI,GAAG,SAAS,EAAE,IAAI,GAAG,SAAS,GAAG,QAAQ,EAAE,IAAI,EAAE,EAAE,CAAC;QAC/D,IAAI,MAAM,eAAe,CAAC,IAAI,CAAC;YAAE,OAAO,IAAI,CAAC;IAC/C,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
|
package/dist/lib/ui.d.ts
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export interface Spinner {
|
|
2
|
+
update(text: string): void;
|
|
3
|
+
stop(finalText?: string): void;
|
|
4
|
+
}
|
|
5
|
+
/**
|
|
6
|
+
* Stop the currently active spinner (if any).
|
|
7
|
+
* Used by the re-auth handler to clear the spinner before prompting.
|
|
8
|
+
*/
|
|
9
|
+
export declare function stopActiveSpinner(): void;
|
|
10
|
+
export declare function createSpinner(text: string, options?: {
|
|
11
|
+
silent?: boolean;
|
|
12
|
+
}): Spinner;
|
|
13
|
+
export declare function printBox(title: string, lines: string[]): void;
|
|
14
|
+
//# sourceMappingURL=ui.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ui.d.ts","sourceRoot":"","sources":["../../src/lib/ui.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,OAAO;IACtB,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAChC;AAID;;;GAGG;AACH,wBAAgB,iBAAiB,IAAI,IAAI,CAKxC;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;IAAE,MAAM,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,OAAO,CAyCnF;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,CAY7D"}
|
package/dist/lib/ui.js
ADDED
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.stopActiveSpinner = stopActiveSpinner;
|
|
4
|
+
exports.createSpinner = createSpinner;
|
|
5
|
+
exports.printBox = printBox;
|
|
6
|
+
const SPINNER_FRAMES = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'];
|
|
7
|
+
let activeSpinner = null;
|
|
8
|
+
/**
|
|
9
|
+
* Stop the currently active spinner (if any).
|
|
10
|
+
* Used by the re-auth handler to clear the spinner before prompting.
|
|
11
|
+
*/
|
|
12
|
+
function stopActiveSpinner() {
|
|
13
|
+
if (activeSpinner) {
|
|
14
|
+
activeSpinner.stop();
|
|
15
|
+
activeSpinner = null;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
function createSpinner(text, options) {
|
|
19
|
+
stopActiveSpinner();
|
|
20
|
+
const isTTY = process.stdout.isTTY === true;
|
|
21
|
+
if (options?.silent || !isTTY) {
|
|
22
|
+
if (!options?.silent) {
|
|
23
|
+
process.stderr.write(` ${text}\n`);
|
|
24
|
+
}
|
|
25
|
+
return {
|
|
26
|
+
update(t) {
|
|
27
|
+
if (!options?.silent)
|
|
28
|
+
process.stderr.write(` ${t}\n`);
|
|
29
|
+
},
|
|
30
|
+
stop(t) {
|
|
31
|
+
if (t && !options?.silent)
|
|
32
|
+
process.stderr.write(` ${t}\n`);
|
|
33
|
+
},
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
let frame = 0;
|
|
37
|
+
let currentText = text;
|
|
38
|
+
const interval = setInterval(() => {
|
|
39
|
+
const spinner = SPINNER_FRAMES[frame % SPINNER_FRAMES.length];
|
|
40
|
+
process.stdout.write(`\r \x1b[36m${spinner}\x1b[0m ${currentText}`);
|
|
41
|
+
frame++;
|
|
42
|
+
}, 80);
|
|
43
|
+
const spinner = {
|
|
44
|
+
update(t) {
|
|
45
|
+
currentText = t;
|
|
46
|
+
},
|
|
47
|
+
stop(finalText) {
|
|
48
|
+
clearInterval(interval);
|
|
49
|
+
process.stdout.write('\r\x1b[K');
|
|
50
|
+
if (finalText)
|
|
51
|
+
process.stdout.write(` ${finalText}\n`);
|
|
52
|
+
if (activeSpinner === spinner)
|
|
53
|
+
activeSpinner = null;
|
|
54
|
+
},
|
|
55
|
+
};
|
|
56
|
+
activeSpinner = spinner;
|
|
57
|
+
return spinner;
|
|
58
|
+
}
|
|
59
|
+
function printBox(title, lines) {
|
|
60
|
+
const maxLen = Math.max(title.length, ...lines.map((l) => stripAnsi(l).length));
|
|
61
|
+
const border = '─'.repeat(maxLen + 2);
|
|
62
|
+
process.stdout.write(`\n ┌${border}┐\n`);
|
|
63
|
+
process.stdout.write(` │ \x1b[1m${title.padEnd(maxLen)}\x1b[0m │\n`);
|
|
64
|
+
process.stdout.write(` ├${border}┤\n`);
|
|
65
|
+
for (const line of lines) {
|
|
66
|
+
const pad = maxLen - stripAnsi(line).length;
|
|
67
|
+
process.stdout.write(` │ ${line}${' '.repeat(pad)} │\n`);
|
|
68
|
+
}
|
|
69
|
+
process.stdout.write(` └${border}┘\n\n`);
|
|
70
|
+
}
|
|
71
|
+
function stripAnsi(str) {
|
|
72
|
+
// eslint-disable-next-line no-control-regex
|
|
73
|
+
return str.replace(/\x1b\[[0-9;]*m/g, '');
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=ui.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ui.js","sourceRoot":"","sources":["../../src/lib/ui.ts"],"names":[],"mappings":";;AAaA,8CAKC;AAED,sCAyCC;AAED,4BAYC;AA3ED,MAAM,cAAc,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;AAO1E,IAAI,aAAa,GAAmB,IAAI,CAAC;AAEzC;;;GAGG;AACH,SAAgB,iBAAiB;IAC/B,IAAI,aAAa,EAAE,CAAC;QAClB,aAAa,CAAC,IAAI,EAAE,CAAC;QACrB,aAAa,GAAG,IAAI,CAAC;IACvB,CAAC;AACH,CAAC;AAED,SAAgB,aAAa,CAAC,IAAY,EAAE,OAA8B;IACxE,iBAAiB,EAAE,CAAC;IACpB,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC,KAAK,KAAK,IAAI,CAAC;IAE5C,IAAI,OAAO,EAAE,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;QAC9B,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC;YACrB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC;QACtC,CAAC;QACD,OAAO;YACL,MAAM,CAAC,CAAS;gBACd,IAAI,CAAC,OAAO,EAAE,MAAM;oBAAE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACzD,CAAC;YACD,IAAI,CAAC,CAAU;gBACb,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM;oBAAE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAC9D,CAAC;SACF,CAAC;IACJ,CAAC;IAED,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,IAAI,WAAW,GAAG,IAAI,CAAC;IAEvB,MAAM,QAAQ,GAAG,WAAW,CAAC,GAAG,EAAE;QAChC,MAAM,OAAO,GAAG,cAAc,CAAC,KAAK,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC;QAC9D,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,eAAe,OAAO,WAAW,WAAW,EAAE,CAAC,CAAC;QACrE,KAAK,EAAE,CAAC;IACV,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,OAAO,GAAY;QACvB,MAAM,CAAC,CAAS;YACd,WAAW,GAAG,CAAC,CAAC;QAClB,CAAC;QACD,IAAI,CAAC,SAAkB;YACrB,aAAa,CAAC,QAAQ,CAAC,CAAC;YACxB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;YACjC,IAAI,SAAS;gBAAE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,SAAS,IAAI,CAAC,CAAC;YACxD,IAAI,aAAa,KAAK,OAAO;gBAAE,aAAa,GAAG,IAAI,CAAC;QACtD,CAAC;KACF,CAAC;IAEF,aAAa,GAAG,OAAO,CAAC;IACxB,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAgB,QAAQ,CAAC,KAAa,EAAE,KAAe;IACrD,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;IAChF,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAEtC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,MAAM,KAAK,CAAC,CAAC;IAC1C,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,cAAc,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;IACtE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,MAAM,KAAK,CAAC,CAAC;IACxC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,GAAG,GAAG,MAAM,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC;QAC5C,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAC5D,CAAC;IACD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,MAAM,OAAO,CAAC,CAAC;AAC5C,CAAC;AAED,SAAS,SAAS,CAAC,GAAW;IAC5B,4CAA4C;IAC5C,OAAO,GAAG,CAAC,OAAO,CAAC,iBAAiB,EAAE,EAAE,CAAC,CAAC;AAC5C,CAAC"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Validate an app name: alphanumeric, spaces, hyphens, dots, underscores,
|
|
3
|
+
* and accented/extended Latin characters only. Max 48 characters.
|
|
4
|
+
* Returns true if valid, or an error string for inquirer prompts.
|
|
5
|
+
*/
|
|
6
|
+
export declare function validateAppName(name: string): true | string;
|
|
7
|
+
/**
|
|
8
|
+
* Validate that a value is one of the allowed options.
|
|
9
|
+
* Throws CliError with a user-friendly message if invalid.
|
|
10
|
+
*/
|
|
11
|
+
export declare function validateEnum(value: string | undefined, allowed: readonly string[], flagName: string): void;
|
|
12
|
+
/**
|
|
13
|
+
* Validate that a string is a valid HTTP/HTTPS URL.
|
|
14
|
+
* Throws CliError if the format is invalid.
|
|
15
|
+
*/
|
|
16
|
+
export declare function validateUrl(value: string | undefined, fieldName: string): void;
|
|
17
|
+
/**
|
|
18
|
+
* Commander.js collect function for repeatable --redirect-url flags.
|
|
19
|
+
* Validates each URL and accumulates into an array.
|
|
20
|
+
*/
|
|
21
|
+
export declare function collectUrls(value: string, previous?: string[]): string[];
|
|
22
|
+
/**
|
|
23
|
+
* Validate that a value is a positive integer.
|
|
24
|
+
* Throws CliError if the value is not a valid positive integer.
|
|
25
|
+
*/
|
|
26
|
+
export declare function parsePositiveInt(value: string, flagName: string): number;
|
|
27
|
+
/**
|
|
28
|
+
* Parse and validate a `--app-id` flag value.
|
|
29
|
+
* Accepts any non-empty trimmed string (numeric or UUID).
|
|
30
|
+
*/
|
|
31
|
+
export declare function parseAppId(value: string): string;
|
|
32
|
+
//# sourceMappingURL=validators.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validators.d.ts","sourceRoot":"","sources":["../../src/lib/validators.ts"],"names":[],"mappings":"AAMA;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAQ3D;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAC1B,KAAK,EAAE,MAAM,GAAG,SAAS,EACzB,OAAO,EAAE,SAAS,MAAM,EAAE,EAC1B,QAAQ,EAAE,MAAM,GACf,IAAI,CAMN;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CAoB9E;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,GAAE,MAAM,EAAO,GAAG,MAAM,EAAE,CAG5E;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAMxE;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAMhD"}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.validateAppName = validateAppName;
|
|
4
|
+
exports.validateEnum = validateEnum;
|
|
5
|
+
exports.validateUrl = validateUrl;
|
|
6
|
+
exports.collectUrls = collectUrls;
|
|
7
|
+
exports.parsePositiveInt = parsePositiveInt;
|
|
8
|
+
exports.parseAppId = parseAppId;
|
|
9
|
+
const errors_1 = require("./errors");
|
|
10
|
+
const logger_1 = require("./logger");
|
|
11
|
+
const APP_NAME_MAX_LENGTH = 48;
|
|
12
|
+
const APP_NAME_REGEX = /^[a-zA-Z0-9 ._\-\u00C0-\u024F]+$/;
|
|
13
|
+
/**
|
|
14
|
+
* Validate an app name: alphanumeric, spaces, hyphens, dots, underscores,
|
|
15
|
+
* and accented/extended Latin characters only. Max 48 characters.
|
|
16
|
+
* Returns true if valid, or an error string for inquirer prompts.
|
|
17
|
+
*/
|
|
18
|
+
function validateAppName(name) {
|
|
19
|
+
const trimmed = name.trim();
|
|
20
|
+
if (trimmed.length === 0)
|
|
21
|
+
return 'App name cannot be empty.';
|
|
22
|
+
if (trimmed.length > APP_NAME_MAX_LENGTH)
|
|
23
|
+
return `App name must be at most ${APP_NAME_MAX_LENGTH} characters (got ${trimmed.length}).`;
|
|
24
|
+
if (!APP_NAME_REGEX.test(trimmed))
|
|
25
|
+
return 'App name can only contain letters, numbers, spaces, hyphens, dots, underscores, and accented characters.';
|
|
26
|
+
return true;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Validate that a value is one of the allowed options.
|
|
30
|
+
* Throws CliError with a user-friendly message if invalid.
|
|
31
|
+
*/
|
|
32
|
+
function validateEnum(value, allowed, flagName) {
|
|
33
|
+
if (value && !allowed.includes(value)) {
|
|
34
|
+
const msg = `Invalid ${flagName} "${value}". Must be one of: ${allowed.join(', ')}.`;
|
|
35
|
+
(0, logger_1.logInfo)(` ${msg}`);
|
|
36
|
+
throw new errors_1.CliError(msg);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Validate that a string is a valid HTTP/HTTPS URL.
|
|
41
|
+
* Throws CliError if the format is invalid.
|
|
42
|
+
*/
|
|
43
|
+
function validateUrl(value, fieldName) {
|
|
44
|
+
if (!value)
|
|
45
|
+
return;
|
|
46
|
+
// Reject whitespace and commas early — Node's URL parser silently percent-encodes
|
|
47
|
+
// spaces, so "http://a/cb, http://b/cb" parses as a single valid URL. That has let
|
|
48
|
+
// comma-separated values sneak into redirect_uris as one corrupted entry.
|
|
49
|
+
if (/[\s,]/.test(value)) {
|
|
50
|
+
const msg = `Invalid ${fieldName}: "${value}" contains whitespace or a comma. Pass each URL with a separate --redirect-url flag.`;
|
|
51
|
+
(0, logger_1.logInfo)(` ${msg}`);
|
|
52
|
+
throw new errors_1.CliError(msg);
|
|
53
|
+
}
|
|
54
|
+
try {
|
|
55
|
+
const parsed = new URL(value);
|
|
56
|
+
if (parsed.protocol !== 'http:' && parsed.protocol !== 'https:') {
|
|
57
|
+
throw new Error('bad protocol');
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
catch {
|
|
61
|
+
const msg = `Invalid ${fieldName}: "${value}" is not a valid HTTP/HTTPS URL.`;
|
|
62
|
+
(0, logger_1.logInfo)(` ${msg}`);
|
|
63
|
+
throw new errors_1.CliError(msg);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Commander.js collect function for repeatable --redirect-url flags.
|
|
68
|
+
* Validates each URL and accumulates into an array.
|
|
69
|
+
*/
|
|
70
|
+
function collectUrls(value, previous = []) {
|
|
71
|
+
validateUrl(value, 'redirect URL');
|
|
72
|
+
return [...previous, value];
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Validate that a value is a positive integer.
|
|
76
|
+
* Throws CliError if the value is not a valid positive integer.
|
|
77
|
+
*/
|
|
78
|
+
function parsePositiveInt(value, flagName) {
|
|
79
|
+
const n = Number.parseInt(value, 10);
|
|
80
|
+
if (!Number.isFinite(n) || n <= 0) {
|
|
81
|
+
throw new errors_1.CliError(`Invalid ${flagName}: "${value}" is not a positive integer.`);
|
|
82
|
+
}
|
|
83
|
+
return n;
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Parse and validate a `--app-id` flag value.
|
|
87
|
+
* Accepts any non-empty trimmed string (numeric or UUID).
|
|
88
|
+
*/
|
|
89
|
+
function parseAppId(value) {
|
|
90
|
+
const trimmed = value.trim();
|
|
91
|
+
if (trimmed.length === 0) {
|
|
92
|
+
throw new errors_1.CliError('Invalid --app-id: value cannot be empty.');
|
|
93
|
+
}
|
|
94
|
+
return trimmed;
|
|
95
|
+
}
|
|
96
|
+
//# sourceMappingURL=validators.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validators.js","sourceRoot":"","sources":["../../src/lib/validators.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { ApiClient } from '../api/client';
|
|
2
|
+
import { AccountResponse } from '../types';
|
|
3
|
+
export declare function createAccountService(client: ApiClient): {
|
|
4
|
+
validateApiKey(apiKey: string): Promise<AccountResponse>;
|
|
5
|
+
getAccount(): Promise<AccountResponse>;
|
|
6
|
+
};
|
|
7
|
+
export type AccountService = ReturnType<typeof createAccountService>;
|
|
8
|
+
//# sourceMappingURL=account.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"account.d.ts","sourceRoot":"","sources":["../../src/services/account.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAE1C,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAE3C,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS;2BAE3B,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC;kBAG1C,OAAO,CAAC,eAAe,CAAC;EAIzC;AAED,MAAM,MAAM,cAAc,GAAG,UAAU,CAAC,OAAO,oBAAoB,CAAC,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createAccountService = createAccountService;
|
|
4
|
+
const constants_1 = require("../lib/constants");
|
|
5
|
+
function createAccountService(client) {
|
|
6
|
+
return {
|
|
7
|
+
validateApiKey(apiKey) {
|
|
8
|
+
return client.getWithKey(constants_1.ENDPOINTS.ACCOUNT, apiKey);
|
|
9
|
+
},
|
|
10
|
+
getAccount() {
|
|
11
|
+
return client.get(constants_1.ENDPOINTS.ACCOUNT);
|
|
12
|
+
},
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=account.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"account.js","sourceRoot":"","sources":["../../src/services/account.ts"],"names":[],"mappings":";;AAIA,oDASC;AAZD,gDAA6C;AAG7C,SAAgB,oBAAoB,CAAC,MAAiB;IACpD,OAAO;QACL,cAAc,CAAC,MAAc;YAC3B,OAAO,MAAM,CAAC,UAAU,CAAkB,qBAAS,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QACvE,CAAC;QACD,UAAU;YACR,OAAO,MAAM,CAAC,GAAG,CAAkB,qBAAS,CAAC,OAAO,CAAC,CAAC;QACxD,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { ApiClient } from '../api/client';
|
|
2
|
+
import { OAuthApp, CreateAppResponse } from '../types';
|
|
3
|
+
export declare function createAppService(client: ApiClient): {
|
|
4
|
+
fetchAppsList: () => Promise<OAuthApp[]>;
|
|
5
|
+
fetchApp(appId: string): Promise<OAuthApp | null>;
|
|
6
|
+
pickApp(promptMessage: string, formatChoice?: (app: OAuthApp) => string): Promise<string>;
|
|
7
|
+
/**
|
|
8
|
+
* Fetch app from API and merge with local cache.
|
|
9
|
+
* The GET endpoint may not return client_secret (only shown at creation),
|
|
10
|
+
* so we fall back to the locally cached value.
|
|
11
|
+
*/
|
|
12
|
+
resolveAppCredentials(appId: string): Promise<{
|
|
13
|
+
app: OAuthApp;
|
|
14
|
+
diffs: string[];
|
|
15
|
+
} | null>;
|
|
16
|
+
/**
|
|
17
|
+
* Save credentials to local cache.
|
|
18
|
+
* Preserves existing local values when the app has missing fields
|
|
19
|
+
* (e.g. GET endpoint doesn't return client_secret).
|
|
20
|
+
*/
|
|
21
|
+
syncAppCredentials(appId: string, app: OAuthApp): void;
|
|
22
|
+
createApp(payload: {
|
|
23
|
+
name: string;
|
|
24
|
+
public: boolean;
|
|
25
|
+
redirect_uris?: string[];
|
|
26
|
+
scopes?: string[];
|
|
27
|
+
}): Promise<CreateAppResponse>;
|
|
28
|
+
updateApp(appId: string, body: {
|
|
29
|
+
name?: string;
|
|
30
|
+
redirect_uris: string[];
|
|
31
|
+
}): Promise<void>;
|
|
32
|
+
deleteApp(appId: string): Promise<void>;
|
|
33
|
+
};
|
|
34
|
+
export type AppService = ReturnType<typeof createAppService>;
|
|
35
|
+
//# sourceMappingURL=app.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../../src/services/app.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAO1C,OAAO,EAAE,QAAQ,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAYvD,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,SAAS;yBAChB,OAAO,CAAC,QAAQ,EAAE,CAAC;oBAQ3B,MAAM,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC;2BAMtC,MAAM,iBACN,CAAC,GAAG,EAAE,QAAQ,KAAK,MAAM,GACvC,OAAO,CAAC,MAAM,CAAC;IA2BlB;;;;OAIG;iCACgC,MAAM,GAAG,OAAO,CAAC;QAAE,GAAG,EAAE,QAAQ,CAAC;QAAC,KAAK,EAAE,MAAM,EAAE,CAAA;KAAE,GAAG,IAAI,CAAC;IAyB9F;;;;OAIG;8BACuB,MAAM,OAAO,QAAQ,GAAG,IAAI;uBAU7B;QACvB,IAAI,EAAE,MAAM,CAAC;QACb,MAAM,EAAE,OAAO,CAAC;QAChB,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;QACzB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;KACnB,GAAG,OAAO,CAAC,iBAAiB,CAAC;qBASrB,MAAM,QACP;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,EAAE,CAAA;KAAE,GAC/C,OAAO,CAAC,IAAI,CAAC;qBAIO,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;EAIhD;AAED,MAAM,MAAM,UAAU,GAAG,UAAU,CAAC,OAAO,gBAAgB,CAAC,CAAC"}
|