@weapp-vite/web 1.3.17 → 1.3.19
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/compiler/wxml/compile.mjs.map +1 -1
- package/dist/compiler/wxml/interpolation.mjs.map +1 -1
- package/dist/compiler/wxml/parser.mjs.map +1 -1
- package/dist/compiler/wxml/renderer.mjs.map +1 -1
- package/dist/compiler/wxml/specialNodes.mjs.map +1 -1
- package/dist/compiler/wxs.mjs.map +1 -1
- package/dist/css/wxss.mjs.map +1 -1
- package/dist/plugin/entry.mjs.map +1 -1
- package/dist/plugin/files.mjs.map +1 -1
- package/dist/plugin/index.mjs.map +1 -1
- package/dist/plugin/path.mjs.map +1 -1
- package/dist/plugin/scan.mjs.map +1 -1
- package/dist/plugin/scanConfig.mjs.map +1 -1
- package/dist/runtime/button/helpers.mjs.map +1 -1
- package/dist/runtime/button/index.mjs.map +1 -1
- package/dist/runtime/component/behavior.mjs.map +1 -1
- package/dist/runtime/component/state.mjs.map +1 -1
- package/dist/runtime/legacyTemplate/expression.mjs.map +1 -1
- package/dist/runtime/legacyTemplate/index.mjs.map +1 -1
- package/dist/runtime/polyfill/auth.mjs.map +1 -1
- package/dist/runtime/polyfill/canvasContext.mjs.map +1 -1
- package/dist/runtime/polyfill/deviceApi.mjs.map +1 -1
- package/dist/runtime/polyfill/filePicker.mjs.map +1 -1
- package/dist/runtime/polyfill/fileSystemManager.mjs.map +1 -1
- package/dist/runtime/polyfill/files.mjs.map +1 -1
- package/dist/runtime/polyfill/interaction.mjs.map +1 -1
- package/dist/runtime/polyfill/interactionApi.mjs.map +1 -1
- package/dist/runtime/polyfill/location.mjs.map +1 -1
- package/dist/runtime/polyfill/locationApi.mjs.map +1 -1
- package/dist/runtime/polyfill/mediaActions.mjs.map +1 -1
- package/dist/runtime/polyfill/mediaApi/picker.mjs.map +1 -1
- package/dist/runtime/polyfill/mediaApi/process.mjs.map +1 -1
- package/dist/runtime/polyfill/mediaInfo.mjs.map +1 -1
- package/dist/runtime/polyfill/mediaPicker.mjs.map +1 -1
- package/dist/runtime/polyfill/mediaProcess.mjs.map +1 -1
- package/dist/runtime/polyfill/network/request.mjs.map +1 -1
- package/dist/runtime/polyfill/network/status.mjs.map +1 -1
- package/dist/runtime/polyfill/platformRuntime.mjs.map +1 -1
- package/dist/runtime/polyfill/routeRuntime/lifecycle.mjs.map +1 -1
- package/dist/runtime/polyfill/routeRuntime/options.mjs.map +1 -1
- package/dist/runtime/polyfill/routeRuntime/url.mjs.map +1 -1
- package/dist/runtime/polyfill/runtimeOps.mjs.map +1 -1
- package/dist/runtime/polyfill/storage.mjs.map +1 -1
- package/dist/runtime/polyfill/subscribe.mjs.map +1 -1
- package/dist/runtime/polyfill/system.mjs.map +1 -1
- package/dist/runtime/polyfill/systemApi.mjs.map +1 -1
- package/dist/runtime/polyfill/ui.mjs.map +1 -1
- package/dist/runtime/polyfill/videoContext.mjs.map +1 -1
- package/dist/runtime/renderContext.mjs.map +1 -1
- package/dist/shared/slugify.mjs.map +1 -1
- package/package.json +3 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"behavior.mjs","names":[],"sources":["../../../src/runtime/component/behavior.ts"],"sourcesContent":["import type {\n ComponentOptions,\n ComponentPublicInstance,\n DataRecord,\n LifeTimeHooks,\n PageLifeTimeHooks,\n} from './types'\n\nfunction isPlainObject(value: unknown): value is Record<string, any> {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n}\n\nfunction mergeLifetimes(target: LifeTimeHooks, source?: LifeTimeHooks) {\n if (!source) {\n return\n }\n const keys: Array<keyof LifeTimeHooks> = ['created', 'attached', 'ready', 'detached']\n for (const key of keys) {\n const next = source[key]\n if (!next) {\n continue\n }\n const current = target[key]\n target[key] = current\n ? function merged(this: ComponentPublicInstance) {\n current.call(this)\n next.call(this)\n }\n : next\n }\n}\n\nfunction mergePageLifetimes(target: PageLifeTimeHooks, source?: PageLifeTimeHooks) {\n if (!source) {\n return\n }\n const keys: Array<keyof PageLifeTimeHooks> = ['show', 'hide', 'resize']\n for (const key of keys) {\n const next = source[key]\n if (!next) {\n continue\n }\n const current = target[key]\n target[key] = current\n ? function merged(this: ComponentPublicInstance) {\n current.call(this)\n next.call(this)\n }\n : next\n }\n}\n\nexport function normalizeBehaviors(component: ComponentOptions | undefined) {\n if (!component) {\n return { component: undefined, warnings: [] as string[] }\n }\n const warnings: string[] = []\n const visited = new Set<ComponentOptions>()\n const merged: ComponentOptions = {}\n\n const mergeComponent = (source: ComponentOptions) => {\n if (source.properties) {\n merged.properties = { ...(merged.properties ?? {}), ...source.properties }\n }\n if (source.data) {\n const nextData = typeof source.data === 'function'\n ? source.data()\n : source.data\n if (isPlainObject(nextData)) {\n merged.data = { ...((merged.data as DataRecord) ?? {}), ...nextData }\n }\n }\n if (source.methods) {\n merged.methods = { ...(merged.methods ?? {}), ...source.methods }\n }\n if (source.lifetimes) {\n merged.lifetimes = merged.lifetimes ?? {}\n mergeLifetimes(merged.lifetimes, source.lifetimes)\n }\n if (source.pageLifetimes) {\n merged.pageLifetimes = merged.pageLifetimes ?? {}\n mergePageLifetimes(merged.pageLifetimes, source.pageLifetimes)\n }\n }\n\n const walk = (source: ComponentOptions) => {\n if (visited.has(source)) {\n warnings.push('[@weapp-vite/web] behaviors 存在循环引用,已跳过。')\n return\n }\n visited.add(source)\n const behaviors = source.behaviors ?? []\n if (Array.isArray(behaviors)) {\n for (const behavior of behaviors) {\n if (!behavior || !isPlainObject(behavior)) {\n warnings.push('[@weapp-vite/web] behaviors 仅支持对象,已忽略非对象条目。')\n continue\n }\n walk(behavior as ComponentOptions)\n mergeComponent(behavior as ComponentOptions)\n }\n }\n else if (behaviors) {\n warnings.push('[@weapp-vite/web] behaviors 仅支持数组,已忽略。')\n }\n }\n\n walk(component)\n mergeComponent(component)\n\n return {\n component: merged,\n warnings,\n }\n}\n"],"mappings":";AAQA,SAAS,cAAc,OAA8C;AACnE,QAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,MAAM;;AAG7E,SAAS,eAAe,QAAuB,QAAwB;AACrE,KAAI,CAAC,OACH;AAGF,MAAK,MAAM,
|
|
1
|
+
{"version":3,"file":"behavior.mjs","names":[],"sources":["../../../src/runtime/component/behavior.ts"],"sourcesContent":["import type {\n ComponentOptions,\n ComponentPublicInstance,\n DataRecord,\n LifeTimeHooks,\n PageLifeTimeHooks,\n} from './types'\n\nfunction isPlainObject(value: unknown): value is Record<string, any> {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n}\n\nfunction mergeLifetimes(target: LifeTimeHooks, source?: LifeTimeHooks) {\n if (!source) {\n return\n }\n const keys: Array<keyof LifeTimeHooks> = ['created', 'attached', 'ready', 'detached']\n for (const key of keys) {\n const next = source[key]\n if (!next) {\n continue\n }\n const current = target[key]\n target[key] = current\n ? function merged(this: ComponentPublicInstance) {\n current.call(this)\n next.call(this)\n }\n : next\n }\n}\n\nfunction mergePageLifetimes(target: PageLifeTimeHooks, source?: PageLifeTimeHooks) {\n if (!source) {\n return\n }\n const keys: Array<keyof PageLifeTimeHooks> = ['show', 'hide', 'resize']\n for (const key of keys) {\n const next = source[key]\n if (!next) {\n continue\n }\n const current = target[key]\n target[key] = current\n ? function merged(this: ComponentPublicInstance) {\n current.call(this)\n next.call(this)\n }\n : next\n }\n}\n\nexport function normalizeBehaviors(component: ComponentOptions | undefined) {\n if (!component) {\n return { component: undefined, warnings: [] as string[] }\n }\n const warnings: string[] = []\n const visited = new Set<ComponentOptions>()\n const merged: ComponentOptions = {}\n\n const mergeComponent = (source: ComponentOptions) => {\n if (source.properties) {\n merged.properties = { ...(merged.properties ?? {}), ...source.properties }\n }\n if (source.data) {\n const nextData = typeof source.data === 'function'\n ? source.data()\n : source.data\n if (isPlainObject(nextData)) {\n merged.data = { ...((merged.data as DataRecord) ?? {}), ...nextData }\n }\n }\n if (source.methods) {\n merged.methods = { ...(merged.methods ?? {}), ...source.methods }\n }\n if (source.lifetimes) {\n merged.lifetimes = merged.lifetimes ?? {}\n mergeLifetimes(merged.lifetimes, source.lifetimes)\n }\n if (source.pageLifetimes) {\n merged.pageLifetimes = merged.pageLifetimes ?? {}\n mergePageLifetimes(merged.pageLifetimes, source.pageLifetimes)\n }\n }\n\n const walk = (source: ComponentOptions) => {\n if (visited.has(source)) {\n warnings.push('[@weapp-vite/web] behaviors 存在循环引用,已跳过。')\n return\n }\n visited.add(source)\n const behaviors = source.behaviors ?? []\n if (Array.isArray(behaviors)) {\n for (const behavior of behaviors) {\n if (!behavior || !isPlainObject(behavior)) {\n warnings.push('[@weapp-vite/web] behaviors 仅支持对象,已忽略非对象条目。')\n continue\n }\n walk(behavior as ComponentOptions)\n mergeComponent(behavior as ComponentOptions)\n }\n }\n else if (behaviors) {\n warnings.push('[@weapp-vite/web] behaviors 仅支持数组,已忽略。')\n }\n }\n\n walk(component)\n mergeComponent(component)\n\n return {\n component: merged,\n warnings,\n }\n}\n"],"mappings":";AAQA,SAAS,cAAc,OAA8C;AACnE,QAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,MAAM;;AAG7E,SAAS,eAAe,QAAuB,QAAwB;AACrE,KAAI,CAAC,OACH;AAGF,MAAK,MAAM,OAAO;EADwB;EAAW;EAAY;EAAS;EACpD,EAAE;EACtB,MAAM,OAAO,OAAO;AACpB,MAAI,CAAC,KACH;EAEF,MAAM,UAAU,OAAO;AACvB,SAAO,OAAO,UACV,SAAS,SAAsC;AAC/C,WAAQ,KAAK,KAAK;AAClB,QAAK,KAAK,KAAK;MAEf;;;AAIR,SAAS,mBAAmB,QAA2B,QAA4B;AACjF,KAAI,CAAC,OACH;AAGF,MAAK,MAAM,OAAO;EAD4B;EAAQ;EAAQ;EACxC,EAAE;EACtB,MAAM,OAAO,OAAO;AACpB,MAAI,CAAC,KACH;EAEF,MAAM,UAAU,OAAO;AACvB,SAAO,OAAO,UACV,SAAS,SAAsC;AAC/C,WAAQ,KAAK,KAAK;AAClB,QAAK,KAAK,KAAK;MAEf;;;AAIR,SAAgB,mBAAmB,WAAyC;AAC1E,KAAI,CAAC,UACH,QAAO;EAAE,WAAW;EAAW,UAAU,EAAE;EAAc;CAE3D,MAAM,WAAqB,EAAE;CAC7B,MAAM,0BAAU,IAAI,KAAuB;CAC3C,MAAM,SAA2B,EAAE;CAEnC,MAAM,kBAAkB,WAA6B;AACnD,MAAI,OAAO,WACT,QAAO,aAAa;GAAE,GAAI,OAAO,cAAc,EAAE;GAAG,GAAG,OAAO;GAAY;AAE5E,MAAI,OAAO,MAAM;GACf,MAAM,WAAW,OAAO,OAAO,SAAS,aACpC,OAAO,MAAM,GACb,OAAO;AACX,OAAI,cAAc,SAAS,CACzB,QAAO,OAAO;IAAE,GAAK,OAAO,QAAuB,EAAE;IAAG,GAAG;IAAU;;AAGzE,MAAI,OAAO,QACT,QAAO,UAAU;GAAE,GAAI,OAAO,WAAW,EAAE;GAAG,GAAG,OAAO;GAAS;AAEnE,MAAI,OAAO,WAAW;AACpB,UAAO,YAAY,OAAO,aAAa,EAAE;AACzC,kBAAe,OAAO,WAAW,OAAO,UAAU;;AAEpD,MAAI,OAAO,eAAe;AACxB,UAAO,gBAAgB,OAAO,iBAAiB,EAAE;AACjD,sBAAmB,OAAO,eAAe,OAAO,cAAc;;;CAIlE,MAAM,QAAQ,WAA6B;AACzC,MAAI,QAAQ,IAAI,OAAO,EAAE;AACvB,YAAS,KAAK,0CAA0C;AACxD;;AAEF,UAAQ,IAAI,OAAO;EACnB,MAAM,YAAY,OAAO,aAAa,EAAE;AACxC,MAAI,MAAM,QAAQ,UAAU,CAC1B,MAAK,MAAM,YAAY,WAAW;AAChC,OAAI,CAAC,YAAY,CAAC,cAAc,SAAS,EAAE;AACzC,aAAS,KAAK,8CAA8C;AAC5D;;AAEF,QAAK,SAA6B;AAClC,kBAAe,SAA6B;;WAGvC,UACP,UAAS,KAAK,yCAAyC;;AAI3D,MAAK,UAAU;AACf,gBAAe,UAAU;AAEzB,QAAO;EACL,WAAW;EACX;EACD"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"state.mjs","names":[],"sources":["../../../src/runtime/component/state.ts"],"sourcesContent":["import type {\n ComponentOptions,\n DataRecord,\n DefineComponentOptions,\n LifeTimeHooks,\n PageLifeTimeHooks,\n PropertyOption,\n} from './types'\nimport { normalizeBehaviors } from './behavior'\nimport { cloneValue, hyphenate } from './utils'\n\ntype PropertyEntry = [string, PropertyOption]\n\nexport interface ComponentRuntimeState {\n templateRef: DefineComponentOptions['template']\n styleRef: string\n componentRef: ComponentOptions\n observerInitEnabled: boolean\n propertyEntries: PropertyEntry[]\n observedAttributes: string[]\n defaultPropertyValues: DataRecord\n lifetimes: LifeTimeHooks\n pageLifetimes: PageLifeTimeHooks\n}\n\nfunction resolveNormalizedComponent(component: ComponentOptions | undefined) {\n const normalized = normalizeBehaviors(component)\n return {\n warnings: normalized.warnings,\n component: normalized.component ?? component ?? {},\n }\n}\n\nfunction createDefaultPropertyValues(propertyEntries: PropertyEntry[]) {\n return propertyEntries.reduce<DataRecord>((acc, [name, prop]) => {\n if (Object.prototype.hasOwnProperty.call(prop, 'value')) {\n acc[name] = cloneValue(prop.value)\n }\n else {\n acc[name] = undefined\n }\n return acc\n }, {})\n}\n\nfunction createPropertyEntries(component: ComponentOptions): PropertyEntry[] {\n return Object.entries(component.properties ?? {})\n}\n\nfunction createObservedAttributes(propertyEntries: PropertyEntry[]) {\n return propertyEntries.map(([name]) => hyphenate(name))\n}\n\nexport function createComponentRuntimeState(options: DefineComponentOptions) {\n const { component, warnings } = resolveNormalizedComponent(options.component ?? {})\n const propertyEntries = createPropertyEntries(component)\n const state: ComponentRuntimeState = {\n templateRef: options.template,\n styleRef: options.style ?? '',\n componentRef: component,\n observerInitEnabled: Boolean(options.observerInit),\n propertyEntries,\n observedAttributes: createObservedAttributes(propertyEntries),\n defaultPropertyValues: createDefaultPropertyValues(propertyEntries),\n lifetimes: component.lifetimes ?? {},\n pageLifetimes: component.pageLifetimes ?? {},\n }\n return {\n state,\n warnings,\n }\n}\n\nexport function updateComponentRuntimeState(state: ComponentRuntimeState, options: DefineComponentOptions) {\n const { component, warnings } = resolveNormalizedComponent(options.component ?? {})\n const propertyEntries = createPropertyEntries(component)\n state.templateRef = options.template\n state.styleRef = options.style ?? ''\n state.componentRef = component\n state.observerInitEnabled = Boolean(options.observerInit)\n state.lifetimes = component.lifetimes ?? {}\n state.pageLifetimes = component.pageLifetimes ?? {}\n state.propertyEntries = propertyEntries\n state.observedAttributes = createObservedAttributes(propertyEntries)\n state.defaultPropertyValues = createDefaultPropertyValues(propertyEntries)\n return {\n warnings,\n nextMethods: component.methods ?? {},\n }\n}\n"],"mappings":";;;;AAyBA,SAAS,2BAA2B,WAAyC;CAC3E,MAAM,aAAa,mBAAmB,UAAU;AAChD,QAAO;EACL,UAAU,WAAW;EACrB,WAAW,WAAW,aAAa,aAAa,EAAE;EACnD;;AAGH,SAAS,4BAA4B,iBAAkC;AACrE,QAAO,gBAAgB,QAAoB,KAAK,CAAC,MAAM,UAAU;AAC/D,MAAI,OAAO,UAAU,eAAe,KAAK,MAAM,QAAQ,CACrD,KAAI,QAAQ,WAAW,KAAK,MAAM;MAGlC,KAAI,QAAQ;AAEd,SAAO;IACN,EAAE,CAAC;;AAGR,SAAS,sBAAsB,WAA8C;AAC3E,QAAO,OAAO,QAAQ,UAAU,cAAc,EAAE,CAAC;;AAGnD,SAAS,yBAAyB,iBAAkC;AAClE,QAAO,gBAAgB,KAAK,CAAC,UAAU,UAAU,KAAK,CAAC;;AAGzD,SAAgB,4BAA4B,SAAiC;CAC3E,MAAM,EAAE,WAAW,aAAa,2BAA2B,QAAQ,aAAa,EAAE,CAAC;CACnF,MAAM,kBAAkB,sBAAsB,UAAU;AAYxD,QAAO;EACL
|
|
1
|
+
{"version":3,"file":"state.mjs","names":[],"sources":["../../../src/runtime/component/state.ts"],"sourcesContent":["import type {\n ComponentOptions,\n DataRecord,\n DefineComponentOptions,\n LifeTimeHooks,\n PageLifeTimeHooks,\n PropertyOption,\n} from './types'\nimport { normalizeBehaviors } from './behavior'\nimport { cloneValue, hyphenate } from './utils'\n\ntype PropertyEntry = [string, PropertyOption]\n\nexport interface ComponentRuntimeState {\n templateRef: DefineComponentOptions['template']\n styleRef: string\n componentRef: ComponentOptions\n observerInitEnabled: boolean\n propertyEntries: PropertyEntry[]\n observedAttributes: string[]\n defaultPropertyValues: DataRecord\n lifetimes: LifeTimeHooks\n pageLifetimes: PageLifeTimeHooks\n}\n\nfunction resolveNormalizedComponent(component: ComponentOptions | undefined) {\n const normalized = normalizeBehaviors(component)\n return {\n warnings: normalized.warnings,\n component: normalized.component ?? component ?? {},\n }\n}\n\nfunction createDefaultPropertyValues(propertyEntries: PropertyEntry[]) {\n return propertyEntries.reduce<DataRecord>((acc, [name, prop]) => {\n if (Object.prototype.hasOwnProperty.call(prop, 'value')) {\n acc[name] = cloneValue(prop.value)\n }\n else {\n acc[name] = undefined\n }\n return acc\n }, {})\n}\n\nfunction createPropertyEntries(component: ComponentOptions): PropertyEntry[] {\n return Object.entries(component.properties ?? {})\n}\n\nfunction createObservedAttributes(propertyEntries: PropertyEntry[]) {\n return propertyEntries.map(([name]) => hyphenate(name))\n}\n\nexport function createComponentRuntimeState(options: DefineComponentOptions) {\n const { component, warnings } = resolveNormalizedComponent(options.component ?? {})\n const propertyEntries = createPropertyEntries(component)\n const state: ComponentRuntimeState = {\n templateRef: options.template,\n styleRef: options.style ?? '',\n componentRef: component,\n observerInitEnabled: Boolean(options.observerInit),\n propertyEntries,\n observedAttributes: createObservedAttributes(propertyEntries),\n defaultPropertyValues: createDefaultPropertyValues(propertyEntries),\n lifetimes: component.lifetimes ?? {},\n pageLifetimes: component.pageLifetimes ?? {},\n }\n return {\n state,\n warnings,\n }\n}\n\nexport function updateComponentRuntimeState(state: ComponentRuntimeState, options: DefineComponentOptions) {\n const { component, warnings } = resolveNormalizedComponent(options.component ?? {})\n const propertyEntries = createPropertyEntries(component)\n state.templateRef = options.template\n state.styleRef = options.style ?? ''\n state.componentRef = component\n state.observerInitEnabled = Boolean(options.observerInit)\n state.lifetimes = component.lifetimes ?? {}\n state.pageLifetimes = component.pageLifetimes ?? {}\n state.propertyEntries = propertyEntries\n state.observedAttributes = createObservedAttributes(propertyEntries)\n state.defaultPropertyValues = createDefaultPropertyValues(propertyEntries)\n return {\n warnings,\n nextMethods: component.methods ?? {},\n }\n}\n"],"mappings":";;;;AAyBA,SAAS,2BAA2B,WAAyC;CAC3E,MAAM,aAAa,mBAAmB,UAAU;AAChD,QAAO;EACL,UAAU,WAAW;EACrB,WAAW,WAAW,aAAa,aAAa,EAAE;EACnD;;AAGH,SAAS,4BAA4B,iBAAkC;AACrE,QAAO,gBAAgB,QAAoB,KAAK,CAAC,MAAM,UAAU;AAC/D,MAAI,OAAO,UAAU,eAAe,KAAK,MAAM,QAAQ,CACrD,KAAI,QAAQ,WAAW,KAAK,MAAM;MAGlC,KAAI,QAAQ;AAEd,SAAO;IACN,EAAE,CAAC;;AAGR,SAAS,sBAAsB,WAA8C;AAC3E,QAAO,OAAO,QAAQ,UAAU,cAAc,EAAE,CAAC;;AAGnD,SAAS,yBAAyB,iBAAkC;AAClE,QAAO,gBAAgB,KAAK,CAAC,UAAU,UAAU,KAAK,CAAC;;AAGzD,SAAgB,4BAA4B,SAAiC;CAC3E,MAAM,EAAE,WAAW,aAAa,2BAA2B,QAAQ,aAAa,EAAE,CAAC;CACnF,MAAM,kBAAkB,sBAAsB,UAAU;AAYxD,QAAO;EACL;GAXA,aAAa,QAAQ;GACrB,UAAU,QAAQ,SAAS;GAC3B,cAAc;GACd,qBAAqB,QAAQ,QAAQ,aAAa;GAClD;GACA,oBAAoB,yBAAyB,gBAAgB;GAC7D,uBAAuB,4BAA4B,gBAAgB;GACnE,WAAW,UAAU,aAAa,EAAE;GACpC,eAAe,UAAU,iBAAiB,EAAE;GAGvC;EACL;EACD;;AAGH,SAAgB,4BAA4B,OAA8B,SAAiC;CACzG,MAAM,EAAE,WAAW,aAAa,2BAA2B,QAAQ,aAAa,EAAE,CAAC;CACnF,MAAM,kBAAkB,sBAAsB,UAAU;AACxD,OAAM,cAAc,QAAQ;AAC5B,OAAM,WAAW,QAAQ,SAAS;AAClC,OAAM,eAAe;AACrB,OAAM,sBAAsB,QAAQ,QAAQ,aAAa;AACzD,OAAM,YAAY,UAAU,aAAa,EAAE;AAC3C,OAAM,gBAAgB,UAAU,iBAAiB,EAAE;AACnD,OAAM,kBAAkB;AACxB,OAAM,qBAAqB,yBAAyB,gBAAgB;AACpE,OAAM,wBAAwB,4BAA4B,gBAAgB;AAC1E,QAAO;EACL;EACA,aAAa,UAAU,WAAW,EAAE;EACrC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"expression.mjs","names":[],"sources":["../../../src/runtime/legacyTemplate/expression.ts"],"sourcesContent":["import type { LegacyTemplateScope } from './types'\nimport { getRuntimeExecutionMode, warnRuntimeExecutionOnce } from '../execution'\n\nconst expressionCache = new Map<string, (scope: LegacyTemplateScope) => any>()\n\nexport function createScope(initial?: LegacyTemplateScope) {\n return Object.assign(Object.create(null), initial ?? {})\n}\n\nexport function createChildScope(parent: LegacyTemplateScope) {\n return Object.assign(Object.create(parent), {})\n}\n\nexport function normalizeList(value: any): any[] {\n if (Array.isArray(value)) {\n return value\n }\n if (value == null) {\n return []\n }\n if (typeof value === 'number' && Number.isFinite(value)) {\n const length = Math.max(0, Math.floor(value))\n return Array.from({ length }, (_, index) => index)\n }\n if (typeof value === 'object') {\n return Object.values(value)\n }\n return []\n}\n\nexport function escapeHtml(value: string) {\n return value.replace(/[&<>\"']/g, (match) => {\n switch (match) {\n case '&':\n return '&'\n case '<':\n return '<'\n case '>':\n return '>'\n case '\"':\n return '"'\n case '\\'':\n return '''\n default:\n return match\n }\n })\n}\n\nexport function escapeAttribute(value: string) {\n return escapeHtml(value)\n}\n\nfunction toDisplayString(value: any) {\n if (value == null) {\n return ''\n }\n if (typeof value === 'object') {\n if (value instanceof Date) {\n return value.toISOString()\n }\n try {\n return JSON.stringify(value)\n }\n catch {\n return String(value)\n }\n }\n return String(value)\n}\n\nfunction unwrapExpression(expression: string) {\n const trimmed = expression.trim()\n if (trimmed.startsWith('{{') && trimmed.endsWith('}}')) {\n return trimmed.slice(2, -2).trim()\n }\n return trimmed\n}\n\nexport function evaluateExpression(expression: string, scope: LegacyTemplateScope) {\n if (!expression) {\n return undefined\n }\n const trimmed = unwrapExpression(expression)\n if (!trimmed) {\n return undefined\n }\n let evaluator = expressionCache.get(trimmed)\n if (!evaluator) {\n try {\n // eslint-disable-next-line no-new-func -- dynamic expressions are required for template evaluation\n evaluator = new Function('scope', `with(scope){ return (${trimmed}); }`) as (scope: LegacyTemplateScope) => any\n }\n catch (error) {\n const reason = error instanceof Error ? error.message : String(error)\n const mode = getRuntimeExecutionMode()\n if (mode === 'safe') {\n warnRuntimeExecutionOnce(\n `safe-legacy-expression-parse:${trimmed}`,\n `[@weapp-vite/web] safe 模式下忽略表达式解析错误 \"${trimmed}\": ${reason}`,\n )\n evaluator = () => undefined\n }\n else {\n throw new SyntaxError(`[@weapp-vite/web] 无法解析表达式 \"${trimmed}\": ${reason}`)\n }\n }\n if (evaluator) {\n expressionCache.set(trimmed, evaluator)\n }\n }\n try {\n return evaluator?.(scope)\n }\n catch (error) {\n const mode = getRuntimeExecutionMode()\n if (mode === 'strict') {\n const reason = error instanceof Error ? error.message : String(error)\n throw new Error(`[@weapp-vite/web] strict 模式下表达式执行失败 \"${trimmed}\": ${reason}`)\n }\n if (mode === 'safe') {\n const reason = error instanceof Error ? error.message : String(error)\n warnRuntimeExecutionOnce(\n `safe-legacy-expression-runtime:${trimmed}`,\n `[@weapp-vite/web] safe 模式下忽略表达式执行错误 \"${trimmed}\": ${reason}`,\n )\n }\n return undefined\n }\n}\n\nexport function interpolateText(source: string, scope: LegacyTemplateScope, escapeResult: boolean) {\n if (!source.includes('{{')) {\n return escapeResult ? escapeHtml(source) : source\n }\n\n let cursor = 0\n let buffer = ''\n\n while (cursor < source.length) {\n const start = source.indexOf('{{', cursor)\n if (start === -1) {\n buffer += source.slice(cursor)\n break\n }\n\n buffer += source.slice(cursor, start)\n\n const end = source.indexOf('}}', start + 2)\n if (end === -1) {\n buffer += source.slice(start)\n break\n }\n\n const expression = source.slice(start + 2, end).trim()\n const evaluated = toDisplayString(evaluateExpression(expression, scope))\n buffer += evaluated\n cursor = end + 2\n }\n\n return escapeResult ? escapeHtml(buffer) : buffer\n}\n\nexport function resolveAttributeValue(value: string, scope: LegacyTemplateScope) {\n return interpolateText(value ?? '', scope, false)\n}\n"],"mappings":";;;AAGA,MAAM,kCAAkB,IAAI,KAAkD;AAE9E,SAAgB,YAAY,SAA+B;AACzD,QAAO,OAAO,OAAO,OAAO,OAAO,KAAK,EAAE,WAAW,EAAE,CAAC;;AAG1D,SAAgB,iBAAiB,QAA6B;AAC5D,QAAO,OAAO,OAAO,OAAO,OAAO,OAAO,EAAE,EAAE,CAAC;;AAGjD,SAAgB,cAAc,OAAmB;AAC/C,KAAI,MAAM,QAAQ,MAAM,CACtB,QAAO;AAET,KAAI,SAAS,KACX,QAAO,EAAE;AAEX,KAAI,OAAO,UAAU,YAAY,OAAO,SAAS,MAAM,EAAE;EACvD,MAAM,SAAS,KAAK,IAAI,GAAG,KAAK,MAAM,MAAM,CAAC;AAC7C,SAAO,MAAM,KAAK,EAAE,QAAQ,GAAG,GAAG,UAAU,MAAM;;AAEpD,KAAI,OAAO,UAAU,SACnB,QAAO,OAAO,OAAO,MAAM;AAE7B,QAAO,EAAE;;AAGX,SAAgB,WAAW,OAAe;AACxC,QAAO,MAAM,QAAQ,aAAa,UAAU;AAC1C,UAAQ,OAAR;GACE,KAAK,IACH,QAAO;GACT,KAAK,IACH,QAAO;GACT,KAAK,IACH,QAAO;GACT,KAAK,KACH,QAAO;GACT,KAAK,IACH,QAAO;GACT,QACE,QAAO;;GAEX;;AAGJ,SAAgB,gBAAgB,OAAe;AAC7C,QAAO,WAAW,MAAM;;AAG1B,SAAS,gBAAgB,OAAY;AACnC,KAAI,SAAS,KACX,QAAO;AAET,KAAI,OAAO,UAAU,UAAU;AAC7B,MAAI,iBAAiB,KACnB,QAAO,MAAM,aAAa;AAE5B,MAAI;AACF,UAAO,KAAK,UAAU,MAAM;UAExB;AACJ,UAAO,OAAO,MAAM;;;AAGxB,QAAO,OAAO,MAAM;;AAGtB,SAAS,iBAAiB,YAAoB;CAC5C,MAAM,UAAU,WAAW,MAAM;AACjC,KAAI,QAAQ,WAAW,KAAK,IAAI,QAAQ,SAAS,KAAK,CACpD,QAAO,QAAQ,MAAM,GAAG,GAAG,CAAC,MAAM;AAEpC,QAAO;;AAGT,SAAgB,mBAAmB,YAAoB,OAA4B;AACjF,KAAI,CAAC,WACH;CAEF,MAAM,UAAU,iBAAiB,WAAW;AAC5C,KAAI,CAAC,QACH;CAEF,IAAI,YAAY,gBAAgB,IAAI,QAAQ;AAC5C,KAAI,CAAC,WAAW;AACd,MAAI;AAEF,eAAY,IAAI,SAAS,SAAS,wBAAwB,QAAQ,MAAM;WAEnE,OAAO;GACZ,MAAM,SAAS,iBAAiB,QAAQ,MAAM,UAAU,OAAO,MAAM;AAErE,OADa,
|
|
1
|
+
{"version":3,"file":"expression.mjs","names":[],"sources":["../../../src/runtime/legacyTemplate/expression.ts"],"sourcesContent":["import type { LegacyTemplateScope } from './types'\nimport { getRuntimeExecutionMode, warnRuntimeExecutionOnce } from '../execution'\n\nconst expressionCache = new Map<string, (scope: LegacyTemplateScope) => any>()\n\nexport function createScope(initial?: LegacyTemplateScope) {\n return Object.assign(Object.create(null), initial ?? {})\n}\n\nexport function createChildScope(parent: LegacyTemplateScope) {\n return Object.assign(Object.create(parent), {})\n}\n\nexport function normalizeList(value: any): any[] {\n if (Array.isArray(value)) {\n return value\n }\n if (value == null) {\n return []\n }\n if (typeof value === 'number' && Number.isFinite(value)) {\n const length = Math.max(0, Math.floor(value))\n return Array.from({ length }, (_, index) => index)\n }\n if (typeof value === 'object') {\n return Object.values(value)\n }\n return []\n}\n\nexport function escapeHtml(value: string) {\n return value.replace(/[&<>\"']/g, (match) => {\n switch (match) {\n case '&':\n return '&'\n case '<':\n return '<'\n case '>':\n return '>'\n case '\"':\n return '"'\n case '\\'':\n return '''\n default:\n return match\n }\n })\n}\n\nexport function escapeAttribute(value: string) {\n return escapeHtml(value)\n}\n\nfunction toDisplayString(value: any) {\n if (value == null) {\n return ''\n }\n if (typeof value === 'object') {\n if (value instanceof Date) {\n return value.toISOString()\n }\n try {\n return JSON.stringify(value)\n }\n catch {\n return String(value)\n }\n }\n return String(value)\n}\n\nfunction unwrapExpression(expression: string) {\n const trimmed = expression.trim()\n if (trimmed.startsWith('{{') && trimmed.endsWith('}}')) {\n return trimmed.slice(2, -2).trim()\n }\n return trimmed\n}\n\nexport function evaluateExpression(expression: string, scope: LegacyTemplateScope) {\n if (!expression) {\n return undefined\n }\n const trimmed = unwrapExpression(expression)\n if (!trimmed) {\n return undefined\n }\n let evaluator = expressionCache.get(trimmed)\n if (!evaluator) {\n try {\n // eslint-disable-next-line no-new-func -- dynamic expressions are required for template evaluation\n evaluator = new Function('scope', `with(scope){ return (${trimmed}); }`) as (scope: LegacyTemplateScope) => any\n }\n catch (error) {\n const reason = error instanceof Error ? error.message : String(error)\n const mode = getRuntimeExecutionMode()\n if (mode === 'safe') {\n warnRuntimeExecutionOnce(\n `safe-legacy-expression-parse:${trimmed}`,\n `[@weapp-vite/web] safe 模式下忽略表达式解析错误 \"${trimmed}\": ${reason}`,\n )\n evaluator = () => undefined\n }\n else {\n throw new SyntaxError(`[@weapp-vite/web] 无法解析表达式 \"${trimmed}\": ${reason}`)\n }\n }\n if (evaluator) {\n expressionCache.set(trimmed, evaluator)\n }\n }\n try {\n return evaluator?.(scope)\n }\n catch (error) {\n const mode = getRuntimeExecutionMode()\n if (mode === 'strict') {\n const reason = error instanceof Error ? error.message : String(error)\n throw new Error(`[@weapp-vite/web] strict 模式下表达式执行失败 \"${trimmed}\": ${reason}`)\n }\n if (mode === 'safe') {\n const reason = error instanceof Error ? error.message : String(error)\n warnRuntimeExecutionOnce(\n `safe-legacy-expression-runtime:${trimmed}`,\n `[@weapp-vite/web] safe 模式下忽略表达式执行错误 \"${trimmed}\": ${reason}`,\n )\n }\n return undefined\n }\n}\n\nexport function interpolateText(source: string, scope: LegacyTemplateScope, escapeResult: boolean) {\n if (!source.includes('{{')) {\n return escapeResult ? escapeHtml(source) : source\n }\n\n let cursor = 0\n let buffer = ''\n\n while (cursor < source.length) {\n const start = source.indexOf('{{', cursor)\n if (start === -1) {\n buffer += source.slice(cursor)\n break\n }\n\n buffer += source.slice(cursor, start)\n\n const end = source.indexOf('}}', start + 2)\n if (end === -1) {\n buffer += source.slice(start)\n break\n }\n\n const expression = source.slice(start + 2, end).trim()\n const evaluated = toDisplayString(evaluateExpression(expression, scope))\n buffer += evaluated\n cursor = end + 2\n }\n\n return escapeResult ? escapeHtml(buffer) : buffer\n}\n\nexport function resolveAttributeValue(value: string, scope: LegacyTemplateScope) {\n return interpolateText(value ?? '', scope, false)\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","names":[],"sources":["../../../src/runtime/legacyTemplate/index.ts"],"sourcesContent":["import type { ChildNode, DataNode, Element, Node } from 'domhandler'\nimport type {\n LegacyTemplateRenderer,\n LegacyTemplateScope,\n RenderOptions,\n} from './types'\nimport { parseDocument } from 'htmlparser2'\nimport {\n hasControlAttribute,\n normalizeTagName,\n resolveControlAttributeValue,\n SELF_CLOSING_TAGS,\n} from '../../shared/wxml'\nimport {\n buildAttributeString,\n extractFor,\n isConditionalElement,\n stripControlAttributes,\n} from './dom'\nimport {\n createChildScope,\n createScope,\n evaluateExpression,\n interpolateText,\n normalizeList,\n} from './expression'\n\nconst templateCache = new Map<string, ChildNode[]>()\n\nfunction filterRenderableNode(node: Node) {\n if (node.type === 'directive' || node.type === 'comment') {\n return false\n }\n if (node.type === 'text') {\n const data = (node as DataNode).data ?? ''\n return data.trim().length > 0\n }\n return true\n}\n\nfunction getOrParseTemplate(source: string) {\n let cached = templateCache.get(source)\n if (!cached) {\n const document = parseDocument(source, {\n xmlMode: true,\n decodeEntities: true,\n recognizeSelfClosing: true,\n })\n cached = (document.children ?? []).filter(filterRenderableNode)\n templateCache.set(source, cached)\n }\n return cached\n}\n\nfunction renderConditionalSequence(\n nodes: ChildNode[],\n startIndex: number,\n scope: LegacyTemplateScope,\n renderChildren: (input: ChildNode[] | ChildNode | undefined, scope: LegacyTemplateScope) => string,\n) {\n const branches: Array<{ node: Element, attribs: Record<string, string> }> = []\n let cursor = startIndex\n\n while (cursor < nodes.length) {\n const candidate = nodes[cursor]\n if (!isConditionalElement(candidate)) {\n break\n }\n const element = candidate as Element\n const attribs = element.attribs ?? {}\n if (branches.length === 0 && !hasControlAttribute(attribs, 'if')) {\n break\n }\n if (branches.length > 0 && !hasControlAttribute(attribs, 'elif') && !hasControlAttribute(attribs, 'else')) {\n break\n }\n branches.push({ node: element, attribs })\n cursor += 1\n if (hasControlAttribute(attribs, 'else')) {\n break\n }\n }\n\n if (!branches.length) {\n const node = nodes[startIndex]\n return {\n rendered: renderChildren(node, scope),\n endIndex: startIndex,\n }\n }\n\n for (const { node, attribs } of branches) {\n if (hasControlAttribute(attribs, 'else')) {\n return {\n // eslint-disable-next-line ts/no-use-before-define -- 条件分支与普通节点复用同一元素渲染逻辑。\n rendered: renderElement(\n node,\n scope,\n renderChildren,\n { overrideAttribs: stripControlAttributes(attribs) },\n ),\n endIndex: startIndex + branches.length - 1,\n }\n }\n const conditionExpr = resolveControlAttributeValue(attribs, 'if')\n ?? resolveControlAttributeValue(attribs, 'elif')\n if (!conditionExpr) {\n continue\n }\n const condition = evaluateExpression(conditionExpr, scope)\n if (condition) {\n return {\n // eslint-disable-next-line ts/no-use-before-define -- 条件分支与普通节点复用同一元素渲染逻辑。\n rendered: renderElement(\n node,\n scope,\n renderChildren,\n { overrideAttribs: stripControlAttributes(attribs) },\n ),\n endIndex: startIndex + branches.length - 1,\n }\n }\n }\n\n return {\n rendered: '',\n endIndex: startIndex + branches.length - 1,\n }\n}\n\nfunction renderElement(\n node: Element,\n scope: LegacyTemplateScope,\n renderChildren: (nodes: ChildNode[] | undefined, scope: LegacyTemplateScope) => string,\n options: RenderOptions = {},\n) {\n const attribs = node.attribs ?? {}\n if (!options.skipFor) {\n const forExtract = extractFor(attribs)\n if (forExtract.expr) {\n const list = normalizeList(evaluateExpression(forExtract.expr, scope))\n if (!list.length) {\n return ''\n }\n let buffer = ''\n for (let idx = 0; idx < list.length; idx++) {\n const item = list[idx]\n const childScope = createChildScope(scope)\n childScope[forExtract.itemName] = item\n childScope[forExtract.indexName] = idx\n buffer += renderElement(node, childScope, renderChildren, {\n skipFor: true,\n overrideAttribs: forExtract.restAttribs,\n })\n }\n return buffer\n }\n }\n\n const effectiveAttribs = options.overrideAttribs ?? attribs\n const normalizedTag = normalizeTagName(node.name)\n if (normalizedTag === '#fragment') {\n return renderChildren(node.children, scope)\n }\n\n const attrs = buildAttributeString(effectiveAttribs, scope)\n const children = renderChildren(node.children, scope)\n\n if (SELF_CLOSING_TAGS.has(normalizedTag) && !children) {\n return `<${normalizedTag}${attrs} />`\n }\n\n return `<${normalizedTag}${attrs}>${children}</${normalizedTag}>`\n}\n\nfunction renderTextNode(node: DataNode, scope: LegacyTemplateScope) {\n const value = node.data ?? ''\n if (!value.trim()) {\n return ''\n }\n return interpolateText(value, scope, true)\n}\n\nfunction renderTree(\n input: ChildNode[] | ChildNode | undefined,\n scope: LegacyTemplateScope,\n): string {\n if (!input) {\n return ''\n }\n\n if (Array.isArray(input)) {\n let buffer = ''\n for (let index = 0; index < input.length; index++) {\n const node = input[index]\n if (isConditionalElement(node)) {\n const { rendered, endIndex } = renderConditionalSequence(input, index, scope, renderTree)\n buffer += rendered\n index = endIndex\n continue\n }\n buffer += renderTree(node, scope)\n }\n return buffer\n }\n\n const node = input\n if (node.type === 'text') {\n return renderTextNode(node as DataNode, scope)\n }\n if (node.type === 'tag' || node.type === 'script' || node.type === 'style') {\n return renderElement(node as Element, scope, renderTree)\n }\n if ('children' in node && node.children?.length) {\n return renderTree(node.children, scope)\n }\n return ''\n}\n\nexport function renderTemplate(nodes: ChildNode[], scope?: LegacyTemplateScope) {\n const renderScope = createScope(scope)\n return renderTree(nodes, renderScope)\n}\n\nexport function createTemplate(source: string): LegacyTemplateRenderer {\n const nodes = getOrParseTemplate(source)\n return (scope?: LegacyTemplateScope) => renderTemplate(nodes, scope)\n}\n\nexport type { LegacyTemplateRenderer, LegacyTemplateScope } from './types'\n"],"mappings":";;;;;;AA2BA,MAAM,gCAAgB,IAAI,KAA0B;AAEpD,SAAS,qBAAqB,MAAY;AACxC,KAAI,KAAK,SAAS,eAAe,KAAK,SAAS,UAC7C,QAAO;AAET,KAAI,KAAK,SAAS,OAEhB,SADc,KAAkB,QAAQ,IAC5B,MAAM,CAAC,SAAS;AAE9B,QAAO;;AAGT,SAAS,mBAAmB,QAAgB;CAC1C,IAAI,SAAS,cAAc,IAAI,OAAO;AACtC,KAAI,CAAC,QAAQ;AAMX,YALiB,cAAc,QAAQ;GACrC,SAAS;GACT,gBAAgB;GAChB,sBAAsB;GACvB,CAAC,
|
|
1
|
+
{"version":3,"file":"index.mjs","names":[],"sources":["../../../src/runtime/legacyTemplate/index.ts"],"sourcesContent":["import type { ChildNode, DataNode, Element, Node } from 'domhandler'\nimport type {\n LegacyTemplateRenderer,\n LegacyTemplateScope,\n RenderOptions,\n} from './types'\nimport { parseDocument } from 'htmlparser2'\nimport {\n hasControlAttribute,\n normalizeTagName,\n resolveControlAttributeValue,\n SELF_CLOSING_TAGS,\n} from '../../shared/wxml'\nimport {\n buildAttributeString,\n extractFor,\n isConditionalElement,\n stripControlAttributes,\n} from './dom'\nimport {\n createChildScope,\n createScope,\n evaluateExpression,\n interpolateText,\n normalizeList,\n} from './expression'\n\nconst templateCache = new Map<string, ChildNode[]>()\n\nfunction filterRenderableNode(node: Node) {\n if (node.type === 'directive' || node.type === 'comment') {\n return false\n }\n if (node.type === 'text') {\n const data = (node as DataNode).data ?? ''\n return data.trim().length > 0\n }\n return true\n}\n\nfunction getOrParseTemplate(source: string) {\n let cached = templateCache.get(source)\n if (!cached) {\n const document = parseDocument(source, {\n xmlMode: true,\n decodeEntities: true,\n recognizeSelfClosing: true,\n })\n cached = (document.children ?? []).filter(filterRenderableNode)\n templateCache.set(source, cached)\n }\n return cached\n}\n\nfunction renderConditionalSequence(\n nodes: ChildNode[],\n startIndex: number,\n scope: LegacyTemplateScope,\n renderChildren: (input: ChildNode[] | ChildNode | undefined, scope: LegacyTemplateScope) => string,\n) {\n const branches: Array<{ node: Element, attribs: Record<string, string> }> = []\n let cursor = startIndex\n\n while (cursor < nodes.length) {\n const candidate = nodes[cursor]\n if (!isConditionalElement(candidate)) {\n break\n }\n const element = candidate as Element\n const attribs = element.attribs ?? {}\n if (branches.length === 0 && !hasControlAttribute(attribs, 'if')) {\n break\n }\n if (branches.length > 0 && !hasControlAttribute(attribs, 'elif') && !hasControlAttribute(attribs, 'else')) {\n break\n }\n branches.push({ node: element, attribs })\n cursor += 1\n if (hasControlAttribute(attribs, 'else')) {\n break\n }\n }\n\n if (!branches.length) {\n const node = nodes[startIndex]\n return {\n rendered: renderChildren(node, scope),\n endIndex: startIndex,\n }\n }\n\n for (const { node, attribs } of branches) {\n if (hasControlAttribute(attribs, 'else')) {\n return {\n // eslint-disable-next-line ts/no-use-before-define -- 条件分支与普通节点复用同一元素渲染逻辑。\n rendered: renderElement(\n node,\n scope,\n renderChildren,\n { overrideAttribs: stripControlAttributes(attribs) },\n ),\n endIndex: startIndex + branches.length - 1,\n }\n }\n const conditionExpr = resolveControlAttributeValue(attribs, 'if')\n ?? resolveControlAttributeValue(attribs, 'elif')\n if (!conditionExpr) {\n continue\n }\n const condition = evaluateExpression(conditionExpr, scope)\n if (condition) {\n return {\n // eslint-disable-next-line ts/no-use-before-define -- 条件分支与普通节点复用同一元素渲染逻辑。\n rendered: renderElement(\n node,\n scope,\n renderChildren,\n { overrideAttribs: stripControlAttributes(attribs) },\n ),\n endIndex: startIndex + branches.length - 1,\n }\n }\n }\n\n return {\n rendered: '',\n endIndex: startIndex + branches.length - 1,\n }\n}\n\nfunction renderElement(\n node: Element,\n scope: LegacyTemplateScope,\n renderChildren: (nodes: ChildNode[] | undefined, scope: LegacyTemplateScope) => string,\n options: RenderOptions = {},\n) {\n const attribs = node.attribs ?? {}\n if (!options.skipFor) {\n const forExtract = extractFor(attribs)\n if (forExtract.expr) {\n const list = normalizeList(evaluateExpression(forExtract.expr, scope))\n if (!list.length) {\n return ''\n }\n let buffer = ''\n for (let idx = 0; idx < list.length; idx++) {\n const item = list[idx]\n const childScope = createChildScope(scope)\n childScope[forExtract.itemName] = item\n childScope[forExtract.indexName] = idx\n buffer += renderElement(node, childScope, renderChildren, {\n skipFor: true,\n overrideAttribs: forExtract.restAttribs,\n })\n }\n return buffer\n }\n }\n\n const effectiveAttribs = options.overrideAttribs ?? attribs\n const normalizedTag = normalizeTagName(node.name)\n if (normalizedTag === '#fragment') {\n return renderChildren(node.children, scope)\n }\n\n const attrs = buildAttributeString(effectiveAttribs, scope)\n const children = renderChildren(node.children, scope)\n\n if (SELF_CLOSING_TAGS.has(normalizedTag) && !children) {\n return `<${normalizedTag}${attrs} />`\n }\n\n return `<${normalizedTag}${attrs}>${children}</${normalizedTag}>`\n}\n\nfunction renderTextNode(node: DataNode, scope: LegacyTemplateScope) {\n const value = node.data ?? ''\n if (!value.trim()) {\n return ''\n }\n return interpolateText(value, scope, true)\n}\n\nfunction renderTree(\n input: ChildNode[] | ChildNode | undefined,\n scope: LegacyTemplateScope,\n): string {\n if (!input) {\n return ''\n }\n\n if (Array.isArray(input)) {\n let buffer = ''\n for (let index = 0; index < input.length; index++) {\n const node = input[index]\n if (isConditionalElement(node)) {\n const { rendered, endIndex } = renderConditionalSequence(input, index, scope, renderTree)\n buffer += rendered\n index = endIndex\n continue\n }\n buffer += renderTree(node, scope)\n }\n return buffer\n }\n\n const node = input\n if (node.type === 'text') {\n return renderTextNode(node as DataNode, scope)\n }\n if (node.type === 'tag' || node.type === 'script' || node.type === 'style') {\n return renderElement(node as Element, scope, renderTree)\n }\n if ('children' in node && node.children?.length) {\n return renderTree(node.children, scope)\n }\n return ''\n}\n\nexport function renderTemplate(nodes: ChildNode[], scope?: LegacyTemplateScope) {\n const renderScope = createScope(scope)\n return renderTree(nodes, renderScope)\n}\n\nexport function createTemplate(source: string): LegacyTemplateRenderer {\n const nodes = getOrParseTemplate(source)\n return (scope?: LegacyTemplateScope) => renderTemplate(nodes, scope)\n}\n\nexport type { LegacyTemplateRenderer, LegacyTemplateScope } from './types'\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.mjs","names":[],"sources":["../../../src/runtime/polyfill/auth.ts"],"sourcesContent":["import {\n WEAPP_VITE_WEB_AUTHORIZE_DECISION_KEY,\n WEAPP_VITE_WEB_CHECK_SESSION_KEY,\n WEAPP_VITE_WEB_GET_USER_PROFILE_DECISION_KEY,\n WEAPP_VITE_WEB_OPEN_APP_AUTHORIZE_SETTING_KEY,\n WEAPP_VITE_WEB_OPEN_SETTING_AUTH_KEY,\n WEAPP_VITE_WEB_USER_INFO_KEY,\n WEAPP_VITE_WEB_USER_PROFILE_KEY,\n} from '@weapp-core/constants'\n\nexport type AppAuthorizeStatusLike = 'authorized' | 'denied' | 'not determined'\n\ntype UserLanguageLike = 'en' | 'zh_CN' | 'zh_TW'\n\ninterface UserInfoLike {\n nickName: string\n avatarUrl: string\n gender: 0 | 1 | 2\n country: string\n province: string\n city: string\n language: UserLanguageLike\n}\n\nexport function normalizeAuthScope(scope: unknown) {\n if (typeof scope !== 'string') {\n return ''\n }\n return scope.trim()\n}\n\nexport function buildAuthSettingSnapshot(authorizeState: Map<string, AppAuthorizeStatusLike>) {\n const authSetting: Record<string, boolean> = {}\n for (const [scope, status] of authorizeState.entries()) {\n authSetting[scope] = status === 'authorized'\n }\n return authSetting\n}\n\nexport function normalizeAuthorizeDecision(decision: unknown): AppAuthorizeStatusLike {\n if (decision === true) {\n return 'authorized'\n }\n if (decision === false) {\n return 'denied'\n }\n if (decision === 'authorized' || decision === 'denied' || decision === 'not determined') {\n return decision\n }\n return 'authorized'\n}\n\nexport function resolveAuthorizeDecision(scope: string): AppAuthorizeStatusLike {\n const runtimeGlobal = globalThis as Record<string, unknown>\n const decisionSource = runtimeGlobal[WEAPP_VITE_WEB_AUTHORIZE_DECISION_KEY]\n if (typeof decisionSource === 'function') {\n try {\n return normalizeAuthorizeDecision((decisionSource as (value: string) => unknown)(scope))\n }\n catch {\n return 'authorized'\n }\n }\n if (decisionSource && typeof decisionSource === 'object') {\n return normalizeAuthorizeDecision((decisionSource as Record<string, unknown>)[scope])\n }\n return 'authorized'\n}\n\nexport function syncOpenSettingPreset(\n authorizeState: Map<string, AppAuthorizeStatusLike>,\n supportedAuthScopes: Set<string>,\n) {\n const runtimeGlobal = globalThis as Record<string, unknown>\n const preset = runtimeGlobal[WEAPP_VITE_WEB_OPEN_SETTING_AUTH_KEY]\n if (!preset || typeof preset !== 'object') {\n return\n }\n for (const [scope, value] of Object.entries(preset as Record<string, unknown>)) {\n if (!supportedAuthScopes.has(scope)) {\n continue\n }\n authorizeState.set(scope, value ? 'authorized' : 'denied')\n }\n}\n\nexport function normalizeAppAuthorizeStatus(value: unknown): AppAuthorizeStatusLike {\n if (value === true) {\n return 'authorized'\n }\n if (value === false) {\n return 'denied'\n }\n if (value === 'authorized' || value === 'denied' || value === 'not determined') {\n return value\n }\n return 'not determined'\n}\n\nexport function syncOpenAppAuthorizeSettingPreset(\n authorizeState: Map<string, AppAuthorizeStatusLike>,\n scopeMap: Partial<Record<string, string>>,\n) {\n const runtimeGlobal = globalThis as Record<string, unknown>\n const preset = runtimeGlobal[WEAPP_VITE_WEB_OPEN_APP_AUTHORIZE_SETTING_KEY]\n if (!preset || typeof preset !== 'object') {\n return\n }\n for (const [key, scope] of Object.entries(scopeMap)) {\n if (!scope) {\n continue\n }\n const status = normalizeAppAuthorizeStatus((preset as Record<string, unknown>)[key])\n authorizeState.set(scope, status)\n }\n}\n\nexport function generateLoginCode() {\n const now = Date.now().toString(36)\n const random = Math.random().toString(36).slice(2, 10)\n return `web_${now}_${random}`\n}\n\nexport function normalizeUserLanguage(value: unknown): UserLanguageLike {\n if (value === 'en' || value === 'zh_CN' || value === 'zh_TW') {\n return value\n }\n const runtimeNavigator = typeof navigator !== 'undefined' ? navigator : undefined\n const language = runtimeNavigator?.language?.toLowerCase() ?? ''\n if (language.startsWith('zh-tw') || language.startsWith('zh-hk')) {\n return 'zh_TW'\n }\n if (language.startsWith('zh')) {\n return 'zh_CN'\n }\n return 'en'\n}\n\nfunction normalizeUserGender(value: unknown): UserInfoLike['gender'] {\n if (value === 1 || value === 2) {\n return value\n }\n return 0\n}\n\nfunction normalizeUserInfoValue(value: unknown, lang: UserLanguageLike) {\n if (!value || typeof value !== 'object') {\n return null\n }\n const info = value as Record<string, unknown>\n return {\n nickName: typeof info.nickName === 'string' && info.nickName.trim() ? info.nickName : 'Web User',\n avatarUrl: typeof info.avatarUrl === 'string' ? info.avatarUrl : '',\n gender: normalizeUserGender(info.gender),\n country: typeof info.country === 'string' ? info.country : '',\n province: typeof info.province === 'string' ? info.province : '',\n city: typeof info.city === 'string' ? info.city : '',\n language: normalizeUserLanguage(info.language ?? lang),\n } satisfies UserInfoLike\n}\n\nfunction resolveUserInfoPreset(\n source: typeof WEAPP_VITE_WEB_USER_INFO_KEY | typeof WEAPP_VITE_WEB_USER_PROFILE_KEY,\n lang: UserLanguageLike,\n) {\n const runtimeGlobal = globalThis as Record<string, unknown>\n const preset = runtimeGlobal[source]\n if (typeof preset === 'function') {\n return normalizeUserInfoValue((preset as () => unknown)(), lang)\n }\n return normalizeUserInfoValue(preset, lang)\n}\n\nexport function buildUserProfilePayload(errMsg: 'getUserInfo:ok' | 'getUserProfile:ok', optionsLang?: unknown) {\n const language = normalizeUserLanguage(optionsLang)\n const userInfo = resolveUserInfoPreset(WEAPP_VITE_WEB_USER_PROFILE_KEY, language)\n ?? resolveUserInfoPreset(WEAPP_VITE_WEB_USER_INFO_KEY, language)\n ?? {\n nickName: 'Web User',\n avatarUrl: '',\n gender: 0 as const,\n country: '',\n province: '',\n city: '',\n language,\n }\n const rawData = JSON.stringify(userInfo)\n return {\n errMsg,\n userInfo,\n rawData,\n signature: `web-signature-${rawData.length}`,\n encryptedData: '',\n iv: '',\n }\n}\n\nexport function resolveCheckSessionState() {\n const runtimeGlobal = globalThis as Record<string, unknown>\n const preset = runtimeGlobal[WEAPP_VITE_WEB_CHECK_SESSION_KEY]\n if (typeof preset === 'boolean') {\n return preset\n }\n if (typeof preset === 'string') {\n return preset.trim() !== 'fail'\n }\n if (preset && typeof preset === 'object' && 'valid' in preset) {\n return Boolean((preset as { valid?: unknown }).valid)\n }\n return true\n}\n\nexport function resolveUserProfileDecision(): AppAuthorizeStatusLike {\n const runtimeGlobal = globalThis as Record<string, unknown>\n const preset = runtimeGlobal[WEAPP_VITE_WEB_GET_USER_PROFILE_DECISION_KEY]\n if (typeof preset === 'function') {\n return normalizeAuthorizeDecision((preset as () => unknown)())\n }\n return normalizeAuthorizeDecision(preset)\n}\n"],"mappings":";;;AAwBA,SAAgB,mBAAmB,OAAgB;AACjD,KAAI,OAAO,UAAU,SACnB,QAAO;AAET,QAAO,MAAM,MAAM;;AAGrB,SAAgB,yBAAyB,gBAAqD;CAC5F,MAAM,cAAuC,EAAE;AAC/C,MAAK,MAAM,CAAC,OAAO,WAAW,eAAe,SAAS,CACpD,aAAY,SAAS,WAAW;AAElC,QAAO;;AAGT,SAAgB,2BAA2B,UAA2C;AACpF,KAAI,aAAa,KACf,QAAO;AAET,KAAI,aAAa,MACf,QAAO;AAET,KAAI,aAAa,gBAAgB,aAAa,YAAY,aAAa,iBACrE,QAAO;AAET,QAAO;;AAGT,SAAgB,yBAAyB,OAAuC;CAE9E,MAAM,
|
|
1
|
+
{"version":3,"file":"auth.mjs","names":["runtimeGlobal"],"sources":["../../../src/runtime/polyfill/auth.ts"],"sourcesContent":["import {\n WEAPP_VITE_WEB_AUTHORIZE_DECISION_KEY,\n WEAPP_VITE_WEB_CHECK_SESSION_KEY,\n WEAPP_VITE_WEB_GET_USER_PROFILE_DECISION_KEY,\n WEAPP_VITE_WEB_OPEN_APP_AUTHORIZE_SETTING_KEY,\n WEAPP_VITE_WEB_OPEN_SETTING_AUTH_KEY,\n WEAPP_VITE_WEB_USER_INFO_KEY,\n WEAPP_VITE_WEB_USER_PROFILE_KEY,\n} from '@weapp-core/constants'\n\nexport type AppAuthorizeStatusLike = 'authorized' | 'denied' | 'not determined'\n\ntype UserLanguageLike = 'en' | 'zh_CN' | 'zh_TW'\n\ninterface UserInfoLike {\n nickName: string\n avatarUrl: string\n gender: 0 | 1 | 2\n country: string\n province: string\n city: string\n language: UserLanguageLike\n}\n\nexport function normalizeAuthScope(scope: unknown) {\n if (typeof scope !== 'string') {\n return ''\n }\n return scope.trim()\n}\n\nexport function buildAuthSettingSnapshot(authorizeState: Map<string, AppAuthorizeStatusLike>) {\n const authSetting: Record<string, boolean> = {}\n for (const [scope, status] of authorizeState.entries()) {\n authSetting[scope] = status === 'authorized'\n }\n return authSetting\n}\n\nexport function normalizeAuthorizeDecision(decision: unknown): AppAuthorizeStatusLike {\n if (decision === true) {\n return 'authorized'\n }\n if (decision === false) {\n return 'denied'\n }\n if (decision === 'authorized' || decision === 'denied' || decision === 'not determined') {\n return decision\n }\n return 'authorized'\n}\n\nexport function resolveAuthorizeDecision(scope: string): AppAuthorizeStatusLike {\n const runtimeGlobal = globalThis as Record<string, unknown>\n const decisionSource = runtimeGlobal[WEAPP_VITE_WEB_AUTHORIZE_DECISION_KEY]\n if (typeof decisionSource === 'function') {\n try {\n return normalizeAuthorizeDecision((decisionSource as (value: string) => unknown)(scope))\n }\n catch {\n return 'authorized'\n }\n }\n if (decisionSource && typeof decisionSource === 'object') {\n return normalizeAuthorizeDecision((decisionSource as Record<string, unknown>)[scope])\n }\n return 'authorized'\n}\n\nexport function syncOpenSettingPreset(\n authorizeState: Map<string, AppAuthorizeStatusLike>,\n supportedAuthScopes: Set<string>,\n) {\n const runtimeGlobal = globalThis as Record<string, unknown>\n const preset = runtimeGlobal[WEAPP_VITE_WEB_OPEN_SETTING_AUTH_KEY]\n if (!preset || typeof preset !== 'object') {\n return\n }\n for (const [scope, value] of Object.entries(preset as Record<string, unknown>)) {\n if (!supportedAuthScopes.has(scope)) {\n continue\n }\n authorizeState.set(scope, value ? 'authorized' : 'denied')\n }\n}\n\nexport function normalizeAppAuthorizeStatus(value: unknown): AppAuthorizeStatusLike {\n if (value === true) {\n return 'authorized'\n }\n if (value === false) {\n return 'denied'\n }\n if (value === 'authorized' || value === 'denied' || value === 'not determined') {\n return value\n }\n return 'not determined'\n}\n\nexport function syncOpenAppAuthorizeSettingPreset(\n authorizeState: Map<string, AppAuthorizeStatusLike>,\n scopeMap: Partial<Record<string, string>>,\n) {\n const runtimeGlobal = globalThis as Record<string, unknown>\n const preset = runtimeGlobal[WEAPP_VITE_WEB_OPEN_APP_AUTHORIZE_SETTING_KEY]\n if (!preset || typeof preset !== 'object') {\n return\n }\n for (const [key, scope] of Object.entries(scopeMap)) {\n if (!scope) {\n continue\n }\n const status = normalizeAppAuthorizeStatus((preset as Record<string, unknown>)[key])\n authorizeState.set(scope, status)\n }\n}\n\nexport function generateLoginCode() {\n const now = Date.now().toString(36)\n const random = Math.random().toString(36).slice(2, 10)\n return `web_${now}_${random}`\n}\n\nexport function normalizeUserLanguage(value: unknown): UserLanguageLike {\n if (value === 'en' || value === 'zh_CN' || value === 'zh_TW') {\n return value\n }\n const runtimeNavigator = typeof navigator !== 'undefined' ? navigator : undefined\n const language = runtimeNavigator?.language?.toLowerCase() ?? ''\n if (language.startsWith('zh-tw') || language.startsWith('zh-hk')) {\n return 'zh_TW'\n }\n if (language.startsWith('zh')) {\n return 'zh_CN'\n }\n return 'en'\n}\n\nfunction normalizeUserGender(value: unknown): UserInfoLike['gender'] {\n if (value === 1 || value === 2) {\n return value\n }\n return 0\n}\n\nfunction normalizeUserInfoValue(value: unknown, lang: UserLanguageLike) {\n if (!value || typeof value !== 'object') {\n return null\n }\n const info = value as Record<string, unknown>\n return {\n nickName: typeof info.nickName === 'string' && info.nickName.trim() ? info.nickName : 'Web User',\n avatarUrl: typeof info.avatarUrl === 'string' ? info.avatarUrl : '',\n gender: normalizeUserGender(info.gender),\n country: typeof info.country === 'string' ? info.country : '',\n province: typeof info.province === 'string' ? info.province : '',\n city: typeof info.city === 'string' ? info.city : '',\n language: normalizeUserLanguage(info.language ?? lang),\n } satisfies UserInfoLike\n}\n\nfunction resolveUserInfoPreset(\n source: typeof WEAPP_VITE_WEB_USER_INFO_KEY | typeof WEAPP_VITE_WEB_USER_PROFILE_KEY,\n lang: UserLanguageLike,\n) {\n const runtimeGlobal = globalThis as Record<string, unknown>\n const preset = runtimeGlobal[source]\n if (typeof preset === 'function') {\n return normalizeUserInfoValue((preset as () => unknown)(), lang)\n }\n return normalizeUserInfoValue(preset, lang)\n}\n\nexport function buildUserProfilePayload(errMsg: 'getUserInfo:ok' | 'getUserProfile:ok', optionsLang?: unknown) {\n const language = normalizeUserLanguage(optionsLang)\n const userInfo = resolveUserInfoPreset(WEAPP_VITE_WEB_USER_PROFILE_KEY, language)\n ?? resolveUserInfoPreset(WEAPP_VITE_WEB_USER_INFO_KEY, language)\n ?? {\n nickName: 'Web User',\n avatarUrl: '',\n gender: 0 as const,\n country: '',\n province: '',\n city: '',\n language,\n }\n const rawData = JSON.stringify(userInfo)\n return {\n errMsg,\n userInfo,\n rawData,\n signature: `web-signature-${rawData.length}`,\n encryptedData: '',\n iv: '',\n }\n}\n\nexport function resolveCheckSessionState() {\n const runtimeGlobal = globalThis as Record<string, unknown>\n const preset = runtimeGlobal[WEAPP_VITE_WEB_CHECK_SESSION_KEY]\n if (typeof preset === 'boolean') {\n return preset\n }\n if (typeof preset === 'string') {\n return preset.trim() !== 'fail'\n }\n if (preset && typeof preset === 'object' && 'valid' in preset) {\n return Boolean((preset as { valid?: unknown }).valid)\n }\n return true\n}\n\nexport function resolveUserProfileDecision(): AppAuthorizeStatusLike {\n const runtimeGlobal = globalThis as Record<string, unknown>\n const preset = runtimeGlobal[WEAPP_VITE_WEB_GET_USER_PROFILE_DECISION_KEY]\n if (typeof preset === 'function') {\n return normalizeAuthorizeDecision((preset as () => unknown)())\n }\n return normalizeAuthorizeDecision(preset)\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"canvasContext.mjs","names":[],"sources":["../../../src/runtime/polyfill/canvasContext.ts"],"sourcesContent":["import type { CanvasContext } from './types/platformRuntime'\n\nfunction normalizeCanvasNumber(value: unknown) {\n if (typeof value !== 'number' || Number.isNaN(value)) {\n return 0\n }\n return value\n}\n\nfunction resolveCanvasById(canvasId: string) {\n if (typeof document === 'undefined') {\n return undefined\n }\n const runtimeDocument = document as Document & {\n querySelectorAll?: (selector: string) => ArrayLike<Element>\n body?: {\n querySelectorAll?: (selector: string) => ArrayLike<Element>\n }\n }\n const normalized = canvasId.trim()\n if (!normalized) {\n return undefined\n }\n const canvasList = runtimeDocument.querySelectorAll?.('canvas')\n ?? runtimeDocument.body?.querySelectorAll?.('canvas')\n ?? []\n for (const candidate of Array.from(canvasList)) {\n const canvas = candidate as HTMLCanvasElement\n if (!canvas) {\n continue\n }\n if ((canvas as { id?: string }).id === normalized) {\n return canvas\n }\n if (typeof canvas.getAttribute === 'function' && canvas.getAttribute('canvas-id') === normalized) {\n return canvas\n }\n }\n return undefined\n}\n\nfunction createCanvasCommandQueue(canvasId: string) {\n const commands: Array<(ctx: CanvasRenderingContext2D) => void> = []\n\n const pushCommand = (command: (ctx: CanvasRenderingContext2D) => void) => {\n commands.push(command)\n }\n\n const draw: CanvasContext['draw'] = (reserveOrCallback?: boolean | (() => void), callback?: () => void) => {\n const reserve = typeof reserveOrCallback === 'boolean' ? reserveOrCallback : false\n const done = typeof reserveOrCallback === 'function' ? reserveOrCallback : callback\n const canvas = resolveCanvasById(canvasId)\n const context = canvas?.getContext?.('2d') as CanvasRenderingContext2D | null | undefined\n if (!context) {\n commands.length = 0\n done?.()\n return\n }\n if (!reserve) {\n context.clearRect(0, 0, normalizeCanvasNumber(canvas?.width), normalizeCanvasNumber(canvas?.height))\n }\n for (const command of commands) {\n command(context)\n }\n commands.length = 0\n done?.()\n }\n\n const api: CanvasContext = {\n setFillStyle(color: string) {\n pushCommand((ctx) => {\n ctx.fillStyle = color\n })\n },\n setStrokeStyle(color: string) {\n pushCommand((ctx) => {\n ctx.strokeStyle = color\n })\n },\n setLineWidth(width: number) {\n pushCommand((ctx) => {\n ctx.lineWidth = normalizeCanvasNumber(width)\n })\n },\n setFontSize(size: number) {\n pushCommand((ctx) => {\n const normalized = Math.max(1, normalizeCanvasNumber(size))\n ctx.font = `${normalized}px sans-serif`\n })\n },\n fillRect(x: number, y: number, width: number, height: number) {\n pushCommand((ctx) => {\n ctx.fillRect(\n normalizeCanvasNumber(x),\n normalizeCanvasNumber(y),\n normalizeCanvasNumber(width),\n normalizeCanvasNumber(height),\n )\n })\n },\n strokeRect(x: number, y: number, width: number, height: number) {\n pushCommand((ctx) => {\n ctx.strokeRect(\n normalizeCanvasNumber(x),\n normalizeCanvasNumber(y),\n normalizeCanvasNumber(width),\n normalizeCanvasNumber(height),\n )\n })\n },\n clearRect(x: number, y: number, width: number, height: number) {\n pushCommand((ctx) => {\n ctx.clearRect(\n normalizeCanvasNumber(x),\n normalizeCanvasNumber(y),\n normalizeCanvasNumber(width),\n normalizeCanvasNumber(height),\n )\n })\n },\n fillText(text: string, x: number, y: number, maxWidth?: number) {\n pushCommand((ctx) => {\n const normalizedText = String(text ?? '')\n const normalizedX = normalizeCanvasNumber(x)\n const normalizedY = normalizeCanvasNumber(y)\n if (typeof maxWidth === 'number' && Number.isFinite(maxWidth)) {\n ctx.fillText(normalizedText, normalizedX, normalizedY, normalizeCanvasNumber(maxWidth))\n return\n }\n ctx.fillText(normalizedText, normalizedX, normalizedY)\n })\n },\n beginPath() {\n pushCommand(ctx => ctx.beginPath())\n },\n closePath() {\n pushCommand(ctx => ctx.closePath())\n },\n moveTo(x: number, y: number) {\n pushCommand((ctx) => {\n ctx.moveTo(normalizeCanvasNumber(x), normalizeCanvasNumber(y))\n })\n },\n lineTo(x: number, y: number) {\n pushCommand((ctx) => {\n ctx.lineTo(normalizeCanvasNumber(x), normalizeCanvasNumber(y))\n })\n },\n stroke() {\n pushCommand(ctx => ctx.stroke())\n },\n draw,\n }\n return api\n}\n\nexport function createCanvasContextBridge(canvasId: string) {\n return createCanvasCommandQueue(String(canvasId ?? ''))\n}\n"],"mappings":";AAEA,SAAS,sBAAsB,OAAgB;AAC7C,KAAI,OAAO,UAAU,YAAY,OAAO,MAAM,MAAM,CAClD,QAAO;AAET,QAAO;;AAGT,SAAS,kBAAkB,UAAkB;AAC3C,KAAI,OAAO,aAAa,YACtB;CAEF,MAAM,kBAAkB;CAMxB,MAAM,aAAa,SAAS,MAAM;AAClC,KAAI,CAAC,WACH;CAEF,MAAM,aAAa,gBAAgB,mBAAmB,SAAS,IAC1D,gBAAgB,MAAM,mBAAmB,SAAS,IAClD,EAAE;AACP,MAAK,MAAM,aAAa,MAAM,KAAK,WAAW,EAAE;EAC9C,MAAM,SAAS;AACf,MAAI,CAAC,OACH;AAEF,MAAK,OAA2B,OAAO,WACrC,QAAO;AAET,MAAI,OAAO,OAAO,iBAAiB,cAAc,OAAO,aAAa,YAAY,KAAK,WACpF,QAAO;;;AAMb,SAAS,yBAAyB,UAAkB;CAClD,MAAM,WAA2D,EAAE;CAEnE,MAAM,eAAe,YAAqD;AACxE,WAAS,KAAK,QAAQ;;CAGxB,MAAM,QAA+B,mBAA4C,aAA0B;EACzG,MAAM,UAAU,OAAO,sBAAsB,YAAY,oBAAoB;EAC7E,MAAM,OAAO,OAAO,sBAAsB,aAAa,oBAAoB;EAC3E,MAAM,SAAS,kBAAkB,SAAS;EAC1C,MAAM,UAAU,QAAQ,aAAa,KAAK;AAC1C,MAAI,CAAC,SAAS;AACZ,YAAS,SAAS;AAClB,WAAQ;AACR;;AAEF,MAAI,CAAC,QACH,SAAQ,UAAU,GAAG,GAAG,sBAAsB,QAAQ,MAAM,EAAE,sBAAsB,QAAQ,OAAO,CAAC;AAEtG,OAAK,MAAM,WAAW,SACpB,SAAQ,QAAQ;AAElB,WAAS,SAAS;AAClB,UAAQ;;AAwFV,
|
|
1
|
+
{"version":3,"file":"canvasContext.mjs","names":[],"sources":["../../../src/runtime/polyfill/canvasContext.ts"],"sourcesContent":["import type { CanvasContext } from './types/platformRuntime'\n\nfunction normalizeCanvasNumber(value: unknown) {\n if (typeof value !== 'number' || Number.isNaN(value)) {\n return 0\n }\n return value\n}\n\nfunction resolveCanvasById(canvasId: string) {\n if (typeof document === 'undefined') {\n return undefined\n }\n const runtimeDocument = document as Document & {\n querySelectorAll?: (selector: string) => ArrayLike<Element>\n body?: {\n querySelectorAll?: (selector: string) => ArrayLike<Element>\n }\n }\n const normalized = canvasId.trim()\n if (!normalized) {\n return undefined\n }\n const canvasList = runtimeDocument.querySelectorAll?.('canvas')\n ?? runtimeDocument.body?.querySelectorAll?.('canvas')\n ?? []\n for (const candidate of Array.from(canvasList)) {\n const canvas = candidate as HTMLCanvasElement\n if (!canvas) {\n continue\n }\n if ((canvas as { id?: string }).id === normalized) {\n return canvas\n }\n if (typeof canvas.getAttribute === 'function' && canvas.getAttribute('canvas-id') === normalized) {\n return canvas\n }\n }\n return undefined\n}\n\nfunction createCanvasCommandQueue(canvasId: string) {\n const commands: Array<(ctx: CanvasRenderingContext2D) => void> = []\n\n const pushCommand = (command: (ctx: CanvasRenderingContext2D) => void) => {\n commands.push(command)\n }\n\n const draw: CanvasContext['draw'] = (reserveOrCallback?: boolean | (() => void), callback?: () => void) => {\n const reserve = typeof reserveOrCallback === 'boolean' ? reserveOrCallback : false\n const done = typeof reserveOrCallback === 'function' ? reserveOrCallback : callback\n const canvas = resolveCanvasById(canvasId)\n const context = canvas?.getContext?.('2d') as CanvasRenderingContext2D | null | undefined\n if (!context) {\n commands.length = 0\n done?.()\n return\n }\n if (!reserve) {\n context.clearRect(0, 0, normalizeCanvasNumber(canvas?.width), normalizeCanvasNumber(canvas?.height))\n }\n for (const command of commands) {\n command(context)\n }\n commands.length = 0\n done?.()\n }\n\n const api: CanvasContext = {\n setFillStyle(color: string) {\n pushCommand((ctx) => {\n ctx.fillStyle = color\n })\n },\n setStrokeStyle(color: string) {\n pushCommand((ctx) => {\n ctx.strokeStyle = color\n })\n },\n setLineWidth(width: number) {\n pushCommand((ctx) => {\n ctx.lineWidth = normalizeCanvasNumber(width)\n })\n },\n setFontSize(size: number) {\n pushCommand((ctx) => {\n const normalized = Math.max(1, normalizeCanvasNumber(size))\n ctx.font = `${normalized}px sans-serif`\n })\n },\n fillRect(x: number, y: number, width: number, height: number) {\n pushCommand((ctx) => {\n ctx.fillRect(\n normalizeCanvasNumber(x),\n normalizeCanvasNumber(y),\n normalizeCanvasNumber(width),\n normalizeCanvasNumber(height),\n )\n })\n },\n strokeRect(x: number, y: number, width: number, height: number) {\n pushCommand((ctx) => {\n ctx.strokeRect(\n normalizeCanvasNumber(x),\n normalizeCanvasNumber(y),\n normalizeCanvasNumber(width),\n normalizeCanvasNumber(height),\n )\n })\n },\n clearRect(x: number, y: number, width: number, height: number) {\n pushCommand((ctx) => {\n ctx.clearRect(\n normalizeCanvasNumber(x),\n normalizeCanvasNumber(y),\n normalizeCanvasNumber(width),\n normalizeCanvasNumber(height),\n )\n })\n },\n fillText(text: string, x: number, y: number, maxWidth?: number) {\n pushCommand((ctx) => {\n const normalizedText = String(text ?? '')\n const normalizedX = normalizeCanvasNumber(x)\n const normalizedY = normalizeCanvasNumber(y)\n if (typeof maxWidth === 'number' && Number.isFinite(maxWidth)) {\n ctx.fillText(normalizedText, normalizedX, normalizedY, normalizeCanvasNumber(maxWidth))\n return\n }\n ctx.fillText(normalizedText, normalizedX, normalizedY)\n })\n },\n beginPath() {\n pushCommand(ctx => ctx.beginPath())\n },\n closePath() {\n pushCommand(ctx => ctx.closePath())\n },\n moveTo(x: number, y: number) {\n pushCommand((ctx) => {\n ctx.moveTo(normalizeCanvasNumber(x), normalizeCanvasNumber(y))\n })\n },\n lineTo(x: number, y: number) {\n pushCommand((ctx) => {\n ctx.lineTo(normalizeCanvasNumber(x), normalizeCanvasNumber(y))\n })\n },\n stroke() {\n pushCommand(ctx => ctx.stroke())\n },\n draw,\n }\n return api\n}\n\nexport function createCanvasContextBridge(canvasId: string) {\n return createCanvasCommandQueue(String(canvasId ?? ''))\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deviceApi.mjs","names":[],"sources":["../../../src/runtime/polyfill/deviceApi.ts"],"sourcesContent":["import {\n callMiniProgramAsyncFailure,\n callMiniProgramAsyncSuccess,\n} from './async'\nimport {\n readBatteryInfoSnapshot,\n readBatteryInfoSyncSnapshot,\n vibrateDevice,\n} from './device'\n\nexport function vibrateShortBridge(options?: any) {\n try {\n vibrateDevice(options?.type)\n return Promise.resolve(callMiniProgramAsyncSuccess(options, { errMsg: 'vibrateShort:ok' }))\n }\n catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n const failure = callMiniProgramAsyncFailure(options, `vibrateShort:fail ${message}`)\n return Promise.reject(failure)\n }\n}\n\nexport function getBatteryInfoSyncBridge() {\n return readBatteryInfoSyncSnapshot()\n}\n\nexport async function getBatteryInfoBridge(options?: any) {\n try {\n const batteryInfo = await readBatteryInfoSnapshot()\n return callMiniProgramAsyncSuccess(options, {\n errMsg: 'getBatteryInfo:ok',\n ...batteryInfo,\n })\n }\n catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n const failure = callMiniProgramAsyncFailure(options, `getBatteryInfo:fail ${message}`)\n return Promise.reject(failure)\n }\n}\n"],"mappings":";;;;AAUA,SAAgB,mBAAmB,SAAe;AAChD,KAAI;AACF,gBAAc,SAAS,KAAK;AAC5B,SAAO,QAAQ,QAAQ,4BAA4B,SAAS,EAAE,QAAQ,mBAAmB,CAAC,CAAC;UAEtF,OAAO;EAEZ,MAAM,UAAU,4BAA4B,SAAS,qBADrC,iBAAiB,QAAQ,MAAM,UAAU,OAAO,MAAM,GACc;AACpF,SAAO,QAAQ,OAAO,QAAQ;;;AAIlC,SAAgB,2BAA2B;AACzC,QAAO,6BAA6B;;AAGtC,eAAsB,qBAAqB,SAAe;AACxD,KAAI;AAEF,SAAO,4BAA4B,SAAS;GAC1C,QAAQ;GACR,
|
|
1
|
+
{"version":3,"file":"deviceApi.mjs","names":[],"sources":["../../../src/runtime/polyfill/deviceApi.ts"],"sourcesContent":["import {\n callMiniProgramAsyncFailure,\n callMiniProgramAsyncSuccess,\n} from './async'\nimport {\n readBatteryInfoSnapshot,\n readBatteryInfoSyncSnapshot,\n vibrateDevice,\n} from './device'\n\nexport function vibrateShortBridge(options?: any) {\n try {\n vibrateDevice(options?.type)\n return Promise.resolve(callMiniProgramAsyncSuccess(options, { errMsg: 'vibrateShort:ok' }))\n }\n catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n const failure = callMiniProgramAsyncFailure(options, `vibrateShort:fail ${message}`)\n return Promise.reject(failure)\n }\n}\n\nexport function getBatteryInfoSyncBridge() {\n return readBatteryInfoSyncSnapshot()\n}\n\nexport async function getBatteryInfoBridge(options?: any) {\n try {\n const batteryInfo = await readBatteryInfoSnapshot()\n return callMiniProgramAsyncSuccess(options, {\n errMsg: 'getBatteryInfo:ok',\n ...batteryInfo,\n })\n }\n catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n const failure = callMiniProgramAsyncFailure(options, `getBatteryInfo:fail ${message}`)\n return Promise.reject(failure)\n }\n}\n"],"mappings":";;;;AAUA,SAAgB,mBAAmB,SAAe;AAChD,KAAI;AACF,gBAAc,SAAS,KAAK;AAC5B,SAAO,QAAQ,QAAQ,4BAA4B,SAAS,EAAE,QAAQ,mBAAmB,CAAC,CAAC;UAEtF,OAAO;EAEZ,MAAM,UAAU,4BAA4B,SAAS,qBADrC,iBAAiB,QAAQ,MAAM,UAAU,OAAO,MAAM,GACc;AACpF,SAAO,QAAQ,OAAO,QAAQ;;;AAIlC,SAAgB,2BAA2B;AACzC,QAAO,6BAA6B;;AAGtC,eAAsB,qBAAqB,SAAe;AACxD,KAAI;AAEF,SAAO,4BAA4B,SAAS;GAC1C,QAAQ;GACR,GAAG,MAHqB,yBAAyB;GAIlD,CAAC;UAEG,OAAO;EAEZ,MAAM,UAAU,4BAA4B,SAAS,uBADrC,iBAAiB,QAAQ,MAAM,UAAU,OAAO,MAAM,GACgB;AACtF,SAAO,QAAQ,OAAO,QAAQ"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"filePicker.mjs","names":[],"sources":["../../../src/runtime/polyfill/filePicker.ts"],"sourcesContent":["import { createTempFilePath } from './mediaPicker'\n\ntype ChooseMessageFileType = 'all' | 'video' | 'image' | 'file'\n\nexport function normalizeChooseMessageFileCount(count: number | undefined) {\n if (typeof count !== 'number' || Number.isNaN(count)) {\n return 1\n }\n return Math.max(1, Math.floor(count))\n}\n\nexport function normalizeChooseMessageFileType(type: unknown): ChooseMessageFileType {\n if (type === 'video' || type === 'image' || type === 'file' || type === 'all') {\n return type\n }\n return 'all'\n}\n\nfunction buildChooseMessageAccept(type: ChooseMessageFileType) {\n if (type === 'video') {\n return 'video/*'\n }\n if (type === 'image') {\n return 'image/*'\n }\n if (type === 'file') {\n return '*/*'\n }\n return '*/*'\n}\n\nexport function normalizeChooseMessageFile(file: {\n size?: number\n type?: string\n name?: string\n lastModified?: number\n}) {\n return {\n path: createTempFilePath(file),\n size: typeof file.size === 'number' ? file.size : 0,\n type: typeof file.type === 'string' ? file.type : '',\n name: typeof file.name === 'string' ? file.name : '',\n time: typeof file.lastModified === 'number' ? file.lastModified : Date.now(),\n }\n}\n\nasync function pickMessageFilesByOpenPicker(count: number, type: ChooseMessageFileType) {\n const picker = (globalThis as {\n showOpenFilePicker?: (options: {\n multiple?: boolean\n types?: Array<{\n description?: string\n accept?: Record<string, string[]>\n }>\n }) => Promise<Array<{ getFile?: () => Promise<any> }>>\n }).showOpenFilePicker\n if (typeof picker !== 'function') {\n return null\n }\n const accept = buildChooseMessageAccept(type)\n const handles = await picker({\n multiple: count > 1,\n types: [{\n description: 'Message Files',\n accept: {\n [accept]: [],\n },\n }],\n })\n const files: any[] = []\n for (const handle of handles ?? []) {\n const file = await handle?.getFile?.()\n if (file) {\n files.push(file)\n }\n if (files.length >= count) {\n break\n }\n }\n return files\n}\n\nasync function pickMessageFilesByInput(count: number, type: ChooseMessageFileType) {\n if (typeof document === 'undefined' || typeof document.createElement !== 'function') {\n return null\n }\n const input = document.createElement('input') as HTMLInputElement\n input.setAttribute('type', 'file')\n input.setAttribute('accept', buildChooseMessageAccept(type))\n if (count > 1) {\n input.setAttribute('multiple', 'true')\n }\n input.setAttribute('style', 'position: fixed; left: -9999px; top: -9999px; opacity: 0;')\n if (document.body) {\n document.body.append(input)\n }\n try {\n const files = await new Promise<any[]>((resolve, reject) => {\n const onChange = () => {\n const selected = input.files ? Array.from(input.files) : []\n if (selected.length) {\n resolve(selected.slice(0, count))\n return\n }\n reject(new Error('no file selected'))\n }\n input.addEventListener('change', onChange, { once: true })\n if (typeof input.click === 'function') {\n input.click()\n return\n }\n reject(new Error('file input click is unavailable'))\n })\n return files\n }\n finally {\n if (input.parentNode) {\n input.parentNode.removeChild(input)\n }\n }\n}\n\nexport async function pickChooseMessageFiles(count: number, type: ChooseMessageFileType) {\n const viaPicker = await pickMessageFilesByOpenPicker(count, type)\n if (Array.isArray(viaPicker)) {\n return viaPicker\n }\n const viaInput = await pickMessageFilesByInput(count, type)\n if (Array.isArray(viaInput)) {\n return viaInput\n }\n throw new TypeError('Message file picker is unavailable in current environment.')\n}\n\nexport function normalizeChooseFileExtensions(extension: readonly string[] | undefined) {\n const set = new Set<string>()\n for (const item of extension ?? []) {\n if (typeof item !== 'string') {\n continue\n }\n const normalized = item.trim().toLowerCase()\n if (!normalized) {\n continue\n }\n set.add(normalized.startsWith('.') ? normalized : `.${normalized}`)\n }\n return Array.from(set)\n}\n\nfunction buildChooseFilePickerAccept(type: ChooseMessageFileType, extensions: string[]) {\n if (extensions.length) {\n return {\n '*/*': extensions,\n }\n }\n return {\n [buildChooseMessageAccept(type)]: [],\n }\n}\n\nfunction buildChooseFileInputAccept(type: ChooseMessageFileType, extensions: string[]) {\n if (extensions.length) {\n return extensions.join(',')\n }\n return buildChooseMessageAccept(type)\n}\n\nasync function pickChooseFileByOpenPicker(\n count: number,\n type: ChooseMessageFileType,\n extensions: string[],\n) {\n const picker = (globalThis as {\n showOpenFilePicker?: (options: {\n multiple?: boolean\n types?: Array<{\n description?: string\n accept?: Record<string, string[]>\n }>\n }) => Promise<Array<{ getFile?: () => Promise<any> }>>\n }).showOpenFilePicker\n if (typeof picker !== 'function') {\n return null\n }\n const handles = await picker({\n multiple: count > 1,\n types: [{\n description: 'Files',\n accept: buildChooseFilePickerAccept(type, extensions),\n }],\n })\n const files: any[] = []\n for (const handle of handles ?? []) {\n const file = await handle?.getFile?.()\n if (file) {\n files.push(file)\n }\n if (files.length >= count) {\n break\n }\n }\n return files\n}\n\nasync function pickChooseFileByInput(\n count: number,\n type: ChooseMessageFileType,\n extensions: string[],\n) {\n if (typeof document === 'undefined' || typeof document.createElement !== 'function') {\n return null\n }\n const input = document.createElement('input') as HTMLInputElement\n if (!input || typeof input !== 'object') {\n return null\n }\n input.setAttribute('type', 'file')\n input.setAttribute('accept', buildChooseFileInputAccept(type, extensions))\n if (count > 1) {\n input.setAttribute('multiple', 'true')\n }\n input.setAttribute('style', 'position: fixed; left: -9999px; top: -9999px; opacity: 0;')\n if (document.body) {\n document.body.append(input)\n }\n try {\n const files = await new Promise<any[]>((resolve, reject) => {\n const onChange = () => {\n const selected = input.files ? Array.from(input.files) : []\n if (selected.length) {\n resolve(selected.slice(0, count))\n return\n }\n reject(new Error('no file selected'))\n }\n input.addEventListener('change', onChange, { once: true })\n if (typeof input.click === 'function') {\n input.click()\n return\n }\n reject(new Error('file input click is unavailable'))\n })\n return files\n }\n finally {\n if (input.parentNode) {\n input.parentNode.removeChild(input)\n }\n }\n}\n\nexport async function pickChooseFileFiles(\n count: number,\n type: ChooseMessageFileType,\n extensions: string[],\n) {\n const viaPicker = await pickChooseFileByOpenPicker(count, type, extensions)\n if (Array.isArray(viaPicker)) {\n return viaPicker\n }\n const viaInput = await pickChooseFileByInput(count, type, extensions)\n if (Array.isArray(viaInput)) {\n return viaInput\n }\n throw new TypeError('File picker is unavailable in current environment.')\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"filePicker.mjs","names":[],"sources":["../../../src/runtime/polyfill/filePicker.ts"],"sourcesContent":["import { createTempFilePath } from './mediaPicker'\n\ntype ChooseMessageFileType = 'all' | 'video' | 'image' | 'file'\n\nexport function normalizeChooseMessageFileCount(count: number | undefined) {\n if (typeof count !== 'number' || Number.isNaN(count)) {\n return 1\n }\n return Math.max(1, Math.floor(count))\n}\n\nexport function normalizeChooseMessageFileType(type: unknown): ChooseMessageFileType {\n if (type === 'video' || type === 'image' || type === 'file' || type === 'all') {\n return type\n }\n return 'all'\n}\n\nfunction buildChooseMessageAccept(type: ChooseMessageFileType) {\n if (type === 'video') {\n return 'video/*'\n }\n if (type === 'image') {\n return 'image/*'\n }\n if (type === 'file') {\n return '*/*'\n }\n return '*/*'\n}\n\nexport function normalizeChooseMessageFile(file: {\n size?: number\n type?: string\n name?: string\n lastModified?: number\n}) {\n return {\n path: createTempFilePath(file),\n size: typeof file.size === 'number' ? file.size : 0,\n type: typeof file.type === 'string' ? file.type : '',\n name: typeof file.name === 'string' ? file.name : '',\n time: typeof file.lastModified === 'number' ? file.lastModified : Date.now(),\n }\n}\n\nasync function pickMessageFilesByOpenPicker(count: number, type: ChooseMessageFileType) {\n const picker = (globalThis as {\n showOpenFilePicker?: (options: {\n multiple?: boolean\n types?: Array<{\n description?: string\n accept?: Record<string, string[]>\n }>\n }) => Promise<Array<{ getFile?: () => Promise<any> }>>\n }).showOpenFilePicker\n if (typeof picker !== 'function') {\n return null\n }\n const accept = buildChooseMessageAccept(type)\n const handles = await picker({\n multiple: count > 1,\n types: [{\n description: 'Message Files',\n accept: {\n [accept]: [],\n },\n }],\n })\n const files: any[] = []\n for (const handle of handles ?? []) {\n const file = await handle?.getFile?.()\n if (file) {\n files.push(file)\n }\n if (files.length >= count) {\n break\n }\n }\n return files\n}\n\nasync function pickMessageFilesByInput(count: number, type: ChooseMessageFileType) {\n if (typeof document === 'undefined' || typeof document.createElement !== 'function') {\n return null\n }\n const input = document.createElement('input') as HTMLInputElement\n input.setAttribute('type', 'file')\n input.setAttribute('accept', buildChooseMessageAccept(type))\n if (count > 1) {\n input.setAttribute('multiple', 'true')\n }\n input.setAttribute('style', 'position: fixed; left: -9999px; top: -9999px; opacity: 0;')\n if (document.body) {\n document.body.append(input)\n }\n try {\n const files = await new Promise<any[]>((resolve, reject) => {\n const onChange = () => {\n const selected = input.files ? Array.from(input.files) : []\n if (selected.length) {\n resolve(selected.slice(0, count))\n return\n }\n reject(new Error('no file selected'))\n }\n input.addEventListener('change', onChange, { once: true })\n if (typeof input.click === 'function') {\n input.click()\n return\n }\n reject(new Error('file input click is unavailable'))\n })\n return files\n }\n finally {\n if (input.parentNode) {\n input.parentNode.removeChild(input)\n }\n }\n}\n\nexport async function pickChooseMessageFiles(count: number, type: ChooseMessageFileType) {\n const viaPicker = await pickMessageFilesByOpenPicker(count, type)\n if (Array.isArray(viaPicker)) {\n return viaPicker\n }\n const viaInput = await pickMessageFilesByInput(count, type)\n if (Array.isArray(viaInput)) {\n return viaInput\n }\n throw new TypeError('Message file picker is unavailable in current environment.')\n}\n\nexport function normalizeChooseFileExtensions(extension: readonly string[] | undefined) {\n const set = new Set<string>()\n for (const item of extension ?? []) {\n if (typeof item !== 'string') {\n continue\n }\n const normalized = item.trim().toLowerCase()\n if (!normalized) {\n continue\n }\n set.add(normalized.startsWith('.') ? normalized : `.${normalized}`)\n }\n return Array.from(set)\n}\n\nfunction buildChooseFilePickerAccept(type: ChooseMessageFileType, extensions: string[]) {\n if (extensions.length) {\n return {\n '*/*': extensions,\n }\n }\n return {\n [buildChooseMessageAccept(type)]: [],\n }\n}\n\nfunction buildChooseFileInputAccept(type: ChooseMessageFileType, extensions: string[]) {\n if (extensions.length) {\n return extensions.join(',')\n }\n return buildChooseMessageAccept(type)\n}\n\nasync function pickChooseFileByOpenPicker(\n count: number,\n type: ChooseMessageFileType,\n extensions: string[],\n) {\n const picker = (globalThis as {\n showOpenFilePicker?: (options: {\n multiple?: boolean\n types?: Array<{\n description?: string\n accept?: Record<string, string[]>\n }>\n }) => Promise<Array<{ getFile?: () => Promise<any> }>>\n }).showOpenFilePicker\n if (typeof picker !== 'function') {\n return null\n }\n const handles = await picker({\n multiple: count > 1,\n types: [{\n description: 'Files',\n accept: buildChooseFilePickerAccept(type, extensions),\n }],\n })\n const files: any[] = []\n for (const handle of handles ?? []) {\n const file = await handle?.getFile?.()\n if (file) {\n files.push(file)\n }\n if (files.length >= count) {\n break\n }\n }\n return files\n}\n\nasync function pickChooseFileByInput(\n count: number,\n type: ChooseMessageFileType,\n extensions: string[],\n) {\n if (typeof document === 'undefined' || typeof document.createElement !== 'function') {\n return null\n }\n const input = document.createElement('input') as HTMLInputElement\n if (!input || typeof input !== 'object') {\n return null\n }\n input.setAttribute('type', 'file')\n input.setAttribute('accept', buildChooseFileInputAccept(type, extensions))\n if (count > 1) {\n input.setAttribute('multiple', 'true')\n }\n input.setAttribute('style', 'position: fixed; left: -9999px; top: -9999px; opacity: 0;')\n if (document.body) {\n document.body.append(input)\n }\n try {\n const files = await new Promise<any[]>((resolve, reject) => {\n const onChange = () => {\n const selected = input.files ? Array.from(input.files) : []\n if (selected.length) {\n resolve(selected.slice(0, count))\n return\n }\n reject(new Error('no file selected'))\n }\n input.addEventListener('change', onChange, { once: true })\n if (typeof input.click === 'function') {\n input.click()\n return\n }\n reject(new Error('file input click is unavailable'))\n })\n return files\n }\n finally {\n if (input.parentNode) {\n input.parentNode.removeChild(input)\n }\n }\n}\n\nexport async function pickChooseFileFiles(\n count: number,\n type: ChooseMessageFileType,\n extensions: string[],\n) {\n const viaPicker = await pickChooseFileByOpenPicker(count, type, extensions)\n if (Array.isArray(viaPicker)) {\n return viaPicker\n }\n const viaInput = await pickChooseFileByInput(count, type, extensions)\n if (Array.isArray(viaInput)) {\n return viaInput\n }\n throw new TypeError('File picker is unavailable in current environment.')\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fileSystemManager.mjs","names":[],"sources":["../../../src/runtime/polyfill/fileSystemManager.ts"],"sourcesContent":["import {\n normalizeFilePath,\n readFileSyncInternal,\n writeFileSyncInternal,\n} from './files'\n\ntype AsyncSuccess = (options: unknown, result: { errMsg: string, [key: string]: unknown }) => unknown\ntype AsyncFailure = (options: unknown, errMsg: string) => unknown\n\ninterface FileWriteOptionsLike {\n filePath?: string\n data?: unknown\n}\n\ninterface FileReadOptionsLike {\n filePath?: string\n encoding?: string\n}\n\nexport function createFileSystemManagerBridge(\n callMiniProgramAsyncSuccess: AsyncSuccess,\n callMiniProgramAsyncFailure: AsyncFailure,\n) {\n return {\n writeFile(options?: FileWriteOptionsLike) {\n const filePath = normalizeFilePath(options?.filePath)\n if (!filePath) {\n callMiniProgramAsyncFailure(options, 'writeFile:fail invalid filePath')\n return\n }\n try {\n writeFileSyncInternal(filePath, (options?.data ?? '') as string | ArrayBuffer | ArrayBufferView)\n callMiniProgramAsyncSuccess(options, { errMsg: 'writeFile:ok' })\n }\n catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n callMiniProgramAsyncFailure(options, `writeFile:fail ${message}`)\n }\n },\n readFile(options?: FileReadOptionsLike) {\n const filePath = normalizeFilePath(options?.filePath)\n if (!filePath) {\n callMiniProgramAsyncFailure(options, 'readFile:fail invalid filePath')\n return\n }\n try {\n const data = readFileSyncInternal(filePath, options?.encoding)\n callMiniProgramAsyncSuccess(options, { errMsg: 'readFile:ok', data })\n }\n catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n callMiniProgramAsyncFailure(options, `readFile:fail ${message}`)\n }\n },\n writeFileSync(filePath: string, data: string | ArrayBuffer | ArrayBufferView, _encoding?: string) {\n writeFileSyncInternal(filePath, data)\n },\n readFileSync(filePath: string, encoding?: string) {\n return readFileSyncInternal(filePath, encoding)\n },\n }\n}\n"],"mappings":";;;AAmBA,SAAgB,8BACd,6BACA,6BACA;AACA,QAAO;EACL,UAAU,SAAgC;GACxC,MAAM,WAAW,kBAAkB,SAAS,SAAS;AACrD,OAAI,CAAC,UAAU;AACb,gCAA4B,SAAS,kCAAkC;AACvE;;AAEF,OAAI;AACF,0BAAsB,UAAW,SAAS,QAAQ,GAA8C;AAChG,gCAA4B,SAAS,EAAE,QAAQ,gBAAgB,CAAC;YAE3D,OAAO;AAEZ,gCAA4B,SAAS,kBADrB,iBAAiB,QAAQ,MAAM,UAAU,OAAO,MAAM,GACL;;;EAGrE,SAAS,SAA+B;GACtC,MAAM,WAAW,kBAAkB,SAAS,SAAS;AACrD,OAAI,CAAC,UAAU;AACb,gCAA4B,SAAS,iCAAiC;AACtE;;AAEF,OAAI;AAEF,gCAA4B,SAAS;KAAE,QAAQ;KAAe,MADjD,qBAAqB,UAAU,SAAS,
|
|
1
|
+
{"version":3,"file":"fileSystemManager.mjs","names":[],"sources":["../../../src/runtime/polyfill/fileSystemManager.ts"],"sourcesContent":["import {\n normalizeFilePath,\n readFileSyncInternal,\n writeFileSyncInternal,\n} from './files'\n\ntype AsyncSuccess = (options: unknown, result: { errMsg: string, [key: string]: unknown }) => unknown\ntype AsyncFailure = (options: unknown, errMsg: string) => unknown\n\ninterface FileWriteOptionsLike {\n filePath?: string\n data?: unknown\n}\n\ninterface FileReadOptionsLike {\n filePath?: string\n encoding?: string\n}\n\nexport function createFileSystemManagerBridge(\n callMiniProgramAsyncSuccess: AsyncSuccess,\n callMiniProgramAsyncFailure: AsyncFailure,\n) {\n return {\n writeFile(options?: FileWriteOptionsLike) {\n const filePath = normalizeFilePath(options?.filePath)\n if (!filePath) {\n callMiniProgramAsyncFailure(options, 'writeFile:fail invalid filePath')\n return\n }\n try {\n writeFileSyncInternal(filePath, (options?.data ?? '') as string | ArrayBuffer | ArrayBufferView)\n callMiniProgramAsyncSuccess(options, { errMsg: 'writeFile:ok' })\n }\n catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n callMiniProgramAsyncFailure(options, `writeFile:fail ${message}`)\n }\n },\n readFile(options?: FileReadOptionsLike) {\n const filePath = normalizeFilePath(options?.filePath)\n if (!filePath) {\n callMiniProgramAsyncFailure(options, 'readFile:fail invalid filePath')\n return\n }\n try {\n const data = readFileSyncInternal(filePath, options?.encoding)\n callMiniProgramAsyncSuccess(options, { errMsg: 'readFile:ok', data })\n }\n catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n callMiniProgramAsyncFailure(options, `readFile:fail ${message}`)\n }\n },\n writeFileSync(filePath: string, data: string | ArrayBuffer | ArrayBufferView, _encoding?: string) {\n writeFileSyncInternal(filePath, data)\n },\n readFileSync(filePath: string, encoding?: string) {\n return readFileSyncInternal(filePath, encoding)\n },\n }\n}\n"],"mappings":";;;AAmBA,SAAgB,8BACd,6BACA,6BACA;AACA,QAAO;EACL,UAAU,SAAgC;GACxC,MAAM,WAAW,kBAAkB,SAAS,SAAS;AACrD,OAAI,CAAC,UAAU;AACb,gCAA4B,SAAS,kCAAkC;AACvE;;AAEF,OAAI;AACF,0BAAsB,UAAW,SAAS,QAAQ,GAA8C;AAChG,gCAA4B,SAAS,EAAE,QAAQ,gBAAgB,CAAC;YAE3D,OAAO;AAEZ,gCAA4B,SAAS,kBADrB,iBAAiB,QAAQ,MAAM,UAAU,OAAO,MAAM,GACL;;;EAGrE,SAAS,SAA+B;GACtC,MAAM,WAAW,kBAAkB,SAAS,SAAS;AACrD,OAAI,CAAC,UAAU;AACb,gCAA4B,SAAS,iCAAiC;AACtE;;AAEF,OAAI;AAEF,gCAA4B,SAAS;KAAE,QAAQ;KAAe,MADjD,qBAAqB,UAAU,SAAS,SACa;KAAE,CAAC;YAEhE,OAAO;AAEZ,gCAA4B,SAAS,iBADrB,iBAAiB,QAAQ,MAAM,UAAU,OAAO,MAAM,GACN;;;EAGpE,cAAc,UAAkB,MAA8C,WAAoB;AAChG,yBAAsB,UAAU,KAAK;;EAEvC,aAAa,UAAkB,UAAmB;AAChD,UAAO,qBAAqB,UAAU,SAAS;;EAElD"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"files.mjs","names":[],"sources":["../../../src/runtime/polyfill/files.ts"],"sourcesContent":["export const WEB_USER_DATA_PATH = '/__weapp_vite_web_user_data__'\n\ninterface MemoryFileRecord {\n kind: 'text' | 'binary'\n text?: string\n bytes?: ArrayBuffer\n}\n\nconst memoryFileStorage = new Map<string, MemoryFileRecord>()\n\nexport function normalizeFilePath(filePath: unknown) {\n if (typeof filePath !== 'string') {\n return ''\n }\n return filePath.trim()\n}\n\nfunction normalizeFileEncoding(encoding?: string) {\n if (typeof encoding !== 'string') {\n return ''\n }\n return encoding.trim().toLowerCase()\n}\n\nfunction cloneArrayBuffer(buffer: ArrayBuffer) {\n return buffer.slice(0)\n}\n\nfunction toArrayBuffer(data: ArrayBuffer | ArrayBufferView) {\n if (data instanceof ArrayBuffer) {\n return cloneArrayBuffer(data)\n }\n const view = data as ArrayBufferView\n return new Uint8Array(view.buffer, view.byteOffset, view.byteLength).slice().buffer\n}\n\nfunction decodeArrayBufferToText(buffer: ArrayBuffer, encoding?: string) {\n if (typeof TextDecoder === 'function') {\n try {\n return new TextDecoder(encoding || 'utf-8').decode(new Uint8Array(buffer))\n }\n catch {\n return new TextDecoder().decode(new Uint8Array(buffer))\n }\n }\n return Array.from(new Uint8Array(buffer))\n .map(byte => String.fromCharCode(byte))\n .join('')\n}\n\nexport function writeFileSyncInternal(\n filePath: string,\n data: string | ArrayBuffer | ArrayBufferView,\n) {\n const normalizedPath = normalizeFilePath(filePath)\n if (!normalizedPath) {\n throw new TypeError('writeFileSync:fail invalid filePath')\n }\n if (typeof data === 'string') {\n memoryFileStorage.set(normalizedPath, {\n kind: 'text',\n text: data,\n })\n return\n }\n memoryFileStorage.set(normalizedPath, {\n kind: 'binary',\n bytes: toArrayBuffer(data),\n })\n}\n\nexport function readFileSyncInternal(filePath: string, encoding?: string) {\n const normalizedPath = normalizeFilePath(filePath)\n if (!normalizedPath) {\n throw new TypeError('readFileSync:fail invalid filePath')\n }\n const record = memoryFileStorage.get(normalizedPath)\n if (!record) {\n throw new TypeError(`readFileSync:fail no such file ${normalizedPath}`)\n }\n const normalizedEncoding = normalizeFileEncoding(encoding)\n if (record.kind === 'text') {\n return record.text ?? ''\n }\n const bytes = record.bytes ? cloneArrayBuffer(record.bytes) : new ArrayBuffer(0)\n if (normalizedEncoding) {\n return decodeArrayBufferToText(bytes, normalizedEncoding)\n }\n return bytes\n}\n\nexport function resolveUploadFileName(filePath: string) {\n const normalized = filePath.split(/[?#]/)[0] ?? ''\n const segments = normalized.split('/')\n return segments[segments.length - 1] || 'file'\n}\n\nexport async function resolveUploadFileBlob(\n filePath: string,\n runtimeFetch: typeof fetch | undefined,\n) {\n const record = memoryFileStorage.get(filePath)\n if (record) {\n if (record.kind === 'text') {\n return new Blob([record.text ?? ''], { type: 'text/plain;charset=utf-8' })\n }\n return new Blob([record.bytes ?? new ArrayBuffer(0)])\n }\n if (/^(?:https?:|blob:|data:)/i.test(filePath) && runtimeFetch) {\n try {\n const response = await runtimeFetch(filePath, { method: 'GET' })\n return await response.blob()\n }\n catch {\n // fallback to plain text payload\n }\n }\n return new Blob([filePath], { type: 'text/plain;charset=utf-8' })\n}\n\nfunction cloneMemoryFileRecord(record: MemoryFileRecord): MemoryFileRecord {\n if (record.kind === 'text') {\n return {\n kind: 'text',\n text: record.text ?? '',\n }\n }\n return {\n kind: 'binary',\n bytes: record.bytes ? cloneArrayBuffer(record.bytes) : new ArrayBuffer(0),\n }\n}\n\nexport function resolveSaveFilePath(tempFilePath: string, customPath?: string) {\n const targetPath = typeof customPath === 'string' ? customPath.trim() : ''\n if (targetPath) {\n return targetPath\n }\n return `${WEB_USER_DATA_PATH}/${resolveUploadFileName(tempFilePath)}`\n}\n\nexport function saveMemoryFile(tempFilePath: string, savedFilePath: string) {\n const sourceRecord = memoryFileStorage.get(tempFilePath)\n if (sourceRecord) {\n memoryFileStorage.set(savedFilePath, cloneMemoryFileRecord(sourceRecord))\n return\n }\n memoryFileStorage.set(savedFilePath, {\n kind: 'text',\n text: tempFilePath,\n })\n}\n\nexport function resolveOpenDocumentUrl(filePath: string) {\n const record = memoryFileStorage.get(filePath)\n const runtimeUrl = (globalThis as {\n URL?: {\n createObjectURL?: (value: unknown) => string\n }\n }).URL\n\n if (record) {\n if (record.kind === 'text') {\n const text = record.text ?? ''\n if (typeof Blob === 'function' && runtimeUrl?.createObjectURL) {\n return runtimeUrl.createObjectURL(new Blob([text], { type: 'text/plain;charset=utf-8' }))\n }\n return `data:text/plain;charset=utf-8,${encodeURIComponent(text)}`\n }\n const bytes = record.bytes ?? new ArrayBuffer(0)\n if (typeof Blob === 'function' && runtimeUrl?.createObjectURL) {\n return runtimeUrl.createObjectURL(new Blob([bytes]))\n }\n return ''\n }\n\n if (/^(?:https?:|blob:|data:)/i.test(filePath)) {\n return filePath\n }\n try {\n const runtimeLocation = (typeof location !== 'undefined' ? location : undefined) as { href?: string } | undefined\n if (runtimeLocation?.href) {\n return new URL(filePath, runtimeLocation.href).toString()\n }\n }\n catch {\n // fallback to raw filePath\n }\n return filePath\n}\n"],"mappings":";AAAA,MAAa,qBAAqB;AAQlC,MAAM,oCAAoB,IAAI,KAA+B;AAE7D,SAAgB,kBAAkB,UAAmB;AACnD,KAAI,OAAO,aAAa,SACtB,QAAO;AAET,QAAO,SAAS,MAAM;;AAGxB,SAAS,sBAAsB,UAAmB;AAChD,KAAI,OAAO,aAAa,SACtB,QAAO;AAET,QAAO,SAAS,MAAM,CAAC,aAAa;;AAGtC,SAAS,iBAAiB,QAAqB;AAC7C,QAAO,OAAO,MAAM,EAAE;;AAGxB,SAAS,cAAc,MAAqC;AAC1D,KAAI,gBAAgB,YAClB,QAAO,iBAAiB,KAAK;CAE/B,MAAM,OAAO;AACb,QAAO,IAAI,WAAW,KAAK,QAAQ,KAAK,YAAY,KAAK,WAAW,CAAC,OAAO,CAAC;;AAG/E,SAAS,wBAAwB,QAAqB,UAAmB;AACvE,KAAI,OAAO,gBAAgB,WACzB,KAAI;AACF,SAAO,IAAI,YAAY,YAAY,QAAQ,CAAC,OAAO,IAAI,WAAW,OAAO,CAAC;SAEtE;AACJ,SAAO,IAAI,aAAa,CAAC,OAAO,IAAI,WAAW,OAAO,CAAC;;AAG3D,QAAO,MAAM,KAAK,IAAI,WAAW,OAAO,CAAC,CACtC,KAAI,SAAQ,OAAO,aAAa,KAAK,CAAC,CACtC,KAAK,GAAG;;AAGb,SAAgB,sBACd,UACA,MACA;CACA,MAAM,iBAAiB,kBAAkB,SAAS;AAClD,KAAI,CAAC,eACH,OAAM,IAAI,UAAU,sCAAsC;AAE5D,KAAI,OAAO,SAAS,UAAU;AAC5B,oBAAkB,IAAI,gBAAgB;GACpC,MAAM;GACN,MAAM;GACP,CAAC;AACF;;AAEF,mBAAkB,IAAI,gBAAgB;EACpC,MAAM;EACN,OAAO,cAAc,KAAK;EAC3B,CAAC;;AAGJ,SAAgB,qBAAqB,UAAkB,UAAmB;CACxE,MAAM,iBAAiB,kBAAkB,SAAS;AAClD,KAAI,CAAC,eACH,OAAM,IAAI,UAAU,qCAAqC;CAE3D,MAAM,SAAS,kBAAkB,IAAI,eAAe;AACpD,KAAI,CAAC,OACH,OAAM,IAAI,UAAU,kCAAkC,iBAAiB;CAEzE,MAAM,qBAAqB,sBAAsB,SAAS;AAC1D,KAAI,OAAO,SAAS,OAClB,QAAO,OAAO,QAAQ;CAExB,MAAM,QAAQ,OAAO,QAAQ,iBAAiB,OAAO,MAAM,mBAAG,IAAI,YAAY,EAAE;AAChF,KAAI,mBACF,QAAO,wBAAwB,OAAO,mBAAmB;AAE3D,QAAO;;AAGT,SAAgB,sBAAsB,UAAkB;CAEtD,MAAM,YADa,SAAS,MAAM,OAAO,CAAC,MAAM,IACpB,MAAM,IAAI;AACtC,QAAO,SAAS,SAAS,SAAS,MAAM;;AAG1C,eAAsB,sBACpB,UACA,cACA;CACA,MAAM,SAAS,kBAAkB,IAAI,SAAS;AAC9C,KAAI,QAAQ;AACV,MAAI,OAAO,SAAS,OAClB,QAAO,IAAI,KAAK,CAAC,OAAO,QAAQ,GAAG,EAAE,EAAE,MAAM,4BAA4B,CAAC;AAE5E,SAAO,IAAI,KAAK,CAAC,OAAO,yBAAS,IAAI,YAAY,EAAE,CAAC,CAAC;;AAEvD,KAAI,4BAA4B,KAAK,SAAS,IAAI,aAChD,KAAI;AAEF,SAAO,
|
|
1
|
+
{"version":3,"file":"files.mjs","names":[],"sources":["../../../src/runtime/polyfill/files.ts"],"sourcesContent":["export const WEB_USER_DATA_PATH = '/__weapp_vite_web_user_data__'\n\ninterface MemoryFileRecord {\n kind: 'text' | 'binary'\n text?: string\n bytes?: ArrayBuffer\n}\n\nconst memoryFileStorage = new Map<string, MemoryFileRecord>()\n\nexport function normalizeFilePath(filePath: unknown) {\n if (typeof filePath !== 'string') {\n return ''\n }\n return filePath.trim()\n}\n\nfunction normalizeFileEncoding(encoding?: string) {\n if (typeof encoding !== 'string') {\n return ''\n }\n return encoding.trim().toLowerCase()\n}\n\nfunction cloneArrayBuffer(buffer: ArrayBuffer) {\n return buffer.slice(0)\n}\n\nfunction toArrayBuffer(data: ArrayBuffer | ArrayBufferView) {\n if (data instanceof ArrayBuffer) {\n return cloneArrayBuffer(data)\n }\n const view = data as ArrayBufferView\n return new Uint8Array(view.buffer, view.byteOffset, view.byteLength).slice().buffer\n}\n\nfunction decodeArrayBufferToText(buffer: ArrayBuffer, encoding?: string) {\n if (typeof TextDecoder === 'function') {\n try {\n return new TextDecoder(encoding || 'utf-8').decode(new Uint8Array(buffer))\n }\n catch {\n return new TextDecoder().decode(new Uint8Array(buffer))\n }\n }\n return Array.from(new Uint8Array(buffer))\n .map(byte => String.fromCharCode(byte))\n .join('')\n}\n\nexport function writeFileSyncInternal(\n filePath: string,\n data: string | ArrayBuffer | ArrayBufferView,\n) {\n const normalizedPath = normalizeFilePath(filePath)\n if (!normalizedPath) {\n throw new TypeError('writeFileSync:fail invalid filePath')\n }\n if (typeof data === 'string') {\n memoryFileStorage.set(normalizedPath, {\n kind: 'text',\n text: data,\n })\n return\n }\n memoryFileStorage.set(normalizedPath, {\n kind: 'binary',\n bytes: toArrayBuffer(data),\n })\n}\n\nexport function readFileSyncInternal(filePath: string, encoding?: string) {\n const normalizedPath = normalizeFilePath(filePath)\n if (!normalizedPath) {\n throw new TypeError('readFileSync:fail invalid filePath')\n }\n const record = memoryFileStorage.get(normalizedPath)\n if (!record) {\n throw new TypeError(`readFileSync:fail no such file ${normalizedPath}`)\n }\n const normalizedEncoding = normalizeFileEncoding(encoding)\n if (record.kind === 'text') {\n return record.text ?? ''\n }\n const bytes = record.bytes ? cloneArrayBuffer(record.bytes) : new ArrayBuffer(0)\n if (normalizedEncoding) {\n return decodeArrayBufferToText(bytes, normalizedEncoding)\n }\n return bytes\n}\n\nexport function resolveUploadFileName(filePath: string) {\n const normalized = filePath.split(/[?#]/)[0] ?? ''\n const segments = normalized.split('/')\n return segments[segments.length - 1] || 'file'\n}\n\nexport async function resolveUploadFileBlob(\n filePath: string,\n runtimeFetch: typeof fetch | undefined,\n) {\n const record = memoryFileStorage.get(filePath)\n if (record) {\n if (record.kind === 'text') {\n return new Blob([record.text ?? ''], { type: 'text/plain;charset=utf-8' })\n }\n return new Blob([record.bytes ?? new ArrayBuffer(0)])\n }\n if (/^(?:https?:|blob:|data:)/i.test(filePath) && runtimeFetch) {\n try {\n const response = await runtimeFetch(filePath, { method: 'GET' })\n return await response.blob()\n }\n catch {\n // fallback to plain text payload\n }\n }\n return new Blob([filePath], { type: 'text/plain;charset=utf-8' })\n}\n\nfunction cloneMemoryFileRecord(record: MemoryFileRecord): MemoryFileRecord {\n if (record.kind === 'text') {\n return {\n kind: 'text',\n text: record.text ?? '',\n }\n }\n return {\n kind: 'binary',\n bytes: record.bytes ? cloneArrayBuffer(record.bytes) : new ArrayBuffer(0),\n }\n}\n\nexport function resolveSaveFilePath(tempFilePath: string, customPath?: string) {\n const targetPath = typeof customPath === 'string' ? customPath.trim() : ''\n if (targetPath) {\n return targetPath\n }\n return `${WEB_USER_DATA_PATH}/${resolveUploadFileName(tempFilePath)}`\n}\n\nexport function saveMemoryFile(tempFilePath: string, savedFilePath: string) {\n const sourceRecord = memoryFileStorage.get(tempFilePath)\n if (sourceRecord) {\n memoryFileStorage.set(savedFilePath, cloneMemoryFileRecord(sourceRecord))\n return\n }\n memoryFileStorage.set(savedFilePath, {\n kind: 'text',\n text: tempFilePath,\n })\n}\n\nexport function resolveOpenDocumentUrl(filePath: string) {\n const record = memoryFileStorage.get(filePath)\n const runtimeUrl = (globalThis as {\n URL?: {\n createObjectURL?: (value: unknown) => string\n }\n }).URL\n\n if (record) {\n if (record.kind === 'text') {\n const text = record.text ?? ''\n if (typeof Blob === 'function' && runtimeUrl?.createObjectURL) {\n return runtimeUrl.createObjectURL(new Blob([text], { type: 'text/plain;charset=utf-8' }))\n }\n return `data:text/plain;charset=utf-8,${encodeURIComponent(text)}`\n }\n const bytes = record.bytes ?? new ArrayBuffer(0)\n if (typeof Blob === 'function' && runtimeUrl?.createObjectURL) {\n return runtimeUrl.createObjectURL(new Blob([bytes]))\n }\n return ''\n }\n\n if (/^(?:https?:|blob:|data:)/i.test(filePath)) {\n return filePath\n }\n try {\n const runtimeLocation = (typeof location !== 'undefined' ? location : undefined) as { href?: string } | undefined\n if (runtimeLocation?.href) {\n return new URL(filePath, runtimeLocation.href).toString()\n }\n }\n catch {\n // fallback to raw filePath\n }\n return filePath\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"interaction.mjs","names":[],"sources":["../../../src/runtime/polyfill/interaction.ts"],"sourcesContent":["import { WEAPP_VITE_WEB_SCAN_CODE_RESULT_KEY } from '@weapp-core/constants'\n\nexport function resolveScanCodeResult(prompt?: (message: string, defaultValue: string) => unknown) {\n const runtimeGlobal = globalThis as Record<string, unknown>\n let rawResult: unknown = runtimeGlobal[WEAPP_VITE_WEB_SCAN_CODE_RESULT_KEY]\n if (rawResult == null && typeof prompt === 'function') {\n rawResult = prompt('请输入二维码/条码内容', '')\n }\n if (rawResult == null) {\n return null\n }\n if (typeof rawResult === 'string') {\n return rawResult\n }\n return String((rawResult as { result?: unknown })?.result ?? '')\n}\n\nexport async function writeClipboardData(data: string) {\n const runtimeNavigator = typeof navigator !== 'undefined' ? navigator : undefined\n if (runtimeNavigator?.clipboard && typeof runtimeNavigator.clipboard.writeText === 'function') {\n await runtimeNavigator.clipboard.writeText(data)\n return\n }\n\n if (typeof document === 'undefined' || !document.body) {\n throw new Error('Clipboard API is unavailable in current environment.')\n }\n\n const execCommand = (document as Document & { execCommand?: (command: string) => boolean }).execCommand\n if (typeof execCommand !== 'function') {\n throw new TypeError('Clipboard API is unavailable in current environment.')\n }\n\n const textarea = document.createElement('textarea') as HTMLTextAreaElement\n textarea.value = data\n textarea.setAttribute('readonly', 'true')\n textarea.setAttribute('style', 'position: fixed; top: -9999px; left: -9999px; opacity: 0;')\n document.body.append(textarea)\n textarea.select?.()\n const copied = execCommand.call(document, 'copy')\n if (textarea.parentNode) {\n textarea.parentNode.removeChild(textarea)\n }\n if (!copied) {\n throw new Error('document.execCommand(\"copy\") returned false.')\n }\n}\n\nexport async function readClipboardData() {\n const runtimeNavigator = typeof navigator !== 'undefined' ? navigator : undefined\n if (!runtimeNavigator?.clipboard || typeof runtimeNavigator.clipboard.readText !== 'function') {\n throw new Error('Clipboard API is unavailable in current environment.')\n }\n return runtimeNavigator.clipboard.readText()\n}\n"],"mappings":";;;AAEA,SAAgB,sBAAsB,QAA6D;CAEjG,IAAI,
|
|
1
|
+
{"version":3,"file":"interaction.mjs","names":["runtimeGlobal"],"sources":["../../../src/runtime/polyfill/interaction.ts"],"sourcesContent":["import { WEAPP_VITE_WEB_SCAN_CODE_RESULT_KEY } from '@weapp-core/constants'\n\nexport function resolveScanCodeResult(prompt?: (message: string, defaultValue: string) => unknown) {\n const runtimeGlobal = globalThis as Record<string, unknown>\n let rawResult: unknown = runtimeGlobal[WEAPP_VITE_WEB_SCAN_CODE_RESULT_KEY]\n if (rawResult == null && typeof prompt === 'function') {\n rawResult = prompt('请输入二维码/条码内容', '')\n }\n if (rawResult == null) {\n return null\n }\n if (typeof rawResult === 'string') {\n return rawResult\n }\n return String((rawResult as { result?: unknown })?.result ?? '')\n}\n\nexport async function writeClipboardData(data: string) {\n const runtimeNavigator = typeof navigator !== 'undefined' ? navigator : undefined\n if (runtimeNavigator?.clipboard && typeof runtimeNavigator.clipboard.writeText === 'function') {\n await runtimeNavigator.clipboard.writeText(data)\n return\n }\n\n if (typeof document === 'undefined' || !document.body) {\n throw new Error('Clipboard API is unavailable in current environment.')\n }\n\n const execCommand = (document as Document & { execCommand?: (command: string) => boolean }).execCommand\n if (typeof execCommand !== 'function') {\n throw new TypeError('Clipboard API is unavailable in current environment.')\n }\n\n const textarea = document.createElement('textarea') as HTMLTextAreaElement\n textarea.value = data\n textarea.setAttribute('readonly', 'true')\n textarea.setAttribute('style', 'position: fixed; top: -9999px; left: -9999px; opacity: 0;')\n document.body.append(textarea)\n textarea.select?.()\n const copied = execCommand.call(document, 'copy')\n if (textarea.parentNode) {\n textarea.parentNode.removeChild(textarea)\n }\n if (!copied) {\n throw new Error('document.execCommand(\"copy\") returned false.')\n }\n}\n\nexport async function readClipboardData() {\n const runtimeNavigator = typeof navigator !== 'undefined' ? navigator : undefined\n if (!runtimeNavigator?.clipboard || typeof runtimeNavigator.clipboard.readText !== 'function') {\n throw new Error('Clipboard API is unavailable in current environment.')\n }\n return runtimeNavigator.clipboard.readText()\n}\n"],"mappings":";;;AAEA,SAAgB,sBAAsB,QAA6D;CAEjG,IAAI,YAAqBA,WAAc;AACvC,KAAI,aAAa,QAAQ,OAAO,WAAW,WACzC,aAAY,OAAO,eAAe,GAAG;AAEvC,KAAI,aAAa,KACf,QAAO;AAET,KAAI,OAAO,cAAc,SACvB,QAAO;AAET,QAAO,OAAQ,WAAoC,UAAU,GAAG;;AAGlE,eAAsB,mBAAmB,MAAc;CACrD,MAAM,mBAAmB,OAAO,cAAc,cAAc,YAAY;AACxE,KAAI,kBAAkB,aAAa,OAAO,iBAAiB,UAAU,cAAc,YAAY;AAC7F,QAAM,iBAAiB,UAAU,UAAU,KAAK;AAChD;;AAGF,KAAI,OAAO,aAAa,eAAe,CAAC,SAAS,KAC/C,OAAM,IAAI,MAAM,uDAAuD;CAGzE,MAAM,cAAe,SAAuE;AAC5F,KAAI,OAAO,gBAAgB,WACzB,OAAM,IAAI,UAAU,uDAAuD;CAG7E,MAAM,WAAW,SAAS,cAAc,WAAW;AACnD,UAAS,QAAQ;AACjB,UAAS,aAAa,YAAY,OAAO;AACzC,UAAS,aAAa,SAAS,4DAA4D;AAC3F,UAAS,KAAK,OAAO,SAAS;AAC9B,UAAS,UAAU;CACnB,MAAM,SAAS,YAAY,KAAK,UAAU,OAAO;AACjD,KAAI,SAAS,WACX,UAAS,WAAW,YAAY,SAAS;AAE3C,KAAI,CAAC,OACH,OAAM,IAAI,MAAM,iDAA+C;;AAInE,eAAsB,oBAAoB;CACxC,MAAM,mBAAmB,OAAO,cAAc,cAAc,YAAY;AACxE,KAAI,CAAC,kBAAkB,aAAa,OAAO,iBAAiB,UAAU,aAAa,WACjF,OAAM,IAAI,MAAM,uDAAuD;AAEzE,QAAO,iBAAiB,UAAU,UAAU"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"interactionApi.mjs","names":[],"sources":["../../../src/runtime/polyfill/interactionApi.ts"],"sourcesContent":["import {\n callMiniProgramAsyncFailure,\n callMiniProgramAsyncSuccess,\n} from './async'\nimport {\n readClipboardData,\n resolveScanCodeResult,\n writeClipboardData,\n} from './interaction'\nimport { getGlobalDialogHandlers } from './ui'\n\nexport function openCustomerServiceChatBridge(options?: any) {\n const url = options?.url?.trim() ?? ''\n if (url && typeof window !== 'undefined' && typeof window.open === 'function') {\n try {\n window.open(url, '_blank', 'noopener,noreferrer')\n }\n catch {\n // ignore browser popup restrictions\n }\n }\n return Promise.resolve(callMiniProgramAsyncSuccess(options, { errMsg: 'openCustomerServiceChat:ok' }))\n}\n\nexport function scanCodeBridge(options?: any) {\n const { prompt } = getGlobalDialogHandlers()\n const resultText = resolveScanCodeResult(prompt)\n if (resultText == null) {\n const failure = callMiniProgramAsyncFailure(options, 'scanCode:fail cancel')\n return Promise.reject(failure)\n }\n const result = callMiniProgramAsyncSuccess(options, {\n errMsg: 'scanCode:ok',\n result: resultText,\n scanType: 'QR_CODE',\n charSet: 'utf-8',\n path: resultText,\n rawData: resultText,\n })\n return Promise.resolve(result)\n}\n\nexport async function setClipboardDataBridge(options?: any) {\n const data = String(options?.data ?? '')\n try {\n await writeClipboardData(data)\n }\n catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n const failure = callMiniProgramAsyncFailure(options, `setClipboardData:fail ${message}`)\n return Promise.reject(failure)\n }\n return callMiniProgramAsyncSuccess(options, { errMsg: 'setClipboardData:ok' })\n}\n\nexport async function getClipboardDataBridge(options?: any) {\n try {\n const data = await readClipboardData()\n return callMiniProgramAsyncSuccess(options, { errMsg: 'getClipboardData:ok', data })\n }\n catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n const failure = callMiniProgramAsyncFailure(options, `getClipboardData:fail ${message}`)\n return Promise.reject(failure)\n }\n}\n"],"mappings":";;;;;AAWA,SAAgB,8BAA8B,SAAe;CAC3D,MAAM,MAAM,SAAS,KAAK,MAAM,IAAI;AACpC,KAAI,OAAO,OAAO,WAAW,eAAe,OAAO,OAAO,SAAS,WACjE,KAAI;AACF,SAAO,KAAK,KAAK,UAAU,sBAAsB;SAE7C;AAIR,QAAO,QAAQ,QAAQ,4BAA4B,SAAS,EAAE,QAAQ,8BAA8B,CAAC,CAAC;;AAGxG,SAAgB,eAAe,SAAe;CAC5C,MAAM,EAAE,WAAW,yBAAyB;CAC5C,MAAM,aAAa,sBAAsB,OAAO;AAChD,KAAI,cAAc,MAAM;EACtB,MAAM,UAAU,4BAA4B,SAAS,uBAAuB;AAC5E,SAAO,QAAQ,OAAO,QAAQ;;CAEhC,MAAM,SAAS,4BAA4B,SAAS;EAClD,QAAQ;EACR,QAAQ;EACR,UAAU;EACV,SAAS;EACT,MAAM;EACN,SAAS;EACV,CAAC;AACF,QAAO,QAAQ,QAAQ,OAAO;;AAGhC,eAAsB,uBAAuB,SAAe;CAC1D,MAAM,OAAO,OAAO,SAAS,QAAQ,GAAG;AACxC,KAAI;AACF,QAAM,mBAAmB,KAAK;UAEzB,OAAO;EAEZ,MAAM,UAAU,4BAA4B,SAAS,yBADrC,iBAAiB,QAAQ,MAAM,UAAU,OAAO,MAAM,GACkB;AACxF,SAAO,QAAQ,OAAO,QAAQ;;AAEhC,QAAO,4BAA4B,SAAS,EAAE,QAAQ,uBAAuB,CAAC;;AAGhF,eAAsB,uBAAuB,SAAe;AAC1D,KAAI;AAEF,SAAO,4BAA4B,SAAS;GAAE,QAAQ;GAAuB,
|
|
1
|
+
{"version":3,"file":"interactionApi.mjs","names":[],"sources":["../../../src/runtime/polyfill/interactionApi.ts"],"sourcesContent":["import {\n callMiniProgramAsyncFailure,\n callMiniProgramAsyncSuccess,\n} from './async'\nimport {\n readClipboardData,\n resolveScanCodeResult,\n writeClipboardData,\n} from './interaction'\nimport { getGlobalDialogHandlers } from './ui'\n\nexport function openCustomerServiceChatBridge(options?: any) {\n const url = options?.url?.trim() ?? ''\n if (url && typeof window !== 'undefined' && typeof window.open === 'function') {\n try {\n window.open(url, '_blank', 'noopener,noreferrer')\n }\n catch {\n // ignore browser popup restrictions\n }\n }\n return Promise.resolve(callMiniProgramAsyncSuccess(options, { errMsg: 'openCustomerServiceChat:ok' }))\n}\n\nexport function scanCodeBridge(options?: any) {\n const { prompt } = getGlobalDialogHandlers()\n const resultText = resolveScanCodeResult(prompt)\n if (resultText == null) {\n const failure = callMiniProgramAsyncFailure(options, 'scanCode:fail cancel')\n return Promise.reject(failure)\n }\n const result = callMiniProgramAsyncSuccess(options, {\n errMsg: 'scanCode:ok',\n result: resultText,\n scanType: 'QR_CODE',\n charSet: 'utf-8',\n path: resultText,\n rawData: resultText,\n })\n return Promise.resolve(result)\n}\n\nexport async function setClipboardDataBridge(options?: any) {\n const data = String(options?.data ?? '')\n try {\n await writeClipboardData(data)\n }\n catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n const failure = callMiniProgramAsyncFailure(options, `setClipboardData:fail ${message}`)\n return Promise.reject(failure)\n }\n return callMiniProgramAsyncSuccess(options, { errMsg: 'setClipboardData:ok' })\n}\n\nexport async function getClipboardDataBridge(options?: any) {\n try {\n const data = await readClipboardData()\n return callMiniProgramAsyncSuccess(options, { errMsg: 'getClipboardData:ok', data })\n }\n catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n const failure = callMiniProgramAsyncFailure(options, `getClipboardData:fail ${message}`)\n return Promise.reject(failure)\n }\n}\n"],"mappings":";;;;;AAWA,SAAgB,8BAA8B,SAAe;CAC3D,MAAM,MAAM,SAAS,KAAK,MAAM,IAAI;AACpC,KAAI,OAAO,OAAO,WAAW,eAAe,OAAO,OAAO,SAAS,WACjE,KAAI;AACF,SAAO,KAAK,KAAK,UAAU,sBAAsB;SAE7C;AAIR,QAAO,QAAQ,QAAQ,4BAA4B,SAAS,EAAE,QAAQ,8BAA8B,CAAC,CAAC;;AAGxG,SAAgB,eAAe,SAAe;CAC5C,MAAM,EAAE,WAAW,yBAAyB;CAC5C,MAAM,aAAa,sBAAsB,OAAO;AAChD,KAAI,cAAc,MAAM;EACtB,MAAM,UAAU,4BAA4B,SAAS,uBAAuB;AAC5E,SAAO,QAAQ,OAAO,QAAQ;;CAEhC,MAAM,SAAS,4BAA4B,SAAS;EAClD,QAAQ;EACR,QAAQ;EACR,UAAU;EACV,SAAS;EACT,MAAM;EACN,SAAS;EACV,CAAC;AACF,QAAO,QAAQ,QAAQ,OAAO;;AAGhC,eAAsB,uBAAuB,SAAe;CAC1D,MAAM,OAAO,OAAO,SAAS,QAAQ,GAAG;AACxC,KAAI;AACF,QAAM,mBAAmB,KAAK;UAEzB,OAAO;EAEZ,MAAM,UAAU,4BAA4B,SAAS,yBADrC,iBAAiB,QAAQ,MAAM,UAAU,OAAO,MAAM,GACkB;AACxF,SAAO,QAAQ,OAAO,QAAQ;;AAEhC,QAAO,4BAA4B,SAAS,EAAE,QAAQ,uBAAuB,CAAC;;AAGhF,eAAsB,uBAAuB,SAAe;AAC1D,KAAI;AAEF,SAAO,4BAA4B,SAAS;GAAE,QAAQ;GAAuB,YAD1D,mBAAmB;GAC6C,CAAC;UAE/E,OAAO;EAEZ,MAAM,UAAU,4BAA4B,SAAS,yBADrC,iBAAiB,QAAQ,MAAM,UAAU,OAAO,MAAM,GACkB;AACxF,SAAO,QAAQ,OAAO,QAAQ"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"location.mjs","names":[],"sources":["../../../src/runtime/polyfill/location.ts"],"sourcesContent":["import {\n WEAPP_VITE_WEB_CHOOSE_ADDRESS_KEY,\n WEAPP_VITE_WEB_CHOOSE_LOCATION_KEY,\n WEAPP_VITE_WEB_FUZZY_LOCATION_KEY,\n} from '@weapp-core/constants'\n\nconst ADDRESS_PROMPT_SPLIT_RE = /[,,]/\n\nexport function normalizeGeoNumber(value: unknown, fallback = 0) {\n if (typeof value !== 'number' || Number.isNaN(value)) {\n return fallback\n }\n return value\n}\n\ninterface ReadCurrentLocationOptions {\n isHighAccuracy?: boolean\n altitude?: boolean\n highAccuracyExpireTime?: number\n}\n\ninterface LocationCoordinatesSnapshot {\n latitude: number\n longitude: number\n speed: number\n accuracy: number\n altitude: number\n verticalAccuracy: number\n horizontalAccuracy: number\n}\n\nexport function readCurrentLocation(options?: ReadCurrentLocationOptions) {\n const runtimeNavigator = (typeof navigator !== 'undefined' ? navigator : undefined) as (Navigator & {\n geolocation?: {\n getCurrentPosition?: (\n success: (position: {\n coords: {\n latitude?: number\n longitude?: number\n speed?: number | null\n accuracy?: number\n altitude?: number | null\n altitudeAccuracy?: number | null\n }\n }) => void,\n error?: (err: { message?: string }) => void,\n opts?: {\n enableHighAccuracy?: boolean\n timeout?: number\n },\n ) => void\n }\n }) | undefined\n const geolocation = runtimeNavigator?.geolocation\n if (!geolocation || typeof geolocation.getCurrentPosition !== 'function') {\n throw new Error('geolocation is unavailable')\n }\n const timeout = typeof options?.highAccuracyExpireTime === 'number' && options.highAccuracyExpireTime > 0\n ? options.highAccuracyExpireTime\n : undefined\n return new Promise<LocationCoordinatesSnapshot>((resolve, reject) => {\n geolocation.getCurrentPosition(\n (position) => {\n const coords = position.coords ?? {}\n const accuracy = normalizeGeoNumber(coords.accuracy, 0)\n resolve({\n latitude: normalizeGeoNumber(coords.latitude, 0),\n longitude: normalizeGeoNumber(coords.longitude, 0),\n speed: normalizeGeoNumber(coords.speed, -1),\n accuracy,\n altitude: normalizeGeoNumber(coords.altitude, 0),\n verticalAccuracy: normalizeGeoNumber(coords.altitudeAccuracy, 0),\n horizontalAccuracy: accuracy,\n })\n },\n (error) => {\n reject(new Error(error?.message ?? 'unknown error'))\n },\n {\n enableHighAccuracy: Boolean(options?.isHighAccuracy || options?.altitude),\n timeout,\n },\n )\n })\n}\n\nexport function normalizeFuzzyCoordinate(value: number) {\n return Number(value.toFixed(2))\n}\n\nexport function readPresetFuzzyLocation() {\n const runtimeGlobal = globalThis as Record<string, unknown>\n const preset = runtimeGlobal[WEAPP_VITE_WEB_FUZZY_LOCATION_KEY]\n if (!preset || typeof preset !== 'object') {\n return null\n }\n const value = preset as Record<string, unknown>\n const latitude = Number(value.latitude)\n const longitude = Number(value.longitude)\n if (!Number.isFinite(latitude) || !Number.isFinite(longitude)) {\n return null\n }\n return {\n latitude: normalizeFuzzyCoordinate(latitude),\n longitude: normalizeFuzzyCoordinate(longitude),\n accuracy: Math.max(1000, normalizeGeoNumber(value.accuracy, 1000)),\n }\n}\n\nexport function readPresetChooseLocation() {\n const runtimeGlobal = globalThis as Record<string, unknown>\n const preset = runtimeGlobal[WEAPP_VITE_WEB_CHOOSE_LOCATION_KEY]\n if (!preset || typeof preset !== 'object') {\n return null\n }\n const value = preset as Record<string, unknown>\n const latitude = Number(value.latitude)\n const longitude = Number(value.longitude)\n if (!Number.isFinite(latitude) || !Number.isFinite(longitude)) {\n return null\n }\n return {\n name: typeof value.name === 'string' ? value.name : '',\n address: typeof value.address === 'string' ? value.address : '',\n latitude,\n longitude,\n }\n}\n\nexport function readPresetChooseAddress() {\n const runtimeGlobal = globalThis as Record<string, unknown>\n const preset = runtimeGlobal[WEAPP_VITE_WEB_CHOOSE_ADDRESS_KEY]\n if (!preset || typeof preset !== 'object') {\n return null\n }\n const value = preset as Record<string, unknown>\n return {\n userName: typeof value.userName === 'string' ? value.userName : '',\n postalCode: typeof value.postalCode === 'string' ? value.postalCode : '',\n provinceName: typeof value.provinceName === 'string' ? value.provinceName : '',\n cityName: typeof value.cityName === 'string' ? value.cityName : '',\n countyName: typeof value.countyName === 'string' ? value.countyName : '',\n detailInfo: typeof value.detailInfo === 'string' ? value.detailInfo : '',\n nationalCode: typeof value.nationalCode === 'string' ? value.nationalCode : '',\n telNumber: typeof value.telNumber === 'string' ? value.telNumber : '',\n }\n}\n\nexport function parseChooseAddressPromptInput(input: unknown) {\n const [provinceName = '', cityName = '', countyName = '', detailInfo = '', userName = '', telNumber = '']\n = String(input).split(ADDRESS_PROMPT_SPLIT_RE).map(item => item.trim())\n if (!provinceName || !cityName || !countyName || !detailInfo) {\n return null\n }\n return {\n userName,\n postalCode: '',\n provinceName,\n cityName,\n countyName,\n detailInfo,\n nationalCode: '',\n telNumber,\n }\n}\n\nexport function parseChooseLocationPromptInput(input: unknown) {\n const [latText = '', lonText = ''] = String(input).split(',').map(item => item.trim())\n const latitude = Number(latText)\n const longitude = Number(lonText)\n if (!Number.isFinite(latitude) || !Number.isFinite(longitude)) {\n return null\n }\n return {\n latitude,\n longitude,\n }\n}\n"],"mappings":";;;AAMA,MAAM,0BAA0B;AAEhC,SAAgB,mBAAmB,OAAgB,WAAW,GAAG;AAC/D,KAAI,OAAO,UAAU,YAAY,OAAO,MAAM,MAAM,CAClD,QAAO;AAET,QAAO;;AAmBT,SAAgB,oBAAoB,SAAsC;CAsBxE,MAAM,eArBoB,OAAO,cAAc,cAAc,YAAY,SAqBnC;AACtC,KAAI,CAAC,eAAe,OAAO,YAAY,uBAAuB,WAC5D,OAAM,IAAI,MAAM,6BAA6B;CAE/C,MAAM,UAAU,OAAO,SAAS,2BAA2B,YAAY,QAAQ,yBAAyB,IACpG,QAAQ,yBACR;AACJ,QAAO,IAAI,SAAsC,SAAS,WAAW;AACnE,cAAY,oBACT,aAAa;GACZ,MAAM,SAAS,SAAS,UAAU,EAAE;GACpC,MAAM,WAAW,mBAAmB,OAAO,UAAU,EAAE;AACvD,WAAQ;IACN,UAAU,mBAAmB,OAAO,UAAU,EAAE;IAChD,WAAW,mBAAmB,OAAO,WAAW,EAAE;IAClD,OAAO,mBAAmB,OAAO,OAAO,GAAG;IAC3C;IACA,UAAU,mBAAmB,OAAO,UAAU,EAAE;IAChD,kBAAkB,mBAAmB,OAAO,kBAAkB,EAAE;IAChE,oBAAoB;IACrB,CAAC;MAEH,UAAU;AACT,UAAO,IAAI,MAAM,OAAO,WAAW,gBAAgB,CAAC;KAEtD;GACE,oBAAoB,QAAQ,SAAS,kBAAkB,SAAS,SAAS;GACzE;GACD,CACF;GACD;;AAGJ,SAAgB,yBAAyB,OAAe;AACtD,QAAO,OAAO,MAAM,QAAQ,EAAE,CAAC;;AAGjC,SAAgB,0BAA0B;CAExC,MAAM,
|
|
1
|
+
{"version":3,"file":"location.mjs","names":["runtimeGlobal"],"sources":["../../../src/runtime/polyfill/location.ts"],"sourcesContent":["import {\n WEAPP_VITE_WEB_CHOOSE_ADDRESS_KEY,\n WEAPP_VITE_WEB_CHOOSE_LOCATION_KEY,\n WEAPP_VITE_WEB_FUZZY_LOCATION_KEY,\n} from '@weapp-core/constants'\n\nconst ADDRESS_PROMPT_SPLIT_RE = /[,,]/\n\nexport function normalizeGeoNumber(value: unknown, fallback = 0) {\n if (typeof value !== 'number' || Number.isNaN(value)) {\n return fallback\n }\n return value\n}\n\ninterface ReadCurrentLocationOptions {\n isHighAccuracy?: boolean\n altitude?: boolean\n highAccuracyExpireTime?: number\n}\n\ninterface LocationCoordinatesSnapshot {\n latitude: number\n longitude: number\n speed: number\n accuracy: number\n altitude: number\n verticalAccuracy: number\n horizontalAccuracy: number\n}\n\nexport function readCurrentLocation(options?: ReadCurrentLocationOptions) {\n const runtimeNavigator = (typeof navigator !== 'undefined' ? navigator : undefined) as (Navigator & {\n geolocation?: {\n getCurrentPosition?: (\n success: (position: {\n coords: {\n latitude?: number\n longitude?: number\n speed?: number | null\n accuracy?: number\n altitude?: number | null\n altitudeAccuracy?: number | null\n }\n }) => void,\n error?: (err: { message?: string }) => void,\n opts?: {\n enableHighAccuracy?: boolean\n timeout?: number\n },\n ) => void\n }\n }) | undefined\n const geolocation = runtimeNavigator?.geolocation\n if (!geolocation || typeof geolocation.getCurrentPosition !== 'function') {\n throw new Error('geolocation is unavailable')\n }\n const timeout = typeof options?.highAccuracyExpireTime === 'number' && options.highAccuracyExpireTime > 0\n ? options.highAccuracyExpireTime\n : undefined\n return new Promise<LocationCoordinatesSnapshot>((resolve, reject) => {\n geolocation.getCurrentPosition(\n (position) => {\n const coords = position.coords ?? {}\n const accuracy = normalizeGeoNumber(coords.accuracy, 0)\n resolve({\n latitude: normalizeGeoNumber(coords.latitude, 0),\n longitude: normalizeGeoNumber(coords.longitude, 0),\n speed: normalizeGeoNumber(coords.speed, -1),\n accuracy,\n altitude: normalizeGeoNumber(coords.altitude, 0),\n verticalAccuracy: normalizeGeoNumber(coords.altitudeAccuracy, 0),\n horizontalAccuracy: accuracy,\n })\n },\n (error) => {\n reject(new Error(error?.message ?? 'unknown error'))\n },\n {\n enableHighAccuracy: Boolean(options?.isHighAccuracy || options?.altitude),\n timeout,\n },\n )\n })\n}\n\nexport function normalizeFuzzyCoordinate(value: number) {\n return Number(value.toFixed(2))\n}\n\nexport function readPresetFuzzyLocation() {\n const runtimeGlobal = globalThis as Record<string, unknown>\n const preset = runtimeGlobal[WEAPP_VITE_WEB_FUZZY_LOCATION_KEY]\n if (!preset || typeof preset !== 'object') {\n return null\n }\n const value = preset as Record<string, unknown>\n const latitude = Number(value.latitude)\n const longitude = Number(value.longitude)\n if (!Number.isFinite(latitude) || !Number.isFinite(longitude)) {\n return null\n }\n return {\n latitude: normalizeFuzzyCoordinate(latitude),\n longitude: normalizeFuzzyCoordinate(longitude),\n accuracy: Math.max(1000, normalizeGeoNumber(value.accuracy, 1000)),\n }\n}\n\nexport function readPresetChooseLocation() {\n const runtimeGlobal = globalThis as Record<string, unknown>\n const preset = runtimeGlobal[WEAPP_VITE_WEB_CHOOSE_LOCATION_KEY]\n if (!preset || typeof preset !== 'object') {\n return null\n }\n const value = preset as Record<string, unknown>\n const latitude = Number(value.latitude)\n const longitude = Number(value.longitude)\n if (!Number.isFinite(latitude) || !Number.isFinite(longitude)) {\n return null\n }\n return {\n name: typeof value.name === 'string' ? value.name : '',\n address: typeof value.address === 'string' ? value.address : '',\n latitude,\n longitude,\n }\n}\n\nexport function readPresetChooseAddress() {\n const runtimeGlobal = globalThis as Record<string, unknown>\n const preset = runtimeGlobal[WEAPP_VITE_WEB_CHOOSE_ADDRESS_KEY]\n if (!preset || typeof preset !== 'object') {\n return null\n }\n const value = preset as Record<string, unknown>\n return {\n userName: typeof value.userName === 'string' ? value.userName : '',\n postalCode: typeof value.postalCode === 'string' ? value.postalCode : '',\n provinceName: typeof value.provinceName === 'string' ? value.provinceName : '',\n cityName: typeof value.cityName === 'string' ? value.cityName : '',\n countyName: typeof value.countyName === 'string' ? value.countyName : '',\n detailInfo: typeof value.detailInfo === 'string' ? value.detailInfo : '',\n nationalCode: typeof value.nationalCode === 'string' ? value.nationalCode : '',\n telNumber: typeof value.telNumber === 'string' ? value.telNumber : '',\n }\n}\n\nexport function parseChooseAddressPromptInput(input: unknown) {\n const [provinceName = '', cityName = '', countyName = '', detailInfo = '', userName = '', telNumber = '']\n = String(input).split(ADDRESS_PROMPT_SPLIT_RE).map(item => item.trim())\n if (!provinceName || !cityName || !countyName || !detailInfo) {\n return null\n }\n return {\n userName,\n postalCode: '',\n provinceName,\n cityName,\n countyName,\n detailInfo,\n nationalCode: '',\n telNumber,\n }\n}\n\nexport function parseChooseLocationPromptInput(input: unknown) {\n const [latText = '', lonText = ''] = String(input).split(',').map(item => item.trim())\n const latitude = Number(latText)\n const longitude = Number(lonText)\n if (!Number.isFinite(latitude) || !Number.isFinite(longitude)) {\n return null\n }\n return {\n latitude,\n longitude,\n }\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"locationApi.mjs","names":[],"sources":["../../../src/runtime/polyfill/locationApi.ts"],"sourcesContent":["import {\n callMiniProgramAsyncFailure,\n callMiniProgramAsyncSuccess,\n} from './async'\nimport {\n normalizeFuzzyCoordinate,\n normalizeGeoNumber,\n parseChooseAddressPromptInput,\n parseChooseLocationPromptInput,\n readCurrentLocation,\n readPresetChooseAddress,\n readPresetChooseLocation,\n readPresetFuzzyLocation,\n} from './location'\nimport { openTargetInNewWindow } from './mediaActions'\nimport { getGlobalDialogHandlers } from './ui'\n\nexport function makePhoneCallBridge(options?: any) {\n const phoneNumber = typeof options?.phoneNumber === 'string' ? options.phoneNumber.trim() : ''\n if (!phoneNumber) {\n const failure = callMiniProgramAsyncFailure(options, 'makePhoneCall:fail invalid phoneNumber')\n return Promise.reject(failure)\n }\n if (typeof window !== 'undefined' && typeof window.open === 'function') {\n try {\n window.open(`tel:${encodeURIComponent(phoneNumber)}`, '_self')\n }\n catch {\n // ignore browser restrictions and keep API-level success semantics\n }\n }\n return Promise.resolve(callMiniProgramAsyncSuccess(options, { errMsg: 'makePhoneCall:ok' }))\n}\n\nexport function chooseAddressBridge(options?: any) {\n const preset = readPresetChooseAddress()\n if (preset) {\n return Promise.resolve(callMiniProgramAsyncSuccess(options, {\n errMsg: 'chooseAddress:ok',\n ...preset,\n }))\n }\n const { prompt } = getGlobalDialogHandlers()\n if (typeof prompt === 'function') {\n const input = prompt('请输入地址(格式:省,市,区,详细地址,姓名,电话)', '')\n if (input == null) {\n const failure = callMiniProgramAsyncFailure(options, 'chooseAddress:fail cancel')\n return Promise.reject(failure)\n }\n const parsed = parseChooseAddressPromptInput(input)\n if (!parsed) {\n const failure = callMiniProgramAsyncFailure(options, 'chooseAddress:fail invalid input')\n return Promise.reject(failure)\n }\n return Promise.resolve(callMiniProgramAsyncSuccess(options, {\n errMsg: 'chooseAddress:ok',\n ...parsed,\n }))\n }\n const failure = callMiniProgramAsyncFailure(options, 'chooseAddress:fail address picker is unavailable')\n return Promise.reject(failure)\n}\n\nexport function chooseLocationBridge(options?: any) {\n const preset = readPresetChooseLocation()\n if (preset) {\n return Promise.resolve(callMiniProgramAsyncSuccess(options, {\n errMsg: 'chooseLocation:ok',\n ...preset,\n }))\n }\n const { prompt } = getGlobalDialogHandlers()\n if (typeof prompt === 'function') {\n const input = prompt('请输入坐标(格式:latitude,longitude)', '')\n if (input == null) {\n const failure = callMiniProgramAsyncFailure(options, 'chooseLocation:fail cancel')\n return Promise.reject(failure)\n }\n const parsed = parseChooseLocationPromptInput(input)\n if (!parsed) {\n const failure = callMiniProgramAsyncFailure(options, 'chooseLocation:fail invalid latitude/longitude')\n return Promise.reject(failure)\n }\n return Promise.resolve(callMiniProgramAsyncSuccess(options, {\n errMsg: 'chooseLocation:ok',\n name: '',\n address: '',\n latitude: parsed.latitude,\n longitude: parsed.longitude,\n }))\n }\n const failure = callMiniProgramAsyncFailure(options, 'chooseLocation:fail location picker is unavailable')\n return Promise.reject(failure)\n}\n\nexport function openLocationBridge(options?: any) {\n const latitude = options?.latitude\n const longitude = options?.longitude\n if (typeof latitude !== 'number' || Number.isNaN(latitude) || typeof longitude !== 'number' || Number.isNaN(longitude)) {\n const failure = callMiniProgramAsyncFailure(options, 'openLocation:fail invalid latitude/longitude')\n return Promise.reject(failure)\n }\n const query = `${latitude},${longitude}`\n const target = `https://maps.google.com/?q=${encodeURIComponent(query)}`\n openTargetInNewWindow(target)\n return Promise.resolve(callMiniProgramAsyncSuccess(options, { errMsg: 'openLocation:ok' }))\n}\n\nexport function getLocationBridge(options?: any) {\n try {\n return readCurrentLocation(options)\n .then(location => callMiniProgramAsyncSuccess(options, {\n errMsg: 'getLocation:ok',\n ...location,\n }))\n .catch((error) => {\n const message = error instanceof Error ? error.message : String(error)\n const failure = callMiniProgramAsyncFailure(options, `getLocation:fail ${message}`)\n return Promise.reject(failure)\n })\n }\n catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n const failure = callMiniProgramAsyncFailure(options, `getLocation:fail ${message}`)\n return Promise.reject(failure)\n }\n}\n\nexport async function getFuzzyLocationBridge(options?: any) {\n const preset = readPresetFuzzyLocation()\n if (preset) {\n return callMiniProgramAsyncSuccess(options, {\n errMsg: 'getFuzzyLocation:ok',\n ...preset,\n })\n }\n try {\n const location = await getLocationBridge()\n return callMiniProgramAsyncSuccess(options, {\n errMsg: 'getFuzzyLocation:ok',\n latitude: normalizeFuzzyCoordinate(location.latitude),\n longitude: normalizeFuzzyCoordinate(location.longitude),\n accuracy: Math.max(1000, normalizeGeoNumber(location.accuracy, 1000)),\n })\n }\n catch (error) {\n const message = typeof (error as { errMsg?: unknown })?.errMsg === 'string'\n ? (error as { errMsg: string }).errMsg\n : error instanceof Error\n ? error.message\n : String(error)\n const failure = callMiniProgramAsyncFailure(options, `getFuzzyLocation:fail ${message}`)\n return Promise.reject(failure)\n }\n}\n"],"mappings":";;;;;;AAiBA,SAAgB,oBAAoB,SAAe;CACjD,MAAM,cAAc,OAAO,SAAS,gBAAgB,WAAW,QAAQ,YAAY,MAAM,GAAG;AAC5F,KAAI,CAAC,aAAa;EAChB,MAAM,UAAU,4BAA4B,SAAS,yCAAyC;AAC9F,SAAO,QAAQ,OAAO,QAAQ;;AAEhC,KAAI,OAAO,WAAW,eAAe,OAAO,OAAO,SAAS,WAC1D,KAAI;AACF,SAAO,KAAK,OAAO,mBAAmB,YAAY,IAAI,QAAQ;SAE1D;AAIR,QAAO,QAAQ,QAAQ,4BAA4B,SAAS,EAAE,QAAQ,oBAAoB,CAAC,CAAC;;AAG9F,SAAgB,oBAAoB,SAAe;CACjD,MAAM,SAAS,yBAAyB;AACxC,KAAI,OACF,QAAO,QAAQ,QAAQ,4BAA4B,SAAS;EAC1D,QAAQ;EACR,GAAG;EACJ,CAAC,CAAC;CAEL,MAAM,EAAE,WAAW,yBAAyB;AAC5C,KAAI,OAAO,WAAW,YAAY;EAChC,MAAM,QAAQ,OAAO,8BAA8B,GAAG;AACtD,MAAI,SAAS,MAAM;GACjB,MAAM,UAAU,4BAA4B,SAAS,4BAA4B;AACjF,UAAO,QAAQ,OAAO,QAAQ;;EAEhC,MAAM,SAAS,8BAA8B,MAAM;AACnD,MAAI,CAAC,QAAQ;GACX,MAAM,UAAU,4BAA4B,SAAS,mCAAmC;AACxF,UAAO,QAAQ,OAAO,QAAQ;;AAEhC,SAAO,QAAQ,QAAQ,4BAA4B,SAAS;GAC1D,QAAQ;GACR,GAAG;GACJ,CAAC,CAAC;;CAEL,MAAM,UAAU,4BAA4B,SAAS,mDAAmD;AACxG,QAAO,QAAQ,OAAO,QAAQ;;AAGhC,SAAgB,qBAAqB,SAAe;CAClD,MAAM,SAAS,0BAA0B;AACzC,KAAI,OACF,QAAO,QAAQ,QAAQ,4BAA4B,SAAS;EAC1D,QAAQ;EACR,GAAG;EACJ,CAAC,CAAC;CAEL,MAAM,EAAE,WAAW,yBAAyB;AAC5C,KAAI,OAAO,WAAW,YAAY;EAChC,MAAM,QAAQ,OAAO,gCAAgC,GAAG;AACxD,MAAI,SAAS,MAAM;GACjB,MAAM,UAAU,4BAA4B,SAAS,6BAA6B;AAClF,UAAO,QAAQ,OAAO,QAAQ;;EAEhC,MAAM,SAAS,+BAA+B,MAAM;AACpD,MAAI,CAAC,QAAQ;GACX,MAAM,UAAU,4BAA4B,SAAS,iDAAiD;AACtG,UAAO,QAAQ,OAAO,QAAQ;;AAEhC,SAAO,QAAQ,QAAQ,4BAA4B,SAAS;GAC1D,QAAQ;GACR,MAAM;GACN,SAAS;GACT,UAAU,OAAO;GACjB,WAAW,OAAO;GACnB,CAAC,CAAC;;CAEL,MAAM,UAAU,4BAA4B,SAAS,qDAAqD;AAC1G,QAAO,QAAQ,OAAO,QAAQ;;AAGhC,SAAgB,mBAAmB,SAAe;CAChD,MAAM,WAAW,SAAS;CAC1B,MAAM,YAAY,SAAS;AAC3B,KAAI,OAAO,aAAa,YAAY,OAAO,MAAM,SAAS,IAAI,OAAO,cAAc,YAAY,OAAO,MAAM,UAAU,EAAE;EACtH,MAAM,UAAU,4BAA4B,SAAS,+CAA+C;AACpG,SAAO,QAAQ,OAAO,QAAQ;;CAEhC,MAAM,QAAQ,GAAG,SAAS,GAAG;AAE7B,
|
|
1
|
+
{"version":3,"file":"locationApi.mjs","names":[],"sources":["../../../src/runtime/polyfill/locationApi.ts"],"sourcesContent":["import {\n callMiniProgramAsyncFailure,\n callMiniProgramAsyncSuccess,\n} from './async'\nimport {\n normalizeFuzzyCoordinate,\n normalizeGeoNumber,\n parseChooseAddressPromptInput,\n parseChooseLocationPromptInput,\n readCurrentLocation,\n readPresetChooseAddress,\n readPresetChooseLocation,\n readPresetFuzzyLocation,\n} from './location'\nimport { openTargetInNewWindow } from './mediaActions'\nimport { getGlobalDialogHandlers } from './ui'\n\nexport function makePhoneCallBridge(options?: any) {\n const phoneNumber = typeof options?.phoneNumber === 'string' ? options.phoneNumber.trim() : ''\n if (!phoneNumber) {\n const failure = callMiniProgramAsyncFailure(options, 'makePhoneCall:fail invalid phoneNumber')\n return Promise.reject(failure)\n }\n if (typeof window !== 'undefined' && typeof window.open === 'function') {\n try {\n window.open(`tel:${encodeURIComponent(phoneNumber)}`, '_self')\n }\n catch {\n // ignore browser restrictions and keep API-level success semantics\n }\n }\n return Promise.resolve(callMiniProgramAsyncSuccess(options, { errMsg: 'makePhoneCall:ok' }))\n}\n\nexport function chooseAddressBridge(options?: any) {\n const preset = readPresetChooseAddress()\n if (preset) {\n return Promise.resolve(callMiniProgramAsyncSuccess(options, {\n errMsg: 'chooseAddress:ok',\n ...preset,\n }))\n }\n const { prompt } = getGlobalDialogHandlers()\n if (typeof prompt === 'function') {\n const input = prompt('请输入地址(格式:省,市,区,详细地址,姓名,电话)', '')\n if (input == null) {\n const failure = callMiniProgramAsyncFailure(options, 'chooseAddress:fail cancel')\n return Promise.reject(failure)\n }\n const parsed = parseChooseAddressPromptInput(input)\n if (!parsed) {\n const failure = callMiniProgramAsyncFailure(options, 'chooseAddress:fail invalid input')\n return Promise.reject(failure)\n }\n return Promise.resolve(callMiniProgramAsyncSuccess(options, {\n errMsg: 'chooseAddress:ok',\n ...parsed,\n }))\n }\n const failure = callMiniProgramAsyncFailure(options, 'chooseAddress:fail address picker is unavailable')\n return Promise.reject(failure)\n}\n\nexport function chooseLocationBridge(options?: any) {\n const preset = readPresetChooseLocation()\n if (preset) {\n return Promise.resolve(callMiniProgramAsyncSuccess(options, {\n errMsg: 'chooseLocation:ok',\n ...preset,\n }))\n }\n const { prompt } = getGlobalDialogHandlers()\n if (typeof prompt === 'function') {\n const input = prompt('请输入坐标(格式:latitude,longitude)', '')\n if (input == null) {\n const failure = callMiniProgramAsyncFailure(options, 'chooseLocation:fail cancel')\n return Promise.reject(failure)\n }\n const parsed = parseChooseLocationPromptInput(input)\n if (!parsed) {\n const failure = callMiniProgramAsyncFailure(options, 'chooseLocation:fail invalid latitude/longitude')\n return Promise.reject(failure)\n }\n return Promise.resolve(callMiniProgramAsyncSuccess(options, {\n errMsg: 'chooseLocation:ok',\n name: '',\n address: '',\n latitude: parsed.latitude,\n longitude: parsed.longitude,\n }))\n }\n const failure = callMiniProgramAsyncFailure(options, 'chooseLocation:fail location picker is unavailable')\n return Promise.reject(failure)\n}\n\nexport function openLocationBridge(options?: any) {\n const latitude = options?.latitude\n const longitude = options?.longitude\n if (typeof latitude !== 'number' || Number.isNaN(latitude) || typeof longitude !== 'number' || Number.isNaN(longitude)) {\n const failure = callMiniProgramAsyncFailure(options, 'openLocation:fail invalid latitude/longitude')\n return Promise.reject(failure)\n }\n const query = `${latitude},${longitude}`\n const target = `https://maps.google.com/?q=${encodeURIComponent(query)}`\n openTargetInNewWindow(target)\n return Promise.resolve(callMiniProgramAsyncSuccess(options, { errMsg: 'openLocation:ok' }))\n}\n\nexport function getLocationBridge(options?: any) {\n try {\n return readCurrentLocation(options)\n .then(location => callMiniProgramAsyncSuccess(options, {\n errMsg: 'getLocation:ok',\n ...location,\n }))\n .catch((error) => {\n const message = error instanceof Error ? error.message : String(error)\n const failure = callMiniProgramAsyncFailure(options, `getLocation:fail ${message}`)\n return Promise.reject(failure)\n })\n }\n catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n const failure = callMiniProgramAsyncFailure(options, `getLocation:fail ${message}`)\n return Promise.reject(failure)\n }\n}\n\nexport async function getFuzzyLocationBridge(options?: any) {\n const preset = readPresetFuzzyLocation()\n if (preset) {\n return callMiniProgramAsyncSuccess(options, {\n errMsg: 'getFuzzyLocation:ok',\n ...preset,\n })\n }\n try {\n const location = await getLocationBridge()\n return callMiniProgramAsyncSuccess(options, {\n errMsg: 'getFuzzyLocation:ok',\n latitude: normalizeFuzzyCoordinate(location.latitude),\n longitude: normalizeFuzzyCoordinate(location.longitude),\n accuracy: Math.max(1000, normalizeGeoNumber(location.accuracy, 1000)),\n })\n }\n catch (error) {\n const message = typeof (error as { errMsg?: unknown })?.errMsg === 'string'\n ? (error as { errMsg: string }).errMsg\n : error instanceof Error\n ? error.message\n : String(error)\n const failure = callMiniProgramAsyncFailure(options, `getFuzzyLocation:fail ${message}`)\n return Promise.reject(failure)\n }\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mediaActions.mjs","names":[],"sources":["../../../src/runtime/polyfill/mediaActions.ts"],"sourcesContent":["import { WEAPP_VITE_WEB_OPEN_VIDEO_EDITOR_KEY } from '@weapp-core/constants'\n\ninterface PreviewMediaSourceRecord {\n url: string\n type: 'image' | 'video'\n poster: string\n}\n\nexport function openTargetInNewWindow(target: string) {\n if (typeof window === 'undefined' || typeof window.open !== 'function') {\n return\n }\n try {\n window.open(target, '_blank', 'noopener,noreferrer')\n }\n catch {\n // ignore browser popup restrictions and keep API-level success semantics\n }\n}\n\nexport function normalizePreviewMediaSources(sources: unknown): PreviewMediaSourceRecord[] {\n if (!Array.isArray(sources)) {\n return []\n }\n return sources\n .map((source) => {\n if (!source || typeof source !== 'object') {\n return null\n }\n const sourceRecord = source as Record<string, unknown>\n const url = typeof sourceRecord.url === 'string' ? sourceRecord.url.trim() : ''\n if (!url) {\n return null\n }\n return {\n url,\n type: sourceRecord.type === 'video' ? 'video' : 'image',\n poster: typeof sourceRecord.poster === 'string' ? sourceRecord.poster : '',\n }\n })\n .filter((item): item is PreviewMediaSourceRecord => Boolean(item))\n}\n\nexport function readOpenVideoEditorPreset(src: string) {\n const runtimeGlobal = globalThis as Record<string, unknown>\n const preset = runtimeGlobal[WEAPP_VITE_WEB_OPEN_VIDEO_EDITOR_KEY]\n if (typeof preset === 'function') {\n const value = (preset as (value: string) => unknown)(src)\n return typeof value === 'string' && value.trim() ? value.trim() : ''\n }\n if (typeof preset === 'string' && preset.trim()) {\n return preset.trim()\n }\n if (preset && typeof preset === 'object') {\n const value = (preset as Record<string, unknown>)[src]\n return typeof value === 'string' && value.trim() ? value.trim() : ''\n }\n return ''\n}\n\nexport function triggerDownload(filePath: string, fileName = '') {\n if (typeof document === 'undefined' || !document.body) {\n return\n }\n try {\n const link = document.createElement('a')\n link.setAttribute('href', filePath)\n link.setAttribute('download', fileName)\n link.setAttribute('style', 'display:none')\n document.body.append(link)\n link.click?.()\n if (link.parentNode) {\n link.parentNode.removeChild(link)\n }\n }\n catch {\n // keep API-level success semantics for browser restrictions\n }\n}\n"],"mappings":";;;AAQA,SAAgB,sBAAsB,QAAgB;AACpD,KAAI,OAAO,WAAW,eAAe,OAAO,OAAO,SAAS,WAC1D;AAEF,KAAI;AACF,SAAO,KAAK,QAAQ,UAAU,sBAAsB;SAEhD;;AAKR,SAAgB,6BAA6B,SAA8C;AACzF,KAAI,CAAC,MAAM,QAAQ,QAAQ,CACzB,QAAO,EAAE;AAEX,QAAO,QACJ,KAAK,WAAW;AACf,MAAI,CAAC,UAAU,OAAO,WAAW,SAC/B,QAAO;EAET,MAAM,eAAe;EACrB,MAAM,MAAM,OAAO,aAAa,QAAQ,WAAW,aAAa,IAAI,MAAM,GAAG;AAC7E,MAAI,CAAC,IACH,QAAO;AAET,SAAO;GACL;GACA,MAAM,aAAa,SAAS,UAAU,UAAU;GAChD,QAAQ,OAAO,aAAa,WAAW,WAAW,aAAa,SAAS;GACzE;GACD,CACD,QAAQ,SAA2C,QAAQ,KAAK,CAAC;;AAGtE,SAAgB,0BAA0B,KAAa;CAErD,MAAM,
|
|
1
|
+
{"version":3,"file":"mediaActions.mjs","names":["runtimeGlobal"],"sources":["../../../src/runtime/polyfill/mediaActions.ts"],"sourcesContent":["import { WEAPP_VITE_WEB_OPEN_VIDEO_EDITOR_KEY } from '@weapp-core/constants'\n\ninterface PreviewMediaSourceRecord {\n url: string\n type: 'image' | 'video'\n poster: string\n}\n\nexport function openTargetInNewWindow(target: string) {\n if (typeof window === 'undefined' || typeof window.open !== 'function') {\n return\n }\n try {\n window.open(target, '_blank', 'noopener,noreferrer')\n }\n catch {\n // ignore browser popup restrictions and keep API-level success semantics\n }\n}\n\nexport function normalizePreviewMediaSources(sources: unknown): PreviewMediaSourceRecord[] {\n if (!Array.isArray(sources)) {\n return []\n }\n return sources\n .map((source) => {\n if (!source || typeof source !== 'object') {\n return null\n }\n const sourceRecord = source as Record<string, unknown>\n const url = typeof sourceRecord.url === 'string' ? sourceRecord.url.trim() : ''\n if (!url) {\n return null\n }\n return {\n url,\n type: sourceRecord.type === 'video' ? 'video' : 'image',\n poster: typeof sourceRecord.poster === 'string' ? sourceRecord.poster : '',\n }\n })\n .filter((item): item is PreviewMediaSourceRecord => Boolean(item))\n}\n\nexport function readOpenVideoEditorPreset(src: string) {\n const runtimeGlobal = globalThis as Record<string, unknown>\n const preset = runtimeGlobal[WEAPP_VITE_WEB_OPEN_VIDEO_EDITOR_KEY]\n if (typeof preset === 'function') {\n const value = (preset as (value: string) => unknown)(src)\n return typeof value === 'string' && value.trim() ? value.trim() : ''\n }\n if (typeof preset === 'string' && preset.trim()) {\n return preset.trim()\n }\n if (preset && typeof preset === 'object') {\n const value = (preset as Record<string, unknown>)[src]\n return typeof value === 'string' && value.trim() ? value.trim() : ''\n }\n return ''\n}\n\nexport function triggerDownload(filePath: string, fileName = '') {\n if (typeof document === 'undefined' || !document.body) {\n return\n }\n try {\n const link = document.createElement('a')\n link.setAttribute('href', filePath)\n link.setAttribute('download', fileName)\n link.setAttribute('style', 'display:none')\n document.body.append(link)\n link.click?.()\n if (link.parentNode) {\n link.parentNode.removeChild(link)\n }\n }\n catch {\n // keep API-level success semantics for browser restrictions\n }\n}\n"],"mappings":";;;AAQA,SAAgB,sBAAsB,QAAgB;AACpD,KAAI,OAAO,WAAW,eAAe,OAAO,OAAO,SAAS,WAC1D;AAEF,KAAI;AACF,SAAO,KAAK,QAAQ,UAAU,sBAAsB;SAEhD;;AAKR,SAAgB,6BAA6B,SAA8C;AACzF,KAAI,CAAC,MAAM,QAAQ,QAAQ,CACzB,QAAO,EAAE;AAEX,QAAO,QACJ,KAAK,WAAW;AACf,MAAI,CAAC,UAAU,OAAO,WAAW,SAC/B,QAAO;EAET,MAAM,eAAe;EACrB,MAAM,MAAM,OAAO,aAAa,QAAQ,WAAW,aAAa,IAAI,MAAM,GAAG;AAC7E,MAAI,CAAC,IACH,QAAO;AAET,SAAO;GACL;GACA,MAAM,aAAa,SAAS,UAAU,UAAU;GAChD,QAAQ,OAAO,aAAa,WAAW,WAAW,aAAa,SAAS;GACzE;GACD,CACD,QAAQ,SAA2C,QAAQ,KAAK,CAAC;;AAGtE,SAAgB,0BAA0B,KAAa;CAErD,MAAM,SAASA,WAAc;AAC7B,KAAI,OAAO,WAAW,YAAY;EAChC,MAAM,QAAS,OAAsC,IAAI;AACzD,SAAO,OAAO,UAAU,YAAY,MAAM,MAAM,GAAG,MAAM,MAAM,GAAG;;AAEpE,KAAI,OAAO,WAAW,YAAY,OAAO,MAAM,CAC7C,QAAO,OAAO,MAAM;AAEtB,KAAI,UAAU,OAAO,WAAW,UAAU;EACxC,MAAM,QAAS,OAAmC;AAClD,SAAO,OAAO,UAAU,YAAY,MAAM,MAAM,GAAG,MAAM,MAAM,GAAG;;AAEpE,QAAO;;AAGT,SAAgB,gBAAgB,UAAkB,WAAW,IAAI;AAC/D,KAAI,OAAO,aAAa,eAAe,CAAC,SAAS,KAC/C;AAEF,KAAI;EACF,MAAM,OAAO,SAAS,cAAc,IAAI;AACxC,OAAK,aAAa,QAAQ,SAAS;AACnC,OAAK,aAAa,YAAY,SAAS;AACvC,OAAK,aAAa,SAAS,eAAe;AAC1C,WAAS,KAAK,OAAO,KAAK;AAC1B,OAAK,SAAS;AACd,MAAI,KAAK,WACP,MAAK,WAAW,YAAY,KAAK;SAG/B"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"picker.mjs","names":[],"sources":["../../../../src/runtime/polyfill/mediaApi/picker.ts"],"sourcesContent":["import {\n callMiniProgramAsyncFailure,\n callMiniProgramAsyncSuccess,\n} from '../async'\nimport {\n normalizeChooseFileExtensions,\n normalizeChooseMessageFile,\n normalizeChooseMessageFileCount,\n normalizeChooseMessageFileType,\n pickChooseFileFiles,\n pickChooseMessageFiles,\n} from '../filePicker'\nimport {\n normalizeChooseImageCount,\n normalizeChooseImageFile,\n normalizeChooseMediaCount,\n normalizeChooseMediaFile,\n normalizeChooseMediaTypes,\n pickChooseImageFiles,\n pickChooseMediaFiles,\n} from '../mediaPicker'\nimport {\n normalizeChooseVideoFile,\n pickChooseVideoFile,\n} from '../mediaProcess'\n\nexport async function chooseImageBridge(options?: any) {\n const count = normalizeChooseImageCount(options?.count)\n try {\n const files = await pickChooseImageFiles(count)\n const tempFiles = files.map(file => normalizeChooseImageFile(file))\n const tempFilePaths = tempFiles.map(item => item.path)\n return callMiniProgramAsyncSuccess(options, {\n errMsg: 'chooseImage:ok',\n tempFilePaths,\n tempFiles,\n })\n }\n catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n const failure = callMiniProgramAsyncFailure(options, `chooseImage:fail ${message}`)\n return Promise.reject(failure)\n }\n}\n\nexport async function chooseMediaBridge(options?: any) {\n const count = normalizeChooseMediaCount(options?.count)\n const types = normalizeChooseMediaTypes(options?.mediaType)\n try {\n const files = await pickChooseMediaFiles(count, types)\n const tempFiles = files.map(file => normalizeChooseMediaFile(file))\n const defaultType = types.has('video') && !types.has('image') ? 'video' : 'image'\n return callMiniProgramAsyncSuccess(options, {\n errMsg: 'chooseMedia:ok',\n type: tempFiles[0]?.fileType ?? defaultType,\n tempFiles,\n })\n }\n catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n const failure = callMiniProgramAsyncFailure(options, `chooseMedia:fail ${message}`)\n return Promise.reject(failure)\n }\n}\n\nexport async function chooseVideoBridge(options?: any) {\n try {\n const file = await pickChooseVideoFile()\n if (!file) {\n throw new TypeError('no file selected')\n }\n const normalized = normalizeChooseVideoFile(file)\n if (!normalized) {\n throw new TypeError('selected file is not a video')\n }\n return callMiniProgramAsyncSuccess(options, {\n errMsg: 'chooseVideo:ok',\n ...normalized,\n })\n }\n catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n const failure = callMiniProgramAsyncFailure(options, `chooseVideo:fail ${message}`)\n return Promise.reject(failure)\n }\n}\n\nexport async function chooseMessageFileBridge(options?: any) {\n const count = normalizeChooseMessageFileCount(options?.count)\n const type = normalizeChooseMessageFileType(options?.type)\n try {\n const files = await pickChooseMessageFiles(count, type)\n const tempFiles = files.map(file => normalizeChooseMessageFile(file))\n return callMiniProgramAsyncSuccess(options, {\n errMsg: 'chooseMessageFile:ok',\n tempFiles,\n })\n }\n catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n const failure = callMiniProgramAsyncFailure(options, `chooseMessageFile:fail ${message}`)\n return Promise.reject(failure)\n }\n}\n\nexport async function chooseFileBridge(options?: any) {\n const count = normalizeChooseMessageFileCount(options?.count)\n const type = normalizeChooseMessageFileType(options?.type)\n const extensions = normalizeChooseFileExtensions(options?.extension)\n try {\n const files = await pickChooseFileFiles(count, type, extensions)\n const tempFiles = files.map(file => normalizeChooseMessageFile(file))\n return callMiniProgramAsyncSuccess(options, {\n errMsg: 'chooseFile:ok',\n tempFiles,\n })\n }\n catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n const failure = callMiniProgramAsyncFailure(options, `chooseFile:fail ${message}`)\n return Promise.reject(failure)\n }\n}\n"],"mappings":";;;;;;AA0BA,eAAsB,kBAAkB,SAAe;CACrD,MAAM,QAAQ,0BAA0B,SAAS,MAAM;AACvD,KAAI;EAEF,MAAM,
|
|
1
|
+
{"version":3,"file":"picker.mjs","names":[],"sources":["../../../../src/runtime/polyfill/mediaApi/picker.ts"],"sourcesContent":["import {\n callMiniProgramAsyncFailure,\n callMiniProgramAsyncSuccess,\n} from '../async'\nimport {\n normalizeChooseFileExtensions,\n normalizeChooseMessageFile,\n normalizeChooseMessageFileCount,\n normalizeChooseMessageFileType,\n pickChooseFileFiles,\n pickChooseMessageFiles,\n} from '../filePicker'\nimport {\n normalizeChooseImageCount,\n normalizeChooseImageFile,\n normalizeChooseMediaCount,\n normalizeChooseMediaFile,\n normalizeChooseMediaTypes,\n pickChooseImageFiles,\n pickChooseMediaFiles,\n} from '../mediaPicker'\nimport {\n normalizeChooseVideoFile,\n pickChooseVideoFile,\n} from '../mediaProcess'\n\nexport async function chooseImageBridge(options?: any) {\n const count = normalizeChooseImageCount(options?.count)\n try {\n const files = await pickChooseImageFiles(count)\n const tempFiles = files.map(file => normalizeChooseImageFile(file))\n const tempFilePaths = tempFiles.map(item => item.path)\n return callMiniProgramAsyncSuccess(options, {\n errMsg: 'chooseImage:ok',\n tempFilePaths,\n tempFiles,\n })\n }\n catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n const failure = callMiniProgramAsyncFailure(options, `chooseImage:fail ${message}`)\n return Promise.reject(failure)\n }\n}\n\nexport async function chooseMediaBridge(options?: any) {\n const count = normalizeChooseMediaCount(options?.count)\n const types = normalizeChooseMediaTypes(options?.mediaType)\n try {\n const files = await pickChooseMediaFiles(count, types)\n const tempFiles = files.map(file => normalizeChooseMediaFile(file))\n const defaultType = types.has('video') && !types.has('image') ? 'video' : 'image'\n return callMiniProgramAsyncSuccess(options, {\n errMsg: 'chooseMedia:ok',\n type: tempFiles[0]?.fileType ?? defaultType,\n tempFiles,\n })\n }\n catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n const failure = callMiniProgramAsyncFailure(options, `chooseMedia:fail ${message}`)\n return Promise.reject(failure)\n }\n}\n\nexport async function chooseVideoBridge(options?: any) {\n try {\n const file = await pickChooseVideoFile()\n if (!file) {\n throw new TypeError('no file selected')\n }\n const normalized = normalizeChooseVideoFile(file)\n if (!normalized) {\n throw new TypeError('selected file is not a video')\n }\n return callMiniProgramAsyncSuccess(options, {\n errMsg: 'chooseVideo:ok',\n ...normalized,\n })\n }\n catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n const failure = callMiniProgramAsyncFailure(options, `chooseVideo:fail ${message}`)\n return Promise.reject(failure)\n }\n}\n\nexport async function chooseMessageFileBridge(options?: any) {\n const count = normalizeChooseMessageFileCount(options?.count)\n const type = normalizeChooseMessageFileType(options?.type)\n try {\n const files = await pickChooseMessageFiles(count, type)\n const tempFiles = files.map(file => normalizeChooseMessageFile(file))\n return callMiniProgramAsyncSuccess(options, {\n errMsg: 'chooseMessageFile:ok',\n tempFiles,\n })\n }\n catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n const failure = callMiniProgramAsyncFailure(options, `chooseMessageFile:fail ${message}`)\n return Promise.reject(failure)\n }\n}\n\nexport async function chooseFileBridge(options?: any) {\n const count = normalizeChooseMessageFileCount(options?.count)\n const type = normalizeChooseMessageFileType(options?.type)\n const extensions = normalizeChooseFileExtensions(options?.extension)\n try {\n const files = await pickChooseFileFiles(count, type, extensions)\n const tempFiles = files.map(file => normalizeChooseMessageFile(file))\n return callMiniProgramAsyncSuccess(options, {\n errMsg: 'chooseFile:ok',\n tempFiles,\n })\n }\n catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n const failure = callMiniProgramAsyncFailure(options, `chooseFile:fail ${message}`)\n return Promise.reject(failure)\n }\n}\n"],"mappings":";;;;;;AA0BA,eAAsB,kBAAkB,SAAe;CACrD,MAAM,QAAQ,0BAA0B,SAAS,MAAM;AACvD,KAAI;EAEF,MAAM,aAAY,MADE,qBAAqB,MAAM,EACvB,KAAI,SAAQ,yBAAyB,KAAK,CAAC;AAEnE,SAAO,4BAA4B,SAAS;GAC1C,QAAQ;GACR,eAHoB,UAAU,KAAI,SAAQ,KAAK,KAGlC;GACb;GACD,CAAC;UAEG,OAAO;EAEZ,MAAM,UAAU,4BAA4B,SAAS,oBADrC,iBAAiB,QAAQ,MAAM,UAAU,OAAO,MAAM,GACa;AACnF,SAAO,QAAQ,OAAO,QAAQ;;;AAIlC,eAAsB,kBAAkB,SAAe;CACrD,MAAM,QAAQ,0BAA0B,SAAS,MAAM;CACvD,MAAM,QAAQ,0BAA0B,SAAS,UAAU;AAC3D,KAAI;EAEF,MAAM,aAAY,MADE,qBAAqB,OAAO,MAAM,EAC9B,KAAI,SAAQ,yBAAyB,KAAK,CAAC;EACnE,MAAM,cAAc,MAAM,IAAI,QAAQ,IAAI,CAAC,MAAM,IAAI,QAAQ,GAAG,UAAU;AAC1E,SAAO,4BAA4B,SAAS;GAC1C,QAAQ;GACR,MAAM,UAAU,IAAI,YAAY;GAChC;GACD,CAAC;UAEG,OAAO;EAEZ,MAAM,UAAU,4BAA4B,SAAS,oBADrC,iBAAiB,QAAQ,MAAM,UAAU,OAAO,MAAM,GACa;AACnF,SAAO,QAAQ,OAAO,QAAQ;;;AAIlC,eAAsB,kBAAkB,SAAe;AACrD,KAAI;EACF,MAAM,OAAO,MAAM,qBAAqB;AACxC,MAAI,CAAC,KACH,OAAM,IAAI,UAAU,mBAAmB;EAEzC,MAAM,aAAa,yBAAyB,KAAK;AACjD,MAAI,CAAC,WACH,OAAM,IAAI,UAAU,+BAA+B;AAErD,SAAO,4BAA4B,SAAS;GAC1C,QAAQ;GACR,GAAG;GACJ,CAAC;UAEG,OAAO;EAEZ,MAAM,UAAU,4BAA4B,SAAS,oBADrC,iBAAiB,QAAQ,MAAM,UAAU,OAAO,MAAM,GACa;AACnF,SAAO,QAAQ,OAAO,QAAQ;;;AAIlC,eAAsB,wBAAwB,SAAe;CAC3D,MAAM,QAAQ,gCAAgC,SAAS,MAAM;CAC7D,MAAM,OAAO,+BAA+B,SAAS,KAAK;AAC1D,KAAI;AAGF,SAAO,4BAA4B,SAAS;GAC1C,QAAQ;GACR,YAHgB,MADE,uBAAuB,OAAO,KAAK,EAC/B,KAAI,SAAQ,2BAA2B,KAAK,CAGzD;GACV,CAAC;UAEG,OAAO;EAEZ,MAAM,UAAU,4BAA4B,SAAS,0BADrC,iBAAiB,QAAQ,MAAM,UAAU,OAAO,MAAM,GACmB;AACzF,SAAO,QAAQ,OAAO,QAAQ;;;AAIlC,eAAsB,iBAAiB,SAAe;CACpD,MAAM,QAAQ,gCAAgC,SAAS,MAAM;CAC7D,MAAM,OAAO,+BAA+B,SAAS,KAAK;CAC1D,MAAM,aAAa,8BAA8B,SAAS,UAAU;AACpE,KAAI;AAGF,SAAO,4BAA4B,SAAS;GAC1C,QAAQ;GACR,YAHgB,MADE,oBAAoB,OAAO,MAAM,WAAW,EACxC,KAAI,SAAQ,2BAA2B,KAAK,CAGzD;GACV,CAAC;UAEG,OAAO;EAEZ,MAAM,UAAU,4BAA4B,SAAS,mBADrC,iBAAiB,QAAQ,MAAM,UAAU,OAAO,MAAM,GACY;AAClF,SAAO,QAAQ,OAAO,QAAQ"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"process.mjs","names":[],"sources":["../../../../src/runtime/polyfill/mediaApi/process.ts"],"sourcesContent":["import {\n callMiniProgramAsyncFailure,\n callMiniProgramAsyncSuccess,\n} from '../async'\nimport { readPresetCompressVideo } from '../mediaInfo'\nimport {\n compressImageByCanvas,\n normalizeCompressImageQuality,\n} from '../mediaProcess'\n\nexport async function compressImageBridge(options?: any) {\n const src = typeof options?.src === 'string' ? options.src.trim() : ''\n if (!src) {\n const failure = callMiniProgramAsyncFailure(options, 'compressImage:fail invalid src')\n return Promise.reject(failure)\n }\n const quality = normalizeCompressImageQuality(options?.quality)\n try {\n const tempFilePath = await compressImageByCanvas(src, quality)\n return callMiniProgramAsyncSuccess(options, {\n errMsg: 'compressImage:ok',\n tempFilePath,\n })\n }\n catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n const failure = callMiniProgramAsyncFailure(options, `compressImage:fail ${message}`)\n return Promise.reject(failure)\n }\n}\n\nexport function compressVideoBridge(options?: any) {\n const src = typeof options?.src === 'string' ? options.src.trim() : ''\n if (!src) {\n const failure = callMiniProgramAsyncFailure(options, 'compressVideo:fail invalid src')\n return Promise.reject(failure)\n }\n const preset = readPresetCompressVideo(src)\n const result = preset ?? {\n tempFilePath: src,\n size: 0,\n duration: 0,\n width: 0,\n height: 0,\n bitrate: 0,\n fps: 0,\n }\n return Promise.resolve(callMiniProgramAsyncSuccess(options, {\n errMsg: 'compressVideo:ok',\n ...result,\n }))\n}\n"],"mappings":";;;;;AAUA,eAAsB,oBAAoB,SAAe;CACvD,MAAM,MAAM,OAAO,SAAS,QAAQ,WAAW,QAAQ,IAAI,MAAM,GAAG;AACpE,KAAI,CAAC,KAAK;EACR,MAAM,UAAU,4BAA4B,SAAS,iCAAiC;AACtF,SAAO,QAAQ,OAAO,QAAQ;;CAEhC,MAAM,UAAU,8BAA8B,SAAS,QAAQ;AAC/D,KAAI;AAEF,SAAO,4BAA4B,SAAS;GAC1C,QAAQ;GACR,
|
|
1
|
+
{"version":3,"file":"process.mjs","names":[],"sources":["../../../../src/runtime/polyfill/mediaApi/process.ts"],"sourcesContent":["import {\n callMiniProgramAsyncFailure,\n callMiniProgramAsyncSuccess,\n} from '../async'\nimport { readPresetCompressVideo } from '../mediaInfo'\nimport {\n compressImageByCanvas,\n normalizeCompressImageQuality,\n} from '../mediaProcess'\n\nexport async function compressImageBridge(options?: any) {\n const src = typeof options?.src === 'string' ? options.src.trim() : ''\n if (!src) {\n const failure = callMiniProgramAsyncFailure(options, 'compressImage:fail invalid src')\n return Promise.reject(failure)\n }\n const quality = normalizeCompressImageQuality(options?.quality)\n try {\n const tempFilePath = await compressImageByCanvas(src, quality)\n return callMiniProgramAsyncSuccess(options, {\n errMsg: 'compressImage:ok',\n tempFilePath,\n })\n }\n catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n const failure = callMiniProgramAsyncFailure(options, `compressImage:fail ${message}`)\n return Promise.reject(failure)\n }\n}\n\nexport function compressVideoBridge(options?: any) {\n const src = typeof options?.src === 'string' ? options.src.trim() : ''\n if (!src) {\n const failure = callMiniProgramAsyncFailure(options, 'compressVideo:fail invalid src')\n return Promise.reject(failure)\n }\n const preset = readPresetCompressVideo(src)\n const result = preset ?? {\n tempFilePath: src,\n size: 0,\n duration: 0,\n width: 0,\n height: 0,\n bitrate: 0,\n fps: 0,\n }\n return Promise.resolve(callMiniProgramAsyncSuccess(options, {\n errMsg: 'compressVideo:ok',\n ...result,\n }))\n}\n"],"mappings":";;;;;AAUA,eAAsB,oBAAoB,SAAe;CACvD,MAAM,MAAM,OAAO,SAAS,QAAQ,WAAW,QAAQ,IAAI,MAAM,GAAG;AACpE,KAAI,CAAC,KAAK;EACR,MAAM,UAAU,4BAA4B,SAAS,iCAAiC;AACtF,SAAO,QAAQ,OAAO,QAAQ;;CAEhC,MAAM,UAAU,8BAA8B,SAAS,QAAQ;AAC/D,KAAI;AAEF,SAAO,4BAA4B,SAAS;GAC1C,QAAQ;GACR,oBAHyB,sBAAsB,KAAK,QAAQ;GAI7D,CAAC;UAEG,OAAO;EAEZ,MAAM,UAAU,4BAA4B,SAAS,sBADrC,iBAAiB,QAAQ,MAAM,UAAU,OAAO,MAAM,GACe;AACrF,SAAO,QAAQ,OAAO,QAAQ;;;AAIlC,SAAgB,oBAAoB,SAAe;CACjD,MAAM,MAAM,OAAO,SAAS,QAAQ,WAAW,QAAQ,IAAI,MAAM,GAAG;AACpE,KAAI,CAAC,KAAK;EACR,MAAM,UAAU,4BAA4B,SAAS,iCAAiC;AACtF,SAAO,QAAQ,OAAO,QAAQ;;CAGhC,MAAM,SADS,wBAAwB,IAClB,IAAI;EACvB,cAAc;EACd,MAAM;EACN,UAAU;EACV,OAAO;EACP,QAAQ;EACR,SAAS;EACT,KAAK;EACN;AACD,QAAO,QAAQ,QAAQ,4BAA4B,SAAS;EAC1D,QAAQ;EACR,GAAG;EACJ,CAAC,CAAC"}
|