@open-wxa/wxa-runner-core 0.10.1 → 0.12.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 +51 -6
- package/dist/index.d.ts +51 -6
- package/dist/index.js +489 -298
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +478 -293
- package/dist/index.mjs.map +1 -1
- package/dist/runtime/host.js +203 -31
- 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-D0ubZt2C.d.mts} +6 -0
- package/dist/{setup-Bac8XdhR.d.ts → setup-D0ubZt2C.d.ts} +6 -0
- package/dist/setup.d.mts +1 -1
- package/dist/setup.d.ts +1 -1
- package/dist/test-api.d.mts +12 -2
- package/dist/test-api.d.ts +12 -2
- package/dist/{testApi-BOZSXSnV.d.ts → testApi-Df0ltBI6.d.ts} +29 -2
- package/dist/{testApi-DHuEW5Cl.d.mts → testApi-x2Yph6M2.d.mts} +29 -2
- package/dist/web.d.mts +270 -0
- package/dist/web.d.ts +270 -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/runtime/sw.js
CHANGED
|
@@ -15,9 +15,31 @@
|
|
|
15
15
|
return headers;
|
|
16
16
|
}
|
|
17
17
|
|
|
18
|
+
// src/runtime/mockResponse.ts
|
|
19
|
+
var NULL_BODY_STATUSES = /* @__PURE__ */ new Set([204, 205, 304]);
|
|
20
|
+
async function mockedResponse(client, id) {
|
|
21
|
+
if (!client) return Response.error();
|
|
22
|
+
const reply = await new Promise((resolve) => {
|
|
23
|
+
const channel = new MessageChannel();
|
|
24
|
+
channel.port1.onmessage = (event) => {
|
|
25
|
+
channel.port1.close();
|
|
26
|
+
resolve(event.data);
|
|
27
|
+
};
|
|
28
|
+
client.postMessage({ type: "wxa-mock-response", id }, [channel.port2]);
|
|
29
|
+
});
|
|
30
|
+
if (!reply) return Response.error();
|
|
31
|
+
try {
|
|
32
|
+
return new Response(NULL_BODY_STATUSES.has(reply.statusCode) ? null : reply.body, {
|
|
33
|
+
status: reply.statusCode,
|
|
34
|
+
headers: toHeaders(reply.header)
|
|
35
|
+
});
|
|
36
|
+
} catch {
|
|
37
|
+
return Response.error();
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
|
|
18
41
|
// src/runtime/sw.ts
|
|
19
42
|
var scope = self;
|
|
20
|
-
var NULL_BODY_STATUSES = /* @__PURE__ */ new Set([204, 205, 304]);
|
|
21
43
|
var URLPatternClass = globalThis.URLPattern;
|
|
22
44
|
scope.addEventListener("install", (event) => {
|
|
23
45
|
scope.skipWaiting();
|
|
@@ -32,25 +54,7 @@
|
|
|
32
54
|
scope.addEventListener("fetch", (event) => {
|
|
33
55
|
const id = event.request.headers.get(MOCK_ID_HEADER);
|
|
34
56
|
if (!id || !new URL(event.request.url).pathname.startsWith(MOCK_PREFIX)) return;
|
|
35
|
-
event.respondWith(
|
|
57
|
+
event.respondWith(scope.clients.get(event.clientId).then((client) => mockedResponse(client, id)));
|
|
36
58
|
});
|
|
37
|
-
async function mockedResponse(clientId, id) {
|
|
38
|
-
const client = await scope.clients.get(clientId);
|
|
39
|
-
if (!client) return Response.error();
|
|
40
|
-
const reply = await new Promise((resolve) => {
|
|
41
|
-
const channel = new MessageChannel();
|
|
42
|
-
channel.port1.onmessage = (event) => resolve(event.data);
|
|
43
|
-
client.postMessage({ type: "wxa-mock-response", id }, [channel.port2]);
|
|
44
|
-
});
|
|
45
|
-
if (!reply) return Response.error();
|
|
46
|
-
try {
|
|
47
|
-
return new Response(NULL_BODY_STATUSES.has(reply.statusCode) ? null : reply.body, {
|
|
48
|
-
status: reply.statusCode,
|
|
49
|
-
headers: toHeaders(reply.header)
|
|
50
|
-
});
|
|
51
|
-
} catch {
|
|
52
|
-
return Response.error();
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
59
|
})();
|
|
56
60
|
//# sourceMappingURL=sw.js.map
|
package/dist/runtime/sw.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/runtime/networkPanel.ts","../../src/runtime/sw.ts"],"sourcesContent":["/**\n * 小程序的请求在浏览器 Network 面板里的样子,宿主、Service Worker 和开发服务器共用\n *\n * 原地址放在路径里:/__wxa__/proxy/https/api.example.com/user/info?id=1。Name 列显示接口名(info?id=1),\n * 按域名、路径过滤也直接可用;放在查询参数里时每一行都是 proxy?url=https%3A%2F%2F…,分不出是哪个接口。\n *\n * - 经开发服务器转发的请求:/__wxa__/proxy/…\n * - 被拦截规则拦下的请求:/__wxa__/mock/…,由 Service Worker 返回规则给出的响应,只用于显示(见 sw.ts)\n */\n\nimport type { MockedResponse } from './host/api/routes';\n\nexport const PROXY_PREFIX = '/__wxa__/proxy/';\nexport const MOCK_PREFIX = '/__wxa__/mock/';\n\n/** 显示被拦截请求的 fetch 带上这个头,Service Worker 凭它向宿主要对应的响应 */\nexport const MOCK_ID_HEADER = 'x-wxa-mock-id';\n\n/** Service Worker 向宿主要响应时发的消息,附带一个 MessagePort,宿主从这个端口回复 MockReply */\nexport interface MockQuery {\n type: 'wxa-mock-response';\n id: string;\n}\n\n/** 请求被取消、拦截规则出错,或宿主已经不认识这个 id 时为 null,Network 面板里显示为失败 */\nexport type MockReply = MockedResponse | null;\n\n/**\n * 原地址在开发服务器上对应的路径,prefix 是 PROXY_PREFIX 或 MOCK_PREFIX。不是 http(s) 地址时返回 null\n *\n * 先按 URL 规范化:路径里的 .. 要在拼接前解析掉,否则浏览器会在代理路径上解析,把域名那一段也吃掉\n */\nexport function toServerPath(prefix: string, url: string): string | null {\n let target: URL;\n try {\n target = new URL(url);\n } catch {\n return null;\n }\n if (target.protocol !== 'http:' && target.protocol !== 'https:') return null;\n return `${prefix}${target.protocol.slice(0, -1)}/${target.host}${target.pathname}${target.search}`;\n}\n\n/**\n * toServerPath 的逆运算,格式不对或还原出的地址不合法时返回 null\n *\n * 只校验不规范化,返回拼出的原样字符串:路径里的 %2F 等编码要原样转发\n */\nexport function fromServerPath(prefix: string, serverPath: string): string | null {\n if (!serverPath.startsWith(prefix)) return null;\n const match = /^(https?)\\/([^/?#]+)(.*)$/.exec(serverPath.slice(prefix.length));\n if (!match) return null;\n const url = `${match[1]}://${match[2]}${match[3]}`;\n try {\n new URL(url);\n return url;\n } catch {\n return null;\n }\n}\n\n/**\n * 用于显示的请求、响应头。浏览器不允许设置的(cookie、set-cookie 等)会被忽略,\n * 名字或值不合法的(如值里有中文)跳过:它们只影响 Network 面板里的显示,小程序拿到的头不受影响。\n * 值为 undefined、null 的和代理一样不发\n */\nexport function toHeaders(header: Record<string, unknown>): Headers {\n const headers = new Headers();\n for (const [name, value] of Object.entries(header)) {\n if (value === undefined || value === null) continue;\n try {\n headers.set(name, String(value));\n } catch {\n // 跳过\n }\n }\n return headers;\n}\n","/**\n * Service Worker(打包为 /__wxa__/runtime/sw.js):让被拦截的 wx.request 也出现在 Network 面板里\n *\n * 宿主照原请求向 /__wxa__/mock/… 发一个带 x-wxa-mock-id 头的 fetch(见 host/mockMirror.ts),\n * 这里拦下它,向发出请求的页面要拦截规则给出的响应。其余请求一律不处理,照常走网络。\n */\n\nimport { MOCK_ID_HEADER, MOCK_PREFIX
|
|
1
|
+
{"version":3,"sources":["../../src/runtime/networkPanel.ts","../../src/runtime/mockResponse.ts","../../src/runtime/sw.ts"],"sourcesContent":["/**\n * 小程序的请求在浏览器 Network 面板里的样子,宿主、Service Worker 和开发服务器共用\n *\n * 原地址放在路径里:/__wxa__/proxy/https/api.example.com/user/info?id=1。Name 列显示接口名(info?id=1),\n * 按域名、路径过滤也直接可用;放在查询参数里时每一行都是 proxy?url=https%3A%2F%2F…,分不出是哪个接口。\n *\n * - 经开发服务器转发的请求:/__wxa__/proxy/…\n * - 被拦截规则拦下的请求:/__wxa__/mock/…,由 Service Worker 返回规则给出的响应,只用于显示(见 sw.ts)\n */\n\nimport type { MockedResponse } from './host/api/routes';\n\nexport const PROXY_PREFIX = '/__wxa__/proxy/';\nexport const MOCK_PREFIX = '/__wxa__/mock/';\n\n/** 显示被拦截请求的 fetch 带上这个头,Service Worker 凭它向宿主要对应的响应 */\nexport const MOCK_ID_HEADER = 'x-wxa-mock-id';\n\n/** Service Worker 向宿主要响应时发的消息,附带一个 MessagePort,宿主从这个端口回复 MockReply */\nexport interface MockQuery {\n type: 'wxa-mock-response';\n id: string;\n}\n\n/** 请求被取消、拦截规则出错,或宿主已经不认识这个 id 时为 null,Network 面板里显示为失败 */\nexport type MockReply = MockedResponse | null;\n\n/**\n * 原地址在开发服务器上对应的路径,prefix 是 PROXY_PREFIX 或 MOCK_PREFIX。不是 http(s) 地址时返回 null\n *\n * 先按 URL 规范化:路径里的 .. 要在拼接前解析掉,否则浏览器会在代理路径上解析,把域名那一段也吃掉\n */\nexport function toServerPath(prefix: string, url: string): string | null {\n let target: URL;\n try {\n target = new URL(url);\n } catch {\n return null;\n }\n if (target.protocol !== 'http:' && target.protocol !== 'https:') return null;\n return `${prefix}${target.protocol.slice(0, -1)}/${target.host}${target.pathname}${target.search}`;\n}\n\n/**\n * toServerPath 的逆运算,格式不对或还原出的地址不合法时返回 null\n *\n * 只校验不规范化,返回拼出的原样字符串:路径里的 %2F 等编码要原样转发\n */\nexport function fromServerPath(prefix: string, serverPath: string): string | null {\n if (!serverPath.startsWith(prefix)) return null;\n const match = /^(https?)\\/([^/?#]+)(.*)$/.exec(serverPath.slice(prefix.length));\n if (!match) return null;\n const url = `${match[1]}://${match[2]}${match[3]}`;\n try {\n new URL(url);\n return url;\n } catch {\n return null;\n }\n}\n\n/**\n * 用于显示的请求、响应头。浏览器不允许设置的(cookie、set-cookie 等)会被忽略,\n * 名字或值不合法的(如值里有中文)跳过:它们只影响 Network 面板里的显示,小程序拿到的头不受影响。\n * 值为 undefined、null 的和代理一样不发\n */\nexport function toHeaders(header: Record<string, unknown>): Headers {\n const headers = new Headers();\n for (const [name, value] of Object.entries(header)) {\n if (value === undefined || value === null) continue;\n try {\n headers.set(name, String(value));\n } catch {\n // 跳过\n }\n }\n return headers;\n}\n","/**\n * 被拦截的 wx.request 在 Network 面板里的响应:Service Worker 向发出请求的页面要拦截规则给出的结果。\n * 开发服务器的 sw.ts 和查看器的 packSw.ts 共用\n */\n\nimport { MockQuery, MockReply, toHeaders } from './networkPanel';\n\nexport interface MockClient {\n postMessage(message: MockQuery, transfer: Transferable[]): void;\n}\n\nconst NULL_BODY_STATUSES = new Set([204, 205, 304]);\n\n/** 向发起请求的页面索取拦截响应;页面失效或响应无法表示时让 Network 面板显示请求失败。 */\nexport async function mockedResponse(client: MockClient | undefined, id: string): Promise<Response> {\n if (!client) return Response.error();\n const reply = await new Promise<MockReply>(resolve => {\n const channel = new MessageChannel();\n channel.port1.onmessage = event => {\n channel.port1.close();\n resolve(event.data);\n };\n client.postMessage({ type: 'wxa-mock-response', id }, [channel.port2]);\n });\n if (!reply) return Response.error();\n try {\n return new Response(NULL_BODY_STATUSES.has(reply.statusCode) ? null : reply.body, {\n status: reply.statusCode,\n headers: toHeaders(reply.header)\n });\n } catch {\n // 小程序允许的部分状态码超出浏览器 Response 能表示的范围。\n return Response.error();\n }\n}\n","/**\n * Service Worker(打包为 /__wxa__/runtime/sw.js):让被拦截的 wx.request 也出现在 Network 面板里\n *\n * 宿主照原请求向 /__wxa__/mock/… 发一个带 x-wxa-mock-id 头的 fetch(见 host/mockMirror.ts),\n * 这里拦下它,向发出请求的页面要拦截规则给出的响应。其余请求一律不处理,照常走网络。\n */\n\nimport { MOCK_ID_HEADER, MOCK_PREFIX } from './networkPanel';\nimport { mockedResponse } from './mockResponse';\nimport type { MockClient } from './mockResponse';\n\n// tsconfig 只带 DOM 的类型,这里只声明用到的 Service Worker 接口\ninterface ExtendableEvent extends Event {\n waitUntil(promise: Promise<unknown>): void;\n}\ninterface InstallEvent extends ExtendableEvent {\n /** Static Routing API,Chrome 123 起支持 */\n addRoutes?(rules: object[]): Promise<void>;\n}\ninterface FetchEvent extends ExtendableEvent {\n request: Request;\n clientId: string;\n respondWith(response: Promise<Response>): void;\n}\ninterface WorkerScope {\n skipWaiting(): Promise<void>;\n clients: {\n claim(): Promise<void>;\n get(id: string): Promise<MockClient | undefined>;\n };\n addEventListener(type: 'install', listener: (event: InstallEvent) => void): void;\n addEventListener(type: 'activate', listener: (event: ExtendableEvent) => void): void;\n addEventListener(type: 'fetch', listener: (event: FetchEvent) => void): void;\n}\n\nconst scope = self as unknown as WorkerScope;\n\nconst URLPatternClass = (globalThis as { URLPattern?: new (init: { pathname: string }) => object }).URLPattern;\n\nscope.addEventListener('install', event => {\n // 新版本装好后立即接替旧版本,不用等所有标签页关闭\n scope.skipWaiting();\n // 其余请求不唤起 Service Worker,直接走网络。不支持的浏览器里照样能用,只是每个请求都先经过 fetch 事件\n if (!event.addRoutes || !URLPatternClass) return;\n const others = { not: { urlPattern: new URLPatternClass({ pathname: `${MOCK_PREFIX}*` }) } };\n try {\n event.waitUntil(event.addRoutes([{ condition: others, source: 'network' }]).catch(() => undefined));\n } catch {\n // 早期版本不支持 not 条件,同上\n }\n});\n\n// 第一次打开页面时就接管它,不用刷新\nscope.addEventListener('activate', event => event.waitUntil(scope.clients.claim()));\n\nscope.addEventListener('fetch', event => {\n const id = event.request.headers.get(MOCK_ID_HEADER);\n if (!id || !new URL(event.request.url).pathname.startsWith(MOCK_PREFIX)) return;\n event.respondWith(scope.clients.get(event.clientId).then(client => mockedResponse(client, id)));\n});\n"],"mappings":";;;AAaO,MAAM,cAAc;AAGpB,MAAM,iBAAiB;AAkDvB,WAAS,UAAU,QAA0C;AAClE,UAAM,UAAU,IAAI,QAAQ;AAC5B,eAAW,CAAC,MAAM,KAAK,KAAK,OAAO,QAAQ,MAAM,GAAG;AAClD,UAAI,UAAU,UAAa,UAAU,KAAM;AAC3C,UAAI;AACF,gBAAQ,IAAI,MAAM,OAAO,KAAK,CAAC;AAAA,MACjC,QAAQ;AAAA,MAER;AAAA,IACF;AACA,WAAO;AAAA,EACT;;;AClEA,MAAM,qBAAqB,oBAAI,IAAI,CAAC,KAAK,KAAK,GAAG,CAAC;AAGlD,iBAAsB,eAAe,QAAgC,IAA+B;AAClG,QAAI,CAAC,OAAQ,QAAO,SAAS,MAAM;AACnC,UAAM,QAAQ,MAAM,IAAI,QAAmB,aAAW;AACpD,YAAM,UAAU,IAAI,eAAe;AACnC,cAAQ,MAAM,YAAY,WAAS;AACjC,gBAAQ,MAAM,MAAM;AACpB,gBAAQ,MAAM,IAAI;AAAA,MACpB;AACA,aAAO,YAAY,EAAE,MAAM,qBAAqB,GAAG,GAAG,CAAC,QAAQ,KAAK,CAAC;AAAA,IACvE,CAAC;AACD,QAAI,CAAC,MAAO,QAAO,SAAS,MAAM;AAClC,QAAI;AACF,aAAO,IAAI,SAAS,mBAAmB,IAAI,MAAM,UAAU,IAAI,OAAO,MAAM,MAAM;AAAA,QAChF,QAAQ,MAAM;AAAA,QACd,SAAS,UAAU,MAAM,MAAM;AAAA,MACjC,CAAC;AAAA,IACH,QAAQ;AAEN,aAAO,SAAS,MAAM;AAAA,IACxB;AAAA,EACF;;;ACCA,MAAM,QAAQ;AAEd,MAAM,kBAAmB,WAA2E;AAEpG,QAAM,iBAAiB,WAAW,WAAS;AAEzC,UAAM,YAAY;AAElB,QAAI,CAAC,MAAM,aAAa,CAAC,gBAAiB;AAC1C,UAAM,SAAS,EAAE,KAAK,EAAE,YAAY,IAAI,gBAAgB,EAAE,UAAU,GAAG,WAAW,IAAI,CAAC,EAAE,EAAE;AAC3F,QAAI;AACF,YAAM,UAAU,MAAM,UAAU,CAAC,EAAE,WAAW,QAAQ,QAAQ,UAAU,CAAC,CAAC,EAAE,MAAM,MAAM,MAAS,CAAC;AAAA,IACpG,QAAQ;AAAA,IAER;AAAA,EACF,CAAC;AAGD,QAAM,iBAAiB,YAAY,WAAS,MAAM,UAAU,MAAM,QAAQ,MAAM,CAAC,CAAC;AAElF,QAAM,iBAAiB,SAAS,WAAS;AACvC,UAAM,KAAK,MAAM,QAAQ,QAAQ,IAAI,cAAc;AACnD,QAAI,CAAC,MAAM,CAAC,IAAI,IAAI,MAAM,QAAQ,GAAG,EAAE,SAAS,WAAW,WAAW,EAAG;AACzE,UAAM,YAAY,MAAM,QAAQ,IAAI,MAAM,QAAQ,EAAE,KAAK,YAAU,eAAe,QAAQ,EAAE,CAAC,CAAC;AAAA,EAChG,CAAC;","names":[]}
|
|
@@ -28,6 +28,10 @@ interface AppInfo {
|
|
|
28
28
|
device: DeviceProfile;
|
|
29
29
|
/** 开启了 --devtools-login */
|
|
30
30
|
devtoolsLogin?: boolean;
|
|
31
|
+
/** false 表示没有开发服务器,不建立热更新和报错转发连接 */
|
|
32
|
+
liveReload?: boolean;
|
|
33
|
+
/** 使用查看器已经注册的 Service Worker,宿主不能用 sw.js 替换它 */
|
|
34
|
+
externalServiceWorker?: boolean;
|
|
31
35
|
buildError?: string;
|
|
32
36
|
/** 配置了 setup 文件时存在;error 是 setup 的编译错误 */
|
|
33
37
|
setup?: {
|
|
@@ -36,6 +40,8 @@ interface AppInfo {
|
|
|
36
40
|
};
|
|
37
41
|
/** 没有时不转发 */
|
|
38
42
|
forwardConsole?: ForwardConsole;
|
|
43
|
+
/** web-view 的网页在新窗口打开,见 api/webView.ts 的 WebViewWindows */
|
|
44
|
+
webViewWindow?: boolean;
|
|
39
45
|
}
|
|
40
46
|
|
|
41
47
|
/**
|
|
@@ -28,6 +28,10 @@ interface AppInfo {
|
|
|
28
28
|
device: DeviceProfile;
|
|
29
29
|
/** 开启了 --devtools-login */
|
|
30
30
|
devtoolsLogin?: boolean;
|
|
31
|
+
/** false 表示没有开发服务器,不建立热更新和报错转发连接 */
|
|
32
|
+
liveReload?: boolean;
|
|
33
|
+
/** 使用查看器已经注册的 Service Worker,宿主不能用 sw.js 替换它 */
|
|
34
|
+
externalServiceWorker?: boolean;
|
|
31
35
|
buildError?: string;
|
|
32
36
|
/** 配置了 setup 文件时存在;error 是 setup 的编译错误 */
|
|
33
37
|
setup?: {
|
|
@@ -36,6 +40,8 @@ interface AppInfo {
|
|
|
36
40
|
};
|
|
37
41
|
/** 没有时不转发 */
|
|
38
42
|
forwardConsole?: ForwardConsole;
|
|
43
|
+
/** web-view 的网页在新窗口打开,见 api/webView.ts 的 WebViewWindows */
|
|
44
|
+
webViewWindow?: boolean;
|
|
39
45
|
}
|
|
40
46
|
|
|
41
47
|
/**
|
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, k as SetupEnv, U as UserInfo, l as defineSetup } from './setup-
|
|
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, k as SetupEnv, U as UserInfo, l as defineSetup } from './setup-D0ubZt2C.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, k as SetupEnv, U as UserInfo, l as defineSetup } from './setup-
|
|
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, k as SetupEnv, U as UserInfo, l as defineSetup } from './setup-D0ubZt2C.js';
|
package/dist/test-api.d.mts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import './setup-
|
|
1
|
+
import { a as WxaTestApi } from './testApi-x2Yph6M2.mjs';
|
|
2
|
+
import './setup-D0ubZt2C.mjs';
|
|
3
3
|
|
|
4
4
|
/**
|
|
5
5
|
* window.__wxa_test_api__ 的全局类型声明,供测试代码按需引用:
|
|
@@ -17,5 +17,15 @@ declare global {
|
|
|
17
17
|
* 这里调用 mock、route,App.onLaunch 里就能生效。抛错时模拟器显示错误,小程序不启动
|
|
18
18
|
*/
|
|
19
19
|
__wxa_before_launch__?: (api: WxaTestApi) => unknown;
|
|
20
|
+
/**
|
|
21
|
+
* 由测试工具在页面脚本执行前设为 true,这次打开的小程序里 web-view 的网页在新窗口打开,
|
|
22
|
+
* 同开发服务器的 webViewWindow 选项(--webview-window)
|
|
23
|
+
*/
|
|
24
|
+
__wxa_webview_window__?: boolean;
|
|
25
|
+
/**
|
|
26
|
+
* 由测试工具在页面脚本执行前定义。新窗口模式下宿主每新开一个网页窗口(type 为 'open',带上地址)、关掉一个窗口('close')时调用,
|
|
27
|
+
* name 同 webViews() 的 windowName。网页设置了 Cross-Origin-Opener-Policy 时窗口名会被清空、宿主也关不掉窗口,测试工具靠它对上窗口
|
|
28
|
+
*/
|
|
29
|
+
__wxa_webview_window_event__?: (type: 'open' | 'close', name: string, src?: string) => Promise<void> | void;
|
|
20
30
|
}
|
|
21
31
|
}
|
package/dist/test-api.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import './setup-
|
|
1
|
+
import { a as WxaTestApi } from './testApi-Df0ltBI6.js';
|
|
2
|
+
import './setup-D0ubZt2C.js';
|
|
3
3
|
|
|
4
4
|
/**
|
|
5
5
|
* window.__wxa_test_api__ 的全局类型声明,供测试代码按需引用:
|
|
@@ -17,5 +17,15 @@ declare global {
|
|
|
17
17
|
* 这里调用 mock、route,App.onLaunch 里就能生效。抛错时模拟器显示错误,小程序不启动
|
|
18
18
|
*/
|
|
19
19
|
__wxa_before_launch__?: (api: WxaTestApi) => unknown;
|
|
20
|
+
/**
|
|
21
|
+
* 由测试工具在页面脚本执行前设为 true,这次打开的小程序里 web-view 的网页在新窗口打开,
|
|
22
|
+
* 同开发服务器的 webViewWindow 选项(--webview-window)
|
|
23
|
+
*/
|
|
24
|
+
__wxa_webview_window__?: boolean;
|
|
25
|
+
/**
|
|
26
|
+
* 由测试工具在页面脚本执行前定义。新窗口模式下宿主每新开一个网页窗口(type 为 'open',带上地址)、关掉一个窗口('close')时调用,
|
|
27
|
+
* name 同 webViews() 的 windowName。网页设置了 Cross-Origin-Opener-Policy 时窗口名会被清空、宿主也关不掉窗口,测试工具靠它对上窗口
|
|
28
|
+
*/
|
|
29
|
+
__wxa_webview_window_event__?: (type: 'open' | 'close', name: string, src?: string) => Promise<void> | void;
|
|
20
30
|
}
|
|
21
31
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { d as MockRequest, j as FrameKind, a as ApiHandler, b as ApiResult, R as RouteHandler } from './setup-
|
|
1
|
+
import { d as MockRequest, j as FrameKind, a as ApiHandler, b as ApiResult, R as RouteHandler } from './setup-D0ubZt2C.js';
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
4
|
* 网络 API:wx.request / downloadFile / uploadFile / connectSocket
|
|
@@ -16,6 +16,28 @@ interface RecordedRequest extends MockRequest {
|
|
|
16
16
|
routedBy: string | null;
|
|
17
17
|
}
|
|
18
18
|
|
|
19
|
+
/**
|
|
20
|
+
* web-view 组件背后的原生网页视图
|
|
21
|
+
*
|
|
22
|
+
* 渲染层的 web-view 组件调 insertHTMLWebView 占位,updateHTMLWebView 设置地址和位置,
|
|
23
|
+
* 销毁时 removeHTMLWebView;加载进度通过渲染层的 onWebviewStartLoad / onWebviewFinishLoad
|
|
24
|
+
* 告诉组件,组件据此触发 bindload。
|
|
25
|
+
*
|
|
26
|
+
* 默认把网页放在所在页面渲染层里的 iframe 中,跟着页面显示、隐藏和关闭。这有两个限制:
|
|
27
|
+
* - 设置了 X-Frame-Options 或 CSP frame-ancestors 的网站不允许被嵌入,这类网页显示不出来
|
|
28
|
+
* - 网页和宿主域名不同时,浏览器按跨站嵌入处理:SameSite 为 Lax、Strict 或没写的 Cookie 存不下、也不发送,
|
|
29
|
+
* 网页的登录态因此失效。微信里 web-view 是独立的原生网页视图,没有这个问题
|
|
30
|
+
*
|
|
31
|
+
* 新窗口模式(--webview-window)把网页放到新窗口里打开,网页是顶层页面,绕开这两个限制,见 WebViewWindows
|
|
32
|
+
*/
|
|
33
|
+
|
|
34
|
+
/** web-view 当前显示的网页,供测试 API 查询 */
|
|
35
|
+
interface WebViewInfo {
|
|
36
|
+
src: string;
|
|
37
|
+
/** 新窗口模式下网页所在窗口的 name;iframe 模式为 null */
|
|
38
|
+
windowName: string | null;
|
|
39
|
+
}
|
|
40
|
+
|
|
19
41
|
interface FrameError {
|
|
20
42
|
kind: FrameKind;
|
|
21
43
|
webviewId: number;
|
|
@@ -44,6 +66,11 @@ interface WxaTestApi {
|
|
|
44
66
|
currentPage(): PageSnapshot | null;
|
|
45
67
|
/** 整个页面栈,栈底在前 */
|
|
46
68
|
pageStack(): PageSnapshot[];
|
|
69
|
+
/**
|
|
70
|
+
* 当前页里设置过 src 的 web-view,按创建顺序;小程序启动前为空数组。
|
|
71
|
+
* 新窗口模式下 windowName 是网页所在窗口的 name,可以用它找到这个窗口;iframe 模式下为 null
|
|
72
|
+
*/
|
|
73
|
+
webViews(): WebViewInfo[];
|
|
47
74
|
/**
|
|
48
75
|
* 等到指定页面成为当前页,已经是当前页时立即返回
|
|
49
76
|
* @param path 页面路径,如 pages/index/index,开头的 / 可有可无
|
|
@@ -128,4 +155,4 @@ interface WxaTestApi {
|
|
|
128
155
|
errors(): FrameError[];
|
|
129
156
|
}
|
|
130
157
|
|
|
131
|
-
export type { FrameError as F, PageSnapshot as P, RecordedRequest as R,
|
|
158
|
+
export type { FrameError as F, PageSnapshot as P, RecordedRequest as R, WebViewInfo as W, WxaTestApi as a };
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { d as MockRequest, j as FrameKind, a as ApiHandler, b as ApiResult, R as RouteHandler } from './setup-
|
|
1
|
+
import { d as MockRequest, j as FrameKind, a as ApiHandler, b as ApiResult, R as RouteHandler } from './setup-D0ubZt2C.mjs';
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
4
|
* 网络 API:wx.request / downloadFile / uploadFile / connectSocket
|
|
@@ -16,6 +16,28 @@ interface RecordedRequest extends MockRequest {
|
|
|
16
16
|
routedBy: string | null;
|
|
17
17
|
}
|
|
18
18
|
|
|
19
|
+
/**
|
|
20
|
+
* web-view 组件背后的原生网页视图
|
|
21
|
+
*
|
|
22
|
+
* 渲染层的 web-view 组件调 insertHTMLWebView 占位,updateHTMLWebView 设置地址和位置,
|
|
23
|
+
* 销毁时 removeHTMLWebView;加载进度通过渲染层的 onWebviewStartLoad / onWebviewFinishLoad
|
|
24
|
+
* 告诉组件,组件据此触发 bindload。
|
|
25
|
+
*
|
|
26
|
+
* 默认把网页放在所在页面渲染层里的 iframe 中,跟着页面显示、隐藏和关闭。这有两个限制:
|
|
27
|
+
* - 设置了 X-Frame-Options 或 CSP frame-ancestors 的网站不允许被嵌入,这类网页显示不出来
|
|
28
|
+
* - 网页和宿主域名不同时,浏览器按跨站嵌入处理:SameSite 为 Lax、Strict 或没写的 Cookie 存不下、也不发送,
|
|
29
|
+
* 网页的登录态因此失效。微信里 web-view 是独立的原生网页视图,没有这个问题
|
|
30
|
+
*
|
|
31
|
+
* 新窗口模式(--webview-window)把网页放到新窗口里打开,网页是顶层页面,绕开这两个限制,见 WebViewWindows
|
|
32
|
+
*/
|
|
33
|
+
|
|
34
|
+
/** web-view 当前显示的网页,供测试 API 查询 */
|
|
35
|
+
interface WebViewInfo {
|
|
36
|
+
src: string;
|
|
37
|
+
/** 新窗口模式下网页所在窗口的 name;iframe 模式为 null */
|
|
38
|
+
windowName: string | null;
|
|
39
|
+
}
|
|
40
|
+
|
|
19
41
|
interface FrameError {
|
|
20
42
|
kind: FrameKind;
|
|
21
43
|
webviewId: number;
|
|
@@ -44,6 +66,11 @@ interface WxaTestApi {
|
|
|
44
66
|
currentPage(): PageSnapshot | null;
|
|
45
67
|
/** 整个页面栈,栈底在前 */
|
|
46
68
|
pageStack(): PageSnapshot[];
|
|
69
|
+
/**
|
|
70
|
+
* 当前页里设置过 src 的 web-view,按创建顺序;小程序启动前为空数组。
|
|
71
|
+
* 新窗口模式下 windowName 是网页所在窗口的 name,可以用它找到这个窗口;iframe 模式下为 null
|
|
72
|
+
*/
|
|
73
|
+
webViews(): WebViewInfo[];
|
|
47
74
|
/**
|
|
48
75
|
* 等到指定页面成为当前页,已经是当前页时立即返回
|
|
49
76
|
* @param path 页面路径,如 pages/index/index,开头的 / 可有可无
|
|
@@ -128,4 +155,4 @@ interface WxaTestApi {
|
|
|
128
155
|
errors(): FrameError[];
|
|
129
156
|
}
|
|
130
157
|
|
|
131
|
-
export type { FrameError as F, PageSnapshot as P, RecordedRequest as R,
|
|
158
|
+
export type { FrameError as F, PageSnapshot as P, RecordedRequest as R, WebViewInfo as W, WxaTestApi as a };
|
package/dist/web.d.mts
ADDED
|
@@ -0,0 +1,270 @@
|
|
|
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
|
+
/** web-view 的网页在新窗口打开,见 api/webView.ts 的 WebViewWindows */
|
|
37
|
+
webViewWindow?: boolean;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* 把小程序项目构建成官方基础库能直接加载的形式
|
|
42
|
+
*
|
|
43
|
+
* 逻辑层(appservice):
|
|
44
|
+
* 1. 裁剪版 $gwx(wcc -xc),基础库用它了解组件的节点结构
|
|
45
|
+
* 2. 每个 JS 文件单独一个 define("x.js", fn) 脚本(便于在 DevTools 里按原文件调试)
|
|
46
|
+
* 3. bootstrap:注册 __wxAppCode__ 的 json/wxml(serviceTemplates,热更新时单独下发),
|
|
47
|
+
* require("app.js"),再依次 require 组件和页面
|
|
48
|
+
*
|
|
49
|
+
* 渲染层(page-frame):
|
|
50
|
+
* 1. 完整版 $gwx(wcc -cc)与每个页面/组件的 __wxAppCode__ json / wxml(pageTemplates)
|
|
51
|
+
* 2. wcsc 的公共样式运行时 + app.wxss,与每个页面/组件的 __wxAppCode__ wxss(pageStyles)。
|
|
52
|
+
* 开启 less / sass 编译插件时,先把 .less / .scss / .sass 编译成 .wxss(见 StyleMirror)
|
|
53
|
+
* 两部分在热更新时分别下发
|
|
54
|
+
* 样式和模板里的 env(safe-area-inset-*) 改写成 CSS 变量,见 rewriteSafeAreaInsets
|
|
55
|
+
*
|
|
56
|
+
* Worker:workers 目录下的 JS 不进逻辑层,同样包装成 define 脚本,由 Worker 入口(server/html.ts 的 workerScript)加载
|
|
57
|
+
*/
|
|
58
|
+
|
|
59
|
+
interface BuildResult {
|
|
60
|
+
version: number;
|
|
61
|
+
wxConfig: Record<string, any>;
|
|
62
|
+
/** 所有 JS 模块 id(如 "pages/index/index.js"),逻辑层按此顺序加载 define 脚本 */
|
|
63
|
+
modules: string[];
|
|
64
|
+
/** workers 目录下的 JS 模块 id,Worker 按此顺序加载 define 脚本 */
|
|
65
|
+
workerModules: string[];
|
|
66
|
+
/** 逻辑层的 $gwx 与 __wxAppCode__ json/wxml,不含 require */
|
|
67
|
+
serviceTemplates: string;
|
|
68
|
+
serviceBootstrap: string;
|
|
69
|
+
pageFrame: string;
|
|
70
|
+
/** 渲染层的 $gwx 与 __wxAppCode__ json/wxml,不含样式(热更新时单独下发) */
|
|
71
|
+
pageTemplates: string;
|
|
72
|
+
/** 渲染层的样式:公共样式立即注入,页面和组件的样式注册到 __wxAppCode__(热更新时单独下发) */
|
|
73
|
+
pageStyles: string;
|
|
74
|
+
pages: string[];
|
|
75
|
+
components: string[];
|
|
76
|
+
durationMs: number;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
/**
|
|
80
|
+
* 开发服务器
|
|
81
|
+
*
|
|
82
|
+
* / 宿主页面
|
|
83
|
+
* /__wxa__/app-info.json 构建信息(__wxConfig、页面列表、设备参数、setup)
|
|
84
|
+
* /__wxa__/setup.js 编译后的 setup 文件
|
|
85
|
+
* /__wxa__/appservice.html 逻辑层
|
|
86
|
+
* /__wxa__/webview/<page>.html 渲染层(路径与页面一致,wxml 里的相对资源路径因此能正确解析)
|
|
87
|
+
* /__wxa__/module/<file>.js 单个业务 JS 模块(含 workers 目录下的)
|
|
88
|
+
* /__wxa__/worker.js?id= Worker 的入口
|
|
89
|
+
* /__wxa__/service-templates.js、page-templates.js 两层的模板(热更新时重新下发)
|
|
90
|
+
* /__wxa__/page-styles.js 渲染层的样式(热更新时重新下发)
|
|
91
|
+
* /__baselib__/* 官方基础库
|
|
92
|
+
* /__wxa__/proxy/<协议>/<域名><路径> 网络代理,如 /__wxa__/proxy/https/api.example.com/a?b=1
|
|
93
|
+
* /__wxa__/mock/<协议>/<域名><路径> 被拦截的请求在 Network 面板里的地址,由 Service Worker(runtime/sw.js)返回响应
|
|
94
|
+
* /__wxa__/fs/<会话> 文件系统接口(FileSystemManager),每个浏览器会话一份文件,会话标识见 runtime/fileSession.ts
|
|
95
|
+
* /__wxa__/tmp/<会话> 临时文件:POST ?type=png 保存,返回可直接访问的地址(GET 支持分段请求);对该地址 HEAD 查大小、DELETE 删除
|
|
96
|
+
* /__wxa__/usr/<会话>/<路径> 用户目录(USER_DATA_PATH)下的文件,image 等组件和 uploadFile 按地址读取
|
|
97
|
+
* /__wxa__/region/<kind> 地区选择器用的行政区划数据(districts / streets),取自本机开发者工具
|
|
98
|
+
* /__wxa__/api/* --devtools-login:wx.login 的 code、手机号,服务市场、插件的请求转发,只允许本机访问
|
|
99
|
+
* /__wxa__/ws 文件变化通知:热更新(hot)或整页刷新(reload);开启 forwardConsole 时浏览器从这里发来报错
|
|
100
|
+
* middlewares / 扩展挂载的路径 排在 runner 自己的路由之前
|
|
101
|
+
* 其余路径 小程序目录下的静态资源
|
|
102
|
+
*/
|
|
103
|
+
|
|
104
|
+
/** 注入每个渲染层页面的脚本,src 与 content 二选一 */
|
|
105
|
+
type WebviewScript = ({
|
|
106
|
+
src: string;
|
|
107
|
+
content?: never;
|
|
108
|
+
} | {
|
|
109
|
+
content: string;
|
|
110
|
+
src?: never;
|
|
111
|
+
}) & {
|
|
112
|
+
/**
|
|
113
|
+
* 'head':在基础库(WAWebview.js)之前执行,用于要赶在基础库之前注册事件监听的脚本,执行时还没有 document.body;
|
|
114
|
+
* 'body'(默认):在 <body> 开头、页面开始渲染之前执行。不能放在 <body> 末尾:基础库渲染时会换掉 body,
|
|
115
|
+
* 之后才解析到的脚本落在脱离文档的旧 body 里,不会执行
|
|
116
|
+
*/
|
|
117
|
+
position?: 'head' | 'body';
|
|
118
|
+
};
|
|
119
|
+
|
|
120
|
+
/**
|
|
121
|
+
* 插件代码的数据结构与页面查找,下载见 plugins.ts。
|
|
122
|
+
* 不依赖 Node:查看器的 Service Worker 也按同样的结构生成页面
|
|
123
|
+
*/
|
|
124
|
+
|
|
125
|
+
interface PluginCode {
|
|
126
|
+
/** app.json 里的引用名,plugin://<alias>/页面名 */
|
|
127
|
+
alias: string;
|
|
128
|
+
/** 插件 appid */
|
|
129
|
+
provider: string;
|
|
130
|
+
version: string;
|
|
131
|
+
/** 包内路径(/ 开头)→ 内容 */
|
|
132
|
+
files: Map<string, Uint8Array>;
|
|
133
|
+
/** 插件页面的路径,如 __plugin__/wx…/pages/index/index */
|
|
134
|
+
pages: string[];
|
|
135
|
+
/** 插件页面的配置,键同 __wxConfig.page(路径加 .html) */
|
|
136
|
+
pageConfigs: Record<string, unknown>;
|
|
137
|
+
}
|
|
138
|
+
/** 构建结果加上用到的插件:插件页面并入 pages,配置并入 __wxConfig.page */
|
|
139
|
+
interface AppBuild extends BuildResult {
|
|
140
|
+
plugins: PluginCode[];
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
/**
|
|
144
|
+
* 小程序页面与代码的路由:逻辑层、子上下文、渲染层的 HTML,业务模块、模板、样式和插件代码
|
|
145
|
+
*
|
|
146
|
+
* 开发服务器和查看器(wxapack)的 Service Worker 共用这一份,两边生成的页面才不会走样,所以不依赖 Node。
|
|
147
|
+
* app-info、setup、静态资源、文件接口等和运行环境有关的路由各自实现。
|
|
148
|
+
*/
|
|
149
|
+
|
|
150
|
+
declare const DEFAULT_DEVICE: DeviceProfile;
|
|
151
|
+
interface AppSource {
|
|
152
|
+
build: AppBuild;
|
|
153
|
+
/** 业务模块的 define 脚本,id 已确认在 modules 或 workerModules 里 */
|
|
154
|
+
moduleScript(id: string): string;
|
|
155
|
+
baseLib: {
|
|
156
|
+
version: string;
|
|
157
|
+
hasWorker: boolean;
|
|
158
|
+
};
|
|
159
|
+
/** 新版基础库的隔离上下文,见 html.ts 的 appserviceHtml */
|
|
160
|
+
isolated: boolean;
|
|
161
|
+
/** 打开基础库的热更新开关 */
|
|
162
|
+
hot: boolean;
|
|
163
|
+
webviewScripts?: WebviewScript[];
|
|
164
|
+
}
|
|
165
|
+
interface RouteResponse {
|
|
166
|
+
status: number;
|
|
167
|
+
/** express 的 res.type() 能识别的写法:'html'、'js'、'text' 或带点的扩展名;在 Service Worker 里用 mimeType() 换成 Content-Type */
|
|
168
|
+
type: string;
|
|
169
|
+
body: string | Uint8Array;
|
|
170
|
+
}
|
|
171
|
+
/** @returns 不归这里管、或请求的页面和文件不存在时为 null,交给后面的路由 */
|
|
172
|
+
declare function routeApp(source: AppSource, url: URL): RouteResponse | null;
|
|
173
|
+
/** RouteResponse.type 或文件扩展名对应的 Content-Type;认不出的按二进制处理 */
|
|
174
|
+
declare function mimeType(type: string): string;
|
|
175
|
+
/** 带点的扩展名,没有时为空串 */
|
|
176
|
+
declare function extname(filePath: string): string;
|
|
177
|
+
|
|
178
|
+
/**
|
|
179
|
+
* 宿主、逻辑层、渲染层的 HTML,以及 Worker 的入口脚本
|
|
180
|
+
*
|
|
181
|
+
* 不依赖 Node:查看器的 Service Worker 也用这些函数生成页面
|
|
182
|
+
*/
|
|
183
|
+
|
|
184
|
+
declare function hostHtml(): string;
|
|
185
|
+
|
|
186
|
+
/** 文件 API、下载、上传和资源 URL 共用这些字节;不依赖 Node,以便 Service Worker 也能直接使用。 */
|
|
187
|
+
interface FsNode {
|
|
188
|
+
dir: boolean;
|
|
189
|
+
data: Uint8Array;
|
|
190
|
+
mtime: number;
|
|
191
|
+
etag: string;
|
|
192
|
+
}
|
|
193
|
+
/** 基础库会往 http://usr/ 写运行日志;业务代码也可以通过 FileSystemManager 读写 */
|
|
194
|
+
declare class FileStore {
|
|
195
|
+
private readonly etagPrefix;
|
|
196
|
+
private version;
|
|
197
|
+
private nodes;
|
|
198
|
+
private readonly roots;
|
|
199
|
+
/** @param roots 预先创建的目录(如用户目录)。rmdir 不能删除它们和它们的上级目录:删掉之后再写 USER_DATA_PATH 都会失败 */
|
|
200
|
+
constructor(roots?: string[]);
|
|
201
|
+
normalize(filePath: string): string;
|
|
202
|
+
stat(filePath: string): FsNode | undefined;
|
|
203
|
+
mkdir(dirPath: string, recursive?: boolean): void;
|
|
204
|
+
write(filePath: string, input: string | Uint8Array, append?: boolean): void;
|
|
205
|
+
read(filePath: string): Uint8Array;
|
|
206
|
+
readdir(dirPath: string): string[];
|
|
207
|
+
remove(filePath: string, options: {
|
|
208
|
+
dir: boolean;
|
|
209
|
+
recursive?: boolean;
|
|
210
|
+
}): void;
|
|
211
|
+
/** 文件 API 经开发服务器调用的操作,参数和返回值的字段名与基础库一致 */
|
|
212
|
+
execute(operation: string, args: any): Record<string, any>;
|
|
213
|
+
private readonly operations;
|
|
214
|
+
private writeEncoded;
|
|
215
|
+
private existing;
|
|
216
|
+
private assertNotRoot;
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
/**
|
|
220
|
+
* 网络代理:浏览器端的 wx.request 经由这里转发到真实服务器
|
|
221
|
+
*
|
|
222
|
+
* - 原地址写在路径里:/__wxa__/proxy/https/api.example.com/a?b=1(见 networkPanel.ts)
|
|
223
|
+
* - 绕开 CORS
|
|
224
|
+
* - 小程序设置的请求头放在 x-wxa-headers(JSON)里传过来,
|
|
225
|
+
* 这样 cookie / referer / user-agent 等浏览器禁止设置的头也能带上
|
|
226
|
+
* - 响应头和 set-cookie 以 URL 编码的 JSON 返回,浏览器端可以完整读取
|
|
227
|
+
*
|
|
228
|
+
* 只用标准 Fetch API:开发服务器(proxy.ts)和其他支持 Fetch API 的运行时共用。
|
|
229
|
+
*/
|
|
230
|
+
declare function proxyFetch(request: Request, options?: {
|
|
231
|
+
fetch?: typeof fetch;
|
|
232
|
+
isAllowed?: (url: URL) => boolean;
|
|
233
|
+
}): Promise<Response>;
|
|
234
|
+
|
|
235
|
+
/**
|
|
236
|
+
* 小程序的请求在浏览器 Network 面板里的样子,宿主、Service Worker 和开发服务器共用
|
|
237
|
+
*
|
|
238
|
+
* 原地址放在路径里:/__wxa__/proxy/https/api.example.com/user/info?id=1。Name 列显示接口名(info?id=1),
|
|
239
|
+
* 按域名、路径过滤也直接可用;放在查询参数里时每一行都是 proxy?url=https%3A%2F%2F…,分不出是哪个接口。
|
|
240
|
+
*
|
|
241
|
+
* - 经开发服务器转发的请求:/__wxa__/proxy/…
|
|
242
|
+
* - 被拦截规则拦下的请求:/__wxa__/mock/…,由 Service Worker 返回规则给出的响应,只用于显示(见 sw.ts)
|
|
243
|
+
*/
|
|
244
|
+
|
|
245
|
+
declare const PROXY_PREFIX = "/__wxa__/proxy/";
|
|
246
|
+
declare const MOCK_PREFIX = "/__wxa__/mock/";
|
|
247
|
+
/** 显示被拦截请求的 fetch 带上这个头,Service Worker 凭它向宿主要对应的响应 */
|
|
248
|
+
declare const MOCK_ID_HEADER = "x-wxa-mock-id";
|
|
249
|
+
/** Service Worker 向宿主要响应时发的消息,附带一个 MessagePort,宿主从这个端口回复 MockReply */
|
|
250
|
+
interface MockQuery {
|
|
251
|
+
type: 'wxa-mock-response';
|
|
252
|
+
id: string;
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
/**
|
|
256
|
+
* 被拦截的 wx.request 在 Network 面板里的响应:Service Worker 向发出请求的页面要拦截规则给出的结果。
|
|
257
|
+
* 开发服务器的 sw.ts 和查看器的 packSw.ts 共用
|
|
258
|
+
*/
|
|
259
|
+
|
|
260
|
+
interface MockClient {
|
|
261
|
+
postMessage(message: MockQuery, transfer: Transferable[]): void;
|
|
262
|
+
}
|
|
263
|
+
/** 向发起请求的页面索取拦截响应;页面失效或响应无法表示时让 Network 面板显示请求失败。 */
|
|
264
|
+
declare function mockedResponse(client: MockClient | undefined, id: string): Promise<Response>;
|
|
265
|
+
|
|
266
|
+
/** setup 打包时对 wxa-runner-core/setup 的替换:开发服务器和在浏览器里编译 setup 的宿主(如查看器)共用同一实现;defineSetup 只提供类型提示,运行时原样返回。 */
|
|
267
|
+
declare const SETUP_MODULE = "@open-wxa/wxa-runner-core/setup";
|
|
268
|
+
declare const SETUP_MODULE_SOURCE = "export function defineSetup(setup) { return setup; }";
|
|
269
|
+
|
|
270
|
+
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 };
|