minigame-std
Version:
Cross-platform standard library for WeChat minigame and web browsers with unified APIs for crypto, fs, fetch, storage, and more.
1 lines • 19.5 kB
Source Map (JSON)
{"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":"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"}