wevu 6.19.1 → 6.19.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/dev/_virtual/{_@oxc-project_runtime@0.142.0 → _@oxc-project_runtime@0.143.0}/helpers/esm/defineProperty.mjs +1 -1
- package/dist/dev/_virtual/{_@oxc-project_runtime@0.142.0 → _@oxc-project_runtime@0.143.0}/helpers/esm/toPrimitive.mjs +1 -1
- package/dist/dev/_virtual/{_@oxc-project_runtime@0.142.0 → _@oxc-project_runtime@0.143.0}/helpers/esm/toPropertyKey.mjs +1 -1
- package/dist/dev/_virtual/{_@oxc-project_runtime@0.142.0 → _@oxc-project_runtime@0.143.0}/helpers/esm/typeof.mjs +1 -1
- package/dist/dev/package.mjs +1 -1
- package/dist/dev/reactivity/core.mjs +1 -1
- package/dist/dev/reactivity/ref.mjs +1 -1
- package/dist/dev/runtime/layoutBridge.mjs.map +1 -1
- package/dist/dev/runtime/register/runtimeInstance/setupContext.mjs +4 -2
- package/dist/dev/runtime/register/runtimeInstance/setupContext.mjs.map +1 -1
- package/dist/dev/runtime/templateRefs.mjs +4 -3
- package/dist/dev/runtime/templateRefs.mjs.map +1 -1
- package/dist/dev/store/define/optionsStyle.mjs +17 -15
- package/dist/dev/store/define/optionsStyle.mjs.map +1 -1
- package/dist/dev/store/define/setupStyle.mjs +17 -15
- package/dist/dev/store/define/setupStyle.mjs.map +1 -1
- package/dist/package.mjs +1 -1
- package/dist/reactivity/core.mjs +1 -1
- package/dist/reactivity/ref.mjs +1 -1
- package/package.json +5 -5
- /package/dist/_virtual/{_@oxc-project_runtime@0.142.0 → _@oxc-project_runtime@0.143.0}/helpers/esm/defineProperty.mjs +0 -0
- /package/dist/_virtual/{_@oxc-project_runtime@0.142.0 → _@oxc-project_runtime@0.143.0}/helpers/esm/toPrimitive.mjs +0 -0
- /package/dist/_virtual/{_@oxc-project_runtime@0.142.0 → _@oxc-project_runtime@0.143.0}/helpers/esm/toPropertyKey.mjs +0 -0
- /package/dist/_virtual/{_@oxc-project_runtime@0.142.0 → _@oxc-project_runtime@0.143.0}/helpers/esm/typeof.mjs +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import toPropertyKey from "./toPropertyKey.mjs";
|
|
2
2
|
|
|
3
|
-
//#region \0@oxc-project+runtime@0.
|
|
3
|
+
//#region \0@oxc-project+runtime@0.143.0/helpers/esm/defineProperty.js
|
|
4
4
|
function _defineProperty(e, r, t) {
|
|
5
5
|
return (r = toPropertyKey(r)) in e ? Object.defineProperty(e, r, {
|
|
6
6
|
value: t,
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import _typeof from "./typeof.mjs";
|
|
2
2
|
|
|
3
|
-
//#region \0@oxc-project+runtime@0.
|
|
3
|
+
//#region \0@oxc-project+runtime@0.143.0/helpers/esm/toPrimitive.js
|
|
4
4
|
function toPrimitive(t, r) {
|
|
5
5
|
if ("object" != _typeof(t) || !t) return t;
|
|
6
6
|
var e = t[Symbol.toPrimitive];
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import _typeof from "./typeof.mjs";
|
|
2
2
|
import toPrimitive from "./toPrimitive.mjs";
|
|
3
3
|
|
|
4
|
-
//#region \0@oxc-project+runtime@0.
|
|
4
|
+
//#region \0@oxc-project+runtime@0.143.0/helpers/esm/toPropertyKey.js
|
|
5
5
|
function toPropertyKey(t) {
|
|
6
6
|
var i = toPrimitive(t, "string");
|
|
7
7
|
return "symbol" == _typeof(i) ? i : i + "";
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
//#region \0@oxc-project+runtime@0.
|
|
1
|
+
//#region \0@oxc-project+runtime@0.143.0/helpers/esm/typeof.js
|
|
2
2
|
function _typeof(o) {
|
|
3
3
|
"@babel/helpers - typeof";
|
|
4
4
|
return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function(o) {
|
package/dist/dev/package.mjs
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { queueJob } from "../scheduler.mjs";
|
|
2
|
-
import _defineProperty from "../_virtual/_@oxc-project_runtime@0.
|
|
2
|
+
import _defineProperty from "../_virtual/_@oxc-project_runtime@0.143.0/helpers/esm/defineProperty.mjs";
|
|
3
3
|
|
|
4
4
|
//#region src/reactivity/core.ts
|
|
5
5
|
const targetMap = /* @__PURE__ */ new WeakMap();
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import _defineProperty from "../_virtual/_@oxc-project_runtime@0.
|
|
1
|
+
import _defineProperty from "../_virtual/_@oxc-project_runtime@0.143.0/helpers/esm/defineProperty.mjs";
|
|
2
2
|
import { trackEffects, triggerEffects } from "./core.mjs";
|
|
3
3
|
import { convertToReactive, markRaw } from "./reactive.mjs";
|
|
4
4
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"layoutBridge.mjs","names":[],"sources":["../../../src/runtime/layoutBridge.ts"],"sourcesContent":["import type { Ref } from '../reactivity'\nimport {\n WEVU_LAYOUT_BRIDGE_PAGE_KEYS,\n WEVU_NATIVE_INSTANCE_KEY,\n WEVU_PUBLIC_RUNTIME_KEY,\n} from '@weapp-core/constants'\nimport { isRef } from '../reactivity'\nimport { getCurrentInstance, getCurrentSetupContext, onAttached, onDetached } from './hooks'\nimport { getCurrentMiniProgramPages } from './platform'\nimport { getTemplateRefMap } from './templateRefs/helpers'\n\ntype LayoutBridgeContext = Record<string, any>\ntype LayoutBridgeComponentResolver = (selector: string) => any\ntype LayoutHostMap = Record<string, unknown>\nexport type LayoutBridgeInstance<T = LayoutBridgeContext> = T & {\n selectComponent?: LayoutBridgeComponentResolver\n}\nexport interface LayoutHostBinding {\n key: string\n refName?: string\n selector: string\n kind?: 'component'\n}\ninterface LayoutHostResolveOptions<T = any> {\n context?: T\n fallbackContext?: T\n interval?: number\n retries?: number\n}\n\n/**\n * @description 对 layout host key 去重并过滤空字符串。\n */\nfunction normalizeLayoutHostKeys(keys: string | string[]) {\n return Array.from(new Set(Array.isArray(keys) ? keys : [keys]))\n .filter((key): key is string => typeof key === 'string' && key.length > 0)\n}\n\n/**\n * @description 解析小程序页面实例的稳定身份 key。\n */\nfunction resolvePageIdentityKeys(page?: Record<string, any>): string[] {\n if (!page || typeof page !== 'object') {\n return []\n }\n\n const keys: string[] = []\n const route = typeof page.route === 'string' ? page.route.replace(/^\\/+/, '') : ''\n if (route) {\n keys.push(`route:${route}`)\n }\n for (const [prefix, field] of [\n ['webview', '__wxWebviewId__'],\n ['exparser', '__wxExparserNodeId__'],\n ] as const) {\n const value = page[field]\n if (typeof value === 'number' || typeof value === 'string') {\n keys.push(`${prefix}:${String(value)}`)\n }\n }\n\n return Array.from(new Set(keys))\n}\n\n/**\n * @description 创建小程序 layout host 注册表。\n */\nfunction createLayoutHostRegistry<TBridge>() {\n const registries = new Map<string, Map<string, TBridge>>()\n\n function register(keys: string | string[], bridge: TBridge, pageKeys: string[]) {\n const normalizedKeys = normalizeLayoutHostKeys(keys)\n if (normalizedKeys.length === 0 || pageKeys.length === 0) {\n return null\n }\n\n for (const pageKey of pageKeys) {\n const registry = registries.get(pageKey) ?? new Map<string, TBridge>()\n for (const key of normalizedKeys) {\n registry.set(key, bridge)\n }\n registries.set(pageKey, registry)\n }\n\n return normalizedKeys\n }\n\n function unregister(keys: string | string[], bridge: TBridge, pageKeys: string[]) {\n const normalizedKeys = normalizeLayoutHostKeys(keys)\n if (normalizedKeys.length === 0 || pageKeys.length === 0) {\n return false\n }\n\n let removed = false\n for (const pageKey of pageKeys) {\n const registry = registries.get(pageKey)\n if (!registry) {\n continue\n }\n\n for (const key of normalizedKeys) {\n if (registry.get(key) === bridge) {\n registry.delete(key)\n removed = true\n }\n }\n\n if (registry.size === 0) {\n registries.delete(pageKey)\n }\n }\n\n return removed\n }\n\n function resolveBridge(key: string, pageKeys: string[]) {\n return pageKeys\n .map(pageKey => registries.get(pageKey)?.get(key))\n .find(Boolean)\n }\n\n function resolveHost<THost>(\n key: string,\n pageKeys: string[],\n resolver: (bridge: TBridge, key: string) => THost | null | undefined,\n ) {\n const bridge = resolveBridge(key, pageKeys)\n if (!bridge) {\n return null\n }\n return resolver(bridge, key) ?? null\n }\n\n function waitForHost<THost>(\n key: string,\n resolvePageKeys: () => string[],\n resolver: (bridge: TBridge, key: string) => THost | null | undefined,\n options: { interval?: number, retries?: number } = {},\n ): Promise<THost | null> {\n const retries = options.retries ?? 20\n const interval = options.interval ?? 16\n const host = resolveHost(key, resolvePageKeys(), resolver)\n if (host || retries <= 0) {\n return Promise.resolve(host)\n }\n\n return new Promise((resolve) => {\n setTimeout(() => {\n resolve(waitForHost(key, resolvePageKeys, resolver, {\n ...options,\n retries: retries - 1,\n }))\n }, interval)\n })\n }\n\n return {\n register,\n resolveBridge,\n resolveHost,\n unregister,\n waitForHost,\n }\n}\n\nconst pageLayoutBridgeRegistry = createLayoutHostRegistry<LayoutBridgeContext>()\n\nfunction resolveCurrentPageInstance() {\n const pages = getCurrentMiniProgramPages()\n return pages[pages.length - 1]\n}\n\nfunction resolvePageKeys(page?: LayoutBridgeContext) {\n return resolvePageIdentityKeys(page as Record<string, any> | undefined)\n}\n\nfunction resolveNativeLayoutContext(context?: LayoutBridgeContext) {\n if (!context || typeof context !== 'object') {\n return undefined\n }\n\n const runtimeNativeInstance = context[WEVU_PUBLIC_RUNTIME_KEY]?.state?.[WEVU_NATIVE_INSTANCE_KEY]\n if (runtimeNativeInstance && typeof runtimeNativeInstance === 'object') {\n return runtimeNativeInstance as LayoutBridgeContext\n }\n\n const stateNativeInstance = context.$state?.[WEVU_NATIVE_INSTANCE_KEY]\n if (stateNativeInstance && typeof stateNativeInstance === 'object') {\n return stateNativeInstance as LayoutBridgeContext\n }\n\n if (context[WEVU_NATIVE_INSTANCE_KEY] && typeof context[WEVU_NATIVE_INSTANCE_KEY] === 'object') {\n return context[WEVU_NATIVE_INSTANCE_KEY] as LayoutBridgeContext\n }\n\n return context\n}\n\nfunction resolvePageFromContext(\n context?: LayoutBridgeContext,\n visited = new Set<LayoutBridgeContext>(),\n): LayoutBridgeContext | undefined {\n if (!context || typeof context !== 'object' || visited.has(context)) {\n return resolveCurrentPageInstance()\n }\n visited.add(context)\n\n if (typeof context.__wevuSetPageLayout === 'function') {\n return context\n }\n\n const nativeContext = resolveNativeLayoutContext(context)\n if (nativeContext && nativeContext !== context) {\n const nativePage = resolvePageFromContext(nativeContext, visited)\n if (nativePage) {\n return nativePage\n }\n }\n\n const publicNativePage = context.$\n if (publicNativePage && typeof publicNativePage === 'object') {\n const nativePage = resolvePageFromContext(publicNativePage as LayoutBridgeContext, visited)\n if (nativePage) {\n return nativePage\n }\n }\n\n const ownerContext = nativeContext ?? context\n const selectOwnerComponent = ownerContext.selectOwnerComponent\n if (typeof selectOwnerComponent === 'function') {\n try {\n const owner = selectOwnerComponent.call(ownerContext) as LayoutBridgeContext | undefined\n if (owner && owner !== ownerContext) {\n const ownerPage = resolvePageFromContext(owner, visited)\n if (ownerPage) {\n return ownerPage\n }\n }\n }\n catch {\n // 部分宿主或生命周期阶段暂不支持 owner 查询,继续使用页面栈兜底。\n }\n }\n\n return resolveCurrentPageInstance()\n}\n\nfunction resolveHostEntry(entry: unknown) {\n if (typeof entry === 'function') {\n return (entry as () => unknown)()\n }\n if (isRef(entry as Ref<unknown>)) {\n return (entry as Ref<unknown>).value\n }\n return entry\n}\n\nfunction findLayoutHostBinding(bindings: LayoutHostBinding[], key: string) {\n return bindings.find(binding => binding.key === key)\n}\n\nfunction safeSelectComponent(target: LayoutBridgeContext | undefined, selector: string) {\n const selectComponent = target?.selectComponent\n if (typeof selectComponent !== 'function') {\n return null\n }\n try {\n return selectComponent.call(target, selector) ?? null\n }\n catch {\n return null\n }\n}\n\nfunction resolveDeclaredLayoutHostFromRefs(\n binding: LayoutHostBinding,\n context: LayoutBridgeContext,\n) {\n if (!binding.refName) {\n return null\n }\n const refMap = getTemplateRefMap(context as any)\n const stateRefs = context[WEVU_PUBLIC_RUNTIME_KEY]?.state?.$refs\n ?? context.__wevu?.state?.$refs\n ?? context.$state?.$refs\n ?? context.$refs\n const refValue = refMap?.get(binding.refName)?.value\n ?? stateRefs?.[binding.refName]\n if (Array.isArray(refValue)) {\n return refValue[0] ?? null\n }\n return refValue ?? null\n}\n\nfunction createDeclaredLayoutHostBridge(bindings: LayoutHostBinding[], context: LayoutBridgeContext) {\n const nativeContext = resolveNativeLayoutContext(context)\n const bridgeBase = nativeContext && typeof nativeContext === 'object'\n ? Object.create(nativeContext)\n : {}\n return Object.assign(bridgeBase, {\n selectComponent(key: string) {\n const binding = findLayoutHostBinding(bindings, key)\n if (!binding) {\n return null\n }\n if (binding.kind === 'component' || !binding.kind) {\n const cachedHost = resolveDeclaredLayoutHostFromRefs(binding, context)\n if (cachedHost) {\n return cachedHost\n }\n return safeSelectComponent(nativeContext, binding.selector)\n ?? safeSelectComponent(resolveCurrentPageInstance(), binding.selector)\n ?? null\n }\n return null\n },\n })\n}\n\n/**\n * 为当前页面注册 layout bridge,使页面或子组件可消费 layout 内部能力。\n */\nexport function registerPageLayoutBridge(\n selectors: string | string[],\n context?: LayoutBridgeContext,\n) {\n const bridgeContext = context ?? getCurrentInstance<LayoutBridgeContext>()\n const page = resolvePageFromContext(bridgeContext)\n const pageKeys = resolvePageKeys(page)\n if (!bridgeContext || !page || pageKeys.length === 0) {\n return false\n }\n\n const normalizedSelectors = pageLayoutBridgeRegistry.register(selectors, bridgeContext, pageKeys)\n if (!normalizedSelectors) {\n return false\n }\n\n bridgeContext[WEVU_LAYOUT_BRIDGE_PAGE_KEYS] = pageKeys\n return true\n}\n\n/**\n * 移除当前页面的 layout bridge 注册。\n */\nexport function unregisterPageLayoutBridge(\n selectors: string | string[],\n context?: LayoutBridgeContext,\n) {\n const bridgeContext = context ?? getCurrentInstance<LayoutBridgeContext>()\n const page = resolvePageFromContext(bridgeContext)\n const pageKeys = bridgeContext?.[WEVU_LAYOUT_BRIDGE_PAGE_KEYS] ?? resolvePageKeys(page)\n if (!bridgeContext || !Array.isArray(pageKeys) || pageKeys.length === 0) {\n return false\n }\n\n const removed = pageLayoutBridgeRegistry.unregister(selectors, bridgeContext, pageKeys)\n delete bridgeContext[WEVU_LAYOUT_BRIDGE_PAGE_KEYS]\n return removed\n}\n\n/**\n * 解析当前页面已注册的 layout bridge,找不到时回退到传入上下文。\n */\nexport function resolveLayoutBridge<T = any>(\n selector: string,\n fallbackContext?: T,\n) {\n const page = resolveCurrentPageInstance() ?? resolvePageFromContext(fallbackContext as LayoutBridgeContext | undefined)\n const bridgeContext = pageLayoutBridgeRegistry.resolveBridge(selector, resolvePageKeys(page))\n return (bridgeContext ?? fallbackContext ?? getCurrentInstance()) as LayoutBridgeInstance<T> | undefined\n}\n\n/**\n * 解析当前页面 layout 内通过指定 key 暴露的宿主实例。\n */\nexport function resolveLayoutHost<T = any, C = any>(\n key: string,\n options: LayoutHostResolveOptions<C> = {},\n) {\n const context = options.context ?? options.fallbackContext\n const page = resolveCurrentPageInstance() ?? resolvePageFromContext(context as LayoutBridgeContext | undefined)\n return pageLayoutBridgeRegistry.resolveHost<T>(\n key,\n resolvePageKeys(page),\n (bridge, key) => bridge.selectComponent?.(key) as T | null,\n )\n}\n\n/**\n * 等待当前页面 layout 宿主实例可用,适合页面初次进入时的异步宿主解析。\n */\nexport function waitForLayoutHost<T = any, C = any>(\n key: string,\n options: LayoutHostResolveOptions<C> = {},\n) {\n const context = options.context ?? options.fallbackContext\n return pageLayoutBridgeRegistry.waitForHost<T>(\n key,\n () => resolvePageKeys(resolveCurrentPageInstance() ?? resolvePageFromContext(context as LayoutBridgeContext | undefined)),\n (bridge, key) => bridge.selectComponent?.(key) as T | null,\n options,\n )\n}\n\n/**\n * 在 layout 生命周期内暴露 bridge,使页面或子组件可访问 layout 内部实例。\n */\nexport function useLayoutBridge(\n selectors: string | string[],\n options: {\n resolveComponent?: LayoutBridgeComponentResolver\n } = {},\n) {\n if (!getCurrentSetupContext()) {\n throw new Error('useLayoutBridge() 必须在 setup() 的同步阶段调用')\n }\n\n const context = getCurrentInstance<LayoutBridgeContext>()\n const normalizedSelectors = normalizeLayoutHostKeys(selectors)\n const resolveComponent = options.resolveComponent\n const nativeContext = resolveNativeLayoutContext(context)\n const bridgeBase = nativeContext && typeof nativeContext === 'object'\n ? Object.create(nativeContext)\n : {}\n const bridge = Object.assign(bridgeBase, {\n selectComponent(selector: string) {\n if (!normalizedSelectors.includes(selector)) {\n return null\n }\n\n const resolvedComponent = resolveComponent?.(selector)\n if (resolvedComponent !== undefined) {\n return resolvedComponent\n }\n\n const nativeContext = resolveNativeLayoutContext(context)\n const directMatch = nativeContext?.selectComponent?.(selector)\n if (directMatch) {\n return directMatch\n }\n\n const currentPage = resolveCurrentPageInstance()\n return currentPage?.selectComponent?.(selector) ?? null\n },\n })\n\n registerPageLayoutBridge(normalizedSelectors, bridge)\n\n onAttached(() => {\n registerPageLayoutBridge(normalizedSelectors, bridge)\n })\n\n onDetached(() => {\n unregisterPageLayoutBridge(normalizedSelectors, bridge)\n })\n}\n\n/**\n * 使用编译期注入的宿主绑定信息,直接从当前 layout 运行时实例解析子组件宿主并注册 bridge。\n */\nexport function registerRuntimeLayoutHosts(\n bindings: LayoutHostBinding[],\n context?: LayoutBridgeContext,\n) {\n if (!bindings.length) {\n return null\n }\n const bridgeContext = context ?? getCurrentInstance<LayoutBridgeContext>()\n if (!bridgeContext) {\n return null\n }\n const bridge = createDeclaredLayoutHostBridge(bindings, bridgeContext)\n registerPageLayoutBridge(bindings.map(binding => binding.key), bridge)\n return bridge\n}\n\n/**\n * 移除运行时自动注册的 layout 宿主 bridge。\n */\nexport function unregisterRuntimeLayoutHosts(\n bindings: LayoutHostBinding[],\n context?: LayoutBridgeContext,\n) {\n if (!bindings.length) {\n return false\n }\n const bridgeContext = context ?? getCurrentInstance<LayoutBridgeContext>()\n if (!bridgeContext) {\n return false\n }\n return unregisterPageLayoutBridge(\n bindings.map(binding => binding.key),\n bridgeContext,\n )\n}\n\n/**\n * 使用 key -> 宿主实例的映射批量暴露 layout 内部宿主,适合 toast/dialog 等共享反馈节点。\n */\nexport function useLayoutHosts(hosts: LayoutHostMap) {\n const selectors = Object.keys(hosts)\n useLayoutBridge(selectors, {\n resolveComponent(key) {\n return resolveHostEntry(hosts[key])\n },\n })\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"layoutBridge.mjs","names":[],"sources":["../../../src/runtime/layoutBridge.ts"],"sourcesContent":["import type { Ref } from '../reactivity'\nimport {\n WEVU_LAYOUT_BRIDGE_PAGE_KEYS,\n WEVU_NATIVE_INSTANCE_KEY,\n WEVU_PUBLIC_RUNTIME_KEY,\n} from '@weapp-core/constants'\nimport { isRef } from '../reactivity'\nimport { getCurrentInstance, getCurrentSetupContext, onAttached, onDetached } from './hooks'\nimport { getCurrentMiniProgramPages } from './platform'\nimport { getTemplateRefMap } from './templateRefs/helpers'\n\ntype LayoutBridgeContext = Record<string, any>\ntype LayoutBridgeComponentResolver = (selector: string) => any\ntype LayoutHostMap = Record<string, unknown>\nexport type LayoutBridgeInstance<T = LayoutBridgeContext> = T & {\n selectComponent?: LayoutBridgeComponentResolver\n}\nexport interface LayoutHostBinding {\n key: string\n refName?: string\n selector: string\n kind?: 'component'\n}\ninterface LayoutHostResolveOptions<T = any> {\n context?: T\n fallbackContext?: T\n interval?: number\n retries?: number\n}\n\n/**\n * @description 对 layout host key 去重并过滤空字符串。\n */\nfunction normalizeLayoutHostKeys(keys: string | string[]) {\n return Array.from(new Set(Array.isArray(keys) ? keys : [keys]))\n .filter((key): key is string => typeof key === 'string' && key.length > 0)\n}\n\n/**\n * @description 解析小程序页面实例的稳定身份 key。\n */\nfunction resolvePageIdentityKeys(page?: Record<string, any>): string[] {\n if (!page || typeof page !== 'object') {\n return []\n }\n\n const keys: string[] = []\n const route = typeof page.route === 'string' ? page.route.replace(/^\\/+/, '') : ''\n if (route) {\n keys.push(`route:${route}`)\n }\n for (const [prefix, field] of [\n ['webview', '__wxWebviewId__'],\n ['exparser', '__wxExparserNodeId__'],\n ] as const) {\n const value = page[field]\n if (typeof value === 'number' || typeof value === 'string') {\n keys.push(`${prefix}:${String(value)}`)\n }\n }\n\n return Array.from(new Set(keys))\n}\n\n/**\n * @description 创建小程序 layout host 注册表。\n */\nfunction createLayoutHostRegistry<TBridge>() {\n const registries = new Map<string, Map<string, TBridge>>()\n\n function register(keys: string | string[], bridge: TBridge, pageKeys: string[]) {\n const normalizedKeys = normalizeLayoutHostKeys(keys)\n if (normalizedKeys.length === 0 || pageKeys.length === 0) {\n return null\n }\n\n for (const pageKey of pageKeys) {\n const registry = registries.get(pageKey) ?? new Map<string, TBridge>()\n for (const key of normalizedKeys) {\n registry.set(key, bridge)\n }\n registries.set(pageKey, registry)\n }\n\n return normalizedKeys\n }\n\n function unregister(keys: string | string[], bridge: TBridge, pageKeys: string[]) {\n const normalizedKeys = normalizeLayoutHostKeys(keys)\n if (normalizedKeys.length === 0 || pageKeys.length === 0) {\n return false\n }\n\n let removed = false\n for (const pageKey of pageKeys) {\n const registry = registries.get(pageKey)\n if (!registry) {\n continue\n }\n\n for (const key of normalizedKeys) {\n if (registry.get(key) === bridge) {\n registry.delete(key)\n removed = true\n }\n }\n\n if (registry.size === 0) {\n registries.delete(pageKey)\n }\n }\n\n return removed\n }\n\n function resolveBridge(key: string, pageKeys: string[]) {\n return pageKeys\n .map(pageKey => registries.get(pageKey)?.get(key))\n .find(Boolean)\n }\n\n function resolveHost<THost>(\n key: string,\n pageKeys: string[],\n resolver: (bridge: TBridge, key: string) => THost | null | undefined,\n ) {\n const bridge = resolveBridge(key, pageKeys)\n if (!bridge) {\n return null\n }\n return resolver(bridge, key) ?? null\n }\n\n function waitForHost<THost>(\n key: string,\n resolvePageKeys: () => string[],\n resolver: (bridge: TBridge, key: string) => THost | null | undefined,\n options: { interval?: number, retries?: number } = {},\n ): Promise<THost | null> {\n const retries = options.retries ?? 20\n const interval = options.interval ?? 16\n const host = resolveHost(key, resolvePageKeys(), resolver)\n if (host || retries <= 0) {\n return Promise.resolve(host)\n }\n\n return new Promise((resolve) => {\n setTimeout(() => {\n resolve(waitForHost(key, resolvePageKeys, resolver, {\n ...options,\n retries: retries - 1,\n }))\n }, interval)\n })\n }\n\n return {\n register,\n resolveBridge,\n resolveHost,\n unregister,\n waitForHost,\n }\n}\n\nconst pageLayoutBridgeRegistry = createLayoutHostRegistry<LayoutBridgeContext>()\n\nfunction resolveCurrentPageInstance() {\n const pages = getCurrentMiniProgramPages()\n return pages[pages.length - 1]\n}\n\nfunction resolvePageKeys(page?: LayoutBridgeContext) {\n return resolvePageIdentityKeys(page as Record<string, any> | undefined)\n}\n\nfunction resolveNativeLayoutContext(context?: LayoutBridgeContext) {\n if (!context || typeof context !== 'object') {\n return undefined\n }\n\n const runtimeNativeInstance = context[WEVU_PUBLIC_RUNTIME_KEY]?.state?.[WEVU_NATIVE_INSTANCE_KEY]\n if (runtimeNativeInstance && typeof runtimeNativeInstance === 'object') {\n return runtimeNativeInstance as LayoutBridgeContext\n }\n\n const stateNativeInstance = context.$state?.[WEVU_NATIVE_INSTANCE_KEY]\n if (stateNativeInstance && typeof stateNativeInstance === 'object') {\n return stateNativeInstance as LayoutBridgeContext\n }\n\n if (context[WEVU_NATIVE_INSTANCE_KEY] && typeof context[WEVU_NATIVE_INSTANCE_KEY] === 'object') {\n return context[WEVU_NATIVE_INSTANCE_KEY] as LayoutBridgeContext\n }\n\n return context\n}\n\nfunction resolvePageFromContext(\n context?: LayoutBridgeContext,\n visited = new Set<LayoutBridgeContext>(),\n): LayoutBridgeContext | undefined {\n if (!context || typeof context !== 'object' || visited.has(context)) {\n return resolveCurrentPageInstance()\n }\n visited.add(context)\n\n if (typeof context.__wevuSetPageLayout === 'function') {\n return context\n }\n\n const nativeContext = resolveNativeLayoutContext(context)\n if (nativeContext && nativeContext !== context) {\n const nativePage = resolvePageFromContext(nativeContext, visited)\n if (nativePage) {\n return nativePage\n }\n }\n\n const publicNativePage = context.$\n if (publicNativePage && typeof publicNativePage === 'object') {\n const nativePage = resolvePageFromContext(publicNativePage as LayoutBridgeContext, visited)\n if (nativePage) {\n return nativePage\n }\n }\n\n const ownerContext = nativeContext ?? context\n const selectOwnerComponent = ownerContext.selectOwnerComponent\n if (typeof selectOwnerComponent === 'function') {\n try {\n const owner = selectOwnerComponent.call(ownerContext) as LayoutBridgeContext | undefined\n if (owner && owner !== ownerContext) {\n const ownerPage = resolvePageFromContext(owner, visited)\n if (ownerPage) {\n return ownerPage\n }\n }\n }\n catch {\n // 部分宿主或生命周期阶段暂不支持 owner 查询,继续使用页面栈兜底。\n }\n }\n\n return resolveCurrentPageInstance()\n}\n\nfunction resolveHostEntry(entry: unknown) {\n if (typeof entry === 'function') {\n return (entry as () => unknown)()\n }\n if (isRef(entry as Ref<unknown>)) {\n return (entry as Ref<unknown>).value\n }\n return entry\n}\n\nfunction findLayoutHostBinding(bindings: LayoutHostBinding[], key: string) {\n return bindings.find(binding => binding.key === key)\n}\n\nfunction safeSelectComponent(target: LayoutBridgeContext | undefined, selector: string) {\n const selectComponent = target?.selectComponent\n if (typeof selectComponent !== 'function') {\n return null\n }\n try {\n return selectComponent.call(target, selector) ?? null\n }\n catch {\n return null\n }\n}\n\nfunction resolveDeclaredLayoutHostFromRefs(\n binding: LayoutHostBinding,\n context: LayoutBridgeContext,\n) {\n if (!binding.refName) {\n return null\n }\n const refMap = getTemplateRefMap(context as any)\n const stateRefs = context[WEVU_PUBLIC_RUNTIME_KEY]?.state?.$refs\n ?? context.__wevu?.state?.$refs\n ?? context.$state?.$refs\n ?? context.$refs\n const refValue = refMap?.get(binding.refName)?.value\n ?? stateRefs?.[binding.refName]\n if (Array.isArray(refValue)) {\n return refValue[0] ?? null\n }\n return refValue ?? null\n}\n\nfunction createDeclaredLayoutHostBridge(bindings: LayoutHostBinding[], context: LayoutBridgeContext) {\n const nativeContext = resolveNativeLayoutContext(context)\n const bridgeBase = nativeContext && typeof nativeContext === 'object'\n ? Object.create(nativeContext)\n : {}\n return Object.assign(bridgeBase, {\n selectComponent(key: string) {\n const binding = findLayoutHostBinding(bindings, key)\n if (!binding) {\n return null\n }\n if (binding.kind === 'component' || !binding.kind) {\n const cachedHost = resolveDeclaredLayoutHostFromRefs(binding, context)\n if (cachedHost) {\n return cachedHost\n }\n return safeSelectComponent(nativeContext, binding.selector)\n ?? safeSelectComponent(resolveCurrentPageInstance(), binding.selector)\n ?? null\n }\n return null\n },\n })\n}\n\n/**\n * 为当前页面注册 layout bridge,使页面或子组件可消费 layout 内部能力。\n */\nexport function registerPageLayoutBridge(\n selectors: string | string[],\n context?: LayoutBridgeContext,\n) {\n const bridgeContext = context ?? getCurrentInstance<LayoutBridgeContext>()\n const page = resolvePageFromContext(bridgeContext)\n const pageKeys = resolvePageKeys(page)\n if (!bridgeContext || !page || pageKeys.length === 0) {\n return false\n }\n\n const normalizedSelectors = pageLayoutBridgeRegistry.register(selectors, bridgeContext, pageKeys)\n if (!normalizedSelectors) {\n return false\n }\n\n bridgeContext[WEVU_LAYOUT_BRIDGE_PAGE_KEYS] = pageKeys\n return true\n}\n\n/**\n * 移除当前页面的 layout bridge 注册。\n */\nexport function unregisterPageLayoutBridge(\n selectors: string | string[],\n context?: LayoutBridgeContext,\n) {\n const bridgeContext = context ?? getCurrentInstance<LayoutBridgeContext>()\n const page = resolvePageFromContext(bridgeContext)\n const pageKeys = bridgeContext?.[WEVU_LAYOUT_BRIDGE_PAGE_KEYS] ?? resolvePageKeys(page)\n if (!bridgeContext || !Array.isArray(pageKeys) || pageKeys.length === 0) {\n return false\n }\n\n const removed = pageLayoutBridgeRegistry.unregister(selectors, bridgeContext, pageKeys)\n delete bridgeContext[WEVU_LAYOUT_BRIDGE_PAGE_KEYS]\n return removed\n}\n\n/**\n * 解析当前页面已注册的 layout bridge,找不到时回退到传入上下文。\n */\nexport function resolveLayoutBridge<T = any>(\n selector: string,\n fallbackContext?: T,\n) {\n const page = resolveCurrentPageInstance() ?? resolvePageFromContext(fallbackContext as LayoutBridgeContext | undefined)\n const bridgeContext = pageLayoutBridgeRegistry.resolveBridge(selector, resolvePageKeys(page))\n return (bridgeContext ?? fallbackContext ?? getCurrentInstance()) as LayoutBridgeInstance<T> | undefined\n}\n\n/**\n * 解析当前页面 layout 内通过指定 key 暴露的宿主实例。\n */\nexport function resolveLayoutHost<T = any, C = any>(\n key: string,\n options: LayoutHostResolveOptions<C> = {},\n) {\n const context = options.context ?? options.fallbackContext\n const page = resolveCurrentPageInstance() ?? resolvePageFromContext(context as LayoutBridgeContext | undefined)\n return pageLayoutBridgeRegistry.resolveHost<T>(\n key,\n resolvePageKeys(page),\n (bridge, key) => bridge.selectComponent?.(key) as T | null,\n )\n}\n\n/**\n * 等待当前页面 layout 宿主实例可用,适合页面初次进入时的异步宿主解析。\n */\nexport function waitForLayoutHost<T = any, C = any>(\n key: string,\n options: LayoutHostResolveOptions<C> = {},\n) {\n const context = options.context ?? options.fallbackContext\n return pageLayoutBridgeRegistry.waitForHost<T>(\n key,\n () => resolvePageKeys(resolveCurrentPageInstance() ?? resolvePageFromContext(context as LayoutBridgeContext | undefined)),\n (bridge, key) => bridge.selectComponent?.(key) as T | null,\n options,\n )\n}\n\n/**\n * 在 layout 生命周期内暴露 bridge,使页面或子组件可访问 layout 内部实例。\n */\nexport function useLayoutBridge(\n selectors: string | string[],\n options: {\n resolveComponent?: LayoutBridgeComponentResolver\n } = {},\n) {\n if (!getCurrentSetupContext()) {\n throw new Error('useLayoutBridge() 必须在 setup() 的同步阶段调用')\n }\n\n const context = getCurrentInstance<LayoutBridgeContext>()\n const normalizedSelectors = normalizeLayoutHostKeys(selectors)\n const resolveComponent = options.resolveComponent\n const nativeContext = resolveNativeLayoutContext(context)\n const bridgeBase = nativeContext && typeof nativeContext === 'object'\n ? Object.create(nativeContext)\n : {}\n const bridge = Object.assign(bridgeBase, {\n selectComponent(selector: string) {\n if (!normalizedSelectors.includes(selector)) {\n return null\n }\n\n const resolvedComponent = resolveComponent?.(selector)\n if (resolvedComponent !== undefined) {\n return resolvedComponent\n }\n\n const nativeContext = resolveNativeLayoutContext(context)\n const directMatch = nativeContext?.selectComponent?.(selector)\n if (directMatch) {\n return directMatch\n }\n\n const currentPage = resolveCurrentPageInstance()\n return currentPage?.selectComponent?.(selector) ?? null\n },\n })\n\n registerPageLayoutBridge(normalizedSelectors, bridge)\n\n onAttached(() => {\n registerPageLayoutBridge(normalizedSelectors, bridge)\n })\n\n onDetached(() => {\n unregisterPageLayoutBridge(normalizedSelectors, bridge)\n })\n}\n\n/**\n * 使用编译期注入的宿主绑定信息,直接从当前 layout 运行时实例解析子组件宿主并注册 bridge。\n */\nexport function registerRuntimeLayoutHosts(\n bindings: LayoutHostBinding[],\n context?: LayoutBridgeContext,\n) {\n if (!bindings.length) {\n return null\n }\n const bridgeContext = context ?? getCurrentInstance<LayoutBridgeContext>()\n if (!bridgeContext) {\n return null\n }\n const bridge = createDeclaredLayoutHostBridge(bindings, bridgeContext)\n registerPageLayoutBridge(bindings.map(binding => binding.key), bridge)\n return bridge\n}\n\n/**\n * 移除运行时自动注册的 layout 宿主 bridge。\n */\nexport function unregisterRuntimeLayoutHosts(\n bindings: LayoutHostBinding[],\n context?: LayoutBridgeContext,\n) {\n if (!bindings.length) {\n return false\n }\n const bridgeContext = context ?? getCurrentInstance<LayoutBridgeContext>()\n if (!bridgeContext) {\n return false\n }\n return unregisterPageLayoutBridge(\n bindings.map(binding => binding.key),\n bridgeContext,\n )\n}\n\n/**\n * 使用 key -> 宿主实例的映射批量暴露 layout 内部宿主,适合 toast/dialog 等共享反馈节点。\n */\nexport function useLayoutHosts(hosts: LayoutHostMap) {\n const selectors = Object.keys(hosts)\n useLayoutBridge(selectors, {\n resolveComponent(key) {\n return resolveHostEntry(hosts[key])\n },\n })\n}\n"],"mappings":"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"}
|
|
@@ -146,8 +146,10 @@ function ensureSetupContextInstance(target, runtime) {
|
|
|
146
146
|
defineSetupInstanceMethod(setupInstanceBridge, "triggerEvent", (...args) => {
|
|
147
147
|
const [eventName, detail, options] = args;
|
|
148
148
|
const nativeOwner = resolveSetupBridgeOwner("triggerEvent");
|
|
149
|
-
if (nativeOwner && typeof nativeOwner.triggerEvent === "function")
|
|
150
|
-
|
|
149
|
+
if (nativeOwner && typeof nativeOwner.triggerEvent === "function") {
|
|
150
|
+
if (args.length >= 3) nativeOwner.triggerEvent(eventName, detail, options);
|
|
151
|
+
else nativeOwner.triggerEvent(eventName, detail);
|
|
152
|
+
}
|
|
151
153
|
});
|
|
152
154
|
defineSetupInstanceMethod(setupInstanceBridge, "createSelectorQuery", () => {
|
|
153
155
|
var _resolveRuntimeNative;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"setupContext.mjs","names":[],"sources":["../../../../../src/runtime/register/runtimeInstance/setupContext.ts"],"sourcesContent":["import type { WatchStopHandle } from '../../../reactivity'\nimport type {\n InternalRuntimeState,\n MiniProgramAdapter,\n MiniProgramIntersectionObserverOptions,\n RuntimeInstance,\n SetupContextNativeInstance,\n TriggerEventOptions,\n} from '../../types'\nimport {\n WEVU_NATIVE_INSTANCE_KEY,\n WEVU_PROPS_KEY,\n WEVU_SETUP_CONTEXT_INSTANCE_KEY,\n WEVU_SLOT_NAMES_PROP,\n} from '@weapp-core/constants'\nimport { toRaw } from '../../../reactivity'\nimport { hasOwn } from '../../../utils'\nimport { isNativeBridgeMethod, markNativeBridgeMethod } from '../../nativeBridge'\nimport { markNoSetData } from '../../noSetData'\nimport { getCurrentMiniProgramRuntimeCapabilities, getMiniProgramGlobalObject, supportsCurrentMiniProgramRuntimeCapability } from '../../platform'\n\nexport { normalizeEmitPayload } from '../../emit'\n\ntype AdapterWithSetData = Required<MiniProgramAdapter> & {\n __wevu_enableSetData?: () => void\n __wevu_setVisibility?: (visible: boolean) => void\n}\n\nexport type SetupInstanceMethodName = 'triggerEvent' | 'createSelectorQuery' | 'createIntersectionObserver' | 'setData' | 'setUpdatePerformanceListener'\n\nexport const setupInstanceMethodNames: SetupInstanceMethodName[] = [\n 'triggerEvent',\n 'createSelectorQuery',\n 'createIntersectionObserver',\n 'setData',\n 'setUpdatePerformanceListener',\n]\n\nexport function createSetupSlotsFallback() {\n return Object.freeze(Object.create(null)) as Record<string, never>\n}\n\nconst SLOT_RENDER_FN = () => []\n\nfunction normalizeSlotNames(value: unknown): string[] {\n if (Array.isArray(value)) {\n return [...new Set(value.filter((item): item is string => typeof item === 'string' && item.length > 0))]\n }\n if (!value || typeof value !== 'object') {\n return []\n }\n return Object.entries(value as Record<string, unknown>)\n .filter(([, enabled]) => Boolean(enabled))\n .map(([name]) => name)\n}\n\nexport function createSetupSlotsProxy(props: Record<string, any>) {\n if (!hasOwn(props, WEVU_SLOT_NAMES_PROP)) {\n return createSetupSlotsFallback()\n }\n\n const resolveNames = () => normalizeSlotNames(props[WEVU_SLOT_NAMES_PROP])\n const isEnabled = (key: PropertyKey) => typeof key === 'string' && resolveNames().includes(key)\n\n return new Proxy(Object.create(null), {\n get(_target, key) {\n if (isEnabled(key)) {\n return SLOT_RENDER_FN\n }\n return undefined\n },\n has(_target, key) {\n return isEnabled(key)\n },\n ownKeys() {\n return resolveNames()\n },\n getOwnPropertyDescriptor(_target, key) {\n if (!isEnabled(key)) {\n return undefined\n }\n return {\n configurable: true,\n enumerable: true,\n value: SLOT_RENDER_FN,\n }\n },\n set() {\n return false\n },\n deleteProperty() {\n return false\n },\n }) as Record<string, any>\n}\n\nexport function attachRuntimeSlots(runtimeState: Record<string, any>, props: Record<string, any>) {\n const slots = createSetupSlotsProxy(props)\n try {\n Object.defineProperty(runtimeState, '$slots', {\n value: slots,\n configurable: true,\n enumerable: false,\n writable: false,\n })\n }\n catch {\n runtimeState.$slots = slots\n }\n return slots\n}\n\nexport function createNoopWatchStopHandle(): WatchStopHandle {\n const stopHandle = (() => {}) as WatchStopHandle\n stopHandle.stop = () => {}\n stopHandle.pause = () => {}\n stopHandle.resume = () => {}\n return stopHandle\n}\n\nexport function safeMarkNoSetData<T extends object>(value: T): T {\n try {\n return markNoSetData(value)\n }\n catch {\n return value\n }\n}\n\nfunction resolveRuntimeNativeMethodOwner(\n runtime: RuntimeInstance<any, any, any>,\n target: InternalRuntimeState,\n methodName: SetupInstanceMethodName,\n) {\n const runtimeState = runtime?.state\n const runtimeRawState = runtimeState && typeof runtimeState === 'object'\n ? toRaw(runtimeState as any)\n : undefined\n const runtimeProxy = runtime?.proxy as object | undefined\n const isBridgeMethod = (candidate: object) => {\n const candidateMethod = (candidate as any)[methodName]\n if (typeof candidateMethod !== 'function') {\n return false\n }\n if (isNativeBridgeMethod(candidateMethod)) {\n return true\n }\n const targetMethod = (target as any)[methodName]\n return typeof targetMethod === 'function' && candidateMethod === targetMethod\n }\n const isValidNativeCandidate = (candidate: unknown) => {\n if (!candidate || typeof candidate !== 'object') {\n return false\n }\n if (candidate === target || candidate === runtimeProxy) {\n return false\n }\n if (isBridgeMethod(candidate)) {\n return false\n }\n return typeof (candidate as any)[methodName] === 'function'\n }\n const nativeFromState = runtimeRawState ? (runtimeRawState as any)[WEVU_NATIVE_INSTANCE_KEY] : undefined\n if (isValidNativeCandidate(nativeFromState)) {\n return nativeFromState as InternalRuntimeState\n }\n\n const runtimeInstance = (runtime as any)?.instance\n if (isValidNativeCandidate(runtimeInstance)) {\n return runtimeInstance as InternalRuntimeState\n }\n return undefined\n}\n\nfunction defineSetupInstanceMethod(\n target: Record<string, any>,\n methodName: SetupInstanceMethodName,\n handler: (...args: any[]) => any,\n) {\n markNativeBridgeMethod(handler)\n try {\n Object.defineProperty(target, methodName, {\n value: handler,\n configurable: true,\n enumerable: false,\n writable: true,\n })\n }\n catch {\n ;(target as any)[methodName] = handler\n }\n}\n\nexport function ensureSetupContextInstance(\n target: InternalRuntimeState,\n runtime: RuntimeInstance<any, any, any>,\n) {\n const maybeCached = (target as any)[WEVU_SETUP_CONTEXT_INSTANCE_KEY]\n if (maybeCached && typeof maybeCached === 'object') {\n return maybeCached as SetupContextNativeInstance\n }\n\n const setupInstanceBridge: Record<string, any> = Object.create(null)\n const resolvePublicValue = (key: PropertyKey) => {\n const runtimeProxy = runtime?.proxy as Record<PropertyKey, any> | undefined\n if (runtimeProxy && Reflect.has(runtimeProxy, key)) {\n return {\n found: true,\n value: Reflect.get(runtimeProxy, key),\n }\n }\n const runtimeProps = (runtime?.state as any)?.[WEVU_PROPS_KEY]\n ?? (target as any)[WEVU_PROPS_KEY]\n if (runtimeProps && typeof runtimeProps === 'object' && hasOwn(runtimeProps, key)) {\n return {\n found: true,\n value: Reflect.get(runtimeProps, key),\n }\n }\n return { found: false, value: undefined }\n }\n const resolveSetupBridgeOwner = (methodName: SetupInstanceMethodName) => {\n const owner = resolveRuntimeNativeMethodOwner(runtime, target, methodName)\n if (owner) {\n return owner\n }\n const fallbackMethod = (target as any)[methodName]\n if (typeof fallbackMethod === 'function' && !isNativeBridgeMethod(fallbackMethod)) {\n return target\n }\n return undefined\n }\n\n defineSetupInstanceMethod(setupInstanceBridge, 'triggerEvent', (...args: [string, any?, TriggerEventOptions?]) => {\n const [eventName, detail, options] = args\n const nativeOwner = resolveSetupBridgeOwner('triggerEvent')\n if (nativeOwner && typeof (nativeOwner as any).triggerEvent === 'function') {\n if (args.length >= 3) {\n ;(nativeOwner as any).triggerEvent(eventName, detail, options)\n }\n else {\n ;(nativeOwner as any).triggerEvent(eventName, detail)\n }\n }\n })\n\n defineSetupInstanceMethod(setupInstanceBridge, 'createSelectorQuery', () => {\n const nativeOwner = resolveSetupBridgeOwner('createSelectorQuery')\n if (nativeOwner && typeof (nativeOwner as any).createSelectorQuery === 'function') {\n return (nativeOwner as any).createSelectorQuery()\n }\n\n const miniProgramGlobal = getMiniProgramGlobalObject()\n if (\n !supportsCurrentMiniProgramRuntimeCapability('globalCreateSelectorQuery')\n || !miniProgramGlobal\n || typeof miniProgramGlobal.createSelectorQuery !== 'function'\n ) {\n return undefined\n }\n\n const query = miniProgramGlobal.createSelectorQuery()\n if (!query) {\n return query\n }\n if (\n !getCurrentMiniProgramRuntimeCapabilities().selectorQueryScopeByIn\n || typeof query.in !== 'function'\n ) {\n return query\n }\n\n const scopedOwner = resolveRuntimeNativeMethodOwner(runtime, target, 'setData') ?? target\n return query.in(scopedOwner as any)\n })\n\n defineSetupInstanceMethod(\n setupInstanceBridge,\n 'createIntersectionObserver',\n (options?: MiniProgramIntersectionObserverOptions) => {\n const nativeOwner = resolveSetupBridgeOwner('createIntersectionObserver')\n if (nativeOwner && typeof (nativeOwner as any).createIntersectionObserver === 'function') {\n return (nativeOwner as any).createIntersectionObserver(options ?? {})\n }\n\n const miniProgramGlobal = getMiniProgramGlobalObject()\n if (\n !supportsCurrentMiniProgramRuntimeCapability('globalCreateIntersectionObserver')\n || !miniProgramGlobal\n || typeof miniProgramGlobal.createIntersectionObserver !== 'function'\n ) {\n return undefined\n }\n\n const scopedOwner = resolveRuntimeNativeMethodOwner(runtime, target, 'setData') ?? target\n if (getCurrentMiniProgramRuntimeCapabilities().intersectionObserverScopeByParameter) {\n return miniProgramGlobal.createIntersectionObserver(scopedOwner as any, options ?? {})\n }\n return miniProgramGlobal.createIntersectionObserver(options ?? {})\n },\n )\n\n defineSetupInstanceMethod(setupInstanceBridge, 'setData', (payload: Record<string, any>, callback?: () => void) => {\n const nativeOwner = resolveSetupBridgeOwner('setData')\n if (nativeOwner && typeof (nativeOwner as any).setData === 'function') {\n return (nativeOwner as any).setData(payload, callback)\n }\n\n const adapter = runtime?.adapter as AdapterWithSetData | undefined\n const result = typeof adapter?.setData === 'function'\n ? adapter.setData(payload)\n : undefined\n if (typeof callback === 'function') {\n callback()\n }\n return result\n })\n\n defineSetupInstanceMethod(\n setupInstanceBridge,\n 'setUpdatePerformanceListener',\n (listener?: ((result: Record<string, any>) => void)) => {\n const nativeOwner = resolveSetupBridgeOwner('setUpdatePerformanceListener')\n if (nativeOwner && typeof (nativeOwner as any).setUpdatePerformanceListener === 'function') {\n return (nativeOwner as any).setUpdatePerformanceListener(listener)\n }\n return undefined\n },\n )\n\n const setupInstance = safeMarkNoSetData(new Proxy(setupInstanceBridge, {\n get(bridgeTarget, key, receiver) {\n if (Reflect.has(bridgeTarget, key)) {\n return Reflect.get(bridgeTarget, key, receiver)\n }\n if (key === '$el') {\n return resolveRuntimeNativeMethodOwner(runtime, target, 'setData') ?? target\n }\n if (key === 'renderRoot' || key === 'shadowRoot') {\n const nativeOwner = resolveRuntimeNativeMethodOwner(runtime, target, 'setData') ?? target\n return (nativeOwner as any)[key]\n }\n const publicValue = resolvePublicValue(key)\n if (publicValue.found) {\n return publicValue.value\n }\n const value = (target as any)[key as any]\n if (typeof value === 'function') {\n return value.bind(target)\n }\n return value\n },\n has(bridgeTarget, key) {\n return Reflect.has(bridgeTarget, key) || resolvePublicValue(key).found || key in (target as any)\n },\n set(bridgeTarget, key, value) {\n if (Reflect.has(bridgeTarget, key)) {\n // 仅覆写 setup 暴露的 bridge 方法,避免回写原生实例引发递归调用。\n ;(bridgeTarget as any)[key as any] = value\n return true\n }\n ;(target as any)[key as any] = value\n return true\n },\n }) as SetupContextNativeInstance)\n\n try {\n Object.defineProperty(target as Record<string, any>, WEVU_SETUP_CONTEXT_INSTANCE_KEY, {\n value: setupInstance,\n configurable: true,\n enumerable: false,\n writable: true,\n })\n }\n catch {\n ;(target as any)[WEVU_SETUP_CONTEXT_INSTANCE_KEY] = setupInstance\n }\n\n return setupInstance\n}\n"],"mappings":";;;;;;;;;AA8BA,MAAa,2BAAsD;CACjE;CACA;CACA;CACA;CACA;AACF;AAEA,SAAgB,2BAA2B;CACzC,OAAO,OAAO,OAAO,OAAO,OAAO,IAAI,CAAC;AAC1C;AAEA,MAAM,uBAAuB,CAAC;AAE9B,SAAS,mBAAmB,OAA0B;CACpD,IAAI,MAAM,QAAQ,KAAK,GACrB,OAAO,CAAC,GAAG,IAAI,IAAI,MAAM,QAAQ,SAAyB,OAAO,SAAS,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC;CAEzG,IAAI,CAAC,SAAS,OAAO,UAAU,UAC7B,OAAO,CAAC;CAEV,OAAO,OAAO,QAAQ,KAAgC,CAAC,CACpD,QAAQ,GAAG,aAAa,QAAQ,OAAO,CAAC,CAAC,CACzC,KAAK,CAAC,UAAU,IAAI;AACzB;AAEA,SAAgB,sBAAsB,OAA4B;CAChE,IAAI,CAAC,OAAO,OAAO,oBAAoB,GACrC,OAAO,yBAAyB;CAGlC,MAAM,qBAAqB,mBAAmB,MAAM,qBAAqB;CACzE,MAAM,aAAa,QAAqB,OAAO,QAAQ,YAAY,aAAa,CAAC,CAAC,SAAS,GAAG;CAE9F,OAAO,IAAI,MAAM,OAAO,OAAO,IAAI,GAAG;EACpC,IAAI,SAAS,KAAK;GAChB,IAAI,UAAU,GAAG,GACf,OAAO;EAGX;EACA,IAAI,SAAS,KAAK;GAChB,OAAO,UAAU,GAAG;EACtB;EACA,UAAU;GACR,OAAO,aAAa;EACtB;EACA,yBAAyB,SAAS,KAAK;GACrC,IAAI,CAAC,UAAU,GAAG,GAChB;GAEF,OAAO;IACL,cAAc;IACd,YAAY;IACZ,OAAO;GACT;EACF;EACA,MAAM;GACJ,OAAO;EACT;EACA,iBAAiB;GACf,OAAO;EACT;CACF,CAAC;AACH;AAEA,SAAgB,mBAAmB,cAAmC,OAA4B;CAChG,MAAM,QAAQ,sBAAsB,KAAK;CACzC,IAAI;EACF,OAAO,eAAe,cAAc,UAAU;GAC5C,OAAO;GACP,cAAc;GACd,YAAY;GACZ,UAAU;EACZ,CAAC;CACH,kBACM;EACJ,aAAa,SAAS;CACxB;CACA,OAAO;AACT;AAEA,SAAgB,4BAA6C;CAC3D,MAAM,oBAAoB,CAAC;CAC3B,WAAW,aAAa,CAAC;CACzB,WAAW,cAAc,CAAC;CAC1B,WAAW,eAAe,CAAC;CAC3B,OAAO;AACT;AAEA,SAAgB,kBAAoC,OAAa;CAC/D,IAAI;EACF,OAAO,cAAc,KAAK;CAC5B,mBACM;EACJ,OAAO;CACT;AACF;AAEA,SAAS,gCACP,SACA,QACA,YACA;CACA,MAAM,iEAAe,QAAS;CAC9B,MAAM,kBAAkB,gBAAgB,OAAO,iBAAiB,WAC5D,MAAM,YAAmB,IACzB;CACJ,MAAM,iEAAe,QAAS;CAC9B,MAAM,kBAAkB,cAAsB;EAC5C,MAAM,kBAAmB,UAAkB;EAC3C,IAAI,OAAO,oBAAoB,YAC7B,OAAO;EAET,IAAI,qBAAqB,eAAe,GACtC,OAAO;EAET,MAAM,eAAgB,OAAe;EACrC,OAAO,OAAO,iBAAiB,cAAc,oBAAoB;CACnE;CACA,MAAM,0BAA0B,cAAuB;EACrD,IAAI,CAAC,aAAa,OAAO,cAAc,UACrC,OAAO;EAET,IAAI,cAAc,UAAU,cAAc,cACxC,OAAO;EAET,IAAI,eAAe,SAAS,GAC1B,OAAO;EAET,OAAO,OAAQ,UAAkB,gBAAgB;CACnD;CACA,MAAM,kBAAkB,kBAAmB,gBAAwB,4BAA4B;CAC/F,IAAI,uBAAuB,eAAe,GACxC,OAAO;CAGT,MAAM,oEAAmB,QAAiB;CAC1C,IAAI,uBAAuB,eAAe,GACxC,OAAO;AAGX;AAEA,SAAS,0BACP,QACA,YACA,SACA;CACA,uBAAuB,OAAO;CAC9B,IAAI;EACF,OAAO,eAAe,QAAQ,YAAY;GACxC,OAAO;GACP,cAAc;GACd,YAAY;GACZ,UAAU;EACZ,CAAC;CACH,mBACM;EACH,AAAC,OAAe,cAAc;CACjC;AACF;AAEA,SAAgB,2BACd,QACA,SACA;CACA,MAAM,cAAe,OAAe;CACpC,IAAI,eAAe,OAAO,gBAAgB,UACxC,OAAO;CAGT,MAAM,sBAA2C,OAAO,OAAO,IAAI;CACnE,MAAM,sBAAsB,QAAqB;;EAC/C,MAAM,iEAAe,QAAS;EAC9B,IAAI,gBAAgB,QAAQ,IAAI,cAAc,GAAG,GAC/C,OAAO;GACL,OAAO;GACP,OAAO,QAAQ,IAAI,cAAc,GAAG;EACtC;EAEF,MAAM,oFAAgB,QAAS,mDAAgB,4EACzC,OAAe;EACrB,IAAI,gBAAgB,OAAO,iBAAiB,YAAY,OAAO,cAAc,GAAG,GAC9E,OAAO;GACL,OAAO;GACP,OAAO,QAAQ,IAAI,cAAc,GAAG;EACtC;EAEF,OAAO;GAAE,OAAO;GAAO,OAAO;EAAU;CAC1C;CACA,MAAM,2BAA2B,eAAwC;EACvE,MAAM,QAAQ,gCAAgC,SAAS,QAAQ,UAAU;EACzE,IAAI,OACF,OAAO;EAET,MAAM,iBAAkB,OAAe;EACvC,IAAI,OAAO,mBAAmB,cAAc,CAAC,qBAAqB,cAAc,GAC9E,OAAO;CAGX;CAEA,0BAA0B,qBAAqB,iBAAiB,GAAG,SAA+C;EAChH,MAAM,CAAC,WAAW,QAAQ,WAAW;EACrC,MAAM,cAAc,wBAAwB,cAAc;EAC1D,IAAI,eAAe,OAAQ,YAAoB,iBAAiB,YAC9D,IAAI,KAAK,UAAU,GAChB,AAAC,YAAoB,aAAa,WAAW,QAAQ,OAAO;OAG5D,AAAC,YAAoB,aAAa,WAAW,MAAM;CAG1D,CAAC;CAED,0BAA0B,qBAAqB,6BAA6B;;EAC1E,MAAM,cAAc,wBAAwB,qBAAqB;EACjE,IAAI,eAAe,OAAQ,YAAoB,wBAAwB,YACrE,OAAQ,YAAoB,oBAAoB;EAGlD,MAAM,oBAAoB,2BAA2B;EACrD,IACE,CAAC,4CAA4C,2BAA2B,KACrE,CAAC,qBACD,OAAO,kBAAkB,wBAAwB,YAEpD;EAGF,MAAM,QAAQ,kBAAkB,oBAAoB;EACpD,IAAI,CAAC,OACH,OAAO;EAET,IACE,CAAC,yCAAyC,CAAC,CAAC,0BACzC,OAAO,MAAM,OAAO,YAEvB,OAAO;EAGT,MAAM,uCAAc,gCAAgC,SAAS,QAAQ,SAAS,0EAAK;EACnF,OAAO,MAAM,GAAG,WAAkB;CACpC,CAAC;CAED,0BACE,qBACA,+BACC,YAAqD;;EACpD,MAAM,cAAc,wBAAwB,4BAA4B;EACxE,IAAI,eAAe,OAAQ,YAAoB,+BAA+B,YAC5E,OAAQ,YAAoB,2BAA2B,mDAAW,CAAC,CAAC;EAGtE,MAAM,oBAAoB,2BAA2B;EACrD,IACE,CAAC,4CAA4C,kCAAkC,KAC5E,CAAC,qBACD,OAAO,kBAAkB,+BAA+B,YAE3D;EAGF,MAAM,wCAAc,gCAAgC,SAAS,QAAQ,SAAS,4EAAK;EACnF,IAAI,yCAAyC,CAAC,CAAC,sCAC7C,OAAO,kBAAkB,2BAA2B,aAAoB,mDAAW,CAAC,CAAC;EAEvF,OAAO,kBAAkB,2BAA2B,mDAAW,CAAC,CAAC;CACnE,CACF;CAEA,0BAA0B,qBAAqB,YAAY,SAA8B,aAA0B;EACjH,MAAM,cAAc,wBAAwB,SAAS;EACrD,IAAI,eAAe,OAAQ,YAAoB,YAAY,YACzD,OAAQ,YAAoB,QAAQ,SAAS,QAAQ;EAGvD,MAAM,4DAAU,QAAS;EACzB,MAAM,SAAS,0DAAO,QAAS,aAAY,aACvC,QAAQ,QAAQ,OAAO,IACvB;EACJ,IAAI,OAAO,aAAa,YACtB,SAAS;EAEX,OAAO;CACT,CAAC;CAED,0BACE,qBACA,iCACC,aAAuD;EACtD,MAAM,cAAc,wBAAwB,8BAA8B;EAC1E,IAAI,eAAe,OAAQ,YAAoB,iCAAiC,YAC9E,OAAQ,YAAoB,6BAA6B,QAAQ;CAGrE,CACF;CAEA,MAAM,gBAAgB,kBAAkB,IAAI,MAAM,qBAAqB;EACrE,IAAI,cAAc,KAAK,UAAU;GAC/B,IAAI,QAAQ,IAAI,cAAc,GAAG,GAC/B,OAAO,QAAQ,IAAI,cAAc,KAAK,QAAQ;GAEhD,IAAI,QAAQ,OAAO;;IACjB,iCAAO,gCAAgC,SAAS,QAAQ,SAAS,4EAAK;GACxE;GACA,IAAI,QAAQ,gBAAgB,QAAQ,cAAc;;IAEhD,kCADoB,gCAAgC,SAAS,QAAQ,SAAS,4EAAK,OAChE,CAAS;GAC9B;GACA,MAAM,cAAc,mBAAmB,GAAG;GAC1C,IAAI,YAAY,OACd,OAAO,YAAY;GAErB,MAAM,QAAS,OAAe;GAC9B,IAAI,OAAO,UAAU,YACnB,OAAO,MAAM,KAAK,MAAM;GAE1B,OAAO;EACT;EACA,IAAI,cAAc,KAAK;GACrB,OAAO,QAAQ,IAAI,cAAc,GAAG,KAAK,mBAAmB,GAAG,CAAC,CAAC,SAAS,OAAQ;EACpF;EACA,IAAI,cAAc,KAAK,OAAO;GAC5B,IAAI,QAAQ,IAAI,cAAc,GAAG,GAAG;IAEjC,AAAC,aAAqB,OAAc;IACrC,OAAO;GACT;GACC,AAAC,OAAe,OAAc;GAC/B,OAAO;EACT;CACF,CAAC,CAA+B;CAEhC,IAAI;EACF,OAAO,eAAe,QAA+B,iCAAiC;GACpF,OAAO;GACP,cAAc;GACd,YAAY;GACZ,UAAU;EACZ,CAAC;CACH,mBACM;EACH,AAAC,OAAe,mCAAmC;CACtD;CAEA,OAAO;AACT"}
|
|
1
|
+
{"version":3,"file":"setupContext.mjs","names":[],"sources":["../../../../../src/runtime/register/runtimeInstance/setupContext.ts"],"sourcesContent":["import type { WatchStopHandle } from '../../../reactivity'\nimport type {\n InternalRuntimeState,\n MiniProgramAdapter,\n MiniProgramIntersectionObserverOptions,\n RuntimeInstance,\n SetupContextNativeInstance,\n TriggerEventOptions,\n} from '../../types'\nimport {\n WEVU_NATIVE_INSTANCE_KEY,\n WEVU_PROPS_KEY,\n WEVU_SETUP_CONTEXT_INSTANCE_KEY,\n WEVU_SLOT_NAMES_PROP,\n} from '@weapp-core/constants'\nimport { toRaw } from '../../../reactivity'\nimport { hasOwn } from '../../../utils'\nimport { isNativeBridgeMethod, markNativeBridgeMethod } from '../../nativeBridge'\nimport { markNoSetData } from '../../noSetData'\nimport { getCurrentMiniProgramRuntimeCapabilities, getMiniProgramGlobalObject, supportsCurrentMiniProgramRuntimeCapability } from '../../platform'\n\nexport { normalizeEmitPayload } from '../../emit'\n\ntype AdapterWithSetData = Required<MiniProgramAdapter> & {\n __wevu_enableSetData?: () => void\n __wevu_setVisibility?: (visible: boolean) => void\n}\n\nexport type SetupInstanceMethodName = 'triggerEvent' | 'createSelectorQuery' | 'createIntersectionObserver' | 'setData' | 'setUpdatePerformanceListener'\n\nexport const setupInstanceMethodNames: SetupInstanceMethodName[] = [\n 'triggerEvent',\n 'createSelectorQuery',\n 'createIntersectionObserver',\n 'setData',\n 'setUpdatePerformanceListener',\n]\n\nexport function createSetupSlotsFallback() {\n return Object.freeze(Object.create(null)) as Record<string, never>\n}\n\nconst SLOT_RENDER_FN = () => []\n\nfunction normalizeSlotNames(value: unknown): string[] {\n if (Array.isArray(value)) {\n return [...new Set(value.filter((item): item is string => typeof item === 'string' && item.length > 0))]\n }\n if (!value || typeof value !== 'object') {\n return []\n }\n return Object.entries(value as Record<string, unknown>)\n .filter(([, enabled]) => Boolean(enabled))\n .map(([name]) => name)\n}\n\nexport function createSetupSlotsProxy(props: Record<string, any>) {\n if (!hasOwn(props, WEVU_SLOT_NAMES_PROP)) {\n return createSetupSlotsFallback()\n }\n\n const resolveNames = () => normalizeSlotNames(props[WEVU_SLOT_NAMES_PROP])\n const isEnabled = (key: PropertyKey) => typeof key === 'string' && resolveNames().includes(key)\n\n return new Proxy(Object.create(null), {\n get(_target, key) {\n if (isEnabled(key)) {\n return SLOT_RENDER_FN\n }\n return undefined\n },\n has(_target, key) {\n return isEnabled(key)\n },\n ownKeys() {\n return resolveNames()\n },\n getOwnPropertyDescriptor(_target, key) {\n if (!isEnabled(key)) {\n return undefined\n }\n return {\n configurable: true,\n enumerable: true,\n value: SLOT_RENDER_FN,\n }\n },\n set() {\n return false\n },\n deleteProperty() {\n return false\n },\n }) as Record<string, any>\n}\n\nexport function attachRuntimeSlots(runtimeState: Record<string, any>, props: Record<string, any>) {\n const slots = createSetupSlotsProxy(props)\n try {\n Object.defineProperty(runtimeState, '$slots', {\n value: slots,\n configurable: true,\n enumerable: false,\n writable: false,\n })\n }\n catch {\n runtimeState.$slots = slots\n }\n return slots\n}\n\nexport function createNoopWatchStopHandle(): WatchStopHandle {\n const stopHandle = (() => {}) as WatchStopHandle\n stopHandle.stop = () => {}\n stopHandle.pause = () => {}\n stopHandle.resume = () => {}\n return stopHandle\n}\n\nexport function safeMarkNoSetData<T extends object>(value: T): T {\n try {\n return markNoSetData(value)\n }\n catch {\n return value\n }\n}\n\nfunction resolveRuntimeNativeMethodOwner(\n runtime: RuntimeInstance<any, any, any>,\n target: InternalRuntimeState,\n methodName: SetupInstanceMethodName,\n) {\n const runtimeState = runtime?.state\n const runtimeRawState = runtimeState && typeof runtimeState === 'object'\n ? toRaw(runtimeState as any)\n : undefined\n const runtimeProxy = runtime?.proxy as object | undefined\n const isBridgeMethod = (candidate: object) => {\n const candidateMethod = (candidate as any)[methodName]\n if (typeof candidateMethod !== 'function') {\n return false\n }\n if (isNativeBridgeMethod(candidateMethod)) {\n return true\n }\n const targetMethod = (target as any)[methodName]\n return typeof targetMethod === 'function' && candidateMethod === targetMethod\n }\n const isValidNativeCandidate = (candidate: unknown) => {\n if (!candidate || typeof candidate !== 'object') {\n return false\n }\n if (candidate === target || candidate === runtimeProxy) {\n return false\n }\n if (isBridgeMethod(candidate)) {\n return false\n }\n return typeof (candidate as any)[methodName] === 'function'\n }\n const nativeFromState = runtimeRawState ? (runtimeRawState as any)[WEVU_NATIVE_INSTANCE_KEY] : undefined\n if (isValidNativeCandidate(nativeFromState)) {\n return nativeFromState as InternalRuntimeState\n }\n\n const runtimeInstance = (runtime as any)?.instance\n if (isValidNativeCandidate(runtimeInstance)) {\n return runtimeInstance as InternalRuntimeState\n }\n return undefined\n}\n\nfunction defineSetupInstanceMethod(\n target: Record<string, any>,\n methodName: SetupInstanceMethodName,\n handler: (...args: any[]) => any,\n) {\n markNativeBridgeMethod(handler)\n try {\n Object.defineProperty(target, methodName, {\n value: handler,\n configurable: true,\n enumerable: false,\n writable: true,\n })\n }\n catch {\n ;(target as any)[methodName] = handler\n }\n}\n\nexport function ensureSetupContextInstance(\n target: InternalRuntimeState,\n runtime: RuntimeInstance<any, any, any>,\n) {\n const maybeCached = (target as any)[WEVU_SETUP_CONTEXT_INSTANCE_KEY]\n if (maybeCached && typeof maybeCached === 'object') {\n return maybeCached as SetupContextNativeInstance\n }\n\n const setupInstanceBridge: Record<string, any> = Object.create(null)\n const resolvePublicValue = (key: PropertyKey) => {\n const runtimeProxy = runtime?.proxy as Record<PropertyKey, any> | undefined\n if (runtimeProxy && Reflect.has(runtimeProxy, key)) {\n return {\n found: true,\n value: Reflect.get(runtimeProxy, key),\n }\n }\n const runtimeProps = (runtime?.state as any)?.[WEVU_PROPS_KEY]\n ?? (target as any)[WEVU_PROPS_KEY]\n if (runtimeProps && typeof runtimeProps === 'object' && hasOwn(runtimeProps, key)) {\n return {\n found: true,\n value: Reflect.get(runtimeProps, key),\n }\n }\n return { found: false, value: undefined }\n }\n const resolveSetupBridgeOwner = (methodName: SetupInstanceMethodName) => {\n const owner = resolveRuntimeNativeMethodOwner(runtime, target, methodName)\n if (owner) {\n return owner\n }\n const fallbackMethod = (target as any)[methodName]\n if (typeof fallbackMethod === 'function' && !isNativeBridgeMethod(fallbackMethod)) {\n return target\n }\n return undefined\n }\n\n defineSetupInstanceMethod(setupInstanceBridge, 'triggerEvent', (...args: [string, any?, TriggerEventOptions?]) => {\n const [eventName, detail, options] = args\n const nativeOwner = resolveSetupBridgeOwner('triggerEvent')\n if (nativeOwner && typeof (nativeOwner as any).triggerEvent === 'function') {\n if (args.length >= 3) {\n ;(nativeOwner as any).triggerEvent(eventName, detail, options)\n }\n else {\n ;(nativeOwner as any).triggerEvent(eventName, detail)\n }\n }\n })\n\n defineSetupInstanceMethod(setupInstanceBridge, 'createSelectorQuery', () => {\n const nativeOwner = resolveSetupBridgeOwner('createSelectorQuery')\n if (nativeOwner && typeof (nativeOwner as any).createSelectorQuery === 'function') {\n return (nativeOwner as any).createSelectorQuery()\n }\n\n const miniProgramGlobal = getMiniProgramGlobalObject()\n if (\n !supportsCurrentMiniProgramRuntimeCapability('globalCreateSelectorQuery')\n || !miniProgramGlobal\n || typeof miniProgramGlobal.createSelectorQuery !== 'function'\n ) {\n return undefined\n }\n\n const query = miniProgramGlobal.createSelectorQuery()\n if (!query) {\n return query\n }\n if (\n !getCurrentMiniProgramRuntimeCapabilities().selectorQueryScopeByIn\n || typeof query.in !== 'function'\n ) {\n return query\n }\n\n const scopedOwner = resolveRuntimeNativeMethodOwner(runtime, target, 'setData') ?? target\n return query.in(scopedOwner as any)\n })\n\n defineSetupInstanceMethod(\n setupInstanceBridge,\n 'createIntersectionObserver',\n (options?: MiniProgramIntersectionObserverOptions) => {\n const nativeOwner = resolveSetupBridgeOwner('createIntersectionObserver')\n if (nativeOwner && typeof (nativeOwner as any).createIntersectionObserver === 'function') {\n return (nativeOwner as any).createIntersectionObserver(options ?? {})\n }\n\n const miniProgramGlobal = getMiniProgramGlobalObject()\n if (\n !supportsCurrentMiniProgramRuntimeCapability('globalCreateIntersectionObserver')\n || !miniProgramGlobal\n || typeof miniProgramGlobal.createIntersectionObserver !== 'function'\n ) {\n return undefined\n }\n\n const scopedOwner = resolveRuntimeNativeMethodOwner(runtime, target, 'setData') ?? target\n if (getCurrentMiniProgramRuntimeCapabilities().intersectionObserverScopeByParameter) {\n return miniProgramGlobal.createIntersectionObserver(scopedOwner as any, options ?? {})\n }\n return miniProgramGlobal.createIntersectionObserver(options ?? {})\n },\n )\n\n defineSetupInstanceMethod(setupInstanceBridge, 'setData', (payload: Record<string, any>, callback?: () => void) => {\n const nativeOwner = resolveSetupBridgeOwner('setData')\n if (nativeOwner && typeof (nativeOwner as any).setData === 'function') {\n return (nativeOwner as any).setData(payload, callback)\n }\n\n const adapter = runtime?.adapter as AdapterWithSetData | undefined\n const result = typeof adapter?.setData === 'function'\n ? adapter.setData(payload)\n : undefined\n if (typeof callback === 'function') {\n callback()\n }\n return result\n })\n\n defineSetupInstanceMethod(\n setupInstanceBridge,\n 'setUpdatePerformanceListener',\n (listener?: ((result: Record<string, any>) => void)) => {\n const nativeOwner = resolveSetupBridgeOwner('setUpdatePerformanceListener')\n if (nativeOwner && typeof (nativeOwner as any).setUpdatePerformanceListener === 'function') {\n return (nativeOwner as any).setUpdatePerformanceListener(listener)\n }\n return undefined\n },\n )\n\n const setupInstance = safeMarkNoSetData(new Proxy(setupInstanceBridge, {\n get(bridgeTarget, key, receiver) {\n if (Reflect.has(bridgeTarget, key)) {\n return Reflect.get(bridgeTarget, key, receiver)\n }\n if (key === '$el') {\n return resolveRuntimeNativeMethodOwner(runtime, target, 'setData') ?? target\n }\n if (key === 'renderRoot' || key === 'shadowRoot') {\n const nativeOwner = resolveRuntimeNativeMethodOwner(runtime, target, 'setData') ?? target\n return (nativeOwner as any)[key]\n }\n const publicValue = resolvePublicValue(key)\n if (publicValue.found) {\n return publicValue.value\n }\n const value = (target as any)[key as any]\n if (typeof value === 'function') {\n return value.bind(target)\n }\n return value\n },\n has(bridgeTarget, key) {\n return Reflect.has(bridgeTarget, key) || resolvePublicValue(key).found || key in (target as any)\n },\n set(bridgeTarget, key, value) {\n if (Reflect.has(bridgeTarget, key)) {\n // 仅覆写 setup 暴露的 bridge 方法,避免回写原生实例引发递归调用。\n ;(bridgeTarget as any)[key as any] = value\n return true\n }\n ;(target as any)[key as any] = value\n return true\n },\n }) as SetupContextNativeInstance)\n\n try {\n Object.defineProperty(target as Record<string, any>, WEVU_SETUP_CONTEXT_INSTANCE_KEY, {\n value: setupInstance,\n configurable: true,\n enumerable: false,\n writable: true,\n })\n }\n catch {\n ;(target as any)[WEVU_SETUP_CONTEXT_INSTANCE_KEY] = setupInstance\n }\n\n return setupInstance\n}\n"],"mappings":";;;;;;;;;AA8BA,MAAa,2BAAsD;CACjE;CACA;CACA;CACA;CACA;AACF;AAEA,SAAgB,2BAA2B;CACzC,OAAO,OAAO,OAAO,OAAO,OAAO,IAAI,CAAC;AAC1C;AAEA,MAAM,uBAAuB,CAAC;AAE9B,SAAS,mBAAmB,OAA0B;CACpD,IAAI,MAAM,QAAQ,KAAK,GACrB,OAAO,CAAC,GAAG,IAAI,IAAI,MAAM,QAAQ,SAAyB,OAAO,SAAS,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC;CAEzG,IAAI,CAAC,SAAS,OAAO,UAAU,UAC7B,OAAO,CAAC;CAEV,OAAO,OAAO,QAAQ,KAAgC,CAAC,CACpD,QAAQ,GAAG,aAAa,QAAQ,OAAO,CAAC,CAAC,CACzC,KAAK,CAAC,UAAU,IAAI;AACzB;AAEA,SAAgB,sBAAsB,OAA4B;CAChE,IAAI,CAAC,OAAO,OAAO,oBAAoB,GACrC,OAAO,yBAAyB;CAGlC,MAAM,qBAAqB,mBAAmB,MAAM,qBAAqB;CACzE,MAAM,aAAa,QAAqB,OAAO,QAAQ,YAAY,aAAa,CAAC,CAAC,SAAS,GAAG;CAE9F,OAAO,IAAI,MAAM,OAAO,OAAO,IAAI,GAAG;EACpC,IAAI,SAAS,KAAK;GAChB,IAAI,UAAU,GAAG,GACf,OAAO;EAGX;EACA,IAAI,SAAS,KAAK;GAChB,OAAO,UAAU,GAAG;EACtB;EACA,UAAU;GACR,OAAO,aAAa;EACtB;EACA,yBAAyB,SAAS,KAAK;GACrC,IAAI,CAAC,UAAU,GAAG,GAChB;GAEF,OAAO;IACL,cAAc;IACd,YAAY;IACZ,OAAO;GACT;EACF;EACA,MAAM;GACJ,OAAO;EACT;EACA,iBAAiB;GACf,OAAO;EACT;CACF,CAAC;AACH;AAEA,SAAgB,mBAAmB,cAAmC,OAA4B;CAChG,MAAM,QAAQ,sBAAsB,KAAK;CACzC,IAAI;EACF,OAAO,eAAe,cAAc,UAAU;GAC5C,OAAO;GACP,cAAc;GACd,YAAY;GACZ,UAAU;EACZ,CAAC;CACH,kBACM;EACJ,aAAa,SAAS;CACxB;CACA,OAAO;AACT;AAEA,SAAgB,4BAA6C;CAC3D,MAAM,oBAAoB,CAAC;CAC3B,WAAW,aAAa,CAAC;CACzB,WAAW,cAAc,CAAC;CAC1B,WAAW,eAAe,CAAC;CAC3B,OAAO;AACT;AAEA,SAAgB,kBAAoC,OAAa;CAC/D,IAAI;EACF,OAAO,cAAc,KAAK;CAC5B,mBACM;EACJ,OAAO;CACT;AACF;AAEA,SAAS,gCACP,SACA,QACA,YACA;CACA,MAAM,iEAAe,QAAS;CAC9B,MAAM,kBAAkB,gBAAgB,OAAO,iBAAiB,WAC5D,MAAM,YAAmB,IACzB;CACJ,MAAM,iEAAe,QAAS;CAC9B,MAAM,kBAAkB,cAAsB;EAC5C,MAAM,kBAAmB,UAAkB;EAC3C,IAAI,OAAO,oBAAoB,YAC7B,OAAO;EAET,IAAI,qBAAqB,eAAe,GACtC,OAAO;EAET,MAAM,eAAgB,OAAe;EACrC,OAAO,OAAO,iBAAiB,cAAc,oBAAoB;CACnE;CACA,MAAM,0BAA0B,cAAuB;EACrD,IAAI,CAAC,aAAa,OAAO,cAAc,UACrC,OAAO;EAET,IAAI,cAAc,UAAU,cAAc,cACxC,OAAO;EAET,IAAI,eAAe,SAAS,GAC1B,OAAO;EAET,OAAO,OAAQ,UAAkB,gBAAgB;CACnD;CACA,MAAM,kBAAkB,kBAAmB,gBAAwB,4BAA4B;CAC/F,IAAI,uBAAuB,eAAe,GACxC,OAAO;CAGT,MAAM,oEAAmB,QAAiB;CAC1C,IAAI,uBAAuB,eAAe,GACxC,OAAO;AAGX;AAEA,SAAS,0BACP,QACA,YACA,SACA;CACA,uBAAuB,OAAO;CAC9B,IAAI;EACF,OAAO,eAAe,QAAQ,YAAY;GACxC,OAAO;GACP,cAAc;GACd,YAAY;GACZ,UAAU;EACZ,CAAC;CACH,mBACM;EACH,AAAC,OAAe,cAAc;CACjC;AACF;AAEA,SAAgB,2BACd,QACA,SACA;CACA,MAAM,cAAe,OAAe;CACpC,IAAI,eAAe,OAAO,gBAAgB,UACxC,OAAO;CAGT,MAAM,sBAA2C,OAAO,OAAO,IAAI;CACnE,MAAM,sBAAsB,QAAqB;;EAC/C,MAAM,iEAAe,QAAS;EAC9B,IAAI,gBAAgB,QAAQ,IAAI,cAAc,GAAG,GAC/C,OAAO;GACL,OAAO;GACP,OAAO,QAAQ,IAAI,cAAc,GAAG;EACtC;EAEF,MAAM,oFAAgB,QAAS,mDAAgB,4EACzC,OAAe;EACrB,IAAI,gBAAgB,OAAO,iBAAiB,YAAY,OAAO,cAAc,GAAG,GAC9E,OAAO;GACL,OAAO;GACP,OAAO,QAAQ,IAAI,cAAc,GAAG;EACtC;EAEF,OAAO;GAAE,OAAO;GAAO,OAAO;EAAU;CAC1C;CACA,MAAM,2BAA2B,eAAwC;EACvE,MAAM,QAAQ,gCAAgC,SAAS,QAAQ,UAAU;EACzE,IAAI,OACF,OAAO;EAET,MAAM,iBAAkB,OAAe;EACvC,IAAI,OAAO,mBAAmB,cAAc,CAAC,qBAAqB,cAAc,GAC9E,OAAO;CAGX;CAEA,0BAA0B,qBAAqB,iBAAiB,GAAG,SAA+C;EAChH,MAAM,CAAC,WAAW,QAAQ,WAAW;EACrC,MAAM,cAAc,wBAAwB,cAAc;EAC1D,IAAI,eAAe,OAAQ,YAAoB,iBAAiB,YAAY;GAC1E,IAAI,KAAK,UAAU,GAChB,AAAC,YAAoB,aAAa,WAAW,QAAQ,OAAO;QAG5D,AAAC,YAAoB,aAAa,WAAW,MAAM;EAExD;CACF,CAAC;CAED,0BAA0B,qBAAqB,6BAA6B;;EAC1E,MAAM,cAAc,wBAAwB,qBAAqB;EACjE,IAAI,eAAe,OAAQ,YAAoB,wBAAwB,YACrE,OAAQ,YAAoB,oBAAoB;EAGlD,MAAM,oBAAoB,2BAA2B;EACrD,IACE,CAAC,4CAA4C,2BAA2B,KACrE,CAAC,qBACD,OAAO,kBAAkB,wBAAwB,YAEpD;EAGF,MAAM,QAAQ,kBAAkB,oBAAoB;EACpD,IAAI,CAAC,OACH,OAAO;EAET,IACE,CAAC,yCAAyC,CAAC,CAAC,0BACzC,OAAO,MAAM,OAAO,YAEvB,OAAO;EAGT,MAAM,uCAAc,gCAAgC,SAAS,QAAQ,SAAS,0EAAK;EACnF,OAAO,MAAM,GAAG,WAAkB;CACpC,CAAC;CAED,0BACE,qBACA,+BACC,YAAqD;;EACpD,MAAM,cAAc,wBAAwB,4BAA4B;EACxE,IAAI,eAAe,OAAQ,YAAoB,+BAA+B,YAC5E,OAAQ,YAAoB,2BAA2B,mDAAW,CAAC,CAAC;EAGtE,MAAM,oBAAoB,2BAA2B;EACrD,IACE,CAAC,4CAA4C,kCAAkC,KAC5E,CAAC,qBACD,OAAO,kBAAkB,+BAA+B,YAE3D;EAGF,MAAM,wCAAc,gCAAgC,SAAS,QAAQ,SAAS,4EAAK;EACnF,IAAI,yCAAyC,CAAC,CAAC,sCAC7C,OAAO,kBAAkB,2BAA2B,aAAoB,mDAAW,CAAC,CAAC;EAEvF,OAAO,kBAAkB,2BAA2B,mDAAW,CAAC,CAAC;CACnE,CACF;CAEA,0BAA0B,qBAAqB,YAAY,SAA8B,aAA0B;EACjH,MAAM,cAAc,wBAAwB,SAAS;EACrD,IAAI,eAAe,OAAQ,YAAoB,YAAY,YACzD,OAAQ,YAAoB,QAAQ,SAAS,QAAQ;EAGvD,MAAM,4DAAU,QAAS;EACzB,MAAM,SAAS,0DAAO,QAAS,aAAY,aACvC,QAAQ,QAAQ,OAAO,IACvB;EACJ,IAAI,OAAO,aAAa,YACtB,SAAS;EAEX,OAAO;CACT,CAAC;CAED,0BACE,qBACA,iCACC,aAAuD;EACtD,MAAM,cAAc,wBAAwB,8BAA8B;EAC1E,IAAI,eAAe,OAAQ,YAAoB,iCAAiC,YAC9E,OAAQ,YAAoB,6BAA6B,QAAQ;CAGrE,CACF;CAEA,MAAM,gBAAgB,kBAAkB,IAAI,MAAM,qBAAqB;EACrE,IAAI,cAAc,KAAK,UAAU;GAC/B,IAAI,QAAQ,IAAI,cAAc,GAAG,GAC/B,OAAO,QAAQ,IAAI,cAAc,KAAK,QAAQ;GAEhD,IAAI,QAAQ,OAAO;;IACjB,iCAAO,gCAAgC,SAAS,QAAQ,SAAS,4EAAK;GACxE;GACA,IAAI,QAAQ,gBAAgB,QAAQ,cAAc;;IAEhD,kCADoB,gCAAgC,SAAS,QAAQ,SAAS,4EAAK,OAChE,CAAS;GAC9B;GACA,MAAM,cAAc,mBAAmB,GAAG;GAC1C,IAAI,YAAY,OACd,OAAO,YAAY;GAErB,MAAM,QAAS,OAAe;GAC9B,IAAI,OAAO,UAAU,YACnB,OAAO,MAAM,KAAK,MAAM;GAE1B,OAAO;EACT;EACA,IAAI,cAAc,KAAK;GACrB,OAAO,QAAQ,IAAI,cAAc,GAAG,KAAK,mBAAmB,GAAG,CAAC,CAAC,SAAS,OAAQ;EACpF;EACA,IAAI,cAAc,KAAK,OAAO;GAC5B,IAAI,QAAQ,IAAI,cAAc,GAAG,GAAG;IAEjC,AAAC,aAAqB,OAAc;IACrC,OAAO;GACT;GACC,AAAC,OAAe,OAAc;GAC/B,OAAO;EACT;CACF,CAAC,CAA+B;CAEhC,IAAI;EACF,OAAO,eAAe,QAA+B,iCAAiC;GACpF,OAAO;GACP,cAAc;GACd,YAAY;GACZ,UAAU;EACZ,CAAC;CACH,mBACM;EACH,AAAC,OAAe,mCAAmC;CACtD;CAEA,OAAO;AACT"}
|
|
@@ -35,9 +35,10 @@ function updateTemplateRefs(target, onResolved, assignmentTarget = target) {
|
|
|
35
35
|
const value = entry.value;
|
|
36
36
|
const resolved = resolveTemplateRefTarget(assignmentTarget, binding, target);
|
|
37
37
|
if (resolved.type === "function") {
|
|
38
|
-
if (binding.inFor && Array.isArray(value))
|
|
39
|
-
|
|
40
|
-
|
|
38
|
+
if (binding.inFor && Array.isArray(value)) {
|
|
39
|
+
if (value.length) value.forEach((item) => resolved.fn.call(proxy, item));
|
|
40
|
+
else resolved.fn.call(proxy, null);
|
|
41
|
+
} else resolved.fn.call(proxy, value !== null && value !== void 0 ? value : null);
|
|
41
42
|
return;
|
|
42
43
|
}
|
|
43
44
|
if (resolved.type === "ref") {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"templateRefs.mjs","names":[],"sources":["../../../src/runtime/templateRefs.ts"],"sourcesContent":["import type { InternalRuntimeState } from './types'\nimport {\n WEVU_READY_CALLED_KEY,\n WEVU_TEMPLATE_REFS_CALLBACKS_KEY,\n WEVU_TEMPLATE_REFS_KEY,\n WEVU_TEMPLATE_REFS_PENDING_KEY,\n} from '@weapp-core/constants'\nimport { nextTick } from '../scheduler'\nimport { markNoSetData } from './noSetData'\nimport {\n buildTemplateRefValue,\n createSelectorQuery,\n ensureRefsContainer,\n getTemplateRefMap,\n isComponentRef,\n resolveComponentRefValue,\n resolveTemplateRefTarget,\n updateTemplateRefMapValue,\n} from './templateRefs/helpers'\n\nexport interface TemplateRefBinding {\n selector: string\n inFor: boolean\n name?: string\n get?: () => unknown\n kind?: 'component' | 'element'\n}\n\ntype TemplateRefUpdateCallback = () => void\n\nexport function updateTemplateRefs(\n target: InternalRuntimeState,\n onResolved?: TemplateRefUpdateCallback,\n assignmentTarget: InternalRuntimeState = target,\n) {\n const bindings = (target as any)[WEVU_TEMPLATE_REFS_KEY] as TemplateRefBinding[] | undefined\n if (!bindings || !bindings.length) {\n onResolved?.()\n return\n }\n if (!(target as any)[WEVU_READY_CALLED_KEY]) {\n onResolved?.()\n return\n }\n if (!target.__wevu) {\n onResolved?.()\n return\n }\n const templateRefMap = getTemplateRefMap(assignmentTarget)\n const nodeBindings = bindings.filter(binding => !isComponentRef(binding))\n const componentEntries = bindings\n .filter(binding => isComponentRef(binding))\n .map(binding => ({\n binding,\n value: resolveComponentRefValue(target, binding),\n }))\n\n const applyEntries = (entries: Array<{ binding: TemplateRefBinding, value: any }>) => {\n const refsContainer = ensureRefsContainer(assignmentTarget)\n const nameEntries = new Map<string, { values: any[], count: number, hasFor: boolean }>()\n const nextNames = new Set<string>()\n const proxy = target.__wevu?.proxy ?? target\n entries.forEach((entry) => {\n const binding = entry.binding\n const value = entry.value\n const resolved = resolveTemplateRefTarget(assignmentTarget, binding, target)\n\n if (resolved.type === 'function') {\n if (binding.inFor && Array.isArray(value)) {\n if (value.length) {\n value.forEach(item => resolved.fn.call(proxy, item))\n }\n else {\n resolved.fn.call(proxy, null)\n }\n }\n else {\n resolved.fn.call(proxy, value ?? null)\n }\n return\n }\n\n if (resolved.type === 'ref') {\n resolved.ref.value = value\n return\n }\n\n if (resolved.type === 'name') {\n nextNames.add(resolved.name)\n const entry = nameEntries.get(resolved.name) ?? { values: [], count: 0, hasFor: false }\n entry.count += 1\n entry.hasFor = entry.hasFor || binding.inFor\n if (binding.inFor) {\n if (Array.isArray(value)) {\n entry.values.push(...value)\n }\n }\n else if (value != null) {\n entry.values.push(value)\n }\n nameEntries.set(resolved.name, entry)\n }\n })\n\n for (const [name, entry] of nameEntries) {\n let nextValue: any\n if (!entry.values.length) {\n nextValue = entry.hasFor ? markNoSetData([]) : null\n }\n else if (entry.hasFor || entry.values.length > 1 || entry.count > 1) {\n nextValue = markNoSetData(entry.values)\n }\n else {\n nextValue = entry.values[0]\n }\n refsContainer[name] = nextValue\n updateTemplateRefMapValue(templateRefMap, name, nextValue)\n }\n\n for (const key of Object.keys(refsContainer)) {\n if (!nextNames.has(key)) {\n delete refsContainer[key]\n }\n }\n\n onResolved?.()\n }\n\n if (!nodeBindings.length) {\n applyEntries(componentEntries)\n return\n }\n\n const query = createSelectorQuery(target)\n if (!query) {\n applyEntries(componentEntries)\n return\n }\n\n const nodeEntries: Array<{ binding: TemplateRefBinding }> = []\n for (const binding of nodeBindings) {\n const nodesRef = binding.inFor ? query.selectAll(binding.selector) : query.select(binding.selector)\n nodesRef.boundingClientRect()\n nodeEntries.push({ binding })\n }\n\n query.exec((res) => {\n const entries = nodeEntries.map((entry, index) => {\n const rawResult = Array.isArray(res) ? res[index] : null\n return {\n binding: entry.binding,\n value: buildTemplateRefValue(target, entry.binding, rawResult),\n }\n })\n applyEntries([...componentEntries, ...entries])\n })\n}\n\nexport function scheduleTemplateRefUpdate(\n target: InternalRuntimeState,\n onResolved?: TemplateRefUpdateCallback,\n assignmentTarget: InternalRuntimeState = target,\n) {\n const bindings = (target as any)[WEVU_TEMPLATE_REFS_KEY] as TemplateRefBinding[] | undefined\n if (!bindings || !bindings.length) {\n onResolved?.()\n return\n }\n if (onResolved) {\n const callbacks = ((target as any)[WEVU_TEMPLATE_REFS_CALLBACKS_KEY] ?? []) as TemplateRefUpdateCallback[]\n callbacks.push(onResolved)\n if (!(target as any)[WEVU_TEMPLATE_REFS_CALLBACKS_KEY]) {\n Object.defineProperty(target, WEVU_TEMPLATE_REFS_CALLBACKS_KEY, {\n value: callbacks,\n configurable: true,\n enumerable: false,\n writable: true,\n })\n }\n }\n if ((target as any)[WEVU_TEMPLATE_REFS_PENDING_KEY]) {\n return\n }\n ;(target as any)[WEVU_TEMPLATE_REFS_PENDING_KEY] = true\n nextTick(() => {\n ;(target as any)[WEVU_TEMPLATE_REFS_PENDING_KEY] = false\n const flushCallbacks = () => {\n const callbacks = (target as any)[WEVU_TEMPLATE_REFS_CALLBACKS_KEY] as TemplateRefUpdateCallback[] | undefined\n if (!callbacks || !callbacks.length) {\n return\n }\n callbacks.splice(0).forEach((cb) => {\n try {\n cb()\n }\n catch {\n // 忽略回调中的异常,避免影响后续更新\n }\n })\n }\n updateTemplateRefs(target, flushCallbacks, assignmentTarget)\n })\n}\n\nexport function clearTemplateRefs(\n target: InternalRuntimeState,\n assignmentTarget: InternalRuntimeState = target,\n) {\n const bindings = (target as any)[WEVU_TEMPLATE_REFS_KEY] as TemplateRefBinding[] | undefined\n if (!bindings || !bindings.length) {\n return\n }\n const refsContainer = ensureRefsContainer(assignmentTarget)\n const proxy = target.__wevu?.proxy ?? target\n const nextNames = new Set<string>()\n const templateRefMap = getTemplateRefMap(assignmentTarget)\n\n for (const binding of bindings) {\n const resolved = resolveTemplateRefTarget(assignmentTarget, binding, target)\n const emptyValue = binding.inFor ? markNoSetData([]) : null\n if (resolved.type === 'function') {\n resolved.fn.call(proxy, null)\n continue\n }\n if (resolved.type === 'ref') {\n resolved.ref.value = emptyValue\n continue\n }\n if (resolved.type === 'name') {\n nextNames.add(resolved.name)\n refsContainer[resolved.name] = emptyValue\n updateTemplateRefMapValue(templateRefMap, resolved.name, emptyValue)\n }\n }\n\n for (const key of Object.keys(refsContainer)) {\n if (!nextNames.has(key)) {\n delete refsContainer[key]\n }\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"templateRefs.mjs","names":[],"sources":["../../../src/runtime/templateRefs.ts"],"sourcesContent":["import type { InternalRuntimeState } from './types'\nimport {\n WEVU_READY_CALLED_KEY,\n WEVU_TEMPLATE_REFS_CALLBACKS_KEY,\n WEVU_TEMPLATE_REFS_KEY,\n WEVU_TEMPLATE_REFS_PENDING_KEY,\n} from '@weapp-core/constants'\nimport { nextTick } from '../scheduler'\nimport { markNoSetData } from './noSetData'\nimport {\n buildTemplateRefValue,\n createSelectorQuery,\n ensureRefsContainer,\n getTemplateRefMap,\n isComponentRef,\n resolveComponentRefValue,\n resolveTemplateRefTarget,\n updateTemplateRefMapValue,\n} from './templateRefs/helpers'\n\nexport interface TemplateRefBinding {\n selector: string\n inFor: boolean\n name?: string\n get?: () => unknown\n kind?: 'component' | 'element'\n}\n\ntype TemplateRefUpdateCallback = () => void\n\nexport function updateTemplateRefs(\n target: InternalRuntimeState,\n onResolved?: TemplateRefUpdateCallback,\n assignmentTarget: InternalRuntimeState = target,\n) {\n const bindings = (target as any)[WEVU_TEMPLATE_REFS_KEY] as TemplateRefBinding[] | undefined\n if (!bindings || !bindings.length) {\n onResolved?.()\n return\n }\n if (!(target as any)[WEVU_READY_CALLED_KEY]) {\n onResolved?.()\n return\n }\n if (!target.__wevu) {\n onResolved?.()\n return\n }\n const templateRefMap = getTemplateRefMap(assignmentTarget)\n const nodeBindings = bindings.filter(binding => !isComponentRef(binding))\n const componentEntries = bindings\n .filter(binding => isComponentRef(binding))\n .map(binding => ({\n binding,\n value: resolveComponentRefValue(target, binding),\n }))\n\n const applyEntries = (entries: Array<{ binding: TemplateRefBinding, value: any }>) => {\n const refsContainer = ensureRefsContainer(assignmentTarget)\n const nameEntries = new Map<string, { values: any[], count: number, hasFor: boolean }>()\n const nextNames = new Set<string>()\n const proxy = target.__wevu?.proxy ?? target\n entries.forEach((entry) => {\n const binding = entry.binding\n const value = entry.value\n const resolved = resolveTemplateRefTarget(assignmentTarget, binding, target)\n\n if (resolved.type === 'function') {\n if (binding.inFor && Array.isArray(value)) {\n if (value.length) {\n value.forEach(item => resolved.fn.call(proxy, item))\n }\n else {\n resolved.fn.call(proxy, null)\n }\n }\n else {\n resolved.fn.call(proxy, value ?? null)\n }\n return\n }\n\n if (resolved.type === 'ref') {\n resolved.ref.value = value\n return\n }\n\n if (resolved.type === 'name') {\n nextNames.add(resolved.name)\n const entry = nameEntries.get(resolved.name) ?? { values: [], count: 0, hasFor: false }\n entry.count += 1\n entry.hasFor = entry.hasFor || binding.inFor\n if (binding.inFor) {\n if (Array.isArray(value)) {\n entry.values.push(...value)\n }\n }\n else if (value != null) {\n entry.values.push(value)\n }\n nameEntries.set(resolved.name, entry)\n }\n })\n\n for (const [name, entry] of nameEntries) {\n let nextValue: any\n if (!entry.values.length) {\n nextValue = entry.hasFor ? markNoSetData([]) : null\n }\n else if (entry.hasFor || entry.values.length > 1 || entry.count > 1) {\n nextValue = markNoSetData(entry.values)\n }\n else {\n nextValue = entry.values[0]\n }\n refsContainer[name] = nextValue\n updateTemplateRefMapValue(templateRefMap, name, nextValue)\n }\n\n for (const key of Object.keys(refsContainer)) {\n if (!nextNames.has(key)) {\n delete refsContainer[key]\n }\n }\n\n onResolved?.()\n }\n\n if (!nodeBindings.length) {\n applyEntries(componentEntries)\n return\n }\n\n const query = createSelectorQuery(target)\n if (!query) {\n applyEntries(componentEntries)\n return\n }\n\n const nodeEntries: Array<{ binding: TemplateRefBinding }> = []\n for (const binding of nodeBindings) {\n const nodesRef = binding.inFor ? query.selectAll(binding.selector) : query.select(binding.selector)\n nodesRef.boundingClientRect()\n nodeEntries.push({ binding })\n }\n\n query.exec((res) => {\n const entries = nodeEntries.map((entry, index) => {\n const rawResult = Array.isArray(res) ? res[index] : null\n return {\n binding: entry.binding,\n value: buildTemplateRefValue(target, entry.binding, rawResult),\n }\n })\n applyEntries([...componentEntries, ...entries])\n })\n}\n\nexport function scheduleTemplateRefUpdate(\n target: InternalRuntimeState,\n onResolved?: TemplateRefUpdateCallback,\n assignmentTarget: InternalRuntimeState = target,\n) {\n const bindings = (target as any)[WEVU_TEMPLATE_REFS_KEY] as TemplateRefBinding[] | undefined\n if (!bindings || !bindings.length) {\n onResolved?.()\n return\n }\n if (onResolved) {\n const callbacks = ((target as any)[WEVU_TEMPLATE_REFS_CALLBACKS_KEY] ?? []) as TemplateRefUpdateCallback[]\n callbacks.push(onResolved)\n if (!(target as any)[WEVU_TEMPLATE_REFS_CALLBACKS_KEY]) {\n Object.defineProperty(target, WEVU_TEMPLATE_REFS_CALLBACKS_KEY, {\n value: callbacks,\n configurable: true,\n enumerable: false,\n writable: true,\n })\n }\n }\n if ((target as any)[WEVU_TEMPLATE_REFS_PENDING_KEY]) {\n return\n }\n ;(target as any)[WEVU_TEMPLATE_REFS_PENDING_KEY] = true\n nextTick(() => {\n ;(target as any)[WEVU_TEMPLATE_REFS_PENDING_KEY] = false\n const flushCallbacks = () => {\n const callbacks = (target as any)[WEVU_TEMPLATE_REFS_CALLBACKS_KEY] as TemplateRefUpdateCallback[] | undefined\n if (!callbacks || !callbacks.length) {\n return\n }\n callbacks.splice(0).forEach((cb) => {\n try {\n cb()\n }\n catch {\n // 忽略回调中的异常,避免影响后续更新\n }\n })\n }\n updateTemplateRefs(target, flushCallbacks, assignmentTarget)\n })\n}\n\nexport function clearTemplateRefs(\n target: InternalRuntimeState,\n assignmentTarget: InternalRuntimeState = target,\n) {\n const bindings = (target as any)[WEVU_TEMPLATE_REFS_KEY] as TemplateRefBinding[] | undefined\n if (!bindings || !bindings.length) {\n return\n }\n const refsContainer = ensureRefsContainer(assignmentTarget)\n const proxy = target.__wevu?.proxy ?? target\n const nextNames = new Set<string>()\n const templateRefMap = getTemplateRefMap(assignmentTarget)\n\n for (const binding of bindings) {\n const resolved = resolveTemplateRefTarget(assignmentTarget, binding, target)\n const emptyValue = binding.inFor ? markNoSetData([]) : null\n if (resolved.type === 'function') {\n resolved.fn.call(proxy, null)\n continue\n }\n if (resolved.type === 'ref') {\n resolved.ref.value = emptyValue\n continue\n }\n if (resolved.type === 'name') {\n nextNames.add(resolved.name)\n refsContainer[resolved.name] = emptyValue\n updateTemplateRefMapValue(templateRefMap, resolved.name, emptyValue)\n }\n }\n\n for (const key of Object.keys(refsContainer)) {\n if (!nextNames.has(key)) {\n delete refsContainer[key]\n }\n }\n}\n"],"mappings":"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"}
|
|
@@ -44,22 +44,24 @@ function createOptionsStyleStore(id, options, manager) {
|
|
|
44
44
|
const store = {};
|
|
45
45
|
for (const key of Object.getOwnPropertyNames(base.api)) {
|
|
46
46
|
const d = Object.getOwnPropertyDescriptor(base.api, key);
|
|
47
|
-
if (d)
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
47
|
+
if (d) {
|
|
48
|
+
if (key === "$state") Object.defineProperty(store, key, {
|
|
49
|
+
enumerable: d.enumerable,
|
|
50
|
+
configurable: d.configurable,
|
|
51
|
+
get() {
|
|
52
|
+
return base.api.$state;
|
|
53
|
+
},
|
|
54
|
+
set(v) {
|
|
55
|
+
isPatching = true;
|
|
56
|
+
try {
|
|
57
|
+
base.api.$state = v;
|
|
58
|
+
} finally {
|
|
59
|
+
isPatching = false;
|
|
60
|
+
}
|
|
59
61
|
}
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
|
|
62
|
+
});
|
|
63
|
+
else Object.defineProperty(store, key, d);
|
|
64
|
+
}
|
|
63
65
|
}
|
|
64
66
|
const getterDefs = (_options$getters = options.getters) !== null && _options$getters !== void 0 ? _options$getters : {};
|
|
65
67
|
Object.keys(getterDefs).forEach((key) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"optionsStyle.mjs","names":[],"sources":["../../../../src/store/define/optionsStyle.ts"],"sourcesContent":["import { computed, effect, reactive, toRaw, touchReactive } from '../../reactivity'\nimport { wrapAction } from '../actions'\nimport { createBaseApi } from '../base'\nimport { cloneDeep, resetObject } from '../utils'\nimport { createSafeNotifier } from './shared'\n\nexport function createOptionsStyleStore(id: string, options: any, manager: any) {\n const rawState = options.state ? options.state() : {}\n const state = reactive(rawState)\n const initialSnapshot = cloneDeep(toRaw(rawState))\n let notify: (type: any) => void = () => {}\n const base = createBaseApi<typeof state>(id, state, t => notify(t), () => {\n resetObject(state as any, initialSnapshot)\n notify('patch object')\n })\n\n let isPatching = false\n const rawPatch = base.api.$patch\n base.api.$patch = (patch: Partial<typeof state> | ((nextState: typeof state) => void)) => {\n isPatching = true\n try {\n rawPatch(patch as any)\n }\n finally {\n isPatching = false\n }\n }\n if (typeof base.api.$reset === 'function') {\n const rawReset = base.api.$reset\n base.api.$reset = () => {\n isPatching = true\n try {\n rawReset()\n }\n finally {\n isPatching = false\n }\n }\n }\n\n notify = createSafeNotifier(id, base.subs, () => state as any)\n\n const store: Record<string, any> = {}\n for (const key of Object.getOwnPropertyNames(base.api)) {\n const d = Object.getOwnPropertyDescriptor(base.api, key)\n if (d) {\n if (key === '$state') {\n Object.defineProperty(store, key, {\n enumerable: d.enumerable,\n configurable: d.configurable,\n get() {\n return (base.api as any).$state\n },\n set(v: any) {\n isPatching = true\n try {\n ;(base.api as any).$state = v\n }\n finally {\n isPatching = false\n }\n },\n })\n }\n else {\n Object.defineProperty(store, key, d)\n }\n }\n }\n\n const getterDefs = options.getters ?? {}\n Object.keys(getterDefs).forEach((key) => {\n const getter = (getterDefs as any)[key]\n if (typeof getter === 'function') {\n const c = computed(() => getter.call(store, state))\n Object.defineProperty(store, key, {\n enumerable: true,\n configurable: true,\n get() {\n return c.value\n },\n })\n }\n })\n\n const actionDefs = options.actions ?? {}\n Object.keys(actionDefs).forEach((key) => {\n const act = (actionDefs as any)[key]\n if (typeof act === 'function') {\n const wrapped = wrapAction(store as any, key, (...args: any[]) => {\n return act.apply(store as any, args)\n }, base.actionSubs)\n store[key] = wrapped\n }\n })\n\n Object.keys(state).forEach((k) => {\n Object.defineProperty(store, k, {\n enumerable: true,\n configurable: true,\n get() {\n return (state as any)[k]\n },\n set(v: any) {\n ;(state as any)[k] = v\n },\n })\n })\n\n let initialized = false\n let dispatchingDirect = false\n effect(() => {\n touchReactive(state)\n if (!initialized) {\n initialized = true\n return\n }\n if (isPatching || dispatchingDirect) {\n return\n }\n dispatchingDirect = true\n try {\n notify('direct')\n }\n finally {\n dispatchingDirect = false\n }\n })\n\n const plugins = manager?._plugins ?? []\n for (const plugin of plugins) {\n try {\n plugin({ store })\n }\n catch {}\n }\n\n return store\n}\n"],"mappings":";;;;;;;;;;;AAMA,SAAgB,wBAAwB,IAAY,SAAc,SAAc;;CAC9E,MAAM,WAAW,QAAQ,QAAQ,QAAQ,MAAM,IAAI,CAAC;CACpD,MAAM,QAAQ,SAAS,QAAQ;CAC/B,MAAM,kBAAkB,UAAU,MAAM,QAAQ,CAAC;CACjD,IAAI,eAAoC,CAAC;CACzC,MAAM,OAAO,cAA4B,IAAI,QAAO,MAAK,OAAO,CAAC,SAAS;EACxE,YAAY,OAAc,eAAe;EACzC,OAAO,cAAc;CACvB,CAAC;CAED,IAAI,aAAa;CACjB,MAAM,WAAW,KAAK,IAAI;CAC1B,KAAK,IAAI,UAAU,UAAuE;EACxF,aAAa;EACb,IAAI;GACF,SAAS,KAAY;EACvB,UACQ;GACN,aAAa;EACf;CACF;CACA,IAAI,OAAO,KAAK,IAAI,WAAW,YAAY;EACzC,MAAM,WAAW,KAAK,IAAI;EAC1B,KAAK,IAAI,eAAe;GACtB,aAAa;GACb,IAAI;IACF,SAAS;GACX,UACQ;IACN,aAAa;GACf;EACF;CACF;CAEA,SAAS,mBAAmB,IAAI,KAAK,YAAY,KAAY;CAE7D,MAAM,QAA6B,CAAC;CACpC,KAAK,MAAM,OAAO,OAAO,oBAAoB,KAAK,GAAG,GAAG;EACtD,MAAM,IAAI,OAAO,yBAAyB,KAAK,KAAK,GAAG;EACvD,IAAI,
|
|
1
|
+
{"version":3,"file":"optionsStyle.mjs","names":[],"sources":["../../../../src/store/define/optionsStyle.ts"],"sourcesContent":["import { computed, effect, reactive, toRaw, touchReactive } from '../../reactivity'\nimport { wrapAction } from '../actions'\nimport { createBaseApi } from '../base'\nimport { cloneDeep, resetObject } from '../utils'\nimport { createSafeNotifier } from './shared'\n\nexport function createOptionsStyleStore(id: string, options: any, manager: any) {\n const rawState = options.state ? options.state() : {}\n const state = reactive(rawState)\n const initialSnapshot = cloneDeep(toRaw(rawState))\n let notify: (type: any) => void = () => {}\n const base = createBaseApi<typeof state>(id, state, t => notify(t), () => {\n resetObject(state as any, initialSnapshot)\n notify('patch object')\n })\n\n let isPatching = false\n const rawPatch = base.api.$patch\n base.api.$patch = (patch: Partial<typeof state> | ((nextState: typeof state) => void)) => {\n isPatching = true\n try {\n rawPatch(patch as any)\n }\n finally {\n isPatching = false\n }\n }\n if (typeof base.api.$reset === 'function') {\n const rawReset = base.api.$reset\n base.api.$reset = () => {\n isPatching = true\n try {\n rawReset()\n }\n finally {\n isPatching = false\n }\n }\n }\n\n notify = createSafeNotifier(id, base.subs, () => state as any)\n\n const store: Record<string, any> = {}\n for (const key of Object.getOwnPropertyNames(base.api)) {\n const d = Object.getOwnPropertyDescriptor(base.api, key)\n if (d) {\n if (key === '$state') {\n Object.defineProperty(store, key, {\n enumerable: d.enumerable,\n configurable: d.configurable,\n get() {\n return (base.api as any).$state\n },\n set(v: any) {\n isPatching = true\n try {\n ;(base.api as any).$state = v\n }\n finally {\n isPatching = false\n }\n },\n })\n }\n else {\n Object.defineProperty(store, key, d)\n }\n }\n }\n\n const getterDefs = options.getters ?? {}\n Object.keys(getterDefs).forEach((key) => {\n const getter = (getterDefs as any)[key]\n if (typeof getter === 'function') {\n const c = computed(() => getter.call(store, state))\n Object.defineProperty(store, key, {\n enumerable: true,\n configurable: true,\n get() {\n return c.value\n },\n })\n }\n })\n\n const actionDefs = options.actions ?? {}\n Object.keys(actionDefs).forEach((key) => {\n const act = (actionDefs as any)[key]\n if (typeof act === 'function') {\n const wrapped = wrapAction(store as any, key, (...args: any[]) => {\n return act.apply(store as any, args)\n }, base.actionSubs)\n store[key] = wrapped\n }\n })\n\n Object.keys(state).forEach((k) => {\n Object.defineProperty(store, k, {\n enumerable: true,\n configurable: true,\n get() {\n return (state as any)[k]\n },\n set(v: any) {\n ;(state as any)[k] = v\n },\n })\n })\n\n let initialized = false\n let dispatchingDirect = false\n effect(() => {\n touchReactive(state)\n if (!initialized) {\n initialized = true\n return\n }\n if (isPatching || dispatchingDirect) {\n return\n }\n dispatchingDirect = true\n try {\n notify('direct')\n }\n finally {\n dispatchingDirect = false\n }\n })\n\n const plugins = manager?._plugins ?? []\n for (const plugin of plugins) {\n try {\n plugin({ store })\n }\n catch {}\n }\n\n return store\n}\n"],"mappings":";;;;;;;;;;;AAMA,SAAgB,wBAAwB,IAAY,SAAc,SAAc;;CAC9E,MAAM,WAAW,QAAQ,QAAQ,QAAQ,MAAM,IAAI,CAAC;CACpD,MAAM,QAAQ,SAAS,QAAQ;CAC/B,MAAM,kBAAkB,UAAU,MAAM,QAAQ,CAAC;CACjD,IAAI,eAAoC,CAAC;CACzC,MAAM,OAAO,cAA4B,IAAI,QAAO,MAAK,OAAO,CAAC,SAAS;EACxE,YAAY,OAAc,eAAe;EACzC,OAAO,cAAc;CACvB,CAAC;CAED,IAAI,aAAa;CACjB,MAAM,WAAW,KAAK,IAAI;CAC1B,KAAK,IAAI,UAAU,UAAuE;EACxF,aAAa;EACb,IAAI;GACF,SAAS,KAAY;EACvB,UACQ;GACN,aAAa;EACf;CACF;CACA,IAAI,OAAO,KAAK,IAAI,WAAW,YAAY;EACzC,MAAM,WAAW,KAAK,IAAI;EAC1B,KAAK,IAAI,eAAe;GACtB,aAAa;GACb,IAAI;IACF,SAAS;GACX,UACQ;IACN,aAAa;GACf;EACF;CACF;CAEA,SAAS,mBAAmB,IAAI,KAAK,YAAY,KAAY;CAE7D,MAAM,QAA6B,CAAC;CACpC,KAAK,MAAM,OAAO,OAAO,oBAAoB,KAAK,GAAG,GAAG;EACtD,MAAM,IAAI,OAAO,yBAAyB,KAAK,KAAK,GAAG;EACvD,IAAI,GAAG;GACL,IAAI,QAAQ,UACV,OAAO,eAAe,OAAO,KAAK;IAChC,YAAY,EAAE;IACd,cAAc,EAAE;IAChB,MAAM;KACJ,OAAQ,KAAK,IAAY;IAC3B;IACA,IAAI,GAAQ;KACV,aAAa;KACb,IAAI;MACD,AAAC,KAAK,IAAY,SAAS;KAC9B,UACQ;MACN,aAAa;KACf;IACF;GACF,CAAC;QAGD,OAAO,eAAe,OAAO,KAAK,CAAC;EAEvC;CACF;CAEA,MAAM,iCAAa,QAAQ,sEAAW,CAAC;CACvC,OAAO,KAAK,UAAU,CAAC,CAAC,SAAS,QAAQ;EACvC,MAAM,SAAU,WAAmB;EACnC,IAAI,OAAO,WAAW,YAAY;GAChC,MAAM,IAAI,eAAe,OAAO,KAAK,OAAO,KAAK,CAAC;GAClD,OAAO,eAAe,OAAO,KAAK;IAChC,YAAY;IACZ,cAAc;IACd,MAAM;KACJ,OAAO,EAAE;IACX;GACF,CAAC;EACH;CACF,CAAC;CAED,MAAM,iCAAa,QAAQ,sEAAW,CAAC;CACvC,OAAO,KAAK,UAAU,CAAC,CAAC,SAAS,QAAQ;EACvC,MAAM,MAAO,WAAmB;EAChC,IAAI,OAAO,QAAQ,YAAY;GAC7B,MAAM,UAAU,WAAW,OAAc,MAAM,GAAG,SAAgB;IAChE,OAAO,IAAI,MAAM,OAAc,IAAI;GACrC,GAAG,KAAK,UAAU;GAClB,MAAM,OAAO;EACf;CACF,CAAC;CAED,OAAO,KAAK,KAAK,CAAC,CAAC,SAAS,MAAM;EAChC,OAAO,eAAe,OAAO,GAAG;GAC9B,YAAY;GACZ,cAAc;GACd,MAAM;IACJ,OAAQ,MAAc;GACxB;GACA,IAAI,GAAQ;IACT,AAAC,MAAc,KAAK;GACvB;EACF,CAAC;CACH,CAAC;CAED,IAAI,cAAc;CAClB,IAAI,oBAAoB;CACxB,aAAa;EACX,cAAc,KAAK;EACnB,IAAI,CAAC,aAAa;GAChB,cAAc;GACd;EACF;EACA,IAAI,cAAc,mBAChB;EAEF,oBAAoB;EACpB,IAAI;GACF,OAAO,QAAQ;EACjB,UACQ;GACN,oBAAoB;EACtB;CACF,CAAC;CAED,MAAM,iFAAU,QAAS,yEAAY,CAAC;CACtC,KAAK,MAAM,UAAU,SACnB,IAAI;EACF,OAAO,EAAE,MAAM,CAAC;CAClB,kBACM,CAAC;CAGT,OAAO;AACT"}
|
|
@@ -64,22 +64,24 @@ function createSetupStyleStore(id, setupFactory, manager) {
|
|
|
64
64
|
notify = createSafeNotifier(id, base.subs, () => instance);
|
|
65
65
|
for (const key of Object.getOwnPropertyNames(base.api)) {
|
|
66
66
|
const d = Object.getOwnPropertyDescriptor(base.api, key);
|
|
67
|
-
if (d)
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
67
|
+
if (d) {
|
|
68
|
+
if (key === "$state") Object.defineProperty(instance, key, {
|
|
69
|
+
enumerable: d.enumerable,
|
|
70
|
+
configurable: d.configurable,
|
|
71
|
+
get() {
|
|
72
|
+
return base.api.$state;
|
|
73
|
+
},
|
|
74
|
+
set(v) {
|
|
75
|
+
isPatching = true;
|
|
76
|
+
try {
|
|
77
|
+
base.api.$state = v;
|
|
78
|
+
} finally {
|
|
79
|
+
isPatching = false;
|
|
80
|
+
}
|
|
79
81
|
}
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
|
|
82
|
+
});
|
|
83
|
+
else Object.defineProperty(instance, key, d);
|
|
84
|
+
}
|
|
83
85
|
}
|
|
84
86
|
const directSources = [];
|
|
85
87
|
Object.keys(result).forEach((k) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"setupStyle.mjs","names":[],"sources":["../../../../src/store/define/setupStyle.ts"],"sourcesContent":["import { effect, isReactive, isRef, touchReactive } from '../../reactivity'\nimport { wrapAction } from '../actions'\nimport { createBaseApi } from '../base'\nimport { cloneDeep, resetObject } from '../utils'\nimport { createSafeNotifier, isTrackableRef, snapshotValue } from './shared'\n\nexport function createSetupStyleStore(id: string, setupFactory: () => Record<string, any>, manager: any) {\n const result = setupFactory()\n let notify: (type: any) => void = () => {}\n const initialSnapshot = new Map<string, any>()\n Object.keys(result).forEach((k) => {\n const val = (result as any)[k]\n if (typeof val === 'function' || k.startsWith('$')) {\n return\n }\n if (isRef(val) && !isTrackableRef(val)) {\n return\n }\n initialSnapshot.set(k, snapshotValue(val))\n })\n\n let instance: Record<string, any> = {}\n const resetImpl = () => {\n initialSnapshot.forEach((snapValue, key) => {\n const current = (instance as any)[key]\n if (isTrackableRef(current)) {\n try {\n current.value = cloneDeep(snapValue)\n }\n catch {\n // computed / readonly ref 不能写入,reset 时跳过这类派生状态。\n }\n return\n }\n if (isReactive(current)) {\n resetObject(current as any, snapValue)\n return\n }\n if (isRef(current)) {\n return\n }\n ;(instance as any)[key] = cloneDeep(snapValue)\n })\n notify('patch object')\n }\n\n const base = createBaseApi<any>(id, undefined, t => notify(t), resetImpl)\n let isPatching = false\n const rawPatch = base.api.$patch\n base.api.$patch = (patch: Record<string, any> | ((state: any) => void)) => {\n isPatching = true\n try {\n rawPatch(patch)\n }\n finally {\n isPatching = false\n }\n }\n if (typeof base.api.$reset === 'function') {\n const rawReset = base.api.$reset\n base.api.$reset = () => {\n isPatching = true\n try {\n rawReset()\n }\n finally {\n isPatching = false\n }\n }\n }\n\n instance = { ...result }\n notify = createSafeNotifier(id, base.subs, () => instance)\n\n // 将 setup 返回值与基础 API 合并,同时保留每个 getter/setter 的描述符,避免覆写访问器行为\n for (const key of Object.getOwnPropertyNames(base.api)) {\n const d = Object.getOwnPropertyDescriptor(base.api, key)\n if (d) {\n if (key === '$state') {\n Object.defineProperty(instance, key, {\n enumerable: d.enumerable,\n configurable: d.configurable,\n get() {\n return (base.api as any).$state\n },\n set(v: any) {\n isPatching = true\n try {\n ;(base.api as any).$state = v\n }\n finally {\n isPatching = false\n }\n },\n })\n }\n else {\n Object.defineProperty(instance, key, d)\n }\n }\n }\n\n const directSources: any[] = []\n Object.keys(result).forEach((k) => {\n const val = (result as any)[k]\n if (typeof val === 'function' && !k.startsWith('$')) {\n ;(instance as any)[k] = wrapAction(instance, k, val, base.actionSubs)\n return\n }\n if (isTrackableRef(val)) {\n directSources.push(val)\n return\n }\n if (isReactive(val)) {\n directSources.push(val)\n return\n }\n if (isRef(val)) {\n return\n }\n if (!k.startsWith('$')) {\n let innerValue = val\n Object.defineProperty(instance, k, {\n enumerable: true,\n configurable: true,\n get() {\n return innerValue\n },\n set(next: any) {\n innerValue = next\n if (!isPatching) {\n notify('direct')\n }\n },\n })\n }\n })\n\n let dispatchingDirect = false\n if (directSources.length > 0) {\n let initialized = false\n effect(() => {\n directSources.forEach((source) => {\n if (isTrackableRef(source)) {\n void source.value\n }\n else {\n touchReactive(source)\n }\n })\n if (!initialized) {\n initialized = true\n return\n }\n if (isPatching || dispatchingDirect) {\n return\n }\n dispatchingDirect = true\n try {\n notify('direct')\n }\n finally {\n dispatchingDirect = false\n }\n })\n }\n\n const plugins = manager?._plugins ?? []\n for (const plugin of plugins) {\n try {\n plugin({ store: instance })\n }\n catch {}\n }\n\n return instance\n}\n"],"mappings":";;;;;;;;;;AAMA,SAAgB,sBAAsB,IAAY,cAAyC,SAAc;;CACvG,MAAM,SAAS,aAAa;CAC5B,IAAI,eAAoC,CAAC;CACzC,MAAM,kCAAkB,IAAI,IAAiB;CAC7C,OAAO,KAAK,MAAM,CAAC,CAAC,SAAS,MAAM;EACjC,MAAM,MAAO,OAAe;EAC5B,IAAI,OAAO,QAAQ,cAAc,EAAE,WAAW,GAAG,GAC/C;EAEF,IAAI,MAAM,GAAG,KAAK,CAAC,eAAe,GAAG,GACnC;EAEF,gBAAgB,IAAI,GAAG,cAAc,GAAG,CAAC;CAC3C,CAAC;CAED,IAAI,WAAgC,CAAC;CACrC,MAAM,kBAAkB;EACtB,gBAAgB,SAAS,WAAW,QAAQ;GAC1C,MAAM,UAAW,SAAiB;GAClC,IAAI,eAAe,OAAO,GAAG;IAC3B,IAAI;KACF,QAAQ,QAAQ,UAAU,SAAS;IACrC,kBACM,CAEN;IACA;GACF;GACA,IAAI,WAAW,OAAO,GAAG;IACvB,YAAY,SAAgB,SAAS;IACrC;GACF;GACA,IAAI,MAAM,OAAO,GACf;GAED,AAAC,SAAiB,OAAO,UAAU,SAAS;EAC/C,CAAC;EACD,OAAO,cAAc;CACvB;CAEA,MAAM,OAAO,cAAmB,IAAI,SAAW,MAAK,OAAO,CAAC,GAAG,SAAS;CACxE,IAAI,aAAa;CACjB,MAAM,WAAW,KAAK,IAAI;CAC1B,KAAK,IAAI,UAAU,UAAwD;EACzE,aAAa;EACb,IAAI;GACF,SAAS,KAAK;EAChB,UACQ;GACN,aAAa;EACf;CACF;CACA,IAAI,OAAO,KAAK,IAAI,WAAW,YAAY;EACzC,MAAM,WAAW,KAAK,IAAI;EAC1B,KAAK,IAAI,eAAe;GACtB,aAAa;GACb,IAAI;IACF,SAAS;GACX,UACQ;IACN,aAAa;GACf;EACF;CACF;CAEA,WAAW,EAAE,GAAG,OAAO;CACvB,SAAS,mBAAmB,IAAI,KAAK,YAAY,QAAQ;CAGzD,KAAK,MAAM,OAAO,OAAO,oBAAoB,KAAK,GAAG,GAAG;EACtD,MAAM,IAAI,OAAO,yBAAyB,KAAK,KAAK,GAAG;EACvD,IAAI,
|
|
1
|
+
{"version":3,"file":"setupStyle.mjs","names":[],"sources":["../../../../src/store/define/setupStyle.ts"],"sourcesContent":["import { effect, isReactive, isRef, touchReactive } from '../../reactivity'\nimport { wrapAction } from '../actions'\nimport { createBaseApi } from '../base'\nimport { cloneDeep, resetObject } from '../utils'\nimport { createSafeNotifier, isTrackableRef, snapshotValue } from './shared'\n\nexport function createSetupStyleStore(id: string, setupFactory: () => Record<string, any>, manager: any) {\n const result = setupFactory()\n let notify: (type: any) => void = () => {}\n const initialSnapshot = new Map<string, any>()\n Object.keys(result).forEach((k) => {\n const val = (result as any)[k]\n if (typeof val === 'function' || k.startsWith('$')) {\n return\n }\n if (isRef(val) && !isTrackableRef(val)) {\n return\n }\n initialSnapshot.set(k, snapshotValue(val))\n })\n\n let instance: Record<string, any> = {}\n const resetImpl = () => {\n initialSnapshot.forEach((snapValue, key) => {\n const current = (instance as any)[key]\n if (isTrackableRef(current)) {\n try {\n current.value = cloneDeep(snapValue)\n }\n catch {\n // computed / readonly ref 不能写入,reset 时跳过这类派生状态。\n }\n return\n }\n if (isReactive(current)) {\n resetObject(current as any, snapValue)\n return\n }\n if (isRef(current)) {\n return\n }\n ;(instance as any)[key] = cloneDeep(snapValue)\n })\n notify('patch object')\n }\n\n const base = createBaseApi<any>(id, undefined, t => notify(t), resetImpl)\n let isPatching = false\n const rawPatch = base.api.$patch\n base.api.$patch = (patch: Record<string, any> | ((state: any) => void)) => {\n isPatching = true\n try {\n rawPatch(patch)\n }\n finally {\n isPatching = false\n }\n }\n if (typeof base.api.$reset === 'function') {\n const rawReset = base.api.$reset\n base.api.$reset = () => {\n isPatching = true\n try {\n rawReset()\n }\n finally {\n isPatching = false\n }\n }\n }\n\n instance = { ...result }\n notify = createSafeNotifier(id, base.subs, () => instance)\n\n // 将 setup 返回值与基础 API 合并,同时保留每个 getter/setter 的描述符,避免覆写访问器行为\n for (const key of Object.getOwnPropertyNames(base.api)) {\n const d = Object.getOwnPropertyDescriptor(base.api, key)\n if (d) {\n if (key === '$state') {\n Object.defineProperty(instance, key, {\n enumerable: d.enumerable,\n configurable: d.configurable,\n get() {\n return (base.api as any).$state\n },\n set(v: any) {\n isPatching = true\n try {\n ;(base.api as any).$state = v\n }\n finally {\n isPatching = false\n }\n },\n })\n }\n else {\n Object.defineProperty(instance, key, d)\n }\n }\n }\n\n const directSources: any[] = []\n Object.keys(result).forEach((k) => {\n const val = (result as any)[k]\n if (typeof val === 'function' && !k.startsWith('$')) {\n ;(instance as any)[k] = wrapAction(instance, k, val, base.actionSubs)\n return\n }\n if (isTrackableRef(val)) {\n directSources.push(val)\n return\n }\n if (isReactive(val)) {\n directSources.push(val)\n return\n }\n if (isRef(val)) {\n return\n }\n if (!k.startsWith('$')) {\n let innerValue = val\n Object.defineProperty(instance, k, {\n enumerable: true,\n configurable: true,\n get() {\n return innerValue\n },\n set(next: any) {\n innerValue = next\n if (!isPatching) {\n notify('direct')\n }\n },\n })\n }\n })\n\n let dispatchingDirect = false\n if (directSources.length > 0) {\n let initialized = false\n effect(() => {\n directSources.forEach((source) => {\n if (isTrackableRef(source)) {\n void source.value\n }\n else {\n touchReactive(source)\n }\n })\n if (!initialized) {\n initialized = true\n return\n }\n if (isPatching || dispatchingDirect) {\n return\n }\n dispatchingDirect = true\n try {\n notify('direct')\n }\n finally {\n dispatchingDirect = false\n }\n })\n }\n\n const plugins = manager?._plugins ?? []\n for (const plugin of plugins) {\n try {\n plugin({ store: instance })\n }\n catch {}\n }\n\n return instance\n}\n"],"mappings":"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"}
|
package/dist/package.mjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
var e=`6.19.
|
|
1
|
+
var e=`6.19.2`;export{e as version};
|
package/dist/reactivity/core.mjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{queueJob as e}from"../scheduler.mjs";import t from"../_virtual/_@oxc-project_runtime@0.
|
|
1
|
+
import{queueJob as e}from"../scheduler.mjs";import t from"../_virtual/_@oxc-project_runtime@0.143.0/helpers/esm/defineProperty.mjs";const n=new WeakMap;let r=null;const i=[];let a=0;const o=new Set;function s(){a++}function c(){for(;o.size;){let e=[...o];o.clear();for(let t of e)t()}}function l(){a!==0&&(a--,a===0&&c())}function u(e){s();try{return e()}finally{l()}}function d(e){let{deps:t}=e;for(let n=0;n<t.length;n++)t[n].delete(e);t.length=0}function f(e){var t;e.active&&(e.active=!1,d(e),(t=e.onStop)==null||t.call(e))}let p;var m=class{constructor(e=!1){if(this.detached=e,t(this,`active`,!0),t(this,`effects`,[]),t(this,`cleanups`,[]),t(this,`parent`,void 0),t(this,`scopes`,void 0),!e&&p){var n;this.parent=p,((n=p).scopes||(n.scopes=[])).push(this)}}run(e){if(!this.active)return;let t=p;p=this;try{return e()}finally{p=t}}stop(){var e;if(this.active){this.active=!1;for(let e of this.effects)f(e);this.effects.length=0;for(let e of this.cleanups)e();if(this.cleanups.length=0,this.scopes){for(let e of this.scopes)e.stop();this.scopes.length=0}if((e=this.parent)!=null&&e.scopes){let e=this.parent.scopes.indexOf(this);e>=0&&this.parent.scopes.splice(e,1)}this.parent=void 0}}};function h(e=!1){return new m(e)}function g(){return p}function _(e){p!=null&&p.active&&p.cleanups.push(e)}function v(e){p!=null&&p.active&&p.effects.push(e)}function y(e,t={}){let n=function(){if(!n.active||n._running)return e();d(n);try{return n._running=!0,i.push(n),r=n,e()}finally{var t;i.pop(),r=(t=i[i.length-1])==null?null:t,n._running=!1}};return n.deps=[],n.scheduler=t.scheduler,n.onStop=t.onStop,n.active=!0,n._running=!1,n._fn=e,n}function b(e,t={}){let n=y(e,t);return v(n),t.lazy||n(),n}function x(e,t){if(!r)return;let i=n.get(e);i||(i=new Map,n.set(e,i));let a=i.get(t);a||(a=new Set,i.set(t,a)),a.has(r)||(a.add(r),r.deps.push(a))}function S(e){if(e.scheduler){e.scheduler();return}if(a>0){o.add(e);return}e()}function C(e,t){let i=n.get(e);if(!i)return;let a=i.get(t);if(!a)return;let o=new Set;a.forEach(e=>{e!==r&&o.add(e)}),o.forEach(S)}function w(e){r&&(e.has(r)||(e.add(r),r.deps.push(e)))}function T(e){new Set(e).forEach(S)}export{u as batch,y as createReactiveEffect,b as effect,h as effectScope,l as endBatch,g as getCurrentScope,_ as onScopeDispose,e as queueJob,s as startBatch,f as stop,x as track,w as trackEffects,C as trigger,T as triggerEffects};
|
package/dist/reactivity/ref.mjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import e from"../_virtual/_@oxc-project_runtime@0.
|
|
1
|
+
import e from"../_virtual/_@oxc-project_runtime@0.143.0/helpers/esm/defineProperty.mjs";import{trackEffects as t,triggerEffects as n}from"./core.mjs";import{convertToReactive as r,markRaw as i}from"./reactive.mjs";const a=`__v_isRef`;function o(e){try{Object.defineProperty(e,a,{value:!0,configurable:!0})}catch(t){e[a]=!0}return e}function s(e){return!!(e&&typeof e==`object`&&e.__v_isRef===!0)}var c=class{constructor(t){e(this,`_value`,void 0),e(this,`_rawValue`,void 0),e(this,`dep`,void 0),o(this),this._rawValue=t,this._value=r(t)}get value(){return this.dep||(this.dep=new Set),t(this.dep),this._value}set value(e){Object.is(e,this._rawValue)||(this._rawValue=e,this._value=r(e),this.dep&&n(this.dep))}};function l(e){return s(e)?e:i(new c(e))}function u(e){return s(e)?e.value:e}function d(e){return typeof e==`function`?e():u(e)}var f=class{constructor(r,i){e(this,`_getValue`,void 0),e(this,`_setValue`,void 0),e(this,`dep`,void 0),o(this);let a=i,s=()=>{this.dep||(this.dep=new Set),t(this.dep)},c=()=>{this.dep&&n(this.dep)},l=e=>e===void 0&&a!==void 0?a:e;if(typeof r==`function`){let e=r(s,c);this._getValue=()=>l(e.get()),this._setValue=t=>e.set(t);return}let u=r;this._getValue=()=>(s(),l(u.get())),this._setValue=e=>{u.set(e),c()}}get value(){return this._getValue()}set value(e){this._setValue(e)}};function p(e,t){return i(new f(e,t))}export{a as RefFlag,p as customRef,s as isRef,o as markAsRef,l as ref,d as toValue,u as unref};
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "wevu",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "6.19.
|
|
4
|
+
"version": "6.19.2",
|
|
5
5
|
"description": "Vue 3 风格的小程序运行时,包含响应式、diff+setData 与轻量状态管理",
|
|
6
6
|
"author": "ice breaker <1324318532@qq.com>",
|
|
7
7
|
"license": "MIT",
|
|
@@ -225,12 +225,12 @@
|
|
|
225
225
|
"miniprogram-api-typings": "^5.0.0"
|
|
226
226
|
},
|
|
227
227
|
"dependencies": {
|
|
228
|
-
"vue": "^3.5.
|
|
229
|
-
"@weapp-core/constants": "0.1.
|
|
228
|
+
"vue": "^3.5.41",
|
|
229
|
+
"@weapp-core/constants": "0.1.16",
|
|
230
230
|
"@weapp-core/shared": "3.1.0",
|
|
231
231
|
"@wevu/api": "0.2.14",
|
|
232
|
-
"@wevu/compiler": "6.19.
|
|
233
|
-
"@wevu/web-apis": "1.2.
|
|
232
|
+
"@wevu/compiler": "6.19.2",
|
|
233
|
+
"@wevu/web-apis": "1.2.31"
|
|
234
234
|
},
|
|
235
235
|
"scripts": {
|
|
236
236
|
"dev": "tsdown -w",
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|