@otakit/cli 1.3.0 → 1.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +42 -3
- package/dist/commands/connect.d.ts +3 -0
- package/dist/commands/connect.d.ts.map +1 -0
- package/dist/commands/connect.js +216 -0
- package/dist/commands/connect.js.map +1 -0
- package/dist/commands/login.d.ts.map +1 -1
- package/dist/commands/login.js +40 -48
- package/dist/commands/login.js.map +1 -1
- package/dist/commands/mcp.d.ts +4 -0
- package/dist/commands/mcp.d.ts.map +1 -0
- package/dist/commands/mcp.js +122 -0
- package/dist/commands/mcp.js.map +1 -0
- package/dist/commands/organization.d.ts +3 -0
- package/dist/commands/organization.d.ts.map +1 -0
- package/dist/commands/organization.js +44 -0
- package/dist/commands/organization.js.map +1 -0
- package/dist/commands/register.d.ts.map +1 -1
- package/dist/commands/register.js +71 -16
- package/dist/commands/register.js.map +1 -1
- package/dist/commands/release.d.ts.map +1 -1
- package/dist/commands/release.js +8 -2
- package/dist/commands/release.js.map +1 -1
- package/dist/commands/upload.d.ts.map +1 -1
- package/dist/commands/upload.js +31 -2
- package/dist/commands/upload.js.map +1 -1
- package/dist/commands/whoami.d.ts.map +1 -1
- package/dist/commands/whoami.js +59 -17
- package/dist/commands/whoami.js.map +1 -1
- package/dist/index.js +4494 -21
- package/dist/index.js.map +7 -1
- package/dist/lib/api.d.ts +29 -6
- package/dist/lib/api.d.ts.map +1 -1
- package/dist/lib/api.js +55 -15
- package/dist/lib/api.js.map +1 -1
- package/dist/lib/config.d.ts +7 -0
- package/dist/lib/config.d.ts.map +1 -1
- package/dist/lib/config.js +18 -4
- package/dist/lib/config.js.map +1 -1
- package/dist/lib/login-flow.d.ts +13 -0
- package/dist/lib/login-flow.d.ts.map +1 -0
- package/dist/lib/login-flow.js +89 -0
- package/dist/lib/login-flow.js.map +1 -0
- package/dist/lib/native-deps.d.ts +2 -0
- package/dist/lib/native-deps.d.ts.map +1 -1
- package/dist/lib/native-deps.js +12 -2
- package/dist/lib/native-deps.js.map +1 -1
- package/dist/lib/organization.d.ts +27 -0
- package/dist/lib/organization.d.ts.map +1 -0
- package/dist/lib/organization.js +86 -0
- package/dist/lib/organization.js.map +1 -0
- package/dist/lib/project-inspect.d.ts +27 -0
- package/dist/lib/project-inspect.d.ts.map +1 -0
- package/dist/lib/project-inspect.js +131 -0
- package/dist/lib/project-inspect.js.map +1 -0
- package/dist/lib/token-store.d.ts +8 -2
- package/dist/lib/token-store.d.ts.map +1 -1
- package/dist/lib/token-store.js +105 -67
- package/dist/lib/token-store.js.map +1 -1
- package/dist/lib/upload-workflow.d.ts +10 -1
- package/dist/lib/upload-workflow.d.ts.map +1 -1
- package/dist/lib/upload-workflow.js +56 -12
- package/dist/lib/upload-workflow.js.map +1 -1
- package/dist/lib/version.d.ts.map +1 -1
- package/dist/lib/version.js +16 -5
- package/dist/lib/version.js.map +1 -1
- package/dist/mcp/local-adapter.d.ts +97 -0
- package/dist/mcp/local-adapter.d.ts.map +1 -0
- package/dist/mcp/local-adapter.js +664 -0
- package/dist/mcp/local-adapter.js.map +1 -0
- package/package.json +15 -5
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { StoredAuthProfile } from './token-store.js';
|
|
2
|
+
export type OrganizationMembership = {
|
|
3
|
+
id: string;
|
|
4
|
+
organizationId: string;
|
|
5
|
+
organizationName: string;
|
|
6
|
+
role: string;
|
|
7
|
+
};
|
|
8
|
+
export type AccountResponse = {
|
|
9
|
+
user: {
|
|
10
|
+
id: string;
|
|
11
|
+
email: string;
|
|
12
|
+
name: string;
|
|
13
|
+
activeOrganizationId: string | null;
|
|
14
|
+
};
|
|
15
|
+
memberships: OrganizationMembership[];
|
|
16
|
+
};
|
|
17
|
+
export declare function fetchAccount(serverUrl: string, token: string): Promise<AccountResponse>;
|
|
18
|
+
export declare function initialOrganizationId(account: AccountResponse, storedProfile?: StoredAuthProfile | null): string | undefined;
|
|
19
|
+
export declare function organizationById(memberships: readonly OrganizationMembership[], organizationId: string | undefined | null): OrganizationMembership | undefined;
|
|
20
|
+
export declare function organizationDisplayLabel(membership: OrganizationMembership, memberships: readonly OrganizationMembership[]): string;
|
|
21
|
+
export declare function organizationFromAnswer(memberships: readonly OrganizationMembership[], answer: string, defaultOrganizationId?: string): OrganizationMembership | undefined;
|
|
22
|
+
export declare function promptForOrganization(memberships: readonly OrganizationMembership[], options?: {
|
|
23
|
+
initialOrganizationId?: string;
|
|
24
|
+
message?: string;
|
|
25
|
+
}): Promise<OrganizationMembership>;
|
|
26
|
+
export declare function shellLiteral(value: string): string;
|
|
27
|
+
//# sourceMappingURL=organization.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"organization.d.ts","sourceRoot":"","sources":["../../src/lib/organization.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAE1D,MAAM,MAAM,sBAAsB,GAAG;IACnC,EAAE,EAAE,MAAM,CAAC;IACX,cAAc,EAAE,MAAM,CAAC;IACvB,gBAAgB,EAAE,MAAM,CAAC;IACzB,IAAI,EAAE,MAAM,CAAC;CACd,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG;IAC5B,IAAI,EAAE;QACJ,EAAE,EAAE,MAAM,CAAC;QACX,KAAK,EAAE,MAAM,CAAC;QACd,IAAI,EAAE,MAAM,CAAC;QACb,oBAAoB,EAAE,MAAM,GAAG,IAAI,CAAC;KACrC,CAAC;IACF,WAAW,EAAE,sBAAsB,EAAE,CAAC;CACvC,CAAC;AAEF,wBAAsB,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CAW7F;AAED,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,eAAe,EACxB,aAAa,CAAC,EAAE,iBAAiB,GAAG,IAAI,GACvC,MAAM,GAAG,SAAS,CAapB;AAED,wBAAgB,gBAAgB,CAC9B,WAAW,EAAE,SAAS,sBAAsB,EAAE,EAC9C,cAAc,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,GACxC,sBAAsB,GAAG,SAAS,CAGpC;AAMD,wBAAgB,wBAAwB,CACtC,UAAU,EAAE,sBAAsB,EAClC,WAAW,EAAE,SAAS,sBAAsB,EAAE,GAC7C,MAAM,CAMR;AAED,wBAAgB,sBAAsB,CACpC,WAAW,EAAE,SAAS,sBAAsB,EAAE,EAC9C,MAAM,EAAE,MAAM,EACd,qBAAqB,CAAC,EAAE,MAAM,GAC7B,sBAAsB,GAAG,SAAS,CAQpC;AAED,wBAAsB,qBAAqB,CACzC,WAAW,EAAE,SAAS,sBAAsB,EAAE,EAC9C,OAAO,GAAE;IAAE,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAO,GACjE,OAAO,CAAC,sBAAsB,CAAC,CAiCjC;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAElD"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import { CliError } from './errors.js';
|
|
2
|
+
import { fetchCli, parseApiError } from './http.js';
|
|
3
|
+
import { ask } from './prompt.js';
|
|
4
|
+
export async function fetchAccount(serverUrl, token) {
|
|
5
|
+
const response = await fetchCli(`${serverUrl}/api/v1/me`, {
|
|
6
|
+
headers: { Authorization: `Bearer ${token}` },
|
|
7
|
+
});
|
|
8
|
+
if (!response.ok)
|
|
9
|
+
throw new CliError(await parseApiError(response));
|
|
10
|
+
const payload = (await response.json());
|
|
11
|
+
if (!payload.user?.id || !payload.user.email || !Array.isArray(payload.memberships)) {
|
|
12
|
+
throw new CliError('Server returned an invalid account response.');
|
|
13
|
+
}
|
|
14
|
+
return payload;
|
|
15
|
+
}
|
|
16
|
+
export function initialOrganizationId(account, storedProfile) {
|
|
17
|
+
const membershipIds = new Set(account.memberships.map((membership) => membership.organizationId));
|
|
18
|
+
if (storedProfile?.userId === account.user.id &&
|
|
19
|
+
storedProfile.organizationId &&
|
|
20
|
+
membershipIds.has(storedProfile.organizationId)) {
|
|
21
|
+
return storedProfile.organizationId;
|
|
22
|
+
}
|
|
23
|
+
if (account.user.activeOrganizationId && membershipIds.has(account.user.activeOrganizationId)) {
|
|
24
|
+
return account.user.activeOrganizationId;
|
|
25
|
+
}
|
|
26
|
+
return account.memberships[0]?.organizationId;
|
|
27
|
+
}
|
|
28
|
+
export function organizationById(memberships, organizationId) {
|
|
29
|
+
if (!organizationId)
|
|
30
|
+
return undefined;
|
|
31
|
+
return memberships.find((membership) => membership.organizationId === organizationId);
|
|
32
|
+
}
|
|
33
|
+
function terminalSafe(value) {
|
|
34
|
+
return value.replace(/\p{Cc}/gu, (character) => JSON.stringify(character).slice(1, -1));
|
|
35
|
+
}
|
|
36
|
+
export function organizationDisplayLabel(membership, memberships) {
|
|
37
|
+
const duplicateName = memberships.filter((candidate) => candidate.organizationName === membership.organizationName)
|
|
38
|
+
.length > 1;
|
|
39
|
+
const suffix = duplicateName ? ` · ${membership.organizationId.slice(0, 8)}` : '';
|
|
40
|
+
return `${terminalSafe(membership.organizationName)} — ${terminalSafe(membership.role)}${suffix}`;
|
|
41
|
+
}
|
|
42
|
+
export function organizationFromAnswer(memberships, answer, defaultOrganizationId) {
|
|
43
|
+
const normalized = answer.trim();
|
|
44
|
+
if (!normalized) {
|
|
45
|
+
return organizationById(memberships, defaultOrganizationId) ?? memberships[0];
|
|
46
|
+
}
|
|
47
|
+
if (!/^\d+$/.test(normalized))
|
|
48
|
+
return undefined;
|
|
49
|
+
const index = Number.parseInt(normalized, 10) - 1;
|
|
50
|
+
return memberships[index];
|
|
51
|
+
}
|
|
52
|
+
export async function promptForOrganization(memberships, options = {}) {
|
|
53
|
+
if (memberships.length === 0) {
|
|
54
|
+
throw new CliError('This account does not belong to an OtaKit organization.');
|
|
55
|
+
}
|
|
56
|
+
if (memberships.length === 1)
|
|
57
|
+
return memberships[0];
|
|
58
|
+
if (!process.stdin.isTTY || !process.stdout.isTTY) {
|
|
59
|
+
throw new CliError([
|
|
60
|
+
'Organization selection needs an interactive terminal.',
|
|
61
|
+
'Run `otakit organization select` in a terminal, then retry.',
|
|
62
|
+
'For automation, use the OTAKIT_ORGANIZATION_ID export it prints or an organization API key.',
|
|
63
|
+
].join('\n'));
|
|
64
|
+
}
|
|
65
|
+
const defaultMembership = organizationById(memberships, options.initialOrganizationId) ?? memberships[0];
|
|
66
|
+
const defaultIndex = memberships.indexOf(defaultMembership);
|
|
67
|
+
console.log('');
|
|
68
|
+
console.log(options.message ?? 'Choose a default organization for commands not tied to an app:');
|
|
69
|
+
console.log('');
|
|
70
|
+
memberships.forEach((membership, index) => {
|
|
71
|
+
const marker = index === defaultIndex ? '*' : ' ';
|
|
72
|
+
console.log(` [${index + 1}]${marker} ${organizationDisplayLabel(membership, memberships)}`);
|
|
73
|
+
});
|
|
74
|
+
console.log('');
|
|
75
|
+
while (true) {
|
|
76
|
+
const answer = await ask(`Selection [${defaultIndex + 1}]: `);
|
|
77
|
+
const selected = organizationFromAnswer(memberships, answer, defaultMembership.organizationId);
|
|
78
|
+
if (selected)
|
|
79
|
+
return selected;
|
|
80
|
+
console.error(`Enter a number from 1 to ${memberships.length}.`);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
export function shellLiteral(value) {
|
|
84
|
+
return `'${value.replace(/'/g, `'"'"'`)}'`;
|
|
85
|
+
}
|
|
86
|
+
//# sourceMappingURL=organization.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"organization.js","sourceRoot":"","sources":["../../src/lib/organization.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
export declare function inspectOtaKitProject(projectRoot: string): Promise<{
|
|
2
|
+
projectRoot: string;
|
|
3
|
+
capacitorConfig: {
|
|
4
|
+
path: string;
|
|
5
|
+
appId: string | null;
|
|
6
|
+
channel: string | null;
|
|
7
|
+
runtimeVersion: string | null;
|
|
8
|
+
updateStrategy: import("./capacitor-config.js").UpdateStrategy;
|
|
9
|
+
serverUrl: string;
|
|
10
|
+
serverUrlSource: import("./config.js").ConfigValueSource;
|
|
11
|
+
} | null;
|
|
12
|
+
pluginVersion: string | null;
|
|
13
|
+
buildOutput: {
|
|
14
|
+
path: string;
|
|
15
|
+
exists: boolean;
|
|
16
|
+
} | null;
|
|
17
|
+
notifyAppReady: {
|
|
18
|
+
found: boolean;
|
|
19
|
+
evidencePath: string | null;
|
|
20
|
+
};
|
|
21
|
+
authenticated: boolean;
|
|
22
|
+
findings: {
|
|
23
|
+
level: "error" | "warning" | "info";
|
|
24
|
+
message: string;
|
|
25
|
+
}[];
|
|
26
|
+
}>;
|
|
27
|
+
//# sourceMappingURL=project-inspect.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project-inspect.d.ts","sourceRoot":"","sources":["../../src/lib/project-inspect.ts"],"names":[],"mappings":"AA+EA,wBAAsB,oBAAoB,CAAC,WAAW,EAAE,MAAM;;;;;;;;;;;;;;;;;;;;;;eAY7B,OAAO,GAAG,SAAS,GAAG,MAAM;iBAAW,MAAM;;GA8C7E"}
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
import { existsSync, readFileSync, readdirSync, statSync } from 'node:fs';
|
|
2
|
+
import { dirname, join, relative, resolve, sep } from 'node:path';
|
|
3
|
+
import { readCapacitorProjectConfig } from './capacitor-config.js';
|
|
4
|
+
import { resolveConfigSnapshot } from './config.js';
|
|
5
|
+
const SOURCE_EXTENSIONS = new Set(['.js', '.jsx', '.ts', '.tsx', '.mjs', '.cjs']);
|
|
6
|
+
const SKIPPED_DIRECTORIES = new Set([
|
|
7
|
+
'.git',
|
|
8
|
+
'.next',
|
|
9
|
+
'android',
|
|
10
|
+
'build',
|
|
11
|
+
'dist',
|
|
12
|
+
'ios',
|
|
13
|
+
'node_modules',
|
|
14
|
+
]);
|
|
15
|
+
const MAX_SCANNED_FILES = 2_000;
|
|
16
|
+
const MAX_SOURCE_BYTES = 1_000_000;
|
|
17
|
+
function extension(path) {
|
|
18
|
+
const index = path.lastIndexOf('.');
|
|
19
|
+
return index >= 0 ? path.slice(index) : '';
|
|
20
|
+
}
|
|
21
|
+
function findNotifyAppReady(root) {
|
|
22
|
+
const queue = [root];
|
|
23
|
+
let scanned = 0;
|
|
24
|
+
while (queue.length > 0 && scanned < MAX_SCANNED_FILES) {
|
|
25
|
+
const directory = queue.shift();
|
|
26
|
+
if (!directory)
|
|
27
|
+
break;
|
|
28
|
+
let entries;
|
|
29
|
+
try {
|
|
30
|
+
entries = readdirSync(directory, { withFileTypes: true });
|
|
31
|
+
}
|
|
32
|
+
catch {
|
|
33
|
+
continue;
|
|
34
|
+
}
|
|
35
|
+
for (const entry of entries) {
|
|
36
|
+
const path = join(directory, entry.name);
|
|
37
|
+
if (entry.isDirectory() && !SKIPPED_DIRECTORIES.has(entry.name)) {
|
|
38
|
+
queue.push(path);
|
|
39
|
+
continue;
|
|
40
|
+
}
|
|
41
|
+
if (!entry.isFile() || !SOURCE_EXTENSIONS.has(extension(entry.name))) {
|
|
42
|
+
continue;
|
|
43
|
+
}
|
|
44
|
+
scanned += 1;
|
|
45
|
+
try {
|
|
46
|
+
if (statSync(path).size <= MAX_SOURCE_BYTES &&
|
|
47
|
+
readFileSync(path, 'utf8').includes('notifyAppReady')) {
|
|
48
|
+
return relative(root, path).split(sep).join('/');
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
catch {
|
|
52
|
+
// An unreadable source file is simply not evidence of integration.
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
return null;
|
|
57
|
+
}
|
|
58
|
+
function pluginVersion(projectRoot) {
|
|
59
|
+
const packageJsonPath = join(projectRoot, 'package.json');
|
|
60
|
+
if (!existsSync(packageJsonPath))
|
|
61
|
+
return null;
|
|
62
|
+
try {
|
|
63
|
+
const parsed = JSON.parse(readFileSync(packageJsonPath, 'utf8'));
|
|
64
|
+
return (parsed.dependencies?.['@otakit/capacitor-updater'] ??
|
|
65
|
+
parsed.devDependencies?.['@otakit/capacitor-updater'] ??
|
|
66
|
+
null);
|
|
67
|
+
}
|
|
68
|
+
catch {
|
|
69
|
+
return null;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
export async function inspectOtaKitProject(projectRoot) {
|
|
73
|
+
const root = resolve(projectRoot);
|
|
74
|
+
const [capacitor, snapshot] = await Promise.all([
|
|
75
|
+
readCapacitorProjectConfig(root),
|
|
76
|
+
resolveConfigSnapshot({ cwd: root }),
|
|
77
|
+
]);
|
|
78
|
+
const configDirectory = capacitor ? dirname(capacitor.configPath) : root;
|
|
79
|
+
const outputPath = snapshot.outputDir.value
|
|
80
|
+
? resolve(configDirectory, snapshot.outputDir.value)
|
|
81
|
+
: null;
|
|
82
|
+
const notifyAppReadyPath = findNotifyAppReady(root);
|
|
83
|
+
const installedPluginVersion = pluginVersion(root);
|
|
84
|
+
const findings = [];
|
|
85
|
+
if (!capacitor)
|
|
86
|
+
findings.push({ level: 'error', message: 'No capacitor.config.* file found.' });
|
|
87
|
+
if (!snapshot.appId.value) {
|
|
88
|
+
findings.push({ level: 'error', message: 'plugins.OtaKit.appId is not configured.' });
|
|
89
|
+
}
|
|
90
|
+
if (!installedPluginVersion) {
|
|
91
|
+
findings.push({ level: 'error', message: '@otakit/capacitor-updater is not in package.json.' });
|
|
92
|
+
}
|
|
93
|
+
if (!outputPath) {
|
|
94
|
+
findings.push({ level: 'warning', message: 'No Capacitor webDir/build output is configured.' });
|
|
95
|
+
}
|
|
96
|
+
else if (!existsSync(outputPath)) {
|
|
97
|
+
findings.push({
|
|
98
|
+
level: 'warning',
|
|
99
|
+
message: `Configured build output does not exist: ${outputPath}`,
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
if (!notifyAppReadyPath) {
|
|
103
|
+
findings.push({
|
|
104
|
+
level: 'warning',
|
|
105
|
+
message: 'No notifyAppReady() call was found in the bounded project source scan.',
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
return {
|
|
109
|
+
projectRoot: root,
|
|
110
|
+
capacitorConfig: capacitor
|
|
111
|
+
? {
|
|
112
|
+
path: capacitor.configPath,
|
|
113
|
+
appId: capacitor.appId ?? null,
|
|
114
|
+
channel: capacitor.channel ?? null,
|
|
115
|
+
runtimeVersion: capacitor.runtimeVersion ?? null,
|
|
116
|
+
updateStrategy: capacitor.updateStrategy ?? 'zip',
|
|
117
|
+
serverUrl: snapshot.serverUrl.value,
|
|
118
|
+
serverUrlSource: snapshot.serverUrl.source,
|
|
119
|
+
}
|
|
120
|
+
: null,
|
|
121
|
+
pluginVersion: installedPluginVersion,
|
|
122
|
+
buildOutput: outputPath ? { path: outputPath, exists: existsSync(outputPath) } : null,
|
|
123
|
+
notifyAppReady: {
|
|
124
|
+
found: notifyAppReadyPath !== null,
|
|
125
|
+
evidencePath: notifyAppReadyPath,
|
|
126
|
+
},
|
|
127
|
+
authenticated: snapshot.authToken.value !== null,
|
|
128
|
+
findings,
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
//# sourceMappingURL=project-inspect.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project-inspect.js","sourceRoot":"","sources":["../../src/lib/project-inspect.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,8 +5,14 @@ type TokenStoreOperationResult = {
|
|
|
5
5
|
type TokenDeleteResult = TokenStoreOperationResult & {
|
|
6
6
|
deleted: boolean;
|
|
7
7
|
};
|
|
8
|
-
export
|
|
9
|
-
|
|
8
|
+
export type StoredAuthProfile = {
|
|
9
|
+
token: string;
|
|
10
|
+
userId?: string;
|
|
11
|
+
organizationId?: string;
|
|
12
|
+
};
|
|
13
|
+
export declare function readStoredAuthProfile(serverUrl: string): Promise<StoredAuthProfile | null>;
|
|
14
|
+
export declare function storeAuthProfile(serverUrl: string, profile: StoredAuthProfile): Promise<TokenStoreOperationResult>;
|
|
15
|
+
export declare function storeSelectedOrganization(serverUrl: string, userId: string, organizationId: string): Promise<TokenStoreOperationResult>;
|
|
10
16
|
export declare function clearStoredAccessToken(serverUrl: string): Promise<TokenDeleteResult>;
|
|
11
17
|
export {};
|
|
12
18
|
//# sourceMappingURL=token-store.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"token-store.d.ts","sourceRoot":"","sources":["../../src/lib/token-store.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"token-store.d.ts","sourceRoot":"","sources":["../../src/lib/token-store.ts"],"names":[],"mappings":"AAKA,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;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB,CAAC;AA4GF,wBAAsB,qBAAqB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC,CAWhG;AAED,wBAAsB,gBAAgB,CACpC,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,iBAAiB,GACzB,OAAO,CAAC,yBAAyB,CAAC,CAgBpC;AAED,wBAAsB,yBAAyB,CAC7C,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,EACd,cAAc,EAAE,MAAM,GACrB,OAAO,CAAC,yBAAyB,CAAC,CAIpC;AAED,wBAAsB,sBAAsB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC,CA8B1F"}
|
package/dist/lib/token-store.js
CHANGED
|
@@ -1,6 +1,10 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { randomUUID } from 'node:crypto';
|
|
2
|
+
import { chmod, mkdir, readFile, rename, unlink, writeFile } from 'node:fs/promises';
|
|
2
3
|
import { homedir } from 'node:os';
|
|
3
4
|
import { dirname, join } from 'node:path';
|
|
5
|
+
function emptyPayload() {
|
|
6
|
+
return { version: 2, profiles: {} };
|
|
7
|
+
}
|
|
4
8
|
function getAuthFilePath() {
|
|
5
9
|
if (process.platform === 'win32') {
|
|
6
10
|
const appData = process.env.APPDATA?.trim();
|
|
@@ -11,70 +15,111 @@ function getAuthFilePath() {
|
|
|
11
15
|
const baseDir = xdgConfigHome && xdgConfigHome.length > 0 ? xdgConfigHome : join(homedir(), '.config');
|
|
12
16
|
return join(baseDir, 'otakit', 'auth.json');
|
|
13
17
|
}
|
|
18
|
+
function normalizeProfile(value) {
|
|
19
|
+
if (!value || typeof value !== 'object' || Array.isArray(value))
|
|
20
|
+
return null;
|
|
21
|
+
const raw = value;
|
|
22
|
+
const token = typeof raw.token === 'string' ? raw.token.trim() : '';
|
|
23
|
+
if (!token)
|
|
24
|
+
return null;
|
|
25
|
+
const userId = typeof raw.userId === 'string' ? raw.userId.trim() : '';
|
|
26
|
+
const organizationId = typeof raw.organizationId === 'string' ? raw.organizationId.trim() : '';
|
|
27
|
+
return {
|
|
28
|
+
token,
|
|
29
|
+
...(userId ? { userId } : {}),
|
|
30
|
+
...(organizationId ? { organizationId } : {}),
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
function normalizeProfiles(value) {
|
|
34
|
+
if (!value || typeof value !== 'object' || Array.isArray(value))
|
|
35
|
+
return {};
|
|
36
|
+
const profiles = {};
|
|
37
|
+
for (const [serverUrl, rawProfile] of Object.entries(value)) {
|
|
38
|
+
const profile = normalizeProfile(rawProfile);
|
|
39
|
+
if (profile)
|
|
40
|
+
profiles[serverUrl] = profile;
|
|
41
|
+
}
|
|
42
|
+
return profiles;
|
|
43
|
+
}
|
|
44
|
+
function migrateLegacyTokens(value) {
|
|
45
|
+
if (!value || typeof value !== 'object' || Array.isArray(value))
|
|
46
|
+
return {};
|
|
47
|
+
const profiles = {};
|
|
48
|
+
for (const [serverUrl, rawToken] of Object.entries(value)) {
|
|
49
|
+
if (typeof rawToken === 'string' && rawToken.trim()) {
|
|
50
|
+
profiles[serverUrl] = { token: rawToken.trim() };
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
return profiles;
|
|
54
|
+
}
|
|
14
55
|
async function readPayload(path) {
|
|
15
56
|
const raw = await readFile(path, 'utf-8');
|
|
16
57
|
const parsed = JSON.parse(raw);
|
|
17
|
-
if (parsed
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
}
|
|
26
|
-
return { tokens: normalized };
|
|
27
|
-
}
|
|
28
|
-
}
|
|
29
|
-
return { tokens: {} };
|
|
58
|
+
if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed))
|
|
59
|
+
return emptyPayload();
|
|
60
|
+
const record = parsed;
|
|
61
|
+
const profiles = normalizeProfiles(record.profiles);
|
|
62
|
+
if (Object.keys(profiles).length > 0 || record.version === 2) {
|
|
63
|
+
return { version: 2, profiles };
|
|
64
|
+
}
|
|
65
|
+
return { version: 2, profiles: migrateLegacyTokens(record.tokens) };
|
|
30
66
|
}
|
|
31
67
|
async function writePayload(path, payload) {
|
|
32
|
-
|
|
33
|
-
await
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
let payload;
|
|
68
|
+
const directory = dirname(path);
|
|
69
|
+
await mkdir(directory, { recursive: true, mode: 0o700 });
|
|
70
|
+
await chmod(directory, 0o700);
|
|
71
|
+
const temporaryPath = join(directory, `.auth-${process.pid}-${randomUUID()}.tmp`);
|
|
72
|
+
const compatiblePayload = {
|
|
73
|
+
...payload,
|
|
74
|
+
tokens: Object.fromEntries(Object.entries(payload.profiles).map(([serverUrl, profile]) => [serverUrl, profile.token])),
|
|
75
|
+
};
|
|
41
76
|
try {
|
|
42
|
-
|
|
77
|
+
await writeFile(temporaryPath, `${JSON.stringify(compatiblePayload, null, 2)}\n`, {
|
|
78
|
+
encoding: 'utf-8',
|
|
79
|
+
mode: 0o600,
|
|
80
|
+
flag: 'wx',
|
|
81
|
+
});
|
|
82
|
+
await rename(temporaryPath, path);
|
|
83
|
+
await chmod(path, 0o600);
|
|
43
84
|
}
|
|
44
85
|
catch (error) {
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
}
|
|
48
|
-
const reason = error instanceof Error ? error.message : 'unknown error';
|
|
49
|
-
console.warn(`Warning: could not read auth file at ${path}: ${reason}`);
|
|
50
|
-
return null;
|
|
86
|
+
await unlink(temporaryPath).catch(() => undefined);
|
|
87
|
+
throw error;
|
|
51
88
|
}
|
|
52
|
-
|
|
53
|
-
|
|
89
|
+
}
|
|
90
|
+
async function readPayloadOrEmpty(path) {
|
|
91
|
+
try {
|
|
92
|
+
return await readPayload(path);
|
|
54
93
|
}
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
94
|
+
catch (error) {
|
|
95
|
+
if (error.code === 'ENOENT')
|
|
96
|
+
return emptyPayload();
|
|
97
|
+
const reason = error instanceof Error ? error.message : 'unknown error';
|
|
98
|
+
console.warn(`Warning: auth file at ${path} is unreadable, recreating it (${reason}).`);
|
|
99
|
+
return emptyPayload();
|
|
58
100
|
}
|
|
59
|
-
return null;
|
|
60
101
|
}
|
|
61
|
-
export async function
|
|
102
|
+
export async function readStoredAuthProfile(serverUrl) {
|
|
62
103
|
const path = getAuthFilePath();
|
|
63
|
-
let payload;
|
|
64
104
|
try {
|
|
65
|
-
payload =
|
|
105
|
+
const payload = await readPayload(path);
|
|
106
|
+
return payload.profiles[serverUrl] ?? null;
|
|
66
107
|
}
|
|
67
108
|
catch (error) {
|
|
68
|
-
if (error.code === 'ENOENT')
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
console.warn(`Warning: auth file at ${path} is unreadable, recreating it (${reason}).`);
|
|
74
|
-
payload = { tokens: {} };
|
|
75
|
-
}
|
|
109
|
+
if (error.code === 'ENOENT')
|
|
110
|
+
return null;
|
|
111
|
+
const reason = error instanceof Error ? error.message : 'unknown error';
|
|
112
|
+
console.warn(`Warning: could not read auth file at ${path}: ${reason}`);
|
|
113
|
+
return null;
|
|
76
114
|
}
|
|
77
|
-
|
|
115
|
+
}
|
|
116
|
+
export async function storeAuthProfile(serverUrl, profile) {
|
|
117
|
+
const path = getAuthFilePath();
|
|
118
|
+
const normalized = normalizeProfile(profile);
|
|
119
|
+
if (!normalized)
|
|
120
|
+
return { ok: false, reason: 'Access token is required.' };
|
|
121
|
+
const payload = await readPayloadOrEmpty(path);
|
|
122
|
+
payload.profiles[serverUrl] = normalized;
|
|
78
123
|
try {
|
|
79
124
|
await writePayload(path, payload);
|
|
80
125
|
return { ok: true };
|
|
@@ -82,10 +127,16 @@ export async function storeAccessToken(serverUrl, token) {
|
|
|
82
127
|
catch (error) {
|
|
83
128
|
return {
|
|
84
129
|
ok: false,
|
|
85
|
-
reason: error instanceof Error ? error.message : 'Failed to save
|
|
130
|
+
reason: error instanceof Error ? error.message : 'Failed to save auth profile.',
|
|
86
131
|
};
|
|
87
132
|
}
|
|
88
133
|
}
|
|
134
|
+
export async function storeSelectedOrganization(serverUrl, userId, organizationId) {
|
|
135
|
+
const existing = await readStoredAuthProfile(serverUrl);
|
|
136
|
+
if (!existing)
|
|
137
|
+
return { ok: false, reason: 'No stored login exists for this server.' };
|
|
138
|
+
return storeAuthProfile(serverUrl, { token: existing.token, userId, organizationId });
|
|
139
|
+
}
|
|
89
140
|
export async function clearStoredAccessToken(serverUrl) {
|
|
90
141
|
const path = getAuthFilePath();
|
|
91
142
|
let payload;
|
|
@@ -102,34 +153,21 @@ export async function clearStoredAccessToken(serverUrl) {
|
|
|
102
153
|
reason: error instanceof Error ? error.message : 'Failed to read auth store.',
|
|
103
154
|
};
|
|
104
155
|
}
|
|
105
|
-
if (!payload)
|
|
106
|
-
return { ok: true, deleted: false };
|
|
107
|
-
}
|
|
108
|
-
const keysToDelete = [serverUrl];
|
|
109
|
-
let deleted = false;
|
|
110
|
-
for (const key of keysToDelete) {
|
|
111
|
-
if (payload.tokens[key]) {
|
|
112
|
-
delete payload.tokens[key];
|
|
113
|
-
deleted = true;
|
|
114
|
-
}
|
|
115
|
-
}
|
|
116
|
-
if (!deleted) {
|
|
156
|
+
if (!payload.profiles[serverUrl])
|
|
117
157
|
return { ok: true, deleted: false };
|
|
118
|
-
|
|
158
|
+
delete payload.profiles[serverUrl];
|
|
119
159
|
try {
|
|
120
|
-
if (Object.keys(payload.
|
|
160
|
+
if (Object.keys(payload.profiles).length === 0)
|
|
121
161
|
await unlink(path);
|
|
122
|
-
|
|
123
|
-
else {
|
|
162
|
+
else
|
|
124
163
|
await writePayload(path, payload);
|
|
125
|
-
}
|
|
126
164
|
return { ok: true, deleted: true };
|
|
127
165
|
}
|
|
128
166
|
catch (error) {
|
|
129
167
|
return {
|
|
130
168
|
ok: false,
|
|
131
169
|
deleted: false,
|
|
132
|
-
reason: error instanceof Error ? error.message : 'Failed to delete
|
|
170
|
+
reason: error instanceof Error ? error.message : 'Failed to delete auth profile.',
|
|
133
171
|
};
|
|
134
172
|
}
|
|
135
173
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"token-store.js","sourceRoot":"","sources":["../../src/lib/token-store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"token-store.js","sourceRoot":"","sources":["../../src/lib/token-store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACrF,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAsB1C,SAAS,YAAY;IACnB,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;AACtC,CAAC;AAED,SAAS,eAAe;IACtB,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;QACjC,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC;QAC5C,MAAM,OAAO,GAAG,OAAO,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;QAChG,OAAO,IAAI,CAAC,OAAO,EAAE,QAAQ,EAAE,WAAW,CAAC,CAAC;IAC9C,CAAC;IAED,MAAM,aAAa,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE,IAAI,EAAE,CAAC;IAC1D,MAAM,OAAO,GACX,aAAa,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,CAAC,CAAC;IACzF,OAAO,IAAI,CAAC,OAAO,EAAE,QAAQ,EAAE,WAAW,CAAC,CAAC;AAC9C,CAAC;AAED,SAAS,gBAAgB,CAAC,KAAc;IACtC,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAC7E,MAAM,GAAG,GAAG,KAAgC,CAAC;IAC7C,MAAM,KAAK,GAAG,OAAO,GAAG,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IACpE,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IACxB,MAAM,MAAM,GAAG,OAAO,GAAG,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IACvE,MAAM,cAAc,GAAG,OAAO,GAAG,CAAC,cAAc,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAC/F,OAAO;QACL,KAAK;QACL,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7B,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC9C,CAAC;AACJ,CAAC;AAED,SAAS,iBAAiB,CAAC,KAAc;IACvC,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAC3E,MAAM,QAAQ,GAAsC,EAAE,CAAC;IACvD,KAAK,MAAM,CAAC,SAAS,EAAE,UAAU,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QAC5D,MAAM,OAAO,GAAG,gBAAgB,CAAC,UAAU,CAAC,CAAC;QAC7C,IAAI,OAAO;YAAE,QAAQ,CAAC,SAAS,CAAC,GAAG,OAAO,CAAC;IAC7C,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,SAAS,mBAAmB,CAAC,KAAc;IACzC,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAC3E,MAAM,QAAQ,GAAsC,EAAE,CAAC;IACvD,KAAK,MAAM,CAAC,SAAS,EAAE,QAAQ,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1D,IAAI,OAAO,QAAQ,KAAK,QAAQ,IAAI,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC;YACpD,QAAQ,CAAC,SAAS,CAAC,GAAG,EAAE,KAAK,EAAE,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC;QACnD,CAAC;IACH,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,KAAK,UAAU,WAAW,CAAC,IAAY;IACrC,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAC1C,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAY,CAAC;IAC1C,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;QAAE,OAAO,YAAY,EAAE,CAAC;IAC1F,MAAM,MAAM,GAAG,MAAiC,CAAC;IACjD,MAAM,QAAQ,GAAG,iBAAiB,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IACpD,IAAI,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,MAAM,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,KAAK,CAAC,EAAE,CAAC;QAC7D,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC;IAClC,CAAC;IACD,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,QAAQ,EAAE,mBAAmB,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;AACtE,CAAC;AAED,KAAK,UAAU,YAAY,CAAC,IAAY,EAAE,OAA0B;IAClE,MAAM,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAChC,MAAM,KAAK,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IACzD,MAAM,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;IAE9B,MAAM,aAAa,GAAG,IAAI,CAAC,SAAS,EAAE,SAAS,OAAO,CAAC,GAAG,IAAI,UAAU,EAAE,MAAM,CAAC,CAAC;IAClF,MAAM,iBAAiB,GAAG;QACxB,GAAG,OAAO;QACV,MAAM,EAAE,MAAM,CAAC,WAAW,CACxB,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,EAAE,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC,SAAS,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,CAC3F;KACF,CAAC;IACF,IAAI,CAAC;QACH,MAAM,SAAS,CAAC,aAAa,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,iBAAiB,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE;YAChF,QAAQ,EAAE,OAAO;YACjB,IAAI,EAAE,KAAK;YACX,IAAI,EAAE,IAAI;SACX,CAAC,CAAC;QACH,MAAM,MAAM,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC;QAClC,MAAM,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAC3B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,MAAM,CAAC,aAAa,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;QACnD,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED,KAAK,UAAU,kBAAkB,CAAC,IAAY;IAC5C,IAAI,CAAC;QACH,OAAO,MAAM,WAAW,CAAC,IAAI,CAAC,CAAC;IACjC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ;YAAE,OAAO,YAAY,EAAE,CAAC;QAC9E,MAAM,MAAM,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC;QACxE,OAAO,CAAC,IAAI,CAAC,yBAAyB,IAAI,kCAAkC,MAAM,IAAI,CAAC,CAAC;QACxF,OAAO,YAAY,EAAE,CAAC;IACxB,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,SAAiB;IAC3D,MAAM,IAAI,GAAG,eAAe,EAAE,CAAC;IAC/B,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,IAAI,CAAC,CAAC;QACxC,OAAO,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,IAAI,CAAC;IAC7C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ;YAAE,OAAO,IAAI,CAAC;QACpE,MAAM,MAAM,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC;QACxE,OAAO,CAAC,IAAI,CAAC,wCAAwC,IAAI,KAAK,MAAM,EAAE,CAAC,CAAC;QACxE,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,SAAiB,EACjB,OAA0B;IAE1B,MAAM,IAAI,GAAG,eAAe,EAAE,CAAC;IAC/B,MAAM,UAAU,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC;IAC7C,IAAI,CAAC,UAAU;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,2BAA2B,EAAE,CAAC;IAC3E,MAAM,OAAO,GAAG,MAAM,kBAAkB,CAAC,IAAI,CAAC,CAAC;IAC/C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,GAAG,UAAU,CAAC;IAEzC,IAAI,CAAC;QACH,MAAM,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QAClC,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;IACtB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO;YACL,EAAE,EAAE,KAAK;YACT,MAAM,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,8BAA8B;SAChF,CAAC;IACJ,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,yBAAyB,CAC7C,SAAiB,EACjB,MAAc,EACd,cAAsB;IAEtB,MAAM,QAAQ,GAAG,MAAM,qBAAqB,CAAC,SAAS,CAAC,CAAC;IACxD,IAAI,CAAC,QAAQ;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,yCAAyC,EAAE,CAAC;IACvF,OAAO,gBAAgB,CAAC,SAAS,EAAE,EAAE,KAAK,EAAE,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,cAAc,EAAE,CAAC,CAAC;AACxF,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAAC,SAAiB;IAC5D,MAAM,IAAI,GAAG,eAAe,EAAE,CAAC;IAC/B,IAAI,OAA0B,CAAC;IAC/B,IAAI,CAAC;QACH,OAAO,GAAG,MAAM,WAAW,CAAC,IAAI,CAAC,CAAC;IACpC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACvD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;QACtC,CAAC;QACD,OAAO;YACL,EAAE,EAAE,KAAK;YACT,OAAO,EAAE,KAAK;YACd,MAAM,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,4BAA4B;SAC9E,CAAC;IACJ,CAAC;IAED,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC;QAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;IACtE,OAAO,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;IAEnC,IAAI,CAAC;QACH,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,MAAM,KAAK,CAAC;YAAE,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC;;YAC9D,MAAM,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QACvC,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IACrC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO;YACL,EAAE,EAAE,KAAK;YACT,OAAO,EAAE,KAAK;YACd,MAAM,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,gCAAgC;SAClF,CAAC;IACJ,CAAC;AACH,CAAC"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { ApiClient, Bundle, DeltaFileDescriptor } from './api.js';
|
|
1
|
+
import type { ApiClient, Bundle, DeltaFileDescriptor, ReleaseResult } from './api.js';
|
|
2
2
|
import type { NativePackage } from './native-deps.js';
|
|
3
3
|
export type VersionSource = 'flag' | 'env' | 'auto';
|
|
4
4
|
export type ResolvedVersion = {
|
|
@@ -21,8 +21,16 @@ export type UploadWorkflowOptions = {
|
|
|
21
21
|
strategy?: 'zip' | 'deltas';
|
|
22
22
|
nativePackages?: NativePackage[];
|
|
23
23
|
forceImmediate?: boolean;
|
|
24
|
+
autoRevert?: boolean;
|
|
25
|
+
autoRevertRatePercent?: number;
|
|
26
|
+
autoRevertMinSample?: number;
|
|
27
|
+
expectedCurrentReleaseId?: string | null;
|
|
28
|
+
idempotencyKey?: string;
|
|
29
|
+
compatibilityDecision?: 'block' | 'proceed' | 'skip';
|
|
24
30
|
encrypt?: boolean;
|
|
25
31
|
onStatus?: (message: string) => void;
|
|
32
|
+
signal?: AbortSignal;
|
|
33
|
+
manageProcessSignals?: boolean;
|
|
26
34
|
};
|
|
27
35
|
export declare const ENCRYPTION_KEY_ENV = "OTAKIT_ENCRYPTION_KEY";
|
|
28
36
|
/**
|
|
@@ -35,6 +43,7 @@ export declare function resolveEncryptionKey(encryptFlag: boolean | undefined):
|
|
|
35
43
|
export type UploadWorkflowResult = {
|
|
36
44
|
bundle: Bundle;
|
|
37
45
|
releaseChannel?: string | null;
|
|
46
|
+
release?: ReleaseResult;
|
|
38
47
|
};
|
|
39
48
|
export declare function runUploadWorkflow(options: UploadWorkflowOptions): Promise<UploadWorkflowResult>;
|
|
40
49
|
/**
|
|
@@ -1 +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,mBAAmB,EAAE,MAAM,UAAU,CAAC;
|
|
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,mBAAmB,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAKtF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AA0BtD,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;AA8CD,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,KAAK,GAAG,QAAQ,CAAC;IAC5B,cAAc,CAAC,EAAE,aAAa,EAAE,CAAC;IACjC,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,wBAAwB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,qBAAqB,CAAC,EAAE,OAAO,GAAG,SAAS,GAAG,MAAM,CAAC;IACrD,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACrC,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,oBAAoB,CAAC,EAAE,OAAO,CAAC;CAChC,CAAC;AAEF,eAAO,MAAM,kBAAkB,0BAA0B,CAAC;AAE1D;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,WAAW,EAAE,OAAO,GAAG,SAAS,GAAG,MAAM,GAAG,IAAI,CAcpF;AAED,MAAM,MAAM,oBAAoB,GAAG;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,OAAO,CAAC,EAAE,aAAa,CAAC;CACzB,CAAC;AAEF,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,qBAAqB,GAC7B,OAAO,CAAC,oBAAoB,CAAC,CAuH/B;AAED;;;GAGG;AACH,wBAAsB,iBAAiB,CAAC,eAAe,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,EAAE,CAAC,CAuC/F"}
|