@weapp-vite/miniprogram-automator 0.0.0 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.mts +1 -2
- package/dist/index.mjs +1 -3
- package/dist/launch-IFPMxQYb.mjs +0 -2
- package/package.json +3 -4
- package/dist/chunk-CKQMccvm.cjs +0 -28
- package/dist/index.cjs +0 -5443
- package/dist/index.cjs.map +0 -1
- package/dist/index.d.cts +0 -305
- package/dist/index.mjs.map +0 -1
- package/dist/launch-Byc8UeaF.cjs +0 -6425
- package/dist/launch-Byc8UeaF.cjs.map +0 -1
- package/dist/launch-IFPMxQYb.mjs.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"launch-IFPMxQYb.mjs","names":["bindFunction","resolveInitialData","bindFunction","cloneObject","cloneValue","parseDataPath","isArrayIndexSegment","createContainerByNextSegment","assignByPath","resolveInitialData","normalizeRoute","CharCodes","isTag","Text","Comment","CDATA","cloneNode","isTagRaw","LEADING_SLASH_RE","TEMPLATE_INTERPOLATION_RE","DATASET_NAME_RE","toDatasetKey","collectDataset","escapeText","escapeAttribute","resolveValueByPath","interpolateTemplate","serializeDomNode","cloneValue","LEADING_SLASH_RE","TRAILING_SLASH_RE","readJsonObject","DATA_ATTR_SELECTOR_RE","DATASET_NAME_RE","escapeText","toDatasetKey","collectDataset","escapeAttribute","resolvePageScopeId","LEADING_SLASH_RE","LEADING_SLASH_RE","DEFAULT_WAIT_TIMEOUT","DEFAULT_WAIT_INTERVAL"],"sources":["../../../mpcore/packages/simulator/src/runtime/appInstance.ts","../../../mpcore/packages/simulator/src/runtime/componentInstance.ts","../../../mpcore/packages/simulator/src/project/pageConfig.ts","../../../mpcore/packages/simulator/src/runtime/pageInstance.ts","../../../node_modules/.pnpm/entities@8.0.0/node_modules/entities/dist/decode-codepoint.js","../../../node_modules/.pnpm/entities@8.0.0/node_modules/entities/dist/internal/decode-shared.js","../../../node_modules/.pnpm/entities@8.0.0/node_modules/entities/dist/generated/decode-data-html.js","../../../node_modules/.pnpm/entities@8.0.0/node_modules/entities/dist/generated/decode-data-xml.js","../../../node_modules/.pnpm/entities@8.0.0/node_modules/entities/dist/internal/bin-trie-flags.js","../../../node_modules/.pnpm/entities@8.0.0/node_modules/entities/dist/decode.js","../../../node_modules/.pnpm/htmlparser2@12.0.0/node_modules/htmlparser2/dist/Tokenizer.js","../../../node_modules/.pnpm/htmlparser2@12.0.0/node_modules/htmlparser2/dist/Parser.js","../../../node_modules/.pnpm/domelementtype@3.0.0/node_modules/domelementtype/dist/index.js","../../../node_modules/.pnpm/domhandler@6.0.1/node_modules/domhandler/dist/node.js","../../../node_modules/.pnpm/domhandler@6.0.1/node_modules/domhandler/dist/index.js","../../../node_modules/.pnpm/htmlparser2@12.0.0/node_modules/htmlparser2/dist/index.js","../../../mpcore/packages/simulator/src/runtime/render.ts","../../../mpcore/packages/simulator/src/host/globals.ts","../../../mpcore/packages/simulator/src/host/wx.ts","../../../mpcore/packages/simulator/src/project/resolveRoutes.ts","../../../mpcore/packages/simulator/src/project/createProjectDescriptor.ts","../../../node_modules/.pnpm/pathe@2.0.3/node_modules/pathe/dist/shared/pathe.M-eThtNZ.mjs","../../../mpcore/packages/simulator/src/project/loadProject.ts","../../../mpcore/packages/simulator/src/view/selectors.ts","../../../mpcore/packages/simulator/src/view/nodeHandle.ts","../../../mpcore/packages/simulator/src/view/render.ts","../../../mpcore/packages/simulator/src/view/selectorQuery.ts","../../../mpcore/packages/simulator/src/runtime/moduleLoader.ts","../../../mpcore/packages/simulator/src/runtime/systemInfo.ts","../../../mpcore/packages/simulator/src/runtime/wxState.ts","../../../mpcore/packages/simulator/src/runtime/session.ts","../../../mpcore/packages/simulator/src/testing/pageHandle.ts","../../../mpcore/packages/simulator/src/testing/sessionHandle.ts","../../../mpcore/packages/simulator/src/testing/launch.ts"],"sourcesContent":["import type { HeadlessAppDefinition } from '../host'\n\nexport interface HeadlessAppInstance extends Record<string, any> {\n globalData: Record<string, any>\n}\n\nfunction bindFunction(target: Record<string, any>, key: string, value: unknown) {\n if (typeof value !== 'function') {\n target[key] = value\n return\n }\n target[key] = (...args: any[]) => value.apply(target, args)\n}\n\nfunction resolveInitialData(definition: HeadlessAppDefinition) {\n const rawData = definition.globalData ?? definition.data\n if (typeof rawData === 'function') {\n const next = rawData.call(definition)\n return next && typeof next === 'object' && !Array.isArray(next)\n ? { ...next }\n : {}\n }\n return rawData && typeof rawData === 'object' && !Array.isArray(rawData)\n ? { ...rawData }\n : {}\n}\n\nexport function createAppInstance(definition: HeadlessAppDefinition): HeadlessAppInstance {\n const instance: HeadlessAppInstance = {\n globalData: resolveInitialData(definition),\n }\n\n for (const [key, value] of Object.entries(definition)) {\n if (key === 'data') {\n continue\n }\n bindFunction(instance, key, value)\n }\n\n return instance\n}\n","import type { HeadlessBehaviorDefinition, HeadlessComponentDefinition } from '../host'\n\nexport interface HeadlessComponentInstance extends Record<string, any> {\n __definition__?: HeadlessComponentDefinition\n __lastInteractionEvent__?: Record<string, any>\n __propertySnapshots__?: Record<string, any>\n __ready__?: boolean\n data: Record<string, any>\n properties: Record<string, any>\n selectAllComponents?: (selector: string) => any[]\n selectComponent?: (selector: string) => any\n selectOwnerComponent?: () => any\n setData: (patch: Record<string, any>, callback?: () => void) => void\n triggerEvent: (eventName: string, detail?: unknown, options?: Record<string, any>) => void\n}\n\nfunction bindFunction(target: Record<string, any>, key: string, value: unknown) {\n if (typeof value !== 'function') {\n target[key] = value\n return\n }\n target[key] = (...args: any[]) => value.apply(target, args)\n}\n\nfunction cloneObject<T extends Record<string, any>>(value: T) {\n return JSON.parse(JSON.stringify(value))\n}\n\nfunction cloneValue<T>(value: T) {\n if (Array.isArray(value)) {\n return JSON.parse(JSON.stringify(value)) as T\n }\n if (value && typeof value === 'object') {\n return cloneObject(value as Record<string, any>) as T\n }\n return value\n}\n\nexport { cloneValue }\n\nfunction parseDataPath(path: string) {\n return path\n .replace(/\\[(\\d+)\\]/g, '.$1')\n .split('.')\n .map(segment => segment.trim())\n .filter(Boolean)\n}\n\nfunction isArrayIndexSegment(segment: string) {\n return /^\\d+$/.test(segment)\n}\n\nfunction createContainerByNextSegment(nextSegment?: string) {\n return isArrayIndexSegment(nextSegment ?? '') ? [] : {}\n}\n\nfunction assignByPath(target: Record<string, any>, path: string, value: unknown) {\n const segments = parseDataPath(path)\n if (segments.length === 0) {\n return\n }\n\n let current: any = target\n for (let index = 0; index < segments.length - 1; index += 1) {\n const segment = segments[index]!\n const nextSegment = segments[index + 1]\n const normalizedSegment = isArrayIndexSegment(segment) ? Number(segment) : segment\n const next = current?.[normalizedSegment]\n if (!next || typeof next !== 'object') {\n current[normalizedSegment] = createContainerByNextSegment(nextSegment)\n }\n current = current[normalizedSegment]\n }\n\n const leafSegment = segments[segments.length - 1]!\n const normalizedLeafSegment = isArrayIndexSegment(leafSegment) ? Number(leafSegment) : leafSegment\n current[normalizedLeafSegment] = value\n}\n\nfunction resolveInitialData(definition: HeadlessComponentDefinition) {\n const rawData = definition.data\n if (typeof rawData === 'function') {\n const next = rawData.call(definition)\n return next && typeof next === 'object' && !Array.isArray(next)\n ? cloneObject(next)\n : {}\n }\n return rawData && typeof rawData === 'object' && !Array.isArray(rawData)\n ? cloneObject(rawData)\n : {}\n}\n\nfunction isBehaviorDefinition(value: unknown): value is HeadlessBehaviorDefinition {\n return !!value && typeof value === 'object' && !Array.isArray(value) && (value as HeadlessBehaviorDefinition).__isHeadlessBehavior__ === true\n}\n\nfunction flattenBehaviors(definition: HeadlessComponentDefinition) {\n const flattened: HeadlessBehaviorDefinition[] = []\n const queue = Array.isArray(definition.behaviors) ? definition.behaviors : []\n for (const item of queue) {\n if (!isBehaviorDefinition(item)) {\n continue\n }\n flattened.push(...flattenBehaviors(item as HeadlessComponentDefinition))\n flattened.push(item)\n }\n return flattened\n}\n\nfunction mergeRecord(...records: Array<Record<string, any> | undefined>) {\n return Object.assign({}, ...records.filter(Boolean))\n}\n\nfunction normalizeComponentDefinition(definition: HeadlessComponentDefinition): HeadlessComponentDefinition {\n const behaviors = flattenBehaviors(definition)\n if (behaviors.length === 0) {\n return definition\n }\n\n const mergedDataEntries = behaviors\n .map(item => item.data)\n .filter(Boolean)\n\n const mergedDefinition: HeadlessComponentDefinition = {\n ...mergeRecord(...behaviors, definition),\n methods: mergeRecord(...behaviors.map(item => item.methods), definition.methods),\n observers: mergeRecord(...behaviors.map(item => item.observers), definition.observers),\n pageLifetimes: mergeRecord(...behaviors.map(item => item.pageLifetimes), definition.pageLifetimes),\n properties: mergeRecord(...behaviors.map(item => item.properties), definition.properties),\n lifetimes: mergeRecord(...behaviors.map(item => item.lifetimes), definition.lifetimes),\n }\n\n if (mergedDataEntries.length > 0 || definition.data) {\n mergedDefinition.data = function mergedComponentData(this: unknown) {\n const merged = mergeRecord(\n ...mergedDataEntries.map((entry) => {\n if (typeof entry === 'function') {\n return entry.call(this)\n }\n return entry\n }),\n )\n const ownData = typeof definition.data === 'function'\n ? definition.data.call(this)\n : definition.data\n return mergeRecord(merged, ownData)\n }\n }\n\n return mergedDefinition\n}\n\nfunction normalizePropertyType(option: unknown) {\n if (option === null) {\n return null\n }\n if (option === String || option === Number || option === Boolean || option === Array || option === Object) {\n return option\n }\n if (!option || typeof option !== 'object' || Array.isArray(option)) {\n return undefined\n }\n return (option as { type?: unknown }).type\n}\n\nfunction resolvePropertyTypeCandidates(option: unknown) {\n const candidates: unknown[] = []\n const primaryType = normalizePropertyType(option)\n if (primaryType) {\n candidates.push(primaryType)\n }\n\n if (option && typeof option === 'object' && !Array.isArray(option)) {\n const optionalTypes = (option as { optionalTypes?: unknown[] }).optionalTypes\n if (Array.isArray(optionalTypes)) {\n candidates.push(...optionalTypes)\n }\n }\n\n return candidates\n}\n\nfunction resolveDefaultValueByType(type: unknown) {\n if (type === Number) {\n return 0\n }\n if (type === Boolean) {\n return false\n }\n if (type === String) {\n return ''\n }\n if (type === Array) {\n return []\n }\n if (type === Object) {\n return {}\n }\n if (type === null) {\n return null\n }\n return undefined\n}\n\nfunction matchesRuntimeType(rawValue: unknown, type: unknown) {\n if (type === null) {\n return true\n }\n if (type === Number) {\n return typeof rawValue === 'number'\n }\n if (type === Boolean) {\n return typeof rawValue === 'boolean'\n }\n if (type === String) {\n return typeof rawValue === 'string'\n }\n if (type === Array) {\n return Array.isArray(rawValue)\n }\n if (type === Object) {\n return !!rawValue && typeof rawValue === 'object' && !Array.isArray(rawValue)\n }\n return false\n}\n\nexport function coerceComponentPropertyValue(rawValue: unknown, option: unknown) {\n const candidates = resolvePropertyTypeCandidates(option)\n const primaryType = candidates[0]\n if (primaryType && matchesRuntimeType(rawValue, primaryType)) {\n return rawValue\n }\n\n const fallbackCandidates = primaryType ? candidates.slice(1) : candidates\n for (const type of fallbackCandidates) {\n if (type === Number) {\n const nextValue = typeof rawValue === 'number' ? rawValue : Number(rawValue)\n if (!Number.isNaN(nextValue)) {\n return nextValue\n }\n continue\n }\n if (type === Boolean) {\n if (typeof rawValue === 'boolean') {\n return rawValue\n }\n if (rawValue === '' || rawValue === 'true') {\n return true\n }\n if (rawValue === 'false') {\n return false\n }\n continue\n }\n if (type === String) {\n return rawValue == null ? '' : String(rawValue)\n }\n if (type === Array && Array.isArray(rawValue)) {\n return rawValue\n }\n if (type === Object && rawValue && typeof rawValue === 'object' && !Array.isArray(rawValue)) {\n return rawValue\n }\n if (type === null) {\n return rawValue\n }\n }\n\n if (primaryType === Number) {\n const nextValue = typeof rawValue === 'number' ? rawValue : Number(rawValue)\n return Number.isNaN(nextValue) ? rawValue : nextValue\n }\n if (primaryType === Boolean) {\n if (typeof rawValue === 'boolean') {\n return rawValue\n }\n if (rawValue === '' || rawValue === 'true') {\n return true\n }\n if (rawValue === 'false') {\n return false\n }\n return Boolean(rawValue)\n }\n if (primaryType === String) {\n return rawValue == null ? '' : String(rawValue)\n }\n return rawValue\n}\n\nfunction resolveInitialProperties(\n definition: HeadlessComponentDefinition,\n properties: Record<string, any>,\n) {\n const resolved: Record<string, any> = {}\n const propOptions = definition.properties\n if (propOptions && typeof propOptions === 'object' && !Array.isArray(propOptions)) {\n for (const [key, option] of Object.entries(propOptions)) {\n if (Object.prototype.hasOwnProperty.call(properties, key)) {\n resolved[key] = coerceComponentPropertyValue(properties[key], option)\n continue\n }\n\n if (option && typeof option === 'object' && !Array.isArray(option) && 'value' in option) {\n const rawDefaultValue = typeof option.value === 'function'\n ? option.value.call(definition)\n : option.value\n resolved[key] = cloneValue(rawDefaultValue)\n }\n else {\n resolved[key] = cloneValue(resolveDefaultValueByType(normalizePropertyType(option)))\n }\n }\n }\n\n for (const [key, value] of Object.entries(properties)) {\n if (!(key in resolved)) {\n resolved[key] = value\n }\n }\n\n return resolved\n}\n\nfunction resolvePropertyDefaultValue(option: unknown) {\n if (!option || typeof option !== 'object' || Array.isArray(option) || !('value' in option)) {\n return undefined\n }\n return cloneValue((option as { value?: unknown }).value)\n}\n\nfunction runPropertyObservers(\n definition: HeadlessComponentDefinition,\n instance: HeadlessComponentInstance,\n changedKeys: string[],\n previousProperties: Record<string, any>,\n) {\n const propOptions = definition.properties\n if (!propOptions || typeof propOptions !== 'object' || Array.isArray(propOptions)) {\n return\n }\n\n for (const changedKey of changedKeys) {\n const option = propOptions[changedKey]\n if (!option || typeof option !== 'object' || Array.isArray(option)) {\n continue\n }\n const observer = option.observer\n if (typeof observer !== 'function') {\n continue\n }\n observer.call(instance, instance.properties[changedKey], previousProperties[changedKey])\n }\n}\n\nfunction normalizeObserverPattern(pattern: string) {\n return pattern.split(',').map(item => item.trim()).filter(Boolean)\n}\n\nfunction resolveObservedValue(instance: HeadlessComponentInstance, pattern: string) {\n if (pattern === '**') {\n return {\n ...instance.properties,\n ...instance.data,\n }\n }\n\n const segments = parseDataPath(pattern)\n if (segments.length === 0) {\n return undefined\n }\n\n const [rootSegment, ...restSegments] = segments\n const rootSource = Object.prototype.hasOwnProperty.call(instance.properties, rootSegment)\n ? instance.properties\n : instance.data\n\n let current: any = rootSource?.[rootSegment]\n for (const segment of restSegments) {\n const normalizedSegment = isArrayIndexSegment(segment) ? Number(segment) : segment\n current = current?.[normalizedSegment]\n }\n return current\n}\n\nfunction matchObserverPattern(pattern: string, changedKeys: string[]) {\n if (pattern === '**') {\n return changedKeys.length > 0\n }\n\n const patterns = normalizeObserverPattern(pattern)\n return changedKeys.some((changedKey) => {\n return patterns.some((item) => {\n if (item === '**') {\n return true\n }\n if (changedKey === item) {\n return true\n }\n return changedKey.startsWith(`${item}.`) || changedKey.startsWith(`${item}[`)\n })\n })\n}\n\nexport interface CreateComponentInstanceOptions {\n definition: HeadlessComponentDefinition\n properties?: Record<string, any>\n triggerEvent?: (\n instance: HeadlessComponentInstance,\n eventName: string,\n detail?: unknown,\n options?: Record<string, any>,\n ) => void\n}\n\nexport function runComponentObservers(\n definition: HeadlessComponentDefinition,\n instance: HeadlessComponentInstance,\n changedKeys: string[],\n previousProperties: Record<string, any> = {},\n) {\n if (changedKeys.length === 0) {\n return\n }\n\n runPropertyObservers(definition, instance, changedKeys, previousProperties)\n\n const observers = definition.observers\n if (observers && typeof observers === 'object' && !Array.isArray(observers)) {\n for (const [pattern, handler] of Object.entries(observers)) {\n if (typeof handler !== 'function' || !matchObserverPattern(pattern, changedKeys)) {\n continue\n }\n const args = normalizeObserverPattern(pattern).map(item => resolveObservedValue(instance, item))\n handler.call(instance, ...args)\n }\n }\n}\n\nexport function normalizeComponentPropertyValue(\n definition: HeadlessComponentDefinition,\n key: string,\n rawValue: unknown,\n) {\n const option = definition.properties?.[key]\n if (rawValue == null) {\n return resolvePropertyDefaultValue(option)\n }\n return coerceComponentPropertyValue(rawValue, option)\n}\n\nexport function createComponentInstance(options: CreateComponentInstanceOptions): HeadlessComponentInstance {\n const definition = normalizeComponentDefinition(options.definition)\n const instance: HeadlessComponentInstance = {\n __definition__: definition,\n data: resolveInitialData(definition),\n __propertySnapshots__: {},\n properties: resolveInitialProperties(definition, options.properties ?? {}),\n setData(patch, callback) {\n const changedKeys = Object.keys(patch)\n for (const [key, value] of Object.entries(patch)) {\n assignByPath(instance.data, key, value)\n }\n\n runComponentObservers(definition, instance, changedKeys)\n\n callback?.()\n },\n triggerEvent(eventName, detail, triggerOptions) {\n options.triggerEvent?.(instance, eventName, detail, triggerOptions)\n },\n }\n\n for (const [key, value] of Object.entries(definition)) {\n if (key === 'data' || key === 'methods' || key === 'properties' || key === 'observers' || key === 'lifetimes') {\n continue\n }\n bindFunction(instance, key, value)\n }\n\n for (const [key, value] of Object.entries(definition.methods ?? {})) {\n bindFunction(instance, key, value)\n }\n\n return instance\n}\n\nexport function runComponentLifecycle(\n instance: HeadlessComponentInstance,\n lifecycleName: 'attached' | 'created' | 'detached' | 'ready',\n) {\n const definition = instance.__definition__\n const fromLifetimes = definition?.lifetimes?.[lifecycleName]\n if (typeof fromLifetimes === 'function') {\n fromLifetimes.call(instance)\n return\n }\n const topLevel = definition?.[lifecycleName]\n if (typeof topLevel === 'function') {\n topLevel.call(instance)\n }\n}\n\nexport function runComponentPageLifetime(\n instance: HeadlessComponentInstance,\n lifetimeName: 'hide' | 'resize' | 'show',\n payload?: unknown,\n) {\n const pageLifetimes = instance.__definition__?.pageLifetimes\n const handler = pageLifetimes?.[lifetimeName]\n if (typeof handler !== 'function') {\n return\n }\n handler.call(instance, payload)\n}\n","export interface HeadlessNavigationBarSnapshot {\n animation: {\n duration?: number\n timingFunction?: string\n } | null\n backgroundColor: string\n frontColor: string\n loading: boolean\n title: string\n}\n\nexport type HeadlessBackgroundTextStyle = 'dark' | 'light'\n\nexport interface HeadlessBackgroundSnapshot {\n backgroundColor: string\n backgroundColorBottom: string\n backgroundColorTop: string\n textStyle: HeadlessBackgroundTextStyle\n}\n\nconst DEFAULT_NAVIGATION_BAR_BACKGROUND_COLOR = '#ffffff'\nconst DEFAULT_NAVIGATION_BAR_FRONT_COLOR = '#000000'\nconst DEFAULT_NAVIGATION_BAR_FRONT_COLOR_WHITE = '#ffffff'\nconst DEFAULT_BACKGROUND_TEXT_STYLE: HeadlessBackgroundTextStyle = 'dark'\nconst DEFAULT_BACKGROUND_COLOR = '#ffffff'\n\nfunction resolveNavigationBarTitle(\n appConfig: Record<string, any>,\n pageConfig?: Record<string, any>,\n) {\n if (typeof pageConfig?.navigationBarTitleText === 'string') {\n return pageConfig.navigationBarTitleText\n }\n if (typeof appConfig.window?.navigationBarTitleText === 'string') {\n return appConfig.window.navigationBarTitleText\n }\n return ''\n}\n\nfunction resolveNavigationBarBackgroundColor(\n appConfig: Record<string, any>,\n pageConfig?: Record<string, any>,\n) {\n if (typeof pageConfig?.navigationBarBackgroundColor === 'string') {\n return pageConfig.navigationBarBackgroundColor\n }\n if (typeof appConfig.window?.navigationBarBackgroundColor === 'string') {\n return appConfig.window.navigationBarBackgroundColor\n }\n return DEFAULT_NAVIGATION_BAR_BACKGROUND_COLOR\n}\n\nfunction resolveNavigationBarFrontColor(\n appConfig: Record<string, any>,\n pageConfig?: Record<string, any>,\n) {\n const textStyle = typeof pageConfig?.navigationBarTextStyle === 'string'\n ? pageConfig.navigationBarTextStyle\n : typeof appConfig.window?.navigationBarTextStyle === 'string'\n ? appConfig.window.navigationBarTextStyle\n : undefined\n\n if (textStyle === 'white') {\n return DEFAULT_NAVIGATION_BAR_FRONT_COLOR_WHITE\n }\n\n return DEFAULT_NAVIGATION_BAR_FRONT_COLOR\n}\n\nexport function cloneNavigationBarSnapshot(snapshot: HeadlessNavigationBarSnapshot) {\n return {\n animation: snapshot.animation\n ? { ...snapshot.animation }\n : null,\n backgroundColor: snapshot.backgroundColor,\n frontColor: snapshot.frontColor,\n loading: snapshot.loading,\n title: snapshot.title,\n }\n}\n\nexport function resolveNavigationBarSnapshot(\n appConfig: Record<string, any>,\n pageConfig?: Record<string, any>,\n): HeadlessNavigationBarSnapshot {\n return {\n animation: null,\n backgroundColor: resolveNavigationBarBackgroundColor(appConfig, pageConfig),\n frontColor: resolveNavigationBarFrontColor(appConfig, pageConfig),\n loading: false,\n title: resolveNavigationBarTitle(appConfig, pageConfig),\n }\n}\n\nexport function resolveBackgroundTextStyle(\n appConfig: Record<string, any>,\n pageConfig?: Record<string, any>,\n): HeadlessBackgroundTextStyle {\n const textStyle = typeof pageConfig?.backgroundTextStyle === 'string'\n ? pageConfig.backgroundTextStyle\n : typeof appConfig.window?.backgroundTextStyle === 'string'\n ? appConfig.window.backgroundTextStyle\n : undefined\n\n return textStyle === 'light' ? 'light' : DEFAULT_BACKGROUND_TEXT_STYLE\n}\n\nfunction resolveBackgroundColorValue(\n appConfig: Record<string, any>,\n pageConfig: Record<string, any> | undefined,\n key: 'backgroundColor' | 'backgroundColorTop' | 'backgroundColorBottom',\n) {\n if (typeof pageConfig?.[key] === 'string') {\n return pageConfig[key]\n }\n if (typeof appConfig.window?.[key] === 'string') {\n return appConfig.window[key]\n }\n return DEFAULT_BACKGROUND_COLOR\n}\n\nexport function cloneBackgroundSnapshot(snapshot: HeadlessBackgroundSnapshot) {\n return {\n backgroundColor: snapshot.backgroundColor,\n backgroundColorBottom: snapshot.backgroundColorBottom,\n backgroundColorTop: snapshot.backgroundColorTop,\n textStyle: snapshot.textStyle,\n }\n}\n\nexport function resolveBackgroundSnapshot(\n appConfig: Record<string, any>,\n pageConfig?: Record<string, any>,\n): HeadlessBackgroundSnapshot {\n return {\n backgroundColor: resolveBackgroundColorValue(appConfig, pageConfig, 'backgroundColor'),\n backgroundColorBottom: resolveBackgroundColorValue(appConfig, pageConfig, 'backgroundColorBottom'),\n backgroundColorTop: resolveBackgroundColorValue(appConfig, pageConfig, 'backgroundColorTop'),\n textStyle: resolveBackgroundTextStyle(appConfig, pageConfig),\n }\n}\n\nexport { resolveNavigationBarTitle }\n","import type { HeadlessPageDefinition } from '../host'\nimport type { HeadlessBackgroundSnapshot, HeadlessBackgroundTextStyle, HeadlessNavigationBarSnapshot } from '../project/pageConfig'\nimport { cloneBackgroundSnapshot, cloneNavigationBarSnapshot } from '../project/pageConfig'\n\nconst ARRAY_INDEX_PATH_RE = /\\[(\\d+)\\]/g\nconst ARRAY_INDEX_SEGMENT_RE = /^\\d+$/\nconst LEADING_ROUTE_SLASH_RE = /^\\/+/\n\nexport interface HeadlessPageInstance extends Record<string, any> {\n __background__?: HeadlessBackgroundSnapshot\n __backgroundTextStyle__?: HeadlessBackgroundTextStyle\n __lastChangedKeys__?: string[]\n __navigationBar__?: HeadlessNavigationBarSnapshot\n __navigationBarTitle__?: string\n __route__: string\n __scrollTop__?: number\n data: Record<string, any>\n options: Record<string, string>\n route: string\n selectAllComponents?: (selector: string) => any[]\n selectComponent?: (selector: string) => any\n setData: (patch: Record<string, any>, callback?: () => void) => void\n}\n\nfunction bindFunction(target: Record<string, any>, key: string, value: unknown) {\n if (typeof value !== 'function') {\n target[key] = value\n return\n }\n target[key] = (...args: any[]) => value.apply(target, args)\n}\n\nfunction cloneObject(value: Record<string, any>) {\n return JSON.parse(JSON.stringify(value))\n}\n\nfunction resolveInitialData(definition: HeadlessPageDefinition) {\n const rawData = definition.data\n if (typeof rawData === 'function') {\n const next = rawData.call(definition)\n return next && typeof next === 'object' && !Array.isArray(next)\n ? cloneObject(next)\n : {}\n }\n return rawData && typeof rawData === 'object' && !Array.isArray(rawData)\n ? cloneObject(rawData)\n : {}\n}\n\nfunction parseDataPath(path: string) {\n return path\n .replace(ARRAY_INDEX_PATH_RE, '.$1')\n .split('.')\n .map(segment => segment.trim())\n .filter(Boolean)\n}\n\nfunction isArrayIndexSegment(segment: string) {\n return ARRAY_INDEX_SEGMENT_RE.test(segment)\n}\n\nfunction createContainerByNextSegment(nextSegment?: string) {\n return isArrayIndexSegment(nextSegment ?? '') ? [] : {}\n}\n\nfunction assignByPath(target: Record<string, any>, path: string, value: unknown) {\n const segments = parseDataPath(path)\n if (segments.length === 0) {\n return\n }\n\n let current: any = target\n for (let index = 0; index < segments.length - 1; index += 1) {\n const segment = segments[index]!\n const nextSegment = segments[index + 1]\n const normalizedSegment = isArrayIndexSegment(segment) ? Number(segment) : segment\n const next = current?.[normalizedSegment]\n if (!next || typeof next !== 'object') {\n current[normalizedSegment] = createContainerByNextSegment(nextSegment)\n }\n current = current[normalizedSegment]\n }\n\n const leafSegment = segments.at(-1)!\n const normalizedLeafSegment = isArrayIndexSegment(leafSegment) ? Number(leafSegment) : leafSegment\n current[normalizedLeafSegment] = value\n}\n\nfunction normalizeRoute(route: string) {\n return route.replace(LEADING_ROUTE_SLASH_RE, '')\n}\n\nexport function createPageInstance(\n route: string,\n definition: HeadlessPageDefinition,\n options: Record<string, string> = {},\n pageState: {\n background?: HeadlessBackgroundSnapshot\n backgroundTextStyle?: HeadlessBackgroundTextStyle\n navigationBar?: HeadlessNavigationBarSnapshot\n } = {},\n): HeadlessPageInstance {\n const normalizedRoute = normalizeRoute(route)\n const instance: HeadlessPageInstance = {\n __background__: pageState.background\n ? cloneBackgroundSnapshot(pageState.background)\n : undefined,\n __backgroundTextStyle__: pageState.background?.textStyle ?? pageState.backgroundTextStyle,\n __route__: normalizedRoute,\n __navigationBar__: pageState.navigationBar\n ? cloneNavigationBarSnapshot(pageState.navigationBar)\n : undefined,\n __navigationBarTitle__: pageState.navigationBar?.title,\n data: resolveInitialData(definition),\n options: { ...options },\n route: normalizedRoute,\n setData(patch, callback) {\n instance.__lastChangedKeys__ = Object.keys(patch)\n for (const [key, value] of Object.entries(patch)) {\n assignByPath(instance.data, key, value)\n }\n callback?.()\n },\n }\n\n for (const [key, value] of Object.entries(definition)) {\n if (key === 'data') {\n continue\n }\n bindFunction(instance, key, value)\n }\n\n return instance\n}\n","// Adapted from https://github.com/mathiasbynens/he/blob/36afe179392226cf1b6ccdb16ebbb7a5a844d93a/src/he.js#L106-L134\nconst decodeMap = new Map([\n [0, 65_533],\n // C1 Unicode control character reference replacements\n [128, 8364],\n [130, 8218],\n [131, 402],\n [132, 8222],\n [133, 8230],\n [134, 8224],\n [135, 8225],\n [136, 710],\n [137, 8240],\n [138, 352],\n [139, 8249],\n [140, 338],\n [142, 381],\n [145, 8216],\n [146, 8217],\n [147, 8220],\n [148, 8221],\n [149, 8226],\n [150, 8211],\n [151, 8212],\n [152, 732],\n [153, 8482],\n [154, 353],\n [155, 8250],\n [156, 339],\n [158, 382],\n [159, 376],\n]);\n/**\n * Replace the given code point with a replacement character if it is a\n * surrogate or is outside the valid range. Otherwise return the code\n * point unchanged.\n * @param codePoint Unicode code point to convert.\n */\nexport function replaceCodePoint(codePoint) {\n if ((codePoint >= 0xd8_00 && codePoint <= 0xdf_ff) ||\n codePoint > 0x10_ff_ff) {\n return 0xff_fd;\n }\n return decodeMap.get(codePoint) ?? codePoint;\n}\n//# sourceMappingURL=decode-codepoint.js.map","/**\n * Shared base64 decode helper for generated decode data.\n * Assumes global atob is available.\n * @param input Input string to encode or decode.\n */\nexport function decodeBase64(input) {\n const binary = atob(input);\n const evenLength = binary.length & ~1; // Round down to even length\n const out = new Uint16Array(evenLength / 2);\n for (let index = 0, outIndex = 0; index < evenLength; index += 2) {\n const lo = binary.charCodeAt(index);\n const hi = binary.charCodeAt(index + 1);\n out[outIndex++] = lo | (hi << 8);\n }\n return out;\n}\n//# sourceMappingURL=decode-shared.js.map","// Generated using scripts/write-decode-map.ts\nimport { decodeBase64 } from \"../internal/decode-shared.js\";\n/** Packed HTML decode trie data. */\nexport const htmlDecodeTree = /* #__PURE__ */ decodeBase64(\"QR08ALkAAgH6AYsDNQR2BO0EPgXZBQEGLAbdBxMISQrvCmQLfQurDKQNLw4fD4YPpA+6D/IPAAAAAAAAAAAAAAAAKhBMEY8TmxUWF2EYLBkxGuAa3RsJHDscWR8YIC8jSCSIJcMl6ie3Ku8rEC0CLjoupS7kLgAIRU1hYmNmZ2xtbm9wcnN0dVQAWgBeAGUAaQBzAHcAfgCBAIQAhwCSAJoAoACsALMAbABpAGcAO4DGAMZAUAA7gCYAJkBjAHUAdABlADuAwQDBQHIiZXZlAAJhAAFpeW0AcgByAGMAO4DCAMJAEGRyAADgNdgE3XIAYQB2AGUAO4DAAMBA8CFoYZFj4SFjcgBhZAAAoFMqAAFncIsAjgBvAG4ABGFmAADgNdg43fAlbHlGdW5jdGlvbgCgYSBpAG4AZwA7gMUAxUAAAWNzpACoAHIAAOA12Jzc6SFnbgCgVCJpAGwAZABlADuAwwDDQG0AbAA7gMQAxEAABGFjZWZvcnN1xQDYANoA7QDxAPYA+QD8AAABY3LJAM8AayNzbGFzaAAAoBYidgHTANUAAKDnKmUAZAAAoAYjeQARZIABY3J0AOAA5QDrAGEidXNlAACgNSLuI291bGxpcwCgLCFhAJJjcgAA4DXYBd1wAGYAAOA12Dnd5SF2ZdhiYwDyAOoAbSJwZXEAAKBOIgAHSE9hY2RlZmhpbG9yc3UXARoBHwE6AVIBVQFiAWQBZgGCAakB6QHtAfIBYwB5ACdkUABZADuAqQCpQIABY3B5ACUBKAE1AfUhdGUGYWmg0iJ0KGFsRGlmZmVyZW50aWFsRAAAoEUhbCJleXMAAKAtIQACYWVpb0EBRAFKAU0B8iFvbgxhZABpAGwAO4DHAMdAcgBjAAhhbiJpbnQAAKAwIm8AdAAKYQABZG5ZAV0BaSJsbGEAuGB0I2VyRG90ALdg8gA5AWkAp2NyImNsZQAAAkRNUFRwAXQBeQF9AW8AdAAAoJkiaSJudXMAAKCWIuwhdXMAoJUiaSJtZXMAAKCXIm8AAAFjc4cBlAFrKndpc2VDb250b3VySW50ZWdyYWwAAKAyImUjQ3VybHkAAAFEUZwBpAFvJXVibGVRdW90ZQAAoB0gdSJvdGUAAKAZIAACbG5wdbABtgHNAdgBbwBuAGWgNyIAoHQqgAFnaXQAvAHBAcUB8iJ1ZW50AKBhIm4AdAAAoC8i7yV1ckludGVncmFsAKAuIgABZnLRAdMBAKACIe8iZHVjdACgECJuLnRlckNsb2Nrd2lzZUNvbnRvdXJJbnRlZ3JhbAAAoDMi7yFzcwCgLypjAHIAAOA12J7ccABDoNMiYQBwAACgTSKABURKU1phY2VmaW9zAAsCEgIVAhgCGwIsAjQCOQI9AnMCfwNvoEUh9CJyYWhkAKARKWMAeQACZGMAeQAFZGMAeQAPZIABZ3JzACECJQIoAuchZXIAoCEgcgAAoKEhaAB2AACg5CoAAWF5MAIzAvIhb24OYRRkbAB0oAciYQCUY3IAAOA12AfdAAFhZkECawIAAWNtRQJnAvIjaXRpY2FsAAJBREdUUAJUAl8CYwJjInV0ZQC0YG8AdAFZAloC2WJiJGxlQWN1dGUA3WJyImF2ZQBgYGkibGRlANxi7yFuZACgxCJmJWVyZW50aWFsRAAAoEYhcAR9AgAAAAAAAIECjgIAABoDZgAA4DXYO91EoagAhQKJAm8AdAAAoNwgcSJ1YWwAAKBQIuIhbGUAA0NETFJVVpkCqAK1Au8C/wIRA28AbgB0AG8AdQByAEkAbgB0AGUAZwByAGEA7ADEAW8AdAKvAgAAAACwAqhgbiNBcnJvdwAAoNMhAAFlb7kC0AJmAHQAgAFBUlQAwQLGAs0CciJyb3cAAKDQIekkZ2h0QXJyb3cAoNQhZQDlACsCbgBnAAABTFLWAugC5SFmdAABQVLcAuECciJyb3cAAKD4J+kkZ2h0QXJyb3cAoPon6SRnaHRBcnJvdwCg+SdpImdodAAAAUFU9gL7AnIicm93AACg0iFlAGUAAKCoInAAQQIGAwAAAAALA3Iicm93AACg0SFvJHduQXJyb3cAAKDVIWUlcnRpY2FsQmFyAACgJSJuAAADQUJMUlRhJAM2AzoDWgNxA3oDciJyb3cAAKGTIUJVLAMwA2EAcgAAoBMpcCNBcnJvdwAAoPUhciJldmUAEWPlIWZ00gJDAwAASwMAAFIDaSVnaHRWZWN0b3IAAKBQKWUkZVZlY3RvcgAAoF4p5SJjdG9yQqC9IWEAcgAAoFYpaSJnaHQA1AFiAwAAaQNlJGVWZWN0b3IAAKBfKeUiY3RvckKgwSFhAHIAAKBXKWUAZQBBoKQiciJyb3cAAKCnIXIAcgBvAPcAtAIAAWN0gwOHA3IA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YwAAoN8i4SFycnCgtiEAoD0pgKIqImJjZG9zACsVMBU6FT4VQRVyImNhcAAAoEgqAAFhdTQVNxVwAACgRipwAACgSipvAHQAAKCNInIAAKBFKgDgKiIA/gACYWxydksVURVuFXMVcgByAG2gtyEAoDwpeQCAAWV2dwBYFWUVaRVxAHACXxUAAAAAYxVyAGUA4wAXFXUA4wAZFWUAZQAAoM4iZSJkZ2UAAKDPImUAbgA7gKQApEBlI2Fycm93AAABbHJ7FX8V5SFmdACgtiFpImdodAAAoLchZQDkAG0VAAFjaYsVkRVvAG4AaQBuAPQAkwFuAHQAAKAxImwiY3R5AACgLSOACUFIYWJjZGVmaGlqbG9yc3R1d3oAuBW7Fb8V1RXgFegV+RUKFhUWHxZUFlcWZRbFFtsW7xb7FgUXChdyAPIAtAJhAHIAAKBlKQACZ2xyc8YVyhXOFdAV5yFlcgCgICDlIXRoAKA4IfIA9QxoAHagECAAoKMiawHZFd4VYSJyb3cAAKAPKWEA4wBfAgABYXnkFecV8iFvbg9hNGQAoUYhYW/tFfQVAAFnciEC8RVyAACgyiF0InNlcQAAoHcqgAFnbG0A/xUCFgUWO4CwALBAdABhALRjcCJ0eXYAAKCxKQABaXIOFhIW8yFodACgfykA4DXYId1hAHIAAAFschsWHRYAoMMhAKDCIYACYWVnc3YAKBauAjYWOhY+Fm0AAKHEIm9zLhY0Fm4AZABzoMQi9SFpdACgZiZhIm1tYQDdY2kAbgAAoPIiAKH3AGlvQxZRFmQAZQAAgfcAO29KFksW90BuI3RpbWVzAACgxyJuAPgAUBZjAHkAUmRjAG8CXhYAAAAAYhZyAG4AAKAeI28AcAAAoA0jgAJscHR1dwBuFnEWdRaSFp4W7CFhciRgZgAA4DXYVd0AotkCZW1wc30WhBaJFo0WcQBkoFAibwB0AACgUSJpIm51cwAAoDgi7CF1cwCgFCLxInVhcmUAoKEiYgBsAGUAYgBhAHIAdwBlAGQAZwDlANcAbgCAAWFkaAClFqoWtBZyAHIAbwD3APUMbwB3AG4AYQByAHIAbwB3APMA8xVhI3Jwb29uAAABbHK8FsAWZQBmAPQAHBZpAGcAaAD0AB4WYgHJFs8WawBhAHIAbwD3AJILbwLUFgAAAADYFnIAbgAAoB8jbwBwAACgDCOAAWNvdADhFukW7BYAAXJ55RboFgDgNdi53FVkbAAAoPYp8iFvaxFhAAFkcvMW9xZvAHQAAKDxImkA5qC/JVsSAAFhaP8WAhdyAPIANQNhAPIA1wvhIm5nbGUAoKYpAAFjaQ4XEBd5AF9k5yJyYXJyAKD/JwAJRGFjZGVmZ2xtbm9wcXJzdHV4MRc4F0YXWxcyBF4XaRd5F40XrBe0F78X2RcVGCEYLRg1GEAYAAFEbzUXgRZvAPQA+BUAAWNzPBdCF3UAdABlADuA6QDpQPQhZXIAoG4qAAJhaW95TRdQF1YXWhfyIW9uG2FyAGOgViI7gOoA6kDsIW9uAKBVIk1kbwB0ABdhAAFEcmIXZhdvAHQAAKBSIgDgNdgi3XKhmipuF3QXYQB2AGUAO4DoAOhAZKCWKm8AdAAAoJgqgKGZKmlscwCAF4UXhxfuInRlcnMAoOcjAKATIWSglSpvAHQAAKCXKoABYXBzAJMXlheiF2MAcgATYXQAeQBzogUinxcAAAAAoRdlAHQAAKAFInAAMaADIDMBqRerFwCgBCAAoAUgAAFnc7AXsRdLYXAAAKACIAABZ3C4F7sXbwBuABlhZgAA4DXYVt2AAWFscwDFF8sXzxdyAHOg1SJsAACg4yl1AHMAAKBxKmkAAKG1A2x21RfYF28AbgC1Y/VjAAJjc3V24BfoF/0XEBgAAWlv5BdWF3IAYwAAoFYiaQLuFwAAAADwF+0ADQThIW50AAFnbPUX+Rd0AHIAAKCWKuUhc3MAoJUqgAFhZWkAAxgGGAoYbABzAD1gcwB0AACgXyJ2AESgYSJEAACgeCrwImFyc2wAoOUpAAFEYRkYHRhvAHQAAKBTInIAcgAAoHEpgAFjZGkAJxgqGO0XcgAAoC8hbwD0AIwCAAFhaDEYMhi3YzuA8ADwQAABbXI5GD0YbAA7gOsA60BvAACgrCCAAWNpcABGGEgYSxhsACFgcwD0ACwEAAFlb08YVxhjAHQAYQB0AGkAbwDuABoEbgBlAG4AdABpAGEAbADlADME4Ql1GAAAgRgAAIMYiBgAAAAAoRilGAAAqhgAALsYvhjRGAAA1xgnGWwAbABpAG4AZwBkAG8AdABzAGUA8QBlF3kARGRtImFsZQAAoEAmgAFpbHIAjRiRGJ0Y7CFpZwCgA/tpApcYAAAAAJoYZwAAoAD7aQBnAACgBPsA4DXYI93sIWlnAKAB++whaWcA4GYAagCAAWFsdACvGLIYthh0AACgbSZpAGcAAKAC+24AcwAAoLElbwBmAJJh8AHCGAAAxhhmAADgNdhX3QABYWvJGMwYbADsAGsEdqDUIgCg2SphI3J0aW50AACgDSoAAWFv2hgiGQABY3PeGB8ZsQPnGP0YBRkSGRUZAAAdGbID7xjyGPQY9xj5GAAA+xg7gL0AvUAAoFMhO4C8ALxAAKBVIQCgWSEAoFshswEBGQAAAxkAoFQhAKBWIbQCCxkOGQAAAAAQGTuAvgC+QACgVyEAoFwhNQAAoFghtgEZGQAAGxkAoFohAKBdITgAAKBeIWwAAKBEIHcAbgAAoCIjYwByAADgNdi73IAIRWFiY2RlZmdpamxub3JzdHYARhlKGVoZXhlmGWkZkhmWGZkZnRmgGa0ZxhnLGc8Z4BkjGmygZyIAoIwqgAFjbXAAUBlTGVgZ9SF0ZfVhbQBhAOSgswM6FgCghipyImV2ZQAfYQABaXliGWUZcgBjAB1hM2RvAHQAIWGAoWUibHFzAMYEcBl6GfGhZSLOBAAAdhlsAGEAbgD0AN8EgKF+KmNkbACBGYQZjBljAACgqSpvAHQAb6CAKmyggioAoIQqZeDbIgD+cwAAoJQqcgAA4DXYJN3noGsirATtIWVsAKA3IWMAeQBTZIChdyJFYWoApxmpGasZAKCSKgCgpSoAoKQqAAJFYWVztBm2Gb0ZwhkAoGkicABwoIoq8iFveACgiipxoIgq8aCIKrUZaQBtAACg5yJwAGYAAOA12FjdYQB2AOUAYwIAAWNp0xnWGXIAAKAKIW0AAKFzImVs3BneGQCgjioAoJAqAIM+ADtjZGxxco0E6xn0GfgZ/BkBGgABY2nvGfEZAKCnKnIAAKB6Km8AdAAAoNci0CFhcgCglSl1ImVzdAAAoHwqgAJhZGVscwAKGvQZFhrVBCAa8AEPGgAAFBpwAHIAbwD4AFkZcgAAoHgpcQAAAWxxxAQbGmwAZQBzAPMASRlpAO0A5AQAAWVuJxouGnIjdG5lcXEAAOBpIgD+xQAsGgAFQWFiY2Vma29zeUAaQxpmGmoabRqDGocalhrCGtMacgDyAMwCAAJpbG1yShpOGlAaVBpyAHMA8ABxD2YAvWBpAGwA9AASBQABZHJYGlsaYwB5AEpkAKGUIWN3YBpkGmkAcgAAoEgpAKCtIWEAcgAAoA8h6SFyYyVhgAFhbHIAcxp7Gn8a8iF0c3WgZSZpAHQAAKBlJuwhaXAAoCYg4yFvbgCguSJyAADgNdgl3XMAAAFld4wakRphInJvdwAAoCUpYSJyb3cAAKAmKYACYW1vcHIAnxqjGqcauhq+GnIAcgAAoP8h9CFodACgOyJrAAABbHKsGrMaZSRmdGFycm93AACgqSHpJGdodGFycm93AKCqIWYAAOA12Fnd4iFhcgCgFSCAAWNsdADIGswa0BpyAADgNdi93GEAcwDoAGka8iFvaydhAAFicNca2xr1IWxsAKBDIOghZW4AoBAg4Qr2GgAA/RoAAAgbExsaGwAAIRs7GwAAAAA+G2IbmRuVG6sbAACyG80b0htjAHUAdABlADuA7QDtQAChYyBpeQEbBhtyAGMAO4DuAO5AOGQAAWN4CxsNG3kANWRjAGwAO4ChAKFAAAFmcssCFhsA4DXYJt1yAGEAdgBlADuA7ADsQIChSCFpbm8AJxsyGzYbAAFpbisbLxtuAHQAAKAMKnQAAKAtIuYhaW4AoNwpdABhAACgKSHsIWlnM2GAAWFvcABDG1sbXhuAAWNndABJG0sbWRtyACthgAFlbHAAcQVRG1UbaQBuAOUAyAVhAHIA9AByBWgAMWFmAACgtyJlAGQAtWEAoggiY2ZvdGkbbRt1G3kb4SFyZQCgBSFpAG4AdKAeImkAZQAAoN0pZABvAPQAWxsAoisiY2VscIEbhRuPG5QbYQBsAACguiIAAWdyiRuNG2UAcgDzACMQ4wCCG2EicmhrAACgFyryIW9kAKA8KgACY2dwdJ8boRukG6gbeQBRZG8AbgAvYWYAAOA12FrdYQC5Y3UAZQBzAHQAO4C/AL9AAAFjabUbuRtyAADgNdi+3G4AAKIIIkVkc3bCG8QbyBvQAwCg+SJvAHQAAKD1Inag9CIAoPMiaaBiIOwhZGUpYesB1hsAANkbYwB5AFZkbAA7gO8A70AAA2NmbW9zdeYb7hvyG/Ub+hsFHAABaXnqG+0bcgBjADVhOWRyAADgNdgn3eEhdGg3YnAAZgAA4DXYW93jAf8bAAADHHIAAOA12L/c8iFjeVhk6yFjeVRkAARhY2ZnaGpvcxUcGhwiHCYcKhwtHDAcNRzwIXBhdqC6A/BjAAFleR4cIRzkIWls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ZmdobG1vcHJzdHV3CiwNLBEsHSwnLDEsQCxLLFIsYix6LIQsjyzLLOgs7Sz/LAotcgDyAAkDYQByAACgYykAAWNyFSwbLHUAdABlADuA+gD6QPIACQ1yAOMBIywAACUseQBeZHYAZQBtYQABaXkrLDAscgBjADuA+wD7QENkgAFhYmgANyw6LD0scgDyANEO7CFhY3FhYQDyAOAOAAFpckQsSCzzIWh0AKB+KQDgNdgy3XIAYQB2AGUAO4D5APlAYQFWLF8scgAAAWxyWixcLACgvyEAoL4hbABrAACggCUAAWN0Zix2LG8CbCwAAAAAcyxyAG4AZaAcI3IAAKAcI28AcAAAoA8jcgBpAACg+CUAAWFsfiyBLGMAcgBrYTuAqACoQAABZ3CILIssbwBuAHNhZgAA4DXYZt0AA2FkaGxzdZksniynLLgsuyzFLHIAcgBvAPcACQ1vAHcAbgBhAHIAcgBvAPcA2A5hI3Jwb29uAAABbHKvLLMsZQBmAPQAWyxpAGcAaAD0AF0sdQDzAKYOaQAAocUDaGzBLMIs0mNvAG4AxWPwI2Fycm93cwCgyCGAAWNpdADRLOEs5CxvAtcsAAAAAN4scgBuAGWgHSNyAACgHSNvAHAAAKAOI24AZwBvYXIAaQAAoPklYwByAADgNdjK3IABZGlyAPMs9yz6LG8AdAAAoPAi7CFkZWlhaQBmoLUlAKC0JQABYW0DLQYtcgDyAMosbAA7gPwA/EDhIm5nbGUAoKcpgAdBQkRhY2RlZmxub3Byc3oAJy0qLTAtNC2bLZ0toS2/LcMtxy3TLdgt3C3gLfwtcgDyABADYQByAHag6CoAoOkqYQBzAOgA/gIAAW5yOC08LechcnQAoJwpgANla25wcnN0AJkpSC1NLVQtXi1iLYItYQBwAHAA4QAaHG8AdABoAGkAbgDnAKEXgAFoaXIAoSmzJFotbwBwAPQAdCVooJUh7wD4JgABaXVmLWotZwBtAOEAuygAAWJwbi14LXMjZXRuZXEAceCKIgD+AODLKgD+cyNldG5lcQBx4IsiAP4A4MwqAP4AAWhyhi2KLWUAdADhABIraSNhbmdsZQAAAWxyki2WLeUhZnQAoLIiaSJnaHQAAKCzInkAMmThIXNoAKCiIoABZWxyAKcttC24LWKiKCKuLQAAAACyLWEAcgAAoLsicQAAoFoi7CFpcACg7iIAAWJ0vC1eD2EA8gBfD3IAAOA12DPddAByAOkAlS1zAHUAAAFicM0t0C0A4IIi0iAA4IMi0iBwAGYAAOA12GfdcgBvAPAAWQt0AHIA6QCaLQABY3XkLegtcgAA4DXYy9wAAWJw7C30LW4AAAFFZXUt8S0A4IoiAP5uAAABRWV/LfktAOCLIgD+6SJnemFnAKCaKYADY2Vmb3BycwANLhAuJS4pLiMuLi40LukhcmN1YQABZGkULiEuAAFiZxguHC5hAHIAAKBfKmUAcaAnIgCgWSLlIXJwAKAYIXIAAOA12DTdcABmAADgNdho3WWgQCJhAHQA6ABqD2MAcgAA4DXYzNzjCuQRUC4AAFQuAABYLmIuAAAAAGMubS5wLnQuAAAAAIguki4AAJouJxIqEnQAcgDpAB0ScgAA4DXYNd0AAUFhWy5eLnIA8gDnAnIA8gCTB75jAAFBYWYuaS5yAPIA4AJyAPIAjAdhAPAAeh5pAHMAAKD7IoABZHB0APgReS6DLgABZmx9LoAuAOA12GnddQDzAP8RaQBtAOUABBIAAUFhiy6OLnIA8gDuAnIA8gCaBwABY3GVLgoScgAA4DXYzdwAAXB0nS6hLmwAdQDzACUScgDpACASAARhY2VmaW9zdbEuvC7ELsguzC7PLtQu2S5jAAABdXm2LrsudABlADuA/QD9QE9kAAFpecAuwy5yAGMAd2FLZG4AO4ClAKVAcgAA4DXYNt1jAHkAV2RwAGYAAOA12GrdYwByAADgNdjO3AABY23dLt8ueQBOZGwAO4D/AP9AAAVhY2RlZmhpb3N38y73Lv8uAi8MLxAvEy8YLx0vIi9jInV0ZQB6YQABYXn7Lv4u8iFvbn5hN2RvAHQAfGEAAWV0Bi8KL3QAcgDmAB8QYQC2Y3IAAOA12DfdYwB5ADZk5yJyYXJyAKDdIXAAZgAA4DXYa91jAHIAAOA12M/cAAFqbiYvKC8AoA0gagAAoAwg\");\n//# sourceMappingURL=decode-data-html.js.map","// Generated using scripts/write-decode-map.ts\nimport { decodeBase64 } from \"../internal/decode-shared.js\";\n/** Packed XML decode trie data. */\nexport const xmlDecodeTree = /* #__PURE__ */ decodeBase64(\"AAJhZ2xxBwARABMAFQBtAg0AAAAAAA8AcAAmYG8AcwAnYHQAPmB0ADxg9SFvdCJg\");\n//# sourceMappingURL=decode-data-xml.js.map","/**\n * Bit flags & masks for the binary trie encoding used for entity decoding.\n *\n * Bit layout (16 bits total):\n * 15..14 VALUE_LENGTH (+1 encoding; 0 => no value)\n * 13 FLAG13. If valueLength>0: semicolon required flag (implicit ';').\n * If valueLength==0: compact run flag.\n * 12..7 BRANCH_LENGTH Branch length (0 => single branch in 6..0 if jumpOffset==char) OR run length (when compact run)\n * 6..0 JUMP_TABLE Jump offset (jump table) OR single-branch char code OR first run char\n */\nexport var BinTrieFlags;\n(function (BinTrieFlags) {\n BinTrieFlags[BinTrieFlags[\"VALUE_LENGTH\"] = 49152] = \"VALUE_LENGTH\";\n BinTrieFlags[BinTrieFlags[\"FLAG13\"] = 8192] = \"FLAG13\";\n BinTrieFlags[BinTrieFlags[\"BRANCH_LENGTH\"] = 8064] = \"BRANCH_LENGTH\";\n BinTrieFlags[BinTrieFlags[\"JUMP_TABLE\"] = 127] = \"JUMP_TABLE\";\n})(BinTrieFlags || (BinTrieFlags = {}));\n//# sourceMappingURL=bin-trie-flags.js.map","import { replaceCodePoint } from \"./decode-codepoint.js\";\nimport { htmlDecodeTree } from \"./generated/decode-data-html.js\";\nimport { xmlDecodeTree } from \"./generated/decode-data-xml.js\";\nimport { BinTrieFlags } from \"./internal/bin-trie-flags.js\";\nvar CharCodes;\n(function (CharCodes) {\n CharCodes[CharCodes[\"NUM\"] = 35] = \"NUM\";\n CharCodes[CharCodes[\"SEMI\"] = 59] = \"SEMI\";\n CharCodes[CharCodes[\"EQUALS\"] = 61] = \"EQUALS\";\n CharCodes[CharCodes[\"ZERO\"] = 48] = \"ZERO\";\n CharCodes[CharCodes[\"NINE\"] = 57] = \"NINE\";\n CharCodes[CharCodes[\"LOWER_A\"] = 97] = \"LOWER_A\";\n CharCodes[CharCodes[\"LOWER_F\"] = 102] = \"LOWER_F\";\n CharCodes[CharCodes[\"LOWER_X\"] = 120] = \"LOWER_X\";\n CharCodes[CharCodes[\"LOWER_Z\"] = 122] = \"LOWER_Z\";\n CharCodes[CharCodes[\"UPPER_A\"] = 65] = \"UPPER_A\";\n CharCodes[CharCodes[\"UPPER_F\"] = 70] = \"UPPER_F\";\n CharCodes[CharCodes[\"UPPER_Z\"] = 90] = \"UPPER_Z\";\n})(CharCodes || (CharCodes = {}));\n/** Bit that needs to be set to convert an upper case ASCII character to lower case */\nconst TO_LOWER_BIT = 0b10_0000;\nfunction isNumber(code) {\n return code >= CharCodes.ZERO && code <= CharCodes.NINE;\n}\nfunction isHexadecimalCharacter(code) {\n return ((code >= CharCodes.UPPER_A && code <= CharCodes.UPPER_F) ||\n (code >= CharCodes.LOWER_A && code <= CharCodes.LOWER_F));\n}\nfunction isAsciiAlphaNumeric(code) {\n return ((code >= CharCodes.UPPER_A && code <= CharCodes.UPPER_Z) ||\n (code >= CharCodes.LOWER_A && code <= CharCodes.LOWER_Z) ||\n isNumber(code));\n}\n/**\n * Checks if the given character is a valid end character for an entity in an attribute.\n *\n * Attribute values that aren't terminated properly aren't parsed, and shouldn't lead to a parser error.\n * See the example in https://html.spec.whatwg.org/multipage/parsing.html#named-character-reference-state\n * @param code Code point to decode.\n */\nfunction isEntityInAttributeInvalidEnd(code) {\n return code === CharCodes.EQUALS || isAsciiAlphaNumeric(code);\n}\nvar EntityDecoderState;\n(function (EntityDecoderState) {\n EntityDecoderState[EntityDecoderState[\"EntityStart\"] = 0] = \"EntityStart\";\n EntityDecoderState[EntityDecoderState[\"NumericStart\"] = 1] = \"NumericStart\";\n EntityDecoderState[EntityDecoderState[\"NumericDecimal\"] = 2] = \"NumericDecimal\";\n EntityDecoderState[EntityDecoderState[\"NumericHex\"] = 3] = \"NumericHex\";\n EntityDecoderState[EntityDecoderState[\"NamedEntity\"] = 4] = \"NamedEntity\";\n})(EntityDecoderState || (EntityDecoderState = {}));\n/**\n * Decoding mode for named entities.\n */\nexport var DecodingMode;\n(function (DecodingMode) {\n /** Entities in text nodes that can end with any character. */\n DecodingMode[DecodingMode[\"Legacy\"] = 0] = \"Legacy\";\n /** Only allow entities terminated with a semicolon. */\n DecodingMode[DecodingMode[\"Strict\"] = 1] = \"Strict\";\n /** Entities in attributes have limitations on ending characters. */\n DecodingMode[DecodingMode[\"Attribute\"] = 2] = \"Attribute\";\n})(DecodingMode || (DecodingMode = {}));\n/**\n * Token decoder with support of writing partial entities.\n */\nexport class EntityDecoder {\n decodeTree;\n emitCodePoint;\n errors;\n constructor(\n /** The tree used to decode entities. */\n // biome-ignore lint/correctness/noUnusedPrivateClassMembers: False positive\n decodeTree, \n /**\n * The function that is called when a codepoint is decoded.\n *\n * For multi-byte named entities, this will be called multiple times,\n * with the second codepoint, and the same `consumed` value.\n * @param codepoint The decoded codepoint.\n * @param consumed The number of bytes consumed by the decoder.\n */\n emitCodePoint, \n /** An object that is used to produce errors. */\n errors) {\n this.decodeTree = decodeTree;\n this.emitCodePoint = emitCodePoint;\n this.errors = errors;\n }\n /** The current state of the decoder. */\n state = EntityDecoderState.EntityStart;\n /** Characters that were consumed while parsing an entity. */\n consumed = 1;\n /**\n * The result of the entity.\n *\n * Either the result index of a numeric entity, or the codepoint of a\n * numeric entity.\n */\n result = 0;\n /** The current index in the decode tree. */\n treeIndex = 0;\n /** The number of characters that were consumed in excess. */\n excess = 1;\n /** The mode in which the decoder is operating. */\n decodeMode = DecodingMode.Strict;\n /** The number of characters that have been consumed in the current run. */\n runConsumed = 0;\n /**\n * Resets the instance to make it reusable.\n * @param decodeMode Entity decoding mode to use.\n */\n startEntity(decodeMode) {\n this.decodeMode = decodeMode;\n this.state = EntityDecoderState.EntityStart;\n this.result = 0;\n this.treeIndex = 0;\n this.excess = 1;\n this.consumed = 1;\n this.runConsumed = 0;\n }\n /**\n * Write an entity to the decoder. This can be called multiple times with partial entities.\n * If the entity is incomplete, the decoder will return -1.\n *\n * Mirrors the implementation of `getDecoder`, but with the ability to stop decoding if the\n * entity is incomplete, and resume when the next string is written.\n * @param input The string containing the entity (or a continuation of the entity).\n * @param offset The offset at which the entity begins. Should be 0 if this is not the first call.\n * @returns The number of characters that were consumed, or -1 if the entity is incomplete.\n */\n write(input, offset) {\n switch (this.state) {\n case EntityDecoderState.EntityStart: {\n if (input.charCodeAt(offset) === CharCodes.NUM) {\n this.state = EntityDecoderState.NumericStart;\n this.consumed += 1;\n return this.stateNumericStart(input, offset + 1);\n }\n this.state = EntityDecoderState.NamedEntity;\n return this.stateNamedEntity(input, offset);\n }\n case EntityDecoderState.NumericStart: {\n return this.stateNumericStart(input, offset);\n }\n case EntityDecoderState.NumericDecimal: {\n return this.stateNumericDecimal(input, offset);\n }\n case EntityDecoderState.NumericHex: {\n return this.stateNumericHex(input, offset);\n }\n case EntityDecoderState.NamedEntity: {\n return this.stateNamedEntity(input, offset);\n }\n }\n }\n /**\n * Switches between the numeric decimal and hexadecimal states.\n *\n * Equivalent to the `Numeric character reference state` in the HTML spec.\n * @param input The string containing the entity (or a continuation of the entity).\n * @param offset The current offset.\n * @returns The number of characters that were consumed, or -1 if the entity is incomplete.\n */\n stateNumericStart(input, offset) {\n if (offset >= input.length) {\n return -1;\n }\n if ((input.charCodeAt(offset) | TO_LOWER_BIT) === CharCodes.LOWER_X) {\n this.state = EntityDecoderState.NumericHex;\n this.consumed += 1;\n return this.stateNumericHex(input, offset + 1);\n }\n this.state = EntityDecoderState.NumericDecimal;\n return this.stateNumericDecimal(input, offset);\n }\n /**\n * Parses a hexadecimal numeric entity.\n *\n * Equivalent to the `Hexademical character reference state` in the HTML spec.\n * @param input The string containing the entity (or a continuation of the entity).\n * @param offset The current offset.\n * @returns The number of characters that were consumed, or -1 if the entity is incomplete.\n */\n stateNumericHex(input, offset) {\n while (offset < input.length) {\n const char = input.charCodeAt(offset);\n if (isNumber(char) || isHexadecimalCharacter(char)) {\n // Convert hex digit to value (0-15); 'a'/'A' -> 10.\n const digit = char <= CharCodes.NINE\n ? char - CharCodes.ZERO\n : (char | TO_LOWER_BIT) - CharCodes.LOWER_A + 10;\n this.result = this.result * 16 + digit;\n this.consumed++;\n offset++;\n }\n else {\n return this.emitNumericEntity(char, 3);\n }\n }\n return -1; // Incomplete entity\n }\n /**\n * Parses a decimal numeric entity.\n *\n * Equivalent to the `Decimal character reference state` in the HTML spec.\n * @param input The string containing the entity (or a continuation of the entity).\n * @param offset The current offset.\n * @returns The number of characters that were consumed, or -1 if the entity is incomplete.\n */\n stateNumericDecimal(input, offset) {\n while (offset < input.length) {\n const char = input.charCodeAt(offset);\n if (isNumber(char)) {\n this.result = this.result * 10 + (char - CharCodes.ZERO);\n this.consumed++;\n offset++;\n }\n else {\n return this.emitNumericEntity(char, 2);\n }\n }\n return -1; // Incomplete entity\n }\n /**\n * Validate and emit a numeric entity.\n *\n * Implements the logic from the `Hexademical character reference start\n * state` and `Numeric character reference end state` in the HTML spec.\n * @param lastCp The last code point of the entity. Used to see if the\n * entity was terminated with a semicolon.\n * @param expectedLength The minimum number of characters that should be\n * consumed. Used to validate that at least one digit\n * was consumed.\n * @returns The number of characters that were consumed.\n */\n emitNumericEntity(lastCp, expectedLength) {\n // Ensure we consumed at least one digit.\n if (this.consumed <= expectedLength) {\n this.errors?.absenceOfDigitsInNumericCharacterReference(this.consumed);\n return 0;\n }\n // Figure out if this is a legit end of the entity\n if (lastCp === CharCodes.SEMI) {\n this.consumed += 1;\n }\n else if (this.decodeMode === DecodingMode.Strict) {\n return 0;\n }\n this.emitCodePoint(replaceCodePoint(this.result), this.consumed);\n if (this.errors) {\n if (lastCp !== CharCodes.SEMI) {\n this.errors.missingSemicolonAfterCharacterReference();\n }\n this.errors.validateNumericCharacterReference(this.result);\n }\n return this.consumed;\n }\n /**\n * Parses a named entity.\n *\n * Equivalent to the `Named character reference state` in the HTML spec.\n * @param input The string containing the entity (or a continuation of the entity).\n * @param offset The current offset.\n * @returns The number of characters that were consumed, or -1 if the entity is incomplete.\n */\n stateNamedEntity(input, offset) {\n const { decodeTree } = this;\n let current = decodeTree[this.treeIndex];\n // The length is the number of bytes of the value, including the current byte.\n let valueLength = (current & BinTrieFlags.VALUE_LENGTH) >> 14;\n while (offset < input.length) {\n // Handle compact runs (possibly inline): valueLength == 0 and SEMI_REQUIRED bit set.\n if (valueLength === 0 && (current & BinTrieFlags.FLAG13) !== 0) {\n const runLength = (current & BinTrieFlags.BRANCH_LENGTH) >> 7; /* 2..63 */\n // If we are starting a run, check the first char.\n if (this.runConsumed === 0) {\n const firstChar = current & BinTrieFlags.JUMP_TABLE;\n if (input.charCodeAt(offset) !== firstChar) {\n return this.result === 0\n ? 0\n : this.emitNotTerminatedNamedEntity();\n }\n offset++;\n this.excess++;\n this.runConsumed++;\n }\n // Check remaining characters in the run.\n while (this.runConsumed < runLength) {\n if (offset >= input.length) {\n return -1;\n }\n const charIndexInPacked = this.runConsumed - 1;\n const packedWord = decodeTree[this.treeIndex + 1 + (charIndexInPacked >> 1)];\n const expectedChar = charIndexInPacked % 2 === 0\n ? packedWord & 0xff\n : (packedWord >> 8) & 0xff;\n if (input.charCodeAt(offset) !== expectedChar) {\n this.runConsumed = 0;\n return this.result === 0\n ? 0\n : this.emitNotTerminatedNamedEntity();\n }\n offset++;\n this.excess++;\n this.runConsumed++;\n }\n this.runConsumed = 0;\n this.treeIndex += 1 + (runLength >> 1);\n current = decodeTree[this.treeIndex];\n valueLength = (current & BinTrieFlags.VALUE_LENGTH) >> 14;\n }\n if (offset >= input.length)\n break;\n const char = input.charCodeAt(offset);\n /*\n * Implicit semicolon handling for nodes that require a semicolon but\n * don't have an explicit ';' branch stored in the trie. If we have\n * a value on the current node, it requires a semicolon, and the\n * current input character is a semicolon, emit the entity using the\n * current node (without descending further).\n */\n if (char === CharCodes.SEMI &&\n valueLength !== 0 &&\n (current & BinTrieFlags.FLAG13) !== 0) {\n return this.emitNamedEntityData(this.treeIndex, valueLength, this.consumed + this.excess);\n }\n this.treeIndex = determineBranch(decodeTree, current, this.treeIndex + Math.max(1, valueLength), char);\n if (this.treeIndex < 0) {\n return this.result === 0 ||\n // If we are parsing an attribute\n (this.decodeMode === DecodingMode.Attribute &&\n // We shouldn't have consumed any characters after the entity,\n (valueLength === 0 ||\n // And there should be no invalid characters.\n isEntityInAttributeInvalidEnd(char)))\n ? 0\n : this.emitNotTerminatedNamedEntity();\n }\n current = decodeTree[this.treeIndex];\n valueLength = (current & BinTrieFlags.VALUE_LENGTH) >> 14;\n // If the branch is a value, store it and continue\n if (valueLength !== 0) {\n // If the entity is terminated by a semicolon, we are done.\n if (char === CharCodes.SEMI) {\n return this.emitNamedEntityData(this.treeIndex, valueLength, this.consumed + this.excess);\n }\n // If we encounter a non-terminated (legacy) entity while parsing strictly, then ignore it.\n if (this.decodeMode !== DecodingMode.Strict &&\n (current & BinTrieFlags.FLAG13) === 0) {\n this.result = this.treeIndex;\n this.consumed += this.excess;\n this.excess = 0;\n }\n }\n // Increment offset & excess for next iteration\n offset++;\n this.excess++;\n }\n return -1;\n }\n /**\n * Emit a named entity that was not terminated with a semicolon.\n * @returns The number of characters consumed.\n */\n emitNotTerminatedNamedEntity() {\n const { result, decodeTree } = this;\n const valueLength = (decodeTree[result] & BinTrieFlags.VALUE_LENGTH) >> 14;\n this.emitNamedEntityData(result, valueLength, this.consumed);\n this.errors?.missingSemicolonAfterCharacterReference();\n return this.consumed;\n }\n /**\n * Emit a named entity.\n * @param result The index of the entity in the decode tree.\n * @param valueLength The number of bytes in the entity.\n * @param consumed The number of characters consumed.\n * @returns The number of characters consumed.\n */\n emitNamedEntityData(result, valueLength, consumed) {\n const { decodeTree } = this;\n this.emitCodePoint(valueLength === 1\n ? decodeTree[result] &\n ~(BinTrieFlags.VALUE_LENGTH | BinTrieFlags.FLAG13)\n : decodeTree[result + 1], consumed);\n if (valueLength === 3) {\n // For multi-byte values, we need to emit the second byte.\n this.emitCodePoint(decodeTree[result + 2], consumed);\n }\n return consumed;\n }\n /**\n * Signal to the parser that the end of the input was reached.\n *\n * Remaining data will be emitted and relevant errors will be produced.\n * @returns The number of characters consumed.\n */\n end() {\n switch (this.state) {\n case EntityDecoderState.NamedEntity: {\n // Emit a named entity if we have one.\n return this.result !== 0 &&\n (this.decodeMode !== DecodingMode.Attribute ||\n this.result === this.treeIndex)\n ? this.emitNotTerminatedNamedEntity()\n : 0;\n }\n // Otherwise, emit a numeric entity if we have one.\n case EntityDecoderState.NumericDecimal: {\n return this.emitNumericEntity(0, 2);\n }\n case EntityDecoderState.NumericHex: {\n return this.emitNumericEntity(0, 3);\n }\n case EntityDecoderState.NumericStart: {\n this.errors?.absenceOfDigitsInNumericCharacterReference(this.consumed);\n return 0;\n }\n case EntityDecoderState.EntityStart: {\n // Return 0 if we have no entity.\n return 0;\n }\n }\n }\n}\n/**\n * Creates a function that decodes entities in a string.\n * @param decodeTree The decode tree.\n * @returns A function that decodes entities in a string.\n */\nfunction getDecoder(decodeTree) {\n let returnValue = \"\";\n const decoder = new EntityDecoder(decodeTree, (data) => (returnValue += String.fromCodePoint(data)));\n return function decodeWithTrie(input, decodeMode) {\n let lastIndex = 0;\n let offset = 0;\n while ((offset = input.indexOf(\"&\", offset)) >= 0) {\n returnValue += input.slice(lastIndex, offset);\n decoder.startEntity(decodeMode);\n const length = decoder.write(input, \n // Skip the \"&\"\n offset + 1);\n if (length < 0) {\n lastIndex = offset + decoder.end();\n break;\n }\n lastIndex = offset + length;\n // If `length` is 0, skip the current `&` and continue.\n offset = length === 0 ? lastIndex + 1 : lastIndex;\n }\n const result = returnValue + input.slice(lastIndex);\n // Make sure we don't keep a reference to the final string.\n returnValue = \"\";\n return result;\n };\n}\n/**\n * Determines the branch of the current node that is taken given the current\n * character. This function is used to traverse the trie.\n * @param decodeTree The trie.\n * @param current The current node.\n * @param nodeIndex Index immediately after the current node header.\n * @param char The current character.\n * @returns The index of the next node, or -1 if no branch is taken.\n */\nexport function determineBranch(decodeTree, current, nodeIndex, char) {\n const branchCount = (current & BinTrieFlags.BRANCH_LENGTH) >> 7;\n const jumpOffset = current & BinTrieFlags.JUMP_TABLE;\n // Case 1: Single branch encoded in jump offset\n if (branchCount === 0) {\n return jumpOffset !== 0 && char === jumpOffset ? nodeIndex : -1;\n }\n // Case 2: Multiple branches encoded in jump table\n if (jumpOffset) {\n const value = char - jumpOffset;\n return value < 0 || value >= branchCount\n ? -1\n : decodeTree[nodeIndex + value] - 1;\n }\n // Case 3: Multiple branches encoded in packed dictionary (two keys per uint16)\n const packedKeySlots = (branchCount + 1) >> 1;\n /*\n * Treat packed keys as a virtual sorted array of length `branchCount`.\n * Key(i) = low byte for even i, high byte for odd i in slot i>>1.\n */\n let lo = 0;\n let hi = branchCount - 1;\n while (lo <= hi) {\n const mid = (lo + hi) >>> 1;\n const slot = mid >> 1;\n const packed = decodeTree[nodeIndex + slot];\n const midKey = (packed >> ((mid & 1) * 8)) & 0xff;\n if (midKey < char) {\n lo = mid + 1;\n }\n else if (midKey > char) {\n hi = mid - 1;\n }\n else {\n return decodeTree[nodeIndex + packedKeySlots + mid];\n }\n }\n return -1;\n}\nconst htmlDecoder = /* #__PURE__ */ getDecoder(htmlDecodeTree);\nconst xmlDecoder = /* #__PURE__ */ getDecoder(xmlDecodeTree);\n/**\n * Decodes an HTML string.\n * @param htmlString The string to decode.\n * @param mode The decoding mode.\n * @returns The decoded string.\n */\nexport function decodeHTML(htmlString, mode = DecodingMode.Legacy) {\n return htmlDecoder(htmlString, mode);\n}\n/**\n * Decodes an HTML string in an attribute.\n * @param htmlAttribute The string to decode.\n * @returns The decoded string.\n */\nexport function decodeHTMLAttribute(htmlAttribute) {\n return htmlDecoder(htmlAttribute, DecodingMode.Attribute);\n}\n/**\n * Decodes an HTML string, requiring all entities to be terminated by a semicolon.\n * @param htmlString The string to decode.\n * @returns The decoded string.\n */\nexport function decodeHTMLStrict(htmlString) {\n return htmlDecoder(htmlString, DecodingMode.Strict);\n}\n/**\n * Decodes an XML string, requiring all entities to be terminated by a semicolon.\n * @param xmlString The string to decode.\n * @returns The decoded string.\n */\nexport function decodeXML(xmlString) {\n return xmlDecoder(xmlString, DecodingMode.Strict);\n}\nexport { replaceCodePoint } from \"./decode-codepoint.js\";\n// Re-export for use by eg. htmlparser2\nexport { htmlDecodeTree } from \"./generated/decode-data-html.js\";\nexport { xmlDecodeTree } from \"./generated/decode-data-xml.js\";\n//# sourceMappingURL=decode.js.map","import { DecodingMode, EntityDecoder, htmlDecodeTree, xmlDecodeTree, } from \"entities/decode\";\nvar CharCodes;\n(function (CharCodes) {\n CharCodes[CharCodes[\"Tab\"] = 9] = \"Tab\";\n CharCodes[CharCodes[\"NewLine\"] = 10] = \"NewLine\";\n CharCodes[CharCodes[\"FormFeed\"] = 12] = \"FormFeed\";\n CharCodes[CharCodes[\"CarriageReturn\"] = 13] = \"CarriageReturn\";\n CharCodes[CharCodes[\"Space\"] = 32] = \"Space\";\n CharCodes[CharCodes[\"ExclamationMark\"] = 33] = \"ExclamationMark\";\n CharCodes[CharCodes[\"Number\"] = 35] = \"Number\";\n CharCodes[CharCodes[\"Amp\"] = 38] = \"Amp\";\n CharCodes[CharCodes[\"SingleQuote\"] = 39] = \"SingleQuote\";\n CharCodes[CharCodes[\"DoubleQuote\"] = 34] = \"DoubleQuote\";\n CharCodes[CharCodes[\"Dash\"] = 45] = \"Dash\";\n CharCodes[CharCodes[\"Slash\"] = 47] = \"Slash\";\n CharCodes[CharCodes[\"Zero\"] = 48] = \"Zero\";\n CharCodes[CharCodes[\"Nine\"] = 57] = \"Nine\";\n CharCodes[CharCodes[\"Semi\"] = 59] = \"Semi\";\n CharCodes[CharCodes[\"Lt\"] = 60] = \"Lt\";\n CharCodes[CharCodes[\"Eq\"] = 61] = \"Eq\";\n CharCodes[CharCodes[\"Gt\"] = 62] = \"Gt\";\n CharCodes[CharCodes[\"Questionmark\"] = 63] = \"Questionmark\";\n CharCodes[CharCodes[\"UpperA\"] = 65] = \"UpperA\";\n CharCodes[CharCodes[\"LowerA\"] = 97] = \"LowerA\";\n CharCodes[CharCodes[\"UpperF\"] = 70] = \"UpperF\";\n CharCodes[CharCodes[\"LowerF\"] = 102] = \"LowerF\";\n CharCodes[CharCodes[\"UpperZ\"] = 90] = \"UpperZ\";\n CharCodes[CharCodes[\"LowerZ\"] = 122] = \"LowerZ\";\n CharCodes[CharCodes[\"LowerX\"] = 120] = \"LowerX\";\n CharCodes[CharCodes[\"OpeningSquareBracket\"] = 91] = \"OpeningSquareBracket\";\n})(CharCodes || (CharCodes = {}));\n/** All the states the tokenizer can be in. */\nvar State;\n(function (State) {\n State[State[\"Text\"] = 1] = \"Text\";\n State[State[\"BeforeTagName\"] = 2] = \"BeforeTagName\";\n State[State[\"InTagName\"] = 3] = \"InTagName\";\n State[State[\"InSelfClosingTag\"] = 4] = \"InSelfClosingTag\";\n State[State[\"BeforeClosingTagName\"] = 5] = \"BeforeClosingTagName\";\n State[State[\"InClosingTagName\"] = 6] = \"InClosingTagName\";\n State[State[\"AfterClosingTagName\"] = 7] = \"AfterClosingTagName\";\n // Attributes\n State[State[\"BeforeAttributeName\"] = 8] = \"BeforeAttributeName\";\n State[State[\"InAttributeName\"] = 9] = \"InAttributeName\";\n State[State[\"AfterAttributeName\"] = 10] = \"AfterAttributeName\";\n State[State[\"BeforeAttributeValue\"] = 11] = \"BeforeAttributeValue\";\n State[State[\"InAttributeValueDq\"] = 12] = \"InAttributeValueDq\";\n State[State[\"InAttributeValueSq\"] = 13] = \"InAttributeValueSq\";\n State[State[\"InAttributeValueNq\"] = 14] = \"InAttributeValueNq\";\n // Declarations\n State[State[\"BeforeDeclaration\"] = 15] = \"BeforeDeclaration\";\n State[State[\"InDeclaration\"] = 16] = \"InDeclaration\";\n // Processing instructions\n State[State[\"InProcessingInstruction\"] = 17] = \"InProcessingInstruction\";\n // Comments & CDATA\n State[State[\"BeforeComment\"] = 18] = \"BeforeComment\";\n State[State[\"CDATASequence\"] = 19] = \"CDATASequence\";\n State[State[\"DeclarationSequence\"] = 20] = \"DeclarationSequence\";\n State[State[\"InSpecialComment\"] = 21] = \"InSpecialComment\";\n State[State[\"InCommentLike\"] = 22] = \"InCommentLike\";\n // Special tags\n State[State[\"SpecialStartSequence\"] = 23] = \"SpecialStartSequence\";\n State[State[\"InSpecialTag\"] = 24] = \"InSpecialTag\";\n State[State[\"InPlainText\"] = 25] = \"InPlainText\";\n State[State[\"InEntity\"] = 26] = \"InEntity\";\n})(State || (State = {}));\nfunction isWhitespace(c) {\n return (c === CharCodes.Space ||\n c === CharCodes.NewLine ||\n c === CharCodes.Tab ||\n c === CharCodes.FormFeed ||\n c === CharCodes.CarriageReturn);\n}\nfunction isEndOfTagSection(c) {\n return c === CharCodes.Slash || c === CharCodes.Gt || isWhitespace(c);\n}\nfunction isASCIIAlpha(c) {\n return ((c >= CharCodes.LowerA && c <= CharCodes.LowerZ) ||\n (c >= CharCodes.UpperA && c <= CharCodes.UpperZ));\n}\n/**\n * Quote style used for parsed attributes.\n */\nexport var QuoteType;\n(function (QuoteType) {\n QuoteType[QuoteType[\"NoValue\"] = 0] = \"NoValue\";\n QuoteType[QuoteType[\"Unquoted\"] = 1] = \"Unquoted\";\n QuoteType[QuoteType[\"Single\"] = 2] = \"Single\";\n QuoteType[QuoteType[\"Double\"] = 3] = \"Double\";\n})(QuoteType || (QuoteType = {}));\n/**\n * Sequences used to match longer strings.\n *\n * We don't have `Script`, `Style`, or `Title` here. Instead, we re-use the *End\n * sequences with an increased offset.\n */\nconst Sequences = {\n Empty: new Uint8Array(0),\n Cdata: new Uint8Array([0x43, 0x44, 0x41, 0x54, 0x41, 0x5b]), // CDATA[\n CdataEnd: new Uint8Array([0x5d, 0x5d, 0x3e]), // ]]>\n CommentEnd: new Uint8Array([0x2d, 0x2d, 0x21, 0x3e]), // `--!>`\n Doctype: new Uint8Array([0x64, 0x6f, 0x63, 0x74, 0x79, 0x70, 0x65]), // `doctype`\n IframeEnd: new Uint8Array([0x3c, 0x2f, 0x69, 0x66, 0x72, 0x61, 0x6d, 0x65]), // `</iframe`\n NoembedEnd: new Uint8Array([\n 0x3c, 0x2f, 0x6e, 0x6f, 0x65, 0x6d, 0x62, 0x65, 0x64,\n ]), // `</noembed`\n NoframesEnd: new Uint8Array([\n 0x3c, 0x2f, 0x6e, 0x6f, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x73,\n ]), // `</noframes`\n Plaintext: new Uint8Array([\n 0x3c, 0x2f, 0x70, 0x6c, 0x61, 0x69, 0x6e, 0x74, 0x65, 0x78, 0x74,\n ]), // `</plaintext`\n ScriptEnd: new Uint8Array([0x3c, 0x2f, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74]), // `</script`\n StyleEnd: new Uint8Array([0x3c, 0x2f, 0x73, 0x74, 0x79, 0x6c, 0x65]), // `</style`\n TitleEnd: new Uint8Array([0x3c, 0x2f, 0x74, 0x69, 0x74, 0x6c, 0x65]), // `</title`\n TextareaEnd: new Uint8Array([\n 0x3c, 0x2f, 0x74, 0x65, 0x78, 0x74, 0x61, 0x72, 0x65, 0x61,\n ]), // `</textarea`\n XmpEnd: new Uint8Array([0x3c, 0x2f, 0x78, 0x6d, 0x70]), // `</xmp`\n};\n/**\n * Maps the first lowercase character of an HTML tag name to the sequence\n * used for special-tag detection. All sequences share a common layout\n * where index 2 is the first tag-name character, so matching always\n * continues from offset 3.\n */\nconst specialStartSequences = new Map([\n [Sequences.IframeEnd[2], Sequences.IframeEnd],\n [Sequences.NoembedEnd[2], Sequences.NoembedEnd],\n [Sequences.Plaintext[2], Sequences.Plaintext],\n [Sequences.ScriptEnd[2], Sequences.ScriptEnd],\n [Sequences.TitleEnd[2], Sequences.TitleEnd],\n [Sequences.XmpEnd[2], Sequences.XmpEnd],\n]);\n/**\n * Tokenizer implementation used by `Parser`.\n */\nexport default class Tokenizer {\n cbs;\n /** The current state the tokenizer is in. */\n state = State.Text;\n /** The read buffer. */\n buffer = \"\";\n /** The beginning of the section that is currently being read. */\n sectionStart = 0;\n /** The index within the buffer that we are currently looking at. */\n index = 0;\n /** The start of the last entity. */\n entityStart = 0;\n /** Some behavior, eg. when decoding entities, is done while we are in another state. This keeps track of the other state type. */\n baseState = State.Text;\n /** For special parsing behavior inside of script and style tags. */\n isSpecial = false;\n /** Indicates whether the tokenizer has been paused. */\n running = true;\n /** The offset of the current buffer. */\n offset = 0;\n xmlMode;\n decodeEntities;\n recognizeSelfClosing;\n entityDecoder;\n constructor({ xmlMode = false, decodeEntities = true, recognizeSelfClosing = xmlMode, }, cbs) {\n this.cbs = cbs;\n this.xmlMode = xmlMode;\n this.decodeEntities = decodeEntities;\n this.recognizeSelfClosing = recognizeSelfClosing;\n this.entityDecoder = new EntityDecoder(xmlMode ? xmlDecodeTree : htmlDecodeTree, (cp, consumed) => this.emitCodePoint(cp, consumed));\n }\n reset() {\n this.state = State.Text;\n this.buffer = \"\";\n this.sectionStart = 0;\n this.index = 0;\n this.baseState = State.Text;\n this.isSpecial = false;\n this.currentSequence = Sequences.Empty;\n this.sequenceIndex = 0;\n this.running = true;\n this.offset = 0;\n }\n write(chunk) {\n this.offset += this.buffer.length;\n this.buffer = chunk;\n this.parse();\n }\n end() {\n if (this.running)\n this.finish();\n }\n pause() {\n this.running = false;\n }\n resume() {\n this.running = true;\n if (this.index < this.buffer.length + this.offset) {\n this.parse();\n }\n }\n stateText(c) {\n if (c === CharCodes.Lt ||\n (!this.decodeEntities && this.fastForwardTo(CharCodes.Lt))) {\n if (this.index > this.sectionStart) {\n this.cbs.ontext(this.sectionStart, this.index);\n }\n this.state = State.BeforeTagName;\n this.sectionStart = this.index;\n }\n else if (this.decodeEntities && c === CharCodes.Amp) {\n this.startEntity();\n }\n }\n currentSequence = Sequences.Empty;\n sequenceIndex = 0;\n enterTagBody() {\n if (this.currentSequence === Sequences.Plaintext) {\n this.currentSequence = Sequences.Empty;\n this.state = State.InPlainText;\n }\n else if (this.isSpecial) {\n this.state = State.InSpecialTag;\n this.sequenceIndex = 0;\n }\n else {\n this.state = State.Text;\n }\n }\n /**\n * Match the opening tag name against an HTML text-only tag sequence.\n *\n * Some tags share an initial prefix (`script`/`style`, `title`/`textarea`,\n * `noembed`/`noframes`), so we may switch to an alternate sequence at the\n * first distinguishing byte. On a successful full match we fall back to\n * the normal tag-name state; a later `>` will enter raw-text, RCDATA, or\n * plaintext mode based on `currentSequence` / `isSpecial`.\n * @param c Current character code point.\n */\n stateSpecialStartSequence(c) {\n const lower = c | 0x20;\n // Still matching — check for an alternate sequence at branch points.\n if (this.sequenceIndex < this.currentSequence.length) {\n if (lower === this.currentSequence[this.sequenceIndex]) {\n this.sequenceIndex++;\n return;\n }\n if (this.sequenceIndex === 3) {\n if (this.currentSequence === Sequences.ScriptEnd &&\n lower === Sequences.StyleEnd[3]) {\n this.currentSequence = Sequences.StyleEnd;\n this.sequenceIndex = 4;\n return;\n }\n if (this.currentSequence === Sequences.TitleEnd &&\n lower === Sequences.TextareaEnd[3]) {\n this.currentSequence = Sequences.TextareaEnd;\n this.sequenceIndex = 4;\n return;\n }\n }\n else if (this.sequenceIndex === 4 &&\n this.currentSequence === Sequences.NoembedEnd &&\n lower === Sequences.NoframesEnd[4]) {\n this.currentSequence = Sequences.NoframesEnd;\n this.sequenceIndex = 5;\n return;\n }\n }\n else if (isEndOfTagSection(c)) {\n // Full match on a valid tag boundary — keep the sequence.\n this.sequenceIndex = 0;\n this.state = State.InTagName;\n this.stateInTagName(c);\n return;\n }\n // No match — abandon special-tag detection.\n this.isSpecial = false;\n this.currentSequence = Sequences.Empty;\n this.sequenceIndex = 0;\n this.state = State.InTagName;\n this.stateInTagName(c);\n }\n stateCDATASequence(c) {\n if (c === Sequences.Cdata[this.sequenceIndex]) {\n if (++this.sequenceIndex === Sequences.Cdata.length) {\n this.state = State.InCommentLike;\n this.currentSequence = Sequences.CdataEnd;\n this.sequenceIndex = 0;\n this.sectionStart = this.index + 1;\n }\n }\n else {\n this.sequenceIndex = 0;\n if (this.xmlMode) {\n this.state = State.InDeclaration;\n this.stateInDeclaration(c); // Reconsume the character\n }\n else {\n this.state = State.InSpecialComment;\n this.stateInSpecialComment(c); // Reconsume the character\n }\n }\n }\n /**\n * When we wait for one specific character, we can speed things up\n * by skipping through the buffer until we find it.\n * @param c Current character code point.\n * @returns Whether the character was found.\n */\n fastForwardTo(c) {\n while (++this.index < this.buffer.length + this.offset) {\n if (this.buffer.charCodeAt(this.index - this.offset) === c) {\n return true;\n }\n }\n /*\n * We increment the index at the end of the `parse` loop,\n * so set it to `buffer.length - 1` here.\n *\n * TODO: Refactor `parse` to increment index before calling states.\n */\n this.index = this.buffer.length + this.offset - 1;\n return false;\n }\n /**\n * Emit a comment token and return to the text state.\n * @param offset Number of characters in the end sequence that have already been matched.\n */\n emitComment(offset) {\n this.cbs.oncomment(this.sectionStart, this.index, offset);\n this.sequenceIndex = 0;\n this.sectionStart = this.index + 1;\n this.state = State.Text;\n }\n /**\n * Comments and CDATA end with `-->` and `]]>`.\n *\n * Their common qualities are:\n * - Their end sequences have a distinct character they start with.\n * - That character is then repeated, so we have to check multiple repeats.\n * - All characters but the start character of the sequence can be skipped.\n * @param c Current character code point.\n */\n stateInCommentLike(c) {\n if (!this.xmlMode &&\n this.currentSequence === Sequences.CommentEnd &&\n this.sequenceIndex <= 1 &&\n /*\n * We're still at the very start of the comment: the only\n * characters consumed since `<!--` are the dashes that\n * advanced sequenceIndex (0 for `<!-->`, 1 for `<!--->`).\n */\n this.index === this.sectionStart + this.sequenceIndex &&\n c === CharCodes.Gt) {\n // Abruptly closed empty HTML comment.\n this.emitComment(this.sequenceIndex);\n }\n else if (this.currentSequence === Sequences.CommentEnd &&\n this.sequenceIndex === 2 &&\n c === CharCodes.Gt) {\n // `!` is optional here, so the same sequence also accepts `-->`.\n this.emitComment(2);\n }\n else if (this.currentSequence === Sequences.CommentEnd &&\n this.sequenceIndex === this.currentSequence.length - 1 &&\n c !== CharCodes.Gt) {\n this.sequenceIndex = Number(c === CharCodes.Dash);\n }\n else if (c === this.currentSequence[this.sequenceIndex]) {\n if (++this.sequenceIndex === this.currentSequence.length) {\n if (this.currentSequence === Sequences.CdataEnd) {\n this.cbs.oncdata(this.sectionStart, this.index, 2);\n }\n else {\n this.cbs.oncomment(this.sectionStart, this.index, 3);\n }\n this.sequenceIndex = 0;\n this.sectionStart = this.index + 1;\n this.state = State.Text;\n }\n }\n else if (this.sequenceIndex === 0) {\n // Fast-forward to the first character of the sequence\n if (this.fastForwardTo(this.currentSequence[0])) {\n this.sequenceIndex = 1;\n }\n }\n else if (c !== this.currentSequence[this.sequenceIndex - 1]) {\n // Allow long sequences, eg. --->, ]]]>\n this.sequenceIndex = 0;\n }\n }\n /**\n * HTML only allows ASCII alpha characters (a-z and A-Z) at the beginning of a tag name.\n *\n * XML allows a lot more characters here (@see https://www.w3.org/TR/REC-xml/#NT-NameStartChar).\n * We allow anything that wouldn't end the tag.\n * @param c Current character code point.\n */\n isTagStartChar(c) {\n return this.xmlMode ? !isEndOfTagSection(c) : isASCIIAlpha(c);\n }\n /**\n * Scan raw-text / RCDATA content for the matching end tag.\n *\n * For RCDATA tags (`<title>`, `<textarea>`) entities are decoded inline.\n * For raw-text tags (`<script>`, `<style>`, etc.) we fast-forward to `<`.\n * @param c Current character code point.\n */\n stateInSpecialTag(c) {\n if (this.sequenceIndex === this.currentSequence.length) {\n if (isEndOfTagSection(c)) {\n const endOfText = this.index - this.currentSequence.length;\n if (this.sectionStart < endOfText) {\n // Spoof the index so that reported locations match up.\n const actualIndex = this.index;\n this.index = endOfText;\n this.cbs.ontext(this.sectionStart, endOfText);\n this.index = actualIndex;\n }\n this.isSpecial = false;\n this.sectionStart = endOfText + 2; // Skip over the `</`\n this.stateInClosingTagName(c);\n return; // We are done; skip the rest of the function.\n }\n this.sequenceIndex = 0;\n }\n if ((c | 0x20) === this.currentSequence[this.sequenceIndex]) {\n this.sequenceIndex += 1;\n }\n else if (this.sequenceIndex === 0) {\n if (this.currentSequence === Sequences.TitleEnd ||\n this.currentSequence === Sequences.TextareaEnd) {\n // RCDATA tags have to parse entities while still looking for their end tag.\n if (this.decodeEntities && c === CharCodes.Amp) {\n this.startEntity();\n }\n }\n else if (this.fastForwardTo(CharCodes.Lt)) {\n // Outside of RCDATA tags, we can fast-forward.\n this.sequenceIndex = 1;\n }\n }\n else {\n // If we see a `<`, set the sequence index to 1; useful for eg. `<</script>`.\n this.sequenceIndex = Number(c === CharCodes.Lt);\n }\n }\n stateBeforeTagName(c) {\n if (c === CharCodes.ExclamationMark) {\n this.state = State.BeforeDeclaration;\n this.sectionStart = this.index + 1;\n }\n else if (c === CharCodes.Questionmark) {\n if (this.xmlMode) {\n this.state = State.InProcessingInstruction;\n this.sequenceIndex = 0;\n this.sectionStart = this.index + 1;\n }\n else {\n this.state = State.InSpecialComment;\n this.sectionStart = this.index;\n }\n }\n else if (this.isTagStartChar(c)) {\n this.sectionStart = this.index;\n const special = this.xmlMode || this.cbs.isInForeignContext?.()\n ? undefined\n : specialStartSequences.get(c | 0x20);\n if (special === undefined) {\n this.state = State.InTagName;\n }\n else {\n this.isSpecial = true;\n this.currentSequence = special;\n this.sequenceIndex = 3;\n this.state = State.SpecialStartSequence;\n }\n }\n else if (c === CharCodes.Slash) {\n this.state = State.BeforeClosingTagName;\n }\n else {\n this.state = State.Text;\n this.stateText(c);\n }\n }\n stateInTagName(c) {\n if (isEndOfTagSection(c)) {\n this.cbs.onopentagname(this.sectionStart, this.index);\n this.sectionStart = -1;\n this.state = State.BeforeAttributeName;\n this.stateBeforeAttributeName(c);\n }\n }\n stateBeforeClosingTagName(c) {\n if (isWhitespace(c)) {\n if (this.xmlMode) {\n // Ignore\n }\n else {\n this.state = State.InSpecialComment;\n this.sectionStart = this.index;\n }\n }\n else if (c === CharCodes.Gt) {\n this.state = State.Text;\n if (!this.xmlMode) {\n this.sectionStart = this.index + 1;\n }\n }\n else {\n this.state = this.isTagStartChar(c)\n ? State.InClosingTagName\n : State.InSpecialComment;\n this.sectionStart = this.index;\n }\n }\n stateInClosingTagName(c) {\n if (isEndOfTagSection(c)) {\n this.cbs.onclosetag(this.sectionStart, this.index);\n this.sectionStart = -1;\n this.state = State.AfterClosingTagName;\n this.stateAfterClosingTagName(c);\n }\n }\n stateAfterClosingTagName(c) {\n // Skip everything until \">\"\n if (c === CharCodes.Gt || this.fastForwardTo(CharCodes.Gt)) {\n this.state = State.Text;\n this.sectionStart = this.index + 1;\n }\n }\n stateBeforeAttributeName(c) {\n if (c === CharCodes.Gt) {\n this.cbs.onopentagend(this.index);\n this.enterTagBody();\n this.sectionStart = this.index + 1;\n }\n else if (c === CharCodes.Slash) {\n this.state = State.InSelfClosingTag;\n }\n else if (!isWhitespace(c)) {\n this.state = State.InAttributeName;\n this.sectionStart = this.index;\n }\n }\n /**\n * Handle `/` before `>` in an opening tag.\n *\n * In HTML mode, text-only tags ignore the self-closing flag and still enter\n * their raw-text/RCDATA/plaintext state unless self-closing tags are being\n * recognized. In XML mode, or for ordinary tags, the tokenizer returns to\n * regular text parsing after emitting the self-closing callback.\n * @param c Current character code point.\n */\n stateInSelfClosingTag(c) {\n if (c === CharCodes.Gt) {\n this.cbs.onselfclosingtag(this.index);\n this.sectionStart = this.index + 1;\n if (!this.recognizeSelfClosing) {\n this.enterTagBody();\n return;\n }\n this.state = State.Text;\n this.isSpecial = false; // Reset special state, in case of self-closing special tags\n this.currentSequence = Sequences.Empty;\n }\n else if (!isWhitespace(c)) {\n this.state = State.BeforeAttributeName;\n this.stateBeforeAttributeName(c);\n }\n }\n stateInAttributeName(c) {\n if (c === CharCodes.Eq || isEndOfTagSection(c)) {\n this.cbs.onattribname(this.sectionStart, this.index);\n this.sectionStart = this.index;\n this.state = State.AfterAttributeName;\n this.stateAfterAttributeName(c);\n }\n }\n stateAfterAttributeName(c) {\n if (c === CharCodes.Eq) {\n this.state = State.BeforeAttributeValue;\n }\n else if (c === CharCodes.Slash || c === CharCodes.Gt) {\n this.cbs.onattribend(QuoteType.NoValue, this.sectionStart);\n this.sectionStart = -1;\n this.state = State.BeforeAttributeName;\n this.stateBeforeAttributeName(c);\n }\n else if (!isWhitespace(c)) {\n this.cbs.onattribend(QuoteType.NoValue, this.sectionStart);\n this.state = State.InAttributeName;\n this.sectionStart = this.index;\n }\n }\n stateBeforeAttributeValue(c) {\n if (c === CharCodes.DoubleQuote) {\n this.state = State.InAttributeValueDq;\n this.sectionStart = this.index + 1;\n }\n else if (c === CharCodes.SingleQuote) {\n this.state = State.InAttributeValueSq;\n this.sectionStart = this.index + 1;\n }\n else if (!isWhitespace(c)) {\n this.sectionStart = this.index;\n this.state = State.InAttributeValueNq;\n this.stateInAttributeValueNoQuotes(c); // Reconsume token\n }\n }\n handleInAttributeValue(c, quote) {\n if (c === quote ||\n (!this.decodeEntities && this.fastForwardTo(quote))) {\n this.cbs.onattribdata(this.sectionStart, this.index);\n this.sectionStart = -1;\n this.cbs.onattribend(quote === CharCodes.DoubleQuote\n ? QuoteType.Double\n : QuoteType.Single, this.index + 1);\n this.state = State.BeforeAttributeName;\n }\n else if (this.decodeEntities && c === CharCodes.Amp) {\n this.startEntity();\n }\n }\n stateInAttributeValueDoubleQuotes(c) {\n this.handleInAttributeValue(c, CharCodes.DoubleQuote);\n }\n stateInAttributeValueSingleQuotes(c) {\n this.handleInAttributeValue(c, CharCodes.SingleQuote);\n }\n stateInAttributeValueNoQuotes(c) {\n if (isWhitespace(c) || c === CharCodes.Gt) {\n this.cbs.onattribdata(this.sectionStart, this.index);\n this.sectionStart = -1;\n this.cbs.onattribend(QuoteType.Unquoted, this.index);\n this.state = State.BeforeAttributeName;\n this.stateBeforeAttributeName(c);\n }\n else if (this.decodeEntities && c === CharCodes.Amp) {\n this.startEntity();\n }\n }\n /**\n * Distinguish between CDATA, declarations, HTML comments, and HTML bogus\n * comments after `<!`.\n *\n * In HTML mode, only real comments and doctypes stay on declaration paths;\n * everything else becomes a bogus comment terminated by the next `>`.\n * @param c Current character code point.\n */\n stateBeforeDeclaration(c) {\n if (c === CharCodes.OpeningSquareBracket) {\n this.state = State.CDATASequence;\n this.sequenceIndex = 0;\n }\n else if (this.xmlMode) {\n this.state =\n c === CharCodes.Dash\n ? State.BeforeComment\n : State.InDeclaration;\n }\n else if ((c | 0x20) === Sequences.Doctype[0]) {\n this.state = State.DeclarationSequence;\n this.currentSequence = Sequences.Doctype;\n this.sequenceIndex = 1;\n }\n else if (c === CharCodes.Gt) {\n this.cbs.oncomment(this.sectionStart, this.index, 0);\n this.state = State.Text;\n this.sectionStart = this.index + 1;\n }\n else if (c === CharCodes.Dash) {\n this.state = State.BeforeComment;\n }\n else {\n this.state = State.InSpecialComment;\n }\n }\n /**\n * Continue matching `doctype` after `<!d`.\n *\n * A full `doctype` match stays on the declaration path; any other name falls\n * back to an HTML bogus comment, which matches browser behavior for\n * non-doctype `<!...>` constructs.\n * @param c Current character code point.\n */\n stateDeclarationSequence(c) {\n if (this.sequenceIndex === this.currentSequence.length) {\n this.state = State.InDeclaration;\n this.stateInDeclaration(c);\n }\n else if ((c | 0x20) === this.currentSequence[this.sequenceIndex]) {\n this.sequenceIndex += 1;\n }\n else if (c === CharCodes.Gt) {\n this.cbs.oncomment(this.sectionStart, this.index, 0);\n this.state = State.Text;\n this.sectionStart = this.index + 1;\n }\n else {\n this.state = State.InSpecialComment;\n }\n }\n stateInDeclaration(c) {\n if (c === CharCodes.Gt || this.fastForwardTo(CharCodes.Gt)) {\n this.cbs.ondeclaration(this.sectionStart, this.index);\n this.state = State.Text;\n this.sectionStart = this.index + 1;\n }\n }\n /**\n * XML processing instructions (`<?...?>`).\n *\n * In HTML mode `<?` is routed to `InSpecialComment` instead, so this\n * state is only reachable in XML mode.\n * @param c Current character code point.\n */\n stateInProcessingInstruction(c) {\n if (c === CharCodes.Questionmark) {\n // Remember that we just consumed `?`, so the next `>` closes the PI.\n this.sequenceIndex = 1;\n }\n else if (c === CharCodes.Gt && this.sequenceIndex === 1) {\n this.cbs.onprocessinginstruction(this.sectionStart, this.index - 1);\n this.sequenceIndex = 0;\n this.state = State.Text;\n this.sectionStart = this.index + 1;\n }\n else {\n // Keep scanning for the next `?`, which can start a closing `?>`.\n this.sequenceIndex = Number(this.fastForwardTo(CharCodes.Questionmark));\n }\n }\n stateBeforeComment(c) {\n if (c === CharCodes.Dash) {\n this.state = State.InCommentLike;\n this.currentSequence = Sequences.CommentEnd;\n this.sequenceIndex = 0;\n this.sectionStart = this.index + 1;\n }\n else if (this.xmlMode) {\n this.state = State.InDeclaration;\n }\n else if (c === CharCodes.Gt) {\n this.cbs.oncomment(this.sectionStart, this.index, 0);\n this.state = State.Text;\n this.sectionStart = this.index + 1;\n }\n else {\n this.state = State.InSpecialComment;\n }\n }\n stateInSpecialComment(c) {\n if (c === CharCodes.Gt || this.fastForwardTo(CharCodes.Gt)) {\n this.cbs.oncomment(this.sectionStart, this.index, 0);\n this.state = State.Text;\n this.sectionStart = this.index + 1;\n }\n }\n startEntity() {\n this.baseState = this.state;\n this.state = State.InEntity;\n this.entityStart = this.index;\n this.entityDecoder.startEntity(this.xmlMode\n ? DecodingMode.Strict\n : this.baseState === State.Text ||\n this.baseState === State.InSpecialTag\n ? DecodingMode.Legacy\n : DecodingMode.Attribute);\n }\n stateInEntity() {\n const indexInBuffer = this.index - this.offset;\n const length = this.entityDecoder.write(this.buffer, indexInBuffer);\n // If `length` is positive, we are done with the entity.\n if (length >= 0) {\n this.state = this.baseState;\n if (length === 0) {\n this.index -= 1;\n }\n }\n else {\n if (indexInBuffer < this.buffer.length &&\n this.buffer.charCodeAt(indexInBuffer) === CharCodes.Amp) {\n this.state = this.baseState;\n this.index -= 1;\n return;\n }\n // Mark buffer as consumed.\n this.index = this.offset + this.buffer.length - 1;\n }\n }\n /**\n * Remove data that has already been consumed from the buffer.\n */\n cleanup() {\n // If we are inside of text or attributes, emit what we already have.\n if (this.running && this.sectionStart !== this.index) {\n if (this.state === State.Text ||\n this.state === State.InPlainText ||\n (this.state === State.InSpecialTag && this.sequenceIndex === 0)) {\n this.cbs.ontext(this.sectionStart, this.index);\n this.sectionStart = this.index;\n }\n else if (this.state === State.InAttributeValueDq ||\n this.state === State.InAttributeValueSq ||\n this.state === State.InAttributeValueNq) {\n this.cbs.onattribdata(this.sectionStart, this.index);\n this.sectionStart = this.index;\n }\n }\n }\n shouldContinue() {\n return this.index < this.buffer.length + this.offset && this.running;\n }\n /**\n * Iterates through the buffer, calling the function corresponding to the current state.\n *\n * States that are more likely to be hit are higher up, as a performance improvement.\n */\n parse() {\n while (this.shouldContinue()) {\n const c = this.buffer.charCodeAt(this.index - this.offset);\n switch (this.state) {\n case State.Text: {\n this.stateText(c);\n break;\n }\n case State.InPlainText: {\n // Skip to end of buffer; cleanup() emits the text.\n this.index = this.buffer.length + this.offset - 1;\n break;\n }\n case State.SpecialStartSequence: {\n this.stateSpecialStartSequence(c);\n break;\n }\n case State.InSpecialTag: {\n this.stateInSpecialTag(c);\n break;\n }\n case State.CDATASequence: {\n this.stateCDATASequence(c);\n break;\n }\n case State.DeclarationSequence: {\n this.stateDeclarationSequence(c);\n break;\n }\n case State.InAttributeValueDq: {\n this.stateInAttributeValueDoubleQuotes(c);\n break;\n }\n case State.InAttributeName: {\n this.stateInAttributeName(c);\n break;\n }\n case State.InCommentLike: {\n this.stateInCommentLike(c);\n break;\n }\n case State.InSpecialComment: {\n this.stateInSpecialComment(c);\n break;\n }\n case State.BeforeAttributeName: {\n this.stateBeforeAttributeName(c);\n break;\n }\n case State.InTagName: {\n this.stateInTagName(c);\n break;\n }\n case State.InClosingTagName: {\n this.stateInClosingTagName(c);\n break;\n }\n case State.BeforeTagName: {\n this.stateBeforeTagName(c);\n break;\n }\n case State.AfterAttributeName: {\n this.stateAfterAttributeName(c);\n break;\n }\n case State.InAttributeValueSq: {\n this.stateInAttributeValueSingleQuotes(c);\n break;\n }\n case State.BeforeAttributeValue: {\n this.stateBeforeAttributeValue(c);\n break;\n }\n case State.BeforeClosingTagName: {\n this.stateBeforeClosingTagName(c);\n break;\n }\n case State.AfterClosingTagName: {\n this.stateAfterClosingTagName(c);\n break;\n }\n case State.InAttributeValueNq: {\n this.stateInAttributeValueNoQuotes(c);\n break;\n }\n case State.InSelfClosingTag: {\n this.stateInSelfClosingTag(c);\n break;\n }\n case State.InDeclaration: {\n this.stateInDeclaration(c);\n break;\n }\n case State.BeforeDeclaration: {\n this.stateBeforeDeclaration(c);\n break;\n }\n case State.BeforeComment: {\n this.stateBeforeComment(c);\n break;\n }\n case State.InProcessingInstruction: {\n this.stateInProcessingInstruction(c);\n break;\n }\n case State.InEntity: {\n this.stateInEntity();\n break;\n }\n }\n this.index++;\n }\n this.cleanup();\n }\n finish() {\n if (this.state === State.InEntity) {\n this.entityDecoder.end();\n this.state = this.baseState;\n }\n this.handleTrailingData();\n this.cbs.onend();\n }\n handleTrailingCommentLikeData(endIndex) {\n if (this.state !== State.InCommentLike) {\n return false;\n }\n if (this.currentSequence === Sequences.CdataEnd) {\n if (this.xmlMode) {\n if (this.sectionStart < endIndex) {\n this.cbs.oncdata(this.sectionStart, endIndex, 0);\n }\n }\n else {\n /* In HTML mode, unclosed CDATA is a bogus comment. */\n const cdataStart = this.sectionStart - Sequences.Cdata.length - 1;\n this.cbs.oncomment(cdataStart, endIndex, 0);\n }\n }\n else {\n const offset = this.xmlMode\n ? 0\n : Math.min(this.sequenceIndex, Sequences.CommentEnd.length - 1);\n this.cbs.oncomment(this.sectionStart, endIndex, offset);\n }\n return true;\n }\n handleTrailingMarkupDeclaration(endIndex) {\n if (this.xmlMode) {\n switch (this.state) {\n case State.InSpecialComment:\n case State.BeforeComment:\n case State.CDATASequence:\n case State.DeclarationSequence:\n case State.InDeclaration: {\n this.cbs.ontext(this.sectionStart, endIndex);\n return true;\n }\n default: {\n return false;\n }\n }\n }\n switch (this.state) {\n case State.BeforeDeclaration:\n case State.InSpecialComment:\n case State.BeforeComment:\n case State.CDATASequence: {\n this.cbs.oncomment(this.sectionStart, endIndex, 0);\n return true;\n }\n case State.DeclarationSequence: {\n if (this.sequenceIndex !== Sequences.Doctype.length) {\n this.cbs.oncomment(this.sectionStart, endIndex, 0);\n }\n return true;\n }\n case State.InDeclaration: {\n return true;\n }\n default: {\n return false;\n }\n }\n }\n /** Handle any trailing data. */\n handleTrailingData() {\n const endIndex = this.buffer.length + this.offset;\n if (this.handleTrailingCommentLikeData(endIndex) ||\n this.handleTrailingMarkupDeclaration(endIndex)) {\n return;\n }\n // If there is no remaining data, we are done.\n if (this.sectionStart >= endIndex) {\n return;\n }\n switch (this.state) {\n case State.InTagName:\n case State.BeforeAttributeName:\n case State.BeforeAttributeValue:\n case State.AfterAttributeName:\n case State.InAttributeName:\n case State.InAttributeValueSq:\n case State.InAttributeValueDq:\n case State.InAttributeValueNq:\n case State.InClosingTagName: {\n /*\n * If we are currently in an opening or closing tag, us not calling the\n * respective callback signals that the tag should be ignored.\n */\n break;\n }\n default: {\n this.cbs.ontext(this.sectionStart, endIndex);\n }\n }\n }\n emitCodePoint(cp, consumed) {\n if (this.baseState !== State.Text &&\n this.baseState !== State.InSpecialTag) {\n if (this.sectionStart < this.entityStart) {\n this.cbs.onattribdata(this.sectionStart, this.entityStart);\n }\n this.sectionStart = this.entityStart + consumed;\n this.index = this.sectionStart - 1;\n this.cbs.onattribentity(cp);\n }\n else {\n if (this.sectionStart < this.entityStart) {\n this.cbs.ontext(this.sectionStart, this.entityStart);\n }\n this.sectionStart = this.entityStart + consumed;\n this.index = this.sectionStart - 1;\n this.cbs.ontextentity(cp, this.sectionStart);\n }\n }\n}\n//# sourceMappingURL=Tokenizer.js.map","const { fromCodePoint } = String;\nimport Tokenizer, { QuoteType } from \"./Tokenizer.js\";\nconst formTags = new Set([\n \"input\",\n \"option\",\n \"optgroup\",\n \"select\",\n \"button\",\n \"datalist\",\n \"textarea\",\n]);\nconst pTag = new Set([\"p\"]);\nconst headingTags = new Set([\"h1\", \"h2\", \"h3\", \"h4\", \"h5\", \"h6\", \"p\"]);\nconst tableSectionTags = new Set([\"thead\", \"tbody\"]);\nconst ddtTags = new Set([\"dd\", \"dt\"]);\nconst rtpTags = new Set([\"rt\", \"rp\"]);\nconst openImpliesClose = new Map([\n [\"tr\", new Set([\"tr\", \"th\", \"td\"])],\n [\"th\", new Set([\"th\"])],\n [\"td\", new Set([\"thead\", \"th\", \"td\"])],\n [\"body\", new Set([\"head\", \"link\", \"script\"])],\n [\"a\", new Set([\"a\"])],\n [\"li\", new Set([\"li\"])],\n [\"p\", pTag],\n [\"h1\", headingTags],\n [\"h2\", headingTags],\n [\"h3\", headingTags],\n [\"h4\", headingTags],\n [\"h5\", headingTags],\n [\"h6\", headingTags],\n [\"select\", formTags],\n [\"input\", formTags],\n [\"output\", formTags],\n [\"button\", formTags],\n [\"datalist\", formTags],\n [\"textarea\", formTags],\n [\"option\", new Set([\"option\"])],\n [\"optgroup\", new Set([\"optgroup\", \"option\"])],\n [\"dd\", ddtTags],\n [\"dt\", ddtTags],\n [\"address\", pTag],\n [\"article\", pTag],\n [\"aside\", pTag],\n [\"blockquote\", pTag],\n [\"details\", pTag],\n [\"div\", pTag],\n [\"dl\", pTag],\n [\"fieldset\", pTag],\n [\"figcaption\", pTag],\n [\"figure\", pTag],\n [\"footer\", pTag],\n [\"form\", pTag],\n [\"header\", pTag],\n [\"hr\", pTag],\n [\"main\", pTag],\n [\"nav\", pTag],\n [\"ol\", pTag],\n [\"pre\", pTag],\n [\"section\", pTag],\n [\"table\", pTag],\n [\"ul\", pTag],\n [\"rt\", rtpTags],\n [\"rp\", rtpTags],\n [\"tbody\", tableSectionTags],\n [\"tfoot\", tableSectionTags],\n]);\nconst DOCUMENT_TYPE = \"doctype\";\nconst voidElements = new Set([\n \"area\",\n \"base\",\n \"basefont\",\n \"br\",\n \"col\",\n \"command\",\n \"embed\",\n \"frame\",\n \"hr\",\n \"img\",\n \"input\",\n \"isindex\",\n \"keygen\",\n \"link\",\n \"meta\",\n \"param\",\n \"source\",\n \"track\",\n \"wbr\",\n]);\nconst foreignContextElements = new Set([\"math\", \"svg\"]);\n/**\n * Elements that can be used to integrate HTML content within foreign namespaces (e.g., SVG or MathML).\n *\n * Entries must use the SVG-adjusted casing (e.g. \"foreignObject\" not\n * \"foreignobject\") since they are compared against adjusted tag names.\n */\nconst htmlIntegrationElements = new Set([\n \"mi\",\n \"mo\",\n \"mn\",\n \"ms\",\n \"mtext\",\n \"annotation-xml\",\n \"foreignObject\",\n \"desc\",\n \"title\",\n]);\nconst svgTagNameAdjustments = new Map([\n [\"altglyph\", \"altGlyph\"],\n [\"altglyphdef\", \"altGlyphDef\"],\n [\"altglyphitem\", \"altGlyphItem\"],\n [\"animatecolor\", \"animateColor\"],\n [\"animatemotion\", \"animateMotion\"],\n [\"animatetransform\", \"animateTransform\"],\n [\"clippath\", \"clipPath\"],\n [\"feblend\", \"feBlend\"],\n [\"fecolormatrix\", \"feColorMatrix\"],\n [\"fecomponenttransfer\", \"feComponentTransfer\"],\n [\"fecomposite\", \"feComposite\"],\n [\"feconvolvematrix\", \"feConvolveMatrix\"],\n [\"fediffuselighting\", \"feDiffuseLighting\"],\n [\"fedisplacementmap\", \"feDisplacementMap\"],\n [\"fedistantlight\", \"feDistantLight\"],\n [\"fedropshadow\", \"feDropShadow\"],\n [\"feflood\", \"feFlood\"],\n [\"fefunca\", \"feFuncA\"],\n [\"fefuncb\", \"feFuncB\"],\n [\"fefuncg\", \"feFuncG\"],\n [\"fefuncr\", \"feFuncR\"],\n [\"fegaussianblur\", \"feGaussianBlur\"],\n [\"feimage\", \"feImage\"],\n [\"femerge\", \"feMerge\"],\n [\"femergenode\", \"feMergeNode\"],\n [\"femorphology\", \"feMorphology\"],\n [\"feoffset\", \"feOffset\"],\n [\"fepointlight\", \"fePointLight\"],\n [\"fespecularlighting\", \"feSpecularLighting\"],\n [\"fespotlight\", \"feSpotLight\"],\n [\"fetile\", \"feTile\"],\n [\"feturbulence\", \"feTurbulence\"],\n [\"foreignobject\", \"foreignObject\"],\n [\"glyphref\", \"glyphRef\"],\n [\"lineargradient\", \"linearGradient\"],\n [\"radialgradient\", \"radialGradient\"],\n [\"textpath\", \"textPath\"],\n]);\nvar ForeignContext;\n(function (ForeignContext) {\n ForeignContext[ForeignContext[\"None\"] = 0] = \"None\";\n ForeignContext[ForeignContext[\"Svg\"] = 1] = \"Svg\";\n ForeignContext[ForeignContext[\"MathML\"] = 2] = \"MathML\";\n})(ForeignContext || (ForeignContext = {}));\nconst reNameEnd = /\\s|\\//;\n/**\n * Incremental parser implementation.\n */\nexport class Parser {\n options;\n /** The start index of the last event. */\n startIndex = 0;\n /** The end index of the last event. */\n endIndex = 0;\n /**\n * Store the start index of the current open tag,\n * so we can update the start index for attributes.\n */\n openTagStart = 0;\n tagname = \"\";\n attribname = \"\";\n attribvalue = \"\";\n attribs = null;\n stack = [];\n foreignContext;\n cbs;\n lowerCaseTagNames;\n lowerCaseAttributeNames;\n recognizeSelfClosing;\n /** We are parsing HTML. Inverse of the `xmlMode` option. */\n htmlMode;\n tokenizer;\n buffers = [];\n bufferOffset = 0;\n /** The index of the last written buffer. Used when resuming after a `pause()`. */\n writeIndex = 0;\n /** Indicates whether the parser has finished running / `.end` has been called. */\n ended = false;\n constructor(cbs, options = {}) {\n this.options = options;\n this.cbs = cbs ?? {};\n this.htmlMode = !this.options.xmlMode;\n this.lowerCaseTagNames = options.lowerCaseTags ?? this.htmlMode;\n this.lowerCaseAttributeNames =\n options.lowerCaseAttributeNames ?? this.htmlMode;\n this.recognizeSelfClosing =\n options.recognizeSelfClosing ?? !this.htmlMode;\n this.tokenizer = new (options.Tokenizer ?? Tokenizer)(this.options, this);\n this.foreignContext = [ForeignContext.None];\n this.cbs.onparserinit?.(this);\n }\n // Tokenizer event handlers\n /**\n * @param start Start index for the current parser event.\n * @param endIndex End index for the current parser event.\n * @internal\n */\n ontext(start, endIndex) {\n const data = this.getSlice(start, endIndex);\n this.endIndex = endIndex - 1;\n this.cbs.ontext?.(data);\n this.startIndex = endIndex;\n }\n /**\n * @param cp Current Unicode code point.\n * @param endIndex End index for the current parser event.\n * @internal\n */\n ontextentity(cp, endIndex) {\n this.endIndex = endIndex - 1;\n this.cbs.ontext?.(fromCodePoint(cp));\n this.startIndex = endIndex;\n }\n /** @internal */\n isInForeignContext() {\n return this.foreignContext[0] !== ForeignContext.None;\n }\n /**\n * Checks if the current tag is a void element. Override this if you want\n * to specify your own additional void elements.\n * @param name Name of the pseudo selector.\n */\n isVoidElement(name) {\n return this.htmlMode && voidElements.has(name);\n }\n /**\n * Read a tag name from the buffer.\n *\n * When `lowerCaseTagNames` is enabled (the default in HTML mode), the name\n * is lowercased and may be adjusted for SVG casing or the `image` → `img`\n * alias.\n * @param start Start index of the tag name in the buffer.\n * @param endIndex End index of the tag name in the buffer.\n */\n readTagName(start, endIndex) {\n const name = this.lowerCaseTagNames\n ? this.getSlice(start, endIndex).toLowerCase()\n : this.getSlice(start, endIndex);\n if (!(this.lowerCaseTagNames && this.htmlMode)) {\n return name;\n }\n if (this.foreignContext[0] === ForeignContext.Svg) {\n return svgTagNameAdjustments.get(name) ?? name;\n }\n /*\n * Closing tags for SVG elements inside HTML integration points\n * (e.g. </foreignObject> while inside its own content) need case\n * adjustment so the name matches what was pushed to the stack.\n * `foreignContext.length > 1` means a foreign ancestor exists —\n * the base [None] entry plus at least one pushed context.\n */\n if (this.foreignContext.length > 1) {\n const adjusted = svgTagNameAdjustments.get(name);\n if (adjusted !== undefined && this.stack.includes(adjusted)) {\n return adjusted;\n }\n }\n if (!this.isInForeignContext()) {\n return name === \"image\" ? \"img\" : name;\n }\n return name;\n }\n /**\n * @param start Start index for the current parser event.\n * @param endIndex End index for the current parser event.\n * @internal\n */\n onopentagname(start, endIndex) {\n this.endIndex = endIndex;\n this.emitOpenTag(this.readTagName(start, endIndex));\n }\n emitOpenTag(name) {\n this.openTagStart = this.startIndex;\n this.tagname = name;\n /*\n * The spec ignores a second <form> when one is already open.\n * Setting tagname to \"\" suppresses all downstream effects: attribs\n * stays null so endOpenTag is a no-op, and closeCurrentTag can't\n * match \"\" on the stack.\n */\n if (this.htmlMode && name === \"form\" && this.stack.includes(\"form\")) {\n this.tagname = \"\";\n return;\n }\n const impliesClose = this.htmlMode && openImpliesClose.get(name);\n if (impliesClose) {\n while (this.stack.length > 0 && impliesClose.has(this.stack[0])) {\n this.popElement(true);\n }\n }\n if (!this.isVoidElement(name)) {\n this.stack.unshift(name);\n if (this.htmlMode) {\n if (name === \"svg\") {\n this.foreignContext.unshift(ForeignContext.Svg);\n }\n else if (name === \"math\") {\n this.foreignContext.unshift(ForeignContext.MathML);\n }\n else if (htmlIntegrationElements.has(name)) {\n this.foreignContext.unshift(ForeignContext.None);\n }\n }\n }\n this.cbs.onopentagname?.(name);\n if (this.cbs.onopentag)\n this.attribs = {};\n }\n endOpenTag(isImplied) {\n this.startIndex = this.openTagStart;\n if (this.attribs) {\n this.cbs.onopentag?.(this.tagname, this.attribs, isImplied);\n this.attribs = null;\n }\n if (this.cbs.onclosetag && this.isVoidElement(this.tagname)) {\n this.cbs.onclosetag(this.tagname, true);\n }\n this.tagname = \"\";\n }\n /**\n * @param endIndex End index for the current parser event.\n * @internal\n */\n onopentagend(endIndex) {\n this.endIndex = endIndex;\n this.endOpenTag(false);\n // Set `startIndex` for next node\n this.startIndex = endIndex + 1;\n }\n /**\n * @param start Start index for the current parser event.\n * @param endIndex End index for the current parser event.\n * @internal\n */\n onclosetag(start, endIndex) {\n this.endIndex = endIndex;\n const name = this.readTagName(start, endIndex);\n if (!this.isVoidElement(name)) {\n const pos = this.stack.indexOf(name);\n if (pos !== -1) {\n for (let index = 0; index < pos; index++) {\n this.popElement(true);\n }\n this.popElement(false);\n }\n else if (this.htmlMode && name === \"p\") {\n // Implicit open before close\n this.emitOpenTag(\"p\");\n this.closeCurrentTag(true);\n }\n }\n else if (this.htmlMode && name === \"br\") {\n // We can't use `emitOpenTag` for implicit open, as `br` would be implicitly closed.\n this.cbs.onopentagname?.(\"br\");\n this.cbs.onopentag?.(\"br\", {}, true);\n this.cbs.onclosetag?.(\"br\", false);\n }\n // Set `startIndex` for next node\n this.startIndex = endIndex + 1;\n }\n /**\n * @param endIndex End index for the current parser event.\n * @internal\n */\n onselfclosingtag(endIndex) {\n this.endIndex = endIndex;\n if (this.recognizeSelfClosing || this.isInForeignContext()) {\n this.closeCurrentTag(false);\n // Set `startIndex` for next node\n this.startIndex = endIndex + 1;\n }\n else {\n // Ignore the fact that the tag is self-closing.\n this.onopentagend(endIndex);\n }\n }\n /**\n * Pop the top element off the stack, emit a close event, and maintain\n * the foreign context stack.\n * @param implied Whether this close is implied (not from an explicit end tag).\n */\n popElement(implied) {\n // biome-ignore lint/style/noNonNullAssertion: The element is guaranteed to exist.\n const element = this.stack.shift();\n if (this.htmlMode &&\n (foreignContextElements.has(element) ||\n htmlIntegrationElements.has(element))) {\n this.foreignContext.shift();\n }\n this.cbs.onclosetag?.(element, implied);\n }\n closeCurrentTag(isOpenImplied) {\n const name = this.tagname;\n this.endOpenTag(isOpenImplied);\n // Self-closing tags will be on the top of the stack\n if (this.stack[0] === name) {\n this.popElement(!isOpenImplied);\n }\n }\n /**\n * @param start Start index for the current parser event.\n * @param endIndex End index for the current parser event.\n * @internal\n */\n onattribname(start, endIndex) {\n this.startIndex = start;\n const name = this.getSlice(start, endIndex);\n this.attribname = this.lowerCaseAttributeNames\n ? name.toLowerCase()\n : name;\n }\n /**\n * @param start Start index for the current parser event.\n * @param endIndex End index for the current parser event.\n * @internal\n */\n onattribdata(start, endIndex) {\n this.attribvalue += this.getSlice(start, endIndex);\n }\n /**\n * @param cp Current Unicode code point.\n * @internal\n */\n onattribentity(cp) {\n this.attribvalue += fromCodePoint(cp);\n }\n /**\n * @param quote Quote type used for the current attribute.\n * @param endIndex End index for the current parser event.\n * @internal\n */\n onattribend(quote, endIndex) {\n this.endIndex = endIndex;\n this.cbs.onattribute?.(this.attribname, this.attribvalue, quote === QuoteType.Double\n ? '\"'\n : quote === QuoteType.Single\n ? \"'\"\n : quote === QuoteType.NoValue\n ? undefined\n : null);\n if (this.attribs && !Object.hasOwn(this.attribs, this.attribname)) {\n this.attribs[this.attribname] = this.attribvalue;\n }\n this.attribvalue = \"\";\n }\n getInstructionName(value) {\n const index = value.search(reNameEnd);\n let name = index < 0 ? value : value.substr(0, index);\n if (this.lowerCaseTagNames) {\n name = name.toLowerCase();\n }\n return name;\n }\n /**\n * @param start Start index for the current parser event.\n * @param endIndex End index for the current parser event.\n * @internal\n */\n ondeclaration(start, endIndex) {\n this.endIndex = endIndex;\n const value = this.getSlice(start, endIndex);\n if (this.cbs.onprocessinginstruction) {\n /*\n * In HTML mode, ondeclaration is only reached for DOCTYPE\n * (the tokenizer routes everything else to bogus comments).\n */\n const name = this.htmlMode\n ? this.lowerCaseTagNames\n ? DOCUMENT_TYPE\n : value.slice(0, DOCUMENT_TYPE.length)\n : this.getInstructionName(value);\n this.cbs.onprocessinginstruction(`!${name}`, `!${value}`);\n }\n // Set `startIndex` for next node\n this.startIndex = endIndex + 1;\n }\n /**\n * @param start Start index for the current parser event.\n * @param endIndex End index for the current parser event.\n * @internal\n */\n onprocessinginstruction(start, endIndex) {\n this.endIndex = endIndex;\n const value = this.getSlice(start, endIndex);\n if (this.cbs.onprocessinginstruction) {\n const name = this.getInstructionName(value);\n this.cbs.onprocessinginstruction(`?${name}`, `?${value}`);\n }\n // Set `startIndex` for next node\n this.startIndex = endIndex + 1;\n }\n /**\n * @param start Start index for the current parser event.\n * @param endIndex End index for the current parser event.\n * @param offset Offset applied when computing parser indices.\n * @internal\n */\n oncomment(start, endIndex, offset) {\n this.endIndex = endIndex;\n this.cbs.oncomment?.(this.getSlice(start, endIndex - offset));\n this.cbs.oncommentend?.();\n // Set `startIndex` for next node\n this.startIndex = endIndex + 1;\n }\n /**\n * @param start Start index for the current parser event.\n * @param endIndex End index for the current parser event.\n * @param offset Offset applied when computing parser indices.\n * @internal\n */\n oncdata(start, endIndex, offset) {\n this.endIndex = endIndex;\n const value = this.getSlice(start, endIndex - offset);\n if (!this.htmlMode || this.options.recognizeCDATA) {\n this.cbs.oncdatastart?.();\n this.cbs.ontext?.(value);\n this.cbs.oncdataend?.();\n }\n else if (this.isInForeignContext()) {\n this.cbs.ontext?.(value);\n }\n else {\n this.cbs.oncomment?.(`[CDATA[${value}]]`);\n this.cbs.oncommentend?.();\n }\n // Set `startIndex` for next node\n this.startIndex = endIndex + 1;\n }\n /** @internal */\n onend() {\n if (this.cbs.onclosetag) {\n // Set the end index for all remaining tags\n this.endIndex = this.startIndex;\n for (let index = 0; index < this.stack.length; index++) {\n this.cbs.onclosetag(this.stack[index], true);\n }\n }\n this.cbs.onend?.();\n }\n /**\n * Resets the parser to a blank state, ready to parse a new HTML document\n */\n reset() {\n this.cbs.onreset?.();\n this.tokenizer.reset();\n this.tagname = \"\";\n this.attribname = \"\";\n this.attribvalue = \"\";\n this.attribs = null;\n this.stack.length = 0;\n this.startIndex = 0;\n this.endIndex = 0;\n this.cbs.onparserinit?.(this);\n this.buffers.length = 0;\n this.foreignContext.length = 0;\n this.foreignContext.unshift(ForeignContext.None);\n this.bufferOffset = 0;\n this.writeIndex = 0;\n this.ended = false;\n }\n /**\n * Resets the parser, then parses a complete document and\n * pushes it to the handler.\n * @param data Document to parse.\n */\n parseComplete(data) {\n this.reset();\n this.end(data);\n }\n getSlice(start, end) {\n if (start === end) {\n return \"\";\n }\n while (start - this.bufferOffset >= this.buffers[0].length) {\n this.shiftBuffer();\n }\n let slice = this.buffers[0].slice(start - this.bufferOffset, end - this.bufferOffset);\n while (end - this.bufferOffset > this.buffers[0].length) {\n this.shiftBuffer();\n slice += this.buffers[0].slice(0, end - this.bufferOffset);\n }\n return slice;\n }\n shiftBuffer() {\n this.bufferOffset += this.buffers[0].length;\n this.writeIndex--;\n this.buffers.shift();\n }\n /**\n * Parses a chunk of data and calls the corresponding callbacks.\n * @param chunk Chunk to parse.\n */\n write(chunk) {\n if (this.ended) {\n this.cbs.onerror?.(new Error(\".write() after done!\"));\n return;\n }\n this.buffers.push(chunk);\n if (this.tokenizer.running) {\n this.tokenizer.write(chunk);\n this.writeIndex++;\n }\n }\n /**\n * Parses the end of the buffer and clears the stack, calls onend.\n * @param chunk Optional final chunk to parse.\n */\n end(chunk) {\n if (this.ended) {\n this.cbs.onerror?.(new Error(\".end() after done!\"));\n return;\n }\n if (chunk)\n this.write(chunk);\n this.ended = true;\n this.tokenizer.end();\n }\n /**\n * Pauses parsing. The parser won't emit events until `resume` is called.\n */\n pause() {\n this.tokenizer.pause();\n }\n /**\n * Resumes parsing after `pause` was called.\n */\n resume() {\n this.tokenizer.resume();\n while (this.tokenizer.running &&\n this.writeIndex < this.buffers.length) {\n this.tokenizer.write(this.buffers[this.writeIndex++]);\n }\n if (this.ended)\n this.tokenizer.end();\n }\n}\n//# sourceMappingURL=Parser.js.map","/** Types of elements found in htmlparser2's DOM */\nexport var ElementType;\n(function (ElementType) {\n /** Type for the root element of a document */\n ElementType[\"Root\"] = \"root\";\n /** Type for Text */\n ElementType[\"Text\"] = \"text\";\n /** Type for <? ... ?> */\n ElementType[\"Directive\"] = \"directive\";\n /** Type for <!-- ... --> */\n ElementType[\"Comment\"] = \"comment\";\n /** Type for <script> tags */\n ElementType[\"Script\"] = \"script\";\n /** Type for <style> tags */\n ElementType[\"Style\"] = \"style\";\n /** Type for Any tag */\n ElementType[\"Tag\"] = \"tag\";\n /** Type for <![CDATA[ ... ]]> */\n ElementType[\"CDATA\"] = \"cdata\";\n /** Type for <!doctype ...> */\n ElementType[\"Doctype\"] = \"doctype\";\n})(ElementType || (ElementType = {}));\n/**\n * Tests whether an element is a tag or not.\n * @param element Element to test\n * @param element.type Node type discriminator to check.\n */\nexport function isTag(element) {\n return (element.type === ElementType.Tag ||\n element.type === ElementType.Script ||\n element.type === ElementType.Style);\n}\n// Exports for backwards compatibility\n/** Type for the root element of a document */\n// eslint-disable-next-line prefer-destructuring\nexport const Root = ElementType.Root;\n/** Type for Text */\n// eslint-disable-next-line prefer-destructuring\nexport const Text = ElementType.Text;\n/** Type for <? ... ?> */\n// eslint-disable-next-line prefer-destructuring\nexport const Directive = ElementType.Directive;\n/** Type for <!-- ... --> */\n// eslint-disable-next-line prefer-destructuring\nexport const Comment = ElementType.Comment;\n/** Type for <script> tags */\n// eslint-disable-next-line prefer-destructuring\nexport const Script = ElementType.Script;\n/** Type for <style> tags */\n// eslint-disable-next-line prefer-destructuring\nexport const Style = ElementType.Style;\n/** Type for Any tag */\n// eslint-disable-next-line prefer-destructuring\nexport const Tag = ElementType.Tag;\n/** Type for <![CDATA[ ... ]]> */\n// eslint-disable-next-line prefer-destructuring\nexport const CDATA = ElementType.CDATA;\n/** Type for <!doctype ...> */\n// eslint-disable-next-line prefer-destructuring\nexport const Doctype = ElementType.Doctype;\n","import { ElementType, isTag as isTagRaw } from \"domelementtype\";\n/**\n * This object will be used as the prototype for Nodes when creating a\n * DOM-Level-1-compliant structure.\n */\nexport class Node {\n /** Parent of the node */\n parent = null;\n /** Previous sibling */\n prev = null;\n /** Next sibling */\n next = null;\n /** The start index of the node. Requires `withStartIndices` on the handler to be `true. */\n startIndex = null;\n /** The end index of the node. Requires `withEndIndices` on the handler to be `true. */\n endIndex = null;\n // Read-write aliases for properties\n /**\n * Same as {@link parent}.\n * [DOM spec](https://dom.spec.whatwg.org)-compatible alias.\n */\n get parentNode() {\n return this.parent;\n }\n set parentNode(parent) {\n this.parent = parent;\n }\n /**\n * Same as {@link prev}.\n * [DOM spec](https://dom.spec.whatwg.org)-compatible alias.\n */\n get previousSibling() {\n return this.prev;\n }\n set previousSibling(previous) {\n this.prev = previous;\n }\n /**\n * Same as {@link next}.\n * [DOM spec](https://dom.spec.whatwg.org)-compatible alias.\n */\n get nextSibling() {\n return this.next;\n }\n set nextSibling(next) {\n this.next = next;\n }\n /**\n * Clone this node, and optionally its children.\n * @param recursive Clone child nodes as well.\n * @returns A clone of the node.\n */\n cloneNode(recursive = false) {\n return cloneNode(this, recursive);\n }\n}\n/**\n * A node that contains some data.\n */\nexport class DataNode extends Node {\n data;\n /**\n * @param data The content of the data node\n */\n constructor(data) {\n super();\n this.data = data;\n }\n /**\n * Same as {@link data}.\n * [DOM spec](https://dom.spec.whatwg.org)-compatible alias.\n */\n get nodeValue() {\n return this.data;\n }\n set nodeValue(data) {\n this.data = data;\n }\n}\n/**\n * Text within the document.\n */\nexport class Text extends DataNode {\n type = ElementType.Text;\n get nodeType() {\n return 3;\n }\n}\n/**\n * Comments within the document.\n */\nexport class Comment extends DataNode {\n type = ElementType.Comment;\n get nodeType() {\n return 8;\n }\n}\n/**\n * Processing instructions, including doc types.\n */\nexport class ProcessingInstruction extends DataNode {\n type = ElementType.Directive;\n name;\n constructor(name, data) {\n super(data);\n this.name = name;\n }\n get nodeType() {\n return 1;\n }\n /** If this is a doctype, the document type name (parse5 only). */\n \"x-name\";\n /** If this is a doctype, the document type public identifier (parse5 only). */\n \"x-publicId\";\n /** If this is a doctype, the document type system identifier (parse5 only). */\n \"x-systemId\";\n}\n/**\n * A node that can have children.\n */\nexport class NodeWithChildren extends Node {\n children;\n /**\n * @param children Children of the node. Only certain node types can have children.\n */\n constructor(children) {\n super();\n this.children = children;\n }\n // Aliases\n /** First child of the node. */\n get firstChild() {\n return this.children[0] ?? null;\n }\n /** Last child of the node. */\n get lastChild() {\n return this.children.length > 0\n ? this.children[this.children.length - 1]\n : null;\n }\n /**\n * Same as {@link children}.\n * [DOM spec](https://dom.spec.whatwg.org)-compatible alias.\n */\n get childNodes() {\n return this.children;\n }\n set childNodes(children) {\n this.children = children;\n }\n}\n/**\n * CDATA nodes.\n */\nexport class CDATA extends NodeWithChildren {\n type = ElementType.CDATA;\n get nodeType() {\n return 4;\n }\n}\n/**\n * The root node of the document.\n */\nexport class Document extends NodeWithChildren {\n type = ElementType.Root;\n get nodeType() {\n return 9;\n }\n}\n/**\n * An element within the DOM.\n */\nexport class Element extends NodeWithChildren {\n name;\n attribs;\n type;\n /**\n * @param name Name of the tag, eg. `div`, `span`.\n * @param attribs Object mapping attribute names to attribute values.\n * @param children Children of the node.\n * @param type Node type used for the new node instance.\n */\n constructor(name, attribs, children = [], type = name === \"script\"\n ? ElementType.Script\n : name === \"style\"\n ? ElementType.Style\n : ElementType.Tag) {\n super(children);\n this.name = name;\n this.attribs = attribs;\n this.type = type;\n }\n get nodeType() {\n return 1;\n }\n // DOM Level 1 aliases\n /**\n * Same as {@link name}.\n * [DOM spec](https://dom.spec.whatwg.org)-compatible alias.\n */\n get tagName() {\n return this.name;\n }\n set tagName(name) {\n this.name = name;\n }\n get attributes() {\n return Object.keys(this.attribs).map((name) => ({\n name,\n value: this.attribs[name],\n namespace: this[\"x-attribsNamespace\"]?.[name],\n prefix: this[\"x-attribsPrefix\"]?.[name],\n }));\n }\n /** Element namespace (parse5 only). */\n namespace;\n /** Element attribute namespaces (parse5 only). */\n \"x-attribsNamespace\";\n /** Element attribute namespace-related prefixes (parse5 only). */\n \"x-attribsPrefix\";\n}\n/**\n * Checks if `node` is an element node.\n * @param node Node to check.\n * @returns `true` if the node is an element node.\n */\nexport function isTag(node) {\n return isTagRaw(node);\n}\n/**\n * Checks if `node` is a CDATA node.\n * @param node Node to check.\n * @returns `true` if the node is a CDATA node.\n */\nexport function isCDATA(node) {\n return node.type === ElementType.CDATA;\n}\n/**\n * Checks if `node` is a text node.\n * @param node Node to check.\n * @returns `true` if the node is a text node.\n */\nexport function isText(node) {\n return node.type === ElementType.Text;\n}\n/**\n * Checks if `node` is a comment node.\n * @param node Node to check.\n * @returns `true` if the node is a comment node.\n */\nexport function isComment(node) {\n return node.type === ElementType.Comment;\n}\n/**\n * Checks if `node` is a directive node.\n * @param node Node to check.\n * @returns `true` if the node is a directive node.\n */\nexport function isDirective(node) {\n return node.type === ElementType.Directive;\n}\n/**\n * Checks if `node` is a document node.\n * @param node Node to check.\n * @returns `true` if the node is a document node.\n */\nexport function isDocument(node) {\n return node.type === ElementType.Root;\n}\n/**\n * Checks if `node` has children.\n * @param node Node to check.\n * @returns `true` if the node has children.\n */\nexport function hasChildren(node) {\n return Object.hasOwn(node, \"children\");\n}\n/**\n * Clone a node, and optionally its children.\n * @param node Node to clone.\n * @param recursive Clone child nodes as well.\n * @returns A clone of the node.\n */\nexport function cloneNode(node, recursive = false) {\n let result;\n if (isText(node)) {\n result = new Text(node.data);\n }\n else if (isComment(node)) {\n result = new Comment(node.data);\n }\n else if (isTag(node)) {\n const children = recursive ? cloneChildren(node.children) : [];\n const clone = new Element(node.name, { ...node.attribs }, children);\n for (const child of children) {\n child.parent = clone;\n }\n if (node.namespace != null) {\n clone.namespace = node.namespace;\n }\n if (node[\"x-attribsNamespace\"]) {\n clone[\"x-attribsNamespace\"] = { ...node[\"x-attribsNamespace\"] };\n }\n if (node[\"x-attribsPrefix\"]) {\n clone[\"x-attribsPrefix\"] = { ...node[\"x-attribsPrefix\"] };\n }\n result = clone;\n }\n else if (isCDATA(node)) {\n const children = recursive ? cloneChildren(node.children) : [];\n const clone = new CDATA(children);\n for (const child of children) {\n child.parent = clone;\n }\n result = clone;\n }\n else if (isDocument(node)) {\n const children = recursive ? cloneChildren(node.children) : [];\n const clone = new Document(children);\n for (const child of children) {\n child.parent = clone;\n }\n if (node[\"x-mode\"]) {\n clone[\"x-mode\"] = node[\"x-mode\"];\n }\n result = clone;\n }\n else if (isDirective(node)) {\n const instruction = new ProcessingInstruction(node.name, node.data);\n if (node[\"x-name\"] != null) {\n instruction[\"x-name\"] = node[\"x-name\"];\n instruction[\"x-publicId\"] = node[\"x-publicId\"];\n instruction[\"x-systemId\"] = node[\"x-systemId\"];\n }\n result = instruction;\n }\n else {\n throw new Error(`Not implemented yet: ${node.type}`);\n }\n result.startIndex = node.startIndex;\n result.endIndex = node.endIndex;\n if (node.sourceCodeLocation != null) {\n result.sourceCodeLocation = node.sourceCodeLocation;\n }\n return result;\n}\n/**\n * Clone a list of child nodes.\n * @param childs The child nodes to clone.\n * @returns A list of cloned child nodes.\n */\nfunction cloneChildren(childs) {\n const children = childs.map((child) => cloneNode(child, true));\n for (let index = 1; index < children.length; index++) {\n children[index].prev = children[index - 1];\n children[index - 1].next = children[index];\n }\n return children;\n}\n","import { ElementType } from \"domelementtype\";\nimport { CDATA, Comment, Document, Element, ProcessingInstruction, Text, } from \"./node.js\";\nexport * from \"./node.js\";\n// Default options\nconst defaultOptions = {\n withStartIndices: false,\n withEndIndices: false,\n xmlMode: false,\n};\n/**\n * Event-based handler that builds a DOM tree from parser callbacks.\n */\nexport class DomHandler {\n /** The elements of the DOM */\n dom = [];\n /** The root element for the DOM */\n root = new Document(this.dom);\n /** Called once parsing has completed. */\n callback;\n /** Settings for the handler. */\n options;\n /** Callback whenever a tag is closed. */\n elementCB;\n /** Indicated whether parsing has been completed. */\n done = false;\n /** Stack of open tags. */\n tagStack = [this.root];\n /** A data node that is still being written to. */\n lastNode = null;\n /** Reference to the parser instance. Used for location information. */\n parser = null;\n /**\n * @param callback Called once parsing has completed.\n * @param options Settings for the handler.\n * @param elementCB Callback whenever a tag is closed.\n */\n constructor(callback, options, elementCB) {\n // Make it possible to skip arguments, for backwards-compatibility\n if (typeof options === \"function\") {\n elementCB = options;\n options = defaultOptions;\n }\n if (typeof callback === \"object\") {\n options = callback;\n callback = undefined;\n }\n this.callback = callback ?? null;\n this.options = options ?? defaultOptions;\n this.elementCB = elementCB ?? null;\n }\n onparserinit(parser) {\n this.parser = parser;\n }\n // Resets the handler back to starting state\n onreset() {\n this.dom = [];\n this.root = new Document(this.dom);\n this.done = false;\n this.tagStack = [this.root];\n this.lastNode = null;\n this.parser = null;\n }\n // Signals the handler that parsing is done\n onend() {\n if (this.done)\n return;\n this.done = true;\n this.parser = null;\n this.handleCallback(null);\n }\n onerror(error) {\n this.handleCallback(error);\n }\n onclosetag() {\n this.lastNode = null;\n const element = this.tagStack.pop();\n if (this.options.withEndIndices && this.parser) {\n element.endIndex = this.parser.endIndex;\n }\n if (this.elementCB)\n this.elementCB(element);\n }\n onopentag(name, attribs) {\n const type = this.options.xmlMode ? ElementType.Tag : undefined;\n const element = new Element(name, attribs, undefined, type);\n this.addNode(element);\n this.tagStack.push(element);\n }\n ontext(data) {\n const { lastNode } = this;\n if (lastNode && lastNode.type === ElementType.Text) {\n lastNode.data += data;\n if (this.options.withEndIndices && this.parser) {\n lastNode.endIndex = this.parser.endIndex;\n }\n }\n else {\n const node = new Text(data);\n this.addNode(node);\n this.lastNode = node;\n }\n }\n oncomment(data) {\n if (this.lastNode && this.lastNode.type === ElementType.Comment) {\n this.lastNode.data += data;\n return;\n }\n const node = new Comment(data);\n this.addNode(node);\n this.lastNode = node;\n }\n oncommentend() {\n this.lastNode = null;\n }\n oncdatastart() {\n const text = new Text(\"\");\n const node = new CDATA([text]);\n this.addNode(node);\n text.parent = node;\n this.lastNode = text;\n }\n oncdataend() {\n this.lastNode = null;\n }\n onprocessinginstruction(name, data) {\n const node = new ProcessingInstruction(name, data);\n this.addNode(node);\n }\n handleCallback(error) {\n if (typeof this.callback === \"function\") {\n this.callback(error, this.dom);\n }\n else if (error) {\n throw error;\n }\n }\n addNode(node) {\n const parent = this.tagStack[this.tagStack.length - 1];\n const previousSibling = parent.children[parent.children.length - 1];\n if (this.options.withStartIndices && this.parser) {\n node.startIndex = this.parser.startIndex;\n }\n if (this.options.withEndIndices && this.parser) {\n node.endIndex = this.parser.endIndex;\n }\n parent.children.push(node);\n if (previousSibling) {\n node.prev = previousSibling;\n previousSibling.next = node;\n }\n node.parent = parent;\n this.lastNode = null;\n }\n}\nexport default DomHandler;\n","import { Parser } from \"./Parser.js\";\nexport { Parser } from \"./Parser.js\";\nimport { DomHandler, } from \"domhandler\";\nexport { DomHandler, \n// Old name for DomHandler\nDomHandler as DefaultHandler, } from \"domhandler\";\n// Helper methods\n/**\n * Parses the data, returns the resulting document.\n * @param data The data that should be parsed.\n * @param options Optional options for the parser and DOM handler.\n */\nexport function parseDocument(data, options) {\n const handler = new DomHandler(undefined, options);\n new Parser(handler, options).end(data);\n return handler.root;\n}\n/**\n * Creates a parser instance, with an attached DOM handler.\n * @param callback A callback that will be called once parsing has been completed, with the resulting document.\n * @param options Optional options for the parser and DOM handler.\n * @param elementCallback An optional callback that will be called every time a tag has been completed inside of the DOM.\n */\nexport function createDocumentStream(callback, options, elementCallback) {\n const handler = new DomHandler((error) => callback(error, handler.root), options, elementCallback);\n return new Parser(handler, options);\n}\n/*\n * All of the following exports exist for backwards-compatibility.\n * They should probably be removed eventually.\n */\nexport * as ElementType from \"domelementtype\";\nexport { default as Tokenizer, QuoteType, } from \"./Tokenizer.js\";\nimport { getFeed } from \"domutils\";\nexport { getFeed } from \"domutils\";\nconst parseFeedDefaultOptions = { xmlMode: true };\n/**\n * Parse a feed.\n * @param feed The feed that should be parsed, as a string.\n * @param options Optionally, options for parsing. When using this, you should set `xmlMode` to `true`.\n */\nexport function parseFeed(feed, options = parseFeedDefaultOptions) {\n return getFeed(parseDocument(feed, options).children);\n}\nexport * as DomUtils from \"domutils\";\n//# sourceMappingURL=index.js.map","import type { HeadlessComponentDefinition } from '../host'\nimport type { HeadlessProjectDescriptor } from '../project'\nimport type { HeadlessComponentInstance } from './componentInstance'\nimport type { HeadlessModuleLoader } from './moduleLoader'\nimport type { HeadlessPageInstance } from './pageInstance'\nimport fs from 'node:fs'\nimport path from 'node:path'\nimport { parseDocument } from 'htmlparser2'\nimport {\n cloneValue,\n createComponentInstance,\n normalizeComponentPropertyValue,\n runComponentLifecycle,\n runComponentObservers,\n} from './componentInstance'\n\ninterface DomNodeLike {\n attribs?: Record<string, string>\n children?: DomNodeLike[]\n data?: string\n name?: string\n parent?: DomNodeLike | null\n type?: string\n}\n\ninterface RuntimeRenderScope {\n alias?: string\n classList?: string[]\n data: Record<string, any>\n dataset?: Record<string, string>\n eventBindings?: Map<string, { method: string, stopAfter: boolean }>\n getMethod: (methodName: string) => ((...args: any[]) => any) | undefined\n getScopeId: () => string\n hostId?: string\n listenerScopeId?: string\n id?: string\n ownerScopeId?: string\n}\n\ninterface RuntimeComponentRegistryEntry {\n definition: HeadlessComponentDefinition\n filePath: string\n templatePath: string\n}\n\nexport interface RuntimeRenderedPageTree {\n root: DomNodeLike\n wxml: string\n}\n\nexport interface RuntimeRendererContext {\n changedPageKeys: string[]\n componentCache: Map<string, HeadlessComponentInstance>\n componentScopes: Map<string, RuntimeRenderScope>\n moduleLoader: HeadlessModuleLoader\n project: HeadlessProjectDescriptor\n session: {\n selectAllComponentsWithin: (scopeId: string, selector: string) => any[]\n selectComponentWithin: (scopeId: string, selector: string) => any\n selectOwnerComponent: (scopeId: string) => any\n }\n}\n\nconst LEADING_SLASH_RE = /^\\/+/\nconst TEMPLATE_INTERPOLATION_RE = /\\{\\{([^{}]+)\\}\\}/g\nconst EVENT_BINDING_ATTRS = ['bindtap', 'bind:tap', 'catchtap', 'catch:tap']\nconst COMPONENT_EVENT_PREFIXES = ['bind:', 'bind', 'catch:', 'catch']\nconst STRUCTURAL_ATTRS = ['wx:if', 'wx:elif', 'wx:else', 'wx:for', 'wx:for-item', 'wx:for-index', 'wx:key']\nconst WX_ELSE_ATTRS = new Set(['wx:elif', 'wx:else'])\nconst DATASET_NAME_RE = /-([a-z])/g\nconst BRACKET_INDEX_RE = /\\[(\\d+)\\]/g\nconst CLASS_SPLIT_RE = /\\s+/\nconst JS_FILE_RE = /\\.js$/\n\nfunction isMustacheOnly(value: string) {\n const trimmed = value.trim()\n return trimmed.startsWith('{{') && trimmed.endsWith('}}') && !trimmed.includes('{{', 2)\n}\n\nfunction toDatasetKey(attributeName: string) {\n return attributeName\n .slice('data-'.length)\n .replace(DATASET_NAME_RE, (_match, char: string) => char.toUpperCase())\n}\n\nfunction collectDataset(node: DomNodeLike) {\n const dataset: Record<string, string> = {}\n for (const [key, value] of Object.entries(node.attribs ?? {})) {\n if (!key.startsWith('data-') || key === 'data-sim-scope' || key === 'data-sim-tap' || key === 'data-sim-component') {\n continue\n }\n dataset[toDatasetKey(key)] = String(value)\n }\n return dataset\n}\n\nfunction escapeText(text: string) {\n return text\n .replaceAll('&', '&')\n .replaceAll('<', '<')\n .replaceAll('>', '>')\n}\n\nfunction escapeAttribute(value: string) {\n return escapeText(value).replaceAll('\"', '"')\n}\n\nfunction cloneNode(node: DomNodeLike): DomNodeLike {\n return {\n ...node,\n attribs: node.attribs ? { ...node.attribs } : undefined,\n children: node.children?.map(child => cloneNode(child)),\n }\n}\n\nfunction parseExpressionSegments(expression: string) {\n return expression\n .replace(BRACKET_INDEX_RE, '.$1')\n .split('.')\n .map(segment => segment.trim())\n .filter(Boolean)\n}\n\nfunction unwrapMustacheExpression(expression: string) {\n const normalized = expression.trim()\n if (isMustacheOnly(normalized)) {\n return normalized.slice(2, -2).trim()\n }\n return normalized\n}\n\nfunction resolveLiteralValue(expression: string) {\n if (expression === 'true') {\n return true\n }\n if (expression === 'false') {\n return false\n }\n if (expression === 'null') {\n return null\n }\n if (expression === 'undefined') {\n return undefined\n }\n if ((expression.startsWith('\"') && expression.endsWith('\"')) || (expression.startsWith('\\'') && expression.endsWith('\\''))) {\n return expression.slice(1, -1)\n }\n const numericValue = Number(expression)\n if (!Number.isNaN(numericValue) && expression !== '') {\n return numericValue\n }\n return undefined\n}\n\nfunction resolveValueByExpression(source: Record<string, any>, expression: string): unknown {\n const normalized = unwrapMustacheExpression(expression)\n if (!normalized) {\n return undefined\n }\n\n if (normalized.startsWith('!')) {\n return !resolveValueByExpression(source, normalized.slice(1))\n }\n\n const literalValue = resolveLiteralValue(normalized)\n if (literalValue !== undefined || normalized === 'undefined') {\n return literalValue\n }\n\n const segments = parseExpressionSegments(normalized)\n let current: any = source\n for (const segment of segments) {\n current = current?.[segment]\n }\n return current\n}\n\nfunction resolveValueByPath(source: Record<string, any>, expression: string) {\n return resolveValueByExpression(source, expression) ?? ''\n}\n\nfunction resolveRawValueByPath(source: Record<string, any>, expression: string) {\n return resolveValueByExpression(source, expression)\n}\n\nfunction interpolateTemplate(input: string, data: Record<string, any>) {\n return input.replace(TEMPLATE_INTERPOLATION_RE, (_match, expression: string) => {\n const value = resolveValueByPath(data, expression)\n return typeof value === 'string' ? value : String(value)\n })\n}\n\nfunction readTemplateSource(filePath: string) {\n return fs.readFileSync(filePath, 'utf8')\n}\n\nfunction parseTemplateDocument(templateSource: string) {\n return parseDocument(`<page>${templateSource}</page>`, {\n xmlMode: false,\n decodeEntities: false,\n recognizeSelfClosing: true,\n }) as unknown as DomNodeLike\n}\n\nfunction serializeDomNode(node: DomNodeLike): string {\n if (node.type === 'text') {\n return escapeText(node.data ?? '')\n }\n\n if (node.type === 'root') {\n return (node.children ?? []).map(serializeDomNode).join('')\n }\n\n const tagName = node.name ?? ''\n if (!tagName) {\n return (node.children ?? []).map(serializeDomNode).join('')\n }\n\n const attrs = Object.entries(node.attribs ?? {})\n .map(([key, value]) => ` ${key}=\"${escapeAttribute(value)}\"`)\n .join('')\n const children = (node.children ?? []).map(serializeDomNode).join('')\n return `<${tagName}${attrs}>${children}</${tagName}>`\n}\n\nfunction isTagNode(node: DomNodeLike): node is DomNodeLike & { name: string, type: string } {\n return node.type === 'tag' && typeof node.name === 'string'\n}\n\nfunction isIgnorableTextNode(node: DomNodeLike) {\n return node.type === 'text' && typeof node.data === 'string' && node.data.trim() === ''\n}\n\nfunction resolveAttributeValue(value: string, scope: RuntimeRenderScope) {\n if (isMustacheOnly(value)) {\n const expression = value.trim().slice(2, -2)\n return resolveValueByPath(scope.data, expression)\n }\n return interpolateTemplate(value, scope.data)\n}\n\nfunction resolveComponentAttributeValue(value: string, scope: RuntimeRenderScope) {\n if (isMustacheOnly(value)) {\n const expression = value.trim().slice(2, -2)\n return resolveRawValueByPath(scope.data, expression)\n }\n return interpolateTemplate(value, scope.data)\n}\n\nfunction resolveUsingComponents(\n ownerJsonPath: string,\n ownerFilePath: string,\n) {\n try {\n const parsed = JSON.parse(fs.readFileSync(ownerJsonPath, 'utf8')) as Record<string, any>\n const usingComponents = parsed.usingComponents\n if (!usingComponents || typeof usingComponents !== 'object' || Array.isArray(usingComponents)) {\n return new Map<string, string>()\n }\n\n const resolved = new Map<string, string>()\n for (const [alias, rawPath] of Object.entries(usingComponents)) {\n if (typeof rawPath !== 'string') {\n continue\n }\n const basePath = rawPath.startsWith('/')\n ? rawPath.replace(LEADING_SLASH_RE, '')\n : path.posix.normalize(path.posix.join(path.posix.dirname(ownerFilePath), rawPath))\n resolved.set(alias, basePath.replace(LEADING_SLASH_RE, ''))\n }\n return resolved\n }\n catch {\n return new Map<string, string>()\n }\n}\n\nfunction resolveComponentRegistryEntry(\n context: RuntimeRendererContext,\n ownerJsonPath: string,\n ownerFilePath: string,\n alias: string,\n) {\n const usingComponents = resolveUsingComponents(ownerJsonPath, ownerFilePath)\n const componentBasePath = usingComponents.get(alias)\n if (!componentBasePath) {\n return null\n }\n\n const filePath = `${componentBasePath}.js`\n const templatePath = `${componentBasePath}.wxml`\n const absoluteFilePath = path.resolve(context.project.miniprogramRootPath, filePath)\n const absoluteTemplatePath = path.resolve(context.project.miniprogramRootPath, templatePath)\n const definition = context.moduleLoader.executeComponentModule(absoluteFilePath, componentBasePath)\n return {\n definition,\n filePath,\n templatePath,\n absoluteTemplatePath,\n } satisfies RuntimeComponentRegistryEntry & { absoluteTemplatePath: string }\n}\n\nfunction collectComponentEventBindings(hostNode: DomNodeLike) {\n const eventBindings = new Map<string, { method: string, stopAfter: boolean }>()\n for (const [key, value] of Object.entries(hostNode.attribs ?? {})) {\n const matchedPrefix = COMPONENT_EVENT_PREFIXES.find(prefix => key.startsWith(prefix))\n if (!matchedPrefix) {\n continue\n }\n const eventName = key.slice(matchedPrefix.length)\n if (!eventName) {\n continue\n }\n eventBindings.set(eventName, {\n method: value,\n stopAfter: matchedPrefix.startsWith('catch'),\n })\n }\n\n return eventBindings\n}\n\nfunction buildComponentTrigger(\n componentScopeId: string,\n context: RuntimeRendererContext,\n hostNode: DomNodeLike,\n) {\n const hostDataset = collectDataset(hostNode)\n const hostId = hostNode.attribs?.id ?? ''\n\n return (\n instance: HeadlessComponentInstance,\n eventName: string,\n detail?: unknown,\n triggerOptions?: Record<string, any>,\n ) => {\n const interactionTarget = instance.__lastInteractionEvent__?.target\n const interactionCurrentTarget = instance.__lastInteractionEvent__?.currentTarget\n const interactionMark = instance.__lastInteractionEvent__?.mark\n const target = {\n dataset: interactionTarget?.dataset ?? hostDataset,\n id: interactionTarget?.id ?? hostId,\n }\n let currentScopeId: string | undefined = componentScopeId\n\n while (currentScopeId) {\n const currentScope = context.componentScopes.get(currentScopeId)\n const binding = currentScope?.eventBindings?.get(eventName)\n const listenerScope = currentScope?.listenerScopeId\n ? context.componentScopes.get(currentScope.listenerScopeId)\n : null\n const handler = binding && listenerScope\n ? listenerScope.getMethod(binding.method)\n : undefined\n\n if (handler) {\n handler({\n bubbles: triggerOptions?.bubbles ?? false,\n capturePhase: false,\n composed: triggerOptions?.composed ?? false,\n currentTarget: {\n dataset: currentScope?.dataset ?? interactionCurrentTarget?.dataset ?? hostDataset,\n id: currentScope?.hostId ?? interactionCurrentTarget?.id ?? hostId,\n },\n detail,\n mark: interactionMark,\n target,\n type: eventName,\n })\n }\n\n if (binding?.stopAfter) {\n break\n }\n if (!triggerOptions?.bubbles || !triggerOptions?.composed) {\n break\n }\n currentScopeId = currentScope?.ownerScopeId\n }\n }\n}\n\nfunction applyNodeBindings(node: DomNodeLike, scope: RuntimeRenderScope) {\n if (!isTagNode(node)) {\n if (node.type === 'text' && typeof node.data === 'string') {\n node.data = interpolateTemplate(node.data, scope.data)\n }\n return\n }\n\n node.attribs ??= {}\n node.attribs['data-sim-scope'] = scope.getScopeId()\n\n for (const key of STRUCTURAL_ATTRS) {\n delete node.attribs[key]\n }\n\n for (const [key, value] of Object.entries({ ...node.attribs })) {\n if (EVENT_BINDING_ATTRS.includes(key)) {\n node.attribs['data-sim-tap'] = value\n continue\n }\n node.attribs[key] = typeof value === 'string'\n ? String(resolveAttributeValue(value, scope))\n : String(value)\n }\n}\n\nfunction syncComponentProperties(\n instance: HeadlessComponentInstance,\n definition: HeadlessComponentDefinition,\n nextProperties: Record<string, any>,\n bindingExpressions: Record<string, string | undefined>,\n changedPageKeys: string[],\n) {\n const changedRootKeys: string[] = []\n const previousProperties: Record<string, any> = {}\n for (const [key, value] of Object.entries(nextProperties)) {\n const nextValue = normalizeComponentPropertyValue(definition, key, value)\n const bindingExpression = bindingExpressions[key]\n const bindingAffected = !!bindingExpression && changedPageKeys.some((changedKey) => {\n return changedKey === bindingExpression\n || changedKey.startsWith(`${bindingExpression}.`)\n || changedKey.startsWith(`${bindingExpression}[`)\n })\n const previousSnapshot = instance.__propertySnapshots?.[key]\n const deepChanged = bindingAffected && JSON.stringify(previousSnapshot) !== JSON.stringify(nextValue)\n if (instance.properties[key] !== nextValue || deepChanged) {\n previousProperties[key] = instance.properties[key]\n instance.properties[key] = nextValue\n changedRootKeys.push(key)\n }\n instance.__propertySnapshots ??= {}\n instance.__propertySnapshots[key] = cloneValue(nextValue)\n }\n\n if (changedRootKeys.length === 0) {\n return\n }\n\n runComponentObservers(definition, instance, changedRootKeys, previousProperties)\n}\n\nfunction createMergedScopeData(\n pageData: Record<string, any>,\n componentProperties: Record<string, any>,\n componentData: Record<string, any>,\n) {\n return {\n ...pageData,\n ...componentProperties,\n ...componentData,\n }\n}\n\nfunction isTruthy(value: unknown) {\n return Boolean(value)\n}\n\nfunction createLoopScope(scope: RuntimeRenderScope, itemName: string, indexName: string, item: unknown, index: number): RuntimeRenderScope {\n return {\n ...scope,\n data: {\n ...scope.data,\n [indexName]: index,\n [itemName]: item,\n },\n }\n}\n\nfunction evaluateConditionalBranch(node: DomNodeLike, scope: RuntimeRenderScope) {\n const condition = node.attribs?.['wx:if'] ?? node.attribs?.['wx:elif']\n if (condition == null) {\n return true\n }\n return isTruthy(resolveRawValueByPath(scope.data, condition))\n}\n\nfunction expandNodeByFor(node: DomNodeLike, scope: RuntimeRenderScope) {\n const forExpression = node.attribs?.['wx:for']\n if (!forExpression) {\n return [{ node, scope, instanceSuffix: '' }]\n }\n\n const list = resolveRawValueByPath(scope.data, forExpression)\n const items = Array.isArray(list) ? list : []\n const itemName = node.attribs?.['wx:for-item']?.trim() || 'item'\n const indexName = node.attribs?.['wx:for-index']?.trim() || 'index'\n\n return items.map((item, index) => ({\n node: cloneNode(node),\n scope: createLoopScope(scope, itemName, indexName, item, index),\n instanceSuffix: `:for-${index}`,\n }))\n}\n\nfunction renderNodeVariants(\n node: DomNodeLike,\n scope: RuntimeRenderScope,\n context: RuntimeRendererContext,\n ownerJsonPath: string,\n ownerFilePath: string,\n instancePath: string,\n seenComponentScopes: Set<string>,\n) {\n // eslint-disable-next-line ts/no-use-before-define\n return expandNodeByFor(node, scope).map(({ node: expandedNode, scope: expandedScope, instanceSuffix }) => renderNodeTree(\n expandedNode,\n expandedScope,\n context,\n ownerJsonPath,\n ownerFilePath,\n `${instancePath}${instanceSuffix}`,\n seenComponentScopes,\n ))\n}\n\nfunction renderChildren(\n children: DomNodeLike[],\n scope: RuntimeRenderScope,\n context: RuntimeRendererContext,\n ownerJsonPath: string,\n ownerFilePath: string,\n instancePath: string,\n seenComponentScopes: Set<string>,\n) {\n const renderedChildren: DomNodeLike[] = []\n\n for (let index = 0; index < children.length; index += 1) {\n const child = children[index]!\n if (!isTagNode(child)) {\n renderedChildren.push(...renderNodeVariants(\n child,\n scope,\n context,\n ownerJsonPath,\n ownerFilePath,\n `${instancePath}/node-${index}`,\n seenComponentScopes,\n ))\n continue\n }\n\n const hasConditional = child.attribs?.['wx:if'] != null\n const isElseBranch = child.attribs?.['wx:elif'] != null || child.attribs?.['wx:else'] != null\n\n if (hasConditional) {\n let branchMatched = false\n let cursor = index\n while (cursor < children.length) {\n const branch = children[cursor]!\n if (cursor !== index && isIgnorableTextNode(branch)) {\n cursor += 1\n continue\n }\n if (!isTagNode(branch)) {\n break\n }\n if (cursor !== index && !WX_ELSE_ATTRS.has(Object.keys(branch.attribs ?? {}).find(key => key.startsWith('wx:')) ?? '')) {\n break\n }\n\n const isElseOnly = branch.attribs?.['wx:else'] != null\n const shouldRender = isElseOnly ? !branchMatched : (!branchMatched && evaluateConditionalBranch(branch, scope))\n if (shouldRender) {\n renderedChildren.push(...renderNodeVariants(\n branch,\n scope,\n context,\n ownerJsonPath,\n ownerFilePath,\n `${instancePath}/node-${cursor}`,\n seenComponentScopes,\n ))\n branchMatched = true\n }\n\n let nextBranchIndex = cursor + 1\n while (nextBranchIndex < children.length && isIgnorableTextNode(children[nextBranchIndex]!)) {\n nextBranchIndex += 1\n }\n const nextBranch = children[nextBranchIndex]\n const hasNextElseBranch = !!nextBranch\n && isTagNode(nextBranch)\n && (nextBranch.attribs?.['wx:elif'] != null || nextBranch.attribs?.['wx:else'] != null)\n if (!hasNextElseBranch) {\n break\n }\n cursor = nextBranchIndex\n }\n index = cursor\n continue\n }\n\n if (isElseBranch) {\n continue\n }\n\n renderedChildren.push(...renderNodeVariants(\n child,\n scope,\n context,\n ownerJsonPath,\n ownerFilePath,\n `${instancePath}/node-${index}`,\n seenComponentScopes,\n ))\n }\n\n return renderedChildren\n}\n\nfunction renderNodeTree(\n node: DomNodeLike,\n scope: RuntimeRenderScope,\n context: RuntimeRendererContext,\n ownerJsonPath: string,\n ownerFilePath: string,\n instancePath: string,\n seenComponentScopes: Set<string>,\n): DomNodeLike {\n const clonedNode = cloneNode(node)\n if (!isTagNode(clonedNode)) {\n applyNodeBindings(clonedNode, scope)\n return clonedNode\n }\n\n const componentEntry = resolveComponentRegistryEntry(context, ownerJsonPath, ownerFilePath, clonedNode.name)\n if (componentEntry) {\n const componentScopeId = `${instancePath}/${clonedNode.name}`\n const ownerScopeId = scope.getScopeId().includes('/') ? scope.getScopeId() : undefined\n const nextProperties: Record<string, any> = {}\n const bindingExpressions: Record<string, string | undefined> = {}\n for (const [key, value] of Object.entries(clonedNode.attribs ?? {})) {\n if (key.startsWith('bind')) {\n continue\n }\n if (isMustacheOnly(String(value))) {\n bindingExpressions[key] = String(value).trim().slice(2, -2).trim()\n }\n nextProperties[key] = resolveComponentAttributeValue(String(value), scope)\n }\n\n let componentInstance = context.componentCache.get(componentScopeId)\n if (!componentInstance) {\n componentInstance = createComponentInstance({\n definition: componentEntry.definition,\n properties: nextProperties,\n triggerEvent: buildComponentTrigger(componentScopeId, context, clonedNode),\n })\n componentInstance.selectComponent = (selector: string) => context.session.selectComponentWithin(componentScopeId, selector)\n componentInstance.selectAllComponents = (selector: string) => context.session.selectAllComponentsWithin(componentScopeId, selector)\n componentInstance.selectOwnerComponent = () => ownerScopeId ? context.session.selectOwnerComponent(componentScopeId) : null\n runComponentLifecycle(componentInstance, 'created')\n runComponentObservers(componentInstance.__definition__ ?? componentEntry.definition, componentInstance, Object.keys(nextProperties), {})\n componentInstance.__propertySnapshots = Object.fromEntries(\n Object.entries(componentInstance.properties).map(([key, propertyValue]) => [key, cloneValue(propertyValue)]),\n )\n runComponentLifecycle(componentInstance, 'attached')\n context.componentCache.set(componentScopeId, componentInstance)\n }\n else {\n syncComponentProperties(\n componentInstance,\n componentInstance.__definition__ ?? componentEntry.definition,\n nextProperties,\n bindingExpressions,\n context.changedPageKeys,\n )\n }\n\n seenComponentScopes.add(componentScopeId)\n\n const componentScope: RuntimeRenderScope = {\n alias: clonedNode.name,\n classList: String(clonedNode.attribs?.class ?? '')\n .split(CLASS_SPLIT_RE)\n .map(item => item.trim())\n .filter(Boolean),\n data: createMergedScopeData(scope.data, componentInstance.properties, componentInstance.data),\n dataset: collectDataset(clonedNode),\n eventBindings: collectComponentEventBindings(clonedNode),\n getMethod: (methodName: string) => {\n const method = componentInstance?.[methodName]\n return typeof method === 'function' ? method : undefined\n },\n getScopeId: () => componentScopeId,\n hostId: typeof clonedNode.attribs?.id === 'string' ? clonedNode.attribs.id : undefined,\n id: typeof clonedNode.attribs?.id === 'string' ? clonedNode.attribs.id : undefined,\n listenerScopeId: scope.getScopeId(),\n ownerScopeId,\n }\n context.componentScopes.set(componentScopeId, componentScope)\n\n const componentTemplate = readTemplateSource(componentEntry.absoluteTemplatePath)\n const componentDocument = parseTemplateDocument(componentTemplate)\n const componentRoot = (componentDocument.children ?? [])[0] ?? componentDocument\n const renderedComponentRoot: DomNodeLike = renderNodeTree(\n componentRoot,\n componentScope,\n context,\n path.resolve(context.project.miniprogramRootPath, `${componentEntry.filePath.replace(JS_FILE_RE, '')}.json`),\n componentEntry.filePath,\n componentScopeId,\n seenComponentScopes,\n )\n if (renderedComponentRoot.attribs) {\n renderedComponentRoot.attribs['data-sim-component'] = clonedNode.name\n }\n if (!componentInstance.__ready__) {\n runComponentLifecycle(componentInstance, 'ready')\n componentInstance.__ready__ = true\n componentInstance.__definition__?.pageLifetimes?.show?.call(componentInstance)\n }\n return renderedComponentRoot\n }\n\n applyNodeBindings(clonedNode, scope)\n clonedNode.children = renderChildren(\n clonedNode.children ?? [],\n scope,\n context,\n ownerJsonPath,\n ownerFilePath,\n `${instancePath}/${clonedNode.name}`,\n seenComponentScopes,\n )\n return clonedNode\n}\n\nexport function renderRuntimePageTree(\n context: RuntimeRendererContext,\n page: HeadlessPageInstance,\n): RuntimeRenderedPageTree {\n const route = page.route.replace(LEADING_SLASH_RE, '')\n const templatePath = path.resolve(context.project.miniprogramRootPath, `${route}.wxml`)\n const templateSource = readTemplateSource(templatePath)\n const document = parseTemplateDocument(templateSource)\n const pageScopeId = `page:${route}`\n const pageScope: RuntimeRenderScope = {\n data: page.data,\n getMethod: (methodName: string) => {\n const method = page[methodName]\n return typeof method === 'function' ? method : undefined\n },\n getScopeId: () => pageScopeId,\n id: 'page-root',\n }\n context.componentScopes.clear()\n context.componentScopes.set(pageScopeId, pageScope)\n const seenComponentScopes = new Set<string>()\n const root = (document.children ?? [])[0] ?? document\n const renderedRoot = renderNodeTree(\n root,\n pageScope,\n context,\n path.resolve(context.project.miniprogramRootPath, `${route}.json`),\n `${route}.js`,\n pageScopeId,\n seenComponentScopes,\n )\n\n for (const [scopeId, instance] of [...context.componentCache.entries()]) {\n if (!seenComponentScopes.has(scopeId)) {\n runComponentLifecycle(instance, 'detached')\n context.componentCache.delete(scopeId)\n context.componentScopes.delete(scopeId)\n }\n }\n\n return {\n root: renderedRoot,\n wxml: serializeDomNode(renderedRoot),\n }\n}\n","export interface HeadlessAppDefinition extends Record<string, any> {}\n\nexport interface HeadlessPageDefinition extends Record<string, any> {}\n\nexport interface HeadlessComponentDefinition extends Record<string, any> {}\n\nexport interface HeadlessBehaviorDefinition extends Record<string, any> {\n __isHeadlessBehavior__?: boolean\n}\n\nexport interface HeadlessHostLoadContext {\n kind: 'app' | 'page' | 'component'\n route?: string\n}\n\nexport interface HeadlessHostRegistries {\n appDefinition: HeadlessAppDefinition | null\n components: Map<string, HeadlessComponentDefinition>\n currentLoadContext: HeadlessHostLoadContext | null\n pages: Map<string, HeadlessPageDefinition>\n}\n\nfunction createDuplicateRegistrationError(kind: string, id: string) {\n return new Error(`Duplicate ${kind} registration in headless runtime: ${id}`)\n}\n\nexport function createHostRegistries(): HeadlessHostRegistries {\n return {\n appDefinition: null,\n components: new Map(),\n currentLoadContext: null,\n pages: new Map(),\n }\n}\n\nexport function registerAppDefinition(registries: HeadlessHostRegistries, definition: HeadlessAppDefinition) {\n if (registries.appDefinition) {\n throw createDuplicateRegistrationError('app', 'app')\n }\n registries.appDefinition = definition\n return definition\n}\n\nexport function registerPageDefinition(registries: HeadlessHostRegistries, definition: HeadlessPageDefinition) {\n const route = registries.currentLoadContext?.route\n if (!route) {\n throw new Error('Cannot register Page() without an active page load context in headless runtime.')\n }\n if (registries.pages.has(route)) {\n throw createDuplicateRegistrationError('page', route)\n }\n registries.pages.set(route, definition)\n return definition\n}\n\nexport function registerComponentDefinition(registries: HeadlessHostRegistries, definition: HeadlessComponentDefinition) {\n const id = registries.currentLoadContext?.route ?? `anonymous:${registries.components.size}`\n if (registries.components.has(id)) {\n throw createDuplicateRegistrationError('component', id)\n }\n registries.components.set(id, definition)\n return definition\n}\n","export interface HeadlessWxCallbackOption<TResult = void> {\n complete?: (result?: TResult) => void\n fail?: (error: Error) => void\n success?: (result: TResult) => void\n}\n\nexport interface HeadlessWxNavigateOption extends HeadlessWxCallbackOption {\n url: string\n}\n\nexport interface HeadlessWxNavigateBackOption extends HeadlessWxCallbackOption {\n delta?: number\n}\n\nexport interface HeadlessWxPageScrollToOption extends HeadlessWxCallbackOption {\n duration?: number\n scrollTop?: number\n selector?: string\n}\n\nexport interface HeadlessWxSelectorQueryBoundingClientRectResult {\n bottom: number\n height: number\n left: number\n right: number\n top: number\n width: number\n}\n\nexport interface HeadlessWxSelectorQueryScrollOffsetResult {\n scrollLeft: number\n scrollTop: number\n}\n\nexport interface HeadlessWxSelectorQueryFieldsOption {\n computedStyle?: string[]\n context?: boolean\n dataset?: boolean\n id?: boolean\n mark?: boolean\n node?: boolean\n properties?: string[]\n rect?: boolean\n scrollOffset?: boolean\n size?: boolean\n}\n\nexport interface HeadlessWxSelectorQueryRequest {\n fields: HeadlessWxSelectorQueryFieldsOption\n selector?: string\n single: boolean\n target: 'selector' | 'viewport'\n}\n\nexport interface HeadlessWxSelectorQueryNode {\n boundingClientRect: (callback?: (result: HeadlessWxSelectorQueryBoundingClientRectResult | HeadlessWxSelectorQueryBoundingClientRectResult[] | null) => void) => HeadlessWxSelectorQuery\n fields: (\n fields: HeadlessWxSelectorQueryFieldsOption,\n callback?: (result: Record<string, any> | Record<string, any>[] | null) => void,\n ) => HeadlessWxSelectorQuery\n scrollOffset: (callback?: (result: HeadlessWxSelectorQueryScrollOffsetResult | HeadlessWxSelectorQueryScrollOffsetResult[] | null) => void) => HeadlessWxSelectorQuery\n}\n\nexport interface HeadlessWxSelectorQuery {\n exec: (callback?: (result: unknown[]) => void) => unknown[]\n in: (component: Record<string, any>) => HeadlessWxSelectorQuery\n select: (selector: string) => HeadlessWxSelectorQueryNode\n selectAll: (selector: string) => HeadlessWxSelectorQueryNode\n selectViewport: () => HeadlessWxSelectorQueryNode\n}\n\nexport interface HeadlessWxStorageResult {\n errMsg: string\n}\n\nexport interface HeadlessWxGetStorageResult extends HeadlessWxStorageResult {\n data: unknown\n}\n\nexport interface HeadlessWxStorageInfoResult extends HeadlessWxStorageResult {\n currentSize: number\n keys: string[]\n limitSize: number\n}\n\nexport type HeadlessWxNetworkType = '2g' | '3g' | '4g' | '5g' | 'none' | 'unknown' | 'wifi'\n\nexport interface HeadlessWxGetNetworkTypeResult {\n errMsg: string\n networkType: HeadlessWxNetworkType\n}\n\nexport interface HeadlessWxNetworkStatusChangeResult {\n isConnected: boolean\n networkType: HeadlessWxNetworkType\n}\n\nexport type HeadlessWxNetworkStatusChangeCallback = (result: HeadlessWxNetworkStatusChangeResult) => void\n\nexport interface HeadlessWxSystemInfoResult {\n SDKVersion: string\n brand: string\n language: string\n model: string\n pixelRatio: number\n platform: string\n screenHeight: number\n screenWidth: number\n system: string\n version: string\n windowHeight: number\n windowWidth: number\n}\n\nexport interface HeadlessWxAppBaseInfoResult {\n SDKVersion: string\n enableDebug: boolean\n host: {\n env: string\n }\n language: string\n platform: string\n version: string\n}\n\nexport interface HeadlessWxWindowInfoResult {\n pixelRatio: number\n screenHeight: number\n screenWidth: number\n statusBarHeight: number\n windowHeight: number\n windowWidth: number\n}\n\nexport interface HeadlessWxLaunchOptions {\n path: string\n query: Record<string, string>\n referrerInfo: {\n appId: string\n extraData: Record<string, never>\n }\n scene: number\n}\n\nexport interface HeadlessWxMenuButtonBoundingClientRectResult {\n bottom: number\n height: number\n left: number\n right: number\n top: number\n width: number\n}\n\nexport interface HeadlessWxSetStorageOption extends HeadlessWxCallbackOption<HeadlessWxStorageResult> {\n data: unknown\n key: string\n}\n\nexport interface HeadlessWxGetStorageOption extends HeadlessWxCallbackOption<HeadlessWxGetStorageResult> {\n key: string\n}\n\nexport interface HeadlessWxGetStorageInfoOption extends HeadlessWxCallbackOption<HeadlessWxStorageInfoResult> {}\n\nexport interface HeadlessWxGetNetworkTypeOption extends HeadlessWxCallbackOption<HeadlessWxGetNetworkTypeResult> {}\n\nexport interface HeadlessWxGetSystemInfoOption extends HeadlessWxCallbackOption<HeadlessWxSystemInfoResult> {}\n\nexport interface HeadlessWxGetWindowInfoOption extends HeadlessWxCallbackOption<HeadlessWxWindowInfoResult> {}\n\nexport interface HeadlessWxGetAppBaseInfoOption extends HeadlessWxCallbackOption<HeadlessWxAppBaseInfoResult> {}\n\nexport interface HeadlessWxRemoveStorageOption extends HeadlessWxCallbackOption<HeadlessWxStorageResult> {\n key: string\n}\n\nexport interface HeadlessWxClearStorageOption extends HeadlessWxCallbackOption<HeadlessWxStorageResult> {}\n\nexport interface HeadlessWxHideLoadingOption extends HeadlessWxCallbackOption<{ errMsg: string }> {}\n\nexport interface HeadlessWxSetBackgroundTextStyleOption extends HeadlessWxCallbackOption<{ errMsg: string }> {\n textStyle: string\n}\n\nexport interface HeadlessWxSetBackgroundColorOption extends HeadlessWxCallbackOption<{ errMsg: string }> {\n backgroundColor?: string\n backgroundColorBottom?: string\n backgroundColorTop?: string\n}\n\nexport interface HeadlessWxSetNavigationBarTitleOption extends HeadlessWxCallbackOption<{ errMsg: string }> {\n title: string\n}\n\nexport interface HeadlessWxSetNavigationBarColorOption extends HeadlessWxCallbackOption<{ errMsg: string }> {\n animation?: {\n duration?: number\n timingFunction?: string\n }\n backgroundColor?: string\n frontColor?: string\n}\n\nexport interface HeadlessWxShowNavigationBarLoadingOption extends HeadlessWxCallbackOption<{ errMsg: string }> {}\n\nexport interface HeadlessWxHideNavigationBarLoadingOption extends HeadlessWxCallbackOption<{ errMsg: string }> {}\n\nexport interface HeadlessWxShareMenuOption extends HeadlessWxCallbackOption<{ errMsg: string }> {\n isUpdatableMessage?: boolean\n menus?: string[]\n withShareTicket?: boolean\n}\n\nexport interface HeadlessWxTabBarOption extends HeadlessWxCallbackOption<{ errMsg: string }> {}\n\nexport interface HeadlessWxTabBarItemOption extends HeadlessWxCallbackOption<{ errMsg: string }> {\n index: number\n}\n\nexport interface HeadlessWxSetTabBarBadgeOption extends HeadlessWxTabBarItemOption {\n text: string\n}\n\nexport interface HeadlessWxShowActionSheetResult {\n errMsg: string\n tapIndex: number\n}\n\nexport interface HeadlessWxShowActionSheetOption extends HeadlessWxCallbackOption<HeadlessWxShowActionSheetResult> {\n itemList: string[]\n}\n\nexport interface HeadlessWxShowModalResult {\n cancel: boolean\n confirm: boolean\n errMsg: string\n}\n\nexport interface HeadlessWxShowModalOption extends HeadlessWxCallbackOption<HeadlessWxShowModalResult> {\n cancelColor?: string\n cancelText?: string\n confirmColor?: string\n confirmText?: string\n content: string\n showCancel?: boolean\n title?: string\n}\n\nexport interface HeadlessWxShowToastOption extends HeadlessWxCallbackOption<{ errMsg: string }> {\n duration?: number\n icon?: string\n mask?: boolean\n title: string\n}\n\nexport interface HeadlessWxShowLoadingOption extends HeadlessWxCallbackOption<{ errMsg: string }> {\n mask?: boolean\n title: string\n}\n\nexport interface HeadlessWxRequestSuccessResult {\n cookies: string[]\n data: unknown\n errMsg: string\n header: Record<string, string>\n statusCode: number\n}\n\nexport interface HeadlessWxRequestOption extends HeadlessWxCallbackOption<HeadlessWxRequestSuccessResult> {\n data?: unknown\n header?: Record<string, string>\n method?: string\n url: string\n}\n\nexport interface HeadlessWxRequestTask {\n abort: () => void\n}\n\nexport interface HeadlessWxDownloadFileSuccessResult {\n errMsg: string\n statusCode: number\n tempFilePath: string\n}\n\nexport interface HeadlessWxDownloadFileOption extends HeadlessWxCallbackOption<HeadlessWxDownloadFileSuccessResult> {\n filePath?: string\n header?: Record<string, string>\n url: string\n}\n\nexport interface HeadlessWxUploadFileSuccessResult {\n data: string\n errMsg: string\n statusCode: number\n}\n\nexport interface HeadlessWxUploadFileOption extends HeadlessWxCallbackOption<HeadlessWxUploadFileSuccessResult> {\n fileName?: string\n filePath: string\n formData?: Record<string, unknown>\n header?: Record<string, string>\n name: string\n url: string\n}\n\nexport interface HeadlessWxSaveFileSuccessResult {\n errMsg: string\n savedFilePath: string\n}\n\nexport interface HeadlessWxSaveFileOption extends HeadlessWxCallbackOption<HeadlessWxSaveFileSuccessResult> {\n filePath?: string\n tempFilePath: string\n}\n\nexport interface HeadlessWxSavedFileInfo {\n createTime: number\n filePath: string\n size: number\n}\n\nexport interface HeadlessWxGetSavedFileListSuccessResult {\n errMsg: string\n fileList: HeadlessWxSavedFileInfo[]\n}\n\nexport interface HeadlessWxGetSavedFileListOption extends HeadlessWxCallbackOption<HeadlessWxGetSavedFileListSuccessResult> {}\n\nexport interface HeadlessWxGetSavedFileInfoSuccessResult {\n createTime: number\n errMsg: string\n size: number\n}\n\nexport interface HeadlessWxGetSavedFileInfoOption extends HeadlessWxCallbackOption<HeadlessWxGetSavedFileInfoSuccessResult> {\n filePath: string\n}\n\nexport interface HeadlessWxRemoveSavedFileOption extends HeadlessWxCallbackOption<{ errMsg: string }> {\n filePath: string\n}\n\nexport interface HeadlessWxFileSystemResult {\n errMsg: string\n}\n\nexport interface HeadlessWxReadFileSuccessResult {\n data: string\n errMsg: string\n}\n\nexport interface HeadlessWxReadFileOption extends HeadlessWxCallbackOption<HeadlessWxReadFileSuccessResult> {\n encoding?: string\n filePath: string\n}\n\nexport interface HeadlessWxWriteFileOption extends HeadlessWxCallbackOption<HeadlessWxFileSystemResult> {\n data: string\n encoding?: string\n filePath: string\n}\n\nexport interface HeadlessWxAccessFileOption extends HeadlessWxCallbackOption<HeadlessWxFileSystemResult> {\n path: string\n}\n\nexport interface HeadlessWxAppendFileOption extends HeadlessWxCallbackOption<HeadlessWxFileSystemResult> {\n data: string\n encoding?: string\n filePath: string\n}\n\nexport interface HeadlessWxUnlinkOption extends HeadlessWxCallbackOption<HeadlessWxFileSystemResult> {\n filePath: string\n}\n\nexport interface HeadlessWxCopyFileOption extends HeadlessWxCallbackOption<HeadlessWxFileSystemResult> {\n destPath: string\n srcPath: string\n}\n\nexport interface HeadlessWxRenameOption extends HeadlessWxCallbackOption<HeadlessWxFileSystemResult> {\n newPath: string\n oldPath: string\n}\n\nexport interface HeadlessWxMkdirOption extends HeadlessWxCallbackOption<HeadlessWxFileSystemResult> {\n dirPath: string\n recursive?: boolean\n}\n\nexport interface HeadlessWxRmdirOption extends HeadlessWxCallbackOption<HeadlessWxFileSystemResult> {\n dirPath: string\n recursive?: boolean\n}\n\nexport interface HeadlessWxReadDirSuccessResult {\n errMsg: string\n files: string[]\n}\n\nexport interface HeadlessWxReadDirOption extends HeadlessWxCallbackOption<HeadlessWxReadDirSuccessResult> {\n dirPath: string\n}\n\nexport interface HeadlessWxStats {\n isDirectory: () => boolean\n isFile: () => boolean\n size: number\n}\n\nexport interface HeadlessWxStatSuccessResult {\n errMsg: string\n stats: HeadlessWxStats\n}\n\nexport interface HeadlessWxStatOption extends HeadlessWxCallbackOption<HeadlessWxStatSuccessResult> {\n path: string\n}\n\nexport interface HeadlessWxFileSystemManager {\n access: (option: HeadlessWxAccessFileOption) => HeadlessWxFileSystemResult | undefined\n accessSync: (path: string) => void\n appendFile: (option: HeadlessWxAppendFileOption) => HeadlessWxFileSystemResult | undefined\n appendFileSync: (filePath: string, data: string, encoding?: string) => void\n copyFile: (option: HeadlessWxCopyFileOption) => HeadlessWxFileSystemResult | undefined\n copyFileSync: (srcPath: string, destPath: string) => void\n mkdir: (option: HeadlessWxMkdirOption) => HeadlessWxFileSystemResult | undefined\n mkdirSync: (dirPath: string, recursive?: boolean) => void\n readFile: (option: HeadlessWxReadFileOption) => HeadlessWxReadFileSuccessResult | undefined\n readFileSync: (filePath: string, encoding?: string) => string\n readdir: (option: HeadlessWxReadDirOption) => HeadlessWxReadDirSuccessResult | undefined\n readdirSync: (dirPath: string) => string[]\n rmdir: (option: HeadlessWxRmdirOption) => HeadlessWxFileSystemResult | undefined\n rmdirSync: (dirPath: string, recursive?: boolean) => void\n rename: (option: HeadlessWxRenameOption) => HeadlessWxFileSystemResult | undefined\n renameSync: (oldPath: string, newPath: string) => void\n stat: (option: HeadlessWxStatOption) => HeadlessWxStatSuccessResult | undefined\n statSync: (path: string) => HeadlessWxStats\n unlink: (option: HeadlessWxUnlinkOption) => HeadlessWxFileSystemResult | undefined\n unlinkSync: (filePath: string) => void\n writeFile: (option: HeadlessWxWriteFileOption) => HeadlessWxFileSystemResult | undefined\n writeFileSync: (filePath: string, data: string, encoding?: string) => void\n}\n\nexport interface HeadlessWxDriver {\n executeSelectorQuery: (requests: HeadlessWxSelectorQueryRequest[], scope?: Record<string, any>) => unknown[]\n getAppBaseInfoSync: () => HeadlessWxAppBaseInfoResult\n getFileSystemManager: () => HeadlessWxFileSystemManager\n getSavedFileInfo: (option: HeadlessWxGetSavedFileInfoOption) => HeadlessWxGetSavedFileInfoSuccessResult\n getSavedFileList: (option?: HeadlessWxGetSavedFileListOption) => HeadlessWxGetSavedFileListSuccessResult\n clearStorageSync: () => void\n getEnterOptionsSync: () => HeadlessWxLaunchOptions\n getLaunchOptionsSync: () => HeadlessWxLaunchOptions\n getMenuButtonBoundingClientRect: () => HeadlessWxMenuButtonBoundingClientRectResult\n getNetworkType: () => HeadlessWxGetNetworkTypeResult\n getStorageInfoSync: () => HeadlessWxStorageInfoResult\n getStorageSync: (key: string) => unknown\n getSystemInfoSync: () => HeadlessWxSystemInfoResult\n getWindowInfoSync: () => HeadlessWxWindowInfoResult\n hideLoading: () => { errMsg: string }\n hideToast: () => { errMsg: string }\n downloadFile: (option: HeadlessWxDownloadFileOption) => HeadlessWxRequestTask\n navigateBack: (option?: HeadlessWxNavigateBackOption) => unknown\n navigateTo: (option: HeadlessWxNavigateOption) => unknown\n nextTick: (callback?: () => void) => void\n offNetworkStatusChange: (callback?: HeadlessWxNetworkStatusChangeCallback) => void\n onNetworkStatusChange: (callback: HeadlessWxNetworkStatusChangeCallback) => void\n pageScrollTo: (option: HeadlessWxPageScrollToOption) => unknown\n reLaunch: (option: HeadlessWxNavigateOption) => unknown\n redirectTo: (option: HeadlessWxNavigateOption) => unknown\n removeStorageSync: (key: string) => void\n request: (option: HeadlessWxRequestOption) => HeadlessWxRequestTask\n removeSavedFile: (option: HeadlessWxRemoveSavedFileOption) => { errMsg: string }\n saveFile: (option: HeadlessWxSaveFileOption) => HeadlessWxSaveFileSuccessResult\n setBackgroundColor: (option: HeadlessWxSetBackgroundColorOption) => { errMsg: string }\n setBackgroundTextStyle: (option: HeadlessWxSetBackgroundTextStyleOption) => { errMsg: string }\n setStorageSync: (key: string, value: unknown) => void\n setNavigationBarColor: (option: HeadlessWxSetNavigationBarColorOption) => { errMsg: string }\n setNavigationBarTitle: (option: HeadlessWxSetNavigationBarTitleOption) => { errMsg: string }\n hideShareMenu: () => { errMsg: string }\n hideNavigationBarLoading: () => { errMsg: string }\n hideTabBar: () => { errMsg: string }\n hideTabBarRedDot: (option: HeadlessWxTabBarItemOption) => { errMsg: string }\n showShareMenu: (option: HeadlessWxShareMenuOption) => { errMsg: string }\n showNavigationBarLoading: () => { errMsg: string }\n showTabBar: () => { errMsg: string }\n showTabBarRedDot: (option: HeadlessWxTabBarItemOption) => { errMsg: string }\n showActionSheet: (option: HeadlessWxShowActionSheetOption) => HeadlessWxShowActionSheetResult\n showLoading: (option: HeadlessWxShowLoadingOption) => { errMsg: string }\n showModal: (option: HeadlessWxShowModalOption) => HeadlessWxShowModalResult\n showToast: (option: HeadlessWxShowToastOption) => { errMsg: string }\n stopPullDownRefresh: () => void\n switchTab: (option: HeadlessWxNavigateOption) => unknown\n uploadFile: (option: HeadlessWxUploadFileOption) => HeadlessWxRequestTask\n removeTabBarBadge: (option: HeadlessWxTabBarItemOption) => { errMsg: string }\n setTabBarBadge: (option: HeadlessWxSetTabBarBadgeOption) => { errMsg: string }\n updateShareMenu: (option: HeadlessWxShareMenuOption) => { errMsg: string }\n}\n\nexport interface HeadlessWx {\n canIUse: (schema: string) => boolean\n clearStorage: (option?: HeadlessWxClearStorageOption) => HeadlessWxStorageResult | undefined\n clearStorageSync: () => void\n createSelectorQuery: () => HeadlessWxSelectorQuery\n getFileSystemManager: () => HeadlessWxFileSystemManager\n getSavedFileInfo: (option: HeadlessWxGetSavedFileInfoOption) => HeadlessWxGetSavedFileInfoSuccessResult | undefined\n getSavedFileList: (option?: HeadlessWxGetSavedFileListOption) => HeadlessWxGetSavedFileListSuccessResult | undefined\n getEnterOptionsSync: () => HeadlessWxLaunchOptions\n getAppBaseInfo: (option?: HeadlessWxGetAppBaseInfoOption) => HeadlessWxAppBaseInfoResult | undefined\n getAppBaseInfoSync: () => HeadlessWxAppBaseInfoResult\n getLaunchOptionsSync: () => HeadlessWxLaunchOptions\n getMenuButtonBoundingClientRect: () => HeadlessWxMenuButtonBoundingClientRectResult\n getNetworkType: (option?: HeadlessWxGetNetworkTypeOption) => HeadlessWxGetNetworkTypeResult | undefined\n getStorageInfo: (option?: HeadlessWxGetStorageInfoOption) => HeadlessWxStorageInfoResult | undefined\n getStorageInfoSync: () => HeadlessWxStorageInfoResult\n getStorage: (option: HeadlessWxGetStorageOption) => HeadlessWxGetStorageResult | undefined\n getStorageSync: (key: string) => unknown\n getSystemInfo: (option?: HeadlessWxGetSystemInfoOption) => HeadlessWxSystemInfoResult | undefined\n getSystemInfoSync: () => HeadlessWxSystemInfoResult\n getWindowInfo: (option?: HeadlessWxGetWindowInfoOption) => HeadlessWxWindowInfoResult | undefined\n getWindowInfoSync: () => HeadlessWxWindowInfoResult\n hideLoading: (option?: HeadlessWxHideLoadingOption) => { errMsg: string } | undefined\n hideToast: () => { errMsg: string }\n downloadFile: (option: HeadlessWxDownloadFileOption) => HeadlessWxRequestTask\n navigateBack: (option?: HeadlessWxNavigateBackOption) => unknown\n navigateTo: (option: HeadlessWxNavigateOption) => unknown\n nextTick: (callback?: () => void) => void\n offNetworkStatusChange: (callback?: HeadlessWxNetworkStatusChangeCallback) => void\n onNetworkStatusChange: (callback: HeadlessWxNetworkStatusChangeCallback) => void\n pageScrollTo: (option: HeadlessWxPageScrollToOption) => unknown\n reLaunch: (option: HeadlessWxNavigateOption) => unknown\n redirectTo: (option: HeadlessWxNavigateOption) => unknown\n removeSavedFile: (option: HeadlessWxRemoveSavedFileOption) => { errMsg: string } | undefined\n removeStorage: (option: HeadlessWxRemoveStorageOption) => HeadlessWxStorageResult | undefined\n removeStorageSync: (key: string) => void\n request: (option: HeadlessWxRequestOption) => HeadlessWxRequestTask\n saveFile: (option: HeadlessWxSaveFileOption) => HeadlessWxSaveFileSuccessResult | undefined\n setBackgroundColor: (option: HeadlessWxSetBackgroundColorOption) => { errMsg: string } | undefined\n setBackgroundTextStyle: (option: HeadlessWxSetBackgroundTextStyleOption) => { errMsg: string } | undefined\n setStorage: (option: HeadlessWxSetStorageOption) => HeadlessWxStorageResult | undefined\n setStorageSync: (key: string, value: unknown) => void\n setNavigationBarColor: (option: HeadlessWxSetNavigationBarColorOption) => { errMsg: string } | undefined\n setNavigationBarTitle: (option: HeadlessWxSetNavigationBarTitleOption) => { errMsg: string } | undefined\n hideShareMenu: (option?: HeadlessWxCallbackOption<{ errMsg: string }>) => { errMsg: string } | undefined\n hideNavigationBarLoading: (option?: HeadlessWxHideNavigationBarLoadingOption) => { errMsg: string } | undefined\n hideTabBar: (option?: HeadlessWxTabBarOption) => { errMsg: string } | undefined\n hideTabBarRedDot: (option: HeadlessWxTabBarItemOption) => { errMsg: string } | undefined\n showShareMenu: (option?: HeadlessWxShareMenuOption) => { errMsg: string } | undefined\n showNavigationBarLoading: (option?: HeadlessWxShowNavigationBarLoadingOption) => { errMsg: string } | undefined\n showTabBar: (option?: HeadlessWxTabBarOption) => { errMsg: string } | undefined\n showTabBarRedDot: (option: HeadlessWxTabBarItemOption) => { errMsg: string } | undefined\n showActionSheet: (option: HeadlessWxShowActionSheetOption) => HeadlessWxShowActionSheetResult | undefined\n showLoading: (option: HeadlessWxShowLoadingOption) => { errMsg: string } | undefined\n showModal: (option: HeadlessWxShowModalOption) => HeadlessWxShowModalResult | undefined\n showToast: (option: HeadlessWxShowToastOption) => { errMsg: string } | undefined\n stopPullDownRefresh: () => void\n switchTab: (option: HeadlessWxNavigateOption) => unknown\n uploadFile: (option: HeadlessWxUploadFileOption) => HeadlessWxRequestTask\n removeTabBarBadge: (option: HeadlessWxTabBarItemOption) => { errMsg: string } | undefined\n setTabBarBadge: (option: HeadlessWxSetTabBarBadgeOption) => { errMsg: string } | undefined\n updateShareMenu: (option?: HeadlessWxShareMenuOption) => { errMsg: string } | undefined\n}\n\nfunction invokeWxApi<TOption extends HeadlessWxCallbackOption<TResult>, TResult>(\n operation: () => TResult,\n option?: TOption,\n) {\n try {\n const result = operation()\n option?.success?.(result)\n option?.complete?.(result)\n return result\n }\n catch (error) {\n option?.fail?.(error as Error)\n option?.complete?.()\n return undefined\n }\n}\n\nfunction resolveCapabilityValue(source: Record<string, any>, schema: string) {\n const segments = schema\n .split('.')\n .map(segment => segment.trim())\n .filter(Boolean)\n\n let current: any = source\n for (const segment of segments) {\n if (current == null || !(segment in current)) {\n return undefined\n }\n current = current[segment]\n }\n return current\n}\n\nexport function createHeadlessWx(driver: HeadlessWxDriver): HeadlessWx {\n const capabilityTree = {\n canIUse: true,\n clearStorage: true,\n clearStorageSync: true,\n createSelectorQuery: true,\n getFileSystemManager: true,\n getSavedFileInfo: true,\n getSavedFileList: true,\n getAppBaseInfo: {\n return: {\n SDKVersion: true,\n enableDebug: true,\n host: {\n env: true,\n },\n language: true,\n platform: true,\n version: true,\n },\n },\n getAppBaseInfoSync: {\n return: {\n SDKVersion: true,\n enableDebug: true,\n host: {\n env: true,\n },\n language: true,\n platform: true,\n version: true,\n },\n },\n getEnterOptionsSync: {\n return: {\n path: true,\n query: true,\n referrerInfo: {\n appId: true,\n extraData: true,\n },\n scene: true,\n },\n },\n getLaunchOptionsSync: {\n return: {\n path: true,\n query: true,\n referrerInfo: {\n appId: true,\n extraData: true,\n },\n scene: true,\n },\n },\n getMenuButtonBoundingClientRect: {\n return: {\n bottom: true,\n height: true,\n left: true,\n right: true,\n top: true,\n width: true,\n },\n },\n getNetworkType: {\n return: {\n networkType: true,\n },\n },\n getStorage: true,\n getStorageInfo: {\n return: {\n currentSize: true,\n keys: true,\n limitSize: true,\n },\n },\n getStorageInfoSync: {\n return: {\n currentSize: true,\n keys: true,\n limitSize: true,\n },\n },\n getStorageSync: true,\n getSystemInfo: {\n return: {\n SDKVersion: true,\n brand: true,\n language: true,\n model: true,\n pixelRatio: true,\n platform: true,\n screenHeight: true,\n screenWidth: true,\n system: true,\n version: true,\n windowHeight: true,\n windowWidth: true,\n },\n },\n getSystemInfoSync: {\n return: {\n SDKVersion: true,\n brand: true,\n language: true,\n model: true,\n pixelRatio: true,\n platform: true,\n screenHeight: true,\n screenWidth: true,\n system: true,\n version: true,\n windowHeight: true,\n windowWidth: true,\n },\n },\n getWindowInfo: {\n return: {\n pixelRatio: true,\n screenHeight: true,\n screenWidth: true,\n statusBarHeight: true,\n windowHeight: true,\n windowWidth: true,\n },\n },\n getWindowInfoSync: {\n return: {\n pixelRatio: true,\n screenHeight: true,\n screenWidth: true,\n statusBarHeight: true,\n windowHeight: true,\n windowWidth: true,\n },\n },\n hideLoading: true,\n hideToast: true,\n downloadFile: true,\n navigateBack: true,\n navigateTo: true,\n nextTick: true,\n offNetworkStatusChange: true,\n onNetworkStatusChange: true,\n pageScrollTo: true,\n reLaunch: true,\n redirectTo: true,\n removeStorage: true,\n removeStorageSync: true,\n request: true,\n saveFile: true,\n setBackgroundColor: true,\n setBackgroundTextStyle: true,\n setStorage: true,\n setStorageSync: true,\n setNavigationBarColor: true,\n setNavigationBarTitle: true,\n hideShareMenu: true,\n hideNavigationBarLoading: true,\n hideTabBar: true,\n hideTabBarRedDot: true,\n showShareMenu: true,\n showNavigationBarLoading: true,\n showTabBar: true,\n showTabBarRedDot: true,\n showActionSheet: true,\n showLoading: true,\n showModal: true,\n showToast: true,\n stopPullDownRefresh: true,\n switchTab: true,\n uploadFile: true,\n removeTabBarBadge: true,\n setTabBarBadge: true,\n updateShareMenu: true,\n }\n\n return {\n canIUse: schema => typeof schema === 'string' && schema.trim() !== '' && resolveCapabilityValue(capabilityTree, schema.trim()) != null,\n clearStorage: option => invokeWxApi(() => {\n driver.clearStorageSync()\n return {\n errMsg: 'clearStorage:ok',\n }\n }, option),\n clearStorageSync: () => driver.clearStorageSync(),\n createSelectorQuery: () => {\n const requests: HeadlessWxSelectorQueryRequest[] = []\n let scope: Record<string, any> | undefined\n const callbacks: Array<(result: any) => void> = []\n let query!: HeadlessWxSelectorQuery\n\n const createNode = (target: HeadlessWxSelectorQueryRequest['target'], selector?: string, single = true): HeadlessWxSelectorQueryNode => ({\n boundingClientRect: (callback) => {\n requests.push({\n fields: {\n rect: true,\n size: true,\n },\n selector,\n single,\n target,\n })\n if (callback) {\n callbacks.push(callback as (result: Record<string, any> | null) => void)\n }\n return query\n },\n fields: (fields, callback) => {\n requests.push({\n fields: {\n ...fields,\n },\n selector,\n single,\n target,\n })\n if (callback) {\n callbacks.push(callback)\n }\n return query\n },\n scrollOffset: (callback) => {\n requests.push({\n fields: {\n scrollOffset: true,\n },\n selector,\n single,\n target,\n })\n if (callback) {\n callbacks.push(callback as (result: Record<string, any> | null) => void)\n }\n return query\n },\n })\n\n query = {\n exec: (callback) => {\n const result = driver.executeSelectorQuery(requests, scope)\n for (const [index, item] of result.entries()) {\n callbacks[index]?.(item)\n }\n callback?.(result)\n return result\n },\n in: (component) => {\n scope = component\n return query\n },\n select: selector => createNode('selector', selector, true),\n selectAll: selector => createNode('selector', selector, false),\n selectViewport: () => createNode('viewport', undefined, true),\n }\n\n return query\n },\n getEnterOptionsSync: () => driver.getEnterOptionsSync(),\n getFileSystemManager: () => driver.getFileSystemManager(),\n getSavedFileInfo: option => invokeWxApi(() => driver.getSavedFileInfo(option), option),\n getSavedFileList: option => invokeWxApi(() => driver.getSavedFileList(option), option),\n getAppBaseInfo: option => invokeWxApi(() => driver.getAppBaseInfoSync(), option),\n getAppBaseInfoSync: () => driver.getAppBaseInfoSync(),\n getLaunchOptionsSync: () => driver.getLaunchOptionsSync(),\n getMenuButtonBoundingClientRect: () => driver.getMenuButtonBoundingClientRect(),\n getNetworkType: option => invokeWxApi(() => driver.getNetworkType(), option),\n getStorageInfo: option => invokeWxApi(() => driver.getStorageInfoSync(), option),\n getStorageInfoSync: () => driver.getStorageInfoSync(),\n getStorage: option => invokeWxApi(() => ({\n data: driver.getStorageSync(option.key),\n errMsg: 'getStorage:ok',\n }), option),\n getStorageSync: key => driver.getStorageSync(key),\n getSystemInfo: option => invokeWxApi(() => driver.getSystemInfoSync(), option),\n getSystemInfoSync: () => driver.getSystemInfoSync(),\n getWindowInfo: option => invokeWxApi(() => driver.getWindowInfoSync(), option),\n getWindowInfoSync: () => driver.getWindowInfoSync(),\n hideLoading: option => invokeWxApi(() => driver.hideLoading(), option),\n hideToast: () => driver.hideToast(),\n downloadFile: option => driver.downloadFile(option),\n navigateBack: option => invokeWxApi(() => {\n driver.navigateBack(option)\n }, option),\n navigateTo: option => invokeWxApi(() => {\n driver.navigateTo(option)\n }, option),\n nextTick: callback => driver.nextTick(callback),\n offNetworkStatusChange: callback => driver.offNetworkStatusChange(callback),\n onNetworkStatusChange: callback => driver.onNetworkStatusChange(callback),\n pageScrollTo: option => invokeWxApi(() => {\n driver.pageScrollTo(option)\n }, option),\n reLaunch: option => invokeWxApi(() => {\n driver.reLaunch(option)\n }, option),\n redirectTo: option => invokeWxApi(() => {\n driver.redirectTo(option)\n }, option),\n removeSavedFile: option => invokeWxApi(() => driver.removeSavedFile(option), option),\n removeStorage: option => invokeWxApi(() => {\n driver.removeStorageSync(option.key)\n return {\n errMsg: 'removeStorage:ok',\n }\n }, option),\n removeStorageSync: key => driver.removeStorageSync(key),\n request: option => driver.request(option),\n saveFile: option => invokeWxApi(() => driver.saveFile(option), option),\n setBackgroundColor: option => invokeWxApi(() => driver.setBackgroundColor(option), option),\n setBackgroundTextStyle: option => invokeWxApi(() => driver.setBackgroundTextStyle(option), option),\n setStorage: option => invokeWxApi(() => {\n driver.setStorageSync(option.key, option.data)\n return {\n errMsg: 'setStorage:ok',\n }\n }, option),\n setStorageSync: (key, value) => driver.setStorageSync(key, value),\n setNavigationBarColor: option => invokeWxApi(() => driver.setNavigationBarColor(option), option),\n setNavigationBarTitle: option => invokeWxApi(() => driver.setNavigationBarTitle(option), option),\n hideShareMenu: option => invokeWxApi(() => driver.hideShareMenu(), option),\n hideNavigationBarLoading: option => invokeWxApi(() => driver.hideNavigationBarLoading(), option),\n hideTabBar: option => invokeWxApi(() => driver.hideTabBar(), option),\n hideTabBarRedDot: option => invokeWxApi(() => driver.hideTabBarRedDot(option), option),\n showShareMenu: option => invokeWxApi(() => driver.showShareMenu(option ?? {}), option),\n showNavigationBarLoading: option => invokeWxApi(() => driver.showNavigationBarLoading(), option),\n showTabBar: option => invokeWxApi(() => driver.showTabBar(), option),\n showTabBarRedDot: option => invokeWxApi(() => driver.showTabBarRedDot(option), option),\n showActionSheet: option => invokeWxApi(() => driver.showActionSheet(option), option),\n showLoading: option => invokeWxApi(() => driver.showLoading(option), option),\n showModal: option => invokeWxApi(() => driver.showModal(option), option),\n showToast: option => invokeWxApi(() => driver.showToast(option), option),\n stopPullDownRefresh: () => driver.stopPullDownRefresh(),\n switchTab: option => invokeWxApi(() => {\n driver.switchTab(option)\n }, option),\n uploadFile: option => driver.uploadFile(option),\n removeTabBarBadge: option => invokeWxApi(() => driver.removeTabBarBadge(option), option),\n setTabBarBadge: option => invokeWxApi(() => driver.setTabBarBadge(option), option),\n updateShareMenu: option => invokeWxApi(() => driver.updateShareMenu(option ?? {}), option),\n }\n}\n","export interface HeadlessRouteRecord {\n kind: 'page'\n route: string\n source: 'pages' | 'subPackages'\n subpackageRoot?: string\n}\n\nconst LEADING_SLASH_RE = /^\\/+/\nconst TRAILING_SLASH_RE = /\\/+$/\nconst DUPLICATE_SLASH_RE = /\\/{2,}/g\n\nfunction normalizeSegment(value: string) {\n return value.replace(LEADING_SLASH_RE, '').replace(TRAILING_SLASH_RE, '')\n}\n\nfunction pushRoute(\n records: HeadlessRouteRecord[],\n seen: Set<string>,\n record: HeadlessRouteRecord,\n) {\n if (!record.route || seen.has(record.route)) {\n return\n }\n seen.add(record.route)\n records.push(record)\n}\n\nexport function resolveRoutesFromAppConfig(config: Record<string, any>) {\n const records: HeadlessRouteRecord[] = []\n const seen = new Set<string>()\n\n if (Array.isArray(config.pages)) {\n for (const page of config.pages) {\n if (typeof page !== 'string') {\n continue\n }\n const route = normalizeSegment(page)\n if (!route) {\n continue\n }\n pushRoute(records, seen, {\n kind: 'page',\n route,\n source: 'pages',\n })\n }\n }\n\n const subPackages = [\n ...(Array.isArray(config.subPackages) ? config.subPackages : []),\n ...(Array.isArray(config.subpackages) ? config.subpackages : []),\n ]\n\n for (const subPackage of subPackages) {\n if (!subPackage || typeof subPackage !== 'object') {\n continue\n }\n const root = typeof subPackage.root === 'string'\n ? normalizeSegment(subPackage.root)\n : ''\n const pages = Array.isArray(subPackage.pages) ? subPackage.pages : []\n\n for (const page of pages) {\n if (typeof page !== 'string') {\n continue\n }\n const normalizedPage = normalizeSegment(page)\n if (!normalizedPage) {\n continue\n }\n const route = root\n ? `${root}/${normalizedPage}`.replace(DUPLICATE_SLASH_RE, '/')\n : normalizedPage\n pushRoute(records, seen, {\n kind: 'page',\n route,\n source: 'subPackages',\n subpackageRoot: root || undefined,\n })\n }\n }\n\n return records\n}\n","import type { HeadlessRouteRecord } from './resolveRoutes'\nimport { resolveRoutesFromAppConfig } from './resolveRoutes'\n\nexport interface HeadlessProjectConfigFile {\n filePath: string\n value: Record<string, any>\n}\n\nexport interface HeadlessProjectDescriptor {\n appConfig: Record<string, any>\n appConfigPath: string\n miniprogramRoot: string\n miniprogramRootPath: string\n projectPath: string\n projectConfigFiles: HeadlessProjectConfigFile[]\n routes: HeadlessRouteRecord[]\n}\n\nexport interface CreateProjectDescriptorOptions {\n appConfig: Record<string, any>\n appConfigPath: string\n miniprogramRoot: string\n miniprogramRootPath: string\n projectPath: string\n projectConfigFiles?: HeadlessProjectConfigFile[]\n}\n\nexport function createProjectDescriptor(options: CreateProjectDescriptorOptions): HeadlessProjectDescriptor {\n return {\n appConfig: options.appConfig,\n appConfigPath: options.appConfigPath,\n miniprogramRoot: options.miniprogramRoot,\n miniprogramRootPath: options.miniprogramRootPath,\n projectPath: options.projectPath,\n projectConfigFiles: options.projectConfigFiles ?? [],\n routes: resolveRoutesFromAppConfig(options.appConfig),\n }\n}\n","let _lazyMatch = () => { var __lib__=(()=>{var m=Object.defineProperty,V=Object.getOwnPropertyDescriptor,G=Object.getOwnPropertyNames,T=Object.prototype.hasOwnProperty,q=(r,e)=>{for(var n in e)m(r,n,{get:e[n],enumerable:true});},H=(r,e,n,a)=>{if(e&&typeof e==\"object\"||typeof e==\"function\")for(let t of G(e))!T.call(r,t)&&t!==n&&m(r,t,{get:()=>e[t],enumerable:!(a=V(e,t))||a.enumerable});return r},J=r=>H(m({},\"__esModule\",{value:true}),r),w={};q(w,{default:()=>re});var A=r=>Array.isArray(r),d=r=>typeof r==\"function\",Q=r=>r.length===0,W=r=>typeof r==\"number\",K=r=>typeof r==\"object\"&&r!==null,X=r=>r instanceof RegExp,b=r=>typeof r==\"string\",h=r=>r===void 0,Y=r=>{const e=new Map;return n=>{const a=e.get(n);if(a)return a;const t=r(n);return e.set(n,t),t}},rr=(r,e,n={})=>{const a={cache:{},input:r,index:0,indexMax:0,options:n,output:[]};if(v(e)(a)&&a.index===r.length)return a.output;throw new Error(`Failed to parse at index ${a.indexMax}`)},i=(r,e)=>A(r)?er(r,e):b(r)?ar(r,e):nr(r,e),er=(r,e)=>{const n={};for(const a of r){if(a.length!==1)throw new Error(`Invalid character: \"${a}\"`);const t=a.charCodeAt(0);n[t]=true;}return a=>{const t=a.index,o=a.input;for(;a.index<o.length&&o.charCodeAt(a.index)in n;)a.index+=1;const u=a.index;if(u>t){if(!h(e)&&!a.options.silent){const s=a.input.slice(t,u),c=d(e)?e(s,o,String(t)):e;h(c)||a.output.push(c);}a.indexMax=Math.max(a.indexMax,a.index);}return true}},nr=(r,e)=>{const n=r.source,a=r.flags.replace(/y|$/,\"y\"),t=new RegExp(n,a);return g(o=>{t.lastIndex=o.index;const u=t.exec(o.input);if(u){if(!h(e)&&!o.options.silent){const s=d(e)?e(...u,o.input,String(o.index)):e;h(s)||o.output.push(s);}return o.index+=u[0].length,o.indexMax=Math.max(o.indexMax,o.index),true}else return false})},ar=(r,e)=>n=>{if(n.input.startsWith(r,n.index)){if(!h(e)&&!n.options.silent){const t=d(e)?e(r,n.input,String(n.index)):e;h(t)||n.output.push(t);}return n.index+=r.length,n.indexMax=Math.max(n.indexMax,n.index),true}else return false},C=(r,e,n,a)=>{const t=v(r);return g(_(M(o=>{let u=0;for(;u<n;){const s=o.index;if(!t(o)||(u+=1,o.index===s))break}return u>=e})))},tr=(r,e)=>C(r,0,1),f=(r,e)=>C(r,0,1/0),x=(r,e)=>{const n=r.map(v);return g(_(M(a=>{for(let t=0,o=n.length;t<o;t++)if(!n[t](a))return false;return true})))},l=(r,e)=>{const n=r.map(v);return g(_(a=>{for(let t=0,o=n.length;t<o;t++)if(n[t](a))return true;return false}))},M=(r,e=false)=>{const n=v(r);return a=>{const t=a.index,o=a.output.length,u=n(a);return (!u||e)&&(a.index=t,a.output.length!==o&&(a.output.length=o)),u}},_=(r,e)=>{const n=v(r);return n},g=(()=>{let r=0;return e=>{const n=v(e),a=r+=1;return t=>{var o;if(t.options.memoization===false)return n(t);const u=t.index,s=(o=t.cache)[a]||(o[a]=new Map),c=s.get(u);if(c===false)return false;if(W(c))return t.index=c,true;if(c)return t.index=c.index,c.output?.length&&t.output.push(...c.output),true;{const Z=t.output.length;if(n(t)){const D=t.index,U=t.output.length;if(U>Z){const ee=t.output.slice(Z,U);s.set(u,{index:D,output:ee});}else s.set(u,D);return true}else return s.set(u,false),false}}}})(),E=r=>{let e;return n=>(e||(e=v(r())),e(n))},v=Y(r=>{if(d(r))return Q(r)?E(r):r;if(b(r)||X(r))return i(r);if(A(r))return x(r);if(K(r))return l(Object.values(r));throw new Error(\"Invalid rule\")}),P=\"abcdefghijklmnopqrstuvwxyz\",ir=r=>{let e=\"\";for(;r>0;){const n=(r-1)%26;e=P[n]+e,r=Math.floor((r-1)/26);}return e},O=r=>{let e=0;for(let n=0,a=r.length;n<a;n++)e=e*26+P.indexOf(r[n])+1;return e},S=(r,e)=>{if(e<r)return S(e,r);const n=[];for(;r<=e;)n.push(r++);return n},or=(r,e,n)=>S(r,e).map(a=>String(a).padStart(n,\"0\")),R=(r,e)=>S(O(r),O(e)).map(ir),p=r=>r,z=r=>ur(e=>rr(e,r,{memoization:false}).join(\"\")),ur=r=>{const e={};return n=>e[n]??(e[n]=r(n))},sr=i(/^\\*\\*\\/\\*$/,\".*\"),cr=i(/^\\*\\*\\/(\\*)?([ a-zA-Z0-9._-]+)$/,(r,e,n)=>`.*${e?\"\":\"(?:^|/)\"}${n.replaceAll(\".\",\"\\\\.\")}`),lr=i(/^\\*\\*\\/(\\*)?([ a-zA-Z0-9._-]*)\\{([ a-zA-Z0-9._-]+(?:,[ a-zA-Z0-9._-]+)*)\\}$/,(r,e,n,a)=>`.*${e?\"\":\"(?:^|/)\"}${n.replaceAll(\".\",\"\\\\.\")}(?:${a.replaceAll(\",\",\"|\").replaceAll(\".\",\"\\\\.\")})`),y=i(/\\\\./,p),pr=i(/[$.*+?^(){}[\\]\\|]/,r=>`\\\\${r}`),vr=i(/./,p),hr=i(/^(?:!!)*!(.*)$/,(r,e)=>`(?!^${L(e)}$).*?`),dr=i(/^(!!)+/,\"\"),fr=l([hr,dr]),xr=i(/\\/(\\*\\*\\/)+/,\"(?:/.+/|/)\"),gr=i(/^(\\*\\*\\/)+/,\"(?:^|.*/)\"),mr=i(/\\/(\\*\\*)$/,\"(?:/.*|$)\"),_r=i(/\\*\\*/,\".*\"),j=l([xr,gr,mr,_r]),Sr=i(/\\*\\/(?!\\*\\*\\/)/,\"[^/]*/\"),yr=i(/\\*/,\"[^/]*\"),N=l([Sr,yr]),k=i(\"?\",\"[^/]\"),$r=i(\"[\",p),wr=i(\"]\",p),Ar=i(/[!^]/,\"^/\"),br=i(/[a-z]-[a-z]|[0-9]-[0-9]/i,p),Cr=i(/[$.*+?^(){}[\\|]/,r=>`\\\\${r}`),Mr=i(/[^\\]]/,p),Er=l([y,Cr,br,Mr]),B=x([$r,tr(Ar),f(Er),wr]),Pr=i(\"{\",\"(?:\"),Or=i(\"}\",\")\"),Rr=i(/(\\d+)\\.\\.(\\d+)/,(r,e,n)=>or(+e,+n,Math.min(e.length,n.length)).join(\"|\")),zr=i(/([a-z]+)\\.\\.([a-z]+)/,(r,e,n)=>R(e,n).join(\"|\")),jr=i(/([A-Z]+)\\.\\.([A-Z]+)/,(r,e,n)=>R(e.toLowerCase(),n.toLowerCase()).join(\"|\").toUpperCase()),Nr=l([Rr,zr,jr]),I=x([Pr,Nr,Or]),kr=i(\"{\",\"(?:\"),Br=i(\"}\",\")\"),Ir=i(\",\",\"|\"),Fr=i(/[$.*+?^(){[\\]\\|]/,r=>`\\\\${r}`),Lr=i(/[^}]/,p),Zr=E(()=>F),Dr=l([j,N,k,B,I,Zr,y,Fr,Ir,Lr]),F=x([kr,f(Dr),Br]),Ur=f(l([sr,cr,lr,fr,j,N,k,B,I,F,y,pr,vr])),Vr=Ur,Gr=z(Vr),L=Gr,Tr=i(/\\\\./,p),qr=i(/./,p),Hr=i(/\\*\\*\\*+/,\"*\"),Jr=i(/([^/{[(!])\\*\\*/,(r,e)=>`${e}*`),Qr=i(/(^|.)\\*\\*(?=[^*/)\\]}])/,(r,e)=>`${e}*`),Wr=f(l([Tr,Hr,Jr,Qr,qr])),Kr=Wr,Xr=z(Kr),Yr=Xr,$=(r,e)=>{const n=Array.isArray(r)?r:[r];if(!n.length)return false;const a=n.map($.compile),t=n.every(s=>/(\\/(?:\\*\\*)?|\\[\\/\\])$/.test(s)),o=e.replace(/[\\\\\\/]+/g,\"/\").replace(/\\/$/,t?\"/\":\"\");return a.some(s=>s.test(o))};$.compile=r=>new RegExp(`^${L(Yr(r))}$`,\"s\");var re=$;return J(w)})();\n return __lib__.default || __lib__; };\nlet _match;\nconst zeptomatch = (path, pattern) => {\n if (!_match) {\n _match = _lazyMatch();\n _lazyMatch = null;\n }\n return _match(path, pattern);\n};\n\nconst _DRIVE_LETTER_START_RE = /^[A-Za-z]:\\//;\nfunction normalizeWindowsPath(input = \"\") {\n if (!input) {\n return input;\n }\n return input.replace(/\\\\/g, \"/\").replace(_DRIVE_LETTER_START_RE, (r) => r.toUpperCase());\n}\n\nconst _UNC_REGEX = /^[/\\\\]{2}/;\nconst _IS_ABSOLUTE_RE = /^[/\\\\](?![/\\\\])|^[/\\\\]{2}(?!\\.)|^[A-Za-z]:[/\\\\]/;\nconst _DRIVE_LETTER_RE = /^[A-Za-z]:$/;\nconst _ROOT_FOLDER_RE = /^\\/([A-Za-z]:)?$/;\nconst _EXTNAME_RE = /.(\\.[^./]+|\\.)$/;\nconst _PATH_ROOT_RE = /^[/\\\\]|^[a-zA-Z]:[/\\\\]/;\nconst sep = \"/\";\nconst normalize = function(path) {\n if (path.length === 0) {\n return \".\";\n }\n path = normalizeWindowsPath(path);\n const isUNCPath = path.match(_UNC_REGEX);\n const isPathAbsolute = isAbsolute(path);\n const trailingSeparator = path[path.length - 1] === \"/\";\n path = normalizeString(path, !isPathAbsolute);\n if (path.length === 0) {\n if (isPathAbsolute) {\n return \"/\";\n }\n return trailingSeparator ? \"./\" : \".\";\n }\n if (trailingSeparator) {\n path += \"/\";\n }\n if (_DRIVE_LETTER_RE.test(path)) {\n path += \"/\";\n }\n if (isUNCPath) {\n if (!isPathAbsolute) {\n return `//./${path}`;\n }\n return `//${path}`;\n }\n return isPathAbsolute && !isAbsolute(path) ? `/${path}` : path;\n};\nconst join = function(...segments) {\n let path = \"\";\n for (const seg of segments) {\n if (!seg) {\n continue;\n }\n if (path.length > 0) {\n const pathTrailing = path[path.length - 1] === \"/\";\n const segLeading = seg[0] === \"/\";\n const both = pathTrailing && segLeading;\n if (both) {\n path += seg.slice(1);\n } else {\n path += pathTrailing || segLeading ? seg : `/${seg}`;\n }\n } else {\n path += seg;\n }\n }\n return normalize(path);\n};\nfunction cwd() {\n if (typeof process !== \"undefined\" && typeof process.cwd === \"function\") {\n return process.cwd().replace(/\\\\/g, \"/\");\n }\n return \"/\";\n}\nconst resolve = function(...arguments_) {\n arguments_ = arguments_.map((argument) => normalizeWindowsPath(argument));\n let resolvedPath = \"\";\n let resolvedAbsolute = false;\n for (let index = arguments_.length - 1; index >= -1 && !resolvedAbsolute; index--) {\n const path = index >= 0 ? arguments_[index] : cwd();\n if (!path || path.length === 0) {\n continue;\n }\n resolvedPath = `${path}/${resolvedPath}`;\n resolvedAbsolute = isAbsolute(path);\n }\n resolvedPath = normalizeString(resolvedPath, !resolvedAbsolute);\n if (resolvedAbsolute && !isAbsolute(resolvedPath)) {\n return `/${resolvedPath}`;\n }\n return resolvedPath.length > 0 ? resolvedPath : \".\";\n};\nfunction normalizeString(path, allowAboveRoot) {\n let res = \"\";\n let lastSegmentLength = 0;\n let lastSlash = -1;\n let dots = 0;\n let char = null;\n for (let index = 0; index <= path.length; ++index) {\n if (index < path.length) {\n char = path[index];\n } else if (char === \"/\") {\n break;\n } else {\n char = \"/\";\n }\n if (char === \"/\") {\n if (lastSlash === index - 1 || dots === 1) ; else if (dots === 2) {\n if (res.length < 2 || lastSegmentLength !== 2 || res[res.length - 1] !== \".\" || res[res.length - 2] !== \".\") {\n if (res.length > 2) {\n const lastSlashIndex = res.lastIndexOf(\"/\");\n if (lastSlashIndex === -1) {\n res = \"\";\n lastSegmentLength = 0;\n } else {\n res = res.slice(0, lastSlashIndex);\n lastSegmentLength = res.length - 1 - res.lastIndexOf(\"/\");\n }\n lastSlash = index;\n dots = 0;\n continue;\n } else if (res.length > 0) {\n res = \"\";\n lastSegmentLength = 0;\n lastSlash = index;\n dots = 0;\n continue;\n }\n }\n if (allowAboveRoot) {\n res += res.length > 0 ? \"/..\" : \"..\";\n lastSegmentLength = 2;\n }\n } else {\n if (res.length > 0) {\n res += `/${path.slice(lastSlash + 1, index)}`;\n } else {\n res = path.slice(lastSlash + 1, index);\n }\n lastSegmentLength = index - lastSlash - 1;\n }\n lastSlash = index;\n dots = 0;\n } else if (char === \".\" && dots !== -1) {\n ++dots;\n } else {\n dots = -1;\n }\n }\n return res;\n}\nconst isAbsolute = function(p) {\n return _IS_ABSOLUTE_RE.test(p);\n};\nconst toNamespacedPath = function(p) {\n return normalizeWindowsPath(p);\n};\nconst extname = function(p) {\n if (p === \"..\") return \"\";\n const match = _EXTNAME_RE.exec(normalizeWindowsPath(p));\n return match && match[1] || \"\";\n};\nconst relative = function(from, to) {\n const _from = resolve(from).replace(_ROOT_FOLDER_RE, \"$1\").split(\"/\");\n const _to = resolve(to).replace(_ROOT_FOLDER_RE, \"$1\").split(\"/\");\n if (_to[0][1] === \":\" && _from[0][1] === \":\" && _from[0] !== _to[0]) {\n return _to.join(\"/\");\n }\n const _fromCopy = [..._from];\n for (const segment of _fromCopy) {\n if (_to[0] !== segment) {\n break;\n }\n _from.shift();\n _to.shift();\n }\n return [..._from.map(() => \"..\"), ..._to].join(\"/\");\n};\nconst dirname = function(p) {\n const segments = normalizeWindowsPath(p).replace(/\\/$/, \"\").split(\"/\").slice(0, -1);\n if (segments.length === 1 && _DRIVE_LETTER_RE.test(segments[0])) {\n segments[0] += \"/\";\n }\n return segments.join(\"/\") || (isAbsolute(p) ? \"/\" : \".\");\n};\nconst format = function(p) {\n const ext = p.ext ? p.ext.startsWith(\".\") ? p.ext : `.${p.ext}` : \"\";\n const segments = [p.root, p.dir, p.base ?? (p.name ?? \"\") + ext].filter(\n Boolean\n );\n return normalizeWindowsPath(\n p.root ? resolve(...segments) : segments.join(\"/\")\n );\n};\nconst basename = function(p, extension) {\n const segments = normalizeWindowsPath(p).split(\"/\");\n let lastSegment = \"\";\n for (let i = segments.length - 1; i >= 0; i--) {\n const val = segments[i];\n if (val) {\n lastSegment = val;\n break;\n }\n }\n return extension && lastSegment.endsWith(extension) ? lastSegment.slice(0, -extension.length) : lastSegment;\n};\nconst parse = function(p) {\n const root = _PATH_ROOT_RE.exec(p)?.[0]?.replace(/\\\\/g, \"/\") || \"\";\n const base = basename(p);\n const extension = extname(base);\n return {\n root,\n dir: dirname(p),\n base,\n ext: extension,\n name: base.slice(0, base.length - extension.length)\n };\n};\nconst matchesGlob = (path, pattern) => {\n return zeptomatch(pattern, normalize(path));\n};\n\nconst _path = {\n __proto__: null,\n basename: basename,\n dirname: dirname,\n extname: extname,\n format: format,\n isAbsolute: isAbsolute,\n join: join,\n matchesGlob: matchesGlob,\n normalize: normalize,\n normalizeString: normalizeString,\n parse: parse,\n relative: relative,\n resolve: resolve,\n sep: sep,\n toNamespacedPath: toNamespacedPath\n};\n\nexport { _path as _, normalizeString as a, relative as b, basename as c, dirname as d, extname as e, format as f, normalizeWindowsPath as g, isAbsolute as i, join as j, matchesGlob as m, normalize as n, parse as p, resolve as r, sep as s, toNamespacedPath as t };\n","import fs from 'node:fs'\nimport path from 'node:path'\nimport { normalize } from 'pathe'\nimport {\n createProjectDescriptor,\n type HeadlessProjectConfigFile,\n type HeadlessProjectDescriptor,\n} from './createProjectDescriptor'\n\nfunction readJsonObject(filePath: string) {\n try {\n const content = fs.readFileSync(filePath, 'utf8')\n const value = JSON.parse(content)\n return value && typeof value === 'object' && !Array.isArray(value)\n ? value as Record<string, any>\n : undefined\n }\n catch {\n return undefined\n }\n}\n\nfunction resolveProjectConfigFiles(projectPath: string) {\n const entries: HeadlessProjectConfigFile[] = []\n for (const fileName of ['project.config.json', 'project.private.config.json']) {\n const filePath = path.resolve(projectPath, fileName)\n const value = readJsonObject(filePath)\n if (!value) {\n continue\n }\n entries.push({\n filePath,\n value,\n })\n }\n return entries\n}\n\nfunction resolveMiniprogramRoot(projectPath: string, configFiles: HeadlessProjectConfigFile[]) {\n for (const configFile of [...configFiles].reverse()) {\n const rawRoot = configFile.value.miniprogramRoot\n if (typeof rawRoot !== 'string' || !rawRoot.trim()) {\n continue\n }\n return rawRoot.trim()\n }\n\n throw new Error(\n `Failed to resolve miniprogramRoot for headless runtime project: ${projectPath}. `\n + 'Expected project.config.json or project.private.config.json to define miniprogramRoot.',\n )\n}\n\nfunction ensureFileExists(filePath: string, label: string) {\n if (fs.existsSync(filePath)) {\n return\n }\n throw new Error(`Missing ${label} for headless runtime project: ${normalize(filePath)}`)\n}\n\nfunction loadAppConfig(appConfigPath: string) {\n const appConfig = readJsonObject(appConfigPath)\n if (!appConfig) {\n throw new Error(`Failed to read built app.json for headless runtime project: ${normalize(appConfigPath)}`)\n }\n return appConfig\n}\n\nexport function loadProject(projectPath: string): HeadlessProjectDescriptor {\n const normalizedProjectPath = path.resolve(projectPath)\n const projectConfigFiles = resolveProjectConfigFiles(normalizedProjectPath)\n\n if (projectConfigFiles.length === 0) {\n throw new Error(\n `Missing project config for headless runtime project: ${normalizedProjectPath}. `\n + 'Expected project.config.json or project.private.config.json.',\n )\n }\n\n const miniprogramRoot = resolveMiniprogramRoot(normalizedProjectPath, projectConfigFiles)\n const miniprogramRootPath = path.resolve(normalizedProjectPath, miniprogramRoot)\n ensureFileExists(miniprogramRootPath, 'miniprogramRoot directory')\n\n const appConfigPath = path.resolve(miniprogramRootPath, 'app.json')\n ensureFileExists(appConfigPath, 'built app.json')\n\n const appConfig = loadAppConfig(appConfigPath)\n return createProjectDescriptor({\n appConfig,\n appConfigPath,\n miniprogramRoot,\n miniprogramRootPath,\n projectPath: normalizedProjectPath,\n projectConfigFiles,\n })\n}\n","interface DomNodeLike {\n attribs?: Record<string, string>\n children?: DomNodeLike[]\n data?: string\n name?: string\n parent?: DomNodeLike | null\n type?: string\n}\n\nconst WHITESPACE_RE = /\\s+/\nconst DATA_ATTR_SELECTOR_RE = /^\\[data-([^=\\]]+)=\"([^\"]*)\"\\]$/\n\nfunction getClassList(node: DomNodeLike) {\n return String(node.attribs?.class ?? '')\n .split(WHITESPACE_RE)\n .map(item => item.trim())\n .filter(Boolean)\n}\n\nfunction matchesSimpleSelector(node: DomNodeLike, selector: string) {\n if (node.type !== 'tag') {\n return false\n }\n\n if (selector === 'page') {\n return node.name === 'page'\n }\n if (selector.startsWith('#')) {\n return node.attribs?.id === selector.slice(1)\n }\n if (selector.startsWith('.')) {\n return getClassList(node).includes(selector.slice(1))\n }\n const dataAttrMatch = selector.match(DATA_ATTR_SELECTOR_RE)\n if (dataAttrMatch) {\n const [, key, value] = dataAttrMatch\n return node.attribs?.[`data-${key}`] === value\n }\n return node.name === selector\n}\n\nfunction collectDescendants(node: DomNodeLike, into: DomNodeLike[]) {\n for (const child of node.children ?? []) {\n into.push(child)\n collectDescendants(child, into)\n }\n}\n\nexport function querySelectorAll(root: DomNodeLike, selector: string): DomNodeLike[] {\n const parts = selector.trim().split(WHITESPACE_RE).filter(Boolean)\n if (parts.length === 0) {\n return []\n }\n\n let current: DomNodeLike[] = [root]\n for (const part of parts) {\n const next: DomNodeLike[] = []\n for (const node of current) {\n const candidates: DomNodeLike[] = []\n if (part === 'page' && node.type === 'tag' && node.name === 'page') {\n candidates.push(node)\n }\n collectDescendants(node, candidates)\n for (const candidate of candidates) {\n if (matchesSimpleSelector(candidate, part)) {\n next.push(candidate)\n }\n }\n }\n current = next\n }\n\n return current\n}\n","import { querySelectorAll } from './selectors'\n\ninterface DomNodeLike {\n attribs?: Record<string, string>\n children?: DomNodeLike[]\n data?: string\n name?: string\n parent?: DomNodeLike | null\n type?: string\n}\n\ninterface HeadlessTestingNodeEventInit {\n currentTarget?: {\n dataset?: Record<string, string>\n id?: string\n }\n dataset?: Record<string, string>\n detail?: unknown\n id?: string\n mark?: Record<string, unknown>\n target?: {\n dataset?: Record<string, string>\n id?: string\n }\n}\n\ninterface HeadlessTestingNodeValueEventInit extends HeadlessTestingNodeEventInit {\n detail?: {\n value?: string\n [key: string]: unknown\n }\n}\n\ninterface HeadlessTestingNodeInteractionHandlers {\n callMethod: (scopeId: string | null, methodName: string, event: Record<string, any>) => unknown\n createScopeHandle: (scopeId: string | null) => { scopeId: string, snapshot: () => Promise<unknown> } | null\n createPageHandle: () => { data: (path?: string) => Promise<unknown> }\n ownerScopeId: (scopeId: string | null) => string | null\n}\n\nconst DATASET_NAME_RE = /-([a-z])/g\n\nfunction escapeText(text: string) {\n return text\n .replaceAll('&', '&')\n .replaceAll('<', '<')\n .replaceAll('>', '>')\n}\n\nfunction toDatasetKey(attributeName: string) {\n return attributeName\n .slice('data-'.length)\n .replace(DATASET_NAME_RE, (_match, char: string) => char.toUpperCase())\n}\n\nfunction collectDataset(node: DomNodeLike) {\n const dataset: Record<string, string> = {}\n for (const [key, value] of Object.entries(node.attribs ?? {})) {\n if (!key.startsWith('data-') || key.startsWith('data-sim-')) {\n continue\n }\n dataset[toDatasetKey(key)] = value\n }\n return dataset\n}\n\nfunction resolveEventBinding(node: DomNodeLike, eventName: string) {\n const normalizedEventName = eventName.trim()\n if (!normalizedEventName) {\n return null\n }\n\n const bindingAttrs = [\n `bind${normalizedEventName}`,\n `bind:${normalizedEventName}`,\n `catch${normalizedEventName}`,\n `catch:${normalizedEventName}`,\n ]\n for (const attributeName of bindingAttrs) {\n const methodName = node.attribs?.[attributeName]?.trim()\n if (methodName) {\n return methodName\n }\n }\n return null\n}\n\nfunction createEventPayload(node: DomNodeLike, eventName: string, event: HeadlessTestingNodeEventInit) {\n const dataset = collectDataset(node)\n const nodeId = node.attribs?.id ?? ''\n return {\n bubbles: false,\n capturePhase: false,\n composed: false,\n currentTarget: {\n dataset: event.currentTarget?.dataset ?? event.dataset ?? dataset,\n id: event.currentTarget?.id ?? event.id ?? nodeId,\n },\n detail: event.detail,\n mark: event.mark,\n target: {\n dataset: event.target?.dataset ?? event.dataset ?? dataset,\n id: event.target?.id ?? event.id ?? nodeId,\n },\n type: eventName,\n }\n}\n\nfunction createValueEventDetail(value: string, detail?: HeadlessTestingNodeValueEventInit['detail']) {\n return {\n value,\n ...(detail ?? {}),\n }\n}\n\nfunction escapeAttribute(value: string) {\n return escapeText(value).replaceAll('\"', '"')\n}\n\nfunction serializeNode(node: DomNodeLike): string {\n if (node.type === 'text') {\n return escapeText(node.data ?? '')\n }\n\n if (node.type !== 'tag') {\n return (node.children ?? []).map(serializeNode).join('')\n }\n\n if (node.name === 'page') {\n return (node.children ?? [])\n .filter(child => !(child.type === 'tag' && (child.name === 'import' || child.name === 'wxs')))\n .map(serializeNode)\n .join('')\n }\n\n const attrs = Object.entries(node.attribs ?? {})\n .filter(([key]) => !key.startsWith('data-sim-'))\n .map(([key, value]) => ` ${key}=\"${escapeAttribute(value)}\"`)\n .join('')\n const children = (node.children ?? []).map(serializeNode).join('')\n return `<${node.name ?? ''}${attrs}>${children}</${node.name ?? ''}>`\n}\n\nfunction collectText(node: DomNodeLike): string {\n if (node.type === 'text') {\n return node.data ?? ''\n }\n return (node.children ?? []).map(collectText).join('')\n}\n\nfunction resolvePageScopeId(scopeId?: string | null) {\n if (!scopeId) {\n return null\n }\n const pagePathIndex = scopeId.indexOf('/page/')\n return pagePathIndex >= 0 ? scopeId.slice(0, pagePathIndex) : scopeId\n}\n\nfunction resolveComponentScopeId(scopeId?: string | null) {\n if (!scopeId || !scopeId.includes('/')) {\n return null\n }\n return scopeId\n}\n\nexport class HeadlessTestingNodeHandle {\n constructor(\n private readonly node: DomNodeLike,\n private readonly interactions?: HeadlessTestingNodeInteractionHandlers,\n ) {}\n\n async $(selector: string) {\n const match = querySelectorAll(this.node, selector)[0]\n return match ? new HeadlessTestingNodeHandle(match, this.interactions) : null\n }\n\n async $$(selector: string) {\n return querySelectorAll(this.node, selector).map(node => new HeadlessTestingNodeHandle(node, this.interactions))\n }\n\n async attr(name: string) {\n return this.node.attribs?.[name]\n }\n\n async dataset() {\n return collectDataset(this.node)\n }\n\n async scope() {\n if (!this.interactions) {\n throw new Error('Node interactions are not available for this headless testing node.')\n }\n return this.interactions.createScopeHandle(this.node.attribs?.['data-sim-scope'] ?? null)\n }\n\n async componentScope() {\n if (!this.interactions) {\n throw new Error('Node interactions are not available for this headless testing node.')\n }\n return this.interactions.createScopeHandle(resolveComponentScopeId(this.node.attribs?.['data-sim-scope'] ?? null))\n }\n\n async pageScope() {\n if (!this.interactions) {\n throw new Error('Node interactions are not available for this headless testing node.')\n }\n return this.interactions.createScopeHandle(resolvePageScopeId(this.node.attribs?.['data-sim-scope'] ?? null))\n }\n\n async page() {\n if (!this.interactions) {\n throw new Error('Node interactions are not available for this headless testing node.')\n }\n return this.interactions.createPageHandle()\n }\n\n async ownerComponentScope() {\n if (!this.interactions) {\n throw new Error('Node interactions are not available for this headless testing node.')\n }\n const scopeId = resolveComponentScopeId(this.node.attribs?.['data-sim-scope'] ?? null)\n return this.interactions.createScopeHandle(this.interactions.ownerScopeId(scopeId))\n }\n\n async text() {\n return collectText(this.node)\n }\n\n async trigger(eventName: string, event: HeadlessTestingNodeEventInit = {}) {\n if (!this.interactions) {\n throw new Error('Node interactions are not available for this headless testing node.')\n }\n\n const normalizedEventName = eventName.trim()\n if (!normalizedEventName) {\n throw new Error('Event name must be a non-empty string in headless testing runtime.')\n }\n\n const methodName = resolveEventBinding(this.node, normalizedEventName)\n if (!methodName) {\n throw new Error(`No ${normalizedEventName} binding was found on <${this.node.name ?? 'unknown'}> in headless testing runtime.`)\n }\n\n return await this.interactions.callMethod(\n this.node.attribs?.['data-sim-scope'] ?? null,\n methodName,\n createEventPayload(this.node, normalizedEventName, event),\n )\n }\n\n async tap(event: HeadlessTestingNodeEventInit = {}) {\n return await this.trigger('tap', event)\n }\n\n async input(value: string, event: HeadlessTestingNodeValueEventInit = {}) {\n return await this.trigger('input', {\n ...event,\n detail: createValueEventDetail(value, event.detail),\n })\n }\n\n async change(value: string, event: HeadlessTestingNodeValueEventInit = {}) {\n return await this.trigger('change', {\n ...event,\n detail: createValueEventDetail(value, event.detail),\n })\n }\n\n async blur(value?: string, event: HeadlessTestingNodeValueEventInit = {}) {\n return await this.trigger('blur', {\n ...event,\n detail: value == null ? event.detail : createValueEventDetail(value, event.detail),\n })\n }\n\n async wxml() {\n return serializeNode(this.node)\n }\n}\n","import type { HeadlessProjectDescriptor } from '../project'\nimport type { HeadlessPageInstance } from '../runtime'\nimport fs from 'node:fs'\nimport path from 'node:path'\nimport { parseDocument } from 'htmlparser2'\n\ninterface DomNodeLike {\n attribs?: Record<string, string>\n children?: DomNodeLike[]\n data?: string\n name?: string\n parent?: DomNodeLike | null\n type?: string\n}\n\nconst LEADING_SLASH_RE = /^\\/+/\nconst TEMPLATE_INTERPOLATION_RE = /\\{\\{([^{}]+)\\}\\}/g\n\nfunction resolveValueByPath(source: Record<string, any>, expression: string) {\n const normalized = expression.trim()\n if (!normalized) {\n return ''\n }\n const segments = normalized.split('.').filter(Boolean)\n let current: any = source\n for (const segment of segments) {\n current = current?.[segment]\n }\n return current ?? ''\n}\n\nfunction interpolateTemplate(input: string, data: Record<string, any>) {\n return input.replace(TEMPLATE_INTERPOLATION_RE, (_match, expression: string) => {\n const value = resolveValueByPath(data, expression)\n return typeof value === 'string' ? value : String(value)\n })\n}\n\nfunction visitDom(node: DomNodeLike, visitor: (node: DomNodeLike) => void) {\n visitor(node)\n for (const child of node.children ?? []) {\n visitDom(child, visitor)\n }\n}\n\nfunction interpolateDomTree(root: DomNodeLike, data: Record<string, any>) {\n visitDom(root, (node) => {\n if (typeof node.data === 'string') {\n node.data = interpolateTemplate(node.data, data)\n }\n if (node.attribs) {\n for (const [key, value] of Object.entries(node.attribs)) {\n node.attribs[key] = interpolateTemplate(value, data)\n }\n }\n })\n}\n\nfunction escapeText(text: string) {\n return text\n .replaceAll('&', '&')\n .replaceAll('<', '<')\n .replaceAll('>', '>')\n}\n\nfunction escapeAttribute(value: string) {\n return escapeText(value).replaceAll('\"', '"')\n}\n\nfunction serializeDomNode(node: DomNodeLike): string {\n if (node.type === 'text') {\n return escapeText(node.data ?? '')\n }\n\n if (node.type === 'root') {\n return (node.children ?? []).map(serializeDomNode).join('')\n }\n\n const tagName = node.name ?? ''\n if (!tagName) {\n return (node.children ?? []).map(serializeDomNode).join('')\n }\n\n const attrs = Object.entries(node.attribs ?? {})\n .map(([key, value]) => ` ${key}=\"${escapeAttribute(value)}\"`)\n .join('')\n const children = (node.children ?? []).map(serializeDomNode).join('')\n return `<${tagName}${attrs}>${children}</${tagName}>`\n}\n\nexport interface RenderedPageTree {\n root: DomNodeLike\n wxml: string\n}\n\nexport function renderPageTree(project: HeadlessProjectDescriptor, page: HeadlessPageInstance): RenderedPageTree {\n const route = page.route.replace(LEADING_SLASH_RE, '')\n const templatePath = path.resolve(project.miniprogramRootPath, `${route}.wxml`)\n const templateSource = fs.readFileSync(templatePath, 'utf8')\n const document = parseDocument(`<page>${templateSource}</page>`, {\n xmlMode: false,\n decodeEntities: false,\n recognizeSelfClosing: true,\n }) as unknown as DomNodeLike\n\n interpolateDomTree(document, page.data)\n\n return {\n root: document,\n wxml: serializeDomNode((document.children ?? [])[0] ?? document),\n }\n}\n","import type {\n HeadlessWxSelectorQueryBoundingClientRectResult,\n HeadlessWxSelectorQueryFieldsOption,\n HeadlessWxSelectorQueryRequest,\n HeadlessWxSelectorQueryScrollOffsetResult,\n HeadlessWxWindowInfoResult,\n} from '../host'\nimport type { HeadlessPageInstance } from '../runtime'\nimport { querySelectorAll } from './selectors'\n\ninterface DomNodeLike {\n attribs?: Record<string, string>\n children?: DomNodeLike[]\n data?: string\n name?: string\n parent?: DomNodeLike | null\n type?: string\n}\n\nexport interface HeadlessSelectorQueryResolverOptions {\n page: HeadlessPageInstance\n root: DomNodeLike\n windowInfo: HeadlessWxWindowInfoResult\n}\n\nconst DATASET_NAME_RE = /-([a-z])/g\nconst LEADING_MARK_PREFIX_RE = /^mark[:\\-]?/\nconst MARK_NAME_RE = /[:\\-]([a-z])/g\nconst NUMERIC_LIKE_VALUE_RE = /-?\\d+(?:\\.\\d+)?/\n\nfunction toDatasetKey(attributeName: string) {\n return attributeName\n .slice('data-'.length)\n .replace(DATASET_NAME_RE, (_match, char: string) => char.toUpperCase())\n}\n\nfunction collectDataset(node: DomNodeLike) {\n const dataset: Record<string, string> = {}\n for (const [key, value] of Object.entries(node.attribs ?? {})) {\n if (!key.startsWith('data-') || key.startsWith('data-sim-')) {\n continue\n }\n dataset[toDatasetKey(key)] = value\n }\n return dataset\n}\n\nfunction toMarkKey(attributeName: string) {\n return attributeName\n .replace(LEADING_MARK_PREFIX_RE, '')\n .replace(MARK_NAME_RE, (_match, char: string) => char.toUpperCase())\n}\n\nfunction collectMark(node: DomNodeLike) {\n const mark: Record<string, string> = {}\n for (const [key, value] of Object.entries(node.attribs ?? {})) {\n if (!(key.startsWith('mark:') || key.startsWith('mark-'))) {\n continue\n }\n mark[toMarkKey(key)] = value\n }\n return mark\n}\n\nfunction createScopedRoot(node: DomNodeLike): DomNodeLike {\n return {\n children: [node],\n type: 'root',\n }\n}\n\nfunction findNodeByScopeId(root: DomNodeLike, scopeId: string): DomNodeLike | null {\n if (root.attribs?.['data-sim-scope'] === scopeId) {\n return root\n }\n\n for (const child of root.children ?? []) {\n const match = findNodeByScopeId(child, scopeId)\n if (match) {\n return match\n }\n }\n\n return null\n}\n\nfunction parseStyleDeclarations(styleValue?: string) {\n const declarations: Record<string, string> = {}\n if (!styleValue) {\n return declarations\n }\n\n for (const declaration of styleValue.split(';')) {\n const [rawProperty, ...rawValueParts] = declaration.split(':')\n const property = rawProperty?.trim()\n if (!property) {\n continue\n }\n declarations[property] = rawValueParts.join(':').trim()\n }\n\n return declarations\n}\n\nfunction parseNumericLikeValue(value?: string) {\n if (!value) {\n return 0\n }\n const match = value.match(NUMERIC_LIKE_VALUE_RE)\n return match ? Number(match[0]) : 0\n}\n\nfunction resolveRect(node: DomNodeLike): HeadlessWxSelectorQueryBoundingClientRectResult {\n const style = parseStyleDeclarations(node.attribs?.style)\n const left = parseNumericLikeValue(node.attribs?.['data-sim-left'] ?? style.left)\n const top = parseNumericLikeValue(node.attribs?.['data-sim-top'] ?? style.top)\n const width = parseNumericLikeValue(node.attribs?.['data-sim-width'] ?? style.width)\n const height = parseNumericLikeValue(node.attribs?.['data-sim-height'] ?? style.height)\n return {\n bottom: top + height,\n height,\n left,\n right: left + width,\n top,\n width,\n }\n}\n\nfunction resolveScrollOffset(node: DomNodeLike): HeadlessWxSelectorQueryScrollOffsetResult {\n return {\n scrollLeft: parseNumericLikeValue(node.attribs?.['data-sim-scroll-left']),\n scrollTop: parseNumericLikeValue(node.attribs?.['data-sim-scroll-top']),\n }\n}\n\nfunction resolvePropertyValue(node: DomNodeLike, propertyName: string) {\n const normalizedPropertyName = propertyName.trim()\n if (!normalizedPropertyName) {\n return undefined\n }\n\n if (normalizedPropertyName === 'id') {\n return node.attribs?.id ?? ''\n }\n if (normalizedPropertyName === 'class') {\n return node.attribs?.class ?? ''\n }\n if (normalizedPropertyName === 'dataset') {\n return collectDataset(node)\n }\n return node.attribs?.[normalizedPropertyName]\n}\n\nfunction pickProperties(node: DomNodeLike, propertyNames: string[]) {\n const result: Record<string, unknown> = {}\n for (const propertyName of propertyNames) {\n result[propertyName] = resolvePropertyValue(node, propertyName)\n }\n return result\n}\n\nfunction pickComputedStyle(node: DomNodeLike, propertyNames: string[]) {\n const style = parseStyleDeclarations(node.attribs?.style)\n const result: Record<string, string> = {}\n for (const propertyName of propertyNames) {\n result[propertyName] = style[propertyName] ?? ''\n }\n return result\n}\n\nfunction resolveFieldsResult(\n node: DomNodeLike,\n fields: HeadlessWxSelectorQueryFieldsOption,\n _options: HeadlessSelectorQueryResolverOptions,\n) {\n const result: Record<string, any> = {}\n\n if (fields.id) {\n result.id = node.attribs?.id ?? ''\n }\n if (fields.dataset) {\n result.dataset = collectDataset(node)\n }\n if (fields.mark) {\n result.mark = collectMark(node)\n }\n if (fields.rect || fields.size) {\n const rect = resolveRect(node)\n if (fields.rect) {\n Object.assign(result, rect)\n }\n if (fields.size) {\n result.width = rect.width\n result.height = rect.height\n }\n }\n if (fields.scrollOffset) {\n Object.assign(result, resolveScrollOffset(node))\n }\n if (Array.isArray(fields.properties) && fields.properties.length > 0) {\n Object.assign(result, pickProperties(node, fields.properties))\n }\n if (Array.isArray(fields.computedStyle) && fields.computedStyle.length > 0) {\n Object.assign(result, pickComputedStyle(node, fields.computedStyle))\n }\n if (fields.context) {\n result.context = {\n type: 'unsupported-context',\n }\n }\n if (fields.node) {\n result.node = {\n type: node.name ?? 'unknown',\n }\n }\n\n return result\n}\n\nfunction resolveViewportResult(\n fields: HeadlessWxSelectorQueryFieldsOption,\n options: HeadlessSelectorQueryResolverOptions,\n) {\n const result: Record<string, any> = {}\n\n if (fields.rect || fields.size) {\n const rect = {\n bottom: options.windowInfo.windowHeight,\n height: options.windowInfo.windowHeight,\n left: 0,\n right: options.windowInfo.windowWidth,\n top: 0,\n width: options.windowInfo.windowWidth,\n }\n if (fields.rect) {\n Object.assign(result, rect)\n }\n if (fields.size) {\n result.width = rect.width\n result.height = rect.height\n }\n }\n\n if (fields.scrollOffset) {\n result.scrollLeft = 0\n result.scrollTop = options.page.__scrollTop__ ?? 0\n }\n\n return result\n}\n\nfunction resolveRequestResult(\n request: HeadlessWxSelectorQueryRequest,\n options: HeadlessSelectorQueryResolverOptions,\n) {\n if (request.target === 'viewport') {\n return resolveViewportResult(request.fields, options)\n }\n\n const matches = querySelectorAll(options.root, request.selector ?? '')\n if (!request.single) {\n return matches.map(node => resolveFieldsResult(node, request.fields, options))\n }\n\n const match = matches[0]\n return match ? resolveFieldsResult(match, request.fields, options) : null\n}\n\nexport function executeSelectorQueryRequests(\n requests: HeadlessWxSelectorQueryRequest[],\n options: HeadlessSelectorQueryResolverOptions,\n) {\n return requests.map(request => resolveRequestResult(request, options))\n}\n\nexport function resolveSelectorQueryScopeRoot(root: DomNodeLike, scopeId?: string | null) {\n if (!scopeId) {\n return root\n }\n\n const scopedNode = findNodeByScopeId(root, scopeId)\n return scopedNode ? createScopedRoot(scopedNode) : root\n}\n","import type {\n HeadlessAppDefinition,\n HeadlessBehaviorDefinition,\n HeadlessComponentDefinition,\n HeadlessHostLoadContext,\n HeadlessHostRegistries,\n HeadlessPageDefinition,\n} from '../host'\nimport fs from 'node:fs'\nimport path from 'node:path'\nimport process from 'node:process'\nimport vm from 'node:vm'\nimport { normalize } from 'pathe'\nimport {\n createHeadlessWx,\n registerAppDefinition,\n registerComponentDefinition,\n registerPageDefinition,\n} from '../host'\n\nexport interface HeadlessModuleLoader {\n executeComponentModule: (filePath: string, id: string) => HeadlessComponentDefinition\n executeAppModule: (filePath: string) => HeadlessAppDefinition\n executePageModule: (filePath: string, route: string) => HeadlessPageDefinition\n}\n\ninterface ModuleCacheEntry {\n exports: Record<string, any>\n}\n\nfunction createRequireNotFoundError(request: string, importer: string) {\n return new Error(`Cannot resolve require(\"${request}\") from ${normalize(importer)} in headless runtime.`)\n}\n\nfunction resolveRequiredModulePath(importer: string, request: string) {\n if (!request.startsWith('.')) {\n throw createRequireNotFoundError(request, importer)\n }\n\n const basePath = path.resolve(path.dirname(importer), request)\n const candidates = [\n basePath,\n `${basePath}.js`,\n `${basePath}.json`,\n path.join(basePath, 'index.js'),\n ]\n\n for (const candidate of candidates) {\n if (fs.existsSync(candidate)) {\n return candidate\n }\n }\n\n throw createRequireNotFoundError(request, importer)\n}\n\nfunction createExecutionContext(\n registries: HeadlessHostRegistries,\n getCurrentPages: () => any[],\n getApp: () => any,\n wxDriver: Parameters<typeof createHeadlessWx>[0],\n) {\n const wx = createHeadlessWx(wxDriver)\n\n return {\n App(definition: HeadlessAppDefinition) {\n return registerAppDefinition(registries, definition)\n },\n Behavior(definition: HeadlessBehaviorDefinition) {\n return {\n ...definition,\n __isHeadlessBehavior__: true,\n }\n },\n Component(definition: HeadlessComponentDefinition) {\n return registerComponentDefinition(registries, definition)\n },\n Page(definition: HeadlessPageDefinition) {\n return registerPageDefinition(registries, definition)\n },\n console,\n clearTimeout,\n getApp,\n getCurrentPages,\n globalThis: undefined as any,\n process,\n require: undefined as any,\n setInterval,\n setTimeout,\n wx,\n }\n}\n\nexport function createModuleLoader(\n registries: HeadlessHostRegistries,\n getCurrentPages: () => any[],\n getApp: () => any,\n wxDriver: Parameters<typeof createHeadlessWx>[0],\n): HeadlessModuleLoader {\n const moduleCache = new Map<string, ModuleCacheEntry>()\n const executionContext = createExecutionContext(registries, getCurrentPages, getApp, wxDriver)\n executionContext.globalThis = executionContext\n\n function executeModule(filePath: string, loadContext: HeadlessHostLoadContext | null) {\n const resolvedPath = path.resolve(filePath)\n const cached = moduleCache.get(resolvedPath)\n if (cached) {\n return cached.exports\n }\n\n const source = fs.readFileSync(resolvedPath, 'utf8')\n const module = { exports: {} as Record<string, any> }\n moduleCache.set(resolvedPath, module)\n\n const previousLoadContext = registries.currentLoadContext\n registries.currentLoadContext = loadContext\n\n const localRequire = (request: string) => {\n const requiredPath = resolveRequiredModulePath(resolvedPath, request)\n if (requiredPath.endsWith('.json')) {\n const content = fs.readFileSync(requiredPath, 'utf8')\n return JSON.parse(content)\n }\n return executeModule(requiredPath, null)\n }\n\n try {\n const script = new vm.Script(\n `(function (exports, module, require, __filename, __dirname) { ${source}\\n})`,\n {\n filename: resolvedPath,\n },\n )\n const runtime = script.runInNewContext(executionContext)\n runtime(module.exports, module, localRequire, resolvedPath, path.dirname(resolvedPath))\n return module.exports\n }\n finally {\n registries.currentLoadContext = previousLoadContext\n }\n }\n\n return {\n executeAppModule(filePath) {\n executeModule(filePath, { kind: 'app' })\n if (!registries.appDefinition) {\n throw new Error(`App() was not registered while executing ${normalize(filePath)} in headless runtime.`)\n }\n return registries.appDefinition\n },\n executePageModule(filePath, route) {\n executeModule(filePath, { kind: 'page', route })\n const definition = registries.pages.get(route)\n if (!definition) {\n throw new Error(`Page() was not registered for route \"${route}\" while executing ${normalize(filePath)}.`)\n }\n return definition\n },\n executeComponentModule(filePath, id) {\n executeModule(filePath, { kind: 'component', route: id })\n const definition = registries.components.get(id)\n if (!definition) {\n throw new Error(`Component() was not registered for id \"${id}\" while executing ${normalize(filePath)}.`)\n }\n return definition\n },\n }\n}\n","import type {\n HeadlessWxAppBaseInfoResult,\n HeadlessWxMenuButtonBoundingClientRectResult,\n HeadlessWxSystemInfoResult,\n HeadlessWxWindowInfoResult,\n} from '../host'\n\nexport function createDefaultSystemInfo(): HeadlessWxSystemInfoResult {\n return {\n SDKVersion: '0.0.0',\n brand: 'devtools',\n language: 'zh_CN',\n model: 'headless-simulator',\n pixelRatio: 2,\n platform: 'devtools',\n screenHeight: 667,\n screenWidth: 375,\n system: 'iOS 0.0.0',\n version: '0.0.0',\n windowHeight: 667,\n windowWidth: 375,\n }\n}\n\nexport function applyResizeToSystemInfo(\n systemInfo: HeadlessWxSystemInfoResult,\n options: Record<string, any>,\n) {\n const size = options?.size\n const nextWindowWidth = Number(size?.windowWidth)\n const nextWindowHeight = Number(size?.windowHeight)\n\n if (Number.isFinite(nextWindowWidth) && nextWindowWidth > 0) {\n systemInfo.windowWidth = nextWindowWidth\n systemInfo.screenWidth = nextWindowWidth\n }\n\n if (Number.isFinite(nextWindowHeight) && nextWindowHeight > 0) {\n systemInfo.windowHeight = nextWindowHeight\n systemInfo.screenHeight = nextWindowHeight\n }\n\n return systemInfo\n}\n\nexport function deriveWindowInfo(systemInfo: HeadlessWxSystemInfoResult): HeadlessWxWindowInfoResult {\n return {\n pixelRatio: systemInfo.pixelRatio,\n screenHeight: systemInfo.screenHeight,\n screenWidth: systemInfo.screenWidth,\n statusBarHeight: 20,\n windowHeight: systemInfo.windowHeight,\n windowWidth: systemInfo.windowWidth,\n }\n}\n\nexport function deriveAppBaseInfo(systemInfo: HeadlessWxSystemInfoResult): HeadlessWxAppBaseInfoResult {\n return {\n SDKVersion: systemInfo.SDKVersion,\n enableDebug: false,\n host: {\n env: systemInfo.platform,\n },\n language: systemInfo.language,\n platform: systemInfo.platform,\n version: systemInfo.version,\n }\n}\n\nexport function deriveMenuButtonBoundingClientRect(\n systemInfo: HeadlessWxSystemInfoResult,\n): HeadlessWxMenuButtonBoundingClientRectResult {\n const width = 87\n const height = 32\n const top = 32\n const right = Math.max(systemInfo.windowWidth - 12, width)\n const left = Math.max(0, right - width)\n const bottom = top + height\n\n return {\n bottom,\n height,\n left,\n right,\n top,\n width,\n }\n}\n","import type {\n HeadlessWxAccessFileOption,\n HeadlessWxAppendFileOption,\n HeadlessWxCopyFileOption,\n HeadlessWxDownloadFileOption,\n HeadlessWxDownloadFileSuccessResult,\n HeadlessWxFileSystemManager,\n HeadlessWxFileSystemResult,\n HeadlessWxGetNetworkTypeResult,\n HeadlessWxGetSavedFileInfoOption,\n HeadlessWxGetSavedFileInfoSuccessResult,\n HeadlessWxGetSavedFileListSuccessResult,\n HeadlessWxMkdirOption,\n HeadlessWxNetworkStatusChangeCallback,\n HeadlessWxNetworkStatusChangeResult,\n HeadlessWxNetworkType,\n HeadlessWxReadDirOption,\n HeadlessWxReadDirSuccessResult,\n HeadlessWxReadFileOption,\n HeadlessWxReadFileSuccessResult,\n HeadlessWxRemoveSavedFileOption,\n HeadlessWxRenameOption,\n HeadlessWxRequestOption,\n HeadlessWxRequestSuccessResult,\n HeadlessWxRequestTask,\n HeadlessWxRmdirOption,\n HeadlessWxSavedFileInfo,\n HeadlessWxSaveFileOption,\n HeadlessWxSaveFileSuccessResult,\n HeadlessWxShareMenuOption,\n HeadlessWxShowActionSheetOption,\n HeadlessWxShowActionSheetResult,\n HeadlessWxShowLoadingOption,\n HeadlessWxShowModalOption,\n HeadlessWxShowModalResult,\n HeadlessWxShowToastOption,\n HeadlessWxStatOption,\n HeadlessWxStats,\n HeadlessWxStatSuccessResult,\n HeadlessWxUnlinkOption,\n HeadlessWxUploadFileOption,\n HeadlessWxUploadFileSuccessResult,\n HeadlessWxWriteFileOption,\n} from '../host'\n\nexport interface HeadlessWxLoadingSnapshot {\n mask: boolean\n title: string\n}\n\nexport interface HeadlessWxToastSnapshot {\n duration: number\n icon: string\n mask: boolean\n title: string\n}\n\nexport interface HeadlessWxNetworkSnapshot extends HeadlessWxNetworkStatusChangeResult {}\n\nexport interface HeadlessWxShareMenuSnapshot {\n isUpdatableMessage: boolean\n menus: string[]\n visible: boolean\n withShareTicket: boolean\n}\n\nexport interface HeadlessWxActionSheetMockDefinition {\n cancel?: boolean\n tapIndex?: number\n}\n\nexport interface HeadlessWxActionSheetLogEntry {\n itemList: string[]\n result?: HeadlessWxShowActionSheetResult\n}\n\nexport interface HeadlessWxModalMockDefinition {\n cancel?: boolean\n confirm?: boolean\n}\n\nexport interface HeadlessWxModalLogEntry {\n cancelColor: string\n cancelText: string\n confirmColor: string\n confirmText: string\n content: string\n result: HeadlessWxShowModalResult\n showCancel: boolean\n title: string\n}\n\nexport interface HeadlessWxRequestMockDefinition {\n delay?: number\n header?: Record<string, string>\n method?: string\n response:\n | unknown\n | ((option: HeadlessWxRequestOption) => unknown)\n statusCode?: number\n url: RegExp | string\n}\n\nexport interface HeadlessWxRequestLogEntry {\n data: unknown\n header: Record<string, string>\n matched: boolean\n method: string\n response?: HeadlessWxRequestSuccessResult\n url: string\n}\n\nexport interface HeadlessWxDownloadFileMockDefinition {\n delay?: number\n fileContent:\n | string\n | ((option: HeadlessWxDownloadFileOption) => string)\n header?: Record<string, string>\n statusCode?: number\n url: RegExp | string\n}\n\nexport interface HeadlessWxDownloadFileLogEntry {\n header: Record<string, string>\n matched: boolean\n response?: HeadlessWxDownloadFileSuccessResult\n tempFilePath?: string\n url: string\n}\n\nexport interface HeadlessWxUploadFileMockDefinition {\n delay?: number\n header?: Record<string, string>\n method?: string\n response:\n | string\n | Partial<HeadlessWxUploadFileSuccessResult>\n | ((option: HeadlessWxUploadFileOption & { fileContent: string }) => string | Partial<HeadlessWxUploadFileSuccessResult>)\n statusCode?: number\n url: RegExp | string\n}\n\nexport interface HeadlessWxUploadFileLogEntry {\n fileContent: string\n fileName?: string\n filePath: string\n formData: Record<string, unknown>\n header: Record<string, string>\n matched: boolean\n name: string\n response?: HeadlessWxUploadFileSuccessResult\n url: string\n}\n\nconst STORAGE_LIMIT_SIZE = 10 * 1024\nconst DEFAULT_MODAL_CANCEL_COLOR = '#000000'\nconst DEFAULT_MODAL_CANCEL_TEXT = '取消'\nconst DEFAULT_MODAL_CONFIRM_COLOR = '#576B95'\nconst DEFAULT_MODAL_CONFIRM_TEXT = '确定'\nconst TRAILING_SLASH_RE = /\\/+$/\nconst SAVED_FILE_PREFIXES = ['headless://saved/', 'headless://wxfile/saved/'] as const\nconst textEncoder = new TextEncoder()\n\nfunction byteLength(input: string) {\n return textEncoder.encode(input).byteLength\n}\n\nfunction cloneShareMenuSnapshot(snapshot: HeadlessWxShareMenuSnapshot) {\n return {\n isUpdatableMessage: snapshot.isUpdatableMessage,\n menus: [...snapshot.menus],\n visible: snapshot.visible,\n withShareTicket: snapshot.withShareTicket,\n }\n}\n\nfunction createNetworkSnapshot(networkType: HeadlessWxNetworkType): HeadlessWxNetworkSnapshot {\n return {\n isConnected: networkType !== 'none',\n networkType,\n }\n}\n\nfunction cloneValue<T>(value: T): T {\n if (value == null || typeof value !== 'object') {\n return value\n }\n return JSON.parse(JSON.stringify(value)) as T\n}\n\nfunction normalizeMethod(method?: string) {\n return (method || 'GET').trim().toUpperCase()\n}\n\nfunction isRequestSuccessResult(value: unknown): value is Partial<HeadlessWxRequestSuccessResult> & { data: unknown } {\n return !!value && typeof value === 'object' && 'data' in value\n}\n\nfunction matchesRequestMock(mock: HeadlessWxRequestMockDefinition, option: HeadlessWxRequestOption) {\n const requestMethod = normalizeMethod(option.method)\n const mockMethod = normalizeMethod(mock.method)\n if (mock.method && requestMethod !== mockMethod) {\n return false\n }\n\n if (typeof mock.url === 'string') {\n return mock.url === option.url\n }\n\n mock.url.lastIndex = 0\n return mock.url.test(option.url)\n}\n\nfunction resolveRequestResponse(\n mock: HeadlessWxRequestMockDefinition,\n option: HeadlessWxRequestOption,\n): HeadlessWxRequestSuccessResult {\n const rawResponse = typeof mock.response === 'function'\n ? mock.response(option)\n : mock.response\n\n if (isRequestSuccessResult(rawResponse)) {\n return {\n cookies: Array.isArray(rawResponse.cookies) ? [...rawResponse.cookies] : [],\n data: cloneValue(rawResponse.data),\n errMsg: rawResponse.errMsg ?? 'request:ok',\n header: { ...rawResponse.header },\n statusCode: rawResponse.statusCode ?? mock.statusCode ?? 200,\n }\n }\n\n return {\n cookies: [],\n data: cloneValue(rawResponse),\n errMsg: 'request:ok',\n header: { ...(mock.header ?? {}) },\n statusCode: mock.statusCode ?? 200,\n }\n}\n\nfunction matchesSimpleUrlMock(\n mock: { url: RegExp | string },\n url: string,\n) {\n if (typeof mock.url === 'string') {\n return mock.url === url\n }\n\n mock.url.lastIndex = 0\n return mock.url.test(url)\n}\n\nfunction resolveDownloadFileResponse(\n mock: HeadlessWxDownloadFileMockDefinition,\n option: HeadlessWxDownloadFileOption,\n tempFilePath: string,\n): { fileContent: string, result: HeadlessWxDownloadFileSuccessResult } {\n const fileContent = typeof mock.fileContent === 'function'\n ? mock.fileContent(option)\n : mock.fileContent\n\n return {\n fileContent,\n result: {\n errMsg: 'downloadFile:ok',\n statusCode: mock.statusCode ?? 200,\n tempFilePath,\n },\n }\n}\n\nfunction resolveUploadFileResponse(\n mock: HeadlessWxUploadFileMockDefinition,\n option: HeadlessWxUploadFileOption,\n fileContent: string,\n): HeadlessWxUploadFileSuccessResult {\n const rawResponse = typeof mock.response === 'function'\n ? mock.response({\n ...option,\n fileContent,\n })\n : mock.response\n\n if (typeof rawResponse === 'string') {\n return {\n data: rawResponse,\n errMsg: 'uploadFile:ok',\n statusCode: mock.statusCode ?? 200,\n }\n }\n\n return {\n data: rawResponse.data == null ? '' : String(rawResponse.data),\n errMsg: rawResponse.errMsg ?? 'uploadFile:ok',\n statusCode: rawResponse.statusCode ?? mock.statusCode ?? 200,\n }\n}\n\nfunction normalizeDelay(delay?: number) {\n return Number.isFinite(delay)\n ? Math.max(0, Math.trunc(delay ?? 0))\n : 0\n}\n\nfunction createNoopTask(): HeadlessWxRequestTask {\n return {\n abort() {},\n }\n}\n\nfunction normalizeEncoding(encoding?: string) {\n const normalized = (encoding ?? 'utf8').trim().toLowerCase()\n if (normalized === 'utf8' || normalized === 'utf-8') {\n return 'utf8'\n }\n throw new Error(`Unsupported file encoding in headless runtime: ${encoding}`)\n}\n\nfunction isSavedFilePath(path: string) {\n return SAVED_FILE_PREFIXES.some(prefix => path === prefix.slice(0, -1) || path.startsWith(prefix))\n}\n\nfunction normalizeFsPath(input: string) {\n const trimmed = input.trim()\n if (!trimmed) {\n throw new Error('File path must be a non-empty string in headless runtime.')\n }\n if (trimmed.length > 1 && trimmed.endsWith('/')) {\n return trimmed.replace(TRAILING_SLASH_RE, '')\n }\n return trimmed\n}\n\nfunction splitFsPath(input: string) {\n const normalized = normalizeFsPath(input)\n const schemeIndex = normalized.indexOf('://')\n if (schemeIndex >= 0) {\n const afterScheme = schemeIndex + 3\n const firstSlash = normalized.indexOf('/', afterScheme)\n if (firstSlash < 0) {\n return {\n prefix: normalized,\n segments: [] as string[],\n }\n }\n return {\n prefix: normalized.slice(0, firstSlash),\n segments: normalized.slice(firstSlash + 1).split('/').filter(Boolean),\n }\n }\n\n const absolute = normalized.startsWith('/')\n return {\n prefix: absolute ? '/' : '',\n segments: normalized.split('/').filter(Boolean),\n }\n}\n\nfunction joinFsPath(prefix: string, segments: string[]) {\n if (segments.length === 0) {\n return prefix || '.'\n }\n if (!prefix) {\n return segments.join('/')\n }\n if (prefix === '/') {\n return `/${segments.join('/')}`\n }\n return `${prefix}/${segments.join('/')}`\n}\n\nfunction listParentDirectories(input: string) {\n const { prefix, segments } = splitFsPath(input)\n const parents: string[] = []\n if (segments.length === 0) {\n if (prefix && prefix !== '/') {\n parents.push(prefix)\n }\n return parents\n }\n\n for (let index = 0; index < segments.length; index += 1) {\n const parentPath = joinFsPath(prefix, segments.slice(0, index))\n if (parentPath !== '.' && parentPath !== '/') {\n parents.push(parentPath)\n }\n }\n return parents\n}\n\nexport function createHeadlessWxState() {\n const actionSheetLogs: HeadlessWxActionSheetLogEntry[] = []\n const actionSheetMocks: HeadlessWxActionSheetMockDefinition[] = []\n const downloadFileLogs: HeadlessWxDownloadFileLogEntry[] = []\n const downloadFileMocks: HeadlessWxDownloadFileMockDefinition[] = []\n const modalLogs: HeadlessWxModalLogEntry[] = []\n const networkStatusChangeCallbacks = new Set<HeadlessWxNetworkStatusChangeCallback>()\n const modalMocks: HeadlessWxModalMockDefinition[] = []\n const requestLogs: HeadlessWxRequestLogEntry[] = []\n const requestMocks: HeadlessWxRequestMockDefinition[] = []\n const storage = new Map<string, unknown>()\n const uploadFileLogs: HeadlessWxUploadFileLogEntry[] = []\n const uploadFileMocks: HeadlessWxUploadFileMockDefinition[] = []\n const files = new Map<string, string>()\n const savedFiles = new Map<string, HeadlessWxSavedFileInfo>()\n const directories = new Set<string>()\n let fileId = 0\n let loading: HeadlessWxLoadingSnapshot | null = null\n let networkType: HeadlessWxNetworkType = 'wifi'\n let shareMenu: HeadlessWxShareMenuSnapshot = {\n isUpdatableMessage: false,\n menus: [],\n visible: false,\n withShareTicket: false,\n }\n let toast: HeadlessWxToastSnapshot | null = null\n\n const allocateFilePath = (bucket: 'saved' | 'temp', preferredPath?: string) => {\n if (typeof preferredPath === 'string' && preferredPath.trim()) {\n return preferredPath.trim()\n }\n fileId += 1\n return `headless://wxfile/${bucket}/${String(fileId).padStart(4, '0')}`\n }\n\n const runDelayedTask = <TResult>(\n delay: number,\n onSuccess: (result: TResult) => void,\n onFail: (error: Error) => void,\n abortMessage: string,\n ) => {\n if (delay <= 0) {\n onSuccess(undefined as TResult)\n return createNoopTask()\n }\n\n let completed = false\n const timer = setTimeout(() => {\n if (completed) {\n return\n }\n completed = true\n onSuccess(undefined as TResult)\n }, delay)\n\n return {\n abort() {\n if (completed) {\n return\n }\n completed = true\n clearTimeout(timer)\n onFail(new Error(abortMessage))\n },\n }\n }\n\n const ensureDirectoryTree = (targetPath: string) => {\n for (const directoryPath of listParentDirectories(targetPath)) {\n directories.add(directoryPath)\n }\n }\n\n const createStats = (isDirectory: boolean, size: number): HeadlessWxStats => ({\n isDirectory: () => isDirectory,\n isFile: () => !isDirectory,\n size,\n })\n\n const updateSavedFileMetadata = (normalizedPath: string, fileContent: string) => {\n const savedFile = savedFiles.get(normalizedPath)\n if (!savedFile) {\n return\n }\n savedFiles.set(normalizedPath, {\n ...savedFile,\n size: fileContent.length,\n })\n }\n\n const setSavedFileMetadata = (normalizedPath: string, fileContent: string, createTime = Date.now()) => {\n savedFiles.set(normalizedPath, {\n createTime,\n filePath: normalizedPath,\n size: fileContent.length,\n })\n }\n\n const accessFile = (filePath: string): HeadlessWxFileSystemResult => {\n const normalizedPath = normalizeFsPath(filePath)\n if (!files.has(normalizedPath) && !directories.has(normalizedPath)) {\n throw new Error(`access:fail no such file or directory, access '${normalizedPath}'`)\n }\n return {\n errMsg: 'access:ok',\n }\n }\n\n const readFile = (filePath: string, encoding?: string): HeadlessWxReadFileSuccessResult => {\n normalizeEncoding(encoding)\n const normalizedPath = normalizeFsPath(filePath)\n const fileContent = files.get(normalizedPath)\n if (fileContent == null) {\n throw new Error(`readFile:fail no such file or directory, open '${normalizedPath}'`)\n }\n return {\n data: fileContent,\n errMsg: 'readFile:ok',\n }\n }\n\n const writeFile = (filePath: string, data: string, encoding?: string): HeadlessWxFileSystemResult => {\n const normalizedPath = normalizeFsPath(filePath)\n normalizeEncoding(encoding)\n ensureDirectoryTree(normalizedPath)\n const fileContent = String(data)\n files.set(normalizedPath, fileContent)\n updateSavedFileMetadata(normalizedPath, fileContent)\n return {\n errMsg: 'writeFile:ok',\n }\n }\n\n const appendFile = (filePath: string, data: string, encoding?: string): HeadlessWxFileSystemResult => {\n const normalizedPath = normalizeFsPath(filePath)\n normalizeEncoding(encoding)\n ensureDirectoryTree(normalizedPath)\n const currentContent = files.get(normalizedPath) ?? ''\n const nextFileContent = `${currentContent}${String(data)}`\n files.set(normalizedPath, nextFileContent)\n updateSavedFileMetadata(normalizedPath, nextFileContent)\n return {\n errMsg: 'appendFile:ok',\n }\n }\n\n const copyFile = (srcPath: string, destPath: string): HeadlessWxFileSystemResult => {\n const normalizedSrcPath = normalizeFsPath(srcPath)\n const normalizedDestPath = normalizeFsPath(destPath)\n const fileContent = files.get(normalizedSrcPath)\n if (fileContent == null) {\n throw new Error(`copyFile:fail no such file or directory, copyfile '${normalizedSrcPath}'`)\n }\n ensureDirectoryTree(normalizedDestPath)\n files.set(normalizedDestPath, fileContent)\n if (savedFiles.has(normalizedDestPath)) {\n setSavedFileMetadata(\n normalizedDestPath,\n fileContent,\n savedFiles.get(normalizedDestPath)?.createTime ?? Date.now(),\n )\n }\n return {\n errMsg: 'copyFile:ok',\n }\n }\n\n const renameFile = (oldPath: string, newPath: string): HeadlessWxFileSystemResult => {\n const normalizedOldPath = normalizeFsPath(oldPath)\n const normalizedNewPath = normalizeFsPath(newPath)\n const fileContent = files.get(normalizedOldPath)\n if (fileContent == null) {\n throw new Error(`rename:fail no such file or directory, rename '${normalizedOldPath}'`)\n }\n const targetSavedFile = savedFiles.get(normalizedNewPath)\n files.delete(normalizedOldPath)\n const savedFile = savedFiles.get(normalizedOldPath)\n if (savedFile) {\n savedFiles.delete(normalizedOldPath)\n }\n ensureDirectoryTree(normalizedNewPath)\n files.set(normalizedNewPath, fileContent)\n if (targetSavedFile) {\n savedFiles.set(normalizedNewPath, {\n ...targetSavedFile,\n size: fileContent.length,\n })\n }\n else if (savedFile && isSavedFilePath(normalizedNewPath)) {\n savedFiles.set(normalizedNewPath, {\n ...savedFile,\n filePath: normalizedNewPath,\n size: fileContent.length,\n })\n }\n return {\n errMsg: 'rename:ok',\n }\n }\n\n const unlinkFile = (filePath: string): HeadlessWxFileSystemResult => {\n const normalizedPath = normalizeFsPath(filePath)\n if (!files.has(normalizedPath)) {\n throw new Error(`unlink:fail no such file or directory, unlink '${normalizedPath}'`)\n }\n files.delete(normalizedPath)\n savedFiles.delete(normalizedPath)\n return {\n errMsg: 'unlink:ok',\n }\n }\n\n const mkdir = (dirPath: string, recursive = false): HeadlessWxFileSystemResult => {\n const normalizedPath = normalizeFsPath(dirPath)\n if (!recursive) {\n const directParent = listParentDirectories(normalizedPath).at(-1)\n if (directParent && !directories.has(directParent)) {\n throw new Error(`mkdir:fail no such file or directory, mkdir '${normalizedPath}'`)\n }\n }\n for (const directoryPath of [...listParentDirectories(normalizedPath), normalizedPath]) {\n directories.add(directoryPath)\n }\n return {\n errMsg: 'mkdir:ok',\n }\n }\n\n const readdir = (dirPath: string): HeadlessWxReadDirSuccessResult => {\n const normalizedPath = normalizeFsPath(dirPath)\n if (!directories.has(normalizedPath)) {\n throw new Error(`readdir:fail no such file or directory, scandir '${normalizedPath}'`)\n }\n const { prefix, segments } = splitFsPath(normalizedPath)\n const baseDepth = segments.length\n const entries = new Set<string>()\n\n for (const directoryPath of directories) {\n if (directoryPath === normalizedPath) {\n continue\n }\n const current = splitFsPath(directoryPath)\n if (current.prefix !== prefix || current.segments.length <= baseDepth) {\n continue\n }\n if (current.segments.slice(0, baseDepth).join('/') !== segments.join('/')) {\n continue\n }\n entries.add(current.segments[baseDepth])\n }\n\n for (const filePath of files.keys()) {\n const current = splitFsPath(filePath)\n if (current.prefix !== prefix || current.segments.length <= baseDepth) {\n continue\n }\n if (current.segments.slice(0, baseDepth).join('/') !== segments.join('/')) {\n continue\n }\n entries.add(current.segments[baseDepth])\n }\n\n return {\n errMsg: 'readdir:ok',\n files: Array.from(entries).sort((a, b) => a.localeCompare(b)),\n }\n }\n\n const rmdir = (dirPath: string, recursive = false): HeadlessWxFileSystemResult => {\n const normalizedPath = normalizeFsPath(dirPath)\n if (files.has(normalizedPath)) {\n throw new Error(`rmdir:fail not a directory, rmdir '${normalizedPath}'`)\n }\n if (!directories.has(normalizedPath)) {\n throw new Error(`rmdir:fail no such file or directory, rmdir '${normalizedPath}'`)\n }\n\n const childDirectoryPaths = Array.from(directories)\n .filter(currentPath => currentPath !== normalizedPath && currentPath.startsWith(`${normalizedPath}/`))\n const childFilePaths = Array.from(files.keys())\n .filter(currentPath => currentPath.startsWith(`${normalizedPath}/`))\n\n if (!recursive && (childDirectoryPaths.length > 0 || childFilePaths.length > 0)) {\n throw new Error(`rmdir:fail directory not empty, rmdir '${normalizedPath}'`)\n }\n\n directories.delete(normalizedPath)\n childDirectoryPaths.forEach(currentPath => directories.delete(currentPath))\n childFilePaths.forEach((currentPath) => {\n files.delete(currentPath)\n savedFiles.delete(currentPath)\n })\n return {\n errMsg: 'rmdir:ok',\n }\n }\n\n const stat = (inputPath: string): HeadlessWxStatSuccessResult => {\n const normalizedPath = normalizeFsPath(inputPath)\n if (files.has(normalizedPath)) {\n return {\n errMsg: 'stat:ok',\n stats: createStats(false, files.get(normalizedPath)?.length ?? 0),\n }\n }\n if (directories.has(normalizedPath)) {\n return {\n errMsg: 'stat:ok',\n stats: createStats(true, 0),\n }\n }\n throw new Error(`stat:fail no such file or directory, stat '${normalizedPath}'`)\n }\n\n const getSavedFileList = (): HeadlessWxGetSavedFileListSuccessResult => {\n return {\n errMsg: 'getSavedFileList:ok',\n fileList: Array.from(savedFiles.values())\n .map(item => ({ ...item }))\n .sort((a, b) => a.filePath.localeCompare(b.filePath)),\n }\n }\n\n const getSavedFileInfo = (filePath: string): HeadlessWxGetSavedFileInfoSuccessResult => {\n const normalizedPath = normalizeFsPath(filePath)\n const savedFile = savedFiles.get(normalizedPath)\n if (!savedFile) {\n throw new Error(`getSavedFileInfo:fail no such file or directory, stat '${normalizedPath}'`)\n }\n return {\n createTime: savedFile.createTime,\n errMsg: 'getSavedFileInfo:ok',\n size: savedFile.size,\n }\n }\n\n const removeSavedFile = (filePath: string) => {\n const normalizedPath = normalizeFsPath(filePath)\n if (!savedFiles.has(normalizedPath)) {\n throw new Error(`removeSavedFile:fail no such file or directory, unlink '${normalizedPath}'`)\n }\n savedFiles.delete(normalizedPath)\n files.delete(normalizedPath)\n return {\n errMsg: 'removeSavedFile:ok',\n }\n }\n\n const fileSystemManager: HeadlessWxFileSystemManager = {\n access(option: HeadlessWxAccessFileOption) {\n try {\n const result = accessFile(option.path)\n option.success?.(result)\n option.complete?.(result)\n return result\n }\n catch (error) {\n option.fail?.(error as Error)\n option.complete?.()\n return undefined\n }\n },\n accessSync(path: string) {\n accessFile(path)\n },\n appendFile(option: HeadlessWxAppendFileOption) {\n try {\n const result = appendFile(option.filePath, option.data, option.encoding)\n option.success?.(result)\n option.complete?.(result)\n return result\n }\n catch (error) {\n option.fail?.(error as Error)\n option.complete?.()\n return undefined\n }\n },\n appendFileSync(filePath: string, data: string, encoding?: string) {\n appendFile(filePath, data, encoding)\n },\n copyFile(option: HeadlessWxCopyFileOption) {\n try {\n const result = copyFile(option.srcPath, option.destPath)\n option.success?.(result)\n option.complete?.(result)\n return result\n }\n catch (error) {\n option.fail?.(error as Error)\n option.complete?.()\n return undefined\n }\n },\n copyFileSync(srcPath: string, destPath: string) {\n copyFile(srcPath, destPath)\n },\n mkdir(option: HeadlessWxMkdirOption) {\n try {\n const result = mkdir(option.dirPath, option.recursive)\n option.success?.(result)\n option.complete?.(result)\n return result\n }\n catch (error) {\n option.fail?.(error as Error)\n option.complete?.()\n return undefined\n }\n },\n mkdirSync(dirPath: string, recursive?: boolean) {\n mkdir(dirPath, recursive)\n },\n readFile(option: HeadlessWxReadFileOption) {\n try {\n const result = readFile(option.filePath, option.encoding)\n option.success?.(result)\n option.complete?.(result)\n return result\n }\n catch (error) {\n option.fail?.(error as Error)\n option.complete?.()\n return undefined\n }\n },\n readFileSync(filePath: string, encoding?: string) {\n return readFile(filePath, encoding).data\n },\n readdir(option: HeadlessWxReadDirOption) {\n try {\n const result = readdir(option.dirPath)\n option.success?.(result)\n option.complete?.(result)\n return result\n }\n catch (error) {\n option.fail?.(error as Error)\n option.complete?.()\n return undefined\n }\n },\n readdirSync(dirPath: string) {\n return readdir(dirPath).files\n },\n rmdir(option: HeadlessWxRmdirOption) {\n try {\n const result = rmdir(option.dirPath, option.recursive)\n option.success?.(result)\n option.complete?.(result)\n return result\n }\n catch (error) {\n option.fail?.(error as Error)\n option.complete?.()\n return undefined\n }\n },\n rmdirSync(dirPath: string, recursive?: boolean) {\n rmdir(dirPath, recursive)\n },\n rename(option: HeadlessWxRenameOption) {\n try {\n const result = renameFile(option.oldPath, option.newPath)\n option.success?.(result)\n option.complete?.(result)\n return result\n }\n catch (error) {\n option.fail?.(error as Error)\n option.complete?.()\n return undefined\n }\n },\n renameSync(oldPath: string, newPath: string) {\n renameFile(oldPath, newPath)\n },\n stat(option: HeadlessWxStatOption) {\n try {\n const result = stat(option.path)\n option.success?.(result)\n option.complete?.(result)\n return result\n }\n catch (error) {\n option.fail?.(error as Error)\n option.complete?.()\n return undefined\n }\n },\n statSync(path: string) {\n return stat(path).stats\n },\n unlink(option: HeadlessWxUnlinkOption) {\n try {\n const result = unlinkFile(option.filePath)\n option.success?.(result)\n option.complete?.(result)\n return result\n }\n catch (error) {\n option.fail?.(error as Error)\n option.complete?.()\n return undefined\n }\n },\n unlinkSync(filePath: string) {\n unlinkFile(filePath)\n },\n writeFile(option: HeadlessWxWriteFileOption) {\n try {\n const result = writeFile(option.filePath, option.data, option.encoding)\n option.success?.(result)\n option.complete?.(result)\n return result\n }\n catch (error) {\n option.fail?.(error as Error)\n option.complete?.()\n return undefined\n }\n },\n writeFileSync(filePath: string, data: string, encoding?: string) {\n writeFile(filePath, data, encoding)\n },\n }\n\n return {\n clearStorageSync() {\n storage.clear()\n },\n downloadFile(option: HeadlessWxDownloadFileOption): HeadlessWxRequestTask {\n const matchedMock = downloadFileMocks.find(mock => matchesSimpleUrlMock(mock, option.url))\n if (!matchedMock) {\n const logEntry: HeadlessWxDownloadFileLogEntry = {\n header: { ...(option.header ?? {}) },\n matched: false,\n url: option.url,\n }\n downloadFileLogs.push(logEntry)\n const error = new Error(`No downloadFile mock matched in headless runtime: ${option.url}`)\n option.fail?.(error)\n option.complete?.()\n return createNoopTask()\n }\n\n const tempFilePath = allocateFilePath('temp', option.filePath)\n const delay = normalizeDelay(matchedMock.delay)\n const logEntry: HeadlessWxDownloadFileLogEntry = {\n header: { ...(option.header ?? {}) },\n matched: true,\n response: {\n errMsg: 'downloadFile:ok',\n statusCode: matchedMock.statusCode ?? 200,\n tempFilePath,\n },\n tempFilePath,\n url: option.url,\n }\n\n const commit = () => {\n const { fileContent, result } = resolveDownloadFileResponse(matchedMock, option, tempFilePath)\n ensureDirectoryTree(tempFilePath)\n files.set(tempFilePath, fileContent)\n logEntry.response = { ...result }\n downloadFileLogs.push(logEntry)\n option.success?.(result)\n option.complete?.(result)\n }\n\n const fail = (error: Error) => {\n option.fail?.(error)\n option.complete?.()\n }\n\n if (delay <= 0) {\n commit()\n return createNoopTask()\n }\n\n return runDelayedTask(delay, commit, fail, 'downloadFile:fail abort')\n },\n getActionSheetLogs() {\n return actionSheetLogs.map(entry => ({\n ...entry,\n itemList: [...entry.itemList],\n result: entry.result ? { ...entry.result } : undefined,\n }))\n },\n getDownloadFileLogs() {\n return downloadFileLogs.map(entry => ({\n ...entry,\n header: { ...entry.header },\n response: entry.response ? { ...entry.response } : undefined,\n }))\n },\n getFileSnapshot() {\n return Object.fromEntries(files.entries())\n },\n getDirectorySnapshot() {\n return Array.from(directories.values()).sort((a, b) => a.localeCompare(b))\n },\n getFileSystemManager() {\n return fileSystemManager\n },\n getSavedFileInfo(option: HeadlessWxGetSavedFileInfoOption) {\n return getSavedFileInfo(option.filePath)\n },\n getSavedFileList() {\n return getSavedFileList()\n },\n getFileText(filePath: string) {\n return files.get(filePath) ?? null\n },\n getNetworkType(): HeadlessWxGetNetworkTypeResult {\n return {\n errMsg: 'getNetworkType:ok',\n networkType,\n }\n },\n getModalLogs() {\n return modalLogs.map(entry => ({\n ...entry,\n result: { ...entry.result },\n }))\n },\n getRequestLogs() {\n return requestLogs.map(entry => ({\n ...entry,\n data: cloneValue(entry.data),\n header: { ...entry.header },\n response: entry.response\n ? {\n ...entry.response,\n cookies: [...entry.response.cookies],\n data: cloneValue(entry.response.data),\n header: { ...entry.response.header },\n }\n : undefined,\n }))\n },\n getStorageInfoSync() {\n const keys = Array.from(storage.keys()).sort((a, b) => a.localeCompare(b))\n const totalBytes = Array.from(storage.entries()).reduce((sum, [key, value]) => {\n return sum + byteLength(JSON.stringify([key, value]))\n }, 0)\n return {\n currentSize: Math.ceil(totalBytes / 1024),\n errMsg: 'getStorageInfo:ok',\n keys,\n limitSize: STORAGE_LIMIT_SIZE,\n }\n },\n getStorageSnapshot() {\n return Object.fromEntries(\n Array.from(storage.entries(), ([key, value]) => [key, cloneValue(value)]),\n )\n },\n getStorageSync(key: string) {\n return cloneValue(storage.get(key))\n },\n getShareMenu() {\n return cloneShareMenuSnapshot(shareMenu)\n },\n getLoading() {\n return loading ? { ...loading } : null\n },\n hideShareMenu() {\n shareMenu = {\n ...shareMenu,\n visible: false,\n }\n return {\n errMsg: 'hideShareMenu:ok',\n }\n },\n getToast() {\n return toast ? { ...toast } : null\n },\n getUploadFileLogs() {\n return uploadFileLogs.map(entry => ({\n ...entry,\n formData: cloneValue(entry.formData),\n header: { ...entry.header },\n response: entry.response ? { ...entry.response } : undefined,\n }))\n },\n hideLoading() {\n loading = null\n return {\n errMsg: 'hideLoading:ok',\n }\n },\n hideToast() {\n toast = null\n return {\n errMsg: 'hideToast:ok',\n }\n },\n offNetworkStatusChange(callback?: HeadlessWxNetworkStatusChangeCallback) {\n if (!callback) {\n networkStatusChangeCallbacks.clear()\n return\n }\n networkStatusChangeCallbacks.delete(callback)\n },\n mockRequest(definition: HeadlessWxRequestMockDefinition) {\n requestMocks.push({\n ...definition,\n delay: definition.delay,\n header: definition.header ? { ...definition.header } : undefined,\n })\n },\n mockDownloadFile(definition: HeadlessWxDownloadFileMockDefinition) {\n downloadFileMocks.push({\n ...definition,\n delay: definition.delay,\n header: definition.header ? { ...definition.header } : undefined,\n })\n },\n mockModal(definition: HeadlessWxModalMockDefinition = {}) {\n modalMocks.push({\n cancel: definition.cancel,\n confirm: definition.confirm,\n })\n },\n mockUploadFile(definition: HeadlessWxUploadFileMockDefinition) {\n uploadFileMocks.push({\n ...definition,\n delay: definition.delay,\n header: definition.header ? { ...definition.header } : undefined,\n })\n },\n mockActionSheet(definition: HeadlessWxActionSheetMockDefinition = {}) {\n actionSheetMocks.push({\n cancel: definition.cancel,\n tapIndex: definition.tapIndex,\n })\n },\n onNetworkStatusChange(callback: HeadlessWxNetworkStatusChangeCallback) {\n networkStatusChangeCallbacks.add(callback)\n },\n removeStorageSync(key: string) {\n storage.delete(key)\n },\n request(option: HeadlessWxRequestOption): HeadlessWxRequestTask {\n const matchedMock = requestMocks.find(mock => matchesRequestMock(mock, option))\n if (!matchedMock) {\n const logEntry: HeadlessWxRequestLogEntry = {\n data: cloneValue(option.data),\n header: { ...(option.header ?? {}) },\n matched: false,\n method: normalizeMethod(option.method),\n url: option.url,\n }\n requestLogs.push(logEntry)\n const error = new Error(`No request mock matched in headless runtime: ${normalizeMethod(option.method)} ${option.url}`)\n option.fail?.(error)\n option.complete?.()\n return createNoopTask()\n }\n\n const response = resolveRequestResponse(matchedMock, option)\n const requestLogEntry: HeadlessWxRequestLogEntry = {\n data: cloneValue(option.data),\n header: { ...(option.header ?? {}) },\n matched: true,\n method: normalizeMethod(option.method),\n response,\n url: option.url,\n }\n const delay = Number.isFinite(matchedMock.delay)\n ? Math.max(0, Math.trunc(matchedMock.delay ?? 0))\n : 0\n\n if (delay <= 0) {\n requestLogs.push(requestLogEntry)\n option.success?.(response)\n option.complete?.(response)\n return createNoopTask()\n }\n\n return runDelayedTask(delay, () => {\n requestLogs.push(requestLogEntry)\n option.success?.(response)\n option.complete?.(response)\n }, (error) => {\n option.fail?.(error)\n option.complete?.()\n }, 'request:fail abort')\n },\n removeSavedFile(option: HeadlessWxRemoveSavedFileOption) {\n return removeSavedFile(option.filePath)\n },\n saveFile(option: HeadlessWxSaveFileOption): HeadlessWxSaveFileSuccessResult {\n const fileContent = files.get(option.tempFilePath)\n if (fileContent == null) {\n throw new Error(`saveFile:fail tempFilePath not found: ${option.tempFilePath}`)\n }\n\n const savedFilePath = allocateFilePath('saved', option.filePath)\n ensureDirectoryTree(savedFilePath)\n files.set(savedFilePath, fileContent)\n setSavedFileMetadata(\n savedFilePath,\n fileContent,\n savedFiles.get(savedFilePath)?.createTime ?? Date.now(),\n )\n return {\n errMsg: 'saveFile:ok',\n savedFilePath,\n }\n },\n setStorageSync(key: string, value: unknown) {\n storage.set(key, cloneValue(value))\n },\n setFile(filePath: string, fileContent: string) {\n const normalizedPath = normalizeFsPath(filePath)\n ensureDirectoryTree(normalizedPath)\n files.set(normalizedPath, fileContent)\n },\n setNetworkType(nextNetworkType: HeadlessWxNetworkType) {\n networkType = nextNetworkType\n const snapshot = createNetworkSnapshot(networkType)\n networkStatusChangeCallbacks.forEach(callback => callback({ ...snapshot }))\n return {\n errMsg: 'getNetworkType:ok',\n networkType,\n }\n },\n showActionSheet(option: HeadlessWxShowActionSheetOption) {\n const itemList = Array.isArray(option.itemList)\n ? option.itemList.filter((item): item is string => typeof item === 'string')\n : []\n\n if (itemList.length === 0) {\n throw new Error('showActionSheet:fail invalid itemList')\n }\n\n const nextMock = actionSheetMocks.shift()\n if (nextMock?.cancel) {\n actionSheetLogs.push({\n itemList: [...itemList],\n })\n throw new Error('showActionSheet:fail cancel')\n }\n\n const tapIndex = Number.isInteger(nextMock?.tapIndex)\n ? Number(nextMock?.tapIndex)\n : 0\n\n if (tapIndex < 0 || tapIndex >= itemList.length) {\n throw new Error('showActionSheet:fail invalid tapIndex')\n }\n\n const result: HeadlessWxShowActionSheetResult = {\n errMsg: 'showActionSheet:ok',\n tapIndex,\n }\n\n actionSheetLogs.push({\n itemList: [...itemList],\n result: { ...result },\n })\n\n return result\n },\n showShareMenu(option: HeadlessWxShareMenuOption = {}) {\n shareMenu = {\n isUpdatableMessage: Boolean(option.isUpdatableMessage),\n menus: Array.isArray(option.menus)\n ? option.menus.filter((item): item is string => typeof item === 'string')\n : shareMenu.menus,\n visible: true,\n withShareTicket: Boolean(option.withShareTicket),\n }\n return {\n errMsg: 'showShareMenu:ok',\n }\n },\n showLoading(option: HeadlessWxShowLoadingOption) {\n loading = {\n mask: Boolean(option.mask),\n title: option.title,\n }\n return {\n errMsg: 'showLoading:ok',\n }\n },\n showModal(option: HeadlessWxShowModalOption) {\n const showCancel = option.showCancel !== false\n const nextMock = modalMocks.shift()\n let confirm = nextMock?.confirm ?? true\n let cancel = nextMock?.cancel ?? !confirm\n\n if (!showCancel) {\n confirm = true\n cancel = false\n }\n else if (confirm) {\n cancel = false\n }\n else {\n cancel = true\n }\n\n const result: HeadlessWxShowModalResult = {\n cancel,\n confirm,\n errMsg: 'showModal:ok',\n }\n\n modalLogs.push({\n cancelColor: option.cancelColor ?? DEFAULT_MODAL_CANCEL_COLOR,\n cancelText: option.cancelText ?? DEFAULT_MODAL_CANCEL_TEXT,\n confirmColor: option.confirmColor ?? DEFAULT_MODAL_CONFIRM_COLOR,\n confirmText: option.confirmText ?? DEFAULT_MODAL_CONFIRM_TEXT,\n content: option.content,\n result: { ...result },\n showCancel,\n title: option.title ?? '',\n })\n\n return result\n },\n showToast(option: HeadlessWxShowToastOption) {\n toast = {\n duration: Number(option.duration ?? 1500),\n icon: option.icon ?? 'success',\n mask: Boolean(option.mask),\n title: option.title,\n }\n return {\n errMsg: 'showToast:ok',\n }\n },\n uploadFile(option: HeadlessWxUploadFileOption): HeadlessWxRequestTask {\n const fileContent = files.get(option.filePath)\n if (fileContent == null) {\n const error = new Error(`uploadFile:fail file not found: ${option.filePath}`)\n option.fail?.(error)\n option.complete?.()\n return createNoopTask()\n }\n\n const matchedMock = uploadFileMocks.find(mock => matchesSimpleUrlMock(mock, option.url))\n const logEntry: HeadlessWxUploadFileLogEntry = {\n fileContent,\n fileName: option.fileName,\n filePath: option.filePath,\n formData: cloneValue(option.formData ?? {}),\n header: { ...(option.header ?? {}) },\n matched: Boolean(matchedMock),\n name: option.name,\n url: option.url,\n }\n\n if (!matchedMock) {\n uploadFileLogs.push(logEntry)\n const error = new Error(`No uploadFile mock matched in headless runtime: ${option.url}`)\n option.fail?.(error)\n option.complete?.()\n return createNoopTask()\n }\n\n const response = resolveUploadFileResponse(matchedMock, option, fileContent)\n const delay = normalizeDelay(matchedMock.delay)\n\n const commit = () => {\n logEntry.response = { ...response }\n uploadFileLogs.push(logEntry)\n option.success?.(response)\n option.complete?.(response)\n }\n\n const fail = (error: Error) => {\n option.fail?.(error)\n option.complete?.()\n }\n\n if (delay <= 0) {\n commit()\n return createNoopTask()\n }\n\n return runDelayedTask(delay, commit, fail, 'uploadFile:fail abort')\n },\n updateShareMenu(option: HeadlessWxShareMenuOption = {}) {\n shareMenu = {\n isUpdatableMessage: option.isUpdatableMessage == null\n ? shareMenu.isUpdatableMessage\n : Boolean(option.isUpdatableMessage),\n menus: Array.isArray(option.menus)\n ? option.menus.filter((item): item is string => typeof item === 'string')\n : shareMenu.menus,\n visible: true,\n withShareTicket: option.withShareTicket == null\n ? shareMenu.withShareTicket\n : Boolean(option.withShareTicket),\n }\n return {\n errMsg: 'updateShareMenu:ok',\n }\n },\n }\n}\n","import type { HeadlessAppDefinition, HeadlessHostRegistries, HeadlessWxLaunchOptions, HeadlessWxNetworkType, HeadlessWxSavedFileInfo } from '../host'\nimport type { HeadlessProjectDescriptor, HeadlessRouteRecord } from '../project'\nimport type { HeadlessAppInstance } from './appInstance'\nimport type { HeadlessComponentInstance } from './componentInstance'\nimport type { HeadlessPageInstance } from './pageInstance'\nimport type {\n HeadlessWxActionSheetMockDefinition,\n HeadlessWxDownloadFileMockDefinition,\n HeadlessWxModalMockDefinition,\n HeadlessWxRequestMockDefinition,\n HeadlessWxUploadFileMockDefinition,\n} from './wxState'\nimport fs from 'node:fs'\nimport path from 'node:path'\nimport { createHostRegistries } from '../host'\nimport { loadProject } from '../project'\nimport { cloneBackgroundSnapshot, cloneNavigationBarSnapshot, resolveBackgroundSnapshot, resolveNavigationBarSnapshot } from '../project/pageConfig'\nimport { executeSelectorQueryRequests, resolveSelectorQueryScopeRoot } from '../view'\nimport { createAppInstance } from './appInstance'\nimport { createModuleLoader } from './moduleLoader'\nimport { createPageInstance } from './pageInstance'\nimport { renderRuntimePageTree } from './render'\nimport {\n applyResizeToSystemInfo,\n createDefaultSystemInfo,\n deriveAppBaseInfo,\n deriveMenuButtonBoundingClientRect,\n deriveWindowInfo,\n} from './systemInfo'\nimport { createHeadlessWxState } from './wxState'\n\nexport interface HeadlessSessionOptions {\n projectPath: string\n}\n\ninterface ResolvedNavigationTarget {\n normalizedRoute: string\n query: Record<string, string>\n routeRecord: HeadlessRouteRecord\n}\n\ninterface HeadlessTabBarItem {\n index: number\n pagePath: string\n text?: string\n}\n\ninterface HeadlessTabBarSnapshotItem extends HeadlessTabBarItem {\n badge: string | null\n redDot: boolean\n}\n\ninterface HeadlessPullDownRefreshState {\n active: boolean\n stopCalls: number\n}\n\nconst LEADING_SLASH_RE = /^\\/+/\nconst PAGE_STACK_LIMIT = 10\nconst DATA_ATTR_SELECTOR_RE = /^\\[data-([^=\\]]+)=\"([^\"]*)\"\\]$/\nconst DATASET_KEY_RE = /-([a-z])/g\n\nfunction stripLeadingSlash(route: string) {\n return route.replace(LEADING_SLASH_RE, '')\n}\n\nfunction normalizeQuery(queryString: string) {\n const query = new URLSearchParams(queryString)\n const result: Record<string, string> = {}\n for (const [key, value] of query.entries()) {\n result[key] = value\n }\n return result\n}\n\nfunction parseNavigationUrl(url: string) {\n const trimmedUrl = url.trim()\n if (!trimmedUrl) {\n throw new Error('Navigation url must be a non-empty string in headless runtime.')\n }\n\n const [pathWithHash, queryString = ''] = trimmedUrl.split('?')\n const [pathname] = pathWithHash.split('#')\n return {\n pathname: pathname || '',\n query: normalizeQuery(queryString),\n }\n}\n\nfunction createAppLaunchOptions(pathname: string, query: Record<string, string>): HeadlessWxLaunchOptions {\n return {\n path: stripLeadingSlash(pathname),\n query: { ...query },\n referrerInfo: {\n appId: '',\n extraData: {},\n },\n scene: 1001,\n }\n}\n\nfunction readJsonObject(filePath: string) {\n try {\n const value = JSON.parse(fs.readFileSync(filePath, 'utf8'))\n return value && typeof value === 'object' && !Array.isArray(value)\n ? value as Record<string, any>\n : undefined\n }\n catch {\n return undefined\n }\n}\n\nfunction resolveNavigationPath(targetPath: string, baseRoute?: string) {\n if (!targetPath) {\n throw new Error('Navigation url must include a pathname in headless runtime.')\n }\n\n if (targetPath.startsWith('/')) {\n return path.posix.normalize(targetPath).replace(LEADING_SLASH_RE, '')\n }\n\n if (!baseRoute) {\n throw new Error(`Cannot resolve relative navigation url \"${targetPath}\" without an active page.`)\n }\n\n const resolved = path.posix.resolve(`/${path.posix.dirname(baseRoute)}`, targetPath)\n return resolved.replace(LEADING_SLASH_RE, '')\n}\n\nexport class HeadlessSession {\n readonly project: HeadlessProjectDescriptor\n\n private appDefinition: HeadlessAppDefinition | null = null\n private appInstance: HeadlessAppInstance | null = null\n private readonly moduleLoader\n private readonly registries: HeadlessHostRegistries\n private currentPageInstance: HeadlessPageInstance | null = null\n private readonly pages: HeadlessPageInstance[] = []\n private readonly componentCache = new Map<string, HeadlessComponentInstance>()\n private readonly componentScopes = new Map<string, any>()\n private readonly tabBarRoutes: Set<string>\n private readonly tabPages = new Map<string, HeadlessPageInstance>()\n private readonly tabBarItems = new Map<string, HeadlessTabBarItem>()\n private readonly tabBarState = new Map<number, HeadlessTabBarSnapshotItem>()\n private tabBarVisible = false\n private readonly systemInfo = createDefaultSystemInfo()\n private enterOptions = createAppLaunchOptions('', {})\n private launchOptions = createAppLaunchOptions('', {})\n private readonly wxState = createHeadlessWxState()\n private pullDownRefreshState: HeadlessPullDownRefreshState = {\n active: false,\n stopCalls: 0,\n }\n\n constructor(options: HeadlessSessionOptions) {\n this.project = loadProject(options.projectPath)\n this.registries = createHostRegistries()\n const rawTabBarList = Array.isArray(this.project.appConfig.tabBar?.list)\n ? this.project.appConfig.tabBar.list\n : []\n this.tabBarRoutes = new Set()\n rawTabBarList.forEach((item: any, index: number) => {\n if (typeof item?.pagePath !== 'string') {\n return\n }\n const pagePath = stripLeadingSlash(item.pagePath)\n if (!pagePath) {\n return\n }\n this.tabBarRoutes.add(pagePath)\n this.tabBarItems.set(pagePath, {\n index,\n pagePath,\n text: typeof item.text === 'string' ? item.text : undefined,\n })\n this.tabBarState.set(index, {\n badge: null,\n index,\n pagePath,\n redDot: false,\n text: typeof item.text === 'string' ? item.text : undefined,\n })\n })\n this.tabBarVisible = this.tabBarRoutes.size > 0\n this.moduleLoader = createModuleLoader(\n this.registries,\n () => this.pages.slice(),\n () => this.getApp(),\n {\n executeSelectorQuery: (requests, scope) => this.executeSelectorQuery(requests, scope),\n getFileSystemManager: () => this.wxState.getFileSystemManager(),\n getSavedFileInfo: option => this.wxState.getSavedFileInfo(option),\n getSavedFileList: () => this.wxState.getSavedFileList(),\n getEnterOptionsSync: () => ({ ...this.enterOptions, query: { ...this.enterOptions.query }, referrerInfo: { ...this.enterOptions.referrerInfo, extraData: { ...this.enterOptions.referrerInfo.extraData } } }),\n getAppBaseInfoSync: () => deriveAppBaseInfo(this.systemInfo),\n getLaunchOptionsSync: () => ({ ...this.launchOptions, query: { ...this.launchOptions.query }, referrerInfo: { ...this.launchOptions.referrerInfo, extraData: { ...this.launchOptions.referrerInfo.extraData } } }),\n getMenuButtonBoundingClientRect: () => deriveMenuButtonBoundingClientRect(this.systemInfo),\n getNetworkType: () => this.wxState.getNetworkType(),\n navigateBack: option => this.navigateBack(option?.delta),\n navigateTo: option => this.navigateTo(option.url),\n pageScrollTo: option => this.pageScrollTo(option),\n clearStorageSync: () => this.wxState.clearStorageSync(),\n getStorageInfoSync: () => this.wxState.getStorageInfoSync(),\n getStorageSync: key => this.wxState.getStorageSync(key),\n getSystemInfoSync: () => ({ ...this.systemInfo }),\n getWindowInfoSync: () => deriveWindowInfo(this.systemInfo),\n hideLoading: () => this.wxState.hideLoading(),\n hideToast: () => this.wxState.hideToast(),\n downloadFile: option => this.wxState.downloadFile(option),\n reLaunch: option => this.reLaunch(option.url),\n redirectTo: option => this.redirectTo(option.url),\n removeSavedFile: option => this.wxState.removeSavedFile(option),\n nextTick: callback => queueMicrotask(() => callback?.()),\n offNetworkStatusChange: callback => this.wxState.offNetworkStatusChange(callback),\n onNetworkStatusChange: callback => this.wxState.onNetworkStatusChange(callback),\n removeStorageSync: key => this.wxState.removeStorageSync(key),\n request: option => this.wxState.request(option),\n saveFile: option => this.wxState.saveFile(option),\n setBackgroundColor: option => this.setBackgroundColor(option),\n setBackgroundTextStyle: option => this.setBackgroundTextStyle(option.textStyle),\n setStorageSync: (key, value) => this.wxState.setStorageSync(key, value),\n setNavigationBarColor: option => this.setNavigationBarColor(option),\n setNavigationBarTitle: option => this.setNavigationBarTitle(option.title),\n hideShareMenu: () => this.wxState.hideShareMenu(),\n hideNavigationBarLoading: () => this.hideNavigationBarLoading(),\n hideTabBar: () => this.hideTabBar(),\n hideTabBarRedDot: option => this.hideTabBarRedDot(option.index),\n showShareMenu: option => this.wxState.showShareMenu(option),\n showNavigationBarLoading: () => this.showNavigationBarLoading(),\n showTabBar: () => this.showTabBar(),\n showTabBarRedDot: option => this.showTabBarRedDot(option.index),\n showActionSheet: option => this.wxState.showActionSheet(option),\n showLoading: option => this.wxState.showLoading(option),\n showModal: option => this.wxState.showModal(option),\n showToast: option => this.wxState.showToast(option),\n stopPullDownRefresh: () => this.stopPullDownRefresh(),\n switchTab: option => this.switchTab(option.url),\n uploadFile: option => this.wxState.uploadFile(option),\n removeTabBarBadge: option => this.removeTabBarBadge(option.index),\n setTabBarBadge: option => this.setTabBarBadge(option.index, option.text),\n updateShareMenu: option => this.wxState.updateShareMenu(option),\n },\n )\n }\n\n getApp() {\n return this.appInstance\n }\n\n getCurrentPages() {\n return this.pages.slice()\n }\n\n getCurrentPageNavigationBarTitle() {\n return this.currentPageInstance?.__navigationBarTitle__ ?? null\n }\n\n getCurrentPageNavigationBar() {\n const snapshot = this.currentPageInstance?.__navigationBar__\n return snapshot ? cloneNavigationBarSnapshot(snapshot) : null\n }\n\n getCurrentPageBackground() {\n const snapshot = this.currentPageInstance?.__background__\n return snapshot ? cloneBackgroundSnapshot(snapshot) : null\n }\n\n getActionSheetLogs() {\n return this.wxState.getActionSheetLogs()\n }\n\n getRequestLogs() {\n return this.wxState.getRequestLogs()\n }\n\n getDownloadFileLogs() {\n return this.wxState.getDownloadFileLogs()\n }\n\n getUploadFileLogs() {\n return this.wxState.getUploadFileLogs()\n }\n\n getFileSnapshot() {\n return this.wxState.getFileSnapshot()\n }\n\n getDirectorySnapshot() {\n return this.wxState.getDirectorySnapshot()\n }\n\n getFileText(filePath: string) {\n return this.wxState.getFileText(filePath)\n }\n\n getSavedFileListSnapshot(): HeadlessWxSavedFileInfo[] {\n return this.wxState.getSavedFileList().fileList\n }\n\n renderCurrentPage() {\n const current = this.requireCurrentPage('renderCurrentPage()')\n return renderRuntimePageTree({\n changedPageKeys: current.__lastChangedKeys__ ?? [],\n componentCache: this.componentCache,\n componentScopes: this.componentScopes,\n moduleLoader: this.moduleLoader,\n project: this.project,\n session: {\n selectAllComponentsWithin: (scopeId: string, selector: string) => this.selectAllComponentsWithin(scopeId, selector),\n selectComponentWithin: (scopeId: string, selector: string) => this.selectComponentWithin(scopeId, selector),\n selectOwnerComponent: (scopeId: string) => this.selectOwnerComponent(scopeId),\n },\n }, current)\n }\n\n getScopeSnapshot(scopeId: string) {\n const scope = this.componentScopes.get(scopeId)\n if (!scope) {\n return null\n }\n const instance = this.componentCache.get(scopeId)\n if (instance) {\n return {\n data: instance.data ?? {},\n methods: Object.keys(instance)\n .filter(key => typeof instance[key] === 'function')\n .sort((a, b) => a.localeCompare(b)),\n properties: instance.properties ?? {},\n scopeId,\n type: 'component' as const,\n }\n }\n\n const currentPage = this.currentPageInstance\n if (currentPage && scopeId === `page:${currentPage.route}`) {\n return {\n data: currentPage.data ?? {},\n methods: Object.keys(currentPage)\n .filter(key => typeof currentPage[key] === 'function')\n .sort((a, b) => a.localeCompare(b)),\n properties: currentPage.options ?? {},\n scopeId,\n type: 'page' as const,\n }\n }\n\n return {\n data: scope.data ?? {},\n methods: [] as string[],\n properties: {},\n scopeId,\n type: 'scope' as const,\n }\n }\n\n getScopeIdForComponent(component: HeadlessComponentInstance | null | undefined) {\n if (!component) {\n return null\n }\n return this.getComponentScopeId(component)\n }\n\n callScopeMethod(scopeId: string | null, methodName: string, event: Record<string, any>) {\n const current = this.requireCurrentPage(`scope method \"${methodName}\"`)\n this.renderCurrentPage()\n\n if (!scopeId || scopeId === `page:${stripLeadingSlash(current.route)}`) {\n const method = current[methodName]\n if (typeof method !== 'function') {\n throw new TypeError(`Method \"${methodName}\" does not exist on headless page ${current.route}.`)\n }\n return method.call(current, event)\n }\n\n const instance = this.componentCache.get(scopeId)\n if (!instance) {\n throw new Error(`Unknown scope \"${scopeId}\" in headless runtime.`)\n }\n instance.__lastInteractionEvent__ = {\n currentTarget: event.currentTarget,\n mark: event.mark,\n target: event.target,\n }\n const method = instance[methodName]\n if (typeof method !== 'function') {\n throw new TypeError(`Method \"${methodName}\" does not exist on headless component scope \"${scopeId}\".`)\n }\n return method.call(instance, event)\n }\n\n callScopeMethodDirect(scopeId: string, methodName: string, ...args: any[]) {\n const normalizedScopeId = scopeId.trim()\n if (!normalizedScopeId) {\n throw new Error('Scope id must be a non-empty string in headless runtime.')\n }\n\n const current = this.requireCurrentPage(`scope method \"${methodName}\"`)\n if (normalizedScopeId === `page:${stripLeadingSlash(current.route)}`) {\n const method = current[methodName]\n if (typeof method !== 'function') {\n throw new TypeError(`Method \"${methodName}\" does not exist on headless page ${current.route}.`)\n }\n return method.apply(current, args)\n }\n\n const instance = this.componentCache.get(normalizedScopeId)\n if (!instance) {\n throw new Error(`Unknown scope \"${normalizedScopeId}\" in headless runtime.`)\n }\n const method = instance[methodName]\n if (typeof method !== 'function') {\n throw new TypeError(`Method \"${methodName}\" does not exist on headless component scope \"${normalizedScopeId}\".`)\n }\n return method.apply(instance, args)\n }\n\n getStorageSnapshot() {\n return this.wxState.getStorageSnapshot()\n }\n\n getShareMenu() {\n return this.wxState.getShareMenu()\n }\n\n selectComponent(selector: string) {\n this.renderCurrentPage()\n return this.selectComponentsWithin(null, selector)[0] ?? null\n }\n\n selectAllComponents(selector: string) {\n this.renderCurrentPage()\n return this.selectComponentsWithin(null, selector)\n }\n\n selectComponentWithin(scopeId: string, selector: string) {\n this.renderCurrentPage()\n return this.selectComponentsWithin(scopeId, selector)[0] ?? null\n }\n\n selectAllComponentsWithin(scopeId: string, selector: string) {\n this.renderCurrentPage()\n return this.selectComponentsWithin(scopeId, selector)\n }\n\n selectOwnerComponent(scopeId: string) {\n const scope = this.componentScopes.get(scopeId)\n if (!scope?.ownerScopeId) {\n return null\n }\n return this.componentCache.get(scope.ownerScopeId) ?? null\n }\n\n getTabBar() {\n return {\n visible: this.tabBarVisible,\n }\n }\n\n getTabBarSnapshot() {\n return {\n items: Array.from(this.tabBarState.values(), item => ({\n badge: item.badge,\n index: item.index,\n pagePath: item.pagePath,\n redDot: item.redDot,\n text: item.text,\n })),\n visible: this.tabBarVisible,\n }\n }\n\n getStorageInfo() {\n return this.wxState.getStorageInfoSync()\n }\n\n getPullDownRefreshState() {\n return { ...this.pullDownRefreshState }\n }\n\n getSystemInfo() {\n return { ...this.systemInfo }\n }\n\n getWindowInfo() {\n return deriveWindowInfo(this.systemInfo)\n }\n\n getAppBaseInfo() {\n return deriveAppBaseInfo(this.systemInfo)\n }\n\n getLaunchOptions() {\n return {\n ...this.launchOptions,\n query: { ...this.launchOptions.query },\n referrerInfo: {\n ...this.launchOptions.referrerInfo,\n extraData: { ...this.launchOptions.referrerInfo.extraData },\n },\n }\n }\n\n getEnterOptions() {\n return {\n ...this.enterOptions,\n query: { ...this.enterOptions.query },\n referrerInfo: {\n ...this.enterOptions.referrerInfo,\n extraData: { ...this.enterOptions.referrerInfo.extraData },\n },\n }\n }\n\n getMenuButtonBoundingClientRect() {\n return deriveMenuButtonBoundingClientRect(this.systemInfo)\n }\n\n getNetworkType() {\n return this.wxState.getNetworkType()\n }\n\n getLoading() {\n return this.wxState.getLoading()\n }\n\n getModalLogs() {\n return this.wxState.getModalLogs()\n }\n\n getToast() {\n return this.wxState.getToast()\n }\n\n mockModal(definition: HeadlessWxModalMockDefinition = {}) {\n this.wxState.mockModal(definition)\n }\n\n mockActionSheet(definition: HeadlessWxActionSheetMockDefinition = {}) {\n this.wxState.mockActionSheet(definition)\n }\n\n mockRequest(definition: HeadlessWxRequestMockDefinition) {\n this.wxState.mockRequest(definition)\n }\n\n mockDownloadFile(definition: HeadlessWxDownloadFileMockDefinition) {\n this.wxState.mockDownloadFile(definition)\n }\n\n mockUploadFile(definition: HeadlessWxUploadFileMockDefinition) {\n this.wxState.mockUploadFile(definition)\n }\n\n setFile(filePath: string, fileContent: string) {\n this.wxState.setFile(filePath, fileContent)\n }\n\n setNetworkType(networkType: HeadlessWxNetworkType) {\n return this.wxState.setNetworkType(networkType)\n }\n\n setBackgroundTextStyle(textStyle: string) {\n if (textStyle !== 'dark' && textStyle !== 'light') {\n throw new Error('setBackgroundTextStyle:fail invalid textStyle')\n }\n const current = this.requireCurrentPage('wx.setBackgroundTextStyle()')\n current.__background__ ??= {\n backgroundColor: '#ffffff',\n backgroundColorBottom: '#ffffff',\n backgroundColorTop: '#ffffff',\n textStyle: 'dark',\n }\n current.__background__.textStyle = textStyle\n current.__backgroundTextStyle__ = textStyle\n return {\n errMsg: 'setBackgroundTextStyle:ok',\n }\n }\n\n setBackgroundColor(option: {\n backgroundColor?: string\n backgroundColorBottom?: string\n backgroundColorTop?: string\n }) {\n const current = this.requireCurrentPage('wx.setBackgroundColor()')\n current.__background__ ??= {\n backgroundColor: '#ffffff',\n backgroundColorBottom: '#ffffff',\n backgroundColorTop: '#ffffff',\n textStyle: current.__backgroundTextStyle__ ?? 'dark',\n }\n if (typeof option.backgroundColor === 'string') {\n current.__background__.backgroundColor = option.backgroundColor\n }\n if (typeof option.backgroundColorTop === 'string') {\n current.__background__.backgroundColorTop = option.backgroundColorTop\n }\n if (typeof option.backgroundColorBottom === 'string') {\n current.__background__.backgroundColorBottom = option.backgroundColorBottom\n }\n return {\n errMsg: 'setBackgroundColor:ok',\n }\n }\n\n setNavigationBarTitle(title: string) {\n const current = this.requireCurrentPage('wx.setNavigationBarTitle()')\n current.__navigationBar__ ??= {\n animation: null,\n backgroundColor: '#ffffff',\n frontColor: '#000000',\n loading: false,\n title: '',\n }\n current.__navigationBar__.title = title\n current.__navigationBarTitle__ = title\n return {\n errMsg: 'setNavigationBarTitle:ok',\n }\n }\n\n setNavigationBarColor(option: {\n animation?: {\n duration?: number\n timingFunction?: string\n }\n backgroundColor?: string\n frontColor?: string\n }) {\n const current = this.requireCurrentPage('wx.setNavigationBarColor()')\n current.__navigationBar__ ??= {\n animation: null,\n backgroundColor: '#ffffff',\n frontColor: '#000000',\n loading: false,\n title: current.__navigationBarTitle__ ?? '',\n }\n if (typeof option.backgroundColor === 'string') {\n current.__navigationBar__.backgroundColor = option.backgroundColor\n }\n if (typeof option.frontColor === 'string') {\n current.__navigationBar__.frontColor = option.frontColor\n }\n current.__navigationBar__.animation = option.animation\n ? {\n duration: option.animation.duration,\n timingFunction: option.animation.timingFunction,\n }\n : null\n return {\n errMsg: 'setNavigationBarColor:ok',\n }\n }\n\n showNavigationBarLoading() {\n const current = this.requireCurrentPage('wx.showNavigationBarLoading()')\n current.__navigationBar__ ??= {\n animation: null,\n backgroundColor: '#ffffff',\n frontColor: '#000000',\n loading: false,\n title: current.__navigationBarTitle__ ?? '',\n }\n current.__navigationBar__.loading = true\n return {\n errMsg: 'showNavigationBarLoading:ok',\n }\n }\n\n hideNavigationBarLoading() {\n const current = this.requireCurrentPage('wx.hideNavigationBarLoading()')\n current.__navigationBar__ ??= {\n animation: null,\n backgroundColor: '#ffffff',\n frontColor: '#000000',\n loading: false,\n title: current.__navigationBarTitle__ ?? '',\n }\n current.__navigationBar__.loading = false\n return {\n errMsg: 'hideNavigationBarLoading:ok',\n }\n }\n\n hideTabBar() {\n this.tabBarVisible = false\n return {\n errMsg: 'hideTabBar:ok',\n }\n }\n\n hideTabBarRedDot(index: number) {\n const item = this.requireTabBarItem(index, 'wx.hideTabBarRedDot()')\n item.redDot = false\n return {\n errMsg: 'hideTabBarRedDot:ok',\n }\n }\n\n showTabBar() {\n this.tabBarVisible = this.tabBarRoutes.size > 0\n return {\n errMsg: 'showTabBar:ok',\n }\n }\n\n showTabBarRedDot(index: number) {\n const item = this.requireTabBarItem(index, 'wx.showTabBarRedDot()')\n item.badge = null\n item.redDot = true\n return {\n errMsg: 'showTabBarRedDot:ok',\n }\n }\n\n removeTabBarBadge(index: number) {\n const item = this.requireTabBarItem(index, 'wx.removeTabBarBadge()')\n item.badge = null\n return {\n errMsg: 'removeTabBarBadge:ok',\n }\n }\n\n setTabBarBadge(index: number, text: string) {\n const item = this.requireTabBarItem(index, 'wx.setTabBarBadge()')\n item.badge = text\n item.redDot = false\n return {\n errMsg: 'setTabBarBadge:ok',\n }\n }\n\n bootstrap(launchOptions = createAppLaunchOptions('', {})) {\n if (this.appInstance) {\n return this.appInstance\n }\n\n this.launchOptions = createAppLaunchOptions(launchOptions.path, launchOptions.query)\n this.enterOptions = createAppLaunchOptions(launchOptions.path, launchOptions.query)\n const appModulePath = path.resolve(this.project.miniprogramRootPath, 'app.js')\n this.appDefinition = this.moduleLoader.executeAppModule(appModulePath)\n this.appInstance = createAppInstance(this.appDefinition)\n this.appInstance.onLaunch?.(launchOptions)\n this.appInstance.onShow?.(launchOptions)\n return this.appInstance\n }\n\n reLaunch(url: string) {\n const target = this.resolveNavigationTarget(url)\n this.bootstrap(createAppLaunchOptions(target.normalizedRoute, target.query))\n this.unloadAllPages()\n const pageInstance = this.createFreshPage(target)\n this.pages.push(pageInstance)\n this.currentPageInstance = pageInstance\n return pageInstance\n }\n\n navigateTo(url: string) {\n const target = this.resolveNavigationTarget(url)\n this.bootstrap(createAppLaunchOptions(target.normalizedRoute, target.query))\n if (this.pages.length >= PAGE_STACK_LIMIT) {\n throw new Error(`Cannot navigateTo() beyond a ${PAGE_STACK_LIMIT}-page stack in headless runtime.`)\n }\n\n if (this.isTabBarRoute(target.routeRecord.route)) {\n throw new Error(`wx.navigateTo() cannot open a tabBar page in headless runtime: ${url}`)\n }\n\n this.currentPageInstance?.onHide?.()\n if (this.currentPageInstance) {\n this.runPageComponentLifetime(this.currentPageInstance.route, 'hide')\n }\n const pageInstance = this.createFreshPage(target)\n this.pages.push(pageInstance)\n this.currentPageInstance = pageInstance\n return pageInstance\n }\n\n redirectTo(url: string) {\n const target = this.resolveNavigationTarget(url)\n this.bootstrap(createAppLaunchOptions(target.normalizedRoute, target.query))\n if (this.isTabBarRoute(target.routeRecord.route)) {\n throw new Error(`wx.redirectTo() cannot open a tabBar page in headless runtime: ${url}`)\n }\n\n const current = this.currentPageInstance\n if (current) {\n this.pages.pop()\n this.unloadPage(current)\n }\n\n const pageInstance = this.createFreshPage(target)\n this.pages.push(pageInstance)\n this.currentPageInstance = pageInstance\n return pageInstance\n }\n\n navigateBack(delta = 1) {\n this.bootstrap()\n if (this.pages.length <= 1) {\n return this.currentPageInstance\n }\n\n const normalizedDelta = Number.isFinite(delta) ? Math.max(1, Math.trunc(delta)) : 1\n const removableCount = Math.min(normalizedDelta, this.pages.length - 1)\n const removedPages = this.pages.splice(this.pages.length - removableCount, removableCount)\n for (const page of removedPages.reverse()) {\n this.unloadPage(page)\n }\n\n const nextPage = this.pages.at(-1) ?? null\n this.currentPageInstance = nextPage\n nextPage?.onShow?.()\n if (nextPage) {\n this.runPageComponentLifetime(nextPage.route, 'show')\n }\n return nextPage\n }\n\n switchTab(url: string) {\n const target = this.resolveNavigationTarget(url)\n this.bootstrap(createAppLaunchOptions(target.normalizedRoute, target.query))\n if (Object.keys(target.query).length > 0) {\n throw new Error(`wx.switchTab() url cannot contain query in headless runtime: ${url}`)\n }\n if (!this.isTabBarRoute(target.routeRecord.route)) {\n throw new Error(`wx.switchTab() can only open a tabBar page in headless runtime: ${url}`)\n }\n\n const current = this.currentPageInstance\n const cachedTarget = this.tabPages.get(target.routeRecord.route) ?? null\n const tabItem = this.resolveTabBarItem(target.routeRecord.route)\n\n if (current === cachedTarget && current) {\n current.onTabItemTap?.(tabItem)\n return current\n }\n\n if (current && current !== cachedTarget) {\n current.onHide?.()\n this.runPageComponentLifetime(current.route, 'hide')\n }\n\n for (const page of [...this.pages].reverse()) {\n if (this.isTabBarRoute(stripLeadingSlash(page.route))) {\n continue\n }\n this.removePageInstance(page)\n this.unloadPage(page)\n }\n\n let nextPage = cachedTarget\n if (!nextPage) {\n nextPage = this.createFreshPage(target)\n this.tabPages.set(target.routeRecord.route, nextPage)\n }\n else if (current !== nextPage) {\n nextPage.onShow?.()\n this.runPageComponentLifetime(nextPage.route, 'show')\n }\n\n nextPage.onTabItemTap?.(tabItem)\n\n this.pages.length = 0\n this.pages.push(nextPage)\n this.currentPageInstance = nextPage\n return nextPage\n }\n\n pageScrollTo(option: {\n scrollTop?: number\n duration?: number\n selector?: string\n success?: () => void\n fail?: (error: Error) => void\n complete?: () => void\n }) {\n const current = this.requireCurrentPage('wx.pageScrollTo()')\n current.__scrollTop__ = Number(option.scrollTop ?? 0)\n current.onPageScroll?.({\n scrollTop: current.__scrollTop__,\n })\n }\n\n triggerPullDownRefresh() {\n const current = this.requireCurrentPage('triggerPullDownRefresh()')\n this.pullDownRefreshState = {\n ...this.pullDownRefreshState,\n active: true,\n }\n current.onPullDownRefresh?.()\n return current\n }\n\n triggerReachBottom() {\n const current = this.requireCurrentPage('triggerReachBottom()')\n current.onReachBottom?.()\n return current\n }\n\n triggerResize(options: Record<string, any>) {\n const current = this.requireCurrentPage('triggerResize()')\n applyResizeToSystemInfo(this.systemInfo, options)\n current.onResize?.(options)\n this.runPageComponentLifetime(current.route, 'resize', options)\n return current\n }\n\n triggerRouteDone(options: Record<string, any> = {}) {\n const current = this.requireCurrentPage('triggerRouteDone()')\n current.onRouteDone?.(options)\n return current\n }\n\n stopPullDownRefresh() {\n this.pullDownRefreshState = {\n active: false,\n stopCalls: this.pullDownRefreshState.stopCalls + 1,\n }\n }\n\n private executeSelectorQuery(\n requests: import('../host').HeadlessWxSelectorQueryRequest[],\n scope?: Record<string, any>,\n ) {\n const current = this.requireCurrentPage('wx.createSelectorQuery().exec()')\n if (scope && scope !== current && !Array.from(this.componentCache.values()).includes(scope as HeadlessComponentInstance)) {\n throw new Error('wx.createSelectorQuery().in(component) received an unknown scope in headless runtime.')\n }\n const rendered = this.renderCurrentPage()\n const scopeId = scope && scope !== current\n ? this.getComponentScopeId(scope as HeadlessComponentInstance)\n : null\n return executeSelectorQueryRequests(requests, {\n page: current,\n root: resolveSelectorQueryScopeRoot(rendered.root, scopeId),\n windowInfo: this.getWindowInfo(),\n })\n }\n\n private createFreshPage(target: ResolvedNavigationTarget) {\n const pageModulePath = path.resolve(this.project.miniprogramRootPath, `${target.routeRecord.route}.js`)\n const pageConfigPath = path.resolve(this.project.miniprogramRootPath, `${target.routeRecord.route}.json`)\n const pageDefinition = this.moduleLoader.executePageModule(pageModulePath, target.routeRecord.route)\n const pageConfig = readJsonObject(pageConfigPath)\n const pageInstance = createPageInstance(`/${target.routeRecord.route}`, pageDefinition, target.query, {\n background: resolveBackgroundSnapshot(this.project.appConfig, pageConfig),\n navigationBar: resolveNavigationBarSnapshot(this.project.appConfig, pageConfig),\n })\n pageInstance.selectComponent = (selector: string) => this.selectComponent(selector)\n pageInstance.selectAllComponents = (selector: string) => this.selectAllComponents(selector)\n pageInstance.onLoad?.(target.query)\n pageInstance.onShow?.()\n pageInstance.onReady?.()\n if (this.isTabBarRoute(target.routeRecord.route)) {\n this.tabPages.set(target.routeRecord.route, pageInstance)\n }\n return pageInstance\n }\n\n private isTabBarRoute(route: string) {\n return this.tabBarRoutes.has(stripLeadingSlash(route))\n }\n\n private resolveTabBarItem(route: string) {\n const pagePath = stripLeadingSlash(route)\n const item = this.tabBarItems.get(pagePath)\n if (!item) {\n throw new Error(`Missing tabBar metadata for route \"${route}\" in headless runtime.`)\n }\n return {\n ...item,\n }\n }\n\n private requireTabBarItem(index: number, action: string) {\n const normalizedIndex = Number.isFinite(index) ? Math.trunc(index) : Number.NaN\n const item = this.tabBarState.get(normalizedIndex)\n if (!item) {\n throw new Error(`Cannot call ${action} with unknown tabBar index ${index} in headless runtime.`)\n }\n return item\n }\n\n private removePageInstance(page: HeadlessPageInstance) {\n const index = this.pages.indexOf(page)\n if (index >= 0) {\n this.pages.splice(index, 1)\n }\n }\n\n private resolveNavigationTarget(url: string) {\n const { pathname, query } = parseNavigationUrl(url)\n const baseRoute = this.currentPageInstance\n ? stripLeadingSlash(this.currentPageInstance.route)\n : undefined\n const normalizedRoute = resolveNavigationPath(pathname, baseRoute)\n const routeRecord = this.project.routes.find(item => item.route === normalizedRoute)\n if (!routeRecord) {\n this.bootstrap(createAppLaunchOptions(normalizedRoute, query))\n this.appInstance?.onPageNotFound?.(createAppLaunchOptions(normalizedRoute, query))\n throw new Error(`Unknown route for headless runtime navigation: ${url}`)\n }\n return {\n normalizedRoute,\n query,\n routeRecord,\n }\n }\n\n private unloadAllPages() {\n const pagesToUnload = new Set<HeadlessPageInstance>([\n ...this.pages,\n ...this.tabPages.values(),\n ])\n for (const page of [...pagesToUnload].reverse()) {\n this.unloadPage(page)\n }\n this.pages.length = 0\n this.tabPages.clear()\n this.componentCache.clear()\n this.componentScopes.clear()\n this.currentPageInstance = null\n }\n\n private unloadPage(page: HeadlessPageInstance) {\n page.onUnload?.()\n this.detachPageComponents(page.route)\n this.tabPages.delete(stripLeadingSlash(page.route))\n }\n\n private requireCurrentPage(action: string) {\n this.bootstrap()\n const current = this.currentPageInstance\n if (!current) {\n throw new Error(`Cannot call ${action} without an active page in headless runtime.`)\n }\n return current\n }\n\n private selectComponentsWithin(rootScopeId: string | null, selector: string) {\n const normalizedSelector = selector.trim()\n if (!normalizedSelector) {\n return []\n }\n\n return [...this.componentScopes.entries()]\n .filter(([candidateScopeId, scope]) => {\n if (!candidateScopeId.includes('/')) {\n return false\n }\n if (rootScopeId && candidateScopeId === rootScopeId) {\n return false\n }\n if (rootScopeId && !candidateScopeId.startsWith(`${rootScopeId}/`)) {\n return false\n }\n if (normalizedSelector.startsWith('#')) {\n return scope.id === normalizedSelector.slice(1)\n }\n if (normalizedSelector.startsWith('.')) {\n return scope.classList?.includes(normalizedSelector.slice(1)) ?? false\n }\n const dataAttrMatch = normalizedSelector.match(DATA_ATTR_SELECTOR_RE)\n if (dataAttrMatch) {\n const [, key, value] = dataAttrMatch\n const datasetKey = key.replace(DATASET_KEY_RE, (_match, char: string) => char.toUpperCase())\n return scope.dataset?.[datasetKey] === value\n }\n return scope.alias === normalizedSelector\n })\n .map(([candidateScopeId]) => this.componentCache.get(candidateScopeId))\n .filter(Boolean)\n }\n\n private detachPageComponents(route: string) {\n const prefix = `page:${stripLeadingSlash(route)}`\n for (const [scopeId, instance] of [...this.componentCache.entries()]) {\n if (!scopeId.startsWith(prefix)) {\n continue\n }\n instance.__definition__?.lifetimes?.detached?.call(instance)\n this.componentCache.delete(scopeId)\n this.componentScopes.delete(scopeId)\n }\n }\n\n private runPageComponentLifetime(\n route: string,\n lifetimeName: 'hide' | 'resize' | 'show',\n payload?: unknown,\n ) {\n const prefix = `page:${stripLeadingSlash(route)}`\n for (const [scopeId, instance] of this.componentCache.entries()) {\n if (!scopeId.startsWith(prefix)) {\n continue\n }\n instance.__definition__?.pageLifetimes?.[lifetimeName]?.call(instance, payload)\n }\n }\n\n private getComponentScopeId(component: HeadlessComponentInstance) {\n for (const [scopeId, instance] of this.componentCache.entries()) {\n if (instance === component) {\n return scopeId\n }\n }\n return null\n }\n}\n\nexport function createHeadlessSession(options: HeadlessSessionOptions) {\n return new HeadlessSession(options)\n}\n","import type { HeadlessProjectDescriptor } from '../project'\nimport type { HeadlessPageInstance, HeadlessSession } from '../runtime'\nimport { HeadlessTestingNodeHandle, renderPageTree } from '../view'\nimport { HeadlessTestingScopeHandle } from './sessionHandle'\n\nexport interface HeadlessTestingWaitOptions {\n interval?: number\n timeout?: number\n}\n\nexport type HeadlessTestingDataMatcher\n = | unknown\n | ((value: unknown) => boolean)\n\nexport interface HeadlessTestingWaitForSelectorOptions extends HeadlessTestingWaitOptions {\n state?: 'attached' | 'detached'\n}\n\nconst DEFAULT_WAIT_TIMEOUT = 1_000\nconst DEFAULT_WAIT_INTERVAL = 10\n\nexport class HeadlessTestingPageHandle {\n constructor(\n private readonly project: HeadlessProjectDescriptor,\n private readonly page: HeadlessPageInstance,\n private readonly session?: HeadlessSession,\n ) {}\n\n private resolveDataByPath(path?: string) {\n if (!path) {\n return this.page.data\n }\n\n const segments = path.split('.').filter(Boolean)\n let current: any = this.page.data\n for (const segment of segments) {\n current = current?.[segment]\n }\n return current\n }\n\n private async pollUntil<T>(\n check: () => Promise<T | null>,\n errorMessage: string,\n options: HeadlessTestingWaitOptions = {},\n ) {\n const timeout = Number.isFinite(options.timeout)\n ? Math.max(0, Math.trunc(options.timeout ?? DEFAULT_WAIT_TIMEOUT))\n : DEFAULT_WAIT_TIMEOUT\n const interval = Number.isFinite(options.interval)\n ? Math.max(1, Math.trunc(options.interval ?? DEFAULT_WAIT_INTERVAL))\n : DEFAULT_WAIT_INTERVAL\n const deadline = Date.now() + timeout\n\n while (true) {\n const result = await check()\n if (result != null) {\n return result\n }\n if (Date.now() >= deadline) {\n throw new Error(errorMessage)\n }\n await this.waitFor(interval)\n }\n }\n\n private createScopeHandle(component: any) {\n const scopeId = this.session?.getScopeIdForComponent(component)\n return scopeId ? new HeadlessTestingScopeHandle(scopeId, this.project, this.session!) : null\n }\n\n async callMethod(methodName: string, ...args: any[]) {\n const method = this.page[methodName]\n if (typeof method !== 'function') {\n throw new TypeError(`Method \"${methodName}\" does not exist on headless page ${this.page.route}.`)\n }\n return await method.apply(this.page, args)\n }\n\n async data(path?: string) {\n return this.resolveDataByPath(path)\n }\n\n async selectComponent(selector: string) {\n const normalizedSelector = selector.trim()\n if (!normalizedSelector) {\n throw new Error('Selector must be a non-empty string in headless testing runtime.')\n }\n const component = this.page.selectComponent?.(normalizedSelector) ?? null\n return this.createScopeHandle(component)\n }\n\n async selectAllComponents(selector: string) {\n const normalizedSelector = selector.trim()\n if (!normalizedSelector) {\n throw new Error('Selector must be a non-empty string in headless testing runtime.')\n }\n return (this.page.selectAllComponents?.(normalizedSelector) ?? [])\n .map(component => this.createScopeHandle(component))\n .filter((handle): handle is HeadlessTestingScopeHandle => Boolean(handle))\n }\n\n async waitFor(ms = 0) {\n if (ms <= 0) {\n return\n }\n await new Promise(resolve => setTimeout(resolve, ms))\n }\n\n async $(selector: string) {\n const tree = this.session?.getCurrentPages().includes(this.page)\n ? this.session.renderCurrentPage()\n : renderPageTree(this.project, this.page)\n const rootNode = tree.root.type === 'root'\n ? (tree.root.children?.[0] ?? tree.root)\n : tree.root\n const root = new HeadlessTestingNodeHandle(rootNode, {\n callMethod: (scopeId, methodName, event) => {\n if (this.session?.getCurrentPages().includes(this.page)) {\n return this.session.callScopeMethod(scopeId, methodName, event)\n }\n return this.callMethod(methodName, event)\n },\n createPageHandle: () => this,\n createScopeHandle: (scopeId) => {\n if (!this.session) {\n throw new Error('Scope handles are not available without an active headless testing session.')\n }\n if (!scopeId) {\n return null\n }\n return new HeadlessTestingScopeHandle(scopeId, this.project, this.session)\n },\n ownerScopeId: (scopeId) => {\n if (!this.session || !scopeId) {\n return null\n }\n const scopeSnapshot = this.session.getScopeSnapshot(scopeId) as { type?: string } | null\n if (scopeSnapshot?.type !== 'component') {\n return null\n }\n const owner = this.session.selectOwnerComponent(scopeId)\n return this.session.getScopeIdForComponent(owner)\n },\n })\n if (selector === 'page') {\n return root\n }\n return await root.$(selector)\n }\n\n async $$(selector: string) {\n const root = await this.$('page')\n if (!root) {\n return []\n }\n if (selector === 'page') {\n return [root]\n }\n return await root.$$(selector)\n }\n\n async waitForSelector(selector: string, options: HeadlessTestingWaitForSelectorOptions = {}) {\n const normalizedSelector = selector.trim()\n if (!normalizedSelector) {\n throw new Error('Selector must be a non-empty string in headless testing runtime.')\n }\n\n const state = options.state ?? 'attached'\n if (state === 'detached') {\n await this.pollUntil(\n async () => (await this.$(normalizedSelector)) ? null : true,\n `Timed out waiting for selector \"${normalizedSelector}\" to become detached in headless testing runtime.`,\n options,\n )\n return null\n }\n\n return await this.pollUntil(\n async () => await this.$(normalizedSelector),\n `Timed out waiting for selector \"${normalizedSelector}\" to appear in headless testing runtime.`,\n options,\n )\n }\n\n async waitForComponent(selector: string, options: HeadlessTestingWaitOptions = {}) {\n const normalizedSelector = selector.trim()\n if (!normalizedSelector) {\n throw new Error('Selector must be a non-empty string in headless testing runtime.')\n }\n\n return await this.pollUntil(\n async () => await this.selectComponent(normalizedSelector),\n `Timed out waiting for component \"${normalizedSelector}\" in headless testing runtime.`,\n options,\n )\n }\n\n async waitForComponents(selector: string, count = 1, options: HeadlessTestingWaitOptions = {}) {\n const normalizedSelector = selector.trim()\n if (!normalizedSelector) {\n throw new Error('Selector must be a non-empty string in headless testing runtime.')\n }\n const normalizedCount = Number.isFinite(count) ? Math.max(1, Math.trunc(count)) : 1\n\n return await this.pollUntil(\n async () => {\n const components = await this.selectAllComponents(normalizedSelector)\n return components.length >= normalizedCount ? components : null\n },\n `Timed out waiting for ${normalizedCount} component(s) matching \"${normalizedSelector}\" in headless testing runtime.`,\n options,\n )\n }\n\n async waitForText(text: string, options: HeadlessTestingWaitOptions = {}) {\n const normalizedText = text.trim()\n if (!normalizedText) {\n throw new Error('Text must be a non-empty string in headless testing runtime.')\n }\n\n return await this.pollUntil(\n async () => {\n const wxml = await this.wxml()\n return wxml.includes(normalizedText) ? normalizedText : null\n },\n `Timed out waiting for text \"${normalizedText}\" in headless testing runtime.`,\n options,\n )\n }\n\n async waitForTextGone(text: string, options: HeadlessTestingWaitOptions = {}) {\n const normalizedText = text.trim()\n if (!normalizedText) {\n throw new Error('Text must be a non-empty string in headless testing runtime.')\n }\n\n await this.pollUntil(\n async () => {\n const wxml = await this.wxml()\n return wxml.includes(normalizedText) ? null : true\n },\n `Timed out waiting for text \"${normalizedText}\" to disappear in headless testing runtime.`,\n options,\n )\n }\n\n async waitForData(path: string, matcher?: HeadlessTestingDataMatcher, options: HeadlessTestingWaitOptions = {}) {\n const normalizedPath = path.trim()\n if (!normalizedPath) {\n throw new Error('Data path must be a non-empty string in headless testing runtime.')\n }\n const hasMatcher = arguments.length >= 2\n\n return await this.pollUntil(\n async () => {\n const value = this.resolveDataByPath(normalizedPath)\n if (typeof matcher === 'function') {\n return matcher(value) ? value : null\n }\n if (hasMatcher) {\n return Object.is(value, matcher) ? value : null\n }\n return value === undefined ? null : value\n },\n `Timed out waiting for data \"${normalizedPath}\" in headless testing runtime.`,\n options,\n )\n }\n\n async wxml() {\n return this.session?.getCurrentPages().includes(this.page)\n ? this.session.renderCurrentPage().wxml\n : renderPageTree(this.project, this.page).wxml\n }\n}\n","import type { HeadlessProjectDescriptor } from '../project'\nimport type { HeadlessSession } from '../runtime'\nimport type { HeadlessTestingWaitOptions } from './pageHandle'\nimport { HeadlessTestingPageHandle } from './pageHandle'\n\nconst LEADING_SLASH_RE = /^\\/+/\nconst DEFAULT_WAIT_TIMEOUT = 1_000\nconst DEFAULT_WAIT_INTERVAL = 10\n\nfunction normalizeRoute(route: string) {\n return route.replace(LEADING_SLASH_RE, '')\n}\n\nfunction resolvePageScopeId(scopeId: string) {\n const pagePathIndex = scopeId.indexOf('/page/')\n return pagePathIndex >= 0 ? scopeId.slice(0, pagePathIndex) : scopeId\n}\n\nexport class HeadlessTestingScopeHandle {\n constructor(\n readonly scopeId: string,\n private readonly project: HeadlessProjectDescriptor,\n private readonly session: HeadlessSession,\n ) {}\n\n private createScopeHandle(component: any) {\n const scopeId = this.session.getScopeIdForComponent(component)\n return scopeId ? new HeadlessTestingScopeHandle(scopeId, this.project, this.session) : null\n }\n\n async callMethod(methodName: string, ...args: any[]) {\n const normalizedMethodName = methodName.trim()\n if (!normalizedMethodName) {\n throw new Error('Method name must be a non-empty string in headless testing runtime.')\n }\n return this.session.callScopeMethodDirect(this.scopeId, normalizedMethodName, ...args)\n }\n\n async snapshot() {\n return this.session.getScopeSnapshot(this.scopeId)\n }\n\n async page() {\n const currentPage = this.session.getCurrentPages().at(-1)\n return currentPage ? new HeadlessTestingPageHandle(this.project, currentPage, this.session) : null\n }\n\n async pageScope() {\n return new HeadlessTestingScopeHandle(resolvePageScopeId(this.scopeId), this.project, this.session)\n }\n\n async ownerComponent() {\n return this.createScopeHandle(this.session.selectOwnerComponent(this.scopeId))\n }\n\n async waitForOwnerComponent(\n options: { interval?: number, timeout?: number } = {},\n ) {\n const timeout = Number.isFinite(options.timeout) ? Math.max(0, Math.trunc(options.timeout ?? 1_000)) : 1_000\n const interval = Number.isFinite(options.interval) ? Math.max(1, Math.trunc(options.interval ?? 10)) : 10\n const deadline = Date.now() + timeout\n\n while (true) {\n const owner = await this.ownerComponent()\n if (owner) {\n return owner\n }\n if (Date.now() >= deadline) {\n throw new Error('Timed out waiting for owner component in headless testing runtime.')\n }\n await new Promise(resolve => setTimeout(resolve, interval))\n }\n }\n\n async selectComponent(selector: string) {\n const normalizedSelector = selector.trim()\n if (!normalizedSelector) {\n throw new Error('Selector must be a non-empty string in headless testing runtime.')\n }\n const component = this.session.selectComponentWithin(this.scopeId, normalizedSelector)\n return this.createScopeHandle(component)\n }\n\n async selectAllComponents(selector: string) {\n const normalizedSelector = selector.trim()\n if (!normalizedSelector) {\n throw new Error('Selector must be a non-empty string in headless testing runtime.')\n }\n return this.session.selectAllComponentsWithin(this.scopeId, normalizedSelector)\n .map(component => this.createScopeHandle(component))\n .filter((handle): handle is HeadlessTestingScopeHandle => Boolean(handle))\n }\n\n async waitForComponent(\n selector: string,\n options: { interval?: number, timeout?: number } = {},\n ) {\n const normalizedSelector = selector.trim()\n if (!normalizedSelector) {\n throw new Error('Selector must be a non-empty string in headless testing runtime.')\n }\n const timeout = Number.isFinite(options.timeout) ? Math.max(0, Math.trunc(options.timeout ?? 1_000)) : 1_000\n const interval = Number.isFinite(options.interval) ? Math.max(1, Math.trunc(options.interval ?? 10)) : 10\n const deadline = Date.now() + timeout\n\n while (true) {\n const component = await this.selectComponent(normalizedSelector)\n if (component) {\n return component\n }\n if (Date.now() >= deadline) {\n throw new Error(`Timed out waiting for component \"${normalizedSelector}\" in headless testing runtime.`)\n }\n await new Promise(resolve => setTimeout(resolve, interval))\n }\n }\n\n async waitForComponents(\n selector: string,\n count = 1,\n options: { interval?: number, timeout?: number } = {},\n ) {\n const normalizedSelector = selector.trim()\n if (!normalizedSelector) {\n throw new Error('Selector must be a non-empty string in headless testing runtime.')\n }\n const normalizedCount = Number.isFinite(count) ? Math.max(1, Math.trunc(count)) : 1\n const timeout = Number.isFinite(options.timeout) ? Math.max(0, Math.trunc(options.timeout ?? 1_000)) : 1_000\n const interval = Number.isFinite(options.interval) ? Math.max(1, Math.trunc(options.interval ?? 10)) : 10\n const deadline = Date.now() + timeout\n\n while (true) {\n const components = await this.selectAllComponents(normalizedSelector)\n if (components.length >= normalizedCount) {\n return components\n }\n if (Date.now() >= deadline) {\n throw new Error(`Timed out waiting for ${normalizedCount} component(s) matching \"${normalizedSelector}\" in headless testing runtime.`)\n }\n await new Promise(resolve => setTimeout(resolve, interval))\n }\n }\n}\n\nexport class HeadlessTestingSessionHandle {\n constructor(\n private readonly project: HeadlessProjectDescriptor,\n private readonly session: HeadlessSession,\n ) {}\n\n private async waitFor(ms = 0) {\n if (ms <= 0) {\n return\n }\n await new Promise(resolve => setTimeout(resolve, ms))\n }\n\n private async pollUntil<T>(\n check: () => Promise<T | null>,\n errorMessage: string,\n options: HeadlessTestingWaitOptions = {},\n ) {\n const timeout = Number.isFinite(options.timeout)\n ? Math.max(0, Math.trunc(options.timeout ?? DEFAULT_WAIT_TIMEOUT))\n : DEFAULT_WAIT_TIMEOUT\n const interval = Number.isFinite(options.interval)\n ? Math.max(1, Math.trunc(options.interval ?? DEFAULT_WAIT_INTERVAL))\n : DEFAULT_WAIT_INTERVAL\n const deadline = Date.now() + timeout\n\n while (true) {\n const result = await check()\n if (result != null) {\n return result\n }\n if (Date.now() >= deadline) {\n throw new Error(errorMessage)\n }\n await this.waitFor(interval)\n }\n }\n\n async close() {\n\n }\n\n async currentPage() {\n const pages = this.session.getCurrentPages()\n const current = pages.at(-1)\n return current ? new HeadlessTestingPageHandle(this.project, current, this.session) : null\n }\n\n async getCurrentPages() {\n return this.session.getCurrentPages().map(page => new HeadlessTestingPageHandle(this.project, page, this.session))\n }\n\n async scopeSnapshot(scopeId: string) {\n const normalizedScopeId = scopeId.trim()\n if (!normalizedScopeId) {\n throw new Error('Scope id must be a non-empty string in headless testing runtime.')\n }\n return this.session.getScopeSnapshot(normalizedScopeId)\n }\n\n async selectComponent(selector: string) {\n const normalizedSelector = selector.trim()\n if (!normalizedSelector) {\n throw new Error('Selector must be a non-empty string in headless testing runtime.')\n }\n const component = this.session.selectComponent(normalizedSelector)\n const scopeId = this.session.getScopeIdForComponent(component)\n return scopeId ? new HeadlessTestingScopeHandle(scopeId, this.project, this.session) : null\n }\n\n async selectAllComponents(selector: string) {\n const normalizedSelector = selector.trim()\n if (!normalizedSelector) {\n throw new Error('Selector must be a non-empty string in headless testing runtime.')\n }\n return this.session.selectAllComponents(normalizedSelector)\n .map(component => this.session.getScopeIdForComponent(component))\n .filter((scopeId): scopeId is string => Boolean(scopeId))\n .map(scopeId => new HeadlessTestingScopeHandle(scopeId, this.project, this.session))\n }\n\n async waitForComponent(selector: string, options: HeadlessTestingWaitOptions = {}) {\n const normalizedSelector = selector.trim()\n if (!normalizedSelector) {\n throw new Error('Selector must be a non-empty string in headless testing runtime.')\n }\n\n return await this.pollUntil(\n async () => await this.selectComponent(normalizedSelector),\n `Timed out waiting for component \"${normalizedSelector}\" in headless testing runtime.`,\n options,\n )\n }\n\n async waitForComponents(selector: string, count = 1, options: HeadlessTestingWaitOptions = {}) {\n const normalizedSelector = selector.trim()\n if (!normalizedSelector) {\n throw new Error('Selector must be a non-empty string in headless testing runtime.')\n }\n const normalizedCount = Number.isFinite(count) ? Math.max(1, Math.trunc(count)) : 1\n\n return await this.pollUntil(\n async () => {\n const components = await this.selectAllComponents(normalizedSelector)\n return components.length >= normalizedCount ? components : null\n },\n `Timed out waiting for ${normalizedCount} component(s) matching \"${normalizedSelector}\" in headless testing runtime.`,\n options,\n )\n }\n\n async reLaunch(route: string) {\n const page = this.session.reLaunch(route)\n return new HeadlessTestingPageHandle(this.project, page, this.session)\n }\n\n async waitForCurrentPage(route?: string, options: HeadlessTestingWaitOptions = {}) {\n const normalizedRoute = route?.trim()\n if (normalizedRoute != null && !normalizedRoute) {\n throw new Error('Route must be a non-empty string in headless testing runtime.')\n }\n\n return await this.pollUntil(\n async () => {\n const currentPageInstance = this.session.getCurrentPages().at(-1)\n if (!currentPageInstance) {\n return null\n }\n const current = new HeadlessTestingPageHandle(this.project, currentPageInstance, this.session)\n if (!normalizedRoute) {\n return current\n }\n if (normalizeRoute(currentPageInstance.route) === normalizeRoute(normalizedRoute)) {\n return current\n }\n return null\n },\n normalizedRoute\n ? `Timed out waiting for current page \"${normalizeRoute(normalizedRoute)}\" in headless testing runtime.`\n : 'Timed out waiting for a current page in headless testing runtime.',\n options,\n )\n }\n\n async pageScrollTo(scrollTop: number) {\n this.session.pageScrollTo({ scrollTop })\n }\n\n async triggerPullDownRefresh() {\n this.session.triggerPullDownRefresh()\n }\n\n async triggerReachBottom() {\n this.session.triggerReachBottom()\n }\n\n async triggerResize(options: Record<string, any>) {\n this.session.triggerResize(options)\n }\n\n async triggerRouteDone(options?: Record<string, any>) {\n this.session.triggerRouteDone(options)\n }\n}\n","import { createHeadlessSession } from '../runtime'\nimport { HeadlessTestingSessionHandle } from './sessionHandle'\n\nexport interface HeadlessTestingLaunchOptions {\n projectPath: string\n}\n\nexport async function launch(options: HeadlessTestingLaunchOptions) {\n const session = createHeadlessSession({\n projectPath: options.projectPath,\n })\n session.bootstrap()\n return new HeadlessTestingSessionHandle(session.project, session)\n}\n"],"x_google_ignoreList":[4,5,6,7,8,9,10,11,12,13,14,15,21],"mappings":"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"}
|