@weapp-vite/web 1.6.0 → 2.0.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/README.md +22 -0
- package/dist/css/wxss.mjs +2 -1
- package/dist/css/wxss.mjs.map +1 -1
- package/dist/plugin/hostTypes.d.mts +74 -0
- package/dist/plugin/index.d.mts +2 -74
- package/dist/plugin/index.mjs +9 -2
- package/dist/plugin/index.mjs.map +1 -1
- package/dist/plugin/sfcHmr.mjs +19 -0
- package/dist/plugin/sfcHmr.mjs.map +1 -0
- package/dist/plugin/vueSfc.mjs +12 -9
- package/dist/plugin/vueSfc.mjs.map +1 -1
- package/dist/runtime/appStyle.mjs +25 -0
- package/dist/runtime/appStyle.mjs.map +1 -0
- package/dist/runtime/component/element.mjs +39 -19
- package/dist/runtime/component/element.mjs.map +1 -1
- package/dist/runtime/component/events.mjs +34 -3
- package/dist/runtime/component/events.mjs.map +1 -1
- package/dist/runtime/component/publicInstance.mjs +7 -3
- package/dist/runtime/component/publicInstance.mjs.map +1 -1
- package/dist/runtime/component/state.mjs +7 -0
- package/dist/runtime/component/state.mjs.map +1 -1
- package/dist/runtime/component/types.d.mts +2 -0
- package/dist/runtime/component/utils.mjs +23 -3
- package/dist/runtime/component/utils.mjs.map +1 -1
- package/dist/runtime/componentEvents.mjs +37 -0
- package/dist/runtime/componentEvents.mjs.map +1 -0
- package/dist/runtime/eventBinding.mjs +5 -2
- package/dist/runtime/eventBinding.mjs.map +1 -1
- package/dist/runtime/legacyTemplate/dom.mjs +2 -7
- package/dist/runtime/legacyTemplate/dom.mjs.map +1 -1
- package/dist/runtime/nativeComponents/canvas/index.mjs +12 -3
- package/dist/runtime/nativeComponents/canvas/index.mjs.map +1 -1
- package/dist/runtime/polyfill/routeRuntime.d.mts +1 -1
- package/dist/runtime/polyfill/routeRuntime.mjs +5 -1
- package/dist/runtime/polyfill/routeRuntime.mjs.map +1 -1
- package/dist/runtime/renderContext.mjs +3 -2
- package/dist/runtime/renderContext.mjs.map +1 -1
- package/dist/runtime/wevu.mjs +2 -0
- package/dist/runtime/wevu.mjs.map +1 -1
- package/dist/shared/wxml.mjs +5 -1
- package/dist/shared/wxml.mjs.map +1 -1
- package/package.json +14 -12
|
@@ -17,6 +17,19 @@ function cloneValue(value) {
|
|
|
17
17
|
if (value && typeof value === "object") return { ...value };
|
|
18
18
|
return value;
|
|
19
19
|
}
|
|
20
|
+
function cloneCommittedValue(value, snapshots = /* @__PURE__ */ new WeakMap()) {
|
|
21
|
+
if (value === null || typeof value !== "object") return value;
|
|
22
|
+
if (!Array.isArray(value)) {
|
|
23
|
+
const prototype = Object.getPrototypeOf(value);
|
|
24
|
+
if (prototype !== Object.prototype && prototype !== null) return value;
|
|
25
|
+
}
|
|
26
|
+
const existing = snapshots.get(value);
|
|
27
|
+
if (existing) return existing;
|
|
28
|
+
const snapshot = cloneValue(value);
|
|
29
|
+
snapshots.set(value, snapshot);
|
|
30
|
+
for (const key of Object.keys(snapshot)) snapshot[key] = cloneCommittedValue(snapshot[key], snapshots);
|
|
31
|
+
return snapshot;
|
|
32
|
+
}
|
|
20
33
|
function parseDataPath(path) {
|
|
21
34
|
return path.replace(ARRAY_INDEX_PATH_RE, ".$1").split(".").map((segment) => segment.trim()).filter((segment) => segment && !UNSAFE_PATH_SEGMENTS.has(segment));
|
|
22
35
|
}
|
|
@@ -34,13 +47,20 @@ function resolveDataPath(target, segments) {
|
|
|
34
47
|
}
|
|
35
48
|
return current;
|
|
36
49
|
}
|
|
37
|
-
function assignDataPath(target, segments, value) {
|
|
50
|
+
function assignDataPath(target, segments, value, copiedContainers) {
|
|
38
51
|
if (!segments.length) return;
|
|
39
52
|
let current = target;
|
|
40
53
|
for (let index = 0; index < segments.length - 1; index += 1) {
|
|
41
54
|
const segment = normalizePathSegment(segments[index]);
|
|
42
55
|
const nextSegment = segments[index + 1];
|
|
43
|
-
|
|
56
|
+
const next = current[segment];
|
|
57
|
+
if (next == null || typeof next !== "object") {
|
|
58
|
+
current[segment] = createPathContainer(nextSegment);
|
|
59
|
+
copiedContainers?.add(current[segment]);
|
|
60
|
+
} else if (!copiedContainers?.has(next)) {
|
|
61
|
+
current[segment] = cloneValue(next);
|
|
62
|
+
copiedContainers?.add(current[segment]);
|
|
63
|
+
}
|
|
44
64
|
current = current[segment];
|
|
45
65
|
}
|
|
46
66
|
current[normalizePathSegment(segments[segments.length - 1])] = value;
|
|
@@ -70,5 +90,5 @@ function coerceValue(value, type) {
|
|
|
70
90
|
}
|
|
71
91
|
|
|
72
92
|
//#endregion
|
|
73
|
-
export { assignDataPath, cloneValue, coerceValue, hyphenate, parseDataPath, resolveDataPath, toCamelCase };
|
|
93
|
+
export { assignDataPath, cloneCommittedValue, cloneValue, coerceValue, hyphenate, parseDataPath, resolveDataPath, toCamelCase };
|
|
74
94
|
//# sourceMappingURL=utils.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.mjs","names":[],"sources":["../../../src/runtime/component/utils.ts"],"sourcesContent":["import type { PropertyOption } from './types'\n\nconst ARRAY_INDEX_PATH_RE = /\\[(\\d+)\\]/g\nconst ARRAY_INDEX_SEGMENT_RE = /^\\d+$/\nconst UNSAFE_PATH_SEGMENTS = new Set(['__proto__', 'constructor', 'prototype'])\n\nexport function hyphenate(name: string) {\n return name.replace(/([A-Z])/g, (_, char: string) => `-${char.toLowerCase()}`)\n}\n\nexport function toCamelCase(name: string) {\n return name.replace(/-([a-z])/g, (_, char: string) => char.toUpperCase())\n}\n\nexport function cloneValue(value: any) {\n if (Array.isArray(value)) {\n return value.slice()\n }\n if (value && typeof value === 'object') {\n return { ...value }\n }\n return value\n}\n\nexport function parseDataPath(path: string) {\n return path\n .replace(ARRAY_INDEX_PATH_RE, '.$1')\n .split('.')\n .map(segment => segment.trim())\n .filter(segment => segment && !UNSAFE_PATH_SEGMENTS.has(segment))\n}\n\nfunction normalizePathSegment(segment: string) {\n return ARRAY_INDEX_SEGMENT_RE.test(segment) ? Number(segment) : segment\n}\n\nfunction createPathContainer(nextSegment: string | undefined) {\n return nextSegment && ARRAY_INDEX_SEGMENT_RE.test(nextSegment) ? [] : {}\n}\n\nexport function resolveDataPath(target: Record<string, any>, segments: string[]) {\n let current: any = target\n for (const segment of segments) {\n if (current == null) {\n return undefined\n }\n current = current[normalizePathSegment(segment)]\n }\n return current\n}\n\nexport function assignDataPath(target: Record<string, any>, segments: string[], value: unknown) {\n if (!segments.length) {\n return\n }\n let current: any = target\n for (let index = 0; index < segments.length - 1; index += 1) {\n const segment = normalizePathSegment(segments[index]!)\n const nextSegment = segments[index + 1]\n
|
|
1
|
+
{"version":3,"file":"utils.mjs","names":[],"sources":["../../../src/runtime/component/utils.ts"],"sourcesContent":["import type { PropertyOption } from './types'\n\nconst ARRAY_INDEX_PATH_RE = /\\[(\\d+)\\]/g\nconst ARRAY_INDEX_SEGMENT_RE = /^\\d+$/\nconst UNSAFE_PATH_SEGMENTS = new Set(['__proto__', 'constructor', 'prototype'])\n\nexport function hyphenate(name: string) {\n return name.replace(/([A-Z])/g, (_, char: string) => `-${char.toLowerCase()}`)\n}\n\nexport function toCamelCase(name: string) {\n return name.replace(/-([a-z])/g, (_, char: string) => char.toUpperCase())\n}\n\nexport function cloneValue(value: any) {\n if (Array.isArray(value)) {\n return value.slice()\n }\n if (value && typeof value === 'object') {\n return { ...value }\n }\n return value\n}\n\nexport function cloneCommittedValue(value: unknown, snapshots = new WeakMap<object, Record<string, unknown>>()): unknown {\n if (value === null || typeof value !== 'object') {\n return value\n }\n if (!Array.isArray(value)) {\n const prototype = Object.getPrototypeOf(value)\n if (prototype !== Object.prototype && prototype !== null) {\n return value\n }\n }\n const existing = snapshots.get(value)\n if (existing) {\n return existing\n }\n const snapshot: Record<string, unknown> = cloneValue(value)\n snapshots.set(value, snapshot)\n for (const key of Object.keys(snapshot)) {\n snapshot[key] = cloneCommittedValue(snapshot[key], snapshots)\n }\n return snapshot\n}\n\nexport function parseDataPath(path: string) {\n return path\n .replace(ARRAY_INDEX_PATH_RE, '.$1')\n .split('.')\n .map(segment => segment.trim())\n .filter(segment => segment && !UNSAFE_PATH_SEGMENTS.has(segment))\n}\n\nfunction normalizePathSegment(segment: string) {\n return ARRAY_INDEX_SEGMENT_RE.test(segment) ? Number(segment) : segment\n}\n\nfunction createPathContainer(nextSegment: string | undefined) {\n return nextSegment && ARRAY_INDEX_SEGMENT_RE.test(nextSegment) ? [] : {}\n}\n\nexport function resolveDataPath(target: Record<string, any>, segments: string[]) {\n let current: any = target\n for (const segment of segments) {\n if (current == null) {\n return undefined\n }\n current = current[normalizePathSegment(segment)]\n }\n return current\n}\n\nexport function assignDataPath(target: Record<string, any>, segments: string[], value: unknown, copiedContainers?: WeakSet<object>) {\n if (!segments.length) {\n return\n }\n let current: any = target\n for (let index = 0; index < segments.length - 1; index += 1) {\n const segment = normalizePathSegment(segments[index]!)\n const nextSegment = segments[index + 1]\n const next = current[segment]\n if (next == null || typeof next !== 'object') {\n current[segment] = createPathContainer(nextSegment)\n copiedContainers?.add(current[segment])\n }\n else if (!copiedContainers?.has(next)) {\n // 保留已传给子组件的输入快照,每批只复制一次变更路径上的容器。\n current[segment] = cloneValue(next)\n copiedContainers?.add(current[segment])\n }\n current = current[segment]\n }\n current[normalizePathSegment(segments[segments.length - 1]!)] = value\n}\n\nexport function coerceValue(value: any, type?: PropertyOption['type']) {\n if (type === Boolean) {\n if (value === '' || value === true) {\n return true\n }\n if (value === undefined || value === null || value === false) {\n return false\n }\n if (typeof value === 'string') {\n return value !== 'false'\n }\n return Boolean(value)\n }\n\n if (type === Number) {\n if (value === undefined || value === null) {\n return value\n }\n const numeric = Number(value)\n return Number.isNaN(numeric) ? value : numeric\n }\n\n if (type === Object || type === Array) {\n if (value === undefined || value === null) {\n return value\n }\n if (typeof value === 'string') {\n try {\n return JSON.parse(value)\n }\n catch {\n return value\n }\n }\n return value\n }\n\n return value\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { EVENT_KIND_ALIAS } from "../shared/wxml.mjs";
|
|
2
|
+
|
|
3
|
+
//#region src/runtime/componentEvents.ts
|
|
4
|
+
const componentElements = /* @__PURE__ */ new WeakSet();
|
|
5
|
+
const componentEvents = /* @__PURE__ */ new WeakSet();
|
|
6
|
+
const handlerNames = /* @__PURE__ */ new WeakMap();
|
|
7
|
+
function registerComponentEventTarget(element) {
|
|
8
|
+
componentElements.add(element);
|
|
9
|
+
}
|
|
10
|
+
function markComponentEvent(event) {
|
|
11
|
+
componentEvents.add(event);
|
|
12
|
+
return event;
|
|
13
|
+
}
|
|
14
|
+
function nameRuntimeEventHandler(listener, name) {
|
|
15
|
+
handlerNames.set(listener, name);
|
|
16
|
+
return listener;
|
|
17
|
+
}
|
|
18
|
+
/** 保留 DOM 事件的冒泡行为,仅在框架监听入口区分组件 emit 与浏览器原生事件。 */
|
|
19
|
+
function listenRuntimeEvent(element, name, listener, capture = false) {
|
|
20
|
+
const logicalName = handlerNames.get(listener) ?? name;
|
|
21
|
+
const nativeAlias = EVENT_KIND_ALIAS[logicalName];
|
|
22
|
+
const eventNames = /* @__PURE__ */ new Set([nativeAlias ?? name, logicalName]);
|
|
23
|
+
const dispatch = (event) => {
|
|
24
|
+
if (componentEvents.has(event)) {
|
|
25
|
+
if (event.type !== logicalName) return;
|
|
26
|
+
} else if (componentElements.has(element) && !nativeAlias) return;
|
|
27
|
+
listener.call(element, event);
|
|
28
|
+
};
|
|
29
|
+
for (const eventName of eventNames) element.addEventListener(eventName, dispatch, capture);
|
|
30
|
+
return () => {
|
|
31
|
+
for (const eventName of eventNames) element.removeEventListener(eventName, dispatch, capture);
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
//#endregion
|
|
36
|
+
export { listenRuntimeEvent, markComponentEvent, nameRuntimeEventHandler, registerComponentEventTarget };
|
|
37
|
+
//# sourceMappingURL=componentEvents.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"componentEvents.mjs","names":[],"sources":["../../src/runtime/componentEvents.ts"],"sourcesContent":["import { EVENT_KIND_ALIAS } from '../shared/wxml'\n\nconst componentElements = new WeakSet<Element>()\nconst componentEvents = new WeakSet<Event>()\nconst handlerNames = new WeakMap<EventListener, string>()\n\nexport function registerComponentEventTarget(element: Element) {\n componentElements.add(element)\n}\n\nexport function markComponentEvent<T extends Event>(event: T): T {\n componentEvents.add(event)\n return event\n}\n\nexport function nameRuntimeEventHandler(listener: EventListener, name: string) {\n handlerNames.set(listener, name)\n return listener\n}\n\n/** 保留 DOM 事件的冒泡行为,仅在框架监听入口区分组件 emit 与浏览器原生事件。 */\nexport function listenRuntimeEvent(element: Element, name: string, listener: EventListener, capture = false) {\n const logicalName = handlerNames.get(listener) ?? name\n const nativeAlias = EVENT_KIND_ALIAS[logicalName]\n const eventNames = new Set([nativeAlias ?? name, logicalName])\n const dispatch: EventListener = (event) => {\n if (componentEvents.has(event)) {\n if (event.type !== logicalName) {\n return\n }\n }\n else if (componentElements.has(element) && !nativeAlias) {\n return\n }\n listener.call(element, event)\n }\n for (const eventName of eventNames) {\n element.addEventListener(eventName, dispatch, capture)\n }\n return () => {\n for (const eventName of eventNames) {\n element.removeEventListener(eventName, dispatch, capture)\n }\n }\n}\n"],"mappings":";;;AAEA,MAAM,oCAAoB,IAAI,QAAiB;AAC/C,MAAM,kCAAkB,IAAI,QAAe;AAC3C,MAAM,+BAAe,IAAI,QAA+B;AAExD,SAAgB,6BAA6B,SAAkB;CAC7D,kBAAkB,IAAI,OAAO;AAC/B;AAEA,SAAgB,mBAAoC,OAAa;CAC/D,gBAAgB,IAAI,KAAK;CACzB,OAAO;AACT;AAEA,SAAgB,wBAAwB,UAAyB,MAAc;CAC7E,aAAa,IAAI,UAAU,IAAI;CAC/B,OAAO;AACT;;AAGA,SAAgB,mBAAmB,SAAkB,MAAc,UAAyB,UAAU,OAAO;CAC3G,MAAM,cAAc,aAAa,IAAI,QAAQ,KAAK;CAClD,MAAM,cAAc,iBAAiB;CACrC,MAAM,6BAAa,IAAI,IAAI,CAAC,eAAe,MAAM,WAAW,CAAC;CAC7D,MAAM,YAA2B,UAAU;EACzC,IAAI,gBAAgB,IAAI,KAAK,GAC3B;OAAI,MAAM,SAAS,aACjB;EACF,OAEG,IAAI,kBAAkB,IAAI,OAAO,KAAK,CAAC,aAC1C;EAEF,SAAS,KAAK,SAAS,KAAK;CAC9B;CACA,KAAK,MAAM,aAAa,YACtB,QAAQ,iBAAiB,WAAW,UAAU,OAAO;CAEvD,aAAa;EACX,KAAK,MAAM,aAAa,YACtB,QAAQ,oBAAoB,WAAW,UAAU,OAAO;CAE5D;AACF"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { listenRuntimeEvent } from "./componentEvents.mjs";
|
|
1
2
|
import { nothing } from "lit";
|
|
2
3
|
import { AsyncDirective, PartType, directive } from "lit/async-directive.js";
|
|
3
4
|
|
|
@@ -8,6 +9,7 @@ var RuntimeEventBindingDirective = class extends AsyncDirective {
|
|
|
8
9
|
#eventName;
|
|
9
10
|
#listener;
|
|
10
11
|
#listening = false;
|
|
12
|
+
#dispose;
|
|
11
13
|
constructor(partInfo) {
|
|
12
14
|
super(partInfo);
|
|
13
15
|
if (partInfo.type !== PartType.ELEMENT) throw new TypeError("Runtime event bindings must be used in an element expression.");
|
|
@@ -35,12 +37,13 @@ var RuntimeEventBindingDirective = class extends AsyncDirective {
|
|
|
35
37
|
}
|
|
36
38
|
#addListener() {
|
|
37
39
|
if (!this.isConnected || this.#listening || !this.#element || !this.#eventName || !this.#listener) return;
|
|
38
|
-
this.#
|
|
40
|
+
this.#dispose = listenRuntimeEvent(this.#element, this.#eventName, this.#listener, this.#capture);
|
|
39
41
|
this.#listening = true;
|
|
40
42
|
}
|
|
41
43
|
#removeListener() {
|
|
42
44
|
if (!this.#listening || !this.#element || !this.#eventName || !this.#listener) return;
|
|
43
|
-
this.#
|
|
45
|
+
this.#dispose?.();
|
|
46
|
+
this.#dispose = void 0;
|
|
44
47
|
this.#listening = false;
|
|
45
48
|
}
|
|
46
49
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"eventBinding.mjs","names":[],"sources":["../../src/runtime/eventBinding.ts"],"sourcesContent":["import type { ElementPart, PartInfo } from 'lit/async-directive.js'\nimport { nothing } from 'lit'\nimport { AsyncDirective, directive, PartType } from 'lit/async-directive.js'\n\ninterface RuntimeEventFlags {\n capture?: boolean\n}\n\nclass RuntimeEventBindingDirective extends AsyncDirective {\n #capture = false\n #element?: Element\n #eventName?: string\n #listener?: EventListener\n #listening = false\n\n constructor(partInfo: PartInfo) {\n super(partInfo)\n if (partInfo.type !== PartType.ELEMENT) {\n throw new TypeError('Runtime event bindings must be used in an element expression.')\n }\n }\n\n render(_eventName: string, _listener: EventListener, _flags?: RuntimeEventFlags) {\n return nothing\n }\n\n update(\n part: ElementPart,\n [eventName, listener, flags]: Parameters<this['render']>,\n ) {\n const capture = Boolean(flags?.capture)\n if (\n part.element !== this.#element\n || eventName !== this.#eventName\n || listener !== this.#listener\n || capture !== this.#capture\n ) {\n this.#removeListener()\n this.#element = part.element\n this.#eventName = eventName\n this.#listener = listener\n this.#capture = capture\n this.#addListener()\n }\n return nothing\n }\n\n protected disconnected() {\n this.#removeListener()\n }\n\n protected reconnected() {\n this.#addListener()\n }\n\n #addListener() {\n if (!this.isConnected || this.#listening || !this.#element || !this.#eventName || !this.#listener) {\n return\n }\n this.#
|
|
1
|
+
{"version":3,"file":"eventBinding.mjs","names":[],"sources":["../../src/runtime/eventBinding.ts"],"sourcesContent":["import type { ElementPart, PartInfo } from 'lit/async-directive.js'\nimport { nothing } from 'lit'\nimport { AsyncDirective, directive, PartType } from 'lit/async-directive.js'\nimport { listenRuntimeEvent } from './componentEvents'\n\ninterface RuntimeEventFlags {\n capture?: boolean\n}\n\nclass RuntimeEventBindingDirective extends AsyncDirective {\n #capture = false\n #element?: Element\n #eventName?: string\n #listener?: EventListener\n #listening = false\n #dispose?: () => void\n\n constructor(partInfo: PartInfo) {\n super(partInfo)\n if (partInfo.type !== PartType.ELEMENT) {\n throw new TypeError('Runtime event bindings must be used in an element expression.')\n }\n }\n\n render(_eventName: string, _listener: EventListener, _flags?: RuntimeEventFlags) {\n return nothing\n }\n\n update(\n part: ElementPart,\n [eventName, listener, flags]: Parameters<this['render']>,\n ) {\n const capture = Boolean(flags?.capture)\n if (\n part.element !== this.#element\n || eventName !== this.#eventName\n || listener !== this.#listener\n || capture !== this.#capture\n ) {\n this.#removeListener()\n this.#element = part.element\n this.#eventName = eventName\n this.#listener = listener\n this.#capture = capture\n this.#addListener()\n }\n return nothing\n }\n\n protected disconnected() {\n this.#removeListener()\n }\n\n protected reconnected() {\n this.#addListener()\n }\n\n #addListener() {\n if (!this.isConnected || this.#listening || !this.#element || !this.#eventName || !this.#listener) {\n return\n }\n this.#dispose = listenRuntimeEvent(this.#element, this.#eventName, this.#listener, this.#capture)\n this.#listening = true\n }\n\n #removeListener() {\n if (!this.#listening || !this.#element || !this.#eventName || !this.#listener) {\n return\n }\n this.#dispose?.()\n this.#dispose = undefined\n this.#listening = false\n }\n}\n\nexport const bindRuntimeEvent = directive(RuntimeEventBindingDirective)\n"],"mappings":";;;;;AASA,IAAM,+BAAN,cAA2C,eAAe;CACxD,WAAW;CACX;CACA;CACA;CACA,aAAa;CACb;CAEA,YAAY,UAAoB;EAC9B,MAAM,QAAQ;EACd,IAAI,SAAS,SAAS,SAAS,SAC7B,MAAM,IAAI,UAAU,+DAA+D;CAEvF;CAEA,OAAO,YAAoB,WAA0B,QAA4B;EAC/E,OAAO;CACT;CAEA,OACE,MACA,CAAC,WAAW,UAAU,QACtB;EACA,MAAM,UAAU,QAAQ,OAAO,OAAO;EACtC,IACE,KAAK,YAAY,KAAK,YACnB,cAAc,KAAK,cACnB,aAAa,KAAK,aAClB,YAAY,KAAK,UACpB;GACA,KAAK,gBAAgB;GACrB,KAAK,WAAW,KAAK;GACrB,KAAK,aAAa;GAClB,KAAK,YAAY;GACjB,KAAK,WAAW;GAChB,KAAK,aAAa;EACpB;EACA,OAAO;CACT;CAEA,AAAU,eAAe;EACvB,KAAK,gBAAgB;CACvB;CAEA,AAAU,cAAc;EACtB,KAAK,aAAa;CACpB;CAEA,eAAe;EACb,IAAI,CAAC,KAAK,eAAe,KAAK,cAAc,CAAC,KAAK,YAAY,CAAC,KAAK,cAAc,CAAC,KAAK,WACtF;EAEF,KAAK,WAAW,mBAAmB,KAAK,UAAU,KAAK,YAAY,KAAK,WAAW,KAAK,QAAQ;EAChG,KAAK,aAAa;CACpB;CAEA,kBAAkB;EAChB,IAAI,CAAC,KAAK,cAAc,CAAC,KAAK,YAAY,CAAC,KAAK,cAAc,CAAC,KAAK,WAClE;EAEF,KAAK,WAAW;EAChB,KAAK,WAAW;EAChB,KAAK,aAAa;CACpB;AACF;AAEA,MAAa,mBAAmB,UAAU,4BAA4B"}
|
|
@@ -1,14 +1,9 @@
|
|
|
1
|
-
import { CONTROL_ATTRS, hasControlAttribute, normalizeAttributeName, resolveControlAttributeValue } from "../../shared/wxml.mjs";
|
|
1
|
+
import { CONTROL_ATTRS, EVENT_KIND_ALIAS, hasControlAttribute, normalizeAttributeName, resolveControlAttributeValue } from "../../shared/wxml.mjs";
|
|
2
2
|
import { MINI_PROGRAM_EVENT_ATTRIBUTE_PREFIX, MINI_PROGRAM_EVENT_FLAG_ATTRIBUTE_PREFIX, encodeEventAttributeName } from "../component/constants.mjs";
|
|
3
3
|
import { escapeAttribute, resolveAttributeValue } from "./expression.mjs";
|
|
4
4
|
|
|
5
5
|
//#region src/runtime/legacyTemplate/dom.ts
|
|
6
6
|
const EVENT_PREFIX_RE = /^(bind|catch|mut-bind|capture-bind|capture-catch)([\w-]+)$/;
|
|
7
|
-
const EVENT_KIND_ALIAS = {
|
|
8
|
-
tap: "click",
|
|
9
|
-
longtap: "contextmenu",
|
|
10
|
-
longpress: "contextmenu"
|
|
11
|
-
};
|
|
12
7
|
const EVENT_PREFIX_FLAGS = {
|
|
13
8
|
"bind": {},
|
|
14
9
|
"catch": { catch: true },
|
|
@@ -61,7 +56,7 @@ function buildAttributeString(attribs, scope) {
|
|
|
61
56
|
const eventInfo = parseEventAttribute(name);
|
|
62
57
|
if (eventInfo) {
|
|
63
58
|
const normalizedEvent = eventInfo.rawEvent.toLowerCase();
|
|
64
|
-
const runtimeEvent = EVENT_KIND_ALIAS[normalizedEvent]
|
|
59
|
+
const runtimeEvent = EVENT_KIND_ALIAS[normalizedEvent] ? normalizedEvent : eventInfo.rawEvent;
|
|
65
60
|
const encodedEvent = encodeEventAttributeName(runtimeEvent);
|
|
66
61
|
const handlerName = resolveAttributeValue(rawValue, scope).trim();
|
|
67
62
|
if (!handlerName) continue;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dom.mjs","names":[],"sources":["../../../src/runtime/legacyTemplate/dom.ts"],"sourcesContent":["import type { Element, Node } from 'domhandler'\nimport type { ExtractForResult, LegacyTemplateScope } from './types'\nimport {\n CONTROL_ATTRS,\n hasControlAttribute,\n normalizeAttributeName,\n resolveControlAttributeValue,\n} from '../../shared/wxml'\nimport {\n encodeEventAttributeName,\n MINI_PROGRAM_EVENT_ATTRIBUTE_PREFIX,\n MINI_PROGRAM_EVENT_FLAG_ATTRIBUTE_PREFIX,\n} from '../component/constants'\nimport { escapeAttribute, resolveAttributeValue } from './expression'\n\nconst EVENT_PREFIX_RE = /^(bind|catch|mut-bind|capture-bind|capture-catch)([\\w-]+)$/\nconst
|
|
1
|
+
{"version":3,"file":"dom.mjs","names":[],"sources":["../../../src/runtime/legacyTemplate/dom.ts"],"sourcesContent":["import type { Element, Node } from 'domhandler'\nimport type { ExtractForResult, LegacyTemplateScope } from './types'\nimport {\n CONTROL_ATTRS,\n EVENT_KIND_ALIAS,\n hasControlAttribute,\n normalizeAttributeName,\n resolveControlAttributeValue,\n} from '../../shared/wxml'\nimport {\n encodeEventAttributeName,\n MINI_PROGRAM_EVENT_ATTRIBUTE_PREFIX,\n MINI_PROGRAM_EVENT_FLAG_ATTRIBUTE_PREFIX,\n} from '../component/constants'\nimport { escapeAttribute, resolveAttributeValue } from './expression'\n\nconst EVENT_PREFIX_RE = /^(bind|catch|mut-bind|capture-bind|capture-catch)([\\w-]+)$/\nconst EVENT_PREFIX_FLAGS: Record<string, { catch?: boolean, capture?: boolean }> = {\n 'bind': {},\n 'catch': { catch: true },\n 'mut-bind': {},\n 'capture-bind': { capture: true },\n 'capture-catch': { capture: true, catch: true },\n}\n\nfunction parseEventAttribute(name: string) {\n const separatorIndex = name.indexOf(':')\n if (separatorIndex >= 0) {\n const prefix = name.slice(0, separatorIndex)\n const rawEvent = name.slice(separatorIndex + 1)\n if (rawEvent && prefix in EVENT_PREFIX_FLAGS) {\n return { prefix, rawEvent }\n }\n return undefined\n }\n const match = EVENT_PREFIX_RE.exec(name)\n if (!match) {\n return undefined\n }\n return { prefix: match[1]!, rawEvent: match[2]! }\n}\n\nexport function extractFor(attribs: Record<string, string>): ExtractForResult {\n const expr = resolveControlAttributeValue(attribs, 'for')\n const restAttribs: Record<string, string> = {}\n const itemName = resolveControlAttributeValue(attribs, 'for-item')?.trim() || 'item'\n let indexName = resolveControlAttributeValue(attribs, 'for-index')?.trim() || 'index'\n\n for (const [key, val] of Object.entries(attribs)) {\n if (CONTROL_ATTRS.has(key)) {\n continue\n }\n restAttribs[key] = val\n }\n\n if (itemName === indexName) {\n indexName = `${indexName}Index`\n }\n\n return {\n expr,\n itemName,\n indexName,\n restAttribs,\n }\n}\n\nexport function buildAttributeString(\n attribs: Record<string, string>,\n scope: LegacyTemplateScope,\n) {\n let result = ''\n for (const [name, rawValue] of Object.entries(attribs)) {\n if (CONTROL_ATTRS.has(name)) {\n continue\n }\n\n const eventInfo = parseEventAttribute(name)\n if (eventInfo) {\n const normalizedEvent = eventInfo.rawEvent.toLowerCase()\n const aliasedEvent = EVENT_KIND_ALIAS[normalizedEvent]\n const runtimeEvent = aliasedEvent ? normalizedEvent : eventInfo.rawEvent\n const encodedEvent = encodeEventAttributeName(runtimeEvent)\n const handlerName = resolveAttributeValue(rawValue, scope).trim()\n if (!handlerName) {\n continue\n }\n const flags = EVENT_PREFIX_FLAGS[eventInfo.prefix]!\n result += ` ${MINI_PROGRAM_EVENT_ATTRIBUTE_PREFIX}${encodedEvent}=\"${escapeAttribute(handlerName)}\"`\n const flagTokens = [\n flags.capture ? 'capture' : '',\n flags.catch ? 'catch' : '',\n ].filter(Boolean)\n if (flagTokens.length) {\n result += ` ${MINI_PROGRAM_EVENT_FLAG_ATTRIBUTE_PREFIX}${encodedEvent}=\"${flagTokens.join(',')}\"`\n }\n continue\n }\n\n const value = resolveAttributeValue(rawValue, scope)\n if (value === '') {\n continue\n }\n const normalizedName = normalizeAttributeName(name)\n result += ` ${normalizedName}=\"${escapeAttribute(value)}\"`\n }\n return result\n}\n\nexport function stripControlAttributes(attribs: Record<string, string>) {\n const result: Record<string, string> = {}\n for (const [name, value] of Object.entries(attribs)) {\n if (!CONTROL_ATTRS.has(name)) {\n result[name] = value\n }\n }\n return result\n}\n\nexport function isConditionalElement(node: Node): node is Element {\n if (node.type !== 'tag') {\n return false\n }\n const attribs = (node as Element).attribs\n return hasControlAttribute(attribs, 'if')\n || hasControlAttribute(attribs, 'elif')\n || hasControlAttribute(attribs, 'else')\n}\n"],"mappings":";;;;;AAgBA,MAAM,kBAAkB;AACxB,MAAM,qBAA6E;CACjF,QAAQ,CAAC;CACT,SAAS,EAAE,OAAO,KAAK;CACvB,YAAY,CAAC;CACb,gBAAgB,EAAE,SAAS,KAAK;CAChC,iBAAiB;EAAE,SAAS;EAAM,OAAO;CAAK;AAChD;AAEA,SAAS,oBAAoB,MAAc;CACzC,MAAM,iBAAiB,KAAK,QAAQ,GAAG;CACvC,IAAI,kBAAkB,GAAG;EACvB,MAAM,SAAS,KAAK,MAAM,GAAG,cAAc;EAC3C,MAAM,WAAW,KAAK,MAAM,iBAAiB,CAAC;EAC9C,IAAI,YAAY,UAAU,oBACxB,OAAO;GAAE;GAAQ;EAAS;EAE5B;CACF;CACA,MAAM,QAAQ,gBAAgB,KAAK,IAAI;CACvC,IAAI,CAAC,OACH;CAEF,OAAO;EAAE,QAAQ,MAAM;EAAK,UAAU,MAAM;CAAI;AAClD;AAEA,SAAgB,WAAW,SAAmD;CAC5E,MAAM,OAAO,6BAA6B,SAAS,KAAK;CACxD,MAAM,cAAsC,CAAC;CAC7C,MAAM,WAAW,6BAA6B,SAAS,UAAU,CAAC,EAAE,KAAK,KAAK;CAC9E,IAAI,YAAY,6BAA6B,SAAS,WAAW,CAAC,EAAE,KAAK,KAAK;CAE9E,KAAK,MAAM,CAAC,KAAK,QAAQ,OAAO,QAAQ,OAAO,GAAG;EAChD,IAAI,cAAc,IAAI,GAAG,GACvB;EAEF,YAAY,OAAO;CACrB;CAEA,IAAI,aAAa,WACf,YAAY,GAAG,UAAU;CAG3B,OAAO;EACL;EACA;EACA;EACA;CACF;AACF;AAEA,SAAgB,qBACd,SACA,OACA;CACA,IAAI,SAAS;CACb,KAAK,MAAM,CAAC,MAAM,aAAa,OAAO,QAAQ,OAAO,GAAG;EACtD,IAAI,cAAc,IAAI,IAAI,GACxB;EAGF,MAAM,YAAY,oBAAoB,IAAI;EAC1C,IAAI,WAAW;GACb,MAAM,kBAAkB,UAAU,SAAS,YAAY;GAEvD,MAAM,eADe,iBAAiB,mBACF,kBAAkB,UAAU;GAChE,MAAM,eAAe,yBAAyB,YAAY;GAC1D,MAAM,cAAc,sBAAsB,UAAU,KAAK,CAAC,CAAC,KAAK;GAChE,IAAI,CAAC,aACH;GAEF,MAAM,QAAQ,mBAAmB,UAAU;GAC3C,UAAU,IAAI,sCAAsC,aAAa,IAAI,gBAAgB,WAAW,EAAE;GAClG,MAAM,aAAa,CACjB,MAAM,UAAU,YAAY,IAC5B,MAAM,QAAQ,UAAU,EAC1B,CAAC,CAAC,OAAO,OAAO;GAChB,IAAI,WAAW,QACb,UAAU,IAAI,2CAA2C,aAAa,IAAI,WAAW,KAAK,GAAG,EAAE;GAEjG;EACF;EAEA,MAAM,QAAQ,sBAAsB,UAAU,KAAK;EACnD,IAAI,UAAU,IACZ;EAEF,MAAM,iBAAiB,uBAAuB,IAAI;EAClD,UAAU,IAAI,eAAe,IAAI,gBAAgB,KAAK,EAAE;CAC1D;CACA,OAAO;AACT;AAEA,SAAgB,uBAAuB,SAAiC;CACtE,MAAM,SAAiC,CAAC;CACxC,KAAK,MAAM,CAAC,MAAM,UAAU,OAAO,QAAQ,OAAO,GAChD,IAAI,CAAC,cAAc,IAAI,IAAI,GACzB,OAAO,QAAQ;CAGnB,OAAO;AACT;AAEA,SAAgB,qBAAqB,MAA6B;CAChE,IAAI,KAAK,SAAS,OAChB,OAAO;CAET,MAAM,UAAW,KAAiB;CAClC,OAAO,oBAAoB,SAAS,IAAI,KACnC,oBAAoB,SAAS,MAAM,KACnC,oBAAoB,SAAS,MAAM;AAC1C"}
|
|
@@ -23,7 +23,9 @@ var WeappCanvas = class extends BaseElement {
|
|
|
23
23
|
disconnectedCallback() {
|
|
24
24
|
if (this.#canvas) unregisterNativeMediaElement(this.#canvas);
|
|
25
25
|
}
|
|
26
|
-
attributeChangedCallback() {
|
|
26
|
+
attributeChangedCallback(name, previous, current) {
|
|
27
|
+
if (previous === current) return;
|
|
28
|
+
if (name === "width" || name === "height") this.#syncSize(name);
|
|
27
29
|
this.#syncAttributes();
|
|
28
30
|
}
|
|
29
31
|
#ensureStructure() {
|
|
@@ -37,12 +39,19 @@ var WeappCanvas = class extends BaseElement {
|
|
|
37
39
|
const canvas = document.createElement("canvas");
|
|
38
40
|
root.append(style, canvas);
|
|
39
41
|
this.#canvas = canvas;
|
|
42
|
+
this.#syncSize();
|
|
43
|
+
}
|
|
44
|
+
#syncSize(dimension) {
|
|
45
|
+
const canvas = this.#canvas;
|
|
46
|
+
if (!canvas) return;
|
|
47
|
+
for (const name of dimension ? [dimension] : ["width", "height"]) {
|
|
48
|
+
const size = resolveCanvasSize(this.getAttribute(name), name === "width" ? 300 : 150);
|
|
49
|
+
if (canvas[name] !== size) canvas[name] = size;
|
|
50
|
+
}
|
|
40
51
|
}
|
|
41
52
|
#syncAttributes() {
|
|
42
53
|
const canvas = this.#canvas;
|
|
43
54
|
if (!canvas) return;
|
|
44
|
-
canvas.width = resolveCanvasSize(this.getAttribute("width"), 300);
|
|
45
|
-
canvas.height = resolveCanvasSize(this.getAttribute("height"), 150);
|
|
46
55
|
canvas.style.touchAction = readBooleanAttribute(this, "disable-scroll") ? "none" : "";
|
|
47
56
|
registerNativeMediaElement("canvas", [this.getAttribute("canvas-id"), this.getAttribute("id")], canvas);
|
|
48
57
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","names":[],"sources":["../../../../src/runtime/nativeComponents/canvas/index.ts"],"sourcesContent":["import { getNativeComponentDescriptor } from '../../../shared/nativeComponents'\nimport { readBooleanAttribute, resolveContainingShadowRoot } from '../helpers'\nimport { registerNativeMediaElement, unregisterNativeMediaElement } from '../mediaRegistry'\nimport { ensureNativeComponentStyle } from '../style'\n\nconst BaseElement = (globalThis.HTMLElement ?? class {}) as typeof HTMLElement\n\nfunction resolveCanvasSize(value: string | null, fallback: number) {\n const size = Number(value)\n return Number.isInteger(size) && size > 0 ? size : fallback\n}\n\nexport class WeappCanvas extends BaseElement {\n static observedAttributes = [...getNativeComponentDescriptor('canvas')!.attributes]\n\n #canvas?: HTMLCanvasElement\n\n get canvasElement() {\n return this.#canvas\n }\n\n connectedCallback() {\n ensureNativeComponentStyle(resolveContainingShadowRoot(this))\n this.#ensureStructure()\n this.#syncAttributes()\n }\n\n disconnectedCallback() {\n if (this.#canvas) {\n unregisterNativeMediaElement(this.#canvas)\n }\n }\n\n attributeChangedCallback() {\n this.#syncAttributes()\n }\n\n #ensureStructure() {\n if (this.#canvas || typeof document === 'undefined') {\n return\n }\n const root = this.shadowRoot ?? this.attachShadow({ mode: 'open' })\n const style = document.createElement('style')\n style.textContent = `\n :host { position: relative; }\n canvas { display: block; }\n `\n const canvas = document.createElement('canvas')\n root.append(style, canvas)\n this.#canvas = canvas\n }\n\n #
|
|
1
|
+
{"version":3,"file":"index.mjs","names":[],"sources":["../../../../src/runtime/nativeComponents/canvas/index.ts"],"sourcesContent":["import { getNativeComponentDescriptor } from '../../../shared/nativeComponents'\nimport { readBooleanAttribute, resolveContainingShadowRoot } from '../helpers'\nimport { registerNativeMediaElement, unregisterNativeMediaElement } from '../mediaRegistry'\nimport { ensureNativeComponentStyle } from '../style'\n\nconst BaseElement = (globalThis.HTMLElement ?? class {}) as typeof HTMLElement\n\nfunction resolveCanvasSize(value: string | null, fallback: number) {\n const size = Number(value)\n return Number.isInteger(size) && size > 0 ? size : fallback\n}\n\nexport class WeappCanvas extends BaseElement {\n static observedAttributes = [...getNativeComponentDescriptor('canvas')!.attributes]\n\n #canvas?: HTMLCanvasElement\n\n get canvasElement() {\n return this.#canvas\n }\n\n connectedCallback() {\n ensureNativeComponentStyle(resolveContainingShadowRoot(this))\n this.#ensureStructure()\n this.#syncAttributes()\n }\n\n disconnectedCallback() {\n if (this.#canvas) {\n unregisterNativeMediaElement(this.#canvas)\n }\n }\n\n attributeChangedCallback(name: string, previous: string | null, current: string | null) {\n if (previous === current) {\n return\n }\n if (name === 'width' || name === 'height') {\n this.#syncSize(name)\n }\n this.#syncAttributes()\n }\n\n #ensureStructure() {\n if (this.#canvas || typeof document === 'undefined') {\n return\n }\n const root = this.shadowRoot ?? this.attachShadow({ mode: 'open' })\n const style = document.createElement('style')\n style.textContent = `\n :host { position: relative; }\n canvas { display: block; }\n `\n const canvas = document.createElement('canvas')\n root.append(style, canvas)\n this.#canvas = canvas\n this.#syncSize()\n }\n\n #syncSize(dimension?: 'width' | 'height') {\n const canvas = this.#canvas\n if (!canvas) {\n return\n }\n // 相同尺寸赋值也会清空位图和绘图状态;尺寸只归对应宿主属性的实际变化所有。\n for (const name of dimension ? [dimension] : ['width', 'height'] as const) {\n const size = resolveCanvasSize(this.getAttribute(name), name === 'width' ? 300 : 150)\n if (canvas[name] !== size) {\n canvas[name] = size\n }\n }\n }\n\n #syncAttributes() {\n const canvas = this.#canvas\n if (!canvas) {\n return\n }\n canvas.style.touchAction = readBooleanAttribute(this, 'disable-scroll') ? 'none' : ''\n registerNativeMediaElement('canvas', [\n this.getAttribute('canvas-id'),\n this.getAttribute('id'),\n ], canvas)\n }\n}\n"],"mappings":";;;;;;AAKA,MAAM,cAAe,WAAW,eAAe,MAAM,CAAC;AAEtD,SAAS,kBAAkB,OAAsB,UAAkB;CACjE,MAAM,OAAO,OAAO,KAAK;CACzB,OAAO,OAAO,UAAU,IAAI,KAAK,OAAO,IAAI,OAAO;AACrD;AAEA,IAAa,cAAb,cAAiC,YAAY;CAC3C,OAAO,qBAAqB,CAAC,GAAG,6BAA6B,QAAQ,CAAC,CAAE,UAAU;CAElF;CAEA,IAAI,gBAAgB;EAClB,OAAO,KAAK;CACd;CAEA,oBAAoB;EAClB,2BAA2B,4BAA4B,IAAI,CAAC;EAC5D,KAAK,iBAAiB;EACtB,KAAK,gBAAgB;CACvB;CAEA,uBAAuB;EACrB,IAAI,KAAK,SACP,6BAA6B,KAAK,OAAO;CAE7C;CAEA,yBAAyB,MAAc,UAAyB,SAAwB;EACtF,IAAI,aAAa,SACf;EAEF,IAAI,SAAS,WAAW,SAAS,UAC/B,KAAK,UAAU,IAAI;EAErB,KAAK,gBAAgB;CACvB;CAEA,mBAAmB;EACjB,IAAI,KAAK,WAAW,OAAO,aAAa,aACtC;EAEF,MAAM,OAAO,KAAK,cAAc,KAAK,aAAa,EAAE,MAAM,OAAO,CAAC;EAClE,MAAM,QAAQ,SAAS,cAAc,OAAO;EAC5C,MAAM,cAAc;;;;EAIpB,MAAM,SAAS,SAAS,cAAc,QAAQ;EAC9C,KAAK,OAAO,OAAO,MAAM;EACzB,KAAK,UAAU;EACf,KAAK,UAAU;CACjB;CAEA,UAAU,WAAgC;EACxC,MAAM,SAAS,KAAK;EACpB,IAAI,CAAC,QACH;EAGF,KAAK,MAAM,QAAQ,YAAY,CAAC,SAAS,IAAI,CAAC,SAAS,QAAQ,GAAY;GACzE,MAAM,OAAO,kBAAkB,KAAK,aAAa,IAAI,GAAG,SAAS,UAAU,MAAM,GAAG;GACpF,IAAI,OAAO,UAAU,MACnB,OAAO,QAAQ;EAEnB;CACF;CAEA,kBAAkB;EAChB,MAAM,SAAS,KAAK;EACpB,IAAI,CAAC,QACH;EAEF,OAAO,MAAM,cAAc,qBAAqB,MAAM,gBAAgB,IAAI,SAAS;EACnF,2BAA2B,UAAU,CACnC,KAAK,aAAa,WAAW,GAC7B,KAAK,aAAa,IAAI,CACxB,GAAG,MAAM;CACX;AACF"}
|
|
@@ -30,7 +30,7 @@ export declare function initializePageRoutes(ids: string[], options?: {
|
|
|
30
30
|
}): void;
|
|
31
31
|
export declare function registerPage<T extends PageRawOptions | undefined>(options: T, meta: RegisterMeta): T;
|
|
32
32
|
export declare function registerComponent<T extends ComponentRawOptions | undefined>(options: T, meta: RegisterMeta): T;
|
|
33
|
-
export declare function registerApp<T extends AppRuntime | undefined>(options: T,
|
|
33
|
+
export declare function registerApp<T extends AppRuntime | undefined>(options: T, meta?: RegisterMeta): T;
|
|
34
34
|
export declare function offAppHide(callback?: AppHideCallback): void;
|
|
35
35
|
export declare function offAppShow(callback?: AppShowCallback): void;
|
|
36
36
|
export declare function onAppHide(callback: AppHideCallback): void;
|
|
@@ -2,6 +2,7 @@ import { slugify } from "../../shared/slugify.mjs";
|
|
|
2
2
|
import { setRuntimeWarningOptions } from "../warning.mjs";
|
|
3
3
|
import { configureTabBar, getTabBarPagePaths, syncTabBarRoute } from "../appShell/tabBar/index.mjs";
|
|
4
4
|
import { configureWebSeo, setupWebResourceHints, syncWebDocumentHead } from "../seo/index.mjs";
|
|
5
|
+
import { setAppStyle } from "../appStyle.mjs";
|
|
5
6
|
import { setButtonFormConfig } from "../button/index.mjs";
|
|
6
7
|
import { setRuntimeExecutionMode } from "../execution.mjs";
|
|
7
8
|
import { defineComponent } from "../component/index.mjs";
|
|
@@ -136,6 +137,7 @@ function registerPage(options, meta) {
|
|
|
136
137
|
const component = augmentPageComponentOptions(normalized.component, existing);
|
|
137
138
|
defineComponent(tag, {
|
|
138
139
|
id: meta.id,
|
|
140
|
+
kind: "page",
|
|
139
141
|
template,
|
|
140
142
|
style: meta.style,
|
|
141
143
|
component
|
|
@@ -151,6 +153,7 @@ function registerPage(options, meta) {
|
|
|
151
153
|
const component = augmentPageComponentOptions(normalized.component, record);
|
|
152
154
|
defineComponent(tag, {
|
|
153
155
|
id: meta.id,
|
|
156
|
+
kind: "page",
|
|
154
157
|
template,
|
|
155
158
|
style: meta.style,
|
|
156
159
|
component
|
|
@@ -184,7 +187,8 @@ function registerComponent(options, meta) {
|
|
|
184
187
|
componentRegistry.set(meta.id, { tag });
|
|
185
188
|
return options;
|
|
186
189
|
}
|
|
187
|
-
function registerApp(options,
|
|
190
|
+
function registerApp(options, meta) {
|
|
191
|
+
setAppStyle(meta?.style ?? "");
|
|
188
192
|
return appLifecycle.register(options);
|
|
189
193
|
}
|
|
190
194
|
function offAppHide(callback) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"routeRuntime.mjs","names":[],"sources":["../../../src/runtime/polyfill/routeRuntime.ts"],"sourcesContent":["import type { WebTabBarConfig } from '../../shared/tabBar'\nimport type { ButtonFormConfig } from '../button'\nimport type { ComponentPublicInstance } from '../component'\nimport type { NavigationBarMetrics } from '../navigationBar'\nimport type { WebResourceHintsConfig, WebSeoConfig } from '../seo'\nimport type { WebViewportConfig } from '../viewport'\nimport type { WebRouteHistoryState, WebRouteTarget, WebRoutingConfig } from './routeRuntime/history'\nimport type { AppHideCallback, AppRuntime, AppShowCallback, ComponentRawOptions, ComponentRecord, NavigateBackOptions, PageRawOptions, PageRecord, RegisterMeta, RouteOptions } from './routeRuntime/options'\nimport { slugify } from '../../shared/slugify'\nimport {\n configureTabBar,\n getTabBarPagePaths,\n syncTabBarRoute,\n} from '../appShell/tabBar'\nimport { setButtonFormConfig } from '../button'\nimport { defineComponent } from '../component'\nimport { setRuntimeExecutionMode } from '../execution'\nimport { ensureNativeComponentsDefined } from '../nativeComponents'\nimport { ensureNavigationBarDefined, setNavigationBarMetrics } from '../navigationBar'\nimport { setupRpx } from '../rpx'\nimport { configureWebSeo, setupWebResourceHints, syncWebDocumentHead } from '../seo'\nimport { setupWebViewport } from '../viewport'\nimport { setRuntimeWarningOptions } from '../warning'\nimport { resolveCurrentPages } from './appState'\nimport { AppLifecycleRuntime } from './routeRuntime/appLifecycle'\nimport { getEntryWebviewId } from './routeRuntime/events'\nimport {\n configureWebRouting,\n getWebHistoryStack,\n readWebRouteTarget,\n syncWebRouting,\n} from './routeRuntime/history'\nimport {\n augmentPageComponentOptions,\n dispatchPageLifetimeToComponents,\n} from './routeRuntime/lifecycle'\nimport {\n normalizeComponentOptions,\n normalizePageOptions,\n} from './routeRuntime/options'\nimport { resolveRouteAction } from './routeRuntime/result'\nimport { PageStackRuntime } from './routeRuntime/stack'\nimport { parsePageUrl } from './routeRuntime/url'\n\nconst pageRegistry = new Map<string, PageRecord>()\nconst componentRegistry = new Map<string, ComponentRecord>()\nlet pageOrder: string[] = []\nlet pageResizeBridgeBound = false\n\nlet pageStack: PageStackRuntime\nconst appLifecycle = new AppLifecycleRuntime(\n () => pageStack?.entries[pageStack.entries.length - 1],\n)\npageStack = new PageStackRuntime(pageRegistry, entry => appLifecycle.ensureLaunched(entry))\n\nfunction syncCurrentWebDocument() {\n const current = pageStack.entries[pageStack.entries.length - 1]\n syncWebDocumentHead({\n route: current?.id,\n title: current ? pageRegistry.get(current.id)?.navigationBar?.title : undefined,\n })\n}\n\nfunction syncCurrentWebRoute(operation: 'push' | 'replace') {\n syncWebRouting(pageStack.entries, operation)\n syncCurrentWebDocument()\n}\n\nfunction reconcileWebRoute(target: WebRouteTarget | undefined, state: WebRouteHistoryState | undefined) {\n const currentEntries = pageStack.entries\n const historyStack = getWebHistoryStack(state)\n if (historyStack?.length) {\n if (historyStack.some(entry => !pageRegistry.has(entry.id))) {\n return\n }\n const sharedLength = Math.min(historyStack.length, currentEntries.length)\n const samePrefix = historyStack.slice(0, sharedLength).every((entry, index) => {\n const current = currentEntries[index]!\n return entry.id === current.id\n && (entry.webviewId === undefined || entry.webviewId === getEntryWebviewId(current))\n && Object.keys(entry.query).length === Object.keys(current.query).length\n && Object.entries(entry.query).every(([key, value]) => current.query[key] === value)\n })\n if (samePrefix && historyStack.length === currentEntries.length) {\n return\n }\n if (samePrefix && historyStack.length < currentEntries.length) {\n pageStack.back(currentEntries.length - historyStack.length)\n }\n else if (samePrefix && historyStack.length > currentEntries.length) {\n const added = historyStack.slice(currentEntries.length)\n if (added.length === 1) {\n pageStack.push(added[0]!.id, { ...added[0]!.query })\n }\n else {\n pageStack.forward(added)\n }\n }\n else {\n const last = historyStack[historyStack.length - 1]!\n if (getTabBarPagePaths().has(last.id)) {\n pageStack.switchTab(last.id, { ...last.query })\n }\n else {\n pageStack.relaunch(last.id, { ...last.query })\n }\n }\n syncWebRouting(pageStack.entries, 'replace')\n syncTabBarRoute(pageStack.entries[pageStack.entries.length - 1]?.id ?? '')\n syncCurrentWebDocument()\n return\n }\n if (target && pageRegistry.has(target.id)) {\n const current = currentEntries[currentEntries.length - 1]\n if (current?.id === target.id\n && Object.keys(current.query).length === Object.keys(target.query).length\n && Object.entries(target.query).every(([key, value]) => current.query[key] === value)) {\n return\n }\n if (getTabBarPagePaths().has(target.id)) {\n pageStack.switchTab(target.id, { ...target.query })\n }\n else {\n pageStack.relaunch(target.id, { ...target.query })\n }\n syncWebRouting(pageStack.entries, 'replace')\n syncTabBarRoute(target.id)\n syncCurrentWebDocument()\n }\n}\n\nfunction performSwitchTab(options: RouteOptions) {\n const { id, query } = parsePageUrl(options?.url ?? '')\n const previousLength = pageStack.entries.length\n const previousEntry = pageStack.entries[previousLength - 1]\n const succeeded = pageStack.switchTab(id, query)\n if (succeeded && (pageStack.entries.length !== previousLength || pageStack.entries.at(-1) !== previousEntry)) {\n syncTabBarRoute(id)\n syncCurrentWebRoute('push')\n }\n return resolveRouteAction('switchTab', options, succeeded, 'not a tabBar page')\n}\n\nfunction bindPageResizeBridge() {\n if (pageResizeBridgeBound || typeof window === 'undefined') {\n return\n }\n if (typeof window.addEventListener !== 'function') {\n return\n }\n pageResizeBridgeBound = true\n window.addEventListener('resize', () => {\n const pages = resolveCurrentPages<ComponentPublicInstance>(pageStack.entries)\n const current = pages[pages.length - 1]\n if (!current) {\n return\n }\n dispatchPageLifetimeToComponents(current, 'resize')\n })\n}\n\nexport function initializePageRoutes(\n ids: string[],\n options?: {\n rpx?: { designWidth?: number, varName?: string }\n navigationBar?: NavigationBarMetrics\n form?: ButtonFormConfig\n tabBar?: WebTabBarConfig\n runtime?: {\n executionMode?: 'compat' | 'safe' | 'strict'\n warnings?: {\n level?: 'off' | 'warn' | 'error'\n dedupe?: boolean\n }\n viewport?: WebViewportConfig\n routing?: WebRoutingConfig\n seo?: WebSeoConfig\n resourceHints?: WebResourceHintsConfig\n }\n },\n) {\n setRuntimeExecutionMode(options?.runtime?.executionMode)\n setRuntimeWarningOptions(options?.runtime?.warnings)\n setupWebViewport(options?.runtime?.viewport)\n configureWebSeo(options?.runtime?.seo)\n setupWebResourceHints(options?.runtime?.resourceHints)\n configureWebRouting(options?.runtime?.routing, ids, reconcileWebRoute)\n appLifecycle.bindVisibility()\n ensureNativeComponentsDefined()\n pageOrder = Array.from(new Set(ids))\n configureTabBar(options?.tabBar, url => performSwitchTab({ url }))\n pageStack.configureTabPages(getTabBarPagePaths())\n if (!pageOrder.length) {\n return\n }\n bindPageResizeBridge()\n if (options?.rpx) {\n setupRpx(options.rpx)\n }\n if (options?.navigationBar) {\n setNavigationBarMetrics(options.navigationBar)\n }\n if (options?.form) {\n setButtonFormConfig(options.form)\n }\n if (!pageStack.entries.length) {\n const initialTarget = readWebRouteTarget(pageOrder)\n const initialId = initialTarget?.id ?? pageOrder[0]\n const initialQuery = initialTarget?.query ?? {}\n if (pageStack.push(initialId, initialQuery, 'appLaunch')) {\n syncTabBarRoute(initialId)\n syncCurrentWebRoute('replace')\n }\n }\n}\n\nexport function registerPage<T extends PageRawOptions | undefined>(options: T, meta: RegisterMeta): T {\n ensureNativeComponentsDefined()\n ensureNavigationBarDefined()\n const tag = slugify(meta.id, 'wv-page')\n const template = meta.template ?? (() => '')\n const normalized = normalizePageOptions(options)\n const existing = pageRegistry.get(meta.id)\n if (existing) {\n existing.hooks = normalized.hooks\n existing.navigationBar = meta.navigationBar\n const component = augmentPageComponentOptions(normalized.component, existing)\n defineComponent(tag, {\n id: meta.id,\n template,\n style: meta.style,\n component,\n })\n return options\n }\n const record: PageRecord = {\n tag,\n hooks: normalized.hooks,\n instances: new Set(),\n navigationBar: meta.navigationBar,\n }\n const component = augmentPageComponentOptions(normalized.component, record)\n defineComponent(tag, {\n id: meta.id,\n template,\n style: meta.style,\n component,\n })\n pageRegistry.set(meta.id, record)\n return options\n}\n\nexport function getCurrentPageInstance(): ComponentPublicInstance | undefined {\n return pageStack.entries[pageStack.entries.length - 1]?.instance\n}\n\nexport function registerComponent<T extends ComponentRawOptions | undefined>(options: T, meta: RegisterMeta): T {\n ensureNativeComponentsDefined()\n const tag = slugify(meta.id, 'wv-component')\n const template = meta.template ?? (() => '')\n const component = normalizeComponentOptions(options)\n if (componentRegistry.has(meta.id)) {\n defineComponent(tag, {\n id: meta.id,\n template,\n style: meta.style,\n component,\n })\n return options\n }\n defineComponent(tag, {\n id: meta.id,\n template,\n style: meta.style,\n component,\n })\n componentRegistry.set(meta.id, { tag })\n return options\n}\n\nexport function registerApp<T extends AppRuntime | undefined>(options: T, _meta?: RegisterMeta): T {\n return appLifecycle.register(options)\n}\n\nexport function offAppHide(callback?: AppHideCallback) {\n appLifecycle.offAppHide(callback)\n}\n\nexport function offAppShow(callback?: AppShowCallback) {\n appLifecycle.offAppShow(callback)\n}\n\nexport function onAppHide(callback: AppHideCallback) {\n appLifecycle.onAppHide(callback)\n}\n\nexport function onAppShow(callback: AppShowCallback) {\n appLifecycle.onAppShow(callback)\n}\n\nexport function navigateTo(options: RouteOptions) {\n const { id, query } = parsePageUrl(options?.url ?? '')\n const succeeded = pageStack.push(id, query)\n if (succeeded) {\n syncTabBarRoute(id)\n syncCurrentWebRoute('push')\n }\n return resolveRouteAction('navigateTo', options, succeeded)\n}\n\nexport function redirectTo(options: RouteOptions) {\n const { id, query } = parsePageUrl(options?.url ?? '')\n const succeeded = pageStack.replace(id, query)\n if (succeeded) {\n syncTabBarRoute(id)\n syncCurrentWebRoute('replace')\n }\n return resolveRouteAction('redirectTo', options, succeeded)\n}\n\nexport function reLaunch(options: RouteOptions) {\n const { id, query } = parsePageUrl(options?.url ?? '')\n const succeeded = pageStack.relaunch(id, query)\n if (succeeded) {\n syncTabBarRoute(id)\n syncCurrentWebRoute('replace')\n }\n return resolveRouteAction('reLaunch', options, succeeded)\n}\n\nexport function switchTab(options: RouteOptions) {\n return performSwitchTab(options)\n}\n\nexport function navigateBack(options?: NavigateBackOptions) {\n const succeeded = pageStack.back(options?.delta)\n if (succeeded) {\n syncTabBarRoute(pageStack.entries[pageStack.entries.length - 1]?.id ?? '')\n syncCurrentWebRoute('replace')\n }\n return resolveRouteAction('navigateBack', options, succeeded)\n}\n\nexport function getCurrentPagesInternal() {\n return resolveCurrentPages<ComponentPublicInstance>(pageStack.entries)\n}\n\nexport function getAppInstance() {\n return appLifecycle.instance\n}\n\nexport function getLaunchOptionsSync() {\n return appLifecycle.getLaunchOptions()\n}\n\nexport function getEnterOptionsSync() {\n return appLifecycle.getEnterOptions()\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"routeRuntime.mjs","names":[],"sources":["../../../src/runtime/polyfill/routeRuntime.ts"],"sourcesContent":["import type { WebTabBarConfig } from '../../shared/tabBar'\nimport type { ButtonFormConfig } from '../button'\nimport type { ComponentPublicInstance } from '../component'\nimport type { NavigationBarMetrics } from '../navigationBar'\nimport type { WebResourceHintsConfig, WebSeoConfig } from '../seo'\nimport type { WebViewportConfig } from '../viewport'\nimport type { WebRouteHistoryState, WebRouteTarget, WebRoutingConfig } from './routeRuntime/history'\nimport type { AppHideCallback, AppRuntime, AppShowCallback, ComponentRawOptions, ComponentRecord, NavigateBackOptions, PageRawOptions, PageRecord, RegisterMeta, RouteOptions } from './routeRuntime/options'\nimport { slugify } from '../../shared/slugify'\nimport {\n configureTabBar,\n getTabBarPagePaths,\n syncTabBarRoute,\n} from '../appShell/tabBar'\nimport { setAppStyle } from '../appStyle'\nimport { setButtonFormConfig } from '../button'\nimport { defineComponent } from '../component'\nimport { setRuntimeExecutionMode } from '../execution'\nimport { ensureNativeComponentsDefined } from '../nativeComponents'\nimport { ensureNavigationBarDefined, setNavigationBarMetrics } from '../navigationBar'\nimport { setupRpx } from '../rpx'\nimport { configureWebSeo, setupWebResourceHints, syncWebDocumentHead } from '../seo'\nimport { setupWebViewport } from '../viewport'\nimport { setRuntimeWarningOptions } from '../warning'\nimport { resolveCurrentPages } from './appState'\nimport { AppLifecycleRuntime } from './routeRuntime/appLifecycle'\nimport { getEntryWebviewId } from './routeRuntime/events'\nimport {\n configureWebRouting,\n getWebHistoryStack,\n readWebRouteTarget,\n syncWebRouting,\n} from './routeRuntime/history'\nimport {\n augmentPageComponentOptions,\n dispatchPageLifetimeToComponents,\n} from './routeRuntime/lifecycle'\nimport {\n normalizeComponentOptions,\n normalizePageOptions,\n} from './routeRuntime/options'\nimport { resolveRouteAction } from './routeRuntime/result'\nimport { PageStackRuntime } from './routeRuntime/stack'\nimport { parsePageUrl } from './routeRuntime/url'\n\nconst pageRegistry = new Map<string, PageRecord>()\nconst componentRegistry = new Map<string, ComponentRecord>()\nlet pageOrder: string[] = []\nlet pageResizeBridgeBound = false\n\nlet pageStack: PageStackRuntime\nconst appLifecycle = new AppLifecycleRuntime(\n () => pageStack?.entries[pageStack.entries.length - 1],\n)\npageStack = new PageStackRuntime(pageRegistry, entry => appLifecycle.ensureLaunched(entry))\n\nfunction syncCurrentWebDocument() {\n const current = pageStack.entries[pageStack.entries.length - 1]\n syncWebDocumentHead({\n route: current?.id,\n title: current ? pageRegistry.get(current.id)?.navigationBar?.title : undefined,\n })\n}\n\nfunction syncCurrentWebRoute(operation: 'push' | 'replace') {\n syncWebRouting(pageStack.entries, operation)\n syncCurrentWebDocument()\n}\n\nfunction reconcileWebRoute(target: WebRouteTarget | undefined, state: WebRouteHistoryState | undefined) {\n const currentEntries = pageStack.entries\n const historyStack = getWebHistoryStack(state)\n if (historyStack?.length) {\n if (historyStack.some(entry => !pageRegistry.has(entry.id))) {\n return\n }\n const sharedLength = Math.min(historyStack.length, currentEntries.length)\n const samePrefix = historyStack.slice(0, sharedLength).every((entry, index) => {\n const current = currentEntries[index]!\n return entry.id === current.id\n && (entry.webviewId === undefined || entry.webviewId === getEntryWebviewId(current))\n && Object.keys(entry.query).length === Object.keys(current.query).length\n && Object.entries(entry.query).every(([key, value]) => current.query[key] === value)\n })\n if (samePrefix && historyStack.length === currentEntries.length) {\n return\n }\n if (samePrefix && historyStack.length < currentEntries.length) {\n pageStack.back(currentEntries.length - historyStack.length)\n }\n else if (samePrefix && historyStack.length > currentEntries.length) {\n const added = historyStack.slice(currentEntries.length)\n if (added.length === 1) {\n pageStack.push(added[0]!.id, { ...added[0]!.query })\n }\n else {\n pageStack.forward(added)\n }\n }\n else {\n const last = historyStack[historyStack.length - 1]!\n if (getTabBarPagePaths().has(last.id)) {\n pageStack.switchTab(last.id, { ...last.query })\n }\n else {\n pageStack.relaunch(last.id, { ...last.query })\n }\n }\n syncWebRouting(pageStack.entries, 'replace')\n syncTabBarRoute(pageStack.entries[pageStack.entries.length - 1]?.id ?? '')\n syncCurrentWebDocument()\n return\n }\n if (target && pageRegistry.has(target.id)) {\n const current = currentEntries[currentEntries.length - 1]\n if (current?.id === target.id\n && Object.keys(current.query).length === Object.keys(target.query).length\n && Object.entries(target.query).every(([key, value]) => current.query[key] === value)) {\n return\n }\n if (getTabBarPagePaths().has(target.id)) {\n pageStack.switchTab(target.id, { ...target.query })\n }\n else {\n pageStack.relaunch(target.id, { ...target.query })\n }\n syncWebRouting(pageStack.entries, 'replace')\n syncTabBarRoute(target.id)\n syncCurrentWebDocument()\n }\n}\n\nfunction performSwitchTab(options: RouteOptions) {\n const { id, query } = parsePageUrl(options?.url ?? '')\n const previousLength = pageStack.entries.length\n const previousEntry = pageStack.entries[previousLength - 1]\n const succeeded = pageStack.switchTab(id, query)\n if (succeeded && (pageStack.entries.length !== previousLength || pageStack.entries.at(-1) !== previousEntry)) {\n syncTabBarRoute(id)\n syncCurrentWebRoute('push')\n }\n return resolveRouteAction('switchTab', options, succeeded, 'not a tabBar page')\n}\n\nfunction bindPageResizeBridge() {\n if (pageResizeBridgeBound || typeof window === 'undefined') {\n return\n }\n if (typeof window.addEventListener !== 'function') {\n return\n }\n pageResizeBridgeBound = true\n window.addEventListener('resize', () => {\n const pages = resolveCurrentPages<ComponentPublicInstance>(pageStack.entries)\n const current = pages[pages.length - 1]\n if (!current) {\n return\n }\n dispatchPageLifetimeToComponents(current, 'resize')\n })\n}\n\nexport function initializePageRoutes(\n ids: string[],\n options?: {\n rpx?: { designWidth?: number, varName?: string }\n navigationBar?: NavigationBarMetrics\n form?: ButtonFormConfig\n tabBar?: WebTabBarConfig\n runtime?: {\n executionMode?: 'compat' | 'safe' | 'strict'\n warnings?: {\n level?: 'off' | 'warn' | 'error'\n dedupe?: boolean\n }\n viewport?: WebViewportConfig\n routing?: WebRoutingConfig\n seo?: WebSeoConfig\n resourceHints?: WebResourceHintsConfig\n }\n },\n) {\n setRuntimeExecutionMode(options?.runtime?.executionMode)\n setRuntimeWarningOptions(options?.runtime?.warnings)\n setupWebViewport(options?.runtime?.viewport)\n configureWebSeo(options?.runtime?.seo)\n setupWebResourceHints(options?.runtime?.resourceHints)\n configureWebRouting(options?.runtime?.routing, ids, reconcileWebRoute)\n appLifecycle.bindVisibility()\n ensureNativeComponentsDefined()\n pageOrder = Array.from(new Set(ids))\n configureTabBar(options?.tabBar, url => performSwitchTab({ url }))\n pageStack.configureTabPages(getTabBarPagePaths())\n if (!pageOrder.length) {\n return\n }\n bindPageResizeBridge()\n if (options?.rpx) {\n setupRpx(options.rpx)\n }\n if (options?.navigationBar) {\n setNavigationBarMetrics(options.navigationBar)\n }\n if (options?.form) {\n setButtonFormConfig(options.form)\n }\n if (!pageStack.entries.length) {\n const initialTarget = readWebRouteTarget(pageOrder)\n const initialId = initialTarget?.id ?? pageOrder[0]\n const initialQuery = initialTarget?.query ?? {}\n if (pageStack.push(initialId, initialQuery, 'appLaunch')) {\n syncTabBarRoute(initialId)\n syncCurrentWebRoute('replace')\n }\n }\n}\n\nexport function registerPage<T extends PageRawOptions | undefined>(options: T, meta: RegisterMeta): T {\n ensureNativeComponentsDefined()\n ensureNavigationBarDefined()\n const tag = slugify(meta.id, 'wv-page')\n const template = meta.template ?? (() => '')\n const normalized = normalizePageOptions(options)\n const existing = pageRegistry.get(meta.id)\n if (existing) {\n existing.hooks = normalized.hooks\n existing.navigationBar = meta.navigationBar\n const component = augmentPageComponentOptions(normalized.component, existing)\n defineComponent(tag, {\n id: meta.id,\n kind: 'page',\n template,\n style: meta.style,\n component,\n })\n return options\n }\n const record: PageRecord = {\n tag,\n hooks: normalized.hooks,\n instances: new Set(),\n navigationBar: meta.navigationBar,\n }\n const component = augmentPageComponentOptions(normalized.component, record)\n defineComponent(tag, {\n id: meta.id,\n kind: 'page',\n template,\n style: meta.style,\n component,\n })\n pageRegistry.set(meta.id, record)\n return options\n}\n\nexport function getCurrentPageInstance(): ComponentPublicInstance | undefined {\n return pageStack.entries[pageStack.entries.length - 1]?.instance\n}\n\nexport function registerComponent<T extends ComponentRawOptions | undefined>(options: T, meta: RegisterMeta): T {\n ensureNativeComponentsDefined()\n const tag = slugify(meta.id, 'wv-component')\n const template = meta.template ?? (() => '')\n const component = normalizeComponentOptions(options)\n if (componentRegistry.has(meta.id)) {\n defineComponent(tag, {\n id: meta.id,\n template,\n style: meta.style,\n component,\n })\n return options\n }\n defineComponent(tag, {\n id: meta.id,\n template,\n style: meta.style,\n component,\n })\n componentRegistry.set(meta.id, { tag })\n return options\n}\n\nexport function registerApp<T extends AppRuntime | undefined>(options: T, meta?: RegisterMeta): T {\n setAppStyle(meta?.style ?? '')\n return appLifecycle.register(options)\n}\n\nexport function offAppHide(callback?: AppHideCallback) {\n appLifecycle.offAppHide(callback)\n}\n\nexport function offAppShow(callback?: AppShowCallback) {\n appLifecycle.offAppShow(callback)\n}\n\nexport function onAppHide(callback: AppHideCallback) {\n appLifecycle.onAppHide(callback)\n}\n\nexport function onAppShow(callback: AppShowCallback) {\n appLifecycle.onAppShow(callback)\n}\n\nexport function navigateTo(options: RouteOptions) {\n const { id, query } = parsePageUrl(options?.url ?? '')\n const succeeded = pageStack.push(id, query)\n if (succeeded) {\n syncTabBarRoute(id)\n syncCurrentWebRoute('push')\n }\n return resolveRouteAction('navigateTo', options, succeeded)\n}\n\nexport function redirectTo(options: RouteOptions) {\n const { id, query } = parsePageUrl(options?.url ?? '')\n const succeeded = pageStack.replace(id, query)\n if (succeeded) {\n syncTabBarRoute(id)\n syncCurrentWebRoute('replace')\n }\n return resolveRouteAction('redirectTo', options, succeeded)\n}\n\nexport function reLaunch(options: RouteOptions) {\n const { id, query } = parsePageUrl(options?.url ?? '')\n const succeeded = pageStack.relaunch(id, query)\n if (succeeded) {\n syncTabBarRoute(id)\n syncCurrentWebRoute('replace')\n }\n return resolveRouteAction('reLaunch', options, succeeded)\n}\n\nexport function switchTab(options: RouteOptions) {\n return performSwitchTab(options)\n}\n\nexport function navigateBack(options?: NavigateBackOptions) {\n const succeeded = pageStack.back(options?.delta)\n if (succeeded) {\n syncTabBarRoute(pageStack.entries[pageStack.entries.length - 1]?.id ?? '')\n syncCurrentWebRoute('replace')\n }\n return resolveRouteAction('navigateBack', options, succeeded)\n}\n\nexport function getCurrentPagesInternal() {\n return resolveCurrentPages<ComponentPublicInstance>(pageStack.entries)\n}\n\nexport function getAppInstance() {\n return appLifecycle.instance\n}\n\nexport function getLaunchOptionsSync() {\n return appLifecycle.getLaunchOptions()\n}\n\nexport function getEnterOptionsSync() {\n return appLifecycle.getEnterOptions()\n}\n"],"mappings":"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"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { emitRuntimeWarning } from "./warning.mjs";
|
|
2
|
+
import { nameRuntimeEventHandler } from "./componentEvents.mjs";
|
|
2
3
|
import { getRuntimeExecutionMode, warnRuntimeExecutionOnce } from "./execution.mjs";
|
|
3
4
|
import { invokeMiniProgramEventHandler } from "./inputHandlerResult.mjs";
|
|
4
5
|
|
|
@@ -69,7 +70,7 @@ function normalizeKey(rawKey, item, index, scope) {
|
|
|
69
70
|
function createEventHandler(instance, methods, eventName, handlerRef, flags) {
|
|
70
71
|
const handler = typeof handlerRef === "function" ? handlerRef : methods[handlerRef] ?? instance[handlerRef];
|
|
71
72
|
if (typeof handler !== "function") return () => {};
|
|
72
|
-
return (nativeEvent) => {
|
|
73
|
+
return nameRuntimeEventHandler((nativeEvent) => {
|
|
73
74
|
if (flags?.catch) nativeEvent.stopPropagation();
|
|
74
75
|
const target = nativeEvent.target;
|
|
75
76
|
const dataset = nativeEvent.currentTarget?.dataset ?? {};
|
|
@@ -82,7 +83,7 @@ function createEventHandler(instance, methods, eventName, handlerRef, flags) {
|
|
|
82
83
|
originalEvent: nativeEvent
|
|
83
84
|
};
|
|
84
85
|
invokeMiniProgramEventHandler(handler, instance, syntheticEvent, nativeEvent);
|
|
85
|
-
};
|
|
86
|
+
}, eventName);
|
|
86
87
|
}
|
|
87
88
|
function createWxsModule(code, id, requireMap) {
|
|
88
89
|
const module = { exports: {} };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"renderContext.mjs","names":[],"sources":["../../src/runtime/renderContext.ts"],"sourcesContent":["import type { ComponentPublicInstance } from './component'\nimport type { TemplateScope } from './template'\nimport { getRuntimeExecutionMode, warnRuntimeExecutionOnce } from './execution'\nimport { invokeMiniProgramEventHandler } from './inputHandlerResult'\nimport { emitRuntimeWarning } from './warning'\n\nexport interface RenderContext {\n instance: ComponentPublicInstance\n eval: (expression: string, scope: TemplateScope, wxs?: Record<string, any>) => any\n createScope: (parent: TemplateScope, locals?: Record<string, any>) => TemplateScope\n mergeScope: (parent: TemplateScope, data?: any) => TemplateScope\n normalizeList: (value: any) => any[]\n key: (rawKey: string, item: any, index: number, scope: TemplateScope, wxs?: Record<string, any>) => any\n renderTemplate: (templates: Record<string, any>, name: any, scope: TemplateScope, ctx: RenderContext) => any\n event: (eventName: string, handlerName: any, scope: TemplateScope, wxs?: Record<string, any>, flags?: { catch?: boolean, capture?: boolean }) => (event: Event) => void\n createWxsModule: (code: string, id: string, requireMap?: Record<string, any>) => Record<string, any>\n}\n\nconst expressionCache = new Map<string, (scope: TemplateScope) => any>()\nconst MUSTACHE_PREFIX_RE = /^\\{\\{\\s*/\nconst MUSTACHE_SUFFIX_RE = /\\s*\\}\\}$/\nconst SIMPLE_KEY_PATH_RE = /[.[()]/\n\nfunction createScope(initial?: TemplateScope): TemplateScope {\n return Object.assign(Object.create(null), initial ?? {})\n}\n\nfunction createChildScope(parent: TemplateScope, locals?: Record<string, any>): TemplateScope {\n return Object.assign(Object.create(parent), locals ?? {})\n}\n\nfunction evaluateExpression(expression: string, scope: TemplateScope): any {\n if (!expression) {\n return undefined\n }\n const trimmed = expression.trim()\n if (!trimmed) {\n return undefined\n }\n let evaluator = expressionCache.get(trimmed)\n if (!evaluator) {\n try {\n // eslint-disable-next-line no-new-func -- dynamic expressions are required for template evaluation\n evaluator = new Function('scope', `with(scope){ return (${trimmed}); }`) as (scope: TemplateScope) => any\n }\n catch (error) {\n const reason = error instanceof Error ? error.message : String(error)\n const mode = getRuntimeExecutionMode()\n if (mode === 'safe') {\n warnRuntimeExecutionOnce(\n `safe-expression-parse:${trimmed}`,\n `[@weapp-vite/web] safe 模式下忽略表达式解析错误 \"${trimmed}\": ${reason}`,\n )\n evaluator = () => undefined\n }\n else {\n throw new SyntaxError(`[@weapp-vite/web] 无法解析表达式 \"${trimmed}\": ${reason}`)\n }\n }\n expressionCache.set(trimmed, evaluator)\n }\n try {\n return evaluator?.(scope)\n }\n catch (error) {\n const mode = getRuntimeExecutionMode()\n if (mode === 'strict') {\n const reason = error instanceof Error ? error.message : String(error)\n throw new Error(`[@weapp-vite/web] strict 模式下表达式执行失败 \"${trimmed}\": ${reason}`)\n }\n if (mode === 'safe') {\n const reason = error instanceof Error ? error.message : String(error)\n warnRuntimeExecutionOnce(\n `safe-expression-runtime:${trimmed}`,\n `[@weapp-vite/web] safe 模式下忽略表达式执行错误 \"${trimmed}\": ${reason}`,\n )\n }\n return undefined\n }\n}\n\nfunction normalizeList(value: any): any[] {\n if (Array.isArray(value)) {\n return value\n }\n if (value == null) {\n return []\n }\n if (typeof value === 'number' && Number.isFinite(value)) {\n const length = Math.max(0, Math.floor(value))\n return Array.from({ length }, (_, index) => index)\n }\n if (typeof value === 'object') {\n return Object.values(value)\n }\n return []\n}\n\nfunction normalizeKey(rawKey: string, item: any, index: number, scope: TemplateScope): any {\n const key = rawKey?.trim()\n if (!key) {\n if (item != null && (typeof item === 'string' || typeof item === 'number' || typeof item === 'boolean')) {\n return item\n }\n return index\n }\n if (key === '*this') {\n return item\n }\n if (key.includes('{{') && key.includes('}}')) {\n const expr = key.replace(MUSTACHE_PREFIX_RE, '').replace(MUSTACHE_SUFFIX_RE, '')\n return evaluateExpression(expr, scope)\n }\n if (!SIMPLE_KEY_PATH_RE.test(key) && item && typeof item === 'object' && key in item) {\n return (item as Record<string, any>)[key]\n }\n return evaluateExpression(key, scope)\n}\n\nfunction createEventHandler(\n instance: ComponentPublicInstance,\n methods: Record<string, (event: any) => any>,\n eventName: string,\n handlerRef: string | ((event: any) => any),\n flags?: { catch?: boolean },\n) {\n const handler = typeof handlerRef === 'function'\n ? handlerRef\n : methods[handlerRef] ?? (instance as Record<string, any>)[handlerRef]\n if (typeof handler !== 'function') {\n return () => {}\n }\n return (nativeEvent: Event) => {\n if (flags?.catch) {\n nativeEvent.stopPropagation()\n }\n const target = nativeEvent.target as HTMLElement | null\n const currentTarget = nativeEvent.currentTarget as HTMLElement | null\n const dataset = currentTarget?.dataset ?? {}\n const syntheticEvent = {\n type: eventName,\n timeStamp: nativeEvent.timeStamp,\n detail: (nativeEvent as CustomEvent).detail ?? (nativeEvent as InputEvent).data ?? undefined,\n target: {\n dataset: target?.dataset ?? dataset,\n },\n currentTarget: {\n dataset,\n },\n originalEvent: nativeEvent,\n }\n invokeMiniProgramEventHandler(handler, instance, syntheticEvent, nativeEvent)\n }\n}\n\nfunction createWxsModule(code: string, id: string, requireMap?: Record<string, any>) {\n const module = { exports: {} as Record<string, any> }\n const exports = module.exports\n const getRegExp = (pattern: string, flags?: string) => new RegExp(pattern, flags)\n const getDate = (value?: string | number | Date) => (value == null ? new Date() : new Date(value))\n const require = (request: string) => requireMap?.[request]\n try {\n // eslint-disable-next-line no-new-func -- run in isolated module scope\n const runner = new Function('module', 'exports', 'require', 'getRegExp', 'getDate', code)\n runner(module, exports, require, getRegExp, getDate)\n }\n catch (error) {\n const reason = error instanceof Error ? error.message : String(error)\n const mode = getRuntimeExecutionMode()\n if (mode === 'safe') {\n warnRuntimeExecutionOnce(\n `safe-wxs-runtime:${id}`,\n `[@weapp-vite/web] safe 模式下忽略 WXS 执行错误: ${id} ${reason}`,\n )\n return {}\n }\n throw new Error(`[@weapp-vite/web] WXS 执行失败: ${id} ${reason}`)\n }\n return module.exports\n}\n\nexport function createRenderContext(\n instance: ComponentPublicInstance,\n methods: Record<string, (event: any) => any>,\n): RenderContext {\n const warnMissingTemplate = (name: string) => {\n emitRuntimeWarning(`[@weapp-vite/web] 未找到模板: ${name}`, {\n key: `template-missing:${name}`,\n context: 'runtime:template',\n })\n }\n\n return {\n instance,\n eval: (expression, scope, wxs) => {\n const baseScope = scope ?? createScope()\n const renderScope = wxs ? createChildScope(baseScope, wxs) : baseScope\n return evaluateExpression(expression, renderScope)\n },\n createScope: (parent, locals) => createChildScope(parent, locals),\n mergeScope: (parent, data) => {\n const baseScope = parent ?? createScope()\n if (!data || typeof data !== 'object') {\n return baseScope\n }\n return createChildScope(baseScope, data as Record<string, any>)\n },\n normalizeList,\n key: (rawKey, item, index, scope, wxs) => {\n const baseScope = scope ?? createScope()\n const renderScope = wxs ? createChildScope(baseScope, wxs) : baseScope\n return normalizeKey(rawKey, item, index, renderScope)\n },\n renderTemplate: (templates, name, scope, ctx) => {\n const resolvedName = typeof name === 'string' ? name : String(name)\n const template = templates?.[resolvedName]\n if (typeof template !== 'function') {\n warnMissingTemplate(resolvedName)\n return ''\n }\n return template(scope, ctx)\n },\n event: (eventName, handlerName, _scope, _wxs, flags) => {\n if (typeof handlerName === 'function') {\n return createEventHandler(instance, methods, eventName, handlerName, flags)\n }\n const resolvedHandler = String(handlerName ?? '')\n return createEventHandler(instance, methods, eventName, resolvedHandler, flags)\n },\n createWxsModule,\n }\n}\n\nexport { createChildScope, createScope, evaluateExpression }\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"renderContext.mjs","names":[],"sources":["../../src/runtime/renderContext.ts"],"sourcesContent":["import type { ComponentPublicInstance } from './component'\nimport type { TemplateScope } from './template'\nimport { nameRuntimeEventHandler } from './componentEvents'\nimport { getRuntimeExecutionMode, warnRuntimeExecutionOnce } from './execution'\nimport { invokeMiniProgramEventHandler } from './inputHandlerResult'\nimport { emitRuntimeWarning } from './warning'\n\nexport interface RenderContext {\n instance: ComponentPublicInstance\n eval: (expression: string, scope: TemplateScope, wxs?: Record<string, any>) => any\n createScope: (parent: TemplateScope, locals?: Record<string, any>) => TemplateScope\n mergeScope: (parent: TemplateScope, data?: any) => TemplateScope\n normalizeList: (value: any) => any[]\n key: (rawKey: string, item: any, index: number, scope: TemplateScope, wxs?: Record<string, any>) => any\n renderTemplate: (templates: Record<string, any>, name: any, scope: TemplateScope, ctx: RenderContext) => any\n event: (eventName: string, handlerName: any, scope: TemplateScope, wxs?: Record<string, any>, flags?: { catch?: boolean, capture?: boolean }) => (event: Event) => void\n createWxsModule: (code: string, id: string, requireMap?: Record<string, any>) => Record<string, any>\n}\n\nconst expressionCache = new Map<string, (scope: TemplateScope) => any>()\nconst MUSTACHE_PREFIX_RE = /^\\{\\{\\s*/\nconst MUSTACHE_SUFFIX_RE = /\\s*\\}\\}$/\nconst SIMPLE_KEY_PATH_RE = /[.[()]/\n\nfunction createScope(initial?: TemplateScope): TemplateScope {\n return Object.assign(Object.create(null), initial ?? {})\n}\n\nfunction createChildScope(parent: TemplateScope, locals?: Record<string, any>): TemplateScope {\n return Object.assign(Object.create(parent), locals ?? {})\n}\n\nfunction evaluateExpression(expression: string, scope: TemplateScope): any {\n if (!expression) {\n return undefined\n }\n const trimmed = expression.trim()\n if (!trimmed) {\n return undefined\n }\n let evaluator = expressionCache.get(trimmed)\n if (!evaluator) {\n try {\n // eslint-disable-next-line no-new-func -- dynamic expressions are required for template evaluation\n evaluator = new Function('scope', `with(scope){ return (${trimmed}); }`) as (scope: TemplateScope) => any\n }\n catch (error) {\n const reason = error instanceof Error ? error.message : String(error)\n const mode = getRuntimeExecutionMode()\n if (mode === 'safe') {\n warnRuntimeExecutionOnce(\n `safe-expression-parse:${trimmed}`,\n `[@weapp-vite/web] safe 模式下忽略表达式解析错误 \"${trimmed}\": ${reason}`,\n )\n evaluator = () => undefined\n }\n else {\n throw new SyntaxError(`[@weapp-vite/web] 无法解析表达式 \"${trimmed}\": ${reason}`)\n }\n }\n expressionCache.set(trimmed, evaluator)\n }\n try {\n return evaluator?.(scope)\n }\n catch (error) {\n const mode = getRuntimeExecutionMode()\n if (mode === 'strict') {\n const reason = error instanceof Error ? error.message : String(error)\n throw new Error(`[@weapp-vite/web] strict 模式下表达式执行失败 \"${trimmed}\": ${reason}`)\n }\n if (mode === 'safe') {\n const reason = error instanceof Error ? error.message : String(error)\n warnRuntimeExecutionOnce(\n `safe-expression-runtime:${trimmed}`,\n `[@weapp-vite/web] safe 模式下忽略表达式执行错误 \"${trimmed}\": ${reason}`,\n )\n }\n return undefined\n }\n}\n\nfunction normalizeList(value: any): any[] {\n if (Array.isArray(value)) {\n return value\n }\n if (value == null) {\n return []\n }\n if (typeof value === 'number' && Number.isFinite(value)) {\n const length = Math.max(0, Math.floor(value))\n return Array.from({ length }, (_, index) => index)\n }\n if (typeof value === 'object') {\n return Object.values(value)\n }\n return []\n}\n\nfunction normalizeKey(rawKey: string, item: any, index: number, scope: TemplateScope): any {\n const key = rawKey?.trim()\n if (!key) {\n if (item != null && (typeof item === 'string' || typeof item === 'number' || typeof item === 'boolean')) {\n return item\n }\n return index\n }\n if (key === '*this') {\n return item\n }\n if (key.includes('{{') && key.includes('}}')) {\n const expr = key.replace(MUSTACHE_PREFIX_RE, '').replace(MUSTACHE_SUFFIX_RE, '')\n return evaluateExpression(expr, scope)\n }\n if (!SIMPLE_KEY_PATH_RE.test(key) && item && typeof item === 'object' && key in item) {\n return (item as Record<string, any>)[key]\n }\n return evaluateExpression(key, scope)\n}\n\nfunction createEventHandler(\n instance: ComponentPublicInstance,\n methods: Record<string, (event: any) => any>,\n eventName: string,\n handlerRef: string | ((event: any) => any),\n flags?: { catch?: boolean },\n) {\n const handler = typeof handlerRef === 'function'\n ? handlerRef\n : methods[handlerRef] ?? (instance as Record<string, any>)[handlerRef]\n if (typeof handler !== 'function') {\n return () => {}\n }\n return nameRuntimeEventHandler((nativeEvent: Event) => {\n if (flags?.catch) {\n nativeEvent.stopPropagation()\n }\n const target = nativeEvent.target as HTMLElement | null\n const currentTarget = nativeEvent.currentTarget as HTMLElement | null\n const dataset = currentTarget?.dataset ?? {}\n const syntheticEvent = {\n type: eventName,\n timeStamp: nativeEvent.timeStamp,\n detail: (nativeEvent as CustomEvent).detail ?? (nativeEvent as InputEvent).data ?? undefined,\n target: {\n dataset: target?.dataset ?? dataset,\n },\n currentTarget: {\n dataset,\n },\n originalEvent: nativeEvent,\n }\n invokeMiniProgramEventHandler(handler, instance, syntheticEvent, nativeEvent)\n }, eventName)\n}\n\nfunction createWxsModule(code: string, id: string, requireMap?: Record<string, any>) {\n const module = { exports: {} as Record<string, any> }\n const exports = module.exports\n const getRegExp = (pattern: string, flags?: string) => new RegExp(pattern, flags)\n const getDate = (value?: string | number | Date) => (value == null ? new Date() : new Date(value))\n const require = (request: string) => requireMap?.[request]\n try {\n // eslint-disable-next-line no-new-func -- run in isolated module scope\n const runner = new Function('module', 'exports', 'require', 'getRegExp', 'getDate', code)\n runner(module, exports, require, getRegExp, getDate)\n }\n catch (error) {\n const reason = error instanceof Error ? error.message : String(error)\n const mode = getRuntimeExecutionMode()\n if (mode === 'safe') {\n warnRuntimeExecutionOnce(\n `safe-wxs-runtime:${id}`,\n `[@weapp-vite/web] safe 模式下忽略 WXS 执行错误: ${id} ${reason}`,\n )\n return {}\n }\n throw new Error(`[@weapp-vite/web] WXS 执行失败: ${id} ${reason}`)\n }\n return module.exports\n}\n\nexport function createRenderContext(\n instance: ComponentPublicInstance,\n methods: Record<string, (event: any) => any>,\n): RenderContext {\n const warnMissingTemplate = (name: string) => {\n emitRuntimeWarning(`[@weapp-vite/web] 未找到模板: ${name}`, {\n key: `template-missing:${name}`,\n context: 'runtime:template',\n })\n }\n\n return {\n instance,\n eval: (expression, scope, wxs) => {\n const baseScope = scope ?? createScope()\n const renderScope = wxs ? createChildScope(baseScope, wxs) : baseScope\n return evaluateExpression(expression, renderScope)\n },\n createScope: (parent, locals) => createChildScope(parent, locals),\n mergeScope: (parent, data) => {\n const baseScope = parent ?? createScope()\n if (!data || typeof data !== 'object') {\n return baseScope\n }\n return createChildScope(baseScope, data as Record<string, any>)\n },\n normalizeList,\n key: (rawKey, item, index, scope, wxs) => {\n const baseScope = scope ?? createScope()\n const renderScope = wxs ? createChildScope(baseScope, wxs) : baseScope\n return normalizeKey(rawKey, item, index, renderScope)\n },\n renderTemplate: (templates, name, scope, ctx) => {\n const resolvedName = typeof name === 'string' ? name : String(name)\n const template = templates?.[resolvedName]\n if (typeof template !== 'function') {\n warnMissingTemplate(resolvedName)\n return ''\n }\n return template(scope, ctx)\n },\n event: (eventName, handlerName, _scope, _wxs, flags) => {\n if (typeof handlerName === 'function') {\n return createEventHandler(instance, methods, eventName, handlerName, flags)\n }\n const resolvedHandler = String(handlerName ?? '')\n return createEventHandler(instance, methods, eventName, resolvedHandler, flags)\n },\n createWxsModule,\n }\n}\n\nexport { createChildScope, createScope, evaluateExpression }\n"],"mappings":"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"}
|
package/dist/runtime/wevu.mjs
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { setAppStyle } from "./appStyle.mjs";
|
|
1
2
|
import { registerApp, registerComponent, registerPage } from "./polyfill/routeRuntime.mjs";
|
|
2
3
|
import { createApp, createWevuComponent, takePendingRuntimeAppRegistration } from "wevu/internal-runtime";
|
|
3
4
|
|
|
@@ -26,6 +27,7 @@ function withRuntimeConstructor(name, constructor, run) {
|
|
|
26
27
|
* 将 Wevu App 注册过程接入 Web 页面栈。
|
|
27
28
|
*/
|
|
28
29
|
function registerWebWevuApp(options, meta) {
|
|
30
|
+
setAppStyle(meta.style ?? "");
|
|
29
31
|
const pendingRegistration = takePendingRuntimeAppRegistration();
|
|
30
32
|
withRuntimeConstructor("App", (definition) => registerApp(definition, meta), () => {
|
|
31
33
|
if (pendingRegistration) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wevu.mjs","names":[],"sources":["../../src/runtime/wevu.ts"],"sourcesContent":["import type { RegisterMeta } from './polyfill/routeRuntime/options'\nimport { createApp, createWevuComponent, takePendingRuntimeAppRegistration } from 'wevu/internal-runtime'\nimport { registerApp, registerComponent, registerPage } from './polyfill/routeRuntime'\n\ninterface WevuRegisterMeta extends RegisterMeta {\n kind: 'app' | 'page' | 'component'\n}\n\ntype RuntimeConstructorName = 'App' | 'Page' | 'Component'\n\nfunction createRuntimeConstructor(meta: WevuRegisterMeta, name: RuntimeConstructorName) {\n return (definition: Record<string, any>) => {\n if (name === 'App') {\n registerApp(definition, meta)\n }\n else if (name === 'Page' || meta.kind === 'page') {\n registerPage(definition, meta)\n }\n else {\n registerComponent(definition, meta)\n }\n return definition\n }\n}\n\nfunction withRuntimeConstructor<T>(\n name: 'App' | 'Component',\n constructor: (options: Record<string, any>) => unknown,\n run: () => T,\n) {\n const target = globalThis as Record<string, any>\n const hadOwn = Object.prototype.hasOwnProperty.call(target, name)\n const previous = target[name]\n target[name] = constructor\n try {\n return run()\n }\n finally {\n if (hadOwn) {\n target[name] = previous\n }\n else {\n delete target[name]\n }\n }\n}\n\n/**\n * 将 Wevu App 注册过程接入 Web 页面栈。\n */\nexport function registerWebWevuApp(options: Record<string, any>, meta: WevuRegisterMeta): void {\n const pendingRegistration = takePendingRuntimeAppRegistration()\n withRuntimeConstructor('App', definition => registerApp(definition, meta), () => {\n if (pendingRegistration) {\n pendingRegistration.register()\n return pendingRegistration.app\n }\n return createApp(options)\n })\n}\n\n/**\n * 将 Wevu 页面或组件注册过程接入 Web 自定义元素。\n */\nexport function registerWebWevuComponent(options: Record<string, any>, meta: WevuRegisterMeta): void {\n // Web 依赖 prop 构造器解码 DOM 属性,不使用小程序宿主的 nullable transport 降级。\n withRuntimeConstructor('Component', (definition) => {\n return meta.kind === 'page'\n ? registerPage(definition, meta)\n : registerComponent(definition, meta)\n }, () => createWevuComponent({ ...options, allowNullPropInput: false }))\n}\n\n/**\n * 保留公开 Wevu 工厂行为,并使用当前模块元数据完成 Web 注册。\n */\nexport function registerWebWevuComponentFactory<TArgs extends unknown[], TResult>(\n factory: (...args: TArgs) => TResult,\n meta: WevuRegisterMeta,\n ...args: TArgs\n): TResult {\n return withRuntimeConstructor('Component', (definition) => {\n return meta.kind === 'page'\n ? registerPage(definition, meta)\n : registerComponent(definition, meta)\n }, () => factory(...args))\n}\n\n/**\n * 在原生模块同步求值期间安装带页面元数据的宿主注册函数。\n */\nexport function installWebModuleRegistration(\n meta: WevuRegisterMeta,\n target: Record<string, any> = globalThis,\n): () => void {\n const names: RuntimeConstructorName[] = meta.kind === 'app'\n ? ['App']\n : meta.kind === 'page'\n ? ['Page', 'Component']\n : ['Component']\n const previous = names.map(name => ({\n hadOwn: Object.prototype.hasOwnProperty.call(target, name),\n name,\n value: target[name],\n }))\n const installed = new Map<RuntimeConstructorName, (definition: Record<string, any>) => Record<string, any>>()\n\n for (const name of names) {\n const constructor = createRuntimeConstructor(meta, name)\n installed.set(name, constructor)\n target[name] = constructor\n }\n\n return () => {\n for (const entry of previous) {\n if (target[entry.name] !== installed.get(entry.name)) {\n continue\n }\n if (entry.hadOwn) {\n target[entry.name] = entry.value\n }\n else {\n delete target[entry.name]\n }\n }\n }\n}\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"wevu.mjs","names":[],"sources":["../../src/runtime/wevu.ts"],"sourcesContent":["import type { RegisterMeta } from './polyfill/routeRuntime/options'\nimport { createApp, createWevuComponent, takePendingRuntimeAppRegistration } from 'wevu/internal-runtime'\nimport { setAppStyle } from './appStyle'\nimport { registerApp, registerComponent, registerPage } from './polyfill/routeRuntime'\n\ninterface WevuRegisterMeta extends RegisterMeta {\n kind: 'app' | 'page' | 'component'\n}\n\ntype RuntimeConstructorName = 'App' | 'Page' | 'Component'\n\nfunction createRuntimeConstructor(meta: WevuRegisterMeta, name: RuntimeConstructorName) {\n return (definition: Record<string, any>) => {\n if (name === 'App') {\n registerApp(definition, meta)\n }\n else if (name === 'Page' || meta.kind === 'page') {\n registerPage(definition, meta)\n }\n else {\n registerComponent(definition, meta)\n }\n return definition\n }\n}\n\nfunction withRuntimeConstructor<T>(\n name: 'App' | 'Component',\n constructor: (options: Record<string, any>) => unknown,\n run: () => T,\n) {\n const target = globalThis as Record<string, any>\n const hadOwn = Object.prototype.hasOwnProperty.call(target, name)\n const previous = target[name]\n target[name] = constructor\n try {\n return run()\n }\n finally {\n if (hadOwn) {\n target[name] = previous\n }\n else {\n delete target[name]\n }\n }\n}\n\n/**\n * 将 Wevu App 注册过程接入 Web 页面栈。\n */\nexport function registerWebWevuApp(options: Record<string, any>, meta: WevuRegisterMeta): void {\n // App 生命周期只注册一次,但每次模块求值都应发布最新样式。\n setAppStyle(meta.style ?? '')\n const pendingRegistration = takePendingRuntimeAppRegistration()\n withRuntimeConstructor('App', definition => registerApp(definition, meta), () => {\n if (pendingRegistration) {\n pendingRegistration.register()\n return pendingRegistration.app\n }\n return createApp(options)\n })\n}\n\n/**\n * 将 Wevu 页面或组件注册过程接入 Web 自定义元素。\n */\nexport function registerWebWevuComponent(options: Record<string, any>, meta: WevuRegisterMeta): void {\n // Web 依赖 prop 构造器解码 DOM 属性,不使用小程序宿主的 nullable transport 降级。\n withRuntimeConstructor('Component', (definition) => {\n return meta.kind === 'page'\n ? registerPage(definition, meta)\n : registerComponent(definition, meta)\n }, () => createWevuComponent({ ...options, allowNullPropInput: false }))\n}\n\n/**\n * 保留公开 Wevu 工厂行为,并使用当前模块元数据完成 Web 注册。\n */\nexport function registerWebWevuComponentFactory<TArgs extends unknown[], TResult>(\n factory: (...args: TArgs) => TResult,\n meta: WevuRegisterMeta,\n ...args: TArgs\n): TResult {\n return withRuntimeConstructor('Component', (definition) => {\n return meta.kind === 'page'\n ? registerPage(definition, meta)\n : registerComponent(definition, meta)\n }, () => factory(...args))\n}\n\n/**\n * 在原生模块同步求值期间安装带页面元数据的宿主注册函数。\n */\nexport function installWebModuleRegistration(\n meta: WevuRegisterMeta,\n target: Record<string, any> = globalThis,\n): () => void {\n const names: RuntimeConstructorName[] = meta.kind === 'app'\n ? ['App']\n : meta.kind === 'page'\n ? ['Page', 'Component']\n : ['Component']\n const previous = names.map(name => ({\n hadOwn: Object.prototype.hasOwnProperty.call(target, name),\n name,\n value: target[name],\n }))\n const installed = new Map<RuntimeConstructorName, (definition: Record<string, any>) => Record<string, any>>()\n\n for (const name of names) {\n const constructor = createRuntimeConstructor(meta, name)\n installed.set(name, constructor)\n target[name] = constructor\n }\n\n return () => {\n for (const entry of previous) {\n if (target[entry.name] !== installed.get(entry.name)) {\n continue\n }\n if (entry.hadOwn) {\n target[entry.name] = entry.value\n }\n else {\n delete target[entry.name]\n }\n }\n }\n}\n"],"mappings":";;;;;AAWA,SAAS,yBAAyB,MAAwB,MAA8B;CACtF,QAAQ,eAAoC;EAC1C,IAAI,SAAS,OACX,YAAY,YAAY,IAAI;OAEzB,IAAI,SAAS,UAAU,KAAK,SAAS,QACxC,aAAa,YAAY,IAAI;OAG7B,kBAAkB,YAAY,IAAI;EAEpC,OAAO;CACT;AACF;AAEA,SAAS,uBACP,MACA,aACA,KACA;CACA,MAAM,SAAS;CACf,MAAM,SAAS,OAAO,UAAU,eAAe,KAAK,QAAQ,IAAI;CAChE,MAAM,WAAW,OAAO;CACxB,OAAO,QAAQ;CACf,IAAI;EACF,OAAO,IAAI;CACb,UACQ;EACN,IAAI,QACF,OAAO,QAAQ;OAGf,OAAO,OAAO;CAElB;AACF;;;;AAKA,SAAgB,mBAAmB,SAA8B,MAA8B;CAE7F,YAAY,KAAK,SAAS,EAAE;CAC5B,MAAM,sBAAsB,kCAAkC;CAC9D,uBAAuB,QAAO,eAAc,YAAY,YAAY,IAAI,SAAS;EAC/E,IAAI,qBAAqB;GACvB,oBAAoB,SAAS;GAC7B,OAAO,oBAAoB;EAC7B;EACA,OAAO,UAAU,OAAO;CAC1B,CAAC;AACH;;;;AAKA,SAAgB,yBAAyB,SAA8B,MAA8B;CAEnG,uBAAuB,cAAc,eAAe;EAClD,OAAO,KAAK,SAAS,SACjB,aAAa,YAAY,IAAI,IAC7B,kBAAkB,YAAY,IAAI;CACxC,SAAS,oBAAoB;EAAE,GAAG;EAAS,oBAAoB;CAAM,CAAC,CAAC;AACzE;;;;AAKA,SAAgB,gCACd,SACA,MACA,GAAG,MACM;CACT,OAAO,uBAAuB,cAAc,eAAe;EACzD,OAAO,KAAK,SAAS,SACjB,aAAa,YAAY,IAAI,IAC7B,kBAAkB,YAAY,IAAI;CACxC,SAAS,QAAQ,GAAG,IAAI,CAAC;AAC3B;;;;AAKA,SAAgB,6BACd,MACA,SAA8B,YAClB;CACZ,MAAM,QAAkC,KAAK,SAAS,QAClD,CAAC,KAAK,IACN,KAAK,SAAS,SACZ,CAAC,QAAQ,WAAW,IACpB,CAAC,WAAW;CAClB,MAAM,WAAW,MAAM,KAAI,UAAS;EAClC,QAAQ,OAAO,UAAU,eAAe,KAAK,QAAQ,IAAI;EACzD;EACA,OAAO,OAAO;CAChB,EAAE;CACF,MAAM,4BAAY,IAAI,IAAsF;CAE5G,KAAK,MAAM,QAAQ,OAAO;EACxB,MAAM,cAAc,yBAAyB,MAAM,IAAI;EACvD,UAAU,IAAI,MAAM,WAAW;EAC/B,OAAO,QAAQ;CACjB;CAEA,aAAa;EACX,KAAK,MAAM,SAAS,UAAU;GAC5B,IAAI,OAAO,MAAM,UAAU,UAAU,IAAI,MAAM,IAAI,GACjD;GAEF,IAAI,MAAM,QACR,OAAO,MAAM,QAAQ,MAAM;QAG3B,OAAO,OAAO,MAAM;EAExB;CACF;AACF"}
|
package/dist/shared/wxml.mjs
CHANGED
|
@@ -16,7 +16,11 @@ const TEMPLATE_IMPORT_TAG_NAMES = Array.from(/* @__PURE__ */ new Set(["import",
|
|
|
16
16
|
const TEMPLATE_INCLUDE_TAG_NAMES = Array.from(/* @__PURE__ */ new Set(["include", ...CONTROL_ATTR_PREFIXES.map((prefix) => `${prefix}-include`)]));
|
|
17
17
|
const CONTROL_ATTRS = /* @__PURE__ */ new Set([...CONTROL_ATTR_PREFIXES.flatMap((prefix) => CONTROL_ATTR_SUFFIXES.map((suffix) => `${prefix}:${suffix}`))]);
|
|
18
18
|
const EVENT_PREFIX_RE = /^(?:bind|catch|mut-bind|capture-bind|capture-catch)([\w-]+)$/;
|
|
19
|
-
const EVENT_KIND_ALIAS = {
|
|
19
|
+
const EVENT_KIND_ALIAS = {
|
|
20
|
+
tap: "click",
|
|
21
|
+
longtap: "contextmenu",
|
|
22
|
+
longpress: "contextmenu"
|
|
23
|
+
};
|
|
20
24
|
const SELF_CLOSING_TAGS = /* @__PURE__ */ new Set([
|
|
21
25
|
"area",
|
|
22
26
|
"base",
|
package/dist/shared/wxml.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wxml.mjs","names":[],"sources":["../../src/shared/wxml.ts"],"sourcesContent":["import { getSupportedMiniProgramDirectivePrefixes } from '@weapp-core/shared/platforms/runtime'\nimport { resolveNativeComponentWebTag } from './nativeComponents'\n\nconst CONTROL_ATTR_SUFFIXES = [\n 'if',\n 'elif',\n 'else',\n 'for',\n 'for-item',\n 'for-index',\n 'key',\n] as const\n\nexport type ControlAttrSuffix = typeof CONTROL_ATTR_SUFFIXES[number]\n\nexport const CONTROL_ATTR_PREFIXES = [...getSupportedMiniProgramDirectivePrefixes()]\n\nexport const TEMPLATE_IMPORT_TAG_NAMES = Array.from(new Set([\n 'import',\n ...CONTROL_ATTR_PREFIXES.map(prefix => `${prefix}-import`),\n]))\n\nexport const TEMPLATE_INCLUDE_TAG_NAMES = Array.from(new Set([\n 'include',\n ...CONTROL_ATTR_PREFIXES.map(prefix => `${prefix}-include`),\n]))\n\nexport const CONTROL_ATTRS = new Set([\n ...CONTROL_ATTR_PREFIXES.flatMap(prefix => CONTROL_ATTR_SUFFIXES.map(suffix => `${prefix}:${suffix}`)),\n])\n\nexport const EVENT_PREFIX_RE = /^(?:bind|catch|mut-bind|capture-bind|capture-catch)([\\w-]+)$/\nexport const EVENT_KIND_ALIAS: Record<string, string> = {\n tap: 'click',\n}\n\nexport const SELF_CLOSING_TAGS = new Set([\n 'area',\n 'base',\n 'br',\n 'col',\n 'embed',\n 'hr',\n 'img',\n 'image',\n 'input',\n 'link',\n 'meta',\n 'param',\n 'source',\n 'track',\n 'wbr',\n])\n\nexport function resolveControlAttributeName(\n attribs: Record<string, string>,\n suffix: ControlAttrSuffix,\n): string | undefined {\n for (const prefix of CONTROL_ATTR_PREFIXES) {\n const name = `${prefix}:${suffix}`\n if (name in attribs) {\n return name\n }\n }\n return undefined\n}\n\nexport function resolveControlAttributeValue(\n attribs: Record<string, string>,\n suffix: ControlAttrSuffix,\n): string | undefined {\n const name = resolveControlAttributeName(attribs, suffix)\n return name ? attribs[name] : undefined\n}\n\nexport function hasControlAttribute(\n attribs: Record<string, string>,\n suffix: ControlAttrSuffix,\n): boolean {\n return resolveControlAttributeName(attribs, suffix) !== undefined\n}\n\nexport function normalizeTagName(name: string) {\n const nativeComponentTag = resolveNativeComponentWebTag(name)\n if (nativeComponentTag) {\n return nativeComponentTag\n }\n switch (name) {\n case 'block':\n return '#fragment'\n case 'slot':\n return 'slot'\n default:\n return name || 'div'\n }\n}\n\nexport function normalizeAttributeName(name: string) {\n if (name === 'class' || name === 'style' || name.startsWith('data-')) {\n return name\n }\n return name.replace(/[A-Z]/g, match => `-${match.toLowerCase()}`)\n}\n"],"mappings":";;;;AAGA,MAAM,wBAAwB;CAC5B;CACA;CACA;CACA;CACA;CACA;CACA;AACF;AAIA,MAAa,wBAAwB,CAAC,GAAG,yCAAyC,CAAC;AAEnF,MAAa,4BAA4B,MAAM,qBAAK,IAAI,IAAI,CAC1D,UACA,GAAG,sBAAsB,KAAI,WAAU,GAAG,OAAO,QAAQ,CAC3D,CAAC,CAAC;AAEF,MAAa,6BAA6B,MAAM,qBAAK,IAAI,IAAI,CAC3D,WACA,GAAG,sBAAsB,KAAI,WAAU,GAAG,OAAO,SAAS,CAC5D,CAAC,CAAC;AAEF,MAAa,gCAAgB,IAAI,IAAI,CACnC,GAAG,sBAAsB,SAAQ,WAAU,sBAAsB,KAAI,WAAU,GAAG,OAAO,GAAG,QAAQ,CAAC,CACvG,CAAC;AAED,MAAa,kBAAkB;AAC/B,MAAa,mBAA2C,
|
|
1
|
+
{"version":3,"file":"wxml.mjs","names":[],"sources":["../../src/shared/wxml.ts"],"sourcesContent":["import { getSupportedMiniProgramDirectivePrefixes } from '@weapp-core/shared/platforms/runtime'\nimport { resolveNativeComponentWebTag } from './nativeComponents'\n\nconst CONTROL_ATTR_SUFFIXES = [\n 'if',\n 'elif',\n 'else',\n 'for',\n 'for-item',\n 'for-index',\n 'key',\n] as const\n\nexport type ControlAttrSuffix = typeof CONTROL_ATTR_SUFFIXES[number]\n\nexport const CONTROL_ATTR_PREFIXES = [...getSupportedMiniProgramDirectivePrefixes()]\n\nexport const TEMPLATE_IMPORT_TAG_NAMES = Array.from(new Set([\n 'import',\n ...CONTROL_ATTR_PREFIXES.map(prefix => `${prefix}-import`),\n]))\n\nexport const TEMPLATE_INCLUDE_TAG_NAMES = Array.from(new Set([\n 'include',\n ...CONTROL_ATTR_PREFIXES.map(prefix => `${prefix}-include`),\n]))\n\nexport const CONTROL_ATTRS = new Set([\n ...CONTROL_ATTR_PREFIXES.flatMap(prefix => CONTROL_ATTR_SUFFIXES.map(suffix => `${prefix}:${suffix}`)),\n])\n\nexport const EVENT_PREFIX_RE = /^(?:bind|catch|mut-bind|capture-bind|capture-catch)([\\w-]+)$/\nexport const EVENT_KIND_ALIAS: Record<string, string> = {\n tap: 'click',\n longtap: 'contextmenu',\n longpress: 'contextmenu',\n}\n\nexport const SELF_CLOSING_TAGS = new Set([\n 'area',\n 'base',\n 'br',\n 'col',\n 'embed',\n 'hr',\n 'img',\n 'image',\n 'input',\n 'link',\n 'meta',\n 'param',\n 'source',\n 'track',\n 'wbr',\n])\n\nexport function resolveControlAttributeName(\n attribs: Record<string, string>,\n suffix: ControlAttrSuffix,\n): string | undefined {\n for (const prefix of CONTROL_ATTR_PREFIXES) {\n const name = `${prefix}:${suffix}`\n if (name in attribs) {\n return name\n }\n }\n return undefined\n}\n\nexport function resolveControlAttributeValue(\n attribs: Record<string, string>,\n suffix: ControlAttrSuffix,\n): string | undefined {\n const name = resolveControlAttributeName(attribs, suffix)\n return name ? attribs[name] : undefined\n}\n\nexport function hasControlAttribute(\n attribs: Record<string, string>,\n suffix: ControlAttrSuffix,\n): boolean {\n return resolveControlAttributeName(attribs, suffix) !== undefined\n}\n\nexport function normalizeTagName(name: string) {\n const nativeComponentTag = resolveNativeComponentWebTag(name)\n if (nativeComponentTag) {\n return nativeComponentTag\n }\n switch (name) {\n case 'block':\n return '#fragment'\n case 'slot':\n return 'slot'\n default:\n return name || 'div'\n }\n}\n\nexport function normalizeAttributeName(name: string) {\n if (name === 'class' || name === 'style' || name.startsWith('data-')) {\n return name\n }\n return name.replace(/[A-Z]/g, match => `-${match.toLowerCase()}`)\n}\n"],"mappings":";;;;AAGA,MAAM,wBAAwB;CAC5B;CACA;CACA;CACA;CACA;CACA;CACA;AACF;AAIA,MAAa,wBAAwB,CAAC,GAAG,yCAAyC,CAAC;AAEnF,MAAa,4BAA4B,MAAM,qBAAK,IAAI,IAAI,CAC1D,UACA,GAAG,sBAAsB,KAAI,WAAU,GAAG,OAAO,QAAQ,CAC3D,CAAC,CAAC;AAEF,MAAa,6BAA6B,MAAM,qBAAK,IAAI,IAAI,CAC3D,WACA,GAAG,sBAAsB,KAAI,WAAU,GAAG,OAAO,SAAS,CAC5D,CAAC,CAAC;AAEF,MAAa,gCAAgB,IAAI,IAAI,CACnC,GAAG,sBAAsB,SAAQ,WAAU,sBAAsB,KAAI,WAAU,GAAG,OAAO,GAAG,QAAQ,CAAC,CACvG,CAAC;AAED,MAAa,kBAAkB;AAC/B,MAAa,mBAA2C;CACtD,KAAK;CACL,SAAS;CACT,WAAW;AACb;AAEA,MAAa,oCAAoB,IAAI,IAAI;CACvC;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF,CAAC;AAED,SAAgB,4BACd,SACA,QACoB;CACpB,KAAK,MAAM,UAAU,uBAAuB;EAC1C,MAAM,OAAO,GAAG,OAAO,GAAG;EAC1B,IAAI,QAAQ,SACV,OAAO;CAEX;AAEF;AAEA,SAAgB,6BACd,SACA,QACoB;CACpB,MAAM,OAAO,4BAA4B,SAAS,MAAM;CACxD,OAAO,OAAO,QAAQ,QAAQ;AAChC;AAEA,SAAgB,oBACd,SACA,QACS;CACT,OAAO,4BAA4B,SAAS,MAAM,MAAM;AAC1D;AAEA,SAAgB,iBAAiB,MAAc;CAC7C,MAAM,qBAAqB,6BAA6B,IAAI;CAC5D,IAAI,oBACF,OAAO;CAET,QAAQ,MAAR;EACE,KAAK,SACH,OAAO;EACT,KAAK,QACH,OAAO;EACT,SACE,OAAO,QAAQ;CACnB;AACF;AAEA,SAAgB,uBAAuB,MAAc;CACnD,IAAI,SAAS,WAAW,SAAS,WAAW,KAAK,WAAW,OAAO,GACjE,OAAO;CAET,OAAO,KAAK,QAAQ,WAAU,UAAS,IAAI,MAAM,YAAY,GAAG;AAClE"}
|