claude-in-mobile 3.2.0 → 3.3.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 +3 -3
- package/dist/index.js +6 -2
- package/dist/index.js.map +1 -1
- package/dist/store/huawei.d.ts +16 -0
- package/dist/store/huawei.d.ts.map +1 -0
- package/dist/store/huawei.js +205 -0
- package/dist/store/huawei.js.map +1 -0
- package/dist/store/rustore.d.ts +17 -0
- package/dist/store/rustore.d.ts.map +1 -0
- package/dist/store/rustore.js +223 -0
- package/dist/store/rustore.js.map +1 -0
- package/dist/store/store-client.d.ts +13 -0
- package/dist/store/store-client.d.ts.map +1 -0
- package/dist/store/store-client.js +2 -0
- package/dist/store/store-client.js.map +1 -0
- package/dist/tools/context.d.ts +8 -0
- package/dist/tools/context.d.ts.map +1 -1
- package/dist/tools/context.js +3 -0
- package/dist/tools/context.js.map +1 -1
- package/dist/tools/huawei-tools.d.ts +3 -0
- package/dist/tools/huawei-tools.d.ts.map +1 -0
- package/dist/tools/huawei-tools.js +94 -0
- package/dist/tools/huawei-tools.js.map +1 -0
- package/dist/tools/interaction-tools.d.ts.map +1 -1
- package/dist/tools/interaction-tools.js +35 -6
- package/dist/tools/interaction-tools.js.map +1 -1
- package/dist/tools/rustore-tools.d.ts +3 -0
- package/dist/tools/rustore-tools.d.ts.map +1 -0
- package/dist/tools/rustore-tools.js +117 -0
- package/dist/tools/rustore-tools.js.map +1 -0
- package/dist/tools/screenshot-tools.d.ts.map +1 -1
- package/dist/tools/screenshot-tools.js +4 -2
- package/dist/tools/screenshot-tools.js.map +1 -1
- package/dist/tools/ui-tools.js +1 -1
- package/dist/tools/ui-tools.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -38,13 +38,13 @@ npx add-mcp claude-in-mobile -a cursor -y
|
|
|
38
38
|
### Claude Code CLI
|
|
39
39
|
|
|
40
40
|
```bash
|
|
41
|
-
claude mcp add --transport stdio mobile -- npx
|
|
41
|
+
claude mcp add --transport stdio mobile -- npx claude-in-mobile@latest
|
|
42
42
|
```
|
|
43
43
|
|
|
44
44
|
To add globally (available in all projects):
|
|
45
45
|
|
|
46
46
|
```bash
|
|
47
|
-
claude mcp add --scope user --transport stdio mobile -- npx
|
|
47
|
+
claude mcp add --scope user --transport stdio mobile -- npx claude-in-mobile@latest
|
|
48
48
|
```
|
|
49
49
|
|
|
50
50
|
### OpenCode
|
|
@@ -157,7 +157,7 @@ Add to your Claude Code settings (`~/.claude.json` or project settings):
|
|
|
157
157
|
### Windows
|
|
158
158
|
|
|
159
159
|
```bash
|
|
160
|
-
claude mcp add --transport stdio mobile -- cmd /c npx
|
|
160
|
+
claude mcp add --transport stdio mobile -- cmd /c npx claude-in-mobile@latest
|
|
161
161
|
```
|
|
162
162
|
|
|
163
163
|
## Requirements
|
package/dist/index.js
CHANGED
|
@@ -17,6 +17,8 @@ import { flowTools } from "./tools/flow-tools.js";
|
|
|
17
17
|
import { clipboardTools } from "./tools/clipboard-tools.js";
|
|
18
18
|
import { browserTools } from "./tools/browser-tools.js";
|
|
19
19
|
import { storeTools } from "./tools/store-tools.js";
|
|
20
|
+
import { huaweiTools } from "./tools/huawei-tools.js";
|
|
21
|
+
import { ruStoreTools } from "./tools/rustore-tools.js";
|
|
20
22
|
import { detectClient, getConfigSnippet } from "./client-adapter.js";
|
|
21
23
|
// Dispatch function (needed by batch_commands / run_flow for recursion)
|
|
22
24
|
async function handleTool(name, args, depth = 0) {
|
|
@@ -46,6 +48,8 @@ registerTools([
|
|
|
46
48
|
...clipboardTools,
|
|
47
49
|
...browserTools,
|
|
48
50
|
...storeTools,
|
|
51
|
+
...huaweiTools,
|
|
52
|
+
...ruStoreTools,
|
|
49
53
|
]);
|
|
50
54
|
// Backward compat: v3.0.x names → v3.1.x canonical names
|
|
51
55
|
registerAliases({
|
|
@@ -141,12 +145,12 @@ if (initIndex !== -1) {
|
|
|
141
145
|
// Create MCP server
|
|
142
146
|
const server = new Server({
|
|
143
147
|
name: "claude-mobile",
|
|
144
|
-
version: "3.
|
|
148
|
+
version: "3.3.0",
|
|
145
149
|
}, {
|
|
146
150
|
capabilities: {
|
|
147
151
|
tools: {},
|
|
148
152
|
},
|
|
149
|
-
instructions: "Mobile, desktop, browser automation + Google Play
|
|
153
|
+
instructions: "Mobile, desktop, browser automation + store management (Google Play, Huawei AppGallery, RuStore). IMPORTANT: Always use 'ui_tree' first to inspect the screen — it is text-based and ~10x cheaper than screenshots. Use 'screen_capture' only as fallback when visual verification is required or ui_tree is insufficient. Use 'input_tap' to interact. For stores: 'store_upload' → 'store_set_notes' → 'store_submit' (Google Play), 'huawei_upload' → 'huawei_set_notes' → 'huawei_submit' (Huawei), 'rustore_upload' → 'rustore_set_notes' → 'rustore_submit' (RuStore). Use 'device_list' to see connected devices.",
|
|
150
154
|
});
|
|
151
155
|
// Detect client after MCP handshake and apply per-client adaptations
|
|
152
156
|
server.oninitialized = () => {
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AACnE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EACL,qBAAqB,EACrB,sBAAsB,GACvB,MAAM,oCAAoC,CAAC;AAE5C,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,2BAA2B,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAC7H,OAAO,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAC5E,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAC9D,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAChE,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAC9C,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAChD,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAC9D,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC5D,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACpD,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAErE,wEAAwE;AACxE,KAAK,UAAU,UAAU,CAAC,IAAY,EAAE,IAA6B,EAAE,QAAgB,CAAC;IACtF,IAAI,KAAK,GAAG,mBAAmB,EAAE,CAAC;QAChC,MAAM,IAAI,KAAK,CAAC,4BAA4B,mBAAmB,yFAAyF,CAAC,CAAC;IAC5J,CAAC;IAED,MAAM,QAAQ,GAAG,eAAe,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAC7C,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,MAAM,IAAI,KAAK,CAAC,iBAAiB,IAAI,EAAE,CAAC,CAAC;IAC3C,CAAC;IAED,OAAO,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;AACrD,CAAC;AAED,qDAAqD;AACrD,MAAM,GAAG,GAAG,iBAAiB,CAAC,UAAU,CAAC,CAAC;AAE1C,2BAA2B;AAC3B,aAAa,CAAC;IACZ,GAAG,WAAW;IACd,GAAG,eAAe;IAClB,GAAG,gBAAgB;IACnB,GAAG,OAAO;IACV,GAAG,QAAQ;IACX,GAAG,eAAe;IAClB,GAAG,WAAW;IACd,GAAG,YAAY;IACf,GAAG,WAAW;IACd,GAAG,SAAS;IACZ,GAAG,cAAc;IACjB,GAAG,YAAY;IACf,GAAG,UAAU;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { StoreClient, UploadResult } from "./store-client.js";
|
|
2
|
+
export declare class HuaweiAppGalleryClient implements StoreClient {
|
|
3
|
+
private tokenCache;
|
|
4
|
+
private appIdCache;
|
|
5
|
+
private drafts;
|
|
6
|
+
private getToken;
|
|
7
|
+
private api;
|
|
8
|
+
private getAppId;
|
|
9
|
+
upload(packageName: string, filePath: string): Promise<UploadResult>;
|
|
10
|
+
setReleaseNotes(packageName: string, language: string, text: string): Promise<void>;
|
|
11
|
+
submit(packageName: string, _options?: {
|
|
12
|
+
rollout?: number;
|
|
13
|
+
}): Promise<void>;
|
|
14
|
+
getReleases(packageName: string): Promise<string>;
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=huawei.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"huawei.d.ts","sourceRoot":"","sources":["../../src/store/huawei.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AA4DnE,qBAAa,sBAAuB,YAAW,WAAW;IACxD,OAAO,CAAC,UAAU,CAA2B;IAC7C,OAAO,CAAC,UAAU,CAA6B;IAC/C,OAAO,CAAC,MAAM,CAAiC;YAIjC,QAAQ;YAsCR,GAAG;YAkBH,QAAQ;IAyBhB,MAAM,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IAiFpE,eAAe,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAanF,MAAM,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAkB3E,WAAW,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;CAsBxD"}
|
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
import { existsSync, createReadStream } from "fs";
|
|
2
|
+
import { stat } from "fs/promises";
|
|
3
|
+
import { Readable } from "stream";
|
|
4
|
+
const OAUTH_URL = "https://connect-api.cloud.huawei.com/api/oauth2/v1/token";
|
|
5
|
+
const BASE = "https://connect-api.cloud.huawei.com/api/publish/v2";
|
|
6
|
+
const UPLOAD_KIT_BASE = "https://connect-api.cloud.huawei.com/api/publishingkit/v1";
|
|
7
|
+
function buildCredentials() {
|
|
8
|
+
const clientId = process.env.HUAWEI_CLIENT_ID;
|
|
9
|
+
const clientSecret = process.env.HUAWEI_CLIENT_SECRET;
|
|
10
|
+
if (!clientId || !clientSecret) {
|
|
11
|
+
throw new Error("Huawei AppGallery: missing credentials. Set HUAWEI_CLIENT_ID and HUAWEI_CLIENT_SECRET environment variables.");
|
|
12
|
+
}
|
|
13
|
+
return { clientId, clientSecret };
|
|
14
|
+
}
|
|
15
|
+
export class HuaweiAppGalleryClient {
|
|
16
|
+
tokenCache = null;
|
|
17
|
+
appIdCache = new Map();
|
|
18
|
+
drafts = new Map();
|
|
19
|
+
// ── Auth ─────────────────────────────────────────────────────────────────────
|
|
20
|
+
async getToken() {
|
|
21
|
+
const now = Date.now();
|
|
22
|
+
if (this.tokenCache && this.tokenCache.expiresAt > now + 60_000) {
|
|
23
|
+
return this.tokenCache.token;
|
|
24
|
+
}
|
|
25
|
+
const { clientId, clientSecret } = buildCredentials();
|
|
26
|
+
const body = new URLSearchParams({
|
|
27
|
+
grant_type: "client_credentials",
|
|
28
|
+
client_id: clientId,
|
|
29
|
+
client_secret: clientSecret,
|
|
30
|
+
});
|
|
31
|
+
const res = await fetch(OAUTH_URL, {
|
|
32
|
+
method: "POST",
|
|
33
|
+
headers: { "Content-Type": "application/x-www-form-urlencoded" },
|
|
34
|
+
body: body.toString(),
|
|
35
|
+
});
|
|
36
|
+
if (!res.ok) {
|
|
37
|
+
const text = await res.text();
|
|
38
|
+
throw new Error(`Huawei OAuth failed ${res.status}: ${text}`);
|
|
39
|
+
}
|
|
40
|
+
const data = await res.json();
|
|
41
|
+
if (!data.access_token) {
|
|
42
|
+
throw new Error("Huawei OAuth: no access_token in response");
|
|
43
|
+
}
|
|
44
|
+
this.tokenCache = {
|
|
45
|
+
token: data.access_token,
|
|
46
|
+
expiresAt: now + data.expires_in * 1000,
|
|
47
|
+
};
|
|
48
|
+
return this.tokenCache.token;
|
|
49
|
+
}
|
|
50
|
+
// ── API helpers ──────────────────────────────────────────────────────────────
|
|
51
|
+
async api(method, url, token, body) {
|
|
52
|
+
const res = await fetch(url, {
|
|
53
|
+
method,
|
|
54
|
+
headers: {
|
|
55
|
+
Authorization: `Bearer ${token}`,
|
|
56
|
+
"Content-Type": "application/json",
|
|
57
|
+
},
|
|
58
|
+
body: body !== undefined ? JSON.stringify(body) : undefined,
|
|
59
|
+
});
|
|
60
|
+
if (!res.ok) {
|
|
61
|
+
const text = await res.text();
|
|
62
|
+
throw new Error(`Huawei API ${res.status} ${method} ${url}: ${text}`);
|
|
63
|
+
}
|
|
64
|
+
if (res.status === 204 || res.headers.get("content-length") === "0")
|
|
65
|
+
return {};
|
|
66
|
+
return res.json();
|
|
67
|
+
}
|
|
68
|
+
async getAppId(packageName, token) {
|
|
69
|
+
const cached = this.appIdCache.get(packageName);
|
|
70
|
+
if (cached)
|
|
71
|
+
return cached;
|
|
72
|
+
const data = await this.api("GET", `${BASE}/app-id-list?packageName=${encodeURIComponent(packageName)}`, token);
|
|
73
|
+
if (data.ret.code !== 0) {
|
|
74
|
+
throw new Error(`Huawei: failed to get appId for "${packageName}": ${data.ret.msg}`);
|
|
75
|
+
}
|
|
76
|
+
const entry = data.appIds?.[0];
|
|
77
|
+
if (!entry) {
|
|
78
|
+
throw new Error(`Huawei: no appId found for package "${packageName}"`);
|
|
79
|
+
}
|
|
80
|
+
this.appIdCache.set(packageName, entry.appId);
|
|
81
|
+
return entry.appId;
|
|
82
|
+
}
|
|
83
|
+
// ── Public API ───────────────────────────────────────────────────────────────
|
|
84
|
+
async upload(packageName, filePath) {
|
|
85
|
+
if (!existsSync(filePath)) {
|
|
86
|
+
throw new Error(`File not found: ${filePath}`);
|
|
87
|
+
}
|
|
88
|
+
const token = await this.getToken();
|
|
89
|
+
const appId = await this.getAppId(packageName, token);
|
|
90
|
+
const ext = filePath.toLowerCase().endsWith(".aab") ? "AAB" : "APK";
|
|
91
|
+
const fileName = filePath.split("/").pop() ?? filePath;
|
|
92
|
+
const { size: fileSize } = await stat(filePath);
|
|
93
|
+
// Step 1: Get upload URL and authCode
|
|
94
|
+
const urlData = await this.api("GET", `${UPLOAD_KIT_BASE}/files/uploadUrl?appId=${appId}&fileType=${ext}&releaseType=1`, token);
|
|
95
|
+
if (urlData.ret.code !== 0) {
|
|
96
|
+
throw new Error(`Huawei: failed to get upload URL: ${urlData.ret.msg}`);
|
|
97
|
+
}
|
|
98
|
+
if (!urlData.uploadUrl || !urlData.authCode) {
|
|
99
|
+
throw new Error("Huawei: upload URL response missing uploadUrl or authCode");
|
|
100
|
+
}
|
|
101
|
+
// Step 2: Upload file via multipart/form-data
|
|
102
|
+
const formData = new FormData();
|
|
103
|
+
const webStream = Readable.toWeb(createReadStream(filePath));
|
|
104
|
+
const blob = new Blob([await streamToBuffer(webStream)], { type: "application/octet-stream" });
|
|
105
|
+
formData.append("file", blob, fileName);
|
|
106
|
+
formData.append("token", urlData.authCode);
|
|
107
|
+
const uploadRes = await fetch(urlData.uploadUrl, {
|
|
108
|
+
method: "POST",
|
|
109
|
+
body: formData,
|
|
110
|
+
});
|
|
111
|
+
if (!uploadRes.ok) {
|
|
112
|
+
const text = await uploadRes.text();
|
|
113
|
+
throw new Error(`Huawei: file upload failed ${uploadRes.status}: ${text}`);
|
|
114
|
+
}
|
|
115
|
+
const uploadData = await uploadRes.json();
|
|
116
|
+
if (uploadData.result.resultCode !== 0) {
|
|
117
|
+
throw new Error(`Huawei: file upload error: ${uploadData.result.resultMsg}`);
|
|
118
|
+
}
|
|
119
|
+
const fileInfo = uploadData.fileInfoList?.[0];
|
|
120
|
+
if (!fileInfo) {
|
|
121
|
+
throw new Error("Huawei: upload response missing fileInfoList");
|
|
122
|
+
}
|
|
123
|
+
// Step 3: Attach uploaded file to app
|
|
124
|
+
await this.api("PUT", `${BASE}/app-file-info?appId=${appId}`, token, {
|
|
125
|
+
fileType: 5,
|
|
126
|
+
files: [{
|
|
127
|
+
fileId: fileInfo.fileId,
|
|
128
|
+
fileName: fileInfo.fileName,
|
|
129
|
+
fileDestUrl: urlData.uploadUrl,
|
|
130
|
+
size: fileSize,
|
|
131
|
+
}],
|
|
132
|
+
});
|
|
133
|
+
// Store draft state for release notes and submit
|
|
134
|
+
this.drafts.set(packageName, {
|
|
135
|
+
fileId: fileInfo.fileId,
|
|
136
|
+
fileName: fileInfo.fileName,
|
|
137
|
+
fileSize,
|
|
138
|
+
fileType: ext,
|
|
139
|
+
releaseNotes: [],
|
|
140
|
+
});
|
|
141
|
+
return { versionId: fileInfo.fileId };
|
|
142
|
+
}
|
|
143
|
+
async setReleaseNotes(packageName, language, text) {
|
|
144
|
+
const draft = this.drafts.get(packageName);
|
|
145
|
+
if (!draft) {
|
|
146
|
+
throw new Error(`Huawei: no active upload for "${packageName}". Call huawei_upload first.`);
|
|
147
|
+
}
|
|
148
|
+
const idx = draft.releaseNotes.findIndex(n => n.language === language);
|
|
149
|
+
if (idx >= 0) {
|
|
150
|
+
draft.releaseNotes[idx].text = text;
|
|
151
|
+
}
|
|
152
|
+
else {
|
|
153
|
+
draft.releaseNotes.push({ language, text });
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
async submit(packageName, _options) {
|
|
157
|
+
const token = await this.getToken();
|
|
158
|
+
const appId = await this.getAppId(packageName, token);
|
|
159
|
+
// Submit the app for review/publishing
|
|
160
|
+
const data = await this.api("POST", `${BASE}/app-submit?appId=${appId}`, token);
|
|
161
|
+
if (data.ret.code !== 0) {
|
|
162
|
+
throw new Error(`Huawei: submit failed: ${data.ret.msg}`);
|
|
163
|
+
}
|
|
164
|
+
this.drafts.delete(packageName);
|
|
165
|
+
}
|
|
166
|
+
async getReleases(packageName) {
|
|
167
|
+
const token = await this.getToken();
|
|
168
|
+
const appId = await this.getAppId(packageName, token);
|
|
169
|
+
const data = await this.api("GET", `${BASE}/app-info?appId=${appId}`, token);
|
|
170
|
+
if (data.ret.code !== 0) {
|
|
171
|
+
throw new Error(`Huawei: getReleases failed: ${data.ret.msg}`);
|
|
172
|
+
}
|
|
173
|
+
if (!data.appInfo) {
|
|
174
|
+
return `${packageName}: no release info available`;
|
|
175
|
+
}
|
|
176
|
+
const { versionCode, releaseState } = data.appInfo;
|
|
177
|
+
const statusLabel = formatReleaseState(releaseState);
|
|
178
|
+
return `${packageName}: v${versionCode} — ${statusLabel}`;
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
// ── Helpers ──────────────────────────────────────────────────────────────────
|
|
182
|
+
async function streamToBuffer(stream) {
|
|
183
|
+
const reader = stream.getReader();
|
|
184
|
+
const chunks = [];
|
|
185
|
+
while (true) {
|
|
186
|
+
const { done, value } = await reader.read();
|
|
187
|
+
if (done)
|
|
188
|
+
break;
|
|
189
|
+
chunks.push(value);
|
|
190
|
+
}
|
|
191
|
+
return Buffer.concat(chunks);
|
|
192
|
+
}
|
|
193
|
+
function formatReleaseState(state) {
|
|
194
|
+
const states = {
|
|
195
|
+
1: "Draft",
|
|
196
|
+
2: "Under review",
|
|
197
|
+
3: "Published",
|
|
198
|
+
4: "Rejected",
|
|
199
|
+
5: "Removed",
|
|
200
|
+
6: "Update in review",
|
|
201
|
+
7: "Update published",
|
|
202
|
+
};
|
|
203
|
+
return states[state] ?? `Unknown (${state})`;
|
|
204
|
+
}
|
|
205
|
+
//# sourceMappingURL=huawei.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"huawei.js","sourceRoot":"","sources":["../../src/store/huawei.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { StoreClient, UploadResult } from "./store-client.js";
|
|
2
|
+
export declare class RuStoreClient implements StoreClient {
|
|
3
|
+
private tokenCache;
|
|
4
|
+
private drafts;
|
|
5
|
+
private getToken;
|
|
6
|
+
private api;
|
|
7
|
+
private createDraftVersion;
|
|
8
|
+
upload(packageName: string, filePath: string): Promise<UploadResult>;
|
|
9
|
+
setReleaseNotes(packageName: string, language: string, text: string): Promise<void>;
|
|
10
|
+
submit(packageName: string, _options?: {
|
|
11
|
+
rollout?: number;
|
|
12
|
+
}): Promise<void>;
|
|
13
|
+
getReleases(packageName: string): Promise<string>;
|
|
14
|
+
discard(packageName: string): Promise<void>;
|
|
15
|
+
private deleteDraft;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=rustore.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rustore.d.ts","sourceRoot":"","sources":["../../src/store/rustore.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAuGnE,qBAAa,aAAc,YAAW,WAAW;IAC/C,OAAO,CAAC,UAAU,CAA2B;IAC7C,OAAO,CAAC,MAAM,CAAiC;YAIjC,QAAQ;YAoCR,GAAG;YAkBH,kBAAkB;IAiB1B,MAAM,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IAkDpE,eAAe,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAanF,MAAM,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAwC3E,WAAW,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IA0BjD,OAAO,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;YAanC,WAAW;CAa1B"}
|
|
@@ -0,0 +1,223 @@
|
|
|
1
|
+
import { existsSync, createReadStream } from "fs";
|
|
2
|
+
import { stat } from "fs/promises";
|
|
3
|
+
import { Readable } from "stream";
|
|
4
|
+
import { createSign } from "crypto";
|
|
5
|
+
const BASE = "https://public-api.rustore.ru/public/v1";
|
|
6
|
+
const AUTH_URL = "https://public-api.rustore.ru/public/auth";
|
|
7
|
+
function loadCredentials() {
|
|
8
|
+
// Try JSON config first
|
|
9
|
+
const keyJson = process.env.RUSTORE_KEY_JSON;
|
|
10
|
+
if (keyJson) {
|
|
11
|
+
try {
|
|
12
|
+
const parsed = JSON.parse(keyJson);
|
|
13
|
+
if (parsed.companyId && parsed.keyId && parsed.privateKey) {
|
|
14
|
+
return parsed;
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
catch {
|
|
18
|
+
throw new Error("RuStore: RUSTORE_KEY_JSON is not valid JSON");
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
// Try individual env vars
|
|
22
|
+
const companyId = process.env.RUSTORE_COMPANY_ID;
|
|
23
|
+
const keyId = process.env.RUSTORE_KEY_ID;
|
|
24
|
+
const privateKey = process.env.RUSTORE_PRIVATE_KEY;
|
|
25
|
+
if (companyId && keyId && privateKey) {
|
|
26
|
+
return { companyId, keyId, privateKey };
|
|
27
|
+
}
|
|
28
|
+
throw new Error("RuStore: missing credentials. Set RUSTORE_KEY_JSON or (RUSTORE_COMPANY_ID + RUSTORE_KEY_ID + RUSTORE_PRIVATE_KEY) environment variables.");
|
|
29
|
+
}
|
|
30
|
+
function createJwt(credentials) {
|
|
31
|
+
const header = Buffer.from(JSON.stringify({ alg: "RS256", typ: "JWT" })).toString("base64url");
|
|
32
|
+
const payload = Buffer.from(JSON.stringify({ keyId: credentials.keyId, timestamp: Date.now() })).toString("base64url");
|
|
33
|
+
const signingInput = `${header}.${payload}`;
|
|
34
|
+
const sign = createSign("RSA-SHA256");
|
|
35
|
+
sign.update(signingInput);
|
|
36
|
+
const signature = sign.sign(credentials.privateKey, "base64url");
|
|
37
|
+
return `${signingInput}.${signature}`;
|
|
38
|
+
}
|
|
39
|
+
export class RuStoreClient {
|
|
40
|
+
tokenCache = null;
|
|
41
|
+
drafts = new Map();
|
|
42
|
+
// ── Auth ─────────────────────────────────────────────────────────────────────
|
|
43
|
+
async getToken() {
|
|
44
|
+
const now = Date.now();
|
|
45
|
+
// Refresh 60 seconds before expiry
|
|
46
|
+
if (this.tokenCache && this.tokenCache.expiresAt > now + 60_000) {
|
|
47
|
+
return this.tokenCache.token;
|
|
48
|
+
}
|
|
49
|
+
const credentials = loadCredentials();
|
|
50
|
+
const jwtToken = createJwt(credentials);
|
|
51
|
+
const res = await fetch(AUTH_URL, {
|
|
52
|
+
method: "POST",
|
|
53
|
+
headers: { "Content-Type": "application/json" },
|
|
54
|
+
body: JSON.stringify({ jwtToken }),
|
|
55
|
+
});
|
|
56
|
+
if (!res.ok) {
|
|
57
|
+
const text = await res.text();
|
|
58
|
+
throw new Error(`RuStore auth failed ${res.status}: ${text}`);
|
|
59
|
+
}
|
|
60
|
+
const data = await res.json();
|
|
61
|
+
if (data.code !== "OK") {
|
|
62
|
+
throw new Error(`RuStore auth error: ${data.message ?? data.code}`);
|
|
63
|
+
}
|
|
64
|
+
const ttlMs = data.body.ttl * 1000;
|
|
65
|
+
this.tokenCache = {
|
|
66
|
+
token: data.body.jwtToken,
|
|
67
|
+
expiresAt: Date.now() + ttlMs,
|
|
68
|
+
};
|
|
69
|
+
return this.tokenCache.token;
|
|
70
|
+
}
|
|
71
|
+
// ── API helpers ──────────────────────────────────────────────────────────────
|
|
72
|
+
async api(method, url, token, body) {
|
|
73
|
+
const res = await fetch(url, {
|
|
74
|
+
method,
|
|
75
|
+
headers: {
|
|
76
|
+
"Public-Token": token,
|
|
77
|
+
"Content-Type": "application/json",
|
|
78
|
+
},
|
|
79
|
+
body: body !== undefined ? JSON.stringify(body) : undefined,
|
|
80
|
+
});
|
|
81
|
+
if (!res.ok) {
|
|
82
|
+
const text = await res.text();
|
|
83
|
+
throw new Error(`RuStore API ${res.status} ${method} ${url}: ${text}`);
|
|
84
|
+
}
|
|
85
|
+
if (res.status === 204 || res.headers.get("content-length") === "0")
|
|
86
|
+
return {};
|
|
87
|
+
return res.json();
|
|
88
|
+
}
|
|
89
|
+
async createDraftVersion(packageName, token) {
|
|
90
|
+
const data = await this.api("POST", `${BASE}/application/${encodeURIComponent(packageName)}/version`, token, { whatsNew: {} });
|
|
91
|
+
if (data.code !== "OK") {
|
|
92
|
+
throw new Error(`RuStore: failed to create draft version: ${data.message ?? data.code}`);
|
|
93
|
+
}
|
|
94
|
+
return data.body.versionId;
|
|
95
|
+
}
|
|
96
|
+
// ── Public API ───────────────────────────────────────────────────────────────
|
|
97
|
+
async upload(packageName, filePath) {
|
|
98
|
+
if (!existsSync(filePath)) {
|
|
99
|
+
throw new Error(`File not found: ${filePath}`);
|
|
100
|
+
}
|
|
101
|
+
const token = await this.getToken();
|
|
102
|
+
const versionId = await this.createDraftVersion(packageName, token);
|
|
103
|
+
const isAab = filePath.toLowerCase().endsWith(".aab");
|
|
104
|
+
const uploadPath = isAab ? "aab" : "apk";
|
|
105
|
+
const { size: fileSize } = await stat(filePath);
|
|
106
|
+
const fileName = filePath.split("/").pop() ?? filePath;
|
|
107
|
+
const formData = new FormData();
|
|
108
|
+
const webStream = Readable.toWeb(createReadStream(filePath));
|
|
109
|
+
const blob = new Blob([await streamToBuffer(webStream)], { type: "application/octet-stream" });
|
|
110
|
+
formData.append("file", blob, fileName);
|
|
111
|
+
const uploadUrl = `${BASE}/application/${encodeURIComponent(packageName)}/version/${versionId}/${uploadPath}` +
|
|
112
|
+
`?servicesType=Unknown&isMainApk=true`;
|
|
113
|
+
const res = await fetch(uploadUrl, {
|
|
114
|
+
method: "POST",
|
|
115
|
+
headers: {
|
|
116
|
+
"Public-Token": token,
|
|
117
|
+
// No Content-Type — let fetch set multipart boundary automatically
|
|
118
|
+
},
|
|
119
|
+
body: formData,
|
|
120
|
+
});
|
|
121
|
+
if (!res.ok) {
|
|
122
|
+
const text = await res.text();
|
|
123
|
+
// Clean up orphaned draft
|
|
124
|
+
await this.deleteDraft(packageName, versionId, token);
|
|
125
|
+
throw new Error(`RuStore: APK/AAB upload failed ${res.status}: ${text}`);
|
|
126
|
+
}
|
|
127
|
+
const uploadData = await res.json();
|
|
128
|
+
if (uploadData.code !== "OK") {
|
|
129
|
+
await this.deleteDraft(packageName, versionId, token);
|
|
130
|
+
throw new Error(`RuStore: upload error: ${uploadData.message ?? uploadData.code}`);
|
|
131
|
+
}
|
|
132
|
+
this.drafts.set(packageName, { versionId, releaseNotes: [] });
|
|
133
|
+
void fileSize; // fileSize available if needed for logging
|
|
134
|
+
return { versionId: String(versionId) };
|
|
135
|
+
}
|
|
136
|
+
async setReleaseNotes(packageName, language, text) {
|
|
137
|
+
const draft = this.drafts.get(packageName);
|
|
138
|
+
if (!draft) {
|
|
139
|
+
throw new Error(`RuStore: no active upload for "${packageName}". Call rustore_upload first.`);
|
|
140
|
+
}
|
|
141
|
+
const idx = draft.releaseNotes.findIndex(n => n.language === language);
|
|
142
|
+
if (idx >= 0) {
|
|
143
|
+
draft.releaseNotes[idx].text = text;
|
|
144
|
+
}
|
|
145
|
+
else {
|
|
146
|
+
draft.releaseNotes.push({ language, text });
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
async submit(packageName, _options) {
|
|
150
|
+
const draft = this.drafts.get(packageName);
|
|
151
|
+
if (!draft) {
|
|
152
|
+
throw new Error(`RuStore: no active upload for "${packageName}". Call rustore_upload first.`);
|
|
153
|
+
}
|
|
154
|
+
const token = await this.getToken();
|
|
155
|
+
const { versionId, releaseNotes } = draft;
|
|
156
|
+
// If there are release notes — patch them first
|
|
157
|
+
if (releaseNotes.length > 0) {
|
|
158
|
+
const whatsNew = {};
|
|
159
|
+
for (const note of releaseNotes) {
|
|
160
|
+
whatsNew[note.language] = note.text;
|
|
161
|
+
}
|
|
162
|
+
const patchData = await this.api("PATCH", `${BASE}/application/${encodeURIComponent(packageName)}/version/${versionId}/publishing-settings`, token, { whatsNew });
|
|
163
|
+
if (patchData.code !== "OK") {
|
|
164
|
+
throw new Error(`RuStore: failed to set release notes: ${patchData.message ?? patchData.code}`);
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
// Submit for moderation
|
|
168
|
+
const submitData = await this.api("POST", `${BASE}/application/${encodeURIComponent(packageName)}/version/${versionId}/submit-for-moderation`, token);
|
|
169
|
+
if (submitData.code !== "OK") {
|
|
170
|
+
throw new Error(`RuStore: submit failed: ${submitData.message ?? submitData.code}`);
|
|
171
|
+
}
|
|
172
|
+
this.drafts.delete(packageName);
|
|
173
|
+
}
|
|
174
|
+
async getReleases(packageName) {
|
|
175
|
+
const token = await this.getToken();
|
|
176
|
+
const data = await this.api("GET", `${BASE}/application/${encodeURIComponent(packageName)}/version`, token);
|
|
177
|
+
if (data.code !== "OK") {
|
|
178
|
+
throw new Error(`RuStore: getReleases failed: ${data.message ?? data.code}`);
|
|
179
|
+
}
|
|
180
|
+
if (!data.body || data.body.length === 0) {
|
|
181
|
+
return `${packageName}: no versions found`;
|
|
182
|
+
}
|
|
183
|
+
const lines = data.body.map(v => {
|
|
184
|
+
const version = v.versionName ? `${v.versionName} (${v.versionCode ?? "?"})` : `versionId=${v.versionId}`;
|
|
185
|
+
const status = v.appStatus ?? "unknown";
|
|
186
|
+
return ` v${version} — ${status}`;
|
|
187
|
+
});
|
|
188
|
+
return `${packageName}:\n${lines.join("\n")}`;
|
|
189
|
+
}
|
|
190
|
+
async discard(packageName) {
|
|
191
|
+
const draft = this.drafts.get(packageName);
|
|
192
|
+
if (!draft) {
|
|
193
|
+
throw new Error(`RuStore: no active draft for "${packageName}"`);
|
|
194
|
+
}
|
|
195
|
+
const token = await this.getToken();
|
|
196
|
+
await this.deleteDraft(packageName, draft.versionId, token);
|
|
197
|
+
this.drafts.delete(packageName);
|
|
198
|
+
}
|
|
199
|
+
// ── Private helpers ──────────────────────────────────────────────────────────
|
|
200
|
+
async deleteDraft(packageName, versionId, token) {
|
|
201
|
+
const res = await fetch(`${BASE}/application/${encodeURIComponent(packageName)}/version/${versionId}`, {
|
|
202
|
+
method: "DELETE",
|
|
203
|
+
headers: { "Public-Token": token },
|
|
204
|
+
});
|
|
205
|
+
// Best-effort cleanup — do not throw
|
|
206
|
+
if (!res.ok) {
|
|
207
|
+
console.error(`RuStore: failed to delete draft version ${versionId} (${res.status})`);
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
// ── Helpers ──────────────────────────────────────────────────────────────────
|
|
212
|
+
async function streamToBuffer(stream) {
|
|
213
|
+
const reader = stream.getReader();
|
|
214
|
+
const chunks = [];
|
|
215
|
+
while (true) {
|
|
216
|
+
const { done, value } = await reader.read();
|
|
217
|
+
if (done)
|
|
218
|
+
break;
|
|
219
|
+
chunks.push(value);
|
|
220
|
+
}
|
|
221
|
+
return Buffer.concat(chunks);
|
|
222
|
+
}
|
|
223
|
+
//# sourceMappingURL=rustore.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rustore.js","sourceRoot":"","sources":["../../src/store/rustore.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,IAAI,CAAC;AAClD,OAAO,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AACnC,OAAO,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;AAClC,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAGpC,MAAM,IAAI,GAAG,yCAAyC,CAAC;AACvD,MAAM,QAAQ,GAAG,2CAA2C,CAAC;AA0D7D,SAAS,eAAe;IACtB,wBAAwB;IACxB,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC;IAC7C,IAAI,OAAO,EAAE,CAAC;QACZ,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAuB,CAAC;YACzD,IAAI,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;gBAC1D,OAAO,MAAM,CAAC;YAChB,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;QACjE,CAAC;IACH,CAAC;IAED,0BAA0B;IAC1B,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC;IACjD,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC;IACzC,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC;IAEnD,IAAI,SAAS,IAAI,KAAK,IAAI,UAAU,EAAE,CAAC;QACrC,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC;IAC1C,CAAC;IAED,MAAM,IAAI,KAAK,CACb,0IAA0I,CAC3I,CAAC;AACJ,CAAC;AAED,SAAS,SAAS,CAAC,WAA+B;IAChD,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;IAC/F,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CACzB,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,WAAW,CAAC,KAAK,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CACpE,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;IAExB,MAAM,YAAY,GAAG,GAAG,MAAM,IAAI,OAAO,EAAE,CAAC;IAC5C,MAAM,IAAI,GAAG,UAAU,CAAC,YAAY,CAAC,CAAC;IACtC,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;IAC1B,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC;IAEjE,OAAO,GAAG,YAAY,IAAI,SAAS,EAAE,CAAC;AACxC,CAAC;AAED,MAAM,OAAO,aAAa;IAChB,UAAU,GAAsB,IAAI,CAAC;IACrC,MAAM,GAAG,IAAI,GAAG,EAAsB,CAAC;IAE/C,gFAAgF;IAExE,KAAK,CAAC,QAAQ;QACpB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,mCAAmC;QACnC,IAAI,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,UAAU,CAAC,SAAS,GAAG,GAAG,GAAG,MAAM,EAAE,CAAC;YAChE,OAAO,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC;QAC/B,CAAC;QAED,MAAM,WAAW,GAAG,eAAe,EAAE,CAAC;QACtC,MAAM,QAAQ,GAAG,SAAS,CAAC,WAAW,CAAC,CAAC;QAExC,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,QAAQ,EAAE;YAChC,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;YAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,QAAQ,EAAE,CAAC;SACnC,CAAC,CAAC;QAEH,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACZ,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;YAC9B,MAAM,IAAI,KAAK,CAAC,uBAAuB,GAAG,CAAC,MAAM,KAAK,IAAI,EAAE,CAAC,CAAC;QAChE,CAAC;QAED,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAkB,CAAC;QAC9C,IAAI,IAAI,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC;YACvB,MAAM,IAAI,KAAK,CAAC,uBAAuB,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;QACtE,CAAC;QAED,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC;QACnC,IAAI,CAAC,UAAU,GAAG;YAChB,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,QAAQ;YACzB,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK;SAC9B,CAAC;QACF,OAAO,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC;IAC/B,CAAC;IAED,gFAAgF;IAExE,KAAK,CAAC,GAAG,CAAI,MAAc,EAAE,GAAW,EAAE,KAAa,EAAE,IAAc;QAC7E,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;YAC3B,MAAM;YACN,OAAO,EAAE;gBACP,cAAc,EAAE,KAAK;gBACrB,cAAc,EAAE,kBAAkB;aACnC;YACD,IAAI,EAAE,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS;SAC5D,CAAC,CAAC;QAEH,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACZ,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;YAC9B,MAAM,IAAI,KAAK,CAAC,eAAe,GAAG,CAAC,MAAM,IAAI,MAAM,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC,CAAC;QACzE,CAAC;QACD,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,KAAK,GAAG;YAAE,OAAO,EAAO,CAAC;QACpF,OAAO,GAAG,CAAC,IAAI,EAAgB,CAAC;IAClC,CAAC;IAEO,KAAK,CAAC,kBAAkB,CAAC,WAAmB,EAAE,KAAa;QACjE,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,GAAG,CACzB,MAAM,EACN,GAAG,IAAI,gBAAgB,kBAAkB,CAAC,WAAW,CAAC,UAAU,EAChE,KAAK,EACL,EAAE,QAAQ,EAAE,EAAE,EAAE,CACjB,CAAC;QAEF,IAAI,IAAI,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC;YACvB,MAAM,IAAI,KAAK,CAAC,4CAA4C,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;QAC3F,CAAC;QAED,OAAO,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC;IAC7B,CAAC;IAED,gFAAgF;IAEhF,KAAK,CAAC,MAAM,CAAC,WAAmB,EAAE,QAAgB;QAChD,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC1B,MAAM,IAAI,KAAK,CAAC,mBAAmB,QAAQ,EAAE,CAAC,CAAC;QACjD,CAAC;QAED,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC;QACpC,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,kBAAkB,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;QAEpE,MAAM,KAAK,GAAG,QAAQ,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QACtD,MAAM,UAAU,GAAG,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC;QACzC,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,CAAC;QAChD,MAAM,QAAQ,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,QAAQ,CAAC;QAEvD,MAAM,QAAQ,GAAG,IAAI,QAAQ,EAAE,CAAC;QAChC,MAAM,SAAS,GAAG,QAAQ,CAAC,KAAK,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAA+B,CAAC;QAC3F,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,CAAC,MAAM,cAAc,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,0BAA0B,EAAE,CAAC,CAAC;QAC/F,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC;QAExC,MAAM,SAAS,GACb,GAAG,IAAI,gBAAgB,kBAAkB,CAAC,WAAW,CAAC,YAAY,SAAS,IAAI,UAAU,EAAE;YAC3F,sCAAsC,CAAC;QAEzC,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,SAAS,EAAE;YACjC,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,cAAc,EAAE,KAAK;gBACrB,mEAAmE;aACpE;YACD,IAAI,EAAE,QAAQ;SACf,CAAC,CAAC;QAEH,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACZ,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;YAC9B,0BAA0B;YAC1B,MAAM,IAAI,CAAC,WAAW,CAAC,WAAW,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC;YACtD,MAAM,IAAI,KAAK,CAAC,kCAAkC,GAAG,CAAC,MAAM,KAAK,IAAI,EAAE,CAAC,CAAC;QAC3E,CAAC;QAED,MAAM,UAAU,GAAG,MAAM,GAAG,CAAC,IAAI,EAAwB,CAAC;QAC1D,IAAI,UAAU,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC;YAC7B,MAAM,IAAI,CAAC,WAAW,CAAC,WAAW,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC;YACtD,MAAM,IAAI,KAAK,CAAC,0BAA0B,UAAU,CAAC,OAAO,IAAI,UAAU,CAAC,IAAI,EAAE,CAAC,CAAC;QACrF,CAAC;QAED,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,WAAW,EAAE,EAAE,SAAS,EAAE,YAAY,EAAE,EAAE,EAAE,CAAC,CAAC;QAC9D,KAAK,QAAQ,CAAC,CAAC,2CAA2C;QAE1D,OAAO,EAAE,SAAS,EAAE,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC;IAC1C,CAAC;IAED,KAAK,CAAC,eAAe,CAAC,WAAmB,EAAE,QAAgB,EAAE,IAAY;QACvE,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;QAC3C,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,MAAM,IAAI,KAAK,CAAC,kCAAkC,WAAW,+BAA+B,CAAC,CAAC;QAChG,CAAC;QACD,MAAM,GAAG,GAAG,KAAK,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC;QACvE,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC;YACb,KAAK,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,IAAI,GAAG,IAAI,CAAC;QACtC,CAAC;aAAM,CAAC;YACN,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;QAC9C,CAAC;IACH,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,WAAmB,EAAE,QAA+B;QAC/D,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;QAC3C,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,MAAM,IAAI,KAAK,CAAC,kCAAkC,WAAW,+BAA+B,CAAC,CAAC;QAChG,CAAC;QAED,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC;QACpC,MAAM,EAAE,SAAS,EAAE,YAAY,EAAE,GAAG,KAAK,CAAC;QAE1C,gDAAgD;QAChD,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC5B,MAAM,QAAQ,GAA2B,EAAE,CAAC;YAC5C,KAAK,MAAM,IAAI,IAAI,YAAY,EAAE,CAAC;gBAChC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC;YACtC,CAAC;YACD,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,GAAG,CAC9B,OAAO,EACP,GAAG,IAAI,gBAAgB,kBAAkB,CAAC,WAAW,CAAC,YAAY,SAAS,sBAAsB,EACjG,KAAK,EACL,EAAE,QAAQ,EAAE,CACb,CAAC;YACF,IAAI,SAAS,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC;gBAC5B,MAAM,IAAI,KAAK,CAAC,yCAAyC,SAAS,CAAC,OAAO,IAAI,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC;YAClG,CAAC;QACH,CAAC;QAED,wBAAwB;QACxB,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,GAAG,CAC/B,MAAM,EACN,GAAG,IAAI,gBAAgB,kBAAkB,CAAC,WAAW,CAAC,YAAY,SAAS,wBAAwB,EACnG,KAAK,CACN,CAAC;QAEF,IAAI,UAAU,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC;YAC7B,MAAM,IAAI,KAAK,CAAC,2BAA2B,UAAU,CAAC,OAAO,IAAI,UAAU,CAAC,IAAI,EAAE,CAAC,CAAC;QACtF,CAAC;QAED,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;IAClC,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,WAAmB;QACnC,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC;QAEpC,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,GAAG,CACzB,KAAK,EACL,GAAG,IAAI,gBAAgB,kBAAkB,CAAC,WAAW,CAAC,UAAU,EAChE,KAAK,CACN,CAAC;QAEF,IAAI,IAAI,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC;YACvB,MAAM,IAAI,KAAK,CAAC,gCAAgC,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;QAC/E,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzC,OAAO,GAAG,WAAW,qBAAqB,CAAC;QAC7C,CAAC;QAED,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE;YAC9B,MAAM,OAAO,GAAG,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,WAAW,KAAK,CAAC,CAAC,WAAW,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,SAAS,EAAE,CAAC;YAC1G,MAAM,MAAM,GAAG,CAAC,CAAC,SAAS,IAAI,SAAS,CAAC;YACxC,OAAO,MAAM,OAAO,MAAM,MAAM,EAAE,CAAC;QACrC,CAAC,CAAC,CAAC;QAEH,OAAO,GAAG,WAAW,MAAM,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;IAChD,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,WAAmB;QAC/B,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;QAC3C,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,MAAM,IAAI,KAAK,CAAC,iCAAiC,WAAW,GAAG,CAAC,CAAC;QACnE,CAAC;QAED,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC;QACpC,MAAM,IAAI,CAAC,WAAW,CAAC,WAAW,EAAE,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;QAC5D,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;IAClC,CAAC;IAED,gFAAgF;IAExE,KAAK,CAAC,WAAW,CAAC,WAAmB,EAAE,SAAiB,EAAE,KAAa;QAC7E,MAAM,GAAG,GAAG,MAAM,KAAK,CACrB,GAAG,IAAI,gBAAgB,kBAAkB,CAAC,WAAW,CAAC,YAAY,SAAS,EAAE,EAC7E;YACE,MAAM,EAAE,QAAQ;YAChB,OAAO,EAAE,EAAE,cAAc,EAAE,KAAK,EAAE;SACnC,CACF,CAAC;QACF,qCAAqC;QACrC,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACZ,OAAO,CAAC,KAAK,CAAC,2CAA2C,SAAS,KAAK,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC;QACxF,CAAC;IACH,CAAC;CACF;AAED,gFAAgF;AAEhF,KAAK,UAAU,cAAc,CAAC,MAAkC;IAC9D,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,EAAE,CAAC;IAClC,MAAM,MAAM,GAAiB,EAAE,CAAC;IAChC,OAAO,IAAI,EAAE,CAAC;QACZ,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;QAC5C,IAAI,IAAI;YAAE,MAAM;QAChB,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACrB,CAAC;IACD,OAAO,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;AAC/B,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export interface UploadResult {
|
|
2
|
+
versionId: string;
|
|
3
|
+
}
|
|
4
|
+
export interface StoreClient {
|
|
5
|
+
upload(packageName: string, filePath: string): Promise<UploadResult>;
|
|
6
|
+
setReleaseNotes(packageName: string, language: string, text: string): Promise<void>;
|
|
7
|
+
submit(packageName: string, options?: {
|
|
8
|
+
rollout?: number;
|
|
9
|
+
}): Promise<void>;
|
|
10
|
+
getReleases(packageName: string): Promise<string>;
|
|
11
|
+
discard?(packageName: string): Promise<void>;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=store-client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store-client.d.ts","sourceRoot":"","sources":["../../src/store/store-client.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,WAAW;IAC1B,MAAM,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;IACrE,eAAe,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACpF,MAAM,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3E,WAAW,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAClD,OAAO,CAAC,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9C"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store-client.js","sourceRoot":"","sources":["../../src/store/store-client.ts"],"names":[],"mappings":""}
|