shipup 0.2.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.
Files changed (83) hide show
  1. package/CHANGELOG.md +25 -0
  2. package/LICENSE +14 -0
  3. package/README.md +112 -0
  4. package/README.zh-CN.md +105 -0
  5. package/SECURITY.md +32 -0
  6. package/creds.example.yaml +62 -0
  7. package/dist/adapters/android/honor/api.js +360 -0
  8. package/dist/adapters/android/honor/api.js.map +1 -0
  9. package/dist/adapters/android/honor/index.js +122 -0
  10. package/dist/adapters/android/honor/index.js.map +1 -0
  11. package/dist/adapters/android/huawei/api.js +389 -0
  12. package/dist/adapters/android/huawei/api.js.map +1 -0
  13. package/dist/adapters/android/huawei/index.js +128 -0
  14. package/dist/adapters/android/huawei/index.js.map +1 -0
  15. package/dist/adapters/android/meizu/api.js +367 -0
  16. package/dist/adapters/android/meizu/api.js.map +1 -0
  17. package/dist/adapters/android/meizu/index.js +129 -0
  18. package/dist/adapters/android/meizu/index.js.map +1 -0
  19. package/dist/adapters/android/oppo/api.js +397 -0
  20. package/dist/adapters/android/oppo/api.js.map +1 -0
  21. package/dist/adapters/android/oppo/index.js +135 -0
  22. package/dist/adapters/android/oppo/index.js.map +1 -0
  23. package/dist/adapters/android/qq/api.js +184 -0
  24. package/dist/adapters/android/qq/api.js.map +1 -0
  25. package/dist/adapters/android/qq/index.js +80 -0
  26. package/dist/adapters/android/qq/index.js.map +1 -0
  27. package/dist/adapters/android/samsung/api.js +355 -0
  28. package/dist/adapters/android/samsung/api.js.map +1 -0
  29. package/dist/adapters/android/samsung/index.js +111 -0
  30. package/dist/adapters/android/samsung/index.js.map +1 -0
  31. package/dist/adapters/android/specs.js +106 -0
  32. package/dist/adapters/android/specs.js.map +1 -0
  33. package/dist/adapters/android/stub.js +27 -0
  34. package/dist/adapters/android/stub.js.map +1 -0
  35. package/dist/adapters/android/vivo/api.js +236 -0
  36. package/dist/adapters/android/vivo/api.js.map +1 -0
  37. package/dist/adapters/android/vivo/index.js +121 -0
  38. package/dist/adapters/android/vivo/index.js.map +1 -0
  39. package/dist/adapters/android/xiaomi/api.js +163 -0
  40. package/dist/adapters/android/xiaomi/api.js.map +1 -0
  41. package/dist/adapters/android/xiaomi/index.js +108 -0
  42. package/dist/adapters/android/xiaomi/index.js.map +1 -0
  43. package/dist/adapters/ios/appstore/asc.js +280 -0
  44. package/dist/adapters/ios/appstore/asc.js.map +1 -0
  45. package/dist/adapters/ios/appstore/index.js +323 -0
  46. package/dist/adapters/ios/appstore/index.js.map +1 -0
  47. package/dist/adapters/registry.js +34 -0
  48. package/dist/adapters/registry.js.map +1 -0
  49. package/dist/adapters/util.js +26 -0
  50. package/dist/adapters/util.js.map +1 -0
  51. package/dist/cli/index.js +479 -0
  52. package/dist/cli/index.js.map +1 -0
  53. package/dist/cli/output.js +65 -0
  54. package/dist/cli/output.js.map +1 -0
  55. package/dist/core/exit.js +20 -0
  56. package/dist/core/exit.js.map +1 -0
  57. package/dist/core/orchestrator.js +24 -0
  58. package/dist/core/orchestrator.js.map +1 -0
  59. package/dist/core/types.js +20 -0
  60. package/dist/core/types.js.map +1 -0
  61. package/dist/creds/load.js +68 -0
  62. package/dist/creds/load.js.map +1 -0
  63. package/dist/creds/schema.js +30 -0
  64. package/dist/creds/schema.js.map +1 -0
  65. package/dist/infra/crypto.js +12 -0
  66. package/dist/infra/crypto.js.map +1 -0
  67. package/dist/infra/http.js +87 -0
  68. package/dist/infra/http.js.map +1 -0
  69. package/dist/pkginfo/apk-icon.js +89 -0
  70. package/dist/pkginfo/apk-icon.js.map +1 -0
  71. package/dist/pkginfo/icon.js +83 -0
  72. package/dist/pkginfo/icon.js.map +1 -0
  73. package/dist/pkginfo/index.js +33 -0
  74. package/dist/pkginfo/index.js.map +1 -0
  75. package/docs/android-markets.md +190 -0
  76. package/docs/credentials.md +72 -0
  77. package/docs/providers.md +60 -0
  78. package/lib/common.mjs +265 -0
  79. package/lib/harmony.mjs +190 -0
  80. package/lib/huawei.mjs +153 -0
  81. package/lib/ios.mjs +477 -0
  82. package/package.json +70 -0
  83. package/shipup.mjs +160 -0
@@ -0,0 +1,323 @@
1
+ // iOS App Store Connect 适配。
2
+ // upload = altool 上传 ipa + (submitReview ? 等 build VALID → 建/取版本 → 多地区文案 → 关联 build → reviewSubmissions 三步)
3
+ // status = 查 appStoreVersion.appStoreState 并归一化
4
+ // release = phased(开灰度) / complete|pause|resume(改灰度状态) / 否则手动发布请求
5
+ import { execFile } from 'node:child_process';
6
+ import { mkdir, writeFile } from 'node:fs/promises';
7
+ import { homedir } from 'node:os';
8
+ import { join } from 'node:path';
9
+ import { setTimeout as sleep } from 'node:timers/promises';
10
+ import { promisify } from 'node:util';
11
+ import { redactSensitive, UploadError } from '../../../core/types.js';
12
+ import { toFailed } from '../../util.js';
13
+ import { AscClient } from './asc.js';
14
+ const execFileAsync = promisify(execFile);
15
+ /** appStoreState → 归一化状态。 */
16
+ function mapAppStoreState(state) {
17
+ switch (state) {
18
+ case 'WAITING_FOR_REVIEW':
19
+ case 'IN_REVIEW':
20
+ return 'pending_review';
21
+ case 'PENDING_DEVELOPER_RELEASE':
22
+ case 'PENDING_APPLE_RELEASE':
23
+ return 'approved';
24
+ case 'READY_FOR_SALE':
25
+ return 'published';
26
+ case 'REJECTED':
27
+ case 'DEVELOPER_REJECTED':
28
+ case 'METADATA_REJECTED':
29
+ case 'INVALID_BINARY':
30
+ return 'rejected';
31
+ case 'DEVELOPER_REMOVED_FROM_SALE':
32
+ case 'REMOVED_FROM_SALE':
33
+ case 'REPLACED_WITH_NEW_VERSION':
34
+ return 'offline';
35
+ case 'PREPARE_FOR_SUBMISSION':
36
+ case 'READY_FOR_REVIEW':
37
+ case 'PROCESSING_FOR_APP_STORE':
38
+ return 'uploaded';
39
+ default:
40
+ return 'failed';
41
+ }
42
+ }
43
+ /** 组装各 locale 文案:有 metadata 用 metadata,否则用 whatsNew 作 zh-Hans whatsNew。 */
44
+ function buildLocaleMap(metadata, whatsNew) {
45
+ if (metadata && Object.keys(metadata).length > 0) {
46
+ return metadata;
47
+ }
48
+ if (whatsNew) {
49
+ return { 'zh-Hans': { whatsNew } };
50
+ }
51
+ return {};
52
+ }
53
+ /** App Store 已在审核/发布流程中的状态:此时重跑应跳过提审(幂等,CI 重跑安全)。 */
54
+ const IN_FLIGHT_STATES = new Set([
55
+ 'WAITING_FOR_REVIEW',
56
+ 'IN_REVIEW',
57
+ 'PENDING_DEVELOPER_RELEASE',
58
+ 'PENDING_APPLE_RELEASE',
59
+ 'PROCESSING_FOR_APP_STORE',
60
+ 'READY_FOR_SALE',
61
+ ]);
62
+ /**
63
+ * 共享提审流程(upload --submit-review 与 submit 命令共用):
64
+ * 等 build VALID → 建/取版本 →(幂等守卫:已在审核流程则跳过)→ 文案 → 关联 build → 提交审核。
65
+ * 不含 altool 上传。返回归一化状态 + 说明。
66
+ */
67
+ async function runSubmitFlow(client, opts) {
68
+ const { appId, version, buildVersion, localeMap, releaseType, deadline } = opts;
69
+ // 幂等守卫:版本已在审核/发布流程中则跳过重复提审。
70
+ const existing = await client.getAppStoreVersion(appId, version);
71
+ const state = existing?.attributes?.appStoreState;
72
+ if (existing && state && IN_FLIGHT_STATES.has(state)) {
73
+ return { status: mapAppStoreState(state), message: `版本已处于 ${state},跳过重复提审` };
74
+ }
75
+ const buildId = await client.waitBuildValid(appId, buildVersion, version, deadline);
76
+ const versionId = await client.ensureAppStoreVersion(appId, version, releaseType);
77
+ await client.writeLocalizations(versionId, localeMap);
78
+ await client.attachBuild(versionId, buildId);
79
+ await client.submitForReview(appId, versionId);
80
+ return { status: 'submitted', message: '' };
81
+ }
82
+ /** 把 p8 私钥落盘到 ~/.appstoreconnect/private_keys/AuthKey_<key_id>.p8(0600)供 altool 读取。 */
83
+ async function writeAuthKey(keyId, privateKey) {
84
+ const dir = join(homedir(), '.appstoreconnect', 'private_keys');
85
+ await mkdir(dir, { recursive: true });
86
+ const file = join(dir, `AuthKey_${keyId}.p8`);
87
+ await writeFile(file, privateKey, { mode: 0o600 });
88
+ return file;
89
+ }
90
+ /** xcrun altool 上传 ipa;瞬时失败有限次退避重试。失败 throw UploadError。 */
91
+ async function uploadViaAltool(ctx, keyId, issuerId) {
92
+ await writeAuthKey(keyId, ctx.creds.private_key);
93
+ const args = [
94
+ 'altool',
95
+ '--upload-app',
96
+ '--type',
97
+ 'ios',
98
+ '--file',
99
+ ctx.pkg,
100
+ '--apiKey',
101
+ keyId,
102
+ '--apiIssuer',
103
+ issuerId,
104
+ ];
105
+ const maxAttempts = 3;
106
+ for (let attempt = 1; attempt <= maxAttempts; attempt++) {
107
+ try {
108
+ await execFileAsync('xcrun', args, { timeout: ctx.timeoutMs, maxBuffer: 16 * 1024 * 1024 });
109
+ return;
110
+ }
111
+ catch (e) {
112
+ const detail = redactSensitive(e?.stderr || e?.stdout || e?.message || e).slice(0, 1000);
113
+ // 重试时若提示「已上传 / 冗余二进制」,说明上一次其实已成功,按成功处理(避免误判失败)。
114
+ if (attempt > 1 && /already been uploaded|redundant binary|same version|already exists/i.test(detail)) {
115
+ console.error('[shipup] altool: 检测到二进制已上传,按成功处理');
116
+ return;
117
+ }
118
+ if (attempt === maxAttempts)
119
+ throw new UploadError('altool', `altool 上传失败: ${detail}`);
120
+ console.error(`[retry] altool 第 ${attempt}/${maxAttempts} 次失败,${2000 * attempt}ms 后重试: ${detail.slice(0, 200)}`);
121
+ await sleep(2000 * attempt);
122
+ }
123
+ }
124
+ }
125
+ export class IosAppStoreAdapter {
126
+ channel = 'appstore';
127
+ async upload(ctx) {
128
+ const start = Date.now();
129
+ const action = ctx.submitReview ? 'upload+submit' : 'upload';
130
+ try {
131
+ const keyId = ctx.creds.key_id;
132
+ const issuerId = ctx.creds.issuer_id;
133
+ const appId = ctx.creds.app_id;
134
+ // 1) altool 上传
135
+ await uploadViaAltool(ctx, keyId, issuerId);
136
+ // 2) 提审(复用 runSubmitFlow,含幂等守卫)
137
+ if (ctx.submitReview) {
138
+ const client = new AscClient({ keyId, issuerId, privateKey: ctx.creds.private_key });
139
+ const { status, message } = await runSubmitFlow(client, {
140
+ appId,
141
+ version: ctx.versionName,
142
+ buildVersion: ctx.versionCode,
143
+ localeMap: buildLocaleMap(ctx.metadata, ctx.releaseNote),
144
+ releaseType: ctx.releaseType,
145
+ deadline: Date.now() + ctx.timeoutMs,
146
+ });
147
+ return {
148
+ channel: this.channel,
149
+ packageName: appId,
150
+ versionName: ctx.versionName,
151
+ versionCode: ctx.versionCode,
152
+ action: 'upload+submit',
153
+ status,
154
+ errorCode: null,
155
+ message,
156
+ durationMs: Date.now() - start,
157
+ };
158
+ }
159
+ return {
160
+ channel: this.channel,
161
+ packageName: appId,
162
+ versionName: ctx.versionName,
163
+ versionCode: ctx.versionCode,
164
+ action: 'upload',
165
+ status: 'uploaded',
166
+ errorCode: null,
167
+ message: '',
168
+ durationMs: Date.now() - start,
169
+ };
170
+ }
171
+ catch (e) {
172
+ return toFailed(this.channel, e, start, action, ctx);
173
+ }
174
+ }
175
+ /**
176
+ * 出口合规由 app 工程 Info.plist 的 ITSAppUsesNonExemptEncryption 声明(不在本工具处理)。
177
+ */
178
+ async submit(ctx) {
179
+ const start = Date.now();
180
+ try {
181
+ const client = new AscClient({
182
+ keyId: ctx.creds.key_id,
183
+ issuerId: ctx.creds.issuer_id,
184
+ privateKey: ctx.creds.private_key,
185
+ });
186
+ const appId = await client.resolveAppId(ctx.appId ?? ctx.creds.app_id, ctx.bundleId);
187
+ const { status, message } = await runSubmitFlow(client, {
188
+ appId,
189
+ version: ctx.version,
190
+ buildVersion: ctx.buildVersion,
191
+ localeMap: buildLocaleMap(ctx.metadata, ctx.whatsNew),
192
+ releaseType: ctx.releaseType,
193
+ deadline: Date.now() + ctx.timeoutMs,
194
+ });
195
+ return {
196
+ channel: this.channel,
197
+ packageName: appId,
198
+ versionName: ctx.version,
199
+ versionCode: ctx.buildVersion,
200
+ action: 'submit',
201
+ status,
202
+ errorCode: null,
203
+ message,
204
+ durationMs: Date.now() - start,
205
+ };
206
+ }
207
+ catch (e) {
208
+ return toFailed(this.channel, e, start, 'submit', {
209
+ packageName: ctx.appId ?? ctx.bundleId,
210
+ versionName: ctx.version,
211
+ versionCode: ctx.buildVersion,
212
+ });
213
+ }
214
+ }
215
+ async queryStatus(ctx) {
216
+ const start = Date.now();
217
+ try {
218
+ const creds = {
219
+ keyId: ctx.creds.key_id,
220
+ issuerId: ctx.creds.issuer_id,
221
+ privateKey: ctx.creds.private_key,
222
+ };
223
+ const client = new AscClient(creds);
224
+ const appId = await client.resolveAppId(ctx.creds.app_id, ctx.bundleId);
225
+ const version = ctx.versionName ?? '';
226
+ const v = await client.getAppStoreVersion(appId, version);
227
+ const state = v?.attributes?.appStoreState ?? null;
228
+ let message = state ?? 'version not found';
229
+ // 已发布/待发布时附带灰度进度(若开启灰度),便于调用方判断阶段。
230
+ if (v && (state === 'READY_FOR_SALE' || state === 'PENDING_DEVELOPER_RELEASE')) {
231
+ try {
232
+ const phased = await client.getPhasedRelease(v.id);
233
+ const ps = phased?.attributes?.phasedReleaseState;
234
+ if (ps)
235
+ message += ` | phased=${ps} day=${phased.attributes.currentDayNumber ?? '-'}`;
236
+ }
237
+ catch {
238
+ /* 灰度查询失败不影响主状态 */
239
+ }
240
+ }
241
+ return {
242
+ channel: this.channel,
243
+ packageName: appId,
244
+ versionName: version,
245
+ action: 'status',
246
+ status: mapAppStoreState(state),
247
+ marketVersion: v?.attributes?.versionString,
248
+ errorCode: null,
249
+ message,
250
+ durationMs: Date.now() - start,
251
+ };
252
+ }
253
+ catch (e) {
254
+ return toFailed(this.channel, e, start, 'status');
255
+ }
256
+ }
257
+ async release(ctx) {
258
+ const start = Date.now();
259
+ try {
260
+ const creds = {
261
+ keyId: ctx.creds.key_id,
262
+ issuerId: ctx.creds.issuer_id,
263
+ privateKey: ctx.creds.private_key,
264
+ };
265
+ const client = new AscClient(creds);
266
+ const appId = await client.resolveAppId(ctx.appId ?? ctx.creds.app_id, ctx.bundleId);
267
+ const v = await client.getAppStoreVersion(appId, ctx.version);
268
+ if (!v)
269
+ throw new UploadError('not_found', `未找到 appStoreVersion: ${ctx.version}`);
270
+ const versionId = v.id;
271
+ let status = 'published';
272
+ let message;
273
+ if (ctx.complete || ctx.pause || ctx.resume) {
274
+ const phased = await client.getPhasedRelease(versionId);
275
+ if (!phased)
276
+ throw new UploadError('no_phased', '当前版本未开启灰度发布');
277
+ const state = ctx.complete ? 'COMPLETE' : ctx.pause ? 'PAUSED' : 'ACTIVE';
278
+ await client.setPhasedReleaseState(phased.id, state);
279
+ message = `phasedReleaseState=${state}`;
280
+ status = ctx.complete ? 'published' : 'approved';
281
+ }
282
+ else if (ctx.phased) {
283
+ // 1) 确保灰度资源存在(幂等)。Apple 一个版本只允许一个灰度,重复 POST 会 409 DUPLICATE;
284
+ // 灰度也可能是手动提交时在 ASC 勾选「分阶段发布」而先创建的,这里都视为已就绪。
285
+ const existing = await client.getPhasedRelease(versionId);
286
+ if (!existing)
287
+ await client.startPhasedRelease(versionId);
288
+ const phasedNote = existing ? '灰度已存在' : '已开启灰度';
289
+ // 2) 灰度只是「发布方式」,真正上架还需触发发布:
290
+ // MANUAL 版本过审后停在 PENDING_DEVELOPER_RELEASE,需 requestRelease 才会上架并按灰度放量;
291
+ // AFTER_APPROVAL 过审自动发、审核中的版本不能发,都不触发(仅预置灰度)。
292
+ const appStoreState = v.attributes?.appStoreState;
293
+ if (appStoreState === 'PENDING_DEVELOPER_RELEASE') {
294
+ await client.requestRelease(versionId);
295
+ status = 'published';
296
+ message = `${phasedNote},已触发发布(按 7 天灰度放量)`;
297
+ }
298
+ else {
299
+ status = 'approved';
300
+ message = `${phasedNote}(当前状态 ${appStoreState ?? '未知'},未触发发布)`;
301
+ }
302
+ }
303
+ else {
304
+ await client.requestRelease(versionId);
305
+ message = 'release requested';
306
+ }
307
+ return {
308
+ channel: this.channel,
309
+ packageName: appId,
310
+ versionName: ctx.version,
311
+ action: 'release',
312
+ status,
313
+ errorCode: null,
314
+ message,
315
+ durationMs: Date.now() - start,
316
+ };
317
+ }
318
+ catch (e) {
319
+ return toFailed(this.channel, e, start, 'release');
320
+ }
321
+ }
322
+ }
323
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/adapters/ios/appstore/index.ts"],"names":[],"mappings":"AAAA,4BAA4B;AAC5B,8GAA8G;AAC9G,kDAAkD;AAClD,mEAAmE;AACnE,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,UAAU,IAAI,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAQtC,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACtE,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,SAAS,EAA0C,MAAM,UAAU,CAAC;AAE7E,MAAM,aAAa,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;AAgB1C,6BAA6B;AAC7B,SAAS,gBAAgB,CAAC,KAAgC;IACxD,QAAQ,KAAK,EAAE,CAAC;QACd,KAAK,oBAAoB,CAAC;QAC1B,KAAK,WAAW;YACd,OAAO,gBAAgB,CAAC;QAC1B,KAAK,2BAA2B,CAAC;QACjC,KAAK,uBAAuB;YAC1B,OAAO,UAAU,CAAC;QACpB,KAAK,gBAAgB;YACnB,OAAO,WAAW,CAAC;QACrB,KAAK,UAAU,CAAC;QAChB,KAAK,oBAAoB,CAAC;QAC1B,KAAK,mBAAmB,CAAC;QACzB,KAAK,gBAAgB;YACnB,OAAO,UAAU,CAAC;QACpB,KAAK,6BAA6B,CAAC;QACnC,KAAK,mBAAmB,CAAC;QACzB,KAAK,2BAA2B;YAC9B,OAAO,SAAS,CAAC;QACnB,KAAK,wBAAwB,CAAC;QAC9B,KAAK,kBAAkB,CAAC;QACxB,KAAK,0BAA0B;YAC7B,OAAO,UAAU,CAAC;QACpB;YACE,OAAO,QAAQ,CAAC;IACpB,CAAC;AACH,CAAC;AAED,2EAA2E;AAC3E,SAAS,cAAc,CACrB,QAAiD,EACjD,QAAiB;IAEjB,IAAI,QAAQ,IAAI,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACjD,OAAO,QAA8C,CAAC;IACxD,CAAC;IACD,IAAI,QAAQ,EAAE,CAAC;QACb,OAAO,EAAE,SAAS,EAAE,EAAE,QAAQ,EAAE,EAAE,CAAC;IACrC,CAAC;IACD,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,qDAAqD;AACrD,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAAC;IAC/B,oBAAoB;IACpB,WAAW;IACX,2BAA2B;IAC3B,uBAAuB;IACvB,0BAA0B;IAC1B,gBAAgB;CACjB,CAAC,CAAC;AAkBH;;;;GAIG;AACH,KAAK,UAAU,aAAa,CAC1B,MAAiB,EACjB,IAOC;IAED,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,WAAW,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAC;IAChF,4BAA4B;IAC5B,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,kBAAkB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IACjE,MAAM,KAAK,GAAuB,QAAQ,EAAE,UAAU,EAAE,aAAa,CAAC;IACtE,IAAI,QAAQ,IAAI,KAAK,IAAI,gBAAgB,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;QACrD,OAAO,EAAE,MAAM,EAAE,gBAAgB,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,SAAS,KAAK,SAAS,EAAE,CAAC;IAC/E,CAAC;IACD,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,cAAc,CAAC,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;IACpF,MAAM,SAAS,GAAG,MAAM,MAAM,CAAC,qBAAqB,CAAC,KAAK,EAAE,OAAO,EAAE,WAAW,CAAC,CAAC;IAClF,MAAM,MAAM,CAAC,kBAAkB,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;IACtD,MAAM,MAAM,CAAC,WAAW,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IAC7C,MAAM,MAAM,CAAC,eAAe,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;IAC/C,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;AAC9C,CAAC;AAED,uFAAuF;AACvF,KAAK,UAAU,YAAY,CAAC,KAAa,EAAE,UAAkB;IAC3D,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,kBAAkB,EAAE,cAAc,CAAC,CAAC;IAChE,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACtC,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,WAAW,KAAK,KAAK,CAAC,CAAC;IAC9C,MAAM,SAAS,CAAC,IAAI,EAAE,UAAU,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IACnD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,4DAA4D;AAC5D,KAAK,UAAU,eAAe,CAAC,GAAkB,EAAE,KAAa,EAAE,QAAgB;IAChF,MAAM,YAAY,CAAC,KAAK,EAAE,GAAG,CAAC,KAAK,CAAC,WAAY,CAAC,CAAC;IAClD,MAAM,IAAI,GAAG;QACX,QAAQ;QACR,cAAc;QACd,QAAQ;QACR,KAAK;QACL,QAAQ;QACR,GAAG,CAAC,GAAG;QACP,UAAU;QACV,KAAK;QACL,aAAa;QACb,QAAQ;KACT,CAAC;IACF,MAAM,WAAW,GAAG,CAAC,CAAC;IACtB,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,IAAI,WAAW,EAAE,OAAO,EAAE,EAAE,CAAC;QACxD,IAAI,CAAC;YACH,MAAM,aAAa,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,GAAG,CAAC,SAAS,EAAE,SAAS,EAAE,EAAE,GAAG,IAAI,GAAG,IAAI,EAAE,CAAC,CAAC;YAC5F,OAAO;QACT,CAAC;QAAC,OAAO,CAAM,EAAE,CAAC;YAChB,MAAM,MAAM,GAAG,eAAe,CAAC,CAAC,EAAE,MAAM,IAAI,CAAC,EAAE,MAAM,IAAI,CAAC,EAAE,OAAO,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;YACzF,gDAAgD;YAChD,IAAI,OAAO,GAAG,CAAC,IAAI,qEAAqE,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;gBACtG,OAAO,CAAC,KAAK,CAAC,kCAAkC,CAAC,CAAC;gBAClD,OAAO;YACT,CAAC;YACD,IAAI,OAAO,KAAK,WAAW;gBAAE,MAAM,IAAI,WAAW,CAAC,QAAQ,EAAE,gBAAgB,MAAM,EAAE,CAAC,CAAC;YACvF,OAAO,CAAC,KAAK,CACX,oBAAoB,OAAO,IAAI,WAAW,QAAQ,IAAI,GAAG,OAAO,WAAW,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAClG,CAAC;YACF,MAAM,KAAK,CAAC,IAAI,GAAG,OAAO,CAAC,CAAC;QAC9B,CAAC;IACH,CAAC;AACH,CAAC;AAED,MAAM,OAAO,kBAAkB;IACpB,OAAO,GAAG,UAAU,CAAC;IAE9B,KAAK,CAAC,MAAM,CAAC,GAAkB;QAC7B,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACzB,MAAM,MAAM,GAAG,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,QAAQ,CAAC;QAC7D,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,MAAO,CAAC;YAChC,MAAM,QAAQ,GAAG,GAAG,CAAC,KAAK,CAAC,SAAU,CAAC;YACtC,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,MAAO,CAAC;YAEhC,eAAe;YACf,MAAM,eAAe,CAAC,GAAG,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;YAE5C,gCAAgC;YAChC,IAAI,GAAG,CAAC,YAAY,EAAE,CAAC;gBACrB,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,GAAG,CAAC,KAAK,CAAC,WAAY,EAAE,CAAC,CAAC;gBACtF,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,aAAa,CAAC,MAAM,EAAE;oBACtD,KAAK;oBACL,OAAO,EAAE,GAAG,CAAC,WAAW;oBACxB,YAAY,EAAE,GAAG,CAAC,WAAW;oBAC7B,SAAS,EAAE,cAAc,CAAC,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,WAAW,CAAC;oBACxD,WAAW,EAAE,GAAG,CAAC,WAAW;oBAC5B,QAAQ,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,GAAG,CAAC,SAAS;iBACrC,CAAC,CAAC;gBACH,OAAO;oBACL,OAAO,EAAE,IAAI,CAAC,OAAO;oBACrB,WAAW,EAAE,KAAK;oBAClB,WAAW,EAAE,GAAG,CAAC,WAAW;oBAC5B,WAAW,EAAE,GAAG,CAAC,WAAW;oBAC5B,MAAM,EAAE,eAAe;oBACvB,MAAM;oBACN,SAAS,EAAE,IAAI;oBACf,OAAO;oBACP,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK;iBAC/B,CAAC;YACJ,CAAC;YAED,OAAO;gBACL,OAAO,EAAE,IAAI,CAAC,OAAO;gBACrB,WAAW,EAAE,KAAK;gBAClB,WAAW,EAAE,GAAG,CAAC,WAAW;gBAC5B,WAAW,EAAE,GAAG,CAAC,WAAW;gBAC5B,MAAM,EAAE,QAAQ;gBAChB,MAAM,EAAE,UAAU;gBAClB,SAAS,EAAE,IAAI;gBACf,OAAO,EAAE,EAAE;gBACX,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK;aAC/B,CAAC;QACJ,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,OAAO,QAAQ,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC;QACvD,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,MAAM,CAAC,GAAkB;QAC7B,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACzB,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;gBAC3B,KAAK,EAAE,GAAG,CAAC,KAAK,CAAC,MAAO;gBACxB,QAAQ,EAAE,GAAG,CAAC,KAAK,CAAC,SAAU;gBAC9B,UAAU,EAAE,GAAG,CAAC,KAAK,CAAC,WAAY;aACnC,CAAC,CAAC;YACH,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAC;YACrF,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,aAAa,CAAC,MAAM,EAAE;gBACtD,KAAK;gBACL,OAAO,EAAE,GAAG,CAAC,OAAO;gBACpB,YAAY,EAAE,GAAG,CAAC,YAAY;gBAC9B,SAAS,EAAE,cAAc,CAAC,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,QAAQ,CAAC;gBACrD,WAAW,EAAE,GAAG,CAAC,WAAW;gBAC5B,QAAQ,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,GAAG,CAAC,SAAS;aACrC,CAAC,CAAC;YACH,OAAO;gBACL,OAAO,EAAE,IAAI,CAAC,OAAO;gBACrB,WAAW,EAAE,KAAK;gBAClB,WAAW,EAAE,GAAG,CAAC,OAAO;gBACxB,WAAW,EAAE,GAAG,CAAC,YAAY;gBAC7B,MAAM,EAAE,QAAQ;gBAChB,MAAM;gBACN,SAAS,EAAE,IAAI;gBACf,OAAO;gBACP,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK;aAC/B,CAAC;QACJ,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,OAAO,QAAQ,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE;gBAChD,WAAW,EAAE,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC,QAAQ;gBACtC,WAAW,EAAE,GAAG,CAAC,OAAO;gBACxB,WAAW,EAAE,GAAG,CAAC,YAAY;aAC9B,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,GAAkB;QAClC,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACzB,IAAI,CAAC;YACH,MAAM,KAAK,GAAa;gBACtB,KAAK,EAAE,GAAG,CAAC,KAAK,CAAC,MAAO;gBACxB,QAAQ,EAAE,GAAG,CAAC,KAAK,CAAC,SAAU;gBAC9B,UAAU,EAAE,GAAG,CAAC,KAAK,CAAC,WAAY;aACnC,CAAC;YACF,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC,KAAK,CAAC,CAAC;YACpC,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAC;YACxE,MAAM,OAAO,GAAG,GAAG,CAAC,WAAW,IAAI,EAAE,CAAC;YACtC,MAAM,CAAC,GAAG,MAAM,MAAM,CAAC,kBAAkB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;YAC1D,MAAM,KAAK,GAAkB,CAAC,EAAE,UAAU,EAAE,aAAa,IAAI,IAAI,CAAC;YAClE,IAAI,OAAO,GAAG,KAAK,IAAI,mBAAmB,CAAC;YAC3C,mCAAmC;YACnC,IAAI,CAAC,IAAI,CAAC,KAAK,KAAK,gBAAgB,IAAI,KAAK,KAAK,2BAA2B,CAAC,EAAE,CAAC;gBAC/E,IAAI,CAAC;oBACH,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,gBAAgB,CAAC,CAAC,CAAC,EAAY,CAAC,CAAC;oBAC7D,MAAM,EAAE,GAAG,MAAM,EAAE,UAAU,EAAE,kBAAkB,CAAC;oBAClD,IAAI,EAAE;wBAAE,OAAO,IAAI,aAAa,EAAE,QAAQ,MAAM,CAAC,UAAU,CAAC,gBAAgB,IAAI,GAAG,EAAE,CAAC;gBACxF,CAAC;gBAAC,MAAM,CAAC;oBACP,kBAAkB;gBACpB,CAAC;YACH,CAAC;YACD,OAAO;gBACL,OAAO,EAAE,IAAI,CAAC,OAAO;gBACrB,WAAW,EAAE,KAAK;gBAClB,WAAW,EAAE,OAAO;gBACpB,MAAM,EAAE,QAAQ;gBAChB,MAAM,EAAE,gBAAgB,CAAC,KAAK,CAAC;gBAC/B,aAAa,EAAE,CAAC,EAAE,UAAU,EAAE,aAAa;gBAC3C,SAAS,EAAE,IAAI;gBACf,OAAO;gBACP,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK;aAC/B,CAAC;QACJ,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,OAAO,QAAQ,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;QACpD,CAAC;IACH,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,GAAmB;QAC/B,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACzB,IAAI,CAAC;YACH,MAAM,KAAK,GAAa;gBACtB,KAAK,EAAE,GAAG,CAAC,KAAK,CAAC,MAAO;gBACxB,QAAQ,EAAE,GAAG,CAAC,KAAK,CAAC,SAAU;gBAC9B,UAAU,EAAE,GAAG,CAAC,KAAK,CAAC,WAAY;aACnC,CAAC;YACF,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC,KAAK,CAAC,CAAC;YACpC,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAC;YACrF,MAAM,CAAC,GAAG,MAAM,MAAM,CAAC,kBAAkB,CAAC,KAAK,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;YAC9D,IAAI,CAAC,CAAC;gBAAE,MAAM,IAAI,WAAW,CAAC,WAAW,EAAE,wBAAwB,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;YAClF,MAAM,SAAS,GAAG,CAAC,CAAC,EAAY,CAAC;YAEjC,IAAI,MAAM,GAAqB,WAAW,CAAC;YAC3C,IAAI,OAAe,CAAC;YAEpB,IAAI,GAAG,CAAC,QAAQ,IAAI,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;gBAC5C,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC;gBACxD,IAAI,CAAC,MAAM;oBAAE,MAAM,IAAI,WAAW,CAAC,WAAW,EAAE,aAAa,CAAC,CAAC;gBAC/D,MAAM,KAAK,GAAG,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC;gBAC1E,MAAM,MAAM,CAAC,qBAAqB,CAAC,MAAM,CAAC,EAAY,EAAE,KAAK,CAAC,CAAC;gBAC/D,OAAO,GAAG,sBAAsB,KAAK,EAAE,CAAC;gBACxC,MAAM,GAAG,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,UAAU,CAAC;YACnD,CAAC;iBAAM,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;gBACtB,6DAA6D;gBAC7D,+CAA+C;gBAC/C,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC;gBAC1D,IAAI,CAAC,QAAQ;oBAAE,MAAM,MAAM,CAAC,kBAAkB,CAAC,SAAS,CAAC,CAAC;gBAC1D,MAAM,UAAU,GAAG,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC;gBAEhD,4BAA4B;gBAC5B,2EAA2E;gBAC3E,iDAAiD;gBACjD,MAAM,aAAa,GAAG,CAAC,CAAC,UAAU,EAAE,aAAmC,CAAC;gBACxE,IAAI,aAAa,KAAK,2BAA2B,EAAE,CAAC;oBAClD,MAAM,MAAM,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC;oBACvC,MAAM,GAAG,WAAW,CAAC;oBACrB,OAAO,GAAG,GAAG,UAAU,mBAAmB,CAAC;gBAC7C,CAAC;qBAAM,CAAC;oBACN,MAAM,GAAG,UAAU,CAAC;oBACpB,OAAO,GAAG,GAAG,UAAU,SAAS,aAAa,IAAI,IAAI,SAAS,CAAC;gBACjE,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,MAAM,MAAM,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC;gBACvC,OAAO,GAAG,mBAAmB,CAAC;YAChC,CAAC;YAED,OAAO;gBACL,OAAO,EAAE,IAAI,CAAC,OAAO;gBACrB,WAAW,EAAE,KAAK;gBAClB,WAAW,EAAE,GAAG,CAAC,OAAO;gBACxB,MAAM,EAAE,SAAS;gBACjB,MAAM;gBACN,SAAS,EAAE,IAAI;gBACf,OAAO;gBACP,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK;aAC/B,CAAC;QACJ,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,OAAO,QAAQ,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC;QACrD,CAAC;IACH,CAAC;CACF"}
@@ -0,0 +1,34 @@
1
+ import { UsageError } from '../core/exit.js';
2
+ import { ANDROID_CHANNELS } from '../creds/schema.js';
3
+ import { HuaweiAdapter } from './android/huawei/index.js';
4
+ import { HonorAdapter } from './android/honor/index.js';
5
+ import { OppoAdapter } from './android/oppo/index.js';
6
+ import { VivoAdapter } from './android/vivo/index.js';
7
+ import { XiaomiAdapter } from './android/xiaomi/index.js';
8
+ import { SamsungAdapter } from './android/samsung/index.js';
9
+ import { QqAdapter } from './android/qq/index.js';
10
+ import { MeizuAdapter } from './android/meizu/index.js';
11
+ import { IosAppStoreAdapter } from './ios/appstore/index.js';
12
+ const ANDROID_FACTORY = {
13
+ huawei: () => new HuaweiAdapter(),
14
+ honor: () => new HonorAdapter(),
15
+ oppo: () => new OppoAdapter(),
16
+ vivo: () => new VivoAdapter(),
17
+ xiaomi: () => new XiaomiAdapter(),
18
+ samsung: () => new SamsungAdapter(),
19
+ qq: () => new QqAdapter(),
20
+ meizu: () => new MeizuAdapter(),
21
+ };
22
+ export function getAndroidAdapter(channel) {
23
+ if (!ANDROID_CHANNELS.includes(channel)) {
24
+ throw new UsageError(`未知渠道: ${channel}(支持: ${ANDROID_CHANNELS.join(', ')})`);
25
+ }
26
+ const make = ANDROID_FACTORY[channel];
27
+ if (!make)
28
+ throw new UsageError(`渠道 ${channel} 未接入`);
29
+ return make();
30
+ }
31
+ export function getIosAdapter() {
32
+ return new IosAppStoreAdapter();
33
+ }
34
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/adapters/registry.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC5D,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAE7D,MAAM,eAAe,GAAyC;IAC5D,MAAM,EAAE,GAAG,EAAE,CAAC,IAAI,aAAa,EAAE;IACjC,KAAK,EAAE,GAAG,EAAE,CAAC,IAAI,YAAY,EAAE;IAC/B,IAAI,EAAE,GAAG,EAAE,CAAC,IAAI,WAAW,EAAE;IAC7B,IAAI,EAAE,GAAG,EAAE,CAAC,IAAI,WAAW,EAAE;IAC7B,MAAM,EAAE,GAAG,EAAE,CAAC,IAAI,aAAa,EAAE;IACjC,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,cAAc,EAAE;IACnC,EAAE,EAAE,GAAG,EAAE,CAAC,IAAI,SAAS,EAAE;IACzB,KAAK,EAAE,GAAG,EAAE,CAAC,IAAI,YAAY,EAAE;CAChC,CAAC;AAEF,MAAM,UAAU,iBAAiB,CAAC,OAAe;IAC/C,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;QACxC,MAAM,IAAI,UAAU,CAAC,SAAS,OAAO,QAAQ,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC/E,CAAC;IACD,MAAM,IAAI,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC;IACtC,IAAI,CAAC,IAAI;QAAE,MAAM,IAAI,UAAU,CAAC,MAAM,OAAO,MAAM,CAAC,CAAC;IACrD,OAAO,IAAI,EAAE,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,aAAa;IAC3B,OAAO,IAAI,kBAAkB,EAAE,CAAC;AAClC,CAAC"}
@@ -0,0 +1,26 @@
1
+ import { UploadError } from '../core/types.js';
2
+ export function toFailed(channel, err, startedAt, action, ctx) {
3
+ // 错误码归一:渠道原始码透传;超时/网络给独立码,便于调用方区分(重试/告警策略不同)。
4
+ let code = 'error';
5
+ if (err instanceof UploadError) {
6
+ code = err.code;
7
+ }
8
+ else if (err instanceof Error) {
9
+ if (err.name === 'TimeoutError')
10
+ code = 'timeout';
11
+ else if (err.name === 'TypeError' || /fetch failed|ECONN|ETIMEDOUT|EAI_AGAIN|socket|network/i.test(err.message))
12
+ code = 'network';
13
+ }
14
+ return {
15
+ channel,
16
+ packageName: ctx?.packageName,
17
+ versionName: ctx?.versionName,
18
+ versionCode: ctx?.versionCode,
19
+ action,
20
+ status: 'failed',
21
+ errorCode: code,
22
+ message: err instanceof Error ? err.message : String(err),
23
+ durationMs: Date.now() - startedAt,
24
+ };
25
+ }
26
+ //# sourceMappingURL=util.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"util.js","sourceRoot":"","sources":["../../src/adapters/util.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE/C,MAAM,UAAU,QAAQ,CACtB,OAAe,EACf,GAAY,EACZ,SAAiB,EACjB,MAAqB,EACrB,GAAiF;IAEjF,8CAA8C;IAC9C,IAAI,IAAI,GAAG,OAAO,CAAC;IACnB,IAAI,GAAG,YAAY,WAAW,EAAE,CAAC;QAC/B,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC;IAClB,CAAC;SAAM,IAAI,GAAG,YAAY,KAAK,EAAE,CAAC;QAChC,IAAI,GAAG,CAAC,IAAI,KAAK,cAAc;YAAE,IAAI,GAAG,SAAS,CAAC;aAC7C,IAAI,GAAG,CAAC,IAAI,KAAK,WAAW,IAAI,wDAAwD,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC;YAC7G,IAAI,GAAG,SAAS,CAAC;IACrB,CAAC;IACD,OAAO;QACL,OAAO;QACP,WAAW,EAAE,GAAG,EAAE,WAAW;QAC7B,WAAW,EAAE,GAAG,EAAE,WAAW;QAC7B,WAAW,EAAE,GAAG,EAAE,WAAW;QAC7B,MAAM;QACN,MAAM,EAAE,QAAQ;QAChB,SAAS,EAAE,IAAI;QACf,OAAO,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;QACzD,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS;KACnC,CAAC;AACJ,CAAC"}