minigame-std
Version:
Cross-platform standard library for WeChat minigame and web browsers with unified APIs for crypto, fs, fetch, storage, and more.
376 lines (375 loc) • 11.8 kB
JavaScript
//#region src/macros/env.ts
/**
* 如果在小游戏环境中返回 true,否则返回 false。
*/
const IS_MINA = __MINIGAME_STD_MINA__;
//#endregion
//#region src/std/event/mina_event.ts
/**
* @internal
* 小游戏平台的事件监听实现。
*/
/**
* 添加错误监听器,用于监听微信小游戏中的错误事件。
* @param listener - 错误事件的回调函数。
* @returns 返回一个函数,调用该函数可以移除监听器。
*/
function addErrorListener$2(listener) {
wx.onError(listener);
return () => {
wx.offError(listener);
};
}
/**
* 添加未处理的 Promise 拒绝事件监听器。
* @param listener - 未处理的 Promise 拒绝事件的回调函数。
* @returns 返回一个函数,调用该函数可以移除监听器。
*/
function addUnhandledrejectionListener$2(listener) {
wx.onUnhandledRejection(listener);
return () => {
wx.offUnhandledRejection(listener);
};
}
/**
* 添加窗口大小改变事件监听器。
* @param listener - 窗口大小改变事件的回调函数。
* @returns 返回一个函数,调用该函数可以移除监听器。
*/
function addResizeListener$2(listener) {
wx.onWindowResize(listener);
return () => {
wx.offWindowResize(listener);
};
}
/**
* 添加小游戏回到前台事件监听器。
* @param listener - 小游戏回到前台事件的回调函数。
* @param options - 可选配置。
* @param options.fireImmediately - 是否在注册时立即以当前进入参数回调一次(默认 `false`)。
* @returns 返回一个函数,调用该函数可以移除监听器。
*/
function addShowListener$2(listener, options) {
if (options?.fireImmediately) listener(getEnterOptionsSync$2());
wx.onShow(listener);
return () => {
wx.offShow(listener);
};
}
/**
* 添加小游戏切到后台事件监听器。
* @param listener - 小游戏切到后台事件的回调函数。
* @returns 返回一个函数,调用该函数可以移除监听器。
*/
function addHideListener$2(listener) {
wx.onHide(listener);
return () => {
wx.offHide(listener);
};
}
/**
* 获取小游戏冷启动时的参数。
* 对应 `wx.getLaunchOptionsSync()`,生命周期内返回值始终不变。
* @returns 返回冷启动参数。
*/
function getLaunchOptionsSync$2() {
return wx.getLaunchOptionsSync();
}
/**
* 获取小游戏最近一次进入的参数。
* 对应 `wx.getEnterOptionsSync()`,热启动(切前台)时返回值可能更新。
* @returns 返回当前进入参数。
*/
function getEnterOptionsSync$2() {
return wx.getEnterOptionsSync();
}
//#endregion
//#region src/std/event/web_event.ts
/**
* @internal
* Web 平台的事件监听实现。
*/
const launchOptions = /*#__PURE__*/ (() => {
if (typeof document === "undefined") return {
query: {},
scene: 0,
referrerInfo: {
appId: "",
extraData: {}
}
};
const web = getWebShowOptions();
return {
query: web.query,
scene: web.scene,
referrerInfo: {
appId: document.referrer,
extraData: {}
},
chatType: web.chatType,
shareTicket: web.shareTicket
};
})();
/**
* 添加错误监听器,用于监听标准的错误事件。
* @param listener - 错误事件的回调函数。
* @returns 返回一个函数,调用该函数可以移除监听器。
*/
function addErrorListener$1(listener) {
addEventListener("error", listener);
return () => {
removeEventListener("error", listener);
};
}
/**
* 添加未处理的 Promise 拒绝事件监听器。
* @param listener - 未处理的 Promise 拒绝事件的回调函数。
* @returns 返回一个函数,调用该函数可以移除监听器。
*/
function addUnhandledrejectionListener$1(listener) {
addEventListener("unhandledrejection", listener);
return () => {
removeEventListener("unhandledrejection", listener);
};
}
/**
* 添加窗口大小改变事件监听器。
* @param listener - 窗口大小改变事件的回调函数。
* @returns 返回一个函数,调用该函数可以移除监听器。
*/
function addResizeListener$1(listener) {
addEventListener("resize", listener);
return () => {
removeEventListener("resize", listener);
};
}
/**
* 添加页面回到前台事件监听器。
* @param listener - 页面回到前台事件的回调函数。
* @param options - 可选配置。
* @param options.fireImmediately - 是否在注册时立即以当前进入参数回调一次(默认 `false`)。
* @returns 返回一个函数,调用该函数可以移除监听器。
*/
function addShowListener$1(listener, options) {
if (typeof document === "undefined") {
if (options?.fireImmediately) listener(getWebShowOptions());
return () => {};
}
if (options?.fireImmediately) listener(getWebShowOptions());
const webListener = () => {
if (document.visibilityState === "visible") listener(getWebShowOptions());
};
document.addEventListener("visibilitychange", webListener);
return () => {
document.removeEventListener("visibilitychange", webListener);
};
}
/**
* 添加页面切到后台事件监听器。
* @param listener - 页面切到后台事件的回调函数。
* @returns 返回一个函数,调用该函数可以移除监听器。
*/
function addHideListener$1(listener) {
if (typeof document === "undefined") return () => {};
const webListener = () => {
if (document.visibilityState === "hidden") listener();
};
document.addEventListener("visibilitychange", webListener);
return () => {
document.removeEventListener("visibilitychange", webListener);
};
}
/**
* 获取页面冷启动时的参数。首次调用时解析并缓存页面 URL 参数,后续调用始终返回缓存值。
*
* **注意:** Web 环境下 `hostExtraData` 无实际值,请使用可选链 `?.` 访问。
*
* @returns 返回冷启动参数。
*/
function getLaunchOptionsSync$1() {
return launchOptions;
}
/**
* 获取页面当前进入参数。每次调用实时解析当前页面 URL 参数。
*
* **注意:** Web 环境下 `apiCategory` 无实际值,请使用可选链 `?.` 访问。
*
* @returns 返回当前进入参数。
*/
function getEnterOptionsSync$1() {
return getWebShowOptions();
}
function getWebShowOptions() {
const hasDocument = typeof document !== "undefined";
const query = {};
if (hasDocument && typeof location !== "undefined" && typeof URLSearchParams !== "undefined") new URLSearchParams(location.search).forEach((value, key) => {
query[key] = value;
});
return {
query,
referrerInfo: {
appId: hasDocument ? document.referrer : "",
extraData: {}
},
scene: 0
};
}
//#endregion
//#region src/std/event/mod.ts
/**
* 事件监听模块,提供错误、未处理 Promise 拒绝、窗口大小变化等事件监听功能。
* @module event
*/
/**
* 添加错误监听器,用于监听标准的错误事件。
* @param listener - 错误事件的回调函数。
* @returns 返回一个函数,调用该函数可以移除监听器。
* @since 1.0.0
* @example
* ```ts
* const removeListener = addErrorListener((ev) => {
* console.error('捕获到错误:', ev.message);
* });
*
* // 移除监听器
* removeListener();
* ```
*/
function addErrorListener(listener) {
if (IS_MINA) return addErrorListener$2(listener);
const webListener = (ev) => {
listener({ message: `${ev.message}${ev.error?.stack ? `\n${ev.error.stack}` : ""}` });
};
return addErrorListener$1(webListener);
}
/**
* 添加未处理的 Promise 拒绝事件监听器。
* @param listener - 未处理的 Promise 拒绝事件的回调函数。
* @returns 返回一个函数,调用该函数可以移除监听器。
* @since 1.0.0
* @example
* ```ts
* const removeListener = addUnhandledrejectionListener((ev) => {
* console.error('未处理的 Promise 拒绝:', ev.reason);
* });
*
* // 移除监听器
* removeListener();
* ```
*/
function addUnhandledrejectionListener(listener) {
return IS_MINA ? addUnhandledrejectionListener$2(listener) : addUnhandledrejectionListener$1(listener);
}
/**
* 添加窗口大小变化监听器。
* @param listener - 窗口大小变化的回调函数。
* @returns 返回一个函数,调用该函数可以移除监听器。
* @since 1.7.0
* @example
* ```ts
* const removeListener = addResizeListener((size) => {
* console.log('窗口大小变化:', size.windowWidth, 'x', size.windowHeight);
* });
*
* // 移除监听器
* removeListener();
* ```
*/
function addResizeListener(listener) {
return IS_MINA ? addResizeListener$2(listener) : addResizeListener$1((ev) => {
listener({
windowWidth: ev.target.innerWidth,
windowHeight: ev.target.innerHeight
});
});
}
/**
* 添加游戏回到前台事件监听器。
* @param listener - 游戏回到前台事件的回调函数。Web 平台无启动参数,回调参数为 `undefined`。
* @param options - 可选配置。
* @param options.fireImmediately - 是否在注册时立即以当前进入参数回调一次(默认 `false`)。
* 设置为 `true` 可实现"订阅即重放"模式,
* 覆盖首次启动和后续切前台场景。
* @returns 返回一个函数,调用该函数可以移除监听器。
* @since 2.2.0
* @example
* ```ts
* // 默认:纯事件通知
* const removeListener = addShowListener((options) => {
* console.log('游戏回到前台:', options?.scene);
* });
*
* // 订阅即重放:注册时立即回调 + 后续切前台回调
* addShowListener((options) => {
* console.log('进入参数:', options?.scene);
* }, { fireImmediately: true });
*
* // 移除监听器
* removeListener();
* ```
*/
function addShowListener(listener, options) {
return IS_MINA ? addShowListener$2(listener, options) : addShowListener$1(listener, options);
}
/**
* 添加游戏切到后台事件监听器。
* @param listener - 游戏切到后台事件的回调函数。Web 平台无事件参数,回调参数为 `undefined`。
* @returns 返回一个函数,调用该函数可以移除监听器。
* @since 2.2.0
* @example
* ```ts
* const removeListener = addHideListener(() => {
* console.log('游戏切到后台');
* });
*
* // 移除监听器
* removeListener();
* ```
*/
function addHideListener(listener) {
return IS_MINA ? addHideListener$2(listener) : addHideListener$1(listener);
}
/**
* 获取小游戏冷启动时的参数。生命周期内返回值始终不变。
*
* - 小游戏:对应 `wx.getLaunchOptionsSync()`,包含 `hostExtraData` 等完整字段。
* - Web:首次调用时解析并缓存页面 URL 参数,后续调用始终返回缓存值,
* `hostExtraData` 无实际值。
*
* @returns 返回冷启动参数。
* @since 2.5.0
* @example
* ```ts
* const launchOptions = getLaunchOptionsSync();
* console.log('冷启动场景值:', launchOptions.scene);
* console.log('冷启动 query:', launchOptions.query);
* // 仅小游戏环境有实际值
* console.log('宿主数据:', launchOptions.hostExtraData?.host_scene);
* ```
*/
function getLaunchOptionsSync() {
return IS_MINA ? getLaunchOptionsSync$2() : getLaunchOptionsSync$1();
}
/**
* 获取小游戏最近一次进入的参数。热启动(切前台)时返回值可能更新。
*
* - 小游戏:对应 `wx.getEnterOptionsSync()`,包含 `apiCategory` 等完整字段。
* - Web:每次调用实时解析当前页面 URL 参数,`apiCategory` 无实际值。
*
* @returns 返回当前进入参数。
* @since 2.5.0
* @example
* ```ts
* const enterOptions = getEnterOptionsSync();
* console.log('当前场景值:', enterOptions.scene);
* console.log('当前 query:', enterOptions.query);
* // 仅小游戏环境有实际值,Web 为 undefined
* console.log('API 类别:', enterOptions.apiCategory);
* ```
*/
function getEnterOptionsSync() {
return IS_MINA ? getEnterOptionsSync$2() : getEnterOptionsSync$1();
}
//#endregion
export { addErrorListener, addHideListener, addResizeListener, addShowListener, addUnhandledrejectionListener, getEnterOptionsSync, getLaunchOptionsSync };
//# sourceMappingURL=event.mjs.map