@applift/core 0.0.0-stage → 0.1.1

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.
@@ -0,0 +1,382 @@
1
+ import { A as StoresSchema, B as BundleIds, C as GlobalConfig, D as StoreConfig, E as ProjectConfigSchema, F as ChannelRegistry, G as electronAdapter, H as Platform, I as ReleasePlanEntry, J as nativeAndroidAdapter, K as findArtifacts, L as ReviewStatus, M as ChannelCapabilities, N as ChannelContext, O as StoreConfigSchema, P as ChannelEvent, Q as tauriAdapter, R as StageResult, S as CredentialsProfileSchema, T as ProjectConfig, U as detectBundleIds, V as FrameworkAdapter, W as detectFramework, X as nativeIosAdapter, Y as nativeHarmonyAdapter, Z as rnAdapter, _ as appendEntry, a as QypubUserConfig, b as CredentialsFileSchema, c as PipelineInput, d as runStage, f as runSubmit, g as HistoryQuery, h as HistoryEvent, i as QypubPlugin, j as Channel, k as Stores, l as PipelineSummary, m as HistoryEntry, n as PluginHookName, o as defineConfig, p as HISTORY_PATH, q as flutterAdapter, r as PluginHost, s as resolvePlugins, t as HookContext, u as PipelineSummaryEntry, v as readEntries, w as GlobalConfigSchema, x as CredentialsProfile, y as CredentialsFile, z as SubmitResult } from "./plugin-T6zXsmt1.mjs";
2
+ //#region src/registry.d.ts
3
+ export declare class DefaultChannelRegistry implements ChannelRegistry {
4
+ private readonly channels;
5
+ register(channel: Channel): void;
6
+ get(id: string): Channel | undefined;
7
+ all(): Channel[];
8
+ }
9
+ /** 全局默认注册表(CLI/测试均可注入独立实例) */
10
+ export declare const registry: DefaultChannelRegistry;
11
+ //#endregion
12
+ //#region src/config/loader.d.ts
13
+ export declare const APPLIFT_HOME: string;
14
+ export declare const CREDENTIALS_PATH: string;
15
+ export declare const GLOBAL_CONFIG_PATH: string;
16
+ /** 项目级凭据目录(<project>/.applift/credentials.toml;gitignore 由用户决定:私有仓可提交,公开仓 ignore) */
17
+ export declare function projectCredentialsPath(projectRoot: string): string;
18
+ /** 从 startDir 逐层向上找第一个存在的路径(monorepo 子包向上借用根配置/凭据);找不到返回 null */
19
+ export declare function findUp(startDir: string, relative: string): string | null;
20
+ /**
21
+ * 逐级凭据加载:项目 <root>/.applift/credentials.toml(就近,逐键优先)→ 全局 ~/.applift/(逐键回退)。
22
+ * 场景:私有仓提交凭据进仓库;或公开仓 .applift/ 进 gitignore 由成员各自维护。
23
+ * profile 合并:项目同名 profile 逐键覆盖全局;仅全局有则用全局。
24
+ */
25
+ export declare function loadCredentialsLayered(projectRoot?: string, globalPath?: string): CredentialsFile;
26
+ /** 读取并校验 credentials.toml;不存在返回空 profiles;强制 0600 */
27
+ export declare function loadCredentials(filePath?: string): CredentialsFile;
28
+ /** 按项目 profile 取凭据;profile 不存在时报错并列出可用 profiles。
29
+ * 环境变量覆盖(CI 场景):APPLIFT_<KEY> 前缀优先(如 APPLIFT_PGYER_API_KEY);
30
+ * knownKeys 提供时其裸键名(如 PGYER_API_KEY)也认(向后兼容),未提供的裸大写键不捡(避免误吸无关变量)。
31
+ */
32
+ export declare function resolveProfile(creds: CredentialsFile, profile: string, knownKeys?: string[]): Record<string, string>;
33
+ /** 全局配置装载(缺失/损坏降级默认值并警告,不阻断) */
34
+ export declare function loadGlobalConfig(filePath?: string): GlobalConfig;
35
+ /** 写凭据(目录自动创建,文件强制 0600) */
36
+ export declare function saveCredentials(data: CredentialsFile, filePath?: string): void;
37
+ //#endregion
38
+ //#region src/config/project.d.ts
39
+ export interface LoadedProjectConfig {
40
+ config: ProjectConfig;
41
+ /**
42
+ * c12 原始配置(保留 plugins 等 schema 外键)——插件发现(resolvePlugins)用;
43
+ * 业务字段一律以 config(zod 解析后)为准。
44
+ */
45
+ raw: QypubUserConfig;
46
+ /** 配置文件所在目录(解析相对路径用),无配置文件时为 cwd */
47
+ cwd: string;
48
+ }
49
+ export declare function loadProjectConfig(cwd: string): Promise<LoadedProjectConfig>;
50
+ //#endregion
51
+ //#region src/config/profile-map.d.ts
52
+ export declare const PROJECTS_MAP_PATH: string;
53
+ /** 读取映射;不存在/损坏 JSON/顶层非对象/值非字符串 → {}(个人偏好缺失或损坏不阻断发版) */
54
+ export declare function loadProjectProfileMap(filePath?: string): Record<string, string>;
55
+ /** 覆盖写整个映射(目录自动创建;非凭据,无敏感值,默认权限即可) */
56
+ export declare function saveProjectProfileMap(map: Record<string, string>, filePath?: string): void;
57
+ /** 记录某项目使用的 profile(键统一绝对路径;合并保留其他项目的条目) */
58
+ export declare function setProjectProfile(cwd: string, profile: string, filePath?: string): void;
59
+ /**
60
+ * 解析项目生效 profile:projects.json 个人选择 > 项目配置 profile(团队默认)> 'default' 全局默认。
61
+ * CLI 的 --profile 旗标在调用方以 `opts.profile ?? resolveProfileFor(...)` 再盖一层(最高优先级)。
62
+ */
63
+ export declare function resolveProfileFor(cwd: string, projectCfgProfile?: string, filePath?: string): string;
64
+ //#endregion
65
+ //#region src/channels/shared/sign.d.ts
66
+ export declare function sortedQueryString(params: Record<string, string | number | undefined | null>): string;
67
+ export declare function hmacSign(secret: string, params: Record<string, string | number | undefined | null>): string;
68
+ export declare function tsSeconds(): string;
69
+ export declare function tsMillis(): string;
70
+ export declare function md5String(s: string): string;
71
+ /** 分块计算文件 MD5(apk 较大,8MB 分块避免整读) */
72
+ export declare function md5File(filePath: string): string;
73
+ /** POST application/x-www-form-urlencoded */
74
+ export declare function formPost<T = unknown>(url: string, params: Record<string, string>, { timeout }?: {
75
+ timeout?: number;
76
+ }): Promise<T>;
77
+ //#endregion
78
+ //#region src/channels/pgyer.d.ts
79
+ export declare class PgyerChannel implements Channel {
80
+ readonly id = "pgyer";
81
+ readonly label = "蒲公英";
82
+ readonly capabilities: ChannelCapabilities;
83
+ plan(ctx: ChannelContext): Promise<ReleasePlanEntry>;
84
+ stage(ctx: ChannelContext): Promise<StageResult>;
85
+ submit(): Promise<SubmitResult>;
86
+ status(): Promise<ReviewStatus>;
87
+ }
88
+ //#endregion
89
+ //#region src/listing.d.ts
90
+ /** listing 输入(基础值 + 按渠道覆盖) */
91
+ export interface ListingInput {
92
+ /** 应用简介(一句话,商店列表页展示) */
93
+ brief?: string;
94
+ /** 应用描述(长文案,详情页) */
95
+ description?: string;
96
+ /** 图标文件绝对/相对路径 */
97
+ iconPath?: string;
98
+ /** 截图文件路径列表 */
99
+ screenshots?: string[];
100
+ /** 渠道级覆盖:键=渠道 id,值为该渠道生效的字段覆盖 */
101
+ stores?: Record<string, Partial<Omit<ListingInput, "stores">>>;
102
+ }
103
+ /** listing 更新结果(单渠道) */
104
+ export interface ListingResult {
105
+ ok: boolean;
106
+ store: string;
107
+ /** 已写入渠道的字段名 */
108
+ updated: string[];
109
+ /** 输入存在但渠道跳过(不支持/未验证)的字段名 */
110
+ skipped: string[];
111
+ error?: string;
112
+ }
113
+ /** 渠道可选能力:更新商店应用信息(listing) */
114
+ export interface ListingCapableChannel {
115
+ /** 更新商店 listing;实现方自报 updated/skipped 字段 */
116
+ updateListing(ctx: Pick<ChannelContext, "credentials" | "target" | "emit">, listing: ListingInput): Promise<ListingResult>;
117
+ }
118
+ /** 合并基础值与渠道覆盖(覆盖优先,仅取显式传入的键) */
119
+ export declare function resolveListing(listing: ListingInput, store: string): ListingInput;
120
+ /**
121
+ * 装载 listing 配置文件(TS:`export default { brief, description, stores: {...} }`)。
122
+ * 相对路径基于文件所在目录解析为绝对路径(iconPath/screenshots)。
123
+ */
124
+ export declare function loadListingFile(filePath: string): Promise<ListingInput>;
125
+ /** 校验 listing 引用的本地文件存在(icon/截图);dry-run 也校验,避免发到一半才失败 */
126
+ export declare function assertListingFiles(listing: ListingInput): void;
127
+ //#endregion
128
+ //#region src/channels/huawei.d.ts
129
+ export declare const WAIT_BEFORE_SUBMIT_MS = 120000;
130
+ export declare class HuaweiAndroidChannel implements Channel, ListingCapableChannel {
131
+ readonly id = "huawei";
132
+ readonly label = "华为应用市场";
133
+ readonly capabilities: ChannelCapabilities;
134
+ readonly errorHints: {
135
+ "204144719": string;
136
+ "204144727": string;
137
+ "204144660": string;
138
+ "1003": string;
139
+ "204144702": string;
140
+ "204144677": string;
141
+ };
142
+ private authHeaders;
143
+ plan(ctx: ChannelContext): Promise<ReleasePlanEntry>;
144
+ stage(ctx: ChannelContext): Promise<StageResult>;
145
+ submit(ctx: ChannelContext): Promise<SubmitResult>;
146
+ /**
147
+ * 更新商店应用信息:简介/描述走 v3 app-language-info(briefInfo/appDesc)。
148
+ * 图标/截图:华为 v3 app-file-info 的 fileType 取值未在官方文档确证(软件包=5 已验证,图标清单值不确定),
149
+ * 未经真机验证前只上传 OBS 不做 file-info 绑定(skip 并在结果中标注),避免误写损坏草稿。
150
+ */
151
+ updateListing(ctx: Pick<ChannelContext, "credentials" | "target" | "emit">, listing: ListingInput): Promise<ListingResult>;
152
+ /**
153
+ * 审核状态查询: GET /api/publish/v2/app-info → appInfo.releaseState。
154
+ * releaseState 全表 —— 对拍 python/android-publish hw_query.py(真机验证权威):
155
+ * 0=已上架 1=审核不通过 2=已下架 3=待上架 4=审核中 5=升级审核中
156
+ * 7=草稿 8=升级审核不通过 11=撤销上架
157
+ * (apkgo huawei.go 交叉验证一致,另收录 6=申请下架 9=下架审核不通过 10=开发者下架 12=预审中 13=预审不通过)
158
+ */
159
+ status(ctx: Pick<ChannelContext, "credentials" | "target">): Promise<ReviewStatus>;
160
+ }
161
+ //#endregion
162
+ //#region src/channels/shared/agc-token.d.ts
163
+ /** 华为 AGC token(安卓/鸿蒙同源)——自 v1 lib/agc.mjs 迁移 */
164
+ export declare function getAgcToken({ clientId, clientSecret }: {
165
+ clientId: string;
166
+ clientSecret: string;
167
+ }): Promise<string>;
168
+ //#endregion
169
+ //#region src/channels/xiaomi.d.ts
170
+ export declare class XiaomiChannel implements Channel {
171
+ readonly id = "xiaomi";
172
+ readonly label = "小米应用商店";
173
+ readonly capabilities: ChannelCapabilities;
174
+ plan(_ctx: ChannelContext): Promise<ReleasePlanEntry>;
175
+ /** 小米不支持只传包:push 接口上传即提审 */
176
+ stage(_ctx: ChannelContext): Promise<StageResult>;
177
+ submit(ctx: ChannelContext): Promise<SubmitResult>;
178
+ /**
179
+ * 审核状态查询: POST /dev/query(SIG 同 push,RequestData={userName,packageName})。
180
+ * 小米无专用审核接口,返回含 status 字段但取值文档缺失 → 统一 unknown+raw 透出原始响应。
181
+ */
182
+ status(ctx: Pick<ChannelContext, "credentials" | "target">): Promise<ReviewStatus>;
183
+ }
184
+ //#endregion
185
+ //#region src/channels/oppo.d.ts
186
+ export declare class OppoChannel implements Channel {
187
+ readonly id = "oppo";
188
+ readonly label = "OPPO 应用市场";
189
+ readonly capabilities: ChannelCapabilities;
190
+ readonly errorHints: {
191
+ "911215": string;
192
+ "911216": string;
193
+ "800002": string;
194
+ };
195
+ /** stage 产物暂存(apkUrl/md5),submit 按 pkgName 取回 */
196
+ private readonly staged;
197
+ private required;
198
+ private auth;
199
+ plan(_ctx: ChannelContext): Promise<ReleasePlanEntry>;
200
+ stage(ctx: ChannelContext): Promise<StageResult>;
201
+ /**
202
+ * 上传 APK 到 OPPO 文件服务器(get-upload-url → multipart),返回 apkUrl/md5。
203
+ * stage 与 submit 回退共用;app/info 有频控且仅 submit 复用线上字段需要,stage 不查。
204
+ */
205
+ private uploadApk;
206
+ submit(ctx: ChannelContext): Promise<SubmitResult>;
207
+ /**
208
+ * 审核状态查询: GET /resource/v1/app/info(公共参数 + api_sign,同 stage)
209
+ * → data.audit_status(android-publish oppo_query.py: 1=待提审 2=审核中 3=通过 4=驳回)。
210
+ */
211
+ status(ctx: Pick<ChannelContext, "credentials" | "target">): Promise<ReviewStatus>;
212
+ }
213
+ //#endregion
214
+ //#region src/channels/vivo.d.ts
215
+ export declare class VivoChannel implements Channel {
216
+ readonly id = "vivo";
217
+ readonly label = "vivo 应用市场";
218
+ readonly capabilities: ChannelCapabilities;
219
+ readonly errorHints: {
220
+ "1002": string;
221
+ "46001": string;
222
+ };
223
+ /**
224
+ * stage→submit 之间传递上传结果:Channel 接口不透传 ref,
225
+ * 常规编排为同一进程内先 stage 后 submit,用实例字段承接;
226
+ * 直接 submit(跳过 stage)时回退为现场上传。
227
+ * 对拍 python upload_apk:serialnumber/versionCode 均取自上传响应,提审都要回传。
228
+ */
229
+ private lastUpload?;
230
+ private creds;
231
+ plan(ctx: ChannelContext): Promise<ReleasePlanEntry>;
232
+ /** 查应用详情(提审复用 compatibleDevice/onlineType;审核状态 auditStatus 也出于此) */
233
+ private queryDetails;
234
+ /** 普通 JSON 接口(签名覆盖公共+业务参数) */
235
+ private vivoApi;
236
+ stage(ctx: ChannelContext): Promise<StageResult>;
237
+ submit(ctx: ChannelContext): Promise<SubmitResult>;
238
+ /**
239
+ * 审核状态查询: 复用 app.query.details 的 data.auditStatus(对拍 python vivo_query.py;
240
+ * 未确证的 app.audit.status method 已删——python/apkgo 均无此调用)。
241
+ * 映射 0=审核通过 1=审核中 2=驳回 沿自 v1,待真机校准;
242
+ * 交叉见证:apkgo vivo.go 读 data.status 且编号不同(1草稿/2待审核/3通过/4不通过/5撤销),冲突以真机为准。
243
+ */
244
+ status(ctx: Pick<ChannelContext, "credentials" | "target">): Promise<ReviewStatus>;
245
+ /** 驳回原因字段名文档未明确,按常见命名兜底取(auditMessage/auditMsg) */
246
+ private auditReason;
247
+ }
248
+ //#endregion
249
+ //#region src/channels/honor.d.ts
250
+ export declare class HonorChannel implements Channel {
251
+ readonly id = "honor";
252
+ readonly label = "荣耀应用市场";
253
+ readonly capabilities: ChannelCapabilities;
254
+ readonly errorHints: {
255
+ "100030001": string;
256
+ "100030002": string;
257
+ };
258
+ private fetchToken;
259
+ plan(ctx: ChannelContext): Promise<ReleasePlanEntry>;
260
+ stage(ctx: ChannelContext): Promise<StageResult>;
261
+ submit(ctx: ChannelContext): Promise<SubmitResult>;
262
+ status(ctx: Pick<ChannelContext, "credentials" | "target">): Promise<ReviewStatus>;
263
+ }
264
+ //#endregion
265
+ //#region src/channels/yyb.d.ts
266
+ export declare class YybChannel implements Channel {
267
+ readonly id = "yyb";
268
+ readonly label = "腾讯应用宝";
269
+ readonly capabilities: ChannelCapabilities;
270
+ /** stage 产物暂存(serial_number + md5),submit 按 appId 取回 */
271
+ private readonly staged;
272
+ private required;
273
+ private creds;
274
+ plan(ctx: ChannelContext): Promise<ReleasePlanEntry>;
275
+ stage(ctx: ChannelContext): Promise<StageResult>;
276
+ submit(ctx: ChannelContext): Promise<SubmitResult>;
277
+ /**
278
+ * 审核状态查询: POST /query_app_update_status(pkg_name+app_id)→ audit_status + audit_reason。
279
+ * —— 对拍 python/android-publish query_status.py: 1=审核中 2=驳回 3=通过 8=撤销。
280
+ */
281
+ status(ctx: Pick<ChannelContext, "credentials" | "target">): Promise<ReviewStatus>;
282
+ }
283
+ //#endregion
284
+ //#region src/channels/agc-harmony.d.ts
285
+ /**
286
+ * 按 bundleName 查鸿蒙应用 appId(packageTypes=7 为鸿蒙过滤值)—— v1 agc.mjs getHarmonyAppId 原样。
287
+ * appId 缺省时由渠道内部调用,也可独立复用。
288
+ */
289
+ export declare function getHarmonyAppId(opts: {
290
+ clientId: string;
291
+ token: string;
292
+ bundleName: string;
293
+ }): Promise<string>;
294
+ export declare class AgcHarmonyChannel implements Channel {
295
+ readonly id = "agc-harmony";
296
+ readonly label = "华为 AGC(鸿蒙)";
297
+ readonly capabilities: ChannelCapabilities;
298
+ readonly errorHints: {
299
+ "204144719": string;
300
+ "204144727": string;
301
+ "204144660": string;
302
+ "1003": string;
303
+ "204144702": string;
304
+ "204144677": string;
305
+ };
306
+ private authHeaders;
307
+ /** appId 缺省时按 bundleName 查(v1 全链路 step 0,可选) */
308
+ private resolveAppId;
309
+ plan(ctx: ChannelContext): Promise<ReleasePlanEntry>;
310
+ /** stage = 上传+绑定(不提审):正式 .app 走 v3 绑定;ctx.target.releaseType==='6' 走测试发布(.hap) */
311
+ stage(ctx: ChannelContext): Promise<StageResult>;
312
+ /** submit = v1 releaseHarmonyApp 完整链路:上传+绑定+文案 → 等编译轮询 → 提审(带重试) */
313
+ submit(ctx: ChannelContext): Promise<SubmitResult>;
314
+ status(): Promise<ReviewStatus>;
315
+ /** v1 releaseHarmonyApp step 1-4:.app 校验 → 上传地址 → PUT 整包 → v3 绑定(releaseType=1)→ 文案(不阻断) */
316
+ private uploadFormal;
317
+ /** v1 uploadToAgc(releaseType=6 测试发布):上传 → 绑定(不阻断)→ 文案(不阻断),不提审 */
318
+ private uploadBeta;
319
+ /** v1 更新文案段(releaseHarmonyApp step 4 / uploadToAgc 尾段):查默认语言 → 写 newFeatures,失败仅警告不阻断 */
320
+ private updateReleaseNotes;
321
+ }
322
+ //#endregion
323
+ //#region src/channels/asc.d.ts
324
+ export declare class AscChannel implements Channel {
325
+ readonly id = "asc";
326
+ readonly label = "App Store Connect";
327
+ readonly capabilities: ChannelCapabilities;
328
+ plan(ctx: ChannelContext): Promise<ReleasePlanEntry>;
329
+ /** 凭据三元组(Key ID / Issuer ID / p8 路径,缺任一抛错) */
330
+ private resolveAuth;
331
+ /**
332
+ * 上传 ipa 到 App Store Connect(TestFlight / 正式皆走此入口)。
333
+ * 来源: v1 tools/publish/lib/asc.mjs 的 uploadIpaToAsc(逻辑不变;v1 经 run 继承 stdio 输出,
334
+ * v2 输出统一走 ctx.emit,故改为捕获后透传,失败语义与 v1 run 一致)
335
+ */
336
+ stage(ctx: ChannelContext): Promise<StageResult>;
337
+ /**
338
+ * 提审 App Store —— 按 ASC 官方文档新实现,未经真实链路验证。
339
+ * 文档: appStoreVersionSubmissions / Create a Version Submission
340
+ * https://developer.apple.com/documentation/appstoreconnectapi
341
+ * 链路: 查 app(bundleId → 数字 id)→ 查最新已处理(VALID)构建 → 读取/创建 appStoreVersion
342
+ * (releaseType 默认 MANUAL,ctx.releaseTime 提供时 SCHEDULED + earlyReleaseDate)
343
+ * → 绑定构建到版本 → POST appStoreVersionSubmissions 进入审核
344
+ */
345
+ submit(ctx: ChannelContext): Promise<SubmitResult>;
346
+ status(): Promise<ReviewStatus>;
347
+ }
348
+ //#endregion
349
+ //#region src/channels/googleplay.d.ts
350
+ export declare class GooglePlayChannel implements Channel {
351
+ readonly id = "googleplay";
352
+ readonly label = "Google Play";
353
+ readonly capabilities: ChannelCapabilities;
354
+ plan(_ctx: ChannelContext): Promise<ReleasePlanEntry>;
355
+ stage(ctx: ChannelContext): Promise<StageResult>;
356
+ submit(ctx: ChannelContext): Promise<SubmitResult>;
357
+ /** 上传 + 部署到指定轨道 + commit,返回 `editId:versionCode` */
358
+ private uploadAndAssign;
359
+ status(ctx: Pick<ChannelContext, "credentials" | "target">): Promise<ReviewStatus>;
360
+ private requirePkgName;
361
+ }
362
+ //#endregion
363
+ //#region src/util.d.ts
364
+ /** 分块计算文件 SHA256(产物可达上百 MB,8MB 分块避免整读内存,同 sign.ts md5File 先例) */
365
+ export declare function sha256File(filePath: string): string;
366
+ //#endregion
367
+ //#region src/channels/shared/error-codes.d.ts
368
+ /**
369
+ * 错误码人话化:消费各渠道自带 errorHints(平台内聚——表与渠道实现同文件)。
370
+ */
371
+ export declare function humanizeError(hints: Record<string, string> | undefined, message: string): string;
372
+ //#endregion
373
+ //#region src/version.d.ts
374
+ export interface ArtifactVersion {
375
+ versionName?: string;
376
+ versionCode?: string;
377
+ /** 读取方式说明(doctor 展示溯源) */
378
+ source: string;
379
+ }
380
+ export declare function readArtifactVersion(artifactPath: string): ArtifactVersion | undefined;
381
+ //#endregion
382
+ export { BundleIds, Channel, ChannelCapabilities, ChannelContext, ChannelEvent, ChannelRegistry, CredentialsFile, CredentialsFileSchema, CredentialsProfile, CredentialsProfileSchema, FrameworkAdapter, GlobalConfig, GlobalConfigSchema, HISTORY_PATH, HistoryEntry, HistoryEvent, HistoryQuery, HookContext, PipelineInput, PipelineSummary, PipelineSummaryEntry, Platform, PluginHookName, PluginHost, ProjectConfig, ProjectConfigSchema, QypubPlugin, QypubUserConfig, ReleasePlanEntry, ReviewStatus, StageResult, StoreConfig, StoreConfigSchema, Stores, StoresSchema, SubmitResult, appendEntry, defineConfig, detectBundleIds, detectFramework, electronAdapter, findArtifacts, flutterAdapter, nativeAndroidAdapter, nativeHarmonyAdapter, nativeIosAdapter, readEntries, resolvePlugins, rnAdapter, runStage, runSubmit, tauriAdapter };