@open-wxa/wxa-runner-core 0.2.5 → 0.3.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.
@@ -38,6 +38,7 @@ interface AppInfo {
38
38
  *
39
39
  * 处理函数返回结果对象(可以是 Promise)。结果能同步得到时同步回调——
40
40
  * 基础库在一些非 Sync 结尾的 API(如带 type 参数的 getSystemInfo)上也依赖同步回调。
41
+ * 少数原生接口的结果是字符串,由基础库自己解析(如地图的 private_geolocation),原样交回。
41
42
  */
42
43
 
43
44
  type ApiResult = Record<string, any>;
@@ -47,7 +48,7 @@ interface ApiContext {
47
48
  /** 发起调用的渲染层 id,逻辑层调用时为当前页面 */
48
49
  webviewId: number;
49
50
  }
50
- type ApiHandler = (args: any, context: ApiContext) => ApiResult | void | Promise<ApiResult | void>;
51
+ type ApiHandler = (args: any, context: ApiContext) => ApiResult | string | void | Promise<ApiResult | string | void>;
51
52
 
52
53
  /**
53
54
  * setup:小程序启动前准备运行环境(@open-wxa/wxa-runner-core/setup)
@@ -135,14 +136,17 @@ interface MockRequest {
135
136
  method: string;
136
137
  /** 请求头,基础库已补上默认的 content-type */
137
138
  header: Record<string, string>;
138
- /** 基础库序列化后交给原生层的请求体,通常是 JSON 字符串 */
139
+ /** 基础库序列化后交给原生层的请求体,通常是 JSON 字符串;业务传的是 ArrayBuffer 时原样是 ArrayBuffer */
139
140
  data: unknown;
140
141
  }
141
142
  interface MockResponse {
142
143
  /** 默认 200 */
143
144
  status?: number;
144
145
  header?: Record<string, string>;
145
- /** 字符串原样返回;其他值按 JSON 返回,小程序拿到的 res.data 是解析后的对象 */
146
+ /**
147
+ * 字符串原样返回;ArrayBuffer、Uint8Array 等(包括 Node 的 Buffer)按二进制返回;其他值按 JSON 返回。
148
+ * 小程序拿到的 res.data 和真机一样按请求的 responseType:arraybuffer 时是 ArrayBuffer,否则是文本,JSON 文本再解析成对象
149
+ */
146
150
  body?: unknown;
147
151
  /**
148
152
  * 模拟网络延迟(毫秒),默认 0。拦截的响应是瞬间返回的,比真机早到,
@@ -38,6 +38,7 @@ interface AppInfo {
38
38
  *
39
39
  * 处理函数返回结果对象(可以是 Promise)。结果能同步得到时同步回调——
40
40
  * 基础库在一些非 Sync 结尾的 API(如带 type 参数的 getSystemInfo)上也依赖同步回调。
41
+ * 少数原生接口的结果是字符串,由基础库自己解析(如地图的 private_geolocation),原样交回。
41
42
  */
42
43
 
43
44
  type ApiResult = Record<string, any>;
@@ -47,7 +48,7 @@ interface ApiContext {
47
48
  /** 发起调用的渲染层 id,逻辑层调用时为当前页面 */
48
49
  webviewId: number;
49
50
  }
50
- type ApiHandler = (args: any, context: ApiContext) => ApiResult | void | Promise<ApiResult | void>;
51
+ type ApiHandler = (args: any, context: ApiContext) => ApiResult | string | void | Promise<ApiResult | string | void>;
51
52
 
52
53
  /**
53
54
  * setup:小程序启动前准备运行环境(@open-wxa/wxa-runner-core/setup)
@@ -135,14 +136,17 @@ interface MockRequest {
135
136
  method: string;
136
137
  /** 请求头,基础库已补上默认的 content-type */
137
138
  header: Record<string, string>;
138
- /** 基础库序列化后交给原生层的请求体,通常是 JSON 字符串 */
139
+ /** 基础库序列化后交给原生层的请求体,通常是 JSON 字符串;业务传的是 ArrayBuffer 时原样是 ArrayBuffer */
139
140
  data: unknown;
140
141
  }
141
142
  interface MockResponse {
142
143
  /** 默认 200 */
143
144
  status?: number;
144
145
  header?: Record<string, string>;
145
- /** 字符串原样返回;其他值按 JSON 返回,小程序拿到的 res.data 是解析后的对象 */
146
+ /**
147
+ * 字符串原样返回;ArrayBuffer、Uint8Array 等(包括 Node 的 Buffer)按二进制返回;其他值按 JSON 返回。
148
+ * 小程序拿到的 res.data 和真机一样按请求的 responseType:arraybuffer 时是 ArrayBuffer,否则是文本,JSON 文本再解析成对象
149
+ */
146
150
  body?: unknown;
147
151
  /**
148
152
  * 模拟网络延迟(毫秒),默认 0。拦截的响应是瞬间返回的,比真机早到,
package/dist/setup.d.mts CHANGED
@@ -1 +1 @@
1
- export { K as KnownMocks, M as MockConfig, d as MockRequest, e as MockResponse, f as MockValue, N as NetworkConfig, R as RouteHandler, S as SetupApi, g as SetupConfig, h as SetupContext, i as SetupDefinition, j as SetupEnv, U as UserInfo, k as defineSetup } from './setup-COzZ6vzS.mjs';
1
+ export { K as KnownMocks, M as MockConfig, d as MockRequest, e as MockResponse, f as MockValue, N as NetworkConfig, R as RouteHandler, S as SetupApi, g as SetupConfig, h as SetupContext, i as SetupDefinition, j as SetupEnv, U as UserInfo, k as defineSetup } from './setup-Cv340Lvj.mjs';
package/dist/setup.d.ts CHANGED
@@ -1 +1 @@
1
- export { K as KnownMocks, M as MockConfig, d as MockRequest, e as MockResponse, f as MockValue, N as NetworkConfig, R as RouteHandler, S as SetupApi, g as SetupConfig, h as SetupContext, i as SetupDefinition, j as SetupEnv, U as UserInfo, k as defineSetup } from './setup-COzZ6vzS.js';
1
+ export { K as KnownMocks, M as MockConfig, d as MockRequest, e as MockResponse, f as MockValue, N as NetworkConfig, R as RouteHandler, S as SetupApi, g as SetupConfig, h as SetupContext, i as SetupDefinition, j as SetupEnv, U as UserInfo, k as defineSetup } from './setup-Cv340Lvj.js';
package/dist/setup.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/setup.ts"],"sourcesContent":["/**\n * setup:小程序启动前准备运行环境(@open-wxa/wxa-runner-core/setup)\n *\n * 浏览器里拿不到真实的登录 code、用户信息、定位等,setup 在 App.onLaunch 之前\n * 预置存储、覆盖原生 API、拦截请求,让小程序直接进入「已登录」之类的状态。\n *\n * // wxa.setup.ts(放在项目根目录自动生效,或用 --setup 指定)\n * import { defineSetup } from '@open-wxa/wxa-runner-core/setup';\n *\n * export default defineSetup(({ env }) => ({\n * storage: { token: env.WXA_TOKEN },\n * mock: { login: { code: 'dev_code' } }\n * }));\n *\n * 执行顺序固定为 storage → mock → network → run,每次打开或刷新页面都会重新执行。\n */\n\nimport type { ApiResult } from './runtime/host/api/registry';\n\n/** 启动命令所在环境中以 WXA_ 开头的环境变量 */\nexport type SetupEnv = Record<string, string | undefined>;\n\nexport interface SetupContext {\n env: SetupEnv;\n}\n\n/**\n * 原生 API 的替身:对象直接作为调用结果;函数按调用参数返回结果,抛错即调用失败(errMsg 为 `<api>:fail <message>`)\n */\nexport type MockValue<T extends ApiResult = ApiResult> = T | ((args: any) => T | void | Promise<T | void>);\n\nexport interface UserInfo {\n nickName: string;\n avatarUrl: string;\n gender: 0 | 1 | 2;\n country: string;\n province: string;\n city: string;\n language: string;\n}\n\n/** 常用 API 的返回值提示;其他 API 也可以按名字覆盖 */\nexport interface KnownMocks {\n /** 业务后端通常要把 code 换成 token,可配合测试环境后端约定的固定 code */\n login: MockValue<{ code: string }>;\n checkSession: MockValue<{}>;\n getUserProfile: MockValue<{ userInfo: Partial<UserInfo>; encryptedData?: string; iv?: string }>;\n getUserInfo: MockValue<{ userInfo: Partial<UserInfo>; encryptedData?: string; iv?: string }>;\n getSetting: MockValue<{ authSetting: Record<string, boolean> }>;\n authorize: MockValue<{}>;\n getLocation: MockValue<{ latitude: number; longitude: number; speed?: number; accuracy?: number }>;\n chooseLocation: MockValue<{ name: string; address: string; latitude: number; longitude: number }>;\n scanCode: MockValue<{ result: string; scanType?: string; charSet?: string; path?: string }>;\n requestPayment: MockValue<{}>;\n requestSubscribeMessage: MockValue<Record<string, string>>;\n}\n\nexport type MockConfig = Partial<KnownMocks> & Record<string, MockValue>;\n\n/** 小程序发出的 wx.request */\nexport interface MockRequest {\n /** 完整地址;GET 请求的 data 已由基础库拼进查询参数 */\n url: string;\n /** 大写,如 POST */\n method: string;\n /** 请求头,基础库已补上默认的 content-type */\n header: Record<string, string>;\n /** 基础库序列化后交给原生层的请求体,通常是 JSON 字符串 */\n data: unknown;\n}\n\nexport interface MockResponse {\n /** 默认 200 */\n status?: number;\n header?: Record<string, string>;\n /** 字符串原样返回;其他值按 JSON 返回,小程序拿到的 res.data 是解析后的对象 */\n body?: unknown;\n /**\n * 模拟网络延迟(毫秒),默认 0。拦截的响应是瞬间返回的,比真机早到,\n * 可能暴露业务代码里依赖网络耗时的时序问题(如登录回调里假设首页已创建)\n */\n delay?: number;\n}\n\nexport type RouteHandler = MockResponse | ((request: MockRequest) => MockResponse | void | Promise<MockResponse | void>);\n\nexport interface NetworkConfig {\n /**\n * 拦截 wx.request:key 写成 '[请求方法 ]地址',如 'POST https://api.example.com/login'。\n * 地址里 * 匹配一段路径,** 匹配任意内容(可以不写域名),查询参数不参与匹配;没匹配上的请求照常发出\n */\n routes?: Record<string, RouteHandler>;\n}\n\nexport interface SetupConfig {\n /** 预置到 wx.setStorage 的数据,值保持原类型(对象、数字、Date 等),覆盖同名旧值 */\n storage?: Record<string, unknown>;\n /** 按 wx API 名覆盖原生实现,如 login、getLocation */\n mock?: MockConfig;\n network?: NetworkConfig;\n /** 声明式配置之后执行,适合异步或动态逻辑(如现场向测试后端换一个新 token) */\n run?(wxa: SetupApi): void | Promise<void>;\n}\n\nexport type SetupDefinition = SetupConfig | ((context: SetupContext) => SetupConfig | Promise<SetupConfig>);\n\n/** run 里可用的能力,与声明式配置一一对应 */\nexport interface SetupApi {\n env: SetupEnv;\n storage: {\n get(key: string): unknown;\n set(key: string, value: unknown): void;\n remove(key: string): void;\n /** 清空小程序的业务存储 */\n clear(): void;\n };\n mock<K extends string>(api: K, impl: K extends keyof KnownMocks ? NonNullable<KnownMocks[K]> : MockValue): void;\n /** 与 network.routes 相同,后添加的规则优先 */\n route(pattern: string, handler: RouteHandler): void;\n /** 经开发服务器代理发请求,没有跨域限制 */\n fetch(url: string, init?: { method?: string; header?: Record<string, string>; body?: string }): Promise<Response>;\n}\n\n/** 只用于获得类型提示,原样返回传入的配置 */\nexport function defineSetup<T extends SetupDefinition>(setup: T): T {\n return setup;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AA4HO,SAAS,YAAuC,OAAa;AAClE,SAAO;AACT;","names":[]}
1
+ {"version":3,"sources":["../src/setup.ts"],"sourcesContent":["/**\n * setup:小程序启动前准备运行环境(@open-wxa/wxa-runner-core/setup)\n *\n * 浏览器里拿不到真实的登录 code、用户信息、定位等,setup 在 App.onLaunch 之前\n * 预置存储、覆盖原生 API、拦截请求,让小程序直接进入「已登录」之类的状态。\n *\n * // wxa.setup.ts(放在项目根目录自动生效,或用 --setup 指定)\n * import { defineSetup } from '@open-wxa/wxa-runner-core/setup';\n *\n * export default defineSetup(({ env }) => ({\n * storage: { token: env.WXA_TOKEN },\n * mock: { login: { code: 'dev_code' } }\n * }));\n *\n * 执行顺序固定为 storage → mock → network → run,每次打开或刷新页面都会重新执行。\n */\n\nimport type { ApiResult } from './runtime/host/api/registry';\n\n/** 启动命令所在环境中以 WXA_ 开头的环境变量 */\nexport type SetupEnv = Record<string, string | undefined>;\n\nexport interface SetupContext {\n env: SetupEnv;\n}\n\n/**\n * 原生 API 的替身:对象直接作为调用结果;函数按调用参数返回结果,抛错即调用失败(errMsg 为 `<api>:fail <message>`)\n */\nexport type MockValue<T extends ApiResult = ApiResult> = T | ((args: any) => T | void | Promise<T | void>);\n\nexport interface UserInfo {\n nickName: string;\n avatarUrl: string;\n gender: 0 | 1 | 2;\n country: string;\n province: string;\n city: string;\n language: string;\n}\n\n/** 常用 API 的返回值提示;其他 API 也可以按名字覆盖 */\nexport interface KnownMocks {\n /** 业务后端通常要把 code 换成 token,可配合测试环境后端约定的固定 code */\n login: MockValue<{ code: string }>;\n checkSession: MockValue<{}>;\n getUserProfile: MockValue<{ userInfo: Partial<UserInfo>; encryptedData?: string; iv?: string }>;\n getUserInfo: MockValue<{ userInfo: Partial<UserInfo>; encryptedData?: string; iv?: string }>;\n getSetting: MockValue<{ authSetting: Record<string, boolean> }>;\n authorize: MockValue<{}>;\n getLocation: MockValue<{ latitude: number; longitude: number; speed?: number; accuracy?: number }>;\n chooseLocation: MockValue<{ name: string; address: string; latitude: number; longitude: number }>;\n scanCode: MockValue<{ result: string; scanType?: string; charSet?: string; path?: string }>;\n requestPayment: MockValue<{}>;\n requestSubscribeMessage: MockValue<Record<string, string>>;\n}\n\nexport type MockConfig = Partial<KnownMocks> & Record<string, MockValue>;\n\n/** 小程序发出的 wx.request */\nexport interface MockRequest {\n /** 完整地址;GET 请求的 data 已由基础库拼进查询参数 */\n url: string;\n /** 大写,如 POST */\n method: string;\n /** 请求头,基础库已补上默认的 content-type */\n header: Record<string, string>;\n /** 基础库序列化后交给原生层的请求体,通常是 JSON 字符串;业务传的是 ArrayBuffer 时原样是 ArrayBuffer */\n data: unknown;\n}\n\nexport interface MockResponse {\n /** 默认 200 */\n status?: number;\n header?: Record<string, string>;\n /**\n * 字符串原样返回;ArrayBuffer、Uint8Array 等(包括 Node 的 Buffer)按二进制返回;其他值按 JSON 返回。\n * 小程序拿到的 res.data 和真机一样按请求的 responseType:arraybuffer 时是 ArrayBuffer,否则是文本,JSON 文本再解析成对象\n */\n body?: unknown;\n /**\n * 模拟网络延迟(毫秒),默认 0。拦截的响应是瞬间返回的,比真机早到,\n * 可能暴露业务代码里依赖网络耗时的时序问题(如登录回调里假设首页已创建)\n */\n delay?: number;\n}\n\nexport type RouteHandler = MockResponse | ((request: MockRequest) => MockResponse | void | Promise<MockResponse | void>);\n\nexport interface NetworkConfig {\n /**\n * 拦截 wx.request:key 写成 '[请求方法 ]地址',如 'POST https://api.example.com/login'。\n * 地址里 * 匹配一段路径,** 匹配任意内容(可以不写域名),查询参数不参与匹配;没匹配上的请求照常发出\n */\n routes?: Record<string, RouteHandler>;\n}\n\nexport interface SetupConfig {\n /** 预置到 wx.setStorage 的数据,值保持原类型(对象、数字、Date 等),覆盖同名旧值 */\n storage?: Record<string, unknown>;\n /** 按 wx API 名覆盖原生实现,如 login、getLocation */\n mock?: MockConfig;\n network?: NetworkConfig;\n /** 声明式配置之后执行,适合异步或动态逻辑(如现场向测试后端换一个新 token) */\n run?(wxa: SetupApi): void | Promise<void>;\n}\n\nexport type SetupDefinition = SetupConfig | ((context: SetupContext) => SetupConfig | Promise<SetupConfig>);\n\n/** run 里可用的能力,与声明式配置一一对应 */\nexport interface SetupApi {\n env: SetupEnv;\n storage: {\n get(key: string): unknown;\n set(key: string, value: unknown): void;\n remove(key: string): void;\n /** 清空小程序的业务存储 */\n clear(): void;\n };\n mock<K extends string>(api: K, impl: K extends keyof KnownMocks ? NonNullable<KnownMocks[K]> : MockValue): void;\n /** 与 network.routes 相同,后添加的规则优先 */\n route(pattern: string, handler: RouteHandler): void;\n /** 经开发服务器代理发请求,没有跨域限制 */\n fetch(url: string, init?: { method?: string; header?: Record<string, string>; body?: string }): Promise<Response>;\n}\n\n/** 只用于获得类型提示,原样返回传入的配置 */\nexport function defineSetup<T extends SetupDefinition>(setup: T): T {\n return setup;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AA+HO,SAAS,YAAuC,OAAa;AAClE,SAAO;AACT;","names":[]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/setup.ts"],"sourcesContent":["/**\n * setup:小程序启动前准备运行环境(@open-wxa/wxa-runner-core/setup)\n *\n * 浏览器里拿不到真实的登录 code、用户信息、定位等,setup 在 App.onLaunch 之前\n * 预置存储、覆盖原生 API、拦截请求,让小程序直接进入「已登录」之类的状态。\n *\n * // wxa.setup.ts(放在项目根目录自动生效,或用 --setup 指定)\n * import { defineSetup } from '@open-wxa/wxa-runner-core/setup';\n *\n * export default defineSetup(({ env }) => ({\n * storage: { token: env.WXA_TOKEN },\n * mock: { login: { code: 'dev_code' } }\n * }));\n *\n * 执行顺序固定为 storage → mock → network → run,每次打开或刷新页面都会重新执行。\n */\n\nimport type { ApiResult } from './runtime/host/api/registry';\n\n/** 启动命令所在环境中以 WXA_ 开头的环境变量 */\nexport type SetupEnv = Record<string, string | undefined>;\n\nexport interface SetupContext {\n env: SetupEnv;\n}\n\n/**\n * 原生 API 的替身:对象直接作为调用结果;函数按调用参数返回结果,抛错即调用失败(errMsg 为 `<api>:fail <message>`)\n */\nexport type MockValue<T extends ApiResult = ApiResult> = T | ((args: any) => T | void | Promise<T | void>);\n\nexport interface UserInfo {\n nickName: string;\n avatarUrl: string;\n gender: 0 | 1 | 2;\n country: string;\n province: string;\n city: string;\n language: string;\n}\n\n/** 常用 API 的返回值提示;其他 API 也可以按名字覆盖 */\nexport interface KnownMocks {\n /** 业务后端通常要把 code 换成 token,可配合测试环境后端约定的固定 code */\n login: MockValue<{ code: string }>;\n checkSession: MockValue<{}>;\n getUserProfile: MockValue<{ userInfo: Partial<UserInfo>; encryptedData?: string; iv?: string }>;\n getUserInfo: MockValue<{ userInfo: Partial<UserInfo>; encryptedData?: string; iv?: string }>;\n getSetting: MockValue<{ authSetting: Record<string, boolean> }>;\n authorize: MockValue<{}>;\n getLocation: MockValue<{ latitude: number; longitude: number; speed?: number; accuracy?: number }>;\n chooseLocation: MockValue<{ name: string; address: string; latitude: number; longitude: number }>;\n scanCode: MockValue<{ result: string; scanType?: string; charSet?: string; path?: string }>;\n requestPayment: MockValue<{}>;\n requestSubscribeMessage: MockValue<Record<string, string>>;\n}\n\nexport type MockConfig = Partial<KnownMocks> & Record<string, MockValue>;\n\n/** 小程序发出的 wx.request */\nexport interface MockRequest {\n /** 完整地址;GET 请求的 data 已由基础库拼进查询参数 */\n url: string;\n /** 大写,如 POST */\n method: string;\n /** 请求头,基础库已补上默认的 content-type */\n header: Record<string, string>;\n /** 基础库序列化后交给原生层的请求体,通常是 JSON 字符串 */\n data: unknown;\n}\n\nexport interface MockResponse {\n /** 默认 200 */\n status?: number;\n header?: Record<string, string>;\n /** 字符串原样返回;其他值按 JSON 返回,小程序拿到的 res.data 是解析后的对象 */\n body?: unknown;\n /**\n * 模拟网络延迟(毫秒),默认 0。拦截的响应是瞬间返回的,比真机早到,\n * 可能暴露业务代码里依赖网络耗时的时序问题(如登录回调里假设首页已创建)\n */\n delay?: number;\n}\n\nexport type RouteHandler = MockResponse | ((request: MockRequest) => MockResponse | void | Promise<MockResponse | void>);\n\nexport interface NetworkConfig {\n /**\n * 拦截 wx.request:key 写成 '[请求方法 ]地址',如 'POST https://api.example.com/login'。\n * 地址里 * 匹配一段路径,** 匹配任意内容(可以不写域名),查询参数不参与匹配;没匹配上的请求照常发出\n */\n routes?: Record<string, RouteHandler>;\n}\n\nexport interface SetupConfig {\n /** 预置到 wx.setStorage 的数据,值保持原类型(对象、数字、Date 等),覆盖同名旧值 */\n storage?: Record<string, unknown>;\n /** 按 wx API 名覆盖原生实现,如 login、getLocation */\n mock?: MockConfig;\n network?: NetworkConfig;\n /** 声明式配置之后执行,适合异步或动态逻辑(如现场向测试后端换一个新 token) */\n run?(wxa: SetupApi): void | Promise<void>;\n}\n\nexport type SetupDefinition = SetupConfig | ((context: SetupContext) => SetupConfig | Promise<SetupConfig>);\n\n/** run 里可用的能力,与声明式配置一一对应 */\nexport interface SetupApi {\n env: SetupEnv;\n storage: {\n get(key: string): unknown;\n set(key: string, value: unknown): void;\n remove(key: string): void;\n /** 清空小程序的业务存储 */\n clear(): void;\n };\n mock<K extends string>(api: K, impl: K extends keyof KnownMocks ? NonNullable<KnownMocks[K]> : MockValue): void;\n /** 与 network.routes 相同,后添加的规则优先 */\n route(pattern: string, handler: RouteHandler): void;\n /** 经开发服务器代理发请求,没有跨域限制 */\n fetch(url: string, init?: { method?: string; header?: Record<string, string>; body?: string }): Promise<Response>;\n}\n\n/** 只用于获得类型提示,原样返回传入的配置 */\nexport function defineSetup<T extends SetupDefinition>(setup: T): T {\n return setup;\n}\n"],"mappings":";;;AA4HO,SAAS,YAAuC,OAAa;AAClE,SAAO;AACT;","names":[]}
1
+ {"version":3,"sources":["../src/setup.ts"],"sourcesContent":["/**\n * setup:小程序启动前准备运行环境(@open-wxa/wxa-runner-core/setup)\n *\n * 浏览器里拿不到真实的登录 code、用户信息、定位等,setup 在 App.onLaunch 之前\n * 预置存储、覆盖原生 API、拦截请求,让小程序直接进入「已登录」之类的状态。\n *\n * // wxa.setup.ts(放在项目根目录自动生效,或用 --setup 指定)\n * import { defineSetup } from '@open-wxa/wxa-runner-core/setup';\n *\n * export default defineSetup(({ env }) => ({\n * storage: { token: env.WXA_TOKEN },\n * mock: { login: { code: 'dev_code' } }\n * }));\n *\n * 执行顺序固定为 storage → mock → network → run,每次打开或刷新页面都会重新执行。\n */\n\nimport type { ApiResult } from './runtime/host/api/registry';\n\n/** 启动命令所在环境中以 WXA_ 开头的环境变量 */\nexport type SetupEnv = Record<string, string | undefined>;\n\nexport interface SetupContext {\n env: SetupEnv;\n}\n\n/**\n * 原生 API 的替身:对象直接作为调用结果;函数按调用参数返回结果,抛错即调用失败(errMsg 为 `<api>:fail <message>`)\n */\nexport type MockValue<T extends ApiResult = ApiResult> = T | ((args: any) => T | void | Promise<T | void>);\n\nexport interface UserInfo {\n nickName: string;\n avatarUrl: string;\n gender: 0 | 1 | 2;\n country: string;\n province: string;\n city: string;\n language: string;\n}\n\n/** 常用 API 的返回值提示;其他 API 也可以按名字覆盖 */\nexport interface KnownMocks {\n /** 业务后端通常要把 code 换成 token,可配合测试环境后端约定的固定 code */\n login: MockValue<{ code: string }>;\n checkSession: MockValue<{}>;\n getUserProfile: MockValue<{ userInfo: Partial<UserInfo>; encryptedData?: string; iv?: string }>;\n getUserInfo: MockValue<{ userInfo: Partial<UserInfo>; encryptedData?: string; iv?: string }>;\n getSetting: MockValue<{ authSetting: Record<string, boolean> }>;\n authorize: MockValue<{}>;\n getLocation: MockValue<{ latitude: number; longitude: number; speed?: number; accuracy?: number }>;\n chooseLocation: MockValue<{ name: string; address: string; latitude: number; longitude: number }>;\n scanCode: MockValue<{ result: string; scanType?: string; charSet?: string; path?: string }>;\n requestPayment: MockValue<{}>;\n requestSubscribeMessage: MockValue<Record<string, string>>;\n}\n\nexport type MockConfig = Partial<KnownMocks> & Record<string, MockValue>;\n\n/** 小程序发出的 wx.request */\nexport interface MockRequest {\n /** 完整地址;GET 请求的 data 已由基础库拼进查询参数 */\n url: string;\n /** 大写,如 POST */\n method: string;\n /** 请求头,基础库已补上默认的 content-type */\n header: Record<string, string>;\n /** 基础库序列化后交给原生层的请求体,通常是 JSON 字符串;业务传的是 ArrayBuffer 时原样是 ArrayBuffer */\n data: unknown;\n}\n\nexport interface MockResponse {\n /** 默认 200 */\n status?: number;\n header?: Record<string, string>;\n /**\n * 字符串原样返回;ArrayBuffer、Uint8Array 等(包括 Node 的 Buffer)按二进制返回;其他值按 JSON 返回。\n * 小程序拿到的 res.data 和真机一样按请求的 responseType:arraybuffer 时是 ArrayBuffer,否则是文本,JSON 文本再解析成对象\n */\n body?: unknown;\n /**\n * 模拟网络延迟(毫秒),默认 0。拦截的响应是瞬间返回的,比真机早到,\n * 可能暴露业务代码里依赖网络耗时的时序问题(如登录回调里假设首页已创建)\n */\n delay?: number;\n}\n\nexport type RouteHandler = MockResponse | ((request: MockRequest) => MockResponse | void | Promise<MockResponse | void>);\n\nexport interface NetworkConfig {\n /**\n * 拦截 wx.request:key 写成 '[请求方法 ]地址',如 'POST https://api.example.com/login'。\n * 地址里 * 匹配一段路径,** 匹配任意内容(可以不写域名),查询参数不参与匹配;没匹配上的请求照常发出\n */\n routes?: Record<string, RouteHandler>;\n}\n\nexport interface SetupConfig {\n /** 预置到 wx.setStorage 的数据,值保持原类型(对象、数字、Date 等),覆盖同名旧值 */\n storage?: Record<string, unknown>;\n /** 按 wx API 名覆盖原生实现,如 login、getLocation */\n mock?: MockConfig;\n network?: NetworkConfig;\n /** 声明式配置之后执行,适合异步或动态逻辑(如现场向测试后端换一个新 token) */\n run?(wxa: SetupApi): void | Promise<void>;\n}\n\nexport type SetupDefinition = SetupConfig | ((context: SetupContext) => SetupConfig | Promise<SetupConfig>);\n\n/** run 里可用的能力,与声明式配置一一对应 */\nexport interface SetupApi {\n env: SetupEnv;\n storage: {\n get(key: string): unknown;\n set(key: string, value: unknown): void;\n remove(key: string): void;\n /** 清空小程序的业务存储 */\n clear(): void;\n };\n mock<K extends string>(api: K, impl: K extends keyof KnownMocks ? NonNullable<KnownMocks[K]> : MockValue): void;\n /** 与 network.routes 相同,后添加的规则优先 */\n route(pattern: string, handler: RouteHandler): void;\n /** 经开发服务器代理发请求,没有跨域限制 */\n fetch(url: string, init?: { method?: string; header?: Record<string, string>; body?: string }): Promise<Response>;\n}\n\n/** 只用于获得类型提示,原样返回传入的配置 */\nexport function defineSetup<T extends SetupDefinition>(setup: T): T {\n return setup;\n}\n"],"mappings":";;;AA+HO,SAAS,YAAuC,OAAa;AAClE,SAAO;AACT;","names":[]}
@@ -1,5 +1,5 @@
1
- import { W as WxaTestApi } from './testApi-CbBoHXdN.mjs';
2
- import './setup-COzZ6vzS.mjs';
1
+ import { W as WxaTestApi } from './testApi-DO2FyR78.mjs';
2
+ import './setup-Cv340Lvj.mjs';
3
3
 
4
4
  /**
5
5
  * window.__wxa_test_api__ 的全局类型声明,供测试代码按需引用:
@@ -1,5 +1,5 @@
1
- import { W as WxaTestApi } from './testApi-DRZ-hXpC.js';
2
- import './setup-COzZ6vzS.js';
1
+ import { W as WxaTestApi } from './testApi-nKsjjEhz.js';
2
+ import './setup-Cv340Lvj.js';
3
3
 
4
4
  /**
5
5
  * window.__wxa_test_api__ 的全局类型声明,供测试代码按需引用:
@@ -1,4 +1,4 @@
1
- import { d as MockRequest, F as FrameKind, a as ApiHandler, b as ApiResult, R as RouteHandler } from './setup-COzZ6vzS.mjs';
1
+ import { d as MockRequest, F as FrameKind, a as ApiHandler, b as ApiResult, R as RouteHandler } from './setup-Cv340Lvj.mjs';
2
2
 
3
3
  /**
4
4
  * 网络 API:wx.request / downloadFile / uploadFile / connectSocket
@@ -1,4 +1,4 @@
1
- import { d as MockRequest, F as FrameKind, a as ApiHandler, b as ApiResult, R as RouteHandler } from './setup-COzZ6vzS.js';
1
+ import { d as MockRequest, F as FrameKind, a as ApiHandler, b as ApiResult, R as RouteHandler } from './setup-Cv340Lvj.js';
2
2
 
3
3
  /**
4
4
  * 网络 API:wx.request / downloadFile / uploadFile / connectSocket
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@open-wxa/wxa-runner-core",
3
- "version": "0.2.5",
3
+ "version": "0.3.1",
4
4
  "description": "Dev server and browser runtime that run WeChat mini-programs on the official base library",
5
5
  "license": "MIT",
6
6
  "author": "open-wxa",
@@ -49,8 +49,8 @@
49
49
  "esbuild": "^0.27.0",
50
50
  "express": "^4.18.2",
51
51
  "ws": "^8.14.2",
52
- "@open-wxa/wxa-runner-compiler": "0.2.5",
53
- "@open-wxa/wxa-runner-extractor": "0.2.5"
52
+ "@open-wxa/wxa-runner-extractor": "0.3.1",
53
+ "@open-wxa/wxa-runner-compiler": "0.3.1"
54
54
  },
55
55
  "devDependencies": {
56
56
  "@types/express": "^4.17.21",