@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,151 @@
|
|
|
1
|
+
import { mkdir, readFile, unlink, writeFile } from 'node:fs/promises';
|
|
2
|
+
import { homedir } from 'node:os';
|
|
3
|
+
import { dirname, join } from 'node:path';
|
|
4
|
+
function getServerUrlAliases(serverUrl) {
|
|
5
|
+
if (serverUrl === 'https://www.otakit.app') {
|
|
6
|
+
return ['https://otakit.app'];
|
|
7
|
+
}
|
|
8
|
+
if (serverUrl === 'https://otakit.app') {
|
|
9
|
+
return ['https://www.otakit.app'];
|
|
10
|
+
}
|
|
11
|
+
return [];
|
|
12
|
+
}
|
|
13
|
+
function getAuthFilePath() {
|
|
14
|
+
if (process.platform === 'win32') {
|
|
15
|
+
const appData = process.env.APPDATA?.trim();
|
|
16
|
+
const baseDir = appData && appData.length > 0 ? appData : join(homedir(), 'AppData', 'Roaming');
|
|
17
|
+
return join(baseDir, 'otakit', 'auth.json');
|
|
18
|
+
}
|
|
19
|
+
const xdgConfigHome = process.env.XDG_CONFIG_HOME?.trim();
|
|
20
|
+
const baseDir = xdgConfigHome && xdgConfigHome.length > 0 ? xdgConfigHome : join(homedir(), '.config');
|
|
21
|
+
return join(baseDir, 'otakit', 'auth.json');
|
|
22
|
+
}
|
|
23
|
+
async function readPayload(path) {
|
|
24
|
+
const raw = await readFile(path, 'utf-8');
|
|
25
|
+
const parsed = JSON.parse(raw);
|
|
26
|
+
if (parsed && typeof parsed === 'object' && !Array.isArray(parsed)) {
|
|
27
|
+
const tokens = parsed.tokens;
|
|
28
|
+
if (tokens && typeof tokens === 'object' && !Array.isArray(tokens)) {
|
|
29
|
+
const normalized = {};
|
|
30
|
+
for (const [key, value] of Object.entries(tokens)) {
|
|
31
|
+
if (typeof value === 'string' && value.trim().length > 0) {
|
|
32
|
+
normalized[key] = value.trim();
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
return { tokens: normalized };
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
return { tokens: {} };
|
|
39
|
+
}
|
|
40
|
+
async function writePayload(path, payload) {
|
|
41
|
+
await mkdir(dirname(path), { recursive: true, mode: 0o700 });
|
|
42
|
+
await writeFile(path, `${JSON.stringify(payload, null, 2)}\n`, {
|
|
43
|
+
encoding: 'utf-8',
|
|
44
|
+
mode: 0o600,
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
export async function readStoredAccessToken(serverUrl) {
|
|
48
|
+
const path = getAuthFilePath();
|
|
49
|
+
let payload;
|
|
50
|
+
try {
|
|
51
|
+
payload = await readPayload(path);
|
|
52
|
+
}
|
|
53
|
+
catch (error) {
|
|
54
|
+
if (error.code === 'ENOENT') {
|
|
55
|
+
return null;
|
|
56
|
+
}
|
|
57
|
+
const reason = error instanceof Error ? error.message : 'unknown error';
|
|
58
|
+
console.warn(`Warning: could not read auth file at ${path}: ${reason}`);
|
|
59
|
+
return null;
|
|
60
|
+
}
|
|
61
|
+
if (!payload) {
|
|
62
|
+
return null;
|
|
63
|
+
}
|
|
64
|
+
const direct = payload.tokens[serverUrl];
|
|
65
|
+
if (direct) {
|
|
66
|
+
return direct;
|
|
67
|
+
}
|
|
68
|
+
for (const alias of getServerUrlAliases(serverUrl)) {
|
|
69
|
+
const aliased = payload.tokens[alias];
|
|
70
|
+
if (aliased) {
|
|
71
|
+
return aliased;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
return null;
|
|
75
|
+
}
|
|
76
|
+
export async function storeAccessToken(serverUrl, token) {
|
|
77
|
+
const path = getAuthFilePath();
|
|
78
|
+
let payload;
|
|
79
|
+
try {
|
|
80
|
+
payload = (await readPayload(path)) ?? { tokens: {} };
|
|
81
|
+
}
|
|
82
|
+
catch (error) {
|
|
83
|
+
if (error.code === 'ENOENT') {
|
|
84
|
+
payload = { tokens: {} };
|
|
85
|
+
}
|
|
86
|
+
else {
|
|
87
|
+
const reason = error instanceof Error ? error.message : 'unknown error';
|
|
88
|
+
console.warn(`Warning: auth file at ${path} is unreadable, recreating it (${reason}).`);
|
|
89
|
+
payload = { tokens: {} };
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
payload.tokens[serverUrl] = token.trim();
|
|
93
|
+
try {
|
|
94
|
+
await writePayload(path, payload);
|
|
95
|
+
return { ok: true };
|
|
96
|
+
}
|
|
97
|
+
catch (error) {
|
|
98
|
+
return {
|
|
99
|
+
ok: false,
|
|
100
|
+
reason: error instanceof Error ? error.message : 'Failed to save token.',
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
export async function clearStoredAccessToken(serverUrl) {
|
|
105
|
+
const path = getAuthFilePath();
|
|
106
|
+
let payload;
|
|
107
|
+
try {
|
|
108
|
+
payload = await readPayload(path);
|
|
109
|
+
}
|
|
110
|
+
catch (error) {
|
|
111
|
+
if (error.code === 'ENOENT') {
|
|
112
|
+
return { ok: true, deleted: false };
|
|
113
|
+
}
|
|
114
|
+
return {
|
|
115
|
+
ok: false,
|
|
116
|
+
deleted: false,
|
|
117
|
+
reason: error instanceof Error ? error.message : 'Failed to read auth store.',
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
if (!payload) {
|
|
121
|
+
return { ok: true, deleted: false };
|
|
122
|
+
}
|
|
123
|
+
const keysToDelete = [serverUrl, ...getServerUrlAliases(serverUrl)].filter((value, index, array) => array.indexOf(value) === index);
|
|
124
|
+
let deleted = false;
|
|
125
|
+
for (const key of keysToDelete) {
|
|
126
|
+
if (payload.tokens[key]) {
|
|
127
|
+
delete payload.tokens[key];
|
|
128
|
+
deleted = true;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
if (!deleted) {
|
|
132
|
+
return { ok: true, deleted: false };
|
|
133
|
+
}
|
|
134
|
+
try {
|
|
135
|
+
if (Object.keys(payload.tokens).length === 0) {
|
|
136
|
+
await unlink(path);
|
|
137
|
+
}
|
|
138
|
+
else {
|
|
139
|
+
await writePayload(path, payload);
|
|
140
|
+
}
|
|
141
|
+
return { ok: true, deleted: true };
|
|
142
|
+
}
|
|
143
|
+
catch (error) {
|
|
144
|
+
return {
|
|
145
|
+
ok: false,
|
|
146
|
+
deleted: false,
|
|
147
|
+
reason: error instanceof Error ? error.message : 'Failed to delete token.',
|
|
148
|
+
};
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
//# sourceMappingURL=token-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"token-store.js","sourceRoot":"","sources":["../../src/lib/token-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { ApiClient, Bundle } from './api.js';
|
|
2
|
+
export type VersionSource = 'flag' | 'env' | 'auto';
|
|
3
|
+
export type ResolvedVersion = {
|
|
4
|
+
value: string;
|
|
5
|
+
source: VersionSource;
|
|
6
|
+
};
|
|
7
|
+
export declare function resolveBundlePath(explicit: string | undefined, config: {
|
|
8
|
+
outputDir?: string;
|
|
9
|
+
}): string;
|
|
10
|
+
export declare function resolveVersion(explicit: string | undefined, options?: {
|
|
11
|
+
strict?: boolean;
|
|
12
|
+
bundlePath?: string;
|
|
13
|
+
}): Promise<ResolvedVersion>;
|
|
14
|
+
export type UploadWorkflowOptions = {
|
|
15
|
+
api: ApiClient;
|
|
16
|
+
sourcePath: string;
|
|
17
|
+
version: string;
|
|
18
|
+
minNativeBuild?: number;
|
|
19
|
+
releaseChannel?: string | null;
|
|
20
|
+
onStatus?: (message: string) => void;
|
|
21
|
+
};
|
|
22
|
+
export type UploadWorkflowResult = {
|
|
23
|
+
bundle: Bundle;
|
|
24
|
+
releaseChannel?: string | null;
|
|
25
|
+
};
|
|
26
|
+
export declare function runUploadWorkflow(options: UploadWorkflowOptions): Promise<UploadWorkflowResult>;
|
|
27
|
+
//# sourceMappingURL=upload-workflow.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"upload-workflow.d.ts","sourceRoot":"","sources":["../../src/lib/upload-workflow.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AA2BlD,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,KAAK,GAAG,MAAM,CAAC;AAEpD,MAAM,MAAM,eAAe,GAAG;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,aAAa,CAAC;CACvB,CAAC;AAEF,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,MAAM,GAAG,SAAS,EAC5B,MAAM,EAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,GAC7B,MAAM,CAiBR;AAED,wBAAsB,cAAc,CAClC,QAAQ,EAAE,MAAM,GAAG,SAAS,EAC5B,OAAO,CAAC,EAAE;IACR,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,GACA,OAAO,CAAC,eAAe,CAAC,CAyB1B;AAiCD,MAAM,MAAM,qBAAqB,GAAG;IAClC,GAAG,EAAE,SAAS,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CACtC,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAChC,CAAC;AAEF,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,qBAAqB,GAC7B,OAAO,CAAC,oBAAoB,CAAC,CAsD/B"}
|
|
@@ -0,0 +1,252 @@
|
|
|
1
|
+
import { createReadStream, readFileSync, unlinkSync } from 'node:fs';
|
|
2
|
+
import { stat } from 'node:fs/promises';
|
|
3
|
+
import { execFileSync } from 'node:child_process';
|
|
4
|
+
import { randomUUID } from 'node:crypto';
|
|
5
|
+
import { dirname, join, resolve } from 'node:path';
|
|
6
|
+
import { tmpdir } from 'node:os';
|
|
7
|
+
import { CliError } from './errors.js';
|
|
8
|
+
import { hashFile } from './hash.js';
|
|
9
|
+
import { getCliUserAgent } from './version.js';
|
|
10
|
+
import { createZip, removeFileIfExists, validateBundleDirectory } from './zip.js';
|
|
11
|
+
const MAX_VERSION_LENGTH = 64;
|
|
12
|
+
const COMMIT_ENV_KEYS = [
|
|
13
|
+
'OTAKIT_COMMIT_SHA',
|
|
14
|
+
'GITHUB_SHA',
|
|
15
|
+
'CI_COMMIT_SHA',
|
|
16
|
+
'BUILDKITE_COMMIT',
|
|
17
|
+
'BITBUCKET_COMMIT',
|
|
18
|
+
'VERCEL_GIT_COMMIT_SHA',
|
|
19
|
+
];
|
|
20
|
+
const RUN_ENV_KEYS = [
|
|
21
|
+
'OTAKIT_RUN_ID',
|
|
22
|
+
'GITHUB_RUN_NUMBER',
|
|
23
|
+
'GITHUB_RUN_ID',
|
|
24
|
+
'CI_PIPELINE_IID',
|
|
25
|
+
'CI_PIPELINE_ID',
|
|
26
|
+
'BUILD_NUMBER',
|
|
27
|
+
'BUILDKITE_BUILD_NUMBER',
|
|
28
|
+
];
|
|
29
|
+
export function resolveBundlePath(explicit, config) {
|
|
30
|
+
if (explicit) {
|
|
31
|
+
return resolve(explicit);
|
|
32
|
+
}
|
|
33
|
+
if (config.outputDir) {
|
|
34
|
+
return resolve(config.outputDir);
|
|
35
|
+
}
|
|
36
|
+
throw new CliError([
|
|
37
|
+
'No bundle path found. Provide it using one of:',
|
|
38
|
+
' 1. otakit upload <path>',
|
|
39
|
+
' 2. Set webDir in capacitor.config.*',
|
|
40
|
+
' 3. Set OTAKIT_BUILD_DIR or OTAKIT_OUTPUT_DIR in your environment',
|
|
41
|
+
].join('\n'));
|
|
42
|
+
}
|
|
43
|
+
export async function resolveVersion(explicit, options) {
|
|
44
|
+
const explicitVersion = validateVersion(explicit, '--version');
|
|
45
|
+
if (explicitVersion) {
|
|
46
|
+
return { value: explicitVersion, source: 'flag' };
|
|
47
|
+
}
|
|
48
|
+
const envVersion = validateVersion(process.env.OTAKIT_VERSION, 'OTAKIT_VERSION');
|
|
49
|
+
if (envVersion) {
|
|
50
|
+
return { value: envVersion, source: 'env' };
|
|
51
|
+
}
|
|
52
|
+
if (isStrictVersionMode(options?.strict)) {
|
|
53
|
+
throw new CliError([
|
|
54
|
+
'Strict version mode is enabled but no version was provided.',
|
|
55
|
+
'- Pass --version <value>',
|
|
56
|
+
'- or set OTAKIT_VERSION',
|
|
57
|
+
].join('\n'));
|
|
58
|
+
}
|
|
59
|
+
return {
|
|
60
|
+
value: buildAutoVersion(options?.bundlePath),
|
|
61
|
+
source: 'auto',
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
async function uploadFileToPresignedUrl(filePath, presignedUrl) {
|
|
65
|
+
const fileStat = await stat(filePath);
|
|
66
|
+
const body = createReadStream(filePath);
|
|
67
|
+
const controller = new AbortController();
|
|
68
|
+
const timeoutId = setTimeout(() => controller.abort(), 300_000);
|
|
69
|
+
const requestOptions = {
|
|
70
|
+
method: 'PUT',
|
|
71
|
+
body,
|
|
72
|
+
signal: controller.signal,
|
|
73
|
+
headers: {
|
|
74
|
+
'Content-Type': 'application/zip',
|
|
75
|
+
'Content-Length': String(fileStat.size),
|
|
76
|
+
'User-Agent': getCliUserAgent(),
|
|
77
|
+
},
|
|
78
|
+
duplex: 'half',
|
|
79
|
+
};
|
|
80
|
+
try {
|
|
81
|
+
const response = await fetch(presignedUrl, requestOptions);
|
|
82
|
+
if (!response.ok) {
|
|
83
|
+
const message = await response.text();
|
|
84
|
+
throw new CliError(`Upload failed (${response.status}): ${message || 'unknown error'}`);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
finally {
|
|
88
|
+
clearTimeout(timeoutId);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
export async function runUploadWorkflow(options) {
|
|
92
|
+
const { api, sourcePath, version, minNativeBuild, releaseChannel, onStatus } = options;
|
|
93
|
+
validateBundleDirectory(sourcePath);
|
|
94
|
+
const tempZipPath = join(tmpdir(), `otakit-${version}-${randomUUID()}.zip`);
|
|
95
|
+
const cleanup = () => {
|
|
96
|
+
try {
|
|
97
|
+
unlinkSync(tempZipPath);
|
|
98
|
+
}
|
|
99
|
+
catch { }
|
|
100
|
+
process.exit(1);
|
|
101
|
+
};
|
|
102
|
+
process.on('SIGINT', cleanup);
|
|
103
|
+
try {
|
|
104
|
+
onStatus?.('Creating zip archive...');
|
|
105
|
+
await createZip(sourcePath, tempZipPath);
|
|
106
|
+
onStatus?.('Calculating SHA-256 checksum...');
|
|
107
|
+
const sha256 = await hashFile(tempZipPath);
|
|
108
|
+
const zipStat = await stat(tempZipPath);
|
|
109
|
+
onStatus?.('Requesting upload URL...');
|
|
110
|
+
const initiated = await api.initiateUpload({
|
|
111
|
+
version,
|
|
112
|
+
minNativeBuild,
|
|
113
|
+
size: zipStat.size,
|
|
114
|
+
sha256,
|
|
115
|
+
});
|
|
116
|
+
const expiresAt = new Date(initiated.expiresAt);
|
|
117
|
+
if (expiresAt.getTime() - Date.now() < 60_000) {
|
|
118
|
+
throw new CliError('Presigned upload URL has expired or is about to expire. Please retry.');
|
|
119
|
+
}
|
|
120
|
+
onStatus?.('Uploading bundle...');
|
|
121
|
+
await uploadFileToPresignedUrl(tempZipPath, initiated.presignedUrl);
|
|
122
|
+
onStatus?.('Finalizing...');
|
|
123
|
+
const bundle = await api.finalizeUpload({
|
|
124
|
+
uploadId: initiated.uploadId,
|
|
125
|
+
});
|
|
126
|
+
if (releaseChannel !== undefined) {
|
|
127
|
+
onStatus?.(`Releasing to ${releaseChannel ?? 'base channel'}...`);
|
|
128
|
+
await api.release(releaseChannel, bundle.id);
|
|
129
|
+
}
|
|
130
|
+
return { bundle, releaseChannel };
|
|
131
|
+
}
|
|
132
|
+
finally {
|
|
133
|
+
process.off('SIGINT', cleanup);
|
|
134
|
+
await removeFileIfExists(tempZipPath);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
function validateVersion(value, label) {
|
|
138
|
+
if (value === undefined) {
|
|
139
|
+
return null;
|
|
140
|
+
}
|
|
141
|
+
const trimmed = value.trim();
|
|
142
|
+
if (trimmed.length === 0) {
|
|
143
|
+
return null;
|
|
144
|
+
}
|
|
145
|
+
if (/\s/.test(trimmed)) {
|
|
146
|
+
throw new CliError(`${label} cannot contain whitespace.`);
|
|
147
|
+
}
|
|
148
|
+
if (trimmed.length > MAX_VERSION_LENGTH) {
|
|
149
|
+
throw new CliError(`${label} exceeds ${MAX_VERSION_LENGTH} characters.`);
|
|
150
|
+
}
|
|
151
|
+
return trimmed;
|
|
152
|
+
}
|
|
153
|
+
function buildAutoVersion(bundlePath) {
|
|
154
|
+
const baseVersion = normalizeBaseVersion(process.env.OTAKIT_BASE_VERSION?.trim() || readNearestPackageVersion(bundlePath) || '0.0.0');
|
|
155
|
+
const commitPart = normalizeToken(resolveCommitRef() ?? 'local', 12, 'local');
|
|
156
|
+
const runPart = normalizeToken(resolveRunRef() ?? utcCompactTimestamp(), 20, 'run');
|
|
157
|
+
const suffix = `+otk.${commitPart}.${runPart}`;
|
|
158
|
+
const maxBaseLength = Math.max(1, MAX_VERSION_LENGTH - suffix.length);
|
|
159
|
+
const compactBase = baseVersion.slice(0, maxBaseLength);
|
|
160
|
+
const candidate = `${compactBase}${suffix}`;
|
|
161
|
+
const validated = validateVersion(candidate, 'auto-generated version');
|
|
162
|
+
if (!validated) {
|
|
163
|
+
throw new CliError('Failed to generate a valid version.');
|
|
164
|
+
}
|
|
165
|
+
return validated;
|
|
166
|
+
}
|
|
167
|
+
function normalizeBaseVersion(value) {
|
|
168
|
+
const withoutMetadata = value.split('+')[0]?.trim() || '0.0.0';
|
|
169
|
+
const compact = withoutMetadata.replace(/\s+/g, '-');
|
|
170
|
+
return compact.length > 0 ? compact : '0.0.0';
|
|
171
|
+
}
|
|
172
|
+
function readNearestPackageVersion(startPath) {
|
|
173
|
+
let currentDir = resolve(startPath ?? process.cwd());
|
|
174
|
+
while (true) {
|
|
175
|
+
const packageJsonPath = join(currentDir, 'package.json');
|
|
176
|
+
try {
|
|
177
|
+
const raw = readFileSync(packageJsonPath, 'utf-8');
|
|
178
|
+
const parsed = JSON.parse(raw);
|
|
179
|
+
if (typeof parsed.version === 'string' && parsed.version.trim().length > 0) {
|
|
180
|
+
return parsed.version.trim();
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
catch {
|
|
184
|
+
// Keep walking upward until we find package metadata or hit the filesystem root.
|
|
185
|
+
}
|
|
186
|
+
const parentDir = dirname(currentDir);
|
|
187
|
+
if (parentDir === currentDir) {
|
|
188
|
+
return null;
|
|
189
|
+
}
|
|
190
|
+
currentDir = parentDir;
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
function isStrictVersionMode(explicitStrict) {
|
|
194
|
+
if (explicitStrict) {
|
|
195
|
+
return true;
|
|
196
|
+
}
|
|
197
|
+
const raw = process.env.OTAKIT_STRICT_VERSION?.trim().toLowerCase();
|
|
198
|
+
return raw === '1' || raw === 'true' || raw === 'yes' || raw === 'on';
|
|
199
|
+
}
|
|
200
|
+
function resolveCommitRef() {
|
|
201
|
+
for (const key of COMMIT_ENV_KEYS) {
|
|
202
|
+
const value = process.env[key]?.trim();
|
|
203
|
+
if (value) {
|
|
204
|
+
return value;
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
try {
|
|
208
|
+
const fromGit = execFileSync('git', ['rev-parse', '--short=12', 'HEAD'], {
|
|
209
|
+
cwd: process.cwd(),
|
|
210
|
+
encoding: 'utf-8',
|
|
211
|
+
stdio: ['ignore', 'pipe', 'ignore'],
|
|
212
|
+
}).trim();
|
|
213
|
+
return fromGit.length > 0 ? fromGit : null;
|
|
214
|
+
}
|
|
215
|
+
catch {
|
|
216
|
+
return null;
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
function resolveRunRef() {
|
|
220
|
+
for (const key of RUN_ENV_KEYS) {
|
|
221
|
+
const value = process.env[key]?.trim();
|
|
222
|
+
if (value) {
|
|
223
|
+
return value;
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
return null;
|
|
227
|
+
}
|
|
228
|
+
function normalizeToken(value, maxLength, fallback) {
|
|
229
|
+
const normalized = value
|
|
230
|
+
.toLowerCase()
|
|
231
|
+
.replace(/[^a-z0-9.-]+/g, '-')
|
|
232
|
+
.replace(/^-+|-+$/g, '');
|
|
233
|
+
if (normalized.length === 0) {
|
|
234
|
+
return fallback;
|
|
235
|
+
}
|
|
236
|
+
return normalized.slice(0, maxLength);
|
|
237
|
+
}
|
|
238
|
+
function utcCompactTimestamp() {
|
|
239
|
+
const now = new Date();
|
|
240
|
+
const pad = (num) => String(num).padStart(2, '0');
|
|
241
|
+
return [
|
|
242
|
+
now.getUTCFullYear(),
|
|
243
|
+
pad(now.getUTCMonth() + 1),
|
|
244
|
+
pad(now.getUTCDate()),
|
|
245
|
+
't',
|
|
246
|
+
pad(now.getUTCHours()),
|
|
247
|
+
pad(now.getUTCMinutes()),
|
|
248
|
+
pad(now.getUTCSeconds()),
|
|
249
|
+
'z',
|
|
250
|
+
].join('');
|
|
251
|
+
}
|
|
252
|
+
//# sourceMappingURL=upload-workflow.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"upload-workflow.js","sourceRoot":"","sources":["../../src/lib/upload-workflow.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../src/lib/validate.ts"],"names":[],"mappings":"AAEA,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAMzE;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAMlE"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { CliError } from './errors.js';
|
|
2
|
+
export function parsePositiveInteger(value, label) {
|
|
3
|
+
const parsed = Number.parseInt(value, 10);
|
|
4
|
+
if (!Number.isInteger(parsed) || parsed <= 0) {
|
|
5
|
+
throw new CliError(`${label} must be a positive integer.`);
|
|
6
|
+
}
|
|
7
|
+
return parsed;
|
|
8
|
+
}
|
|
9
|
+
export function normalizeChannel(value) {
|
|
10
|
+
const channel = value?.trim() ?? '';
|
|
11
|
+
if (channel.length === 0) {
|
|
12
|
+
throw new CliError('Channel cannot be empty.');
|
|
13
|
+
}
|
|
14
|
+
return channel;
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=validate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate.js","sourceRoot":"","sources":["../../src/lib/validate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAEvC,MAAM,UAAU,oBAAoB,CAAC,KAAa,EAAE,KAAa;IAC/D,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IAC1C,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,MAAM,IAAI,CAAC,EAAE,CAAC;QAC7C,MAAM,IAAI,QAAQ,CAAC,GAAG,KAAK,8BAA8B,CAAC,CAAC;IAC7D,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,KAAyB;IACxD,MAAM,OAAO,GAAG,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IACpC,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,MAAM,IAAI,QAAQ,CAAC,0BAA0B,CAAC,CAAC;IACjD,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../../src/lib/version.ts"],"names":[],"mappings":"AAIA,wBAAgB,cAAc,IAAI,MAAM,CAgBvC;AAED,eAAO,MAAM,WAAW,QAAmB,CAAC;AAE5C,wBAAgB,eAAe,CAAC,OAAO,GAAE,MAAoB,GAAG,MAAM,CAErE"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { readFileSync } from 'node:fs';
|
|
2
|
+
import { dirname, resolve } from 'node:path';
|
|
3
|
+
import { fileURLToPath } from 'node:url';
|
|
4
|
+
export function readCliVersion() {
|
|
5
|
+
try {
|
|
6
|
+
const currentFile = fileURLToPath(import.meta.url);
|
|
7
|
+
const currentDir = dirname(currentFile);
|
|
8
|
+
const packageJsonPath = resolve(currentDir, '../../package.json');
|
|
9
|
+
const raw = readFileSync(packageJsonPath, 'utf-8');
|
|
10
|
+
const parsed = JSON.parse(raw);
|
|
11
|
+
if (typeof parsed.version === 'string' && parsed.version.trim().length > 0) {
|
|
12
|
+
return parsed.version.trim();
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
catch {
|
|
16
|
+
// Fall back to a safe version value when package metadata is unavailable.
|
|
17
|
+
}
|
|
18
|
+
return '0.0.0';
|
|
19
|
+
}
|
|
20
|
+
export const CLI_VERSION = readCliVersion();
|
|
21
|
+
export function getCliUserAgent(version = CLI_VERSION) {
|
|
22
|
+
return `otakit-cli/${version}`;
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=version.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/lib/version.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,MAAM,UAAU,cAAc;IAC5B,IAAI,CAAC;QACH,MAAM,WAAW,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACnD,MAAM,UAAU,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;QACxC,MAAM,eAAe,GAAG,OAAO,CAAC,UAAU,EAAE,oBAAoB,CAAC,CAAC;QAClE,MAAM,GAAG,GAAG,YAAY,CAAC,eAAe,EAAE,OAAO,CAAC,CAAC;QACnD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAA0B,CAAC;QAExD,IAAI,OAAO,MAAM,CAAC,OAAO,KAAK,QAAQ,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC3E,OAAO,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;QAC/B,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,0EAA0E;IAC5E,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,CAAC,MAAM,WAAW,GAAG,cAAc,EAAE,CAAC;AAE5C,MAAM,UAAU,eAAe,CAAC,UAAkB,WAAW;IAC3D,OAAO,cAAc,OAAO,EAAE,CAAC;AACjC,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export type ZipResult = {
|
|
2
|
+
path: string;
|
|
3
|
+
size: number;
|
|
4
|
+
};
|
|
5
|
+
export declare function validateBundleDirectory(directory: string): void;
|
|
6
|
+
export declare function createZip(sourceDirectory: string, destinationZipPath: string): Promise<ZipResult>;
|
|
7
|
+
export declare function removeFileIfExists(filePath: string): Promise<void>;
|
|
8
|
+
//# sourceMappingURL=zip.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"zip.d.ts","sourceRoot":"","sources":["../../src/lib/zip.ts"],"names":[],"mappings":"AAQA,MAAM,MAAM,SAAS,GAAG;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd,CAAC;AAEF,wBAAgB,uBAAuB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAe/D;AA6BD,wBAAsB,SAAS,CAC7B,eAAe,EAAE,MAAM,EACvB,kBAAkB,EAAE,MAAM,GACzB,OAAO,CAAC,SAAS,CAAC,CA4BpB;AAED,wBAAsB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAYxE"}
|
package/dist/lib/zip.js
ADDED
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import { createWriteStream, existsSync, lstatSync, readdirSync } from 'node:fs';
|
|
2
|
+
import { stat, unlink } from 'node:fs/promises';
|
|
3
|
+
import { dirname, join, posix } from 'node:path';
|
|
4
|
+
import { mkdir } from 'node:fs/promises';
|
|
5
|
+
import archiver from 'archiver';
|
|
6
|
+
import { CliError } from './errors.js';
|
|
7
|
+
export function validateBundleDirectory(directory) {
|
|
8
|
+
if (!existsSync(directory)) {
|
|
9
|
+
throw new CliError(`Bundle directory does not exist: ${directory}`);
|
|
10
|
+
}
|
|
11
|
+
if (!lstatSync(directory).isDirectory()) {
|
|
12
|
+
throw new CliError(`Not a directory: ${directory}`);
|
|
13
|
+
}
|
|
14
|
+
const indexPath = join(directory, 'index.html');
|
|
15
|
+
if (!existsSync(indexPath)) {
|
|
16
|
+
throw new CliError(`Missing index.html in ${directory}. Expected a Capacitor web build output.`);
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
function appendDirectory(archive, sourceDirectory, relativePath) {
|
|
20
|
+
const currentPath = join(sourceDirectory, relativePath);
|
|
21
|
+
const entries = readdirSync(currentPath, { withFileTypes: true });
|
|
22
|
+
for (const entry of entries) {
|
|
23
|
+
const nextRelativePath = relativePath ? join(relativePath, entry.name) : entry.name;
|
|
24
|
+
const absolutePath = join(sourceDirectory, nextRelativePath);
|
|
25
|
+
const archiveName = nextRelativePath.split('\\').join(posix.sep);
|
|
26
|
+
if (entry.isSymbolicLink()) {
|
|
27
|
+
throw new CliError([
|
|
28
|
+
`Unsupported symlink in bundle output: ${archiveName}`,
|
|
29
|
+
'Remove symlinks from the web build output before uploading.',
|
|
30
|
+
].join('\n'));
|
|
31
|
+
}
|
|
32
|
+
if (entry.isDirectory()) {
|
|
33
|
+
appendDirectory(archive, sourceDirectory, nextRelativePath);
|
|
34
|
+
continue;
|
|
35
|
+
}
|
|
36
|
+
if (entry.isFile()) {
|
|
37
|
+
archive.file(absolutePath, { name: archiveName });
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
export async function createZip(sourceDirectory, destinationZipPath) {
|
|
42
|
+
validateBundleDirectory(sourceDirectory);
|
|
43
|
+
await mkdir(dirname(destinationZipPath), { recursive: true });
|
|
44
|
+
return new Promise((resolve, reject) => {
|
|
45
|
+
const output = createWriteStream(destinationZipPath);
|
|
46
|
+
const archive = archiver('zip', { zlib: { level: 9 } });
|
|
47
|
+
output.on('close', async () => {
|
|
48
|
+
try {
|
|
49
|
+
const fileStats = await stat(destinationZipPath);
|
|
50
|
+
resolve({
|
|
51
|
+
path: destinationZipPath,
|
|
52
|
+
size: fileStats.size,
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
catch (error) {
|
|
56
|
+
reject(error);
|
|
57
|
+
}
|
|
58
|
+
});
|
|
59
|
+
output.on('error', reject);
|
|
60
|
+
archive.on('error', reject);
|
|
61
|
+
archive.pipe(output);
|
|
62
|
+
appendDirectory(archive, sourceDirectory, '');
|
|
63
|
+
archive.finalize().catch(reject);
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
export async function removeFileIfExists(filePath) {
|
|
67
|
+
try {
|
|
68
|
+
await unlink(filePath);
|
|
69
|
+
}
|
|
70
|
+
catch (error) {
|
|
71
|
+
if (!(error instanceof Error) ||
|
|
72
|
+
!('code' in error) ||
|
|
73
|
+
error.code !== 'ENOENT') {
|
|
74
|
+
throw error;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=zip.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"zip.js","sourceRoot":"","sources":["../../src/lib/zip.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,UAAU,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAChF,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,WAAW,CAAC;AACjD,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACzC,OAAO,QAA2B,MAAM,UAAU,CAAC;AAEnD,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAOvC,MAAM,UAAU,uBAAuB,CAAC,SAAiB;IACvD,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC3B,MAAM,IAAI,QAAQ,CAAC,oCAAoC,SAAS,EAAE,CAAC,CAAC;IACtE,CAAC;IAED,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC;QACxC,MAAM,IAAI,QAAQ,CAAC,oBAAoB,SAAS,EAAE,CAAC,CAAC;IACtD,CAAC;IAED,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;IAChD,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC3B,MAAM,IAAI,QAAQ,CAChB,yBAAyB,SAAS,0CAA0C,CAC7E,CAAC;IACJ,CAAC;AACH,CAAC;AAED,SAAS,eAAe,CAAC,OAAiB,EAAE,eAAuB,EAAE,YAAoB;IACvF,MAAM,WAAW,GAAG,IAAI,CAAC,eAAe,EAAE,YAAY,CAAC,CAAC;IACxD,MAAM,OAAO,GAAG,WAAW,CAAC,WAAW,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;IAElE,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,MAAM,gBAAgB,GAAG,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC;QACpF,MAAM,YAAY,GAAG,IAAI,CAAC,eAAe,EAAE,gBAAgB,CAAC,CAAC;QAC7D,MAAM,WAAW,GAAG,gBAAgB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAEjE,IAAI,KAAK,CAAC,cAAc,EAAE,EAAE,CAAC;YAC3B,MAAM,IAAI,QAAQ,CAChB;gBACE,yCAAyC,WAAW,EAAE;gBACtD,6DAA6D;aAC9D,CAAC,IAAI,CAAC,IAAI,CAAC,CACb,CAAC;QACJ,CAAC;QACD,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;YACxB,eAAe,CAAC,OAAO,EAAE,eAAe,EAAE,gBAAgB,CAAC,CAAC;YAC5D,SAAS;QACX,CAAC;QACD,IAAI,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC;YACnB,OAAO,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,CAAC;QACpD,CAAC;IACH,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS,CAC7B,eAAuB,EACvB,kBAA0B;IAE1B,uBAAuB,CAAC,eAAe,CAAC,CAAC;IAEzC,MAAM,KAAK,CAAC,OAAO,CAAC,kBAAkB,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAE9D,OAAO,IAAI,OAAO,CAAY,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QAChD,MAAM,MAAM,GAAG,iBAAiB,CAAC,kBAAkB,CAAC,CAAC;QACrD,MAAM,OAAO,GAAG,QAAQ,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;QAExD,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,KAAK,IAAI,EAAE;YAC5B,IAAI,CAAC;gBACH,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,kBAAkB,CAAC,CAAC;gBACjD,OAAO,CAAC;oBACN,IAAI,EAAE,kBAAkB;oBACxB,IAAI,EAAE,SAAS,CAAC,IAAI;iBACrB,CAAC,CAAC;YACL,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,CAAC,KAAK,CAAC,CAAC;YAChB,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAC3B,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAE5B,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACrB,eAAe,CAAC,OAAO,EAAE,eAAe,EAAE,EAAE,CAAC,CAAC;QAC9C,OAAO,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IACnC,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,QAAgB;IACvD,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,QAAQ,CAAC,CAAC;IACzB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IACE,CAAC,CAAC,KAAK,YAAY,KAAK,CAAC;YACzB,CAAC,CAAC,MAAM,IAAI,KAAK,CAAC;YACjB,KAA+B,CAAC,IAAI,KAAK,QAAQ,EAClD,CAAC;YACD,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;AACH,CAAC"}
|