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,397 @@
1
+ // 文档域名:https://oop-openapi-cn.heytapmobi.com
2
+ // 流程:token → 上传 APK(get-upload-url + multipart)→ enrich(拉取线上应用信息并合并)
3
+ // →(可选)上传图标(photo 资源)/软著证书资源 → app/upd 提交(即提交审核)。
4
+ import { readFile } from 'node:fs/promises';
5
+ import { basename } from 'node:path';
6
+ import { hmacSha256Hex, md5Hex } from '../../../infra/crypto.js';
7
+ import { postForm, isRetryable } from '../../../infra/http.js';
8
+ import { UploadError } from '../../../core/types.js';
9
+ const BASE = 'https://oop-openapi-cn.heytapmobi.com';
10
+ const TOKEN_EP = '/developer/v1/token';
11
+ const APP_INFO_EP = '/resource/v1/app/info';
12
+ const APP_UPD_EP = '/resource/v1/app/upd';
13
+ const UPLOAD_URL_EP = '/resource/v1/upload/get-upload-url';
14
+ const MAX_RETRIES = 3;
15
+ // 大文件上传超时下限(15min),与 ctx.timeoutMs 取大。
16
+ const BIG_UPLOAD_MIN_MS = 900000;
17
+ // enrich 时仅保留这些字段(避免把 version_name/audit_status 等只读态混入 upd 请求)。
18
+ const APP_INFO_KEYS = [
19
+ 'second_category_id',
20
+ 'third_category_id',
21
+ 'summary',
22
+ 'detail_desc',
23
+ 'privacy_source_url',
24
+ 'icon_url',
25
+ 'pic_url',
26
+ 'test_desc',
27
+ 'copyright_url',
28
+ 'electronic_cert_url',
29
+ 'special_url',
30
+ 'special_file_url',
31
+ 'business_username',
32
+ 'business_email',
33
+ 'business_mobile',
34
+ 'age_level',
35
+ 'adaptive_equipment',
36
+ 'adaptive_type',
37
+ 'other_cetificate_url', // 注意:OPPO 服务端字段拼写为 cetificate(少一个 r)
38
+ ];
39
+ function nowSec() {
40
+ return String(Math.floor(Date.now() / 1000));
41
+ }
42
+ function sleep(ms) {
43
+ return new Promise((r) => setTimeout(r, ms));
44
+ }
45
+ /** 签名:除 api_sign 外全部参数(非空)按 key 升序(ASCII 大小写无关)拼 k=v&...,HmacSHA256(clientSecret) 小写 hex。 */
46
+ export function signOppo(params, clientSecret) {
47
+ const str = Object.keys(params)
48
+ .filter((k) => params[k] !== undefined && params[k] !== null)
49
+ .sort((a, b) => {
50
+ const A = a.toUpperCase();
51
+ const B = b.toUpperCase();
52
+ return A < B ? -1 : A > B ? 1 : 0;
53
+ })
54
+ .map((k) => `${k}=${params[k]}`)
55
+ .join('&');
56
+ return hmacSha256Hex(clientSecret, str);
57
+ }
58
+ /**
59
+ * 通用重试:仅对可重试的瞬时失败(5xx / 429 / 网络 / 超时,由共享 isRetryable 判定)做指数退避
60
+ * (2s * attempt);4xx / 签名 / 参数 / 解析等非可重试错误立即原样抛出(重试无意义)。
61
+ * 仅用于幂等请求(token / app/info / get-upload-url / 资源上传);非幂等的 app/upd 提交不走此包裹。
62
+ */
63
+ async function withRetry(operation, fn) {
64
+ let lastErr;
65
+ for (let attempt = 1; attempt <= MAX_RETRIES; attempt++) {
66
+ try {
67
+ return await fn();
68
+ }
69
+ catch (e) {
70
+ lastErr = e;
71
+ if (attempt === MAX_RETRIES || !isRetryable(e))
72
+ throw e;
73
+ await sleep(2000 * attempt);
74
+ }
75
+ }
76
+ throw lastErr;
77
+ }
78
+ function safeErrMsg(data) {
79
+ return String(data?.data?.message ?? 'Unknown error');
80
+ }
81
+ /** GET 返回 JSON(非 200 / 非 JSON 抛 UploadError)。 */
82
+ async function httpGetJson(url, timeoutMs) {
83
+ const res = await fetch(url, { method: 'GET', signal: AbortSignal.timeout(timeoutMs) });
84
+ const text = await res.text();
85
+ if (!res.ok) {
86
+ throw new UploadError(res.status, `http ${res.status}: ${text.slice(0, 300)}`);
87
+ }
88
+ try {
89
+ return JSON.parse(text);
90
+ }
91
+ catch {
92
+ throw new UploadError('parse', `非 JSON 响应: ${text.slice(0, 300)}`);
93
+ }
94
+ }
95
+ /** multipart/form-data 上传(文件直传到 get-upload-url 返回的地址)。 */
96
+ async function postMultipart(uploadUrl, fields, fileBytes, fileName, timeoutMs) {
97
+ const form = new FormData();
98
+ for (const [k, v] of Object.entries(fields))
99
+ form.append(k, v);
100
+ form.append('file', new Blob([fileBytes]), fileName);
101
+ // 不手动设置 Content-Type,交由 fetch 自动带上 multipart boundary。
102
+ const res = await fetch(uploadUrl, { method: 'POST', body: form, signal: AbortSignal.timeout(timeoutMs) });
103
+ const text = await res.text();
104
+ if (!res.ok) {
105
+ throw new UploadError(res.status, `上传失败 ${res.status}: ${text.slice(0, 300)}`);
106
+ }
107
+ let data;
108
+ try {
109
+ data = JSON.parse(text);
110
+ }
111
+ catch {
112
+ throw new UploadError('parse', `上传返回非 JSON: ${text.slice(0, 300)}`);
113
+ }
114
+ if (Number(data?.errno) !== 0) {
115
+ throw new UploadError(data?.errno ?? -1, safeErrMsg(data));
116
+ }
117
+ return data;
118
+ }
119
+ /** 获取 access_token(GET,client_id/client_secret 明文入参)。 */
120
+ export async function fetchAccessToken(args) {
121
+ return withRetry('获取AccessToken', async () => {
122
+ const qs = new URLSearchParams({ client_id: args.clientId, client_secret: args.clientSecret });
123
+ const data = await httpGetJson(`${BASE}${TOKEN_EP}?${qs.toString()}`, args.timeoutMs);
124
+ if (Number(data?.errno) !== 0)
125
+ throw new UploadError(data?.errno ?? -1, safeErrMsg(data));
126
+ return String(data?.data?.access_token ?? '');
127
+ });
128
+ }
129
+ /** 拉取线上应用信息的 data 对象(用于 enrich 合并 / 查询审核态)。 */
130
+ export async function fetchAppInfoData(args) {
131
+ return withRetry('获取应用信息', async () => {
132
+ const q = {
133
+ pkg_name: args.packageName,
134
+ access_token: args.accessToken,
135
+ timestamp: nowSec(),
136
+ };
137
+ const api_sign = signOppo(q, args.clientSecret);
138
+ const qs = new URLSearchParams({ ...q, api_sign });
139
+ const data = await httpGetJson(`${BASE}${APP_INFO_EP}?${qs.toString()}`, args.timeoutMs);
140
+ if (Number(data?.errno) !== 0)
141
+ throw new UploadError(data?.errno ?? -1, safeErrMsg(data));
142
+ return (data?.data ?? {});
143
+ });
144
+ }
145
+ /** 获取上传地址:返回 { sign, uploadUrl }。 */
146
+ async function getUploadUrl(args) {
147
+ const q = {
148
+ pkg_name: args.packageName,
149
+ access_token: args.accessToken,
150
+ timestamp: nowSec(),
151
+ };
152
+ const api_sign = signOppo(q, args.clientSecret);
153
+ const qs = new URLSearchParams({ ...q, api_sign });
154
+ const data = await httpGetJson(`${BASE}${UPLOAD_URL_EP}?${qs.toString()}`, args.timeoutMs);
155
+ if (Number(data?.errno) !== 0)
156
+ throw new UploadError(data?.errno ?? -1, safeErrMsg(data));
157
+ return { sign: String(data?.data?.sign ?? ''), uploadUrl: String(data?.data?.upload_url ?? '') };
158
+ }
159
+ /** 通用资源直传(get-upload-url → multipart),返回服务端 url。type: apk/resource/photo。 */
160
+ async function uploadFile(args) {
161
+ return withRetry(`上传(${args.type})`, async () => {
162
+ const { sign, uploadUrl } = await getUploadUrl({
163
+ clientSecret: args.clientSecret,
164
+ packageName: args.packageName,
165
+ accessToken: args.accessToken,
166
+ timeoutMs: args.timeoutMs,
167
+ });
168
+ const fields = { type: args.type, sign, timestamp: nowSec() };
169
+ fields.api_sign = signOppo(fields, args.clientSecret);
170
+ const data = await postMultipart(uploadUrl, fields, args.bytes, args.fileName, Math.max(args.timeoutMs, BIG_UPLOAD_MIN_MS));
171
+ return String(data?.data?.url ?? '');
172
+ });
173
+ }
174
+ /** 上传 APK,返回服务端 url。 */
175
+ export async function uploadApkFile(args) {
176
+ return uploadFile({
177
+ clientSecret: args.clientSecret,
178
+ packageName: args.packageName,
179
+ accessToken: args.accessToken,
180
+ type: 'apk',
181
+ bytes: args.apkBytes,
182
+ fileName: args.fileName,
183
+ timeoutMs: args.timeoutMs,
184
+ });
185
+ }
186
+ /** 上传应用图标(512×512 PNG)为 photo 类型资源,返回服务端图标 url(用作 submit 的 icon_url)。 */
187
+ export async function uploadIconFile(args) {
188
+ return uploadFile({
189
+ clientSecret: args.clientSecret,
190
+ packageName: args.packageName,
191
+ accessToken: args.accessToken,
192
+ type: 'photo', // 图标使用 photo 资源类型。
193
+ bytes: args.iconBytes,
194
+ fileName: 'icon.png',
195
+ timeoutMs: args.timeoutMs,
196
+ });
197
+ }
198
+ /** 上传单张竖版截图(PNG)为 photo 类型资源,返回服务端图片 url(用作 submit 的 pic_url)。 */
199
+ export async function uploadScreenshotFile(args) {
200
+ return uploadFile({
201
+ clientSecret: args.clientSecret,
202
+ packageName: args.packageName,
203
+ accessToken: args.accessToken,
204
+ type: 'photo', // 截图与图标同走 photo 资源类型。
205
+ bytes: args.bytes,
206
+ fileName: `screenshot-${args.index + 1}.png`,
207
+ timeoutMs: args.timeoutMs,
208
+ });
209
+ }
210
+ /** 下载软著证书文件并以 resource 类型上传到 OPPO,返回服务端 url。 */
211
+ export async function uploadOtherCertificate(args) {
212
+ const res = await fetch(args.certUrl, { signal: AbortSignal.timeout(Math.max(args.timeoutMs, BIG_UPLOAD_MIN_MS)) });
213
+ if (!res.ok) {
214
+ throw new UploadError(res.status, `下载软著证书失败: ${res.status}`);
215
+ }
216
+ const bytes = Buffer.from(await res.arrayBuffer());
217
+ const fileName = args.certUrl.split('/').pop() || 'certificate.zip';
218
+ return uploadFile({
219
+ clientSecret: args.clientSecret,
220
+ packageName: args.packageName,
221
+ accessToken: args.accessToken,
222
+ type: 'resource',
223
+ bytes,
224
+ fileName,
225
+ timeoutMs: args.timeoutMs,
226
+ });
227
+ }
228
+ /** 合并线上应用信息与本次更新字段。 */
229
+ async function enrich(args) {
230
+ const data = await fetchAppInfoData({
231
+ clientSecret: args.clientSecret,
232
+ packageName: args.packageName,
233
+ accessToken: args.accessToken,
234
+ timeoutMs: args.timeoutMs,
235
+ });
236
+ const result = {};
237
+ for (const k of APP_INFO_KEYS) {
238
+ const v = data[k];
239
+ if (v !== undefined && v !== null)
240
+ result[k] = String(v);
241
+ }
242
+ if (data.app_name !== undefined && data.app_name !== null)
243
+ result.app_name = String(data.app_name);
244
+ // 历史未设置过适配方式时 API 返回 "0",是非法值,需移除。
245
+ if (result.adaptive_type === '0')
246
+ delete result.adaptive_type;
247
+ // copyright_url 为空且 electronic_cert_url 不为空时,用后者兜底。
248
+ if ((result.copyright_url === undefined || result.copyright_url === '') && result.electronic_cert_url) {
249
+ result.copyright_url = result.electronic_cert_url;
250
+ }
251
+ // 合并本次更新字段(覆盖线上)。
252
+ Object.assign(result, args.body);
253
+ return result;
254
+ }
255
+ /** 提交应用更新(app/upd,即提交审核)。 */
256
+ export async function submitUpdate(args) {
257
+ // app/upd 为「提交发版」,非幂等:不自动重试(下方 postForm 传 retries=0),避免重复提交。
258
+ // app/upd 仍是整个流程的最后一步。
259
+ const body = {
260
+ access_token: args.accessToken,
261
+ apk_url: JSON.stringify([args.apkInfo]),
262
+ online_type: '1', // 及时发布(审核通过后立即上线)
263
+ timestamp: nowSec(),
264
+ pkg_name: args.packageName,
265
+ update_desc: args.updateDesc,
266
+ version_code: args.versionCode,
267
+ };
268
+ if (args.privacyUrl)
269
+ body.privacy_source_url = args.privacyUrl;
270
+ // 文案:仅当传入时覆盖 enrich 合并进来的线上值,否则沿用线上(按需生效)。
271
+ if (args.appName)
272
+ body.app_name = args.appName;
273
+ if (args.summary)
274
+ body.summary = args.summary;
275
+ if (args.description)
276
+ body.detail_desc = args.description;
277
+ // 截图:有上传后的竖版 pic_url 串才覆盖,否则沿用线上 pic_url。
278
+ if (args.picUrl)
279
+ body.pic_url = args.picUrl;
280
+ // 图标:有上传后的 OPPO 图标 url 才带 icon_url(覆盖 enrich 合并进来的线上 icon_url);
281
+ if (args.iconUrl)
282
+ body.icon_url = args.iconUrl;
283
+ const resultBody = await enrich({
284
+ clientSecret: args.clientSecret,
285
+ packageName: args.packageName,
286
+ accessToken: args.accessToken,
287
+ body,
288
+ timeoutMs: args.timeoutMs,
289
+ });
290
+ // 软著证书:优先用线上已有值;否则若传入 certUrl 则下载并上传换取 OPPO 链接;都没有则移除该字段。
291
+ const serverCert = resultBody.other_cetificate_url;
292
+ if (serverCert && serverCert.length > 0) {
293
+ // 线上已有有效证书链接,直接复用(已在 resultBody 中)。
294
+ }
295
+ else if (args.otherCertUrl && args.otherCertUrl.length > 0) {
296
+ resultBody.other_cetificate_url = await uploadOtherCertificate({
297
+ clientSecret: args.clientSecret,
298
+ packageName: args.packageName,
299
+ accessToken: args.accessToken,
300
+ certUrl: args.otherCertUrl,
301
+ timeoutMs: args.timeoutMs,
302
+ });
303
+ }
304
+ else {
305
+ delete resultBody.other_cetificate_url;
306
+ }
307
+ resultBody.api_sign = signOppo(resultBody, args.clientSecret);
308
+ // app/upd 为提交发版(非幂等)→ retries=0,关闭 postForm 的自动重试,避免重复提交。
309
+ const data = await postForm(`${BASE}${APP_UPD_EP}`, resultBody, args.timeoutMs, 0);
310
+ if (Number(data?.errno) !== 0) {
311
+ throw new UploadError(data?.errno ?? -1, safeErrMsg(data));
312
+ }
313
+ }
314
+ /** 完整传报:token → 上传 APK → enrich+提交更新(即提交审核)。 */
315
+ export async function uploadOppo(args) {
316
+ const apkBytes = await readFile(args.apkPath);
317
+ const md5sum = md5Hex(apkBytes);
318
+ const accessToken = await fetchAccessToken({
319
+ clientId: args.clientId,
320
+ clientSecret: args.clientSecret,
321
+ timeoutMs: args.timeoutMs,
322
+ });
323
+ const apkUrl = await uploadApkFile({
324
+ clientSecret: args.clientSecret,
325
+ packageName: args.packageName,
326
+ accessToken,
327
+ apkBytes,
328
+ fileName: basename(args.apkPath),
329
+ timeoutMs: args.timeoutMs,
330
+ });
331
+ // 仅当传入图标字节时才上传图标换取 OPPO 图标 url;否则不带 icon_url,沿用线上图标。
332
+ let iconUrl;
333
+ if (args.iconBytes && args.iconBytes.length > 0) {
334
+ iconUrl = await uploadIconFile({
335
+ clientSecret: args.clientSecret,
336
+ packageName: args.packageName,
337
+ accessToken,
338
+ iconBytes: args.iconBytes,
339
+ timeoutMs: args.timeoutMs,
340
+ });
341
+ }
342
+ // 仅当传入截图字节时才逐张上传换取 OPPO 图片 url;否则不带 pic_url,沿用线上截图。
343
+ let picUrl;
344
+ if (args.screenshotBytes && args.screenshotBytes.length > 0) {
345
+ const urls = [];
346
+ for (let i = 0; i < args.screenshotBytes.length; i++) {
347
+ urls.push(await uploadScreenshotFile({
348
+ clientSecret: args.clientSecret,
349
+ packageName: args.packageName,
350
+ accessToken,
351
+ bytes: args.screenshotBytes[i],
352
+ index: i,
353
+ timeoutMs: args.timeoutMs,
354
+ }));
355
+ }
356
+ // 多张竖版 url 以逗号拼接覆盖 pic_url(与 enrich 对数组字段 String() 序列化的口径一致)。
357
+ // 待联调:OPPO app/upd 对 pic_url 的确切分隔/JSON 形态需以真实 app/info 回环为准。
358
+ picUrl = urls.join(',');
359
+ }
360
+ await submitUpdate({
361
+ clientSecret: args.clientSecret,
362
+ packageName: args.packageName,
363
+ accessToken,
364
+ apkInfo: { url: apkUrl, md5: md5sum, cpu_code: 0 },
365
+ versionCode: args.versionCode,
366
+ updateDesc: args.updateDesc,
367
+ privacyUrl: args.privacyUrl,
368
+ iconUrl,
369
+ otherCertUrl: args.otherCertificateUrl,
370
+ appName: args.appName,
371
+ summary: args.summary,
372
+ description: args.description,
373
+ picUrl,
374
+ timeoutMs: args.timeoutMs,
375
+ });
376
+ }
377
+ /** 查询审核状态:返回审核态名称、state 与线上版本号。 */
378
+ export async function queryOppoStatus(args) {
379
+ const accessToken = await fetchAccessToken({
380
+ clientId: args.clientId,
381
+ clientSecret: args.clientSecret,
382
+ timeoutMs: args.timeoutMs,
383
+ });
384
+ const data = await fetchAppInfoData({
385
+ clientSecret: args.clientSecret,
386
+ packageName: args.packageName,
387
+ accessToken,
388
+ timeoutMs: args.timeoutMs,
389
+ });
390
+ return {
391
+ auditName: String(data.audit_status_name ?? ''),
392
+ state: String(data.state ?? ''),
393
+ versionName: data.version_name != null ? String(data.version_name) : undefined,
394
+ versionCode: data.version_code != null ? String(data.version_code) : undefined,
395
+ };
396
+ }
397
+ //# sourceMappingURL=api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.js","sourceRoot":"","sources":["../../../../src/adapters/android/oppo/api.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,135 @@
1
+ import { toFailed } from '../../util.js';
2
+ import { prepareScreenshot } from '../../../pkginfo/icon.js';
3
+ import { resolveIconBytes } from '../../../pkginfo/apk-icon.js';
4
+ import { getChannelSpec, warnIfTooLong } from '../specs.js';
5
+ import { queryOppoStatus, uploadOppo } from './api.js';
6
+ /** 把 OPPO audit_status_name 按关键字映射到归一化状态。 */
7
+ function mapAudit(auditName) {
8
+ const name = auditName ?? '';
9
+ const lower = name.toLowerCase();
10
+ if (name.includes('上线') || lower.includes('online') || lower.includes('pass'))
11
+ return 'approved';
12
+ if (name.includes('审核') || lower.includes('review'))
13
+ return 'pending_review';
14
+ if (name.includes('拒') || lower.includes('reject') || name.includes('失败'))
15
+ return 'rejected';
16
+ return 'pending_review';
17
+ }
18
+ /**
19
+ * OPPO 应用市场:app/upd 即提交审核,无「只上传不提审」模式,故 upload 始终为 upload+submit。
20
+ * creds:client_id / client_secret(取 token、签名);app_id 为必填但 OPPO 上传 API 不使用。
21
+ * 可选 creds.other_certificate_url(软著证书):缺失则跳过证书上传,沿用线上已有证书。
22
+ */
23
+ export class OppoAdapter {
24
+ channel = 'oppo';
25
+ async upload(ctx) {
26
+ const start = Date.now();
27
+ try {
28
+ const spec = getChannelSpec('oppo');
29
+ // 默认不更新图标(沿用线上),仅 --update-icon 时更新 512²(按大小上限压缩);
30
+ // 来源:优先 --icon,否则 aapt 从 APK 自动提取。
31
+ const iconBytes = ctx.updateIcon
32
+ ? await resolveIconBytes({
33
+ iconPath: ctx.iconPath,
34
+ apkPath: ctx.pkg,
35
+ size: spec.iconSize,
36
+ maxBytes: spec.iconMaxBytes,
37
+ })
38
+ : undefined;
39
+ // 文案:仅当 ctx 字段有值时才会下传覆盖;写前做长度(及 summary 标点/空格)告警,不阻断。
40
+ warnIfTooLong('oppo', 'appName', ctx.appName, spec.appNameMax);
41
+ warnIfTooLong('oppo', 'summary', ctx.summary, spec.summaryMax);
42
+ warnIfTooLong('oppo', 'description', ctx.description, spec.descriptionMax);
43
+ if (ctx.summary && /[\s\p{P}\p{S}]/u.test(ctx.summary)) {
44
+ console.error('[warn] oppo summary 含标点/空格/符号,OPPO 要求 summary 禁标点空格,可能被打回');
45
+ }
46
+ // 截图:仅当 ctx.screenshots 非空时处理为竖版字节(每张按渠道格式/大小上限编码),否则沿用线上。
47
+ let screenshotBytes;
48
+ if (ctx.screenshots && ctx.screenshots.length > 0) {
49
+ screenshotBytes = [];
50
+ for (const p of ctx.screenshots) {
51
+ screenshotBytes.push(await prepareScreenshot(p, spec.screenshotFormat, spec.screenshotMaxBytes));
52
+ }
53
+ const n = screenshotBytes.length;
54
+ if ((spec.screenshotMin && n < spec.screenshotMin) ||
55
+ (spec.screenshotMax && n > spec.screenshotMax)) {
56
+ console.error(`[warn] oppo 截图 ${n} 张,建议 ${spec.screenshotMin}-${spec.screenshotMax} 张(以渠道后台为准)`);
57
+ }
58
+ }
59
+ await uploadOppo({
60
+ clientId: ctx.creds.client_id,
61
+ clientSecret: ctx.creds.client_secret,
62
+ packageName: ctx.packageName,
63
+ versionCode: ctx.versionCode,
64
+ apkPath: ctx.pkg,
65
+ updateDesc: ctx.releaseNote ?? '',
66
+ privacyUrl: ctx.privacyUrl,
67
+ iconBytes,
68
+ otherCertificateUrl: ctx.creds.other_certificate_url,
69
+ appName: ctx.appName,
70
+ summary: ctx.summary,
71
+ description: ctx.description,
72
+ screenshotBytes,
73
+ timeoutMs: ctx.timeoutMs,
74
+ });
75
+ // 观察用:拼出本次实际下传的元数据项(仅当有值才更新,缺省沿用线上)。
76
+ const updated = [];
77
+ if (iconBytes)
78
+ updated.push('icon');
79
+ if (ctx.appName)
80
+ updated.push('appName');
81
+ if (ctx.summary)
82
+ updated.push('summary');
83
+ if (ctx.description)
84
+ updated.push('description');
85
+ if (screenshotBytes?.length)
86
+ updated.push(`screenshots×${screenshotBytes.length}`);
87
+ const message = [
88
+ ctx.creds.other_certificate_url ? '已传入 creds.other_certificate_url(软著证书)' : '',
89
+ updated.length ? `已更新元数据: ${updated.join(',')}` : '',
90
+ ]
91
+ .filter(Boolean)
92
+ .join('; ');
93
+ return {
94
+ channel: this.channel,
95
+ packageName: ctx.packageName,
96
+ versionName: ctx.versionName,
97
+ versionCode: ctx.versionCode,
98
+ action: 'upload+submit',
99
+ status: 'submitted',
100
+ errorCode: null,
101
+ message,
102
+ durationMs: Date.now() - start,
103
+ };
104
+ }
105
+ catch (e) {
106
+ return toFailed(this.channel, e, start, 'upload+submit', ctx);
107
+ }
108
+ }
109
+ async queryStatus(ctx) {
110
+ const start = Date.now();
111
+ try {
112
+ const s = await queryOppoStatus({
113
+ clientId: ctx.creds.client_id,
114
+ clientSecret: ctx.creds.client_secret,
115
+ packageName: ctx.packageName ?? '',
116
+ timeoutMs: ctx.timeoutMs,
117
+ });
118
+ return {
119
+ channel: this.channel,
120
+ packageName: ctx.packageName,
121
+ versionName: s.versionName,
122
+ versionCode: s.versionCode,
123
+ action: 'status',
124
+ status: mapAudit(s.auditName),
125
+ marketVersion: s.versionName,
126
+ errorCode: null,
127
+ durationMs: Date.now() - start,
128
+ };
129
+ }
130
+ catch (e) {
131
+ return toFailed(this.channel, e, start, 'status');
132
+ }
133
+ }
134
+ }
135
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/adapters/android/oppo/index.ts"],"names":[],"mappings":"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"}