@otakit/cli 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +145 -0
- package/bin/otakit.js +3 -0
- package/dist/commands/config.d.ts +3 -0
- package/dist/commands/config.d.ts.map +1 -0
- package/dist/commands/config.js +115 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/delete.d.ts +3 -0
- package/dist/commands/delete.d.ts.map +1 -0
- package/dist/commands/delete.js +30 -0
- package/dist/commands/delete.js.map +1 -0
- package/dist/commands/generate-signing-key.d.ts +3 -0
- package/dist/commands/generate-signing-key.d.ts.map +1 -0
- package/dist/commands/generate-signing-key.js +41 -0
- package/dist/commands/generate-signing-key.js.map +1 -0
- package/dist/commands/list.d.ts +3 -0
- package/dist/commands/list.d.ts.map +1 -0
- package/dist/commands/list.js +30 -0
- package/dist/commands/list.js.map +1 -0
- package/dist/commands/login.d.ts +3 -0
- package/dist/commands/login.d.ts.map +1 -0
- package/dist/commands/login.js +79 -0
- package/dist/commands/login.js.map +1 -0
- package/dist/commands/logout.d.ts +3 -0
- package/dist/commands/logout.d.ts.map +1 -0
- package/dist/commands/logout.js +25 -0
- package/dist/commands/logout.js.map +1 -0
- package/dist/commands/register.d.ts +3 -0
- package/dist/commands/register.d.ts.map +1 -0
- package/dist/commands/register.js +77 -0
- package/dist/commands/register.js.map +1 -0
- package/dist/commands/release.d.ts +3 -0
- package/dist/commands/release.d.ts.map +1 -0
- package/dist/commands/release.js +40 -0
- package/dist/commands/release.js.map +1 -0
- package/dist/commands/releases.d.ts +3 -0
- package/dist/commands/releases.d.ts.map +1 -0
- package/dist/commands/releases.js +49 -0
- package/dist/commands/releases.js.map +1 -0
- package/dist/commands/upload.d.ts +3 -0
- package/dist/commands/upload.d.ts.map +1 -0
- package/dist/commands/upload.js +76 -0
- package/dist/commands/upload.js.map +1 -0
- package/dist/commands/whoami.d.ts +3 -0
- package/dist/commands/whoami.d.ts.map +1 -0
- package/dist/commands/whoami.js +43 -0
- package/dist/commands/whoami.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +32 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/api.d.ts +61 -0
- package/dist/lib/api.d.ts.map +1 -0
- package/dist/lib/api.js +102 -0
- package/dist/lib/api.js.map +1 -0
- package/dist/lib/capacitor-config.d.ts +11 -0
- package/dist/lib/capacitor-config.d.ts.map +1 -0
- package/dist/lib/capacitor-config.js +105 -0
- package/dist/lib/capacitor-config.js.map +1 -0
- package/dist/lib/config.d.ts +60 -0
- package/dist/lib/config.d.ts.map +1 -0
- package/dist/lib/config.js +253 -0
- package/dist/lib/config.js.map +1 -0
- package/dist/lib/errors.d.ts +6 -0
- package/dist/lib/errors.d.ts.map +1 -0
- package/dist/lib/errors.js +19 -0
- package/dist/lib/errors.js.map +1 -0
- package/dist/lib/hash.d.ts +9 -0
- package/dist/lib/hash.d.ts.map +1 -0
- package/dist/lib/hash.js +21 -0
- package/dist/lib/hash.js.map +1 -0
- package/dist/lib/http.d.ts +9 -0
- package/dist/lib/http.d.ts.map +1 -0
- package/dist/lib/http.js +43 -0
- package/dist/lib/http.js.map +1 -0
- package/dist/lib/prompt.d.ts +3 -0
- package/dist/lib/prompt.d.ts.map +1 -0
- package/dist/lib/prompt.js +23 -0
- package/dist/lib/prompt.js.map +1 -0
- package/dist/lib/token-store.d.ts +12 -0
- package/dist/lib/token-store.d.ts.map +1 -0
- package/dist/lib/token-store.js +151 -0
- package/dist/lib/token-store.js.map +1 -0
- package/dist/lib/upload-workflow.d.ts +27 -0
- package/dist/lib/upload-workflow.d.ts.map +1 -0
- package/dist/lib/upload-workflow.js +252 -0
- package/dist/lib/upload-workflow.js.map +1 -0
- package/dist/lib/validate.d.ts +3 -0
- package/dist/lib/validate.d.ts.map +1 -0
- package/dist/lib/validate.js +16 -0
- package/dist/lib/validate.js.map +1 -0
- package/dist/lib/version.d.ts +4 -0
- package/dist/lib/version.d.ts.map +1 -0
- package/dist/lib/version.js +24 -0
- package/dist/lib/version.js.map +1 -0
- package/dist/lib/zip.d.ts +8 -0
- package/dist/lib/zip.d.ts.map +1 -0
- package/dist/lib/zip.js +78 -0
- package/dist/lib/zip.js.map +1 -0
- package/package.json +63 -0
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
import { existsSync, readFileSync } from 'node:fs';
|
|
2
|
+
import { dirname, extname, resolve } from 'node:path';
|
|
3
|
+
export const CAPACITOR_CONFIG_FILE_NAMES = [
|
|
4
|
+
'capacitor.config.ts',
|
|
5
|
+
'capacitor.config.js',
|
|
6
|
+
'capacitor.config.mjs',
|
|
7
|
+
'capacitor.config.cjs',
|
|
8
|
+
'capacitor.config.json',
|
|
9
|
+
];
|
|
10
|
+
export function readCapacitorProjectConfig(cwd = process.cwd()) {
|
|
11
|
+
const configPath = findCapacitorConfigPath(cwd);
|
|
12
|
+
if (!configPath) {
|
|
13
|
+
return null;
|
|
14
|
+
}
|
|
15
|
+
const rawConfig = loadCapacitorConfigFile(configPath);
|
|
16
|
+
return extractProjectConfig(configPath, rawConfig);
|
|
17
|
+
}
|
|
18
|
+
export function findCapacitorConfigPath(cwd = process.cwd()) {
|
|
19
|
+
let currentDir = resolve(cwd);
|
|
20
|
+
while (true) {
|
|
21
|
+
for (const fileName of CAPACITOR_CONFIG_FILE_NAMES) {
|
|
22
|
+
const candidate = resolve(currentDir, fileName);
|
|
23
|
+
if (existsSync(candidate)) {
|
|
24
|
+
return candidate;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
const parentDir = dirname(currentDir);
|
|
28
|
+
if (parentDir === currentDir) {
|
|
29
|
+
return null;
|
|
30
|
+
}
|
|
31
|
+
currentDir = parentDir;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
function loadCapacitorConfigFile(configPath) {
|
|
35
|
+
const extension = extname(configPath).toLowerCase();
|
|
36
|
+
const source = readFileSync(configPath, 'utf-8');
|
|
37
|
+
if (extension === '.json') {
|
|
38
|
+
try {
|
|
39
|
+
return JSON.parse(source);
|
|
40
|
+
}
|
|
41
|
+
catch (error) {
|
|
42
|
+
const reason = error instanceof Error ? error.message : 'Unknown parse error';
|
|
43
|
+
throw new Error(`${configPath} is not valid JSON: ${reason}`);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
return evaluateCapacitorConfigModule(configPath, source);
|
|
47
|
+
}
|
|
48
|
+
function evaluateCapacitorConfigModule(configPath, source) {
|
|
49
|
+
let normalizedSource = source.replace(/^\uFEFF/, '');
|
|
50
|
+
normalizedSource = normalizedSource.replace(/^\s*import\s+type[\s\S]*?;?\s*$/gm, '');
|
|
51
|
+
normalizedSource = normalizedSource.replace(/\b(const|let|var)\s+([A-Za-z_$][\w$]*)\s*:\s*[^=;\n]+=/g, '$1 $2 =');
|
|
52
|
+
normalizedSource = normalizedSource.replace(/\s+satisfies\s+[^;\n]+/g, '');
|
|
53
|
+
normalizedSource = normalizedSource.replace(/\s+as\s+const\b/g, '');
|
|
54
|
+
if (/^\s*import\s/m.test(normalizedSource)) {
|
|
55
|
+
throw new Error(`${configPath} uses runtime imports. OtaKit can read capacitor config files that only use inline values, process.env, and type-only imports.`);
|
|
56
|
+
}
|
|
57
|
+
normalizedSource = normalizedSource.replace(/\bexport\s+default\b/, 'return');
|
|
58
|
+
normalizedSource = normalizedSource.replace(/\bmodule\.exports\s*=\s*/g, 'return ');
|
|
59
|
+
normalizedSource = normalizedSource.replace(/\bexports\.default\s*=\s*/g, 'return ');
|
|
60
|
+
try {
|
|
61
|
+
const evaluator = new Function('defineConfig', 'process', `"use strict";\n${normalizedSource}`);
|
|
62
|
+
return evaluator((value) => value, process);
|
|
63
|
+
}
|
|
64
|
+
catch (error) {
|
|
65
|
+
const reason = error instanceof Error ? error.message : 'Unknown evaluation error';
|
|
66
|
+
throw new Error(`${configPath} could not be evaluated. Keep capacitor config simple or use CLI flags/env overrides. ${reason}`);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
function extractProjectConfig(configPath, rawConfig) {
|
|
70
|
+
if (!isRecord(rawConfig)) {
|
|
71
|
+
throw new Error(`${configPath} must export a config object.`);
|
|
72
|
+
}
|
|
73
|
+
const plugins = asOptionalRecord(rawConfig.plugins, `${configPath}.plugins`);
|
|
74
|
+
const otaKitConfig = asOptionalRecord(plugins?.OtaKit, `${configPath}.plugins.OtaKit`);
|
|
75
|
+
return {
|
|
76
|
+
configPath,
|
|
77
|
+
appId: readOptionalString(otaKitConfig?.appId, `${configPath}.plugins.OtaKit.appId`),
|
|
78
|
+
channel: readOptionalString(otaKitConfig?.channel, `${configPath}.plugins.OtaKit.channel`),
|
|
79
|
+
configuredServerUrl: readOptionalString(otaKitConfig?.serverUrl, `${configPath}.plugins.OtaKit.serverUrl`),
|
|
80
|
+
outputDir: readOptionalString(rawConfig.webDir, `${configPath}.webDir`),
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
function asOptionalRecord(value, fieldPath) {
|
|
84
|
+
if (value === undefined) {
|
|
85
|
+
return undefined;
|
|
86
|
+
}
|
|
87
|
+
if (!isRecord(value)) {
|
|
88
|
+
throw new Error(`${fieldPath} must be an object.`);
|
|
89
|
+
}
|
|
90
|
+
return value;
|
|
91
|
+
}
|
|
92
|
+
function readOptionalString(value, fieldPath) {
|
|
93
|
+
if (value === undefined) {
|
|
94
|
+
return undefined;
|
|
95
|
+
}
|
|
96
|
+
if (typeof value !== 'string') {
|
|
97
|
+
throw new Error(`${fieldPath} must be a string.`);
|
|
98
|
+
}
|
|
99
|
+
const trimmed = value.trim();
|
|
100
|
+
return trimmed.length > 0 ? trimmed : undefined;
|
|
101
|
+
}
|
|
102
|
+
function isRecord(value) {
|
|
103
|
+
return value !== null && typeof value === 'object' && !Array.isArray(value);
|
|
104
|
+
}
|
|
105
|
+
//# sourceMappingURL=capacitor-config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"capacitor-config.js","sourceRoot":"","sources":["../../src/lib/capacitor-config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEtD,MAAM,CAAC,MAAM,2BAA2B,GAAG;IACzC,qBAAqB;IACrB,qBAAqB;IACrB,sBAAsB;IACtB,sBAAsB;IACtB,uBAAuB;CACf,CAAC;AAYX,MAAM,UAAU,0BAA0B,CACxC,MAAc,OAAO,CAAC,GAAG,EAAE;IAE3B,MAAM,UAAU,GAAG,uBAAuB,CAAC,GAAG,CAAC,CAAC;IAChD,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,SAAS,GAAG,uBAAuB,CAAC,UAAU,CAAC,CAAC;IACtD,OAAO,oBAAoB,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;AACrD,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,MAAc,OAAO,CAAC,GAAG,EAAE;IACjE,IAAI,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;IAE9B,OAAO,IAAI,EAAE,CAAC;QACZ,KAAK,MAAM,QAAQ,IAAI,2BAA2B,EAAE,CAAC;YACnD,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;YAChD,IAAI,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;gBAC1B,OAAO,SAAS,CAAC;YACnB,CAAC;QACH,CAAC;QAED,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;QACtC,IAAI,SAAS,KAAK,UAAU,EAAE,CAAC;YAC7B,OAAO,IAAI,CAAC;QACd,CAAC;QACD,UAAU,GAAG,SAAS,CAAC;IACzB,CAAC;AACH,CAAC;AAED,SAAS,uBAAuB,CAAC,UAAkB;IACjD,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC,WAAW,EAAE,CAAC;IACpD,MAAM,MAAM,GAAG,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;IAEjD,IAAI,SAAS,KAAK,OAAO,EAAE,CAAC;QAC1B,IAAI,CAAC;YACH,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAY,CAAC;QACvC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,MAAM,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,qBAAqB,CAAC;YAC9E,MAAM,IAAI,KAAK,CAAC,GAAG,UAAU,uBAAuB,MAAM,EAAE,CAAC,CAAC;QAChE,CAAC;IACH,CAAC;IAED,OAAO,6BAA6B,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;AAC3D,CAAC;AAED,SAAS,6BAA6B,CAAC,UAAkB,EAAE,MAAc;IACvE,IAAI,gBAAgB,GAAG,MAAM,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;IACrD,gBAAgB,GAAG,gBAAgB,CAAC,OAAO,CAAC,mCAAmC,EAAE,EAAE,CAAC,CAAC;IACrF,gBAAgB,GAAG,gBAAgB,CAAC,OAAO,CACzC,yDAAyD,EACzD,SAAS,CACV,CAAC;IACF,gBAAgB,GAAG,gBAAgB,CAAC,OAAO,CAAC,yBAAyB,EAAE,EAAE,CAAC,CAAC;IAC3E,gBAAgB,GAAG,gBAAgB,CAAC,OAAO,CAAC,kBAAkB,EAAE,EAAE,CAAC,CAAC;IAEpE,IAAI,eAAe,CAAC,IAAI,CAAC,gBAAgB,CAAC,EAAE,CAAC;QAC3C,MAAM,IAAI,KAAK,CACb,GAAG,UAAU,gIAAgI,CAC9I,CAAC;IACJ,CAAC;IAED,gBAAgB,GAAG,gBAAgB,CAAC,OAAO,CAAC,sBAAsB,EAAE,QAAQ,CAAC,CAAC;IAC9E,gBAAgB,GAAG,gBAAgB,CAAC,OAAO,CAAC,2BAA2B,EAAE,SAAS,CAAC,CAAC;IACpF,gBAAgB,GAAG,gBAAgB,CAAC,OAAO,CAAC,4BAA4B,EAAE,SAAS,CAAC,CAAC;IAErF,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,IAAI,QAAQ,CAC5B,cAAc,EACd,SAAS,EACT,kBAAkB,gBAAgB,EAAE,CACqC,CAAC;QAE5E,OAAO,SAAS,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IAC9C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,MAAM,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,0BAA0B,CAAC;QACnF,MAAM,IAAI,KAAK,CACb,GAAG,UAAU,yFAAyF,MAAM,EAAE,CAC/G,CAAC;IACJ,CAAC;AACH,CAAC;AAED,SAAS,oBAAoB,CAAC,UAAkB,EAAE,SAAkB;IAClE,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;QACzB,MAAM,IAAI,KAAK,CAAC,GAAG,UAAU,+BAA+B,CAAC,CAAC;IAChE,CAAC;IAED,MAAM,OAAO,GAAG,gBAAgB,CAAC,SAAS,CAAC,OAAO,EAAE,GAAG,UAAU,UAAU,CAAC,CAAC;IAC7E,MAAM,YAAY,GAAG,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,UAAU,iBAAiB,CAAC,CAAC;IAEvF,OAAO;QACL,UAAU;QACV,KAAK,EAAE,kBAAkB,CAAC,YAAY,EAAE,KAAK,EAAE,GAAG,UAAU,uBAAuB,CAAC;QACpF,OAAO,EAAE,kBAAkB,CAAC,YAAY,EAAE,OAAO,EAAE,GAAG,UAAU,yBAAyB,CAAC;QAC1F,mBAAmB,EAAE,kBAAkB,CACrC,YAAY,EAAE,SAAS,EACvB,GAAG,UAAU,2BAA2B,CACzC;QACD,SAAS,EAAE,kBAAkB,CAAC,SAAS,CAAC,MAAM,EAAE,GAAG,UAAU,SAAS,CAAC;KACxE,CAAC;AACJ,CAAC;AAED,SAAS,gBAAgB,CAAC,KAAc,EAAE,SAAiB;IACzD,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxB,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QACrB,MAAM,IAAI,KAAK,CAAC,GAAG,SAAS,qBAAqB,CAAC,CAAC;IACrD,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,kBAAkB,CAAC,KAAc,EAAE,SAAiB;IAC3D,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxB,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,MAAM,IAAI,KAAK,CAAC,GAAG,SAAS,oBAAoB,CAAC,CAAC;IACpD,CAAC;IAED,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAC7B,OAAO,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;AAClD,CAAC;AAED,SAAS,QAAQ,CAAC,KAAc;IAC9B,OAAO,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC9E,CAAC"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
export declare const PROJECT_CONFIG_LABEL = "capacitor.config.*";
|
|
2
|
+
export type AuthSource = 'env_token' | 'env_access_token' | 'file' | 'env_secret_key';
|
|
3
|
+
export type ConfigValueSource = 'flag' | 'env' | 'config' | 'default' | 'file' | 'none';
|
|
4
|
+
export interface ResolvedValue<T> {
|
|
5
|
+
value: T;
|
|
6
|
+
source: ConfigValueSource;
|
|
7
|
+
}
|
|
8
|
+
export interface ResolvedAuthToken {
|
|
9
|
+
token: string;
|
|
10
|
+
source: AuthSource;
|
|
11
|
+
}
|
|
12
|
+
export interface ServerAuthConfig {
|
|
13
|
+
serverUrl: string;
|
|
14
|
+
authToken: string;
|
|
15
|
+
authSource: AuthSource;
|
|
16
|
+
}
|
|
17
|
+
export interface ProjectConfig {
|
|
18
|
+
appId?: string;
|
|
19
|
+
channel?: string;
|
|
20
|
+
configuredServerUrl?: string;
|
|
21
|
+
outputDir?: string;
|
|
22
|
+
}
|
|
23
|
+
export interface CliConfig extends ServerAuthConfig {
|
|
24
|
+
appId: string;
|
|
25
|
+
channel?: string;
|
|
26
|
+
outputDir?: string;
|
|
27
|
+
}
|
|
28
|
+
export interface ConfigResolveOptions {
|
|
29
|
+
cwd?: string;
|
|
30
|
+
appId?: string;
|
|
31
|
+
serverUrl?: string;
|
|
32
|
+
outputDir?: string;
|
|
33
|
+
channel?: string;
|
|
34
|
+
requireProjectConfig?: boolean;
|
|
35
|
+
}
|
|
36
|
+
export interface ConfigResolveSnapshot {
|
|
37
|
+
configFile: {
|
|
38
|
+
path: string;
|
|
39
|
+
found: boolean;
|
|
40
|
+
};
|
|
41
|
+
appId: ResolvedValue<string | null>;
|
|
42
|
+
serverUrl: ResolvedValue<string>;
|
|
43
|
+
outputDir: ResolvedValue<string | null>;
|
|
44
|
+
channel: ResolvedValue<string | null>;
|
|
45
|
+
authToken: ResolvedValue<string | null>;
|
|
46
|
+
authSource: AuthSource | null;
|
|
47
|
+
}
|
|
48
|
+
export declare function normalizeServerUrl(url: string): string;
|
|
49
|
+
export declare function resolveServerUrl(_cwd?: string, explicitServerUrl?: string, configuredServerUrl?: string): string;
|
|
50
|
+
export declare function resolveAuthToken(serverUrl: string): Promise<ResolvedAuthToken | null>;
|
|
51
|
+
export declare function requireServerAndAuth(options?: {
|
|
52
|
+
cwd?: string;
|
|
53
|
+
serverUrl?: string;
|
|
54
|
+
projectServerUrl?: string;
|
|
55
|
+
}): Promise<ServerAuthConfig>;
|
|
56
|
+
export declare function readProjectConfig(cwd?: string): ProjectConfig | null;
|
|
57
|
+
export declare function requireProjectConfig(cwd?: string): ProjectConfig;
|
|
58
|
+
export declare function resolveConfigSnapshot(options?: ConfigResolveOptions): Promise<ConfigResolveSnapshot>;
|
|
59
|
+
export declare function requireConfig(options?: ConfigResolveOptions): Promise<CliConfig>;
|
|
60
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,253 @@
|
|
|
1
|
+
import { resolve } from 'node:path';
|
|
2
|
+
import { CAPACITOR_CONFIG_FILE_NAMES, readCapacitorProjectConfig } from './capacitor-config.js';
|
|
3
|
+
import { readStoredAccessToken } from './token-store.js';
|
|
4
|
+
const API_PATH_SUFFIX = '/api/v1';
|
|
5
|
+
const DEFAULT_SERVER_URL = 'https://www.otakit.app';
|
|
6
|
+
export const PROJECT_CONFIG_LABEL = 'capacitor.config.*';
|
|
7
|
+
const HOSTED_PRIMARY_HOST = 'otakit.app';
|
|
8
|
+
const HOSTED_CANONICAL_HOST = 'www.otakit.app';
|
|
9
|
+
export function normalizeServerUrl(url) {
|
|
10
|
+
const trimmed = url.trim().replace(/\/+$/, '');
|
|
11
|
+
const withoutApiPath = trimmed.endsWith(API_PATH_SUFFIX)
|
|
12
|
+
? trimmed.slice(0, -API_PATH_SUFFIX.length)
|
|
13
|
+
: trimmed;
|
|
14
|
+
try {
|
|
15
|
+
const parsed = new URL(withoutApiPath);
|
|
16
|
+
if (parsed.hostname === HOSTED_PRIMARY_HOST) {
|
|
17
|
+
parsed.hostname = HOSTED_CANONICAL_HOST;
|
|
18
|
+
}
|
|
19
|
+
return parsed.toString().replace(/\/+$/, '');
|
|
20
|
+
}
|
|
21
|
+
catch {
|
|
22
|
+
return withoutApiPath;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
function toNonEmptyString(value) {
|
|
26
|
+
if (value === undefined) {
|
|
27
|
+
return undefined;
|
|
28
|
+
}
|
|
29
|
+
const trimmed = value.trim();
|
|
30
|
+
return trimmed.length > 0 ? trimmed : undefined;
|
|
31
|
+
}
|
|
32
|
+
function validateServerUrl(rawServerUrl) {
|
|
33
|
+
const serverUrl = normalizeServerUrl(rawServerUrl);
|
|
34
|
+
try {
|
|
35
|
+
new URL(serverUrl);
|
|
36
|
+
}
|
|
37
|
+
catch {
|
|
38
|
+
throw new Error(`Invalid server URL "${rawServerUrl}". Set OTAKIT_SERVER_URL to a valid URL.`);
|
|
39
|
+
}
|
|
40
|
+
return serverUrl;
|
|
41
|
+
}
|
|
42
|
+
export function resolveServerUrl(_cwd = process.cwd(), explicitServerUrl, configuredServerUrl) {
|
|
43
|
+
const rawServerUrl = toNonEmptyString(explicitServerUrl) ??
|
|
44
|
+
toNonEmptyString(process.env.OTAKIT_SERVER_URL) ??
|
|
45
|
+
toNonEmptyString(configuredServerUrl) ??
|
|
46
|
+
DEFAULT_SERVER_URL;
|
|
47
|
+
return validateServerUrl(rawServerUrl);
|
|
48
|
+
}
|
|
49
|
+
export async function resolveAuthToken(serverUrl) {
|
|
50
|
+
const token = toNonEmptyString(process.env.OTAKIT_TOKEN);
|
|
51
|
+
if (token) {
|
|
52
|
+
return { token, source: 'env_token' };
|
|
53
|
+
}
|
|
54
|
+
const accessToken = toNonEmptyString(process.env.OTAKIT_ACCESS_TOKEN);
|
|
55
|
+
if (accessToken) {
|
|
56
|
+
return { token: accessToken, source: 'env_access_token' };
|
|
57
|
+
}
|
|
58
|
+
const storedToken = await readStoredAccessToken(serverUrl);
|
|
59
|
+
if (storedToken) {
|
|
60
|
+
return { token: storedToken, source: 'file' };
|
|
61
|
+
}
|
|
62
|
+
const secretKey = toNonEmptyString(process.env.OTAKIT_SECRET_KEY);
|
|
63
|
+
if (secretKey) {
|
|
64
|
+
return { token: secretKey, source: 'env_secret_key' };
|
|
65
|
+
}
|
|
66
|
+
return null;
|
|
67
|
+
}
|
|
68
|
+
export async function requireServerAndAuth(options) {
|
|
69
|
+
const cwd = options?.cwd ?? process.cwd();
|
|
70
|
+
const serverUrl = resolveServerUrl(cwd, options?.serverUrl, options?.projectServerUrl);
|
|
71
|
+
const auth = await resolveAuthToken(serverUrl);
|
|
72
|
+
if (!auth) {
|
|
73
|
+
throw new Error([
|
|
74
|
+
'Missing authentication:',
|
|
75
|
+
'- Run `otakit login` (stores token in local config)',
|
|
76
|
+
'- or set OTAKIT_TOKEN env var',
|
|
77
|
+
'- OTAKIT_ACCESS_TOKEN / OTAKIT_SECRET_KEY are also supported',
|
|
78
|
+
].join('\n'));
|
|
79
|
+
}
|
|
80
|
+
return {
|
|
81
|
+
serverUrl,
|
|
82
|
+
authToken: auth.token,
|
|
83
|
+
authSource: auth.source,
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
export function readProjectConfig(cwd = process.cwd()) {
|
|
87
|
+
const projectConfig = readCapacitorProjectConfig(cwd);
|
|
88
|
+
if (!projectConfig) {
|
|
89
|
+
return null;
|
|
90
|
+
}
|
|
91
|
+
return {
|
|
92
|
+
appId: projectConfig.appId,
|
|
93
|
+
channel: projectConfig.channel,
|
|
94
|
+
configuredServerUrl: projectConfig.configuredServerUrl
|
|
95
|
+
? parseServerUrl(projectConfig.configuredServerUrl, cwd)
|
|
96
|
+
: undefined,
|
|
97
|
+
outputDir: projectConfig.outputDir,
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
export function requireProjectConfig(cwd = process.cwd()) {
|
|
101
|
+
const config = readProjectConfig(cwd);
|
|
102
|
+
if (!config) {
|
|
103
|
+
throw new Error([
|
|
104
|
+
`No ${PROJECT_CONFIG_LABEL} found in the current directory or its parents.`,
|
|
105
|
+
'- Add plugins.OtaKit to capacitor.config.ts',
|
|
106
|
+
'- or pass CLI flags / environment variables directly',
|
|
107
|
+
].join('\n'));
|
|
108
|
+
}
|
|
109
|
+
return config;
|
|
110
|
+
}
|
|
111
|
+
function resolveEnvOutputDir() {
|
|
112
|
+
return (toNonEmptyString(process.env.OTAKIT_BUILD_DIR) ??
|
|
113
|
+
toNonEmptyString(process.env.OTAKIT_OUTPUT_DIR));
|
|
114
|
+
}
|
|
115
|
+
function toAuthValueSource(source) {
|
|
116
|
+
if (!source) {
|
|
117
|
+
return 'none';
|
|
118
|
+
}
|
|
119
|
+
if (source === 'file') {
|
|
120
|
+
return 'file';
|
|
121
|
+
}
|
|
122
|
+
return 'env';
|
|
123
|
+
}
|
|
124
|
+
export async function resolveConfigSnapshot(options) {
|
|
125
|
+
const cwd = options?.cwd ?? process.cwd();
|
|
126
|
+
const capacitorProjectConfig = readCapacitorProjectConfig(cwd);
|
|
127
|
+
const configPath = capacitorProjectConfig?.configPath ?? resolve(cwd, CAPACITOR_CONFIG_FILE_NAMES[0]);
|
|
128
|
+
const projectConfig = readProjectConfig(cwd);
|
|
129
|
+
if (options?.requireProjectConfig && !projectConfig) {
|
|
130
|
+
throw new Error([
|
|
131
|
+
`No ${PROJECT_CONFIG_LABEL} found in the current directory or its parents.`,
|
|
132
|
+
'- Add plugins.OtaKit to capacitor.config.ts',
|
|
133
|
+
'- or pass CLI flags / environment variables directly',
|
|
134
|
+
].join('\n'));
|
|
135
|
+
}
|
|
136
|
+
const appIdFromFlag = toNonEmptyString(options?.appId);
|
|
137
|
+
const appIdFromEnv = toNonEmptyString(process.env.OTAKIT_APP_ID);
|
|
138
|
+
const appIdFromConfig = projectConfig?.appId;
|
|
139
|
+
const appIdValue = appIdFromFlag ?? appIdFromEnv ?? appIdFromConfig ?? null;
|
|
140
|
+
const appIdSource = appIdFromFlag
|
|
141
|
+
? 'flag'
|
|
142
|
+
: appIdFromEnv
|
|
143
|
+
? 'env'
|
|
144
|
+
: appIdFromConfig
|
|
145
|
+
? 'config'
|
|
146
|
+
: 'none';
|
|
147
|
+
const channelFromFlag = toNonEmptyString(options?.channel);
|
|
148
|
+
const channelFromConfig = projectConfig?.channel;
|
|
149
|
+
const channelValue = channelFromFlag ?? channelFromConfig ?? null;
|
|
150
|
+
const channelSource = channelFromFlag
|
|
151
|
+
? 'flag'
|
|
152
|
+
: channelFromConfig
|
|
153
|
+
? 'config'
|
|
154
|
+
: 'none';
|
|
155
|
+
const outputDirFromFlag = toNonEmptyString(options?.outputDir);
|
|
156
|
+
const outputDirFromEnv = resolveEnvOutputDir();
|
|
157
|
+
const outputDirFromConfig = projectConfig?.outputDir;
|
|
158
|
+
const outputDirValue = outputDirFromFlag ?? outputDirFromEnv ?? outputDirFromConfig ?? null;
|
|
159
|
+
const outputDirSource = outputDirFromFlag
|
|
160
|
+
? 'flag'
|
|
161
|
+
: outputDirFromEnv
|
|
162
|
+
? 'env'
|
|
163
|
+
: outputDirFromConfig
|
|
164
|
+
? 'config'
|
|
165
|
+
: 'none';
|
|
166
|
+
const serverFromFlag = toNonEmptyString(options?.serverUrl);
|
|
167
|
+
const serverFromEnv = toNonEmptyString(process.env.OTAKIT_SERVER_URL);
|
|
168
|
+
const serverFromConfig = toNonEmptyString(projectConfig?.configuredServerUrl);
|
|
169
|
+
const serverRaw = serverFromFlag ?? serverFromEnv ?? serverFromConfig ?? DEFAULT_SERVER_URL;
|
|
170
|
+
const serverValue = validateServerUrl(serverRaw);
|
|
171
|
+
const serverSource = serverFromFlag
|
|
172
|
+
? 'flag'
|
|
173
|
+
: serverFromEnv
|
|
174
|
+
? 'env'
|
|
175
|
+
: serverFromConfig
|
|
176
|
+
? 'config'
|
|
177
|
+
: 'default';
|
|
178
|
+
const auth = await resolveAuthToken(serverValue);
|
|
179
|
+
const authTokenValue = auth?.token ?? null;
|
|
180
|
+
const authTokenSource = toAuthValueSource(auth?.source ?? null);
|
|
181
|
+
return {
|
|
182
|
+
configFile: {
|
|
183
|
+
path: configPath,
|
|
184
|
+
found: capacitorProjectConfig !== null,
|
|
185
|
+
},
|
|
186
|
+
appId: {
|
|
187
|
+
value: appIdValue,
|
|
188
|
+
source: appIdSource,
|
|
189
|
+
},
|
|
190
|
+
serverUrl: {
|
|
191
|
+
value: serverValue,
|
|
192
|
+
source: serverSource,
|
|
193
|
+
},
|
|
194
|
+
outputDir: {
|
|
195
|
+
value: outputDirValue,
|
|
196
|
+
source: outputDirSource,
|
|
197
|
+
},
|
|
198
|
+
channel: {
|
|
199
|
+
value: channelValue,
|
|
200
|
+
source: channelSource,
|
|
201
|
+
},
|
|
202
|
+
authToken: {
|
|
203
|
+
value: authTokenValue,
|
|
204
|
+
source: authTokenSource,
|
|
205
|
+
},
|
|
206
|
+
authSource: auth?.source ?? null,
|
|
207
|
+
};
|
|
208
|
+
}
|
|
209
|
+
export async function requireConfig(options) {
|
|
210
|
+
const snapshot = await resolveConfigSnapshot(options);
|
|
211
|
+
if (!snapshot.authToken.value || !snapshot.authSource) {
|
|
212
|
+
throw new Error([
|
|
213
|
+
'Missing authentication:',
|
|
214
|
+
'- Run `otakit login` (stores token in local config)',
|
|
215
|
+
'- or set OTAKIT_TOKEN env var',
|
|
216
|
+
'- OTAKIT_ACCESS_TOKEN / OTAKIT_SECRET_KEY are also supported',
|
|
217
|
+
].join('\n'));
|
|
218
|
+
}
|
|
219
|
+
if (!snapshot.appId.value) {
|
|
220
|
+
throw new Error([
|
|
221
|
+
'Missing app ID:',
|
|
222
|
+
'- Pass --app-id <id>',
|
|
223
|
+
'- or set OTAKIT_APP_ID in your environment',
|
|
224
|
+
'- or add plugins.OtaKit.appId to capacitor.config.ts',
|
|
225
|
+
].join('\n'));
|
|
226
|
+
}
|
|
227
|
+
return {
|
|
228
|
+
appId: snapshot.appId.value,
|
|
229
|
+
channel: snapshot.channel.value ?? undefined,
|
|
230
|
+
outputDir: snapshot.outputDir.value ?? undefined,
|
|
231
|
+
serverUrl: snapshot.serverUrl.value,
|
|
232
|
+
authToken: snapshot.authToken.value,
|
|
233
|
+
authSource: snapshot.authSource,
|
|
234
|
+
};
|
|
235
|
+
}
|
|
236
|
+
function parseServerUrl(value, cwd) {
|
|
237
|
+
if (value === undefined) {
|
|
238
|
+
return undefined;
|
|
239
|
+
}
|
|
240
|
+
const raw = toTrimmedString(value);
|
|
241
|
+
if (!raw) {
|
|
242
|
+
throw new Error(`"${PROJECT_CONFIG_LABEL}".serverUrl must be a non-empty string.`);
|
|
243
|
+
}
|
|
244
|
+
return resolveServerUrl(cwd, raw);
|
|
245
|
+
}
|
|
246
|
+
function toTrimmedString(value) {
|
|
247
|
+
if (typeof value !== 'string') {
|
|
248
|
+
return undefined;
|
|
249
|
+
}
|
|
250
|
+
const trimmed = value.trim();
|
|
251
|
+
return trimmed.length > 0 ? trimmed : undefined;
|
|
252
|
+
}
|
|
253
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/lib/errors.ts"],"names":[],"mappings":"AAAA,qBAAa,QAAS,SAAQ,KAAK;IACjC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;gBAEd,OAAO,EAAE,MAAM,EAAE,QAAQ,GAAE,MAAU;CAIlD;AAED,wBAAsB,UAAU,CAAC,MAAM,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CASlF"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export class CliError extends Error {
|
|
2
|
+
exitCode;
|
|
3
|
+
constructor(message, exitCode = 1) {
|
|
4
|
+
super(message);
|
|
5
|
+
this.exitCode = exitCode;
|
|
6
|
+
}
|
|
7
|
+
}
|
|
8
|
+
export async function runCommand(action) {
|
|
9
|
+
try {
|
|
10
|
+
await action();
|
|
11
|
+
}
|
|
12
|
+
catch (error) {
|
|
13
|
+
const message = error instanceof Error ? error.message : 'Unknown command error';
|
|
14
|
+
const exitCode = error instanceof CliError ? error.exitCode : 1;
|
|
15
|
+
console.error(message);
|
|
16
|
+
process.exitCode = exitCode;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/lib/errors.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,QAAS,SAAQ,KAAK;IACxB,QAAQ,CAAS;IAE1B,YAAY,OAAe,EAAE,WAAmB,CAAC;QAC/C,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC3B,CAAC;CACF;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,MAAkC;IACjE,IAAI,CAAC;QACH,MAAM,MAAM,EAAE,CAAC;IACjB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,uBAAuB,CAAC;QACjF,MAAM,QAAQ,GAAG,KAAK,YAAY,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;QAChE,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACvB,OAAO,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC9B,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Calculate SHA-256 hash of a file
|
|
3
|
+
*/
|
|
4
|
+
export declare function hashFile(filePath: string): Promise<string>;
|
|
5
|
+
/**
|
|
6
|
+
* Calculate SHA-256 hash of a buffer
|
|
7
|
+
*/
|
|
8
|
+
export declare function hashBuffer(buffer: Buffer): string;
|
|
9
|
+
//# sourceMappingURL=hash.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hash.d.ts","sourceRoot":"","sources":["../../src/lib/hash.ts"],"names":[],"mappings":"AAGA;;GAEG;AACH,wBAAsB,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAShE;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAEjD"}
|
package/dist/lib/hash.js
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { createHash } from 'node:crypto';
|
|
2
|
+
import { createReadStream } from 'node:fs';
|
|
3
|
+
/**
|
|
4
|
+
* Calculate SHA-256 hash of a file
|
|
5
|
+
*/
|
|
6
|
+
export async function hashFile(filePath) {
|
|
7
|
+
return new Promise((resolve, reject) => {
|
|
8
|
+
const hash = createHash('sha256');
|
|
9
|
+
const stream = createReadStream(filePath);
|
|
10
|
+
stream.on('data', (data) => hash.update(data));
|
|
11
|
+
stream.on('end', () => resolve(hash.digest('hex')));
|
|
12
|
+
stream.on('error', reject);
|
|
13
|
+
});
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Calculate SHA-256 hash of a buffer
|
|
17
|
+
*/
|
|
18
|
+
export function hashBuffer(buffer) {
|
|
19
|
+
return createHash('sha256').update(buffer).digest('hex');
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=hash.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hash.js","sourceRoot":"","sources":["../../src/lib/hash.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAE3C;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,QAAgB;IAC7C,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,IAAI,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC;QAClC,MAAM,MAAM,GAAG,gBAAgB,CAAC,QAAQ,CAAC,CAAC;QAE1C,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;QAC/C,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACpD,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IAC7B,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,UAAU,CAAC,MAAc;IACvC,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC3D,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export declare const DEFAULT_API_TIMEOUT_MS = 30000;
|
|
2
|
+
type FetchCliConfig = {
|
|
3
|
+
timeoutMs?: number;
|
|
4
|
+
userAgent?: string;
|
|
5
|
+
};
|
|
6
|
+
export declare function fetchCli(url: string, options?: RequestInit, config?: FetchCliConfig): Promise<Response>;
|
|
7
|
+
export declare function parseApiError(response: Response): Promise<string>;
|
|
8
|
+
export {};
|
|
9
|
+
//# sourceMappingURL=http.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../src/lib/http.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,sBAAsB,QAAS,CAAC;AAE7C,KAAK,cAAc,GAAG;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,wBAAsB,QAAQ,CAC5B,GAAG,EAAE,MAAM,EACX,OAAO,GAAE,WAAgB,EACzB,MAAM,GAAE,cAAmB,GAC1B,OAAO,CAAC,QAAQ,CAAC,CAqBnB;AAED,wBAAsB,aAAa,CAAC,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,CAsBvE"}
|
package/dist/lib/http.js
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { CliError } from './errors.js';
|
|
2
|
+
import { CLI_VERSION, getCliUserAgent } from './version.js';
|
|
3
|
+
export const DEFAULT_API_TIMEOUT_MS = 30_000;
|
|
4
|
+
export async function fetchCli(url, options = {}, config = {}) {
|
|
5
|
+
const controller = new AbortController();
|
|
6
|
+
const timeoutMs = config.timeoutMs ?? DEFAULT_API_TIMEOUT_MS;
|
|
7
|
+
const timeoutId = setTimeout(() => controller.abort(), timeoutMs);
|
|
8
|
+
const headers = new Headers(options.headers);
|
|
9
|
+
headers.set('User-Agent', config.userAgent ?? getCliUserAgent(CLI_VERSION));
|
|
10
|
+
try {
|
|
11
|
+
return await fetch(url, {
|
|
12
|
+
...options,
|
|
13
|
+
signal: controller.signal,
|
|
14
|
+
headers,
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
catch (error) {
|
|
18
|
+
if (error instanceof Error && error.name === 'AbortError') {
|
|
19
|
+
throw new CliError(`Request timed out after ${Math.ceil(timeoutMs / 1000)}s.`);
|
|
20
|
+
}
|
|
21
|
+
throw error;
|
|
22
|
+
}
|
|
23
|
+
finally {
|
|
24
|
+
clearTimeout(timeoutId);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
export async function parseApiError(response) {
|
|
28
|
+
const contentType = response.headers.get('content-type') ?? '';
|
|
29
|
+
const isJson = contentType.includes('application/json');
|
|
30
|
+
if (!isJson) {
|
|
31
|
+
const text = await response.text();
|
|
32
|
+
return text.trim().length > 0 ? text : `API error (${response.status})`;
|
|
33
|
+
}
|
|
34
|
+
const payload = (await response.json());
|
|
35
|
+
if (typeof payload.message === 'string' && payload.message.trim().length > 0) {
|
|
36
|
+
return payload.message;
|
|
37
|
+
}
|
|
38
|
+
if (typeof payload.error === 'string' && payload.error.trim().length > 0) {
|
|
39
|
+
return payload.error;
|
|
40
|
+
}
|
|
41
|
+
return `API error (${response.status})`;
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=http.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http.js","sourceRoot":"","sources":["../../src/lib/http.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAE5D,MAAM,CAAC,MAAM,sBAAsB,GAAG,MAAM,CAAC;AAO7C,MAAM,CAAC,KAAK,UAAU,QAAQ,CAC5B,GAAW,EACX,UAAuB,EAAE,EACzB,SAAyB,EAAE;IAE3B,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;IACzC,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,IAAI,sBAAsB,CAAC;IAC7D,MAAM,SAAS,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,SAAS,CAAC,CAAC;IAClE,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAC7C,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE,MAAM,CAAC,SAAS,IAAI,eAAe,CAAC,WAAW,CAAC,CAAC,CAAC;IAE5E,IAAI,CAAC;QACH,OAAO,MAAM,KAAK,CAAC,GAAG,EAAE;YACtB,GAAG,OAAO;YACV,MAAM,EAAE,UAAU,CAAC,MAAM;YACzB,OAAO;SACR,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;YAC1D,MAAM,IAAI,QAAQ,CAAC,2BAA2B,IAAI,CAAC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC;QACjF,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;YAAS,CAAC;QACT,YAAY,CAAC,SAAS,CAAC,CAAC;IAC1B,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,QAAkB;IACpD,MAAM,WAAW,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC;IAC/D,MAAM,MAAM,GAAG,WAAW,CAAC,QAAQ,CAAC,kBAAkB,CAAC,CAAC;IAExD,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QACnC,OAAO,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,cAAc,QAAQ,CAAC,MAAM,GAAG,CAAC;IAC1E,CAAC;IAED,MAAM,OAAO,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAGrC,CAAC;IAEF,IAAI,OAAO,OAAO,CAAC,OAAO,KAAK,QAAQ,IAAI,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC7E,OAAO,OAAO,CAAC,OAAO,CAAC;IACzB,CAAC;IACD,IAAI,OAAO,OAAO,CAAC,KAAK,KAAK,QAAQ,IAAI,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACzE,OAAO,OAAO,CAAC,KAAK,CAAC;IACvB,CAAC;IAED,OAAO,cAAc,QAAQ,CAAC,MAAM,GAAG,CAAC;AAC1C,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompt.d.ts","sourceRoot":"","sources":["../../src/lib/prompt.ts"],"names":[],"mappings":"AAGA,wBAAsB,GAAG,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAO1D;AAED,wBAAsB,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAS/D"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { createInterface } from 'node:readline/promises';
|
|
2
|
+
import { stdin as input, stdout as output } from 'node:process';
|
|
3
|
+
export async function ask(message) {
|
|
4
|
+
const prompt = createInterface({ input, output });
|
|
5
|
+
try {
|
|
6
|
+
return await prompt.question(message);
|
|
7
|
+
}
|
|
8
|
+
finally {
|
|
9
|
+
prompt.close();
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
export async function confirm(message) {
|
|
13
|
+
const prompt = createInterface({ input, output });
|
|
14
|
+
try {
|
|
15
|
+
const answer = await prompt.question(`${message} [y/N] `);
|
|
16
|
+
const normalized = answer.trim().toLowerCase();
|
|
17
|
+
return normalized === 'y' || normalized === 'yes';
|
|
18
|
+
}
|
|
19
|
+
finally {
|
|
20
|
+
prompt.close();
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=prompt.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompt.js","sourceRoot":"","sources":["../../src/lib/prompt.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,KAAK,IAAI,KAAK,EAAE,MAAM,IAAI,MAAM,EAAE,MAAM,cAAc,CAAC;AAEhE,MAAM,CAAC,KAAK,UAAU,GAAG,CAAC,OAAe;IACvC,MAAM,MAAM,GAAG,eAAe,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;IAClD,IAAI,CAAC;QACH,OAAO,MAAM,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IACxC,CAAC;YAAS,CAAC;QACT,MAAM,CAAC,KAAK,EAAE,CAAC;IACjB,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,OAAe;IAC3C,MAAM,MAAM,GAAG,eAAe,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;IAClD,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,GAAG,OAAO,SAAS,CAAC,CAAC;QAC1D,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QAC/C,OAAO,UAAU,KAAK,GAAG,IAAI,UAAU,KAAK,KAAK,CAAC;IACpD,CAAC;YAAS,CAAC;QACT,MAAM,CAAC,KAAK,EAAE,CAAC;IACjB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
type TokenStoreOperationResult = {
|
|
2
|
+
ok: boolean;
|
|
3
|
+
reason?: string;
|
|
4
|
+
};
|
|
5
|
+
type TokenDeleteResult = TokenStoreOperationResult & {
|
|
6
|
+
deleted: boolean;
|
|
7
|
+
};
|
|
8
|
+
export declare function readStoredAccessToken(serverUrl: string): Promise<string | null>;
|
|
9
|
+
export declare function storeAccessToken(serverUrl: string, token: string): Promise<TokenStoreOperationResult>;
|
|
10
|
+
export declare function clearStoredAccessToken(serverUrl: string): Promise<TokenDeleteResult>;
|
|
11
|
+
export {};
|
|
12
|
+
//# sourceMappingURL=token-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"token-store.d.ts","sourceRoot":"","sources":["../../src/lib/token-store.ts"],"names":[],"mappings":"AAIA,KAAK,yBAAyB,GAAG;IAC/B,EAAE,EAAE,OAAO,CAAC;IACZ,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,KAAK,iBAAiB,GAAG,yBAAyB,GAAG;IACnD,OAAO,EAAE,OAAO,CAAC;CAClB,CAAC;AAuDF,wBAAsB,qBAAqB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CA8BrF;AAED,wBAAsB,gBAAgB,CACpC,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,yBAAyB,CAAC,CA0BpC;AAED,wBAAsB,sBAAsB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAkD1F"}
|