{"version":3,"file":"event.cjs","names":[],"sources":["../src/macros/env.ts","../src/std/event/mina_event.ts","../src/std/event/web_event.ts","../src/std/event/mod.ts"],"sourcesContent":["/**\n * @internal\n * 小游戏环境宏模块。\n */\n\n/**\n * 小游戏环境宏。\n *\n * 可通过打包工具在 build 时修改，如 esbuild webpack vite 等。\n */\ndeclare const __MINIGAME_STD_MINA__: boolean;\n\n/**\n * 如果在小游戏环境中返回 true，否则返回 false。\n */\nexport const IS_MINA = __MINIGAME_STD_MINA__;\n","/**\n * @internal\n * 小游戏平台的事件监听实现。\n */\n\n/**\n * 添加错误监听器，用于监听微信小游戏中的错误事件。\n * @param listener - 错误事件的回调函数。\n * @returns 返回一个函数，调用该函数可以移除监听器。\n */\nexport function addErrorListener(listener: WechatMinigame.WxOnErrorCallback): () => void {\n    wx.onError(listener);\n\n    return (): void => {\n        wx.offError(listener as unknown as WechatMinigame.WxOffErrorCallback);\n    };\n}\n\n/**\n * 添加未处理的 Promise 拒绝事件监听器。\n * @param listener - 未处理的 Promise 拒绝事件的回调函数。\n * @returns 返回一个函数，调用该函数可以移除监听器。\n */\nexport function addUnhandledrejectionListener(listener: (WechatMinigame.OnUnhandledRejectionCallback)): () => void {\n    wx.onUnhandledRejection(listener);\n\n    return (): void => {\n        wx.offUnhandledRejection(listener);\n    };\n}\n\n/**\n * 添加窗口大小改变事件监听器。\n * @param listener - 窗口大小改变事件的回调函数。\n * @returns 返回一个函数，调用该函数可以移除监听器。\n */\nexport function addResizeListener(listener: WechatMinigame.OnWindowResizeCallback): () => void {\n    wx.onWindowResize(listener);\n\n    return (): void => {\n        wx.offWindowResize(listener);\n    };\n}\n\n/**\n * 添加小游戏回到前台事件监听器。\n * @param listener - 小游戏回到前台事件的回调函数。\n * @param options - 可选配置。\n * @param options.fireImmediately - 是否在注册时立即以当前进入参数回调一次（默认 `false`）。\n * @returns 返回一个函数，调用该函数可以移除监听器。\n */\nexport function addShowListener(\n    listener: WechatMinigame.OnShowCallback,\n    options?: { fireImmediately?: boolean; },\n): () => void {\n    if (options?.fireImmediately) {\n        // 使用 getEnterOptionsSync 获取最新进入参数，语义与 wx.onShow 回调参数一致\n        listener(getEnterOptionsSync());\n    }\n\n    wx.onShow(listener);\n\n    return (): void => {\n        wx.offShow(listener);\n    };\n}\n\n/**\n * 添加小游戏切到后台事件监听器。\n * @param listener - 小游戏切到后台事件的回调函数。\n * @returns 返回一个函数，调用该函数可以移除监听器。\n */\nexport function addHideListener(listener: () => void): () => void {\n    wx.onHide(listener);\n\n    return (): void => {\n        wx.offHide(listener);\n    };\n}\n\n/**\n * 获取小游戏冷启动时的参数。\n * 对应 `wx.getLaunchOptionsSync()`，生命周期内返回值始终不变。\n * @returns 返回冷启动参数。\n */\nexport function getLaunchOptionsSync(): WechatMinigame.LaunchOptionsGame {\n    return wx.getLaunchOptionsSync();\n}\n\n/**\n * 获取小游戏最近一次进入的参数。\n * 对应 `wx.getEnterOptionsSync()`，热启动（切前台）时返回值可能更新。\n * @returns 返回当前进入参数。\n */\nexport function getEnterOptionsSync(): WechatMinigame.EnterOptionsGame {\n    return wx.getEnterOptionsSync();\n}\n","/**\n * @internal\n * Web 平台的事件监听实现。\n */\n\n// #region Internal Variables\n\n// 模块加载时立即计算并缓存，而非 Lazy 延迟到首次调用：\n// 若延迟计算，期间 SPA 路由可能已改变 location.search，缓存的就不是真正的冷启动参数。\nconst launchOptions: WechatMinigame.LaunchOptionsGame = /*#__PURE__*/ (() => {\n    // Web Worker / SSR 等非 DOM 环境下无法获取页面级启动参数\n    if (typeof document === 'undefined') {\n        return {\n            query: {},\n            scene: 0,\n            referrerInfo: {\n                appId: '',\n                extraData: {},\n            },\n        } as WechatMinigame.LaunchOptionsGame;\n    }\n\n    const web = getWebShowOptions();\n    return {\n        query: web.query,\n        scene: web.scene,\n        referrerInfo: {\n            appId: document.referrer,\n            extraData: {},\n        },\n        chatType: web.chatType,\n        shareTicket: web.shareTicket,\n    } as WechatMinigame.LaunchOptionsGame;\n})();\n\n// #endregion\n\n/**\n * 添加错误监听器，用于监听标准的错误事件。\n * @param listener - 错误事件的回调函数。\n * @returns 返回一个函数，调用该函数可以移除监听器。\n */\nexport function addErrorListener(listener: (ev: ErrorEvent) => void): () => void {\n    addEventListener('error', listener);\n\n    return (): void => {\n        removeEventListener('error', listener);\n    };\n}\n\n/**\n * 添加未处理的 Promise 拒绝事件监听器。\n * @param listener - 未处理的 Promise 拒绝事件的回调函数。\n * @returns 返回一个函数，调用该函数可以移除监听器。\n */\nexport function addUnhandledrejectionListener(listener: (ev: PromiseRejectionEvent) => void): () => void {\n    addEventListener('unhandledrejection', listener);\n\n    return (): void => {\n        removeEventListener('unhandledrejection', listener);\n    };\n}\n\n/**\n * 添加窗口大小改变事件监听器。\n * @param listener - 窗口大小改变事件的回调函数。\n * @returns 返回一个函数，调用该函数可以移除监听器。\n */\nexport function addResizeListener(listener: (ev: UIEvent) => void): () => void {\n    addEventListener('resize', listener);\n\n    return (): void => {\n        removeEventListener('resize', listener);\n    };\n}\n\n/**\n * 添加页面回到前台事件监听器。\n * @param listener - 页面回到前台事件的回调函数。\n * @param options - 可选配置。\n * @param options.fireImmediately - 是否在注册时立即以当前进入参数回调一次（默认 `false`）。\n * @returns 返回一个函数，调用该函数可以移除监听器。\n */\nexport function addShowListener(\n    listener: (ev: WechatMinigame.OnShowListenerResult) => void,\n    options?: { fireImmediately?: boolean; },\n): () => void {\n    // Web Worker / SSR 等非 DOM 环境无前台/后台概念，fireImmediately 仍可回调一次\n    if (typeof document === 'undefined') {\n        if (options?.fireImmediately) {\n            listener(getWebShowOptions());\n        }\n        return (): void => { /* noop */ };\n    }\n\n    if (options?.fireImmediately) {\n        listener(getWebShowOptions());\n    }\n\n    const webListener = () => {\n        if (document.visibilityState === 'visible') listener(getWebShowOptions());\n    };\n\n    document.addEventListener('visibilitychange', webListener);\n\n    return (): void => {\n        document.removeEventListener('visibilitychange', webListener);\n    };\n}\n\n/**\n * 添加页面切到后台事件监听器。\n * @param listener - 页面切到后台事件的回调函数。\n * @returns 返回一个函数，调用该函数可以移除监听器。\n */\nexport function addHideListener(listener: () => void): () => void {\n    // Web Worker / SSR 等非 DOM 环境无前台/后台概念\n    if (typeof document === 'undefined') {\n        return (): void => { /* noop */ };\n    }\n\n    const webListener = () => {\n        if (document.visibilityState === 'hidden') listener();\n    };\n\n    document.addEventListener('visibilitychange', webListener);\n\n    return (): void => {\n        document.removeEventListener('visibilitychange', webListener);\n    };\n}\n\n/**\n * 获取页面冷启动时的参数。首次调用时解析并缓存页面 URL 参数，后续调用始终返回缓存值。\n *\n * **注意：** Web 环境下 `hostExtraData` 无实际值，请使用可选链 `?.` 访问。\n *\n * @returns 返回冷启动参数。\n */\nexport function getLaunchOptionsSync(): WechatMinigame.LaunchOptionsGame {\n    return launchOptions;\n}\n\n/**\n * 获取页面当前进入参数。每次调用实时解析当前页面 URL 参数。\n *\n * **注意：** Web 环境下 `apiCategory` 无实际值，请使用可选链 `?.` 访问。\n *\n * @returns 返回当前进入参数。\n */\nexport function getEnterOptionsSync(): WechatMinigame.EnterOptionsGame {\n    return getWebShowOptions() as WechatMinigame.EnterOptionsGame;\n}\n\n// #region Internal Functions\n\nfunction getWebShowOptions(): WechatMinigame.OnShowListenerResult {\n    const hasDocument = typeof document !== 'undefined';\n    const query: Record<string, string> = {};\n\n    // Web Worker / SSR 等非 DOM 环境，或小游戏无 tree-shaking 时 location/URLSearchParams 可能不可用\n    if (hasDocument && typeof location !== 'undefined' && typeof URLSearchParams !== 'undefined') {\n        new URLSearchParams(location.search).forEach((value, key) => {\n            query[key] = value;\n        });\n    }\n\n    return {\n        query,\n        referrerInfo: {\n            appId: hasDocument ? document.referrer : '',\n            extraData: {},\n        },\n        scene: 0,\n    };\n}\n\n// #endregion\n","/**\n * 事件监听模块，提供错误、未处理 Promise 拒绝、窗口大小变化等事件监听功能。\n * @module event\n */\nimport { IS_MINA } from '../../macros/env.ts';\nimport {\n    addErrorListener as minaAddErrorListener,\n    addHideListener as minaAddHideListener,\n    addResizeListener as minaAddResizeListener,\n    addShowListener as minaAddShowListener,\n    addUnhandledrejectionListener as minaAddUnhandledrejectionListener,\n    getEnterOptionsSync as minaGetEnterOptionsSync,\n    getLaunchOptionsSync as minaGetLaunchOptionsSync,\n} from './mina_event.ts';\nimport {\n    addErrorListener as webAddErrorListener,\n    addHideListener as webAddHideListener,\n    addResizeListener as webAddResizeListener,\n    addShowListener as webAddShowListener,\n    addUnhandledrejectionListener as webAddUnhandledrejectionListener,\n    getEnterOptionsSync as webGetEnterOptionsSync,\n    getLaunchOptionsSync as webGetLaunchOptionsSync,\n} from './web_event.ts';\n\n/**\n * 添加错误监听器，用于监听标准的错误事件。\n * @param listener - 错误事件的回调函数。\n * @returns 返回一个函数，调用该函数可以移除监听器。\n * @since 1.0.0\n * @example\n * ```ts\n * const removeListener = addErrorListener((ev) => {\n *     console.error('捕获到错误:', ev.message);\n * });\n *\n * // 移除监听器\n * removeListener();\n * ```\n */\nexport function addErrorListener(listener: (ev: WechatMinigame.ListenerError) => void): () => void {\n    if (IS_MINA) {\n        return minaAddErrorListener(listener);\n    }\n\n    const webListener = (ev: ErrorEvent) => {\n        listener({\n            message: `${ ev.message }${ ev.error?.stack ? `\\n${ ev.error.stack }` : '' }`,\n        });\n    };\n\n    return webAddErrorListener(webListener);\n}\n\n/**\n * 添加未处理的 Promise 拒绝事件监听器。\n * @param listener - 未处理的 Promise 拒绝事件的回调函数。\n * @returns  返回一个函数，调用该函数可以移除监听器。\n * @since 1.0.0\n * @example\n * ```ts\n * const removeListener = addUnhandledrejectionListener((ev) => {\n *     console.error('未处理的 Promise 拒绝:', ev.reason);\n * });\n *\n * // 移除监听器\n * removeListener();\n * ```\n */\nexport function addUnhandledrejectionListener(listener: (ev: Pick<PromiseRejectionEvent, 'reason' | 'promise'>) => void): () => void {\n    return IS_MINA\n        ? minaAddUnhandledrejectionListener(listener as unknown as WechatMinigame.OnUnhandledRejectionCallback)\n        : webAddUnhandledrejectionListener(listener);\n}\n\n/**\n * 添加窗口大小变化监听器。\n * @param listener - 窗口大小变化的回调函数。\n * @returns 返回一个函数，调用该函数可以移除监听器。\n * @since 1.7.0\n * @example\n * ```ts\n * const removeListener = addResizeListener((size) => {\n *     console.log('窗口大小变化:', size.windowWidth, 'x', size.windowHeight);\n * });\n *\n * // 移除监听器\n * removeListener();\n * ```\n */\nexport function addResizeListener(listener: WechatMinigame.OnWindowResizeCallback): () => void {\n    return IS_MINA\n        ? minaAddResizeListener(listener)\n        : webAddResizeListener(ev => {\n            listener({\n                windowWidth: (ev.target as Window).innerWidth,\n                windowHeight: (ev.target as Window).innerHeight,\n            });\n        });\n}\n\n/**\n * 添加游戏回到前台事件监听器。\n * @param listener - 游戏回到前台事件的回调函数。Web 平台无启动参数，回调参数为 `undefined`。\n * @param options - 可选配置。\n * @param options.fireImmediately - 是否在注册时立即以当前进入参数回调一次（默认 `false`）。\n *  设置为 `true` 可实现\"订阅即重放\"模式，\n *  覆盖首次启动和后续切前台场景。\n * @returns 返回一个函数，调用该函数可以移除监听器。\n * @since 2.2.0\n * @example\n * ```ts\n * // 默认：纯事件通知\n * const removeListener = addShowListener((options) => {\n *     console.log('游戏回到前台:', options?.scene);\n * });\n *\n * // 订阅即重放：注册时立即回调 + 后续切前台回调\n * addShowListener((options) => {\n *     console.log('进入参数:', options?.scene);\n * }, { fireImmediately: true });\n *\n * // 移除监听器\n * removeListener();\n * ```\n */\nexport function addShowListener(\n    listener: (ev?: WechatMinigame.OnShowListenerResult) => void,\n    options?: { fireImmediately?: boolean; },\n): () => void {\n    return IS_MINA\n        ? minaAddShowListener(listener, options)\n        : webAddShowListener(listener, options);\n}\n\n/**\n * 添加游戏切到后台事件监听器。\n * @param listener - 游戏切到后台事件的回调函数。Web 平台无事件参数，回调参数为 `undefined`。\n * @returns 返回一个函数，调用该函数可以移除监听器。\n * @since 2.2.0\n * @example\n * ```ts\n * const removeListener = addHideListener(() => {\n *     console.log('游戏切到后台');\n * });\n *\n * // 移除监听器\n * removeListener();\n * ```\n */\nexport function addHideListener(listener: () => void): () => void {\n    return IS_MINA\n        ? minaAddHideListener(listener)\n        : webAddHideListener(listener);\n}\n\n/**\n * 获取小游戏冷启动时的参数。生命周期内返回值始终不变。\n *\n * - 小游戏：对应 `wx.getLaunchOptionsSync()`，包含 `hostExtraData` 等完整字段。\n * - Web：首次调用时解析并缓存页面 URL 参数，后续调用始终返回缓存值，\n *   `hostExtraData` 无实际值。\n *\n * @returns 返回冷启动参数。\n * @since 2.5.0\n * @example\n * ```ts\n * const launchOptions = getLaunchOptionsSync();\n * console.log('冷启动场景值:', launchOptions.scene);\n * console.log('冷启动 query:', launchOptions.query);\n * // 仅小游戏环境有实际值\n * console.log('宿主数据:', launchOptions.hostExtraData?.host_scene);\n * ```\n */\nexport function getLaunchOptionsSync(): WechatMinigame.LaunchOptionsGame {\n    return IS_MINA\n        ? minaGetLaunchOptionsSync()\n        : webGetLaunchOptionsSync();\n}\n\n/**\n * 获取小游戏最近一次进入的参数。热启动（切前台）时返回值可能更新。\n *\n * - 小游戏：对应 `wx.getEnterOptionsSync()`，包含 `apiCategory` 等完整字段。\n * - Web：每次调用实时解析当前页面 URL 参数，`apiCategory` 无实际值。\n *\n * @returns 返回当前进入参数。\n * @since 2.5.0\n * @example\n * ```ts\n * const enterOptions = getEnterOptionsSync();\n * console.log('当前场景值:', enterOptions.scene);\n * console.log('当前 query:', enterOptions.query);\n * // 仅小游戏环境有实际值，Web 为 undefined\n * console.log('API 类别:', enterOptions.apiCategory);\n * ```\n */\nexport function getEnterOptionsSync(): WechatMinigame.EnterOptionsGame {\n    return IS_MINA\n        ? minaGetEnterOptionsSync()\n        : webGetEnterOptionsSync();\n}\n"],"mappings":";;;;;AAeA,MAAa,UAAU;;;;;;;;;;;;ACLvB,SAAgB,mBAAiB,UAAwD;CACrF,GAAG,QAAQ,QAAQ;CAEnB,aAAmB;EACf,GAAG,SAAS,QAAwD;CACxE;AACJ;;;;;;AAOA,SAAgB,gCAA8B,UAAqE;CAC/G,GAAG,qBAAqB,QAAQ;CAEhC,aAAmB;EACf,GAAG,sBAAsB,QAAQ;CACrC;AACJ;;;;;;AAOA,SAAgB,oBAAkB,UAA6D;CAC3F,GAAG,eAAe,QAAQ;CAE1B,aAAmB;EACf,GAAG,gBAAgB,QAAQ;CAC/B;AACJ;;;;;;;;AASA,SAAgB,kBACZ,UACA,SACU;CACV,IAAI,SAAS,iBAET,SAAS,sBAAoB,CAAC;CAGlC,GAAG,OAAO,QAAQ;CAElB,aAAmB;EACf,GAAG,QAAQ,QAAQ;CACvB;AACJ;;;;;;AAOA,SAAgB,kBAAgB,UAAkC;CAC9D,GAAG,OAAO,QAAQ;CAElB,aAAmB;EACf,GAAG,QAAQ,QAAQ;CACvB;AACJ;;;;;;AAOA,SAAgB,yBAAyD;CACrE,OAAO,GAAG,qBAAqB;AACnC;;;;;;AAOA,SAAgB,wBAAuD;CACnE,OAAO,GAAG,oBAAoB;AAClC;;;;;;;ACvFA,MAAM,gBAAgE,qBAAO;CAEzE,IAAI,OAAO,aAAa,aACpB,OAAO;EACH,OAAO,CAAC;EACR,OAAO;EACP,cAAc;GACV,OAAO;GACP,WAAW,CAAC;EAChB;CACJ;CAGJ,MAAM,MAAM,kBAAkB;CAC9B,OAAO;EACH,OAAO,IAAI;EACX,OAAO,IAAI;EACX,cAAc;GACV,OAAO,SAAS;GAChB,WAAW,CAAC;EAChB;EACA,UAAU,IAAI;EACd,aAAa,IAAI;CACrB;AACJ,EAAA,CAAG;;;;;;AASH,SAAgB,mBAAiB,UAAgD;CAC7E,iBAAiB,SAAS,QAAQ;CAElC,aAAmB;EACf,oBAAoB,SAAS,QAAQ;CACzC;AACJ;;;;;;AAOA,SAAgB,gCAA8B,UAA2D;CACrG,iBAAiB,sBAAsB,QAAQ;CAE/C,aAAmB;EACf,oBAAoB,sBAAsB,QAAQ;CACtD;AACJ;;;;;;AAOA,SAAgB,oBAAkB,UAA6C;CAC3E,iBAAiB,UAAU,QAAQ;CAEnC,aAAmB;EACf,oBAAoB,UAAU,QAAQ;CAC1C;AACJ;;;;;;;;AASA,SAAgB,kBACZ,UACA,SACU;CAEV,IAAI,OAAO,aAAa,aAAa;EACjC,IAAI,SAAS,iBACT,SAAS,kBAAkB,CAAC;EAEhC,aAAmB,CAAa;CACpC;CAEA,IAAI,SAAS,iBACT,SAAS,kBAAkB,CAAC;CAGhC,MAAM,oBAAoB;EACtB,IAAI,SAAS,oBAAoB,WAAW,SAAS,kBAAkB,CAAC;CAC5E;CAEA,SAAS,iBAAiB,oBAAoB,WAAW;CAEzD,aAAmB;EACf,SAAS,oBAAoB,oBAAoB,WAAW;CAChE;AACJ;;;;;;AAOA,SAAgB,kBAAgB,UAAkC;CAE9D,IAAI,OAAO,aAAa,aACpB,aAAmB,CAAa;CAGpC,MAAM,oBAAoB;EACtB,IAAI,SAAS,oBAAoB,UAAU,SAAS;CACxD;CAEA,SAAS,iBAAiB,oBAAoB,WAAW;CAEzD,aAAmB;EACf,SAAS,oBAAoB,oBAAoB,WAAW;CAChE;AACJ;;;;;;;;AASA,SAAgB,yBAAyD;CACrE,OAAO;AACX;;;;;;;;AASA,SAAgB,wBAAuD;CACnE,OAAO,kBAAkB;AAC7B;AAIA,SAAS,oBAAyD;CAC9D,MAAM,cAAc,OAAO,aAAa;CACxC,MAAM,QAAgC,CAAC;CAGvC,IAAI,eAAe,OAAO,aAAa,eAAe,OAAO,oBAAoB,aAC7E,IAAI,gBAAgB,SAAS,MAAM,CAAC,CAAC,SAAS,OAAO,QAAQ;EACzD,MAAM,OAAO;CACjB,CAAC;CAGL,OAAO;EACH;EACA,cAAc;GACV,OAAO,cAAc,SAAS,WAAW;GACzC,WAAW,CAAC;EAChB;EACA,OAAO;CACX;AACJ;;;;;;;;;;;;;;;;;;;;;;ACxIA,SAAgB,iBAAiB,UAAkE;CAC/F,IAAI,SACA,OAAO,mBAAqB,QAAQ;CAGxC,MAAM,eAAe,OAAmB;EACpC,SAAS,EACL,SAAS,GAAI,GAAG,UAAY,GAAG,OAAO,QAAQ,KAAM,GAAG,MAAM,UAAW,KAC5E,CAAC;CACL;CAEA,OAAO,mBAAoB,WAAW;AAC1C;;;;;;;;;;;;;;;;AAiBA,SAAgB,8BAA8B,UAAuF;CACjI,OAAO,UACD,gCAAkC,QAAkE,IACpG,gCAAiC,QAAQ;AACnD;;;;;;;;;;;;;;;;AAiBA,SAAgB,kBAAkB,UAA6D;CAC3F,OAAO,UACD,oBAAsB,QAAQ,IAC9B,qBAAqB,OAAM;EACzB,SAAS;GACL,aAAc,GAAG,OAAkB;GACnC,cAAe,GAAG,OAAkB;EACxC,CAAC;CACL,CAAC;AACT;;;;;;;;;;;;;;;;;;;;;;;;;;AA2BA,SAAgB,gBACZ,UACA,SACU;CACV,OAAO,UACD,kBAAoB,UAAU,OAAO,IACrC,kBAAmB,UAAU,OAAO;AAC9C;;;;;;;;;;;;;;;;AAiBA,SAAgB,gBAAgB,UAAkC;CAC9D,OAAO,UACD,kBAAoB,QAAQ,IAC5B,kBAAmB,QAAQ;AACrC;;;;;;;;;;;;;;;;;;;AAoBA,SAAgB,uBAAyD;CACrE,OAAO,UACD,uBAAyB,IACzB,uBAAwB;AAClC;;;;;;;;;;;;;;;;;;AAmBA,SAAgB,sBAAuD;CACnE,OAAO,UACD,sBAAwB,IACxB,sBAAuB;AACjC"}