@open-wxa/wxa-runner-core 0.10.1 → 0.11.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.mts +46 -6
- package/dist/index.d.ts +46 -6
- package/dist/index.js +487 -297
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +476 -292
- package/dist/index.mjs.map +1 -1
- package/dist/runtime/host.js +5 -6
- package/dist/runtime/host.js.map +1 -1
- package/dist/runtime/sw.js +24 -20
- package/dist/runtime/sw.js.map +1 -1
- package/dist/{setup-Bac8XdhR.d.mts → setup-DhDDVlit.d.mts} +4 -0
- package/dist/{setup-Bac8XdhR.d.ts → setup-DhDDVlit.d.ts} +4 -0
- package/dist/setup.d.mts +1 -1
- package/dist/setup.d.ts +1 -1
- package/dist/test-api.d.mts +2 -2
- package/dist/test-api.d.ts +2 -2
- package/dist/{testApi-DHuEW5Cl.d.mts → testApi-BbK_1vhj.d.mts} +1 -1
- package/dist/{testApi-BOZSXSnV.d.ts → testApi-DbTnccYV.d.ts} +1 -1
- package/dist/web.d.mts +268 -0
- package/dist/web.d.ts +268 -0
- package/dist/web.js +700 -0
- package/dist/web.js.map +1 -0
- package/dist/web.mjs +677 -0
- package/dist/web.mjs.map +1 -0
- package/package.json +11 -3
package/dist/web.d.ts
ADDED
|
@@ -0,0 +1,268 @@
|
|
|
1
|
+
/** 把浏览器里的报错转发到开发服务器的终端:errors 只转发报错,all 再加上 console.warn / console.error,false 不转发 */
|
|
2
|
+
type ForwardConsole = 'errors' | 'all' | false;
|
|
3
|
+
interface DeviceProfile {
|
|
4
|
+
model: string;
|
|
5
|
+
screenWidth: number;
|
|
6
|
+
screenHeight: number;
|
|
7
|
+
pixelRatio: number;
|
|
8
|
+
statusBarHeight: number;
|
|
9
|
+
/** 底部安全区高度(Home Indicator),无刘海机型为 0 */
|
|
10
|
+
safeAreaBottom: number;
|
|
11
|
+
system: string;
|
|
12
|
+
platform: string;
|
|
13
|
+
}
|
|
14
|
+
/** /__wxa__/app-info.json */
|
|
15
|
+
interface AppInfo {
|
|
16
|
+
version: number;
|
|
17
|
+
appid: string;
|
|
18
|
+
baseLibVersion: string;
|
|
19
|
+
wxConfig: Record<string, any>;
|
|
20
|
+
pages: string[];
|
|
21
|
+
device: DeviceProfile;
|
|
22
|
+
/** 开启了 --devtools-login */
|
|
23
|
+
devtoolsLogin?: boolean;
|
|
24
|
+
/** false 表示没有开发服务器,不建立热更新和报错转发连接 */
|
|
25
|
+
liveReload?: boolean;
|
|
26
|
+
/** 使用查看器已经注册的 Service Worker,宿主不能用 sw.js 替换它 */
|
|
27
|
+
externalServiceWorker?: boolean;
|
|
28
|
+
buildError?: string;
|
|
29
|
+
/** 配置了 setup 文件时存在;error 是 setup 的编译错误 */
|
|
30
|
+
setup?: {
|
|
31
|
+
env: Record<string, string>;
|
|
32
|
+
error?: string;
|
|
33
|
+
};
|
|
34
|
+
/** 没有时不转发 */
|
|
35
|
+
forwardConsole?: ForwardConsole;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* 把小程序项目构建成官方基础库能直接加载的形式
|
|
40
|
+
*
|
|
41
|
+
* 逻辑层(appservice):
|
|
42
|
+
* 1. 裁剪版 $gwx(wcc -xc),基础库用它了解组件的节点结构
|
|
43
|
+
* 2. 每个 JS 文件单独一个 define("x.js", fn) 脚本(便于在 DevTools 里按原文件调试)
|
|
44
|
+
* 3. bootstrap:注册 __wxAppCode__ 的 json/wxml(serviceTemplates,热更新时单独下发),
|
|
45
|
+
* require("app.js"),再依次 require 组件和页面
|
|
46
|
+
*
|
|
47
|
+
* 渲染层(page-frame):
|
|
48
|
+
* 1. 完整版 $gwx(wcc -cc)与每个页面/组件的 __wxAppCode__ json / wxml(pageTemplates)
|
|
49
|
+
* 2. wcsc 的公共样式运行时 + app.wxss,与每个页面/组件的 __wxAppCode__ wxss(pageStyles)。
|
|
50
|
+
* 开启 less / sass 编译插件时,先把 .less / .scss / .sass 编译成 .wxss(见 StyleMirror)
|
|
51
|
+
* 两部分在热更新时分别下发
|
|
52
|
+
* 样式和模板里的 env(safe-area-inset-*) 改写成 CSS 变量,见 rewriteSafeAreaInsets
|
|
53
|
+
*
|
|
54
|
+
* Worker:workers 目录下的 JS 不进逻辑层,同样包装成 define 脚本,由 Worker 入口(server/html.ts 的 workerScript)加载
|
|
55
|
+
*/
|
|
56
|
+
|
|
57
|
+
interface BuildResult {
|
|
58
|
+
version: number;
|
|
59
|
+
wxConfig: Record<string, any>;
|
|
60
|
+
/** 所有 JS 模块 id(如 "pages/index/index.js"),逻辑层按此顺序加载 define 脚本 */
|
|
61
|
+
modules: string[];
|
|
62
|
+
/** workers 目录下的 JS 模块 id,Worker 按此顺序加载 define 脚本 */
|
|
63
|
+
workerModules: string[];
|
|
64
|
+
/** 逻辑层的 $gwx 与 __wxAppCode__ json/wxml,不含 require */
|
|
65
|
+
serviceTemplates: string;
|
|
66
|
+
serviceBootstrap: string;
|
|
67
|
+
pageFrame: string;
|
|
68
|
+
/** 渲染层的 $gwx 与 __wxAppCode__ json/wxml,不含样式(热更新时单独下发) */
|
|
69
|
+
pageTemplates: string;
|
|
70
|
+
/** 渲染层的样式:公共样式立即注入,页面和组件的样式注册到 __wxAppCode__(热更新时单独下发) */
|
|
71
|
+
pageStyles: string;
|
|
72
|
+
pages: string[];
|
|
73
|
+
components: string[];
|
|
74
|
+
durationMs: number;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* 开发服务器
|
|
79
|
+
*
|
|
80
|
+
* / 宿主页面
|
|
81
|
+
* /__wxa__/app-info.json 构建信息(__wxConfig、页面列表、设备参数、setup)
|
|
82
|
+
* /__wxa__/setup.js 编译后的 setup 文件
|
|
83
|
+
* /__wxa__/appservice.html 逻辑层
|
|
84
|
+
* /__wxa__/webview/<page>.html 渲染层(路径与页面一致,wxml 里的相对资源路径因此能正确解析)
|
|
85
|
+
* /__wxa__/module/<file>.js 单个业务 JS 模块(含 workers 目录下的)
|
|
86
|
+
* /__wxa__/worker.js?id= Worker 的入口
|
|
87
|
+
* /__wxa__/service-templates.js、page-templates.js 两层的模板(热更新时重新下发)
|
|
88
|
+
* /__wxa__/page-styles.js 渲染层的样式(热更新时重新下发)
|
|
89
|
+
* /__baselib__/* 官方基础库
|
|
90
|
+
* /__wxa__/proxy/<协议>/<域名><路径> 网络代理,如 /__wxa__/proxy/https/api.example.com/a?b=1
|
|
91
|
+
* /__wxa__/mock/<协议>/<域名><路径> 被拦截的请求在 Network 面板里的地址,由 Service Worker(runtime/sw.js)返回响应
|
|
92
|
+
* /__wxa__/fs/<会话> 文件系统接口(FileSystemManager),每个浏览器会话一份文件,会话标识见 runtime/fileSession.ts
|
|
93
|
+
* /__wxa__/tmp/<会话> 临时文件:POST ?type=png 保存,返回可直接访问的地址(GET 支持分段请求);对该地址 HEAD 查大小、DELETE 删除
|
|
94
|
+
* /__wxa__/usr/<会话>/<路径> 用户目录(USER_DATA_PATH)下的文件,image 等组件和 uploadFile 按地址读取
|
|
95
|
+
* /__wxa__/region/<kind> 地区选择器用的行政区划数据(districts / streets),取自本机开发者工具
|
|
96
|
+
* /__wxa__/api/* --devtools-login:wx.login 的 code、手机号,服务市场、插件的请求转发,只允许本机访问
|
|
97
|
+
* /__wxa__/ws 文件变化通知:热更新(hot)或整页刷新(reload);开启 forwardConsole 时浏览器从这里发来报错
|
|
98
|
+
* middlewares / 扩展挂载的路径 排在 runner 自己的路由之前
|
|
99
|
+
* 其余路径 小程序目录下的静态资源
|
|
100
|
+
*/
|
|
101
|
+
|
|
102
|
+
/** 注入每个渲染层页面的脚本,src 与 content 二选一 */
|
|
103
|
+
type WebviewScript = ({
|
|
104
|
+
src: string;
|
|
105
|
+
content?: never;
|
|
106
|
+
} | {
|
|
107
|
+
content: string;
|
|
108
|
+
src?: never;
|
|
109
|
+
}) & {
|
|
110
|
+
/**
|
|
111
|
+
* 'head':在基础库(WAWebview.js)之前执行,用于要赶在基础库之前注册事件监听的脚本,执行时还没有 document.body;
|
|
112
|
+
* 'body'(默认):在 <body> 开头、页面开始渲染之前执行。不能放在 <body> 末尾:基础库渲染时会换掉 body,
|
|
113
|
+
* 之后才解析到的脚本落在脱离文档的旧 body 里,不会执行
|
|
114
|
+
*/
|
|
115
|
+
position?: 'head' | 'body';
|
|
116
|
+
};
|
|
117
|
+
|
|
118
|
+
/**
|
|
119
|
+
* 插件代码的数据结构与页面查找,下载见 plugins.ts。
|
|
120
|
+
* 不依赖 Node:查看器的 Service Worker 也按同样的结构生成页面
|
|
121
|
+
*/
|
|
122
|
+
|
|
123
|
+
interface PluginCode {
|
|
124
|
+
/** app.json 里的引用名,plugin://<alias>/页面名 */
|
|
125
|
+
alias: string;
|
|
126
|
+
/** 插件 appid */
|
|
127
|
+
provider: string;
|
|
128
|
+
version: string;
|
|
129
|
+
/** 包内路径(/ 开头)→ 内容 */
|
|
130
|
+
files: Map<string, Uint8Array>;
|
|
131
|
+
/** 插件页面的路径,如 __plugin__/wx…/pages/index/index */
|
|
132
|
+
pages: string[];
|
|
133
|
+
/** 插件页面的配置,键同 __wxConfig.page(路径加 .html) */
|
|
134
|
+
pageConfigs: Record<string, unknown>;
|
|
135
|
+
}
|
|
136
|
+
/** 构建结果加上用到的插件:插件页面并入 pages,配置并入 __wxConfig.page */
|
|
137
|
+
interface AppBuild extends BuildResult {
|
|
138
|
+
plugins: PluginCode[];
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
/**
|
|
142
|
+
* 小程序页面与代码的路由:逻辑层、子上下文、渲染层的 HTML,业务模块、模板、样式和插件代码
|
|
143
|
+
*
|
|
144
|
+
* 开发服务器和查看器(wxapack)的 Service Worker 共用这一份,两边生成的页面才不会走样,所以不依赖 Node。
|
|
145
|
+
* app-info、setup、静态资源、文件接口等和运行环境有关的路由各自实现。
|
|
146
|
+
*/
|
|
147
|
+
|
|
148
|
+
declare const DEFAULT_DEVICE: DeviceProfile;
|
|
149
|
+
interface AppSource {
|
|
150
|
+
build: AppBuild;
|
|
151
|
+
/** 业务模块的 define 脚本,id 已确认在 modules 或 workerModules 里 */
|
|
152
|
+
moduleScript(id: string): string;
|
|
153
|
+
baseLib: {
|
|
154
|
+
version: string;
|
|
155
|
+
hasWorker: boolean;
|
|
156
|
+
};
|
|
157
|
+
/** 新版基础库的隔离上下文,见 html.ts 的 appserviceHtml */
|
|
158
|
+
isolated: boolean;
|
|
159
|
+
/** 打开基础库的热更新开关 */
|
|
160
|
+
hot: boolean;
|
|
161
|
+
webviewScripts?: WebviewScript[];
|
|
162
|
+
}
|
|
163
|
+
interface RouteResponse {
|
|
164
|
+
status: number;
|
|
165
|
+
/** express 的 res.type() 能识别的写法:'html'、'js'、'text' 或带点的扩展名;在 Service Worker 里用 mimeType() 换成 Content-Type */
|
|
166
|
+
type: string;
|
|
167
|
+
body: string | Uint8Array;
|
|
168
|
+
}
|
|
169
|
+
/** @returns 不归这里管、或请求的页面和文件不存在时为 null,交给后面的路由 */
|
|
170
|
+
declare function routeApp(source: AppSource, url: URL): RouteResponse | null;
|
|
171
|
+
/** RouteResponse.type 或文件扩展名对应的 Content-Type;认不出的按二进制处理 */
|
|
172
|
+
declare function mimeType(type: string): string;
|
|
173
|
+
/** 带点的扩展名,没有时为空串 */
|
|
174
|
+
declare function extname(filePath: string): string;
|
|
175
|
+
|
|
176
|
+
/**
|
|
177
|
+
* 宿主、逻辑层、渲染层的 HTML,以及 Worker 的入口脚本
|
|
178
|
+
*
|
|
179
|
+
* 不依赖 Node:查看器的 Service Worker 也用这些函数生成页面
|
|
180
|
+
*/
|
|
181
|
+
|
|
182
|
+
declare function hostHtml(): string;
|
|
183
|
+
|
|
184
|
+
/** 文件 API、下载、上传和资源 URL 共用这些字节;不依赖 Node,以便 Service Worker 也能直接使用。 */
|
|
185
|
+
interface FsNode {
|
|
186
|
+
dir: boolean;
|
|
187
|
+
data: Uint8Array;
|
|
188
|
+
mtime: number;
|
|
189
|
+
etag: string;
|
|
190
|
+
}
|
|
191
|
+
/** 基础库会往 http://usr/ 写运行日志;业务代码也可以通过 FileSystemManager 读写 */
|
|
192
|
+
declare class FileStore {
|
|
193
|
+
private readonly etagPrefix;
|
|
194
|
+
private version;
|
|
195
|
+
private nodes;
|
|
196
|
+
private readonly roots;
|
|
197
|
+
/** @param roots 预先创建的目录(如用户目录)。rmdir 不能删除它们和它们的上级目录:删掉之后再写 USER_DATA_PATH 都会失败 */
|
|
198
|
+
constructor(roots?: string[]);
|
|
199
|
+
normalize(filePath: string): string;
|
|
200
|
+
stat(filePath: string): FsNode | undefined;
|
|
201
|
+
mkdir(dirPath: string, recursive?: boolean): void;
|
|
202
|
+
write(filePath: string, input: string | Uint8Array, append?: boolean): void;
|
|
203
|
+
read(filePath: string): Uint8Array;
|
|
204
|
+
readdir(dirPath: string): string[];
|
|
205
|
+
remove(filePath: string, options: {
|
|
206
|
+
dir: boolean;
|
|
207
|
+
recursive?: boolean;
|
|
208
|
+
}): void;
|
|
209
|
+
/** 文件 API 经开发服务器调用的操作,参数和返回值的字段名与基础库一致 */
|
|
210
|
+
execute(operation: string, args: any): Record<string, any>;
|
|
211
|
+
private readonly operations;
|
|
212
|
+
private writeEncoded;
|
|
213
|
+
private existing;
|
|
214
|
+
private assertNotRoot;
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
/**
|
|
218
|
+
* 网络代理:浏览器端的 wx.request 经由这里转发到真实服务器
|
|
219
|
+
*
|
|
220
|
+
* - 原地址写在路径里:/__wxa__/proxy/https/api.example.com/a?b=1(见 networkPanel.ts)
|
|
221
|
+
* - 绕开 CORS
|
|
222
|
+
* - 小程序设置的请求头放在 x-wxa-headers(JSON)里传过来,
|
|
223
|
+
* 这样 cookie / referer / user-agent 等浏览器禁止设置的头也能带上
|
|
224
|
+
* - 响应头和 set-cookie 以 URL 编码的 JSON 返回,浏览器端可以完整读取
|
|
225
|
+
*
|
|
226
|
+
* 只用标准 Fetch API:开发服务器(proxy.ts)和其他支持 Fetch API 的运行时共用。
|
|
227
|
+
*/
|
|
228
|
+
declare function proxyFetch(request: Request, options?: {
|
|
229
|
+
fetch?: typeof fetch;
|
|
230
|
+
isAllowed?: (url: URL) => boolean;
|
|
231
|
+
}): Promise<Response>;
|
|
232
|
+
|
|
233
|
+
/**
|
|
234
|
+
* 小程序的请求在浏览器 Network 面板里的样子,宿主、Service Worker 和开发服务器共用
|
|
235
|
+
*
|
|
236
|
+
* 原地址放在路径里:/__wxa__/proxy/https/api.example.com/user/info?id=1。Name 列显示接口名(info?id=1),
|
|
237
|
+
* 按域名、路径过滤也直接可用;放在查询参数里时每一行都是 proxy?url=https%3A%2F%2F…,分不出是哪个接口。
|
|
238
|
+
*
|
|
239
|
+
* - 经开发服务器转发的请求:/__wxa__/proxy/…
|
|
240
|
+
* - 被拦截规则拦下的请求:/__wxa__/mock/…,由 Service Worker 返回规则给出的响应,只用于显示(见 sw.ts)
|
|
241
|
+
*/
|
|
242
|
+
|
|
243
|
+
declare const PROXY_PREFIX = "/__wxa__/proxy/";
|
|
244
|
+
declare const MOCK_PREFIX = "/__wxa__/mock/";
|
|
245
|
+
/** 显示被拦截请求的 fetch 带上这个头,Service Worker 凭它向宿主要对应的响应 */
|
|
246
|
+
declare const MOCK_ID_HEADER = "x-wxa-mock-id";
|
|
247
|
+
/** Service Worker 向宿主要响应时发的消息,附带一个 MessagePort,宿主从这个端口回复 MockReply */
|
|
248
|
+
interface MockQuery {
|
|
249
|
+
type: 'wxa-mock-response';
|
|
250
|
+
id: string;
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
/**
|
|
254
|
+
* 被拦截的 wx.request 在 Network 面板里的响应:Service Worker 向发出请求的页面要拦截规则给出的结果。
|
|
255
|
+
* 开发服务器的 sw.ts 和查看器的 packSw.ts 共用
|
|
256
|
+
*/
|
|
257
|
+
|
|
258
|
+
interface MockClient {
|
|
259
|
+
postMessage(message: MockQuery, transfer: Transferable[]): void;
|
|
260
|
+
}
|
|
261
|
+
/** 向发起请求的页面索取拦截响应;页面失效或响应无法表示时让 Network 面板显示请求失败。 */
|
|
262
|
+
declare function mockedResponse(client: MockClient | undefined, id: string): Promise<Response>;
|
|
263
|
+
|
|
264
|
+
/** setup 打包时对 wxa-runner-core/setup 的替换:开发服务器和在浏览器里编译 setup 的宿主(如查看器)共用同一实现;defineSetup 只提供类型提示,运行时原样返回。 */
|
|
265
|
+
declare const SETUP_MODULE = "@open-wxa/wxa-runner-core/setup";
|
|
266
|
+
declare const SETUP_MODULE_SOURCE = "export function defineSetup(setup) { return setup; }";
|
|
267
|
+
|
|
268
|
+
export { type AppBuild, type AppInfo, type AppSource, type BuildResult, DEFAULT_DEVICE, type DeviceProfile, FileStore, MOCK_ID_HEADER, MOCK_PREFIX, type MockClient, PROXY_PREFIX, type PluginCode, type RouteResponse, SETUP_MODULE, SETUP_MODULE_SOURCE, extname, hostHtml, mimeType, mockedResponse, proxyFetch, routeApp };
|