{"version":3,"file":"storage.cjs","names":[],"sources":["../src/macros/env.ts","../src/std/storage/mina_storage.ts","../src/std/storage/web_storage.ts","../src/std/storage/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\nimport { RESULT_VOID, type AsyncIOResult, type AsyncVoidIOResult, type IOResult, type VoidIOResult } from 'happy-rusty';\nimport { asyncIOResultify, syncIOResultify } from '../utils/mod.ts';\n\n/**\n * 异步设置存储项。\n * @param key - 存储键名。\n * @param data - 要存储的字符串数据。\n * @returns 返回操作结果。\n */\nexport async function setItem(key: string, data: string): AsyncVoidIOResult {\n    const setRes = await asyncIOResultify(wx.setStorage)({\n        key,\n        data,\n    });\n\n    return setRes.and(RESULT_VOID);\n}\n\n/**\n * 异步获取存储项。\n * @param key - 存储键名。\n * @returns 返回存储的字符串数据。\n */\nexport async function getItem(key: string): AsyncIOResult<string> {\n    const getRes = await asyncIOResultify(wx.getStorage<string>)({\n        key,\n    });\n\n    return getRes.map(x => x.data);\n}\n\n/**\n * 异步移除存储项。\n * @param key - 要移除的存储键名。\n * @returns 返回操作结果。\n */\nexport async function removeItem(key: string): AsyncVoidIOResult {\n    const removeRes = await asyncIOResultify(wx.removeStorage)({\n        key,\n    });\n\n    return removeRes.and(RESULT_VOID);\n}\n\n/**\n * 异步清空所有存储数据。\n * @returns 返回操作结果。\n */\nexport async function clear(): AsyncVoidIOResult {\n    const clearRes = await asyncIOResultify(wx.clearStorage)();\n\n    return clearRes.and(RESULT_VOID);\n}\n\n/**\n * 异步获取存储项数量。\n * @returns 返回存储项的数量。\n */\nexport async function getLength(): AsyncIOResult<number> {\n    const getRes = await getStorageKeys();\n\n    return getRes.map(x => x.length);\n}\n\n/**\n * 异步检查存储项是否存在。\n * @param key - 要检查的存储键名。\n * @returns 返回是否存在的布尔值。\n */\nexport async function hasItem(key: string): AsyncIOResult<boolean> {\n    const getRes = await getStorageKeys();\n\n    return getRes.map(x => x.includes(key));\n}\n\n/**\n * 同步设置存储项。\n * @param key - 存储键名。\n * @param data - 要存储的字符串数据。\n * @returns 返回操作结果。\n */\nexport function setItemSync(key: string, data: string): VoidIOResult {\n    return syncIOResultify(wx.setStorageSync)(key, data);\n}\n\n/**\n * 同步获取存储项。\n * @param key - 存储键名。\n * @returns 返回存储的字符串数据。\n */\nexport function getItemSync(key: string): IOResult<string> {\n    return syncIOResultify(wx.getStorageSync<string>)(key);\n}\n\n/**\n * 同步移除存储项。\n * @param key - 要移除的存储键名。\n * @returns 返回操作结果。\n */\nexport function removeItemSync(key: string): VoidIOResult {\n    return syncIOResultify(wx.removeStorageSync)(key);\n}\n\n/**\n * 同步清空所有存储数据。\n * @returns 返回操作结果。\n */\nexport function clearSync(): VoidIOResult {\n    return syncIOResultify(wx.clearStorageSync)();\n}\n\n/**\n * 同步获取存储项数量。\n * @returns 返回存储项的数量。\n */\nexport function getLengthSync(): IOResult<number> {\n    return getStorageKeysSync()\n        .map(x => x.length);\n}\n\n/**\n * 同步检查存储项是否存在。\n * @param key - 要检查的存储键名。\n * @returns 返回是否存在的布尔值。\n */\nexport function hasItemSync(key: string): IOResult<boolean> {\n    return getStorageKeysSync()\n        .map(x => x.includes(key));\n}\n\n// #region Internal Functions\n\n/**\n * 获取所有存储键名。\n */\nasync function getStorageKeys(): AsyncIOResult<string[]> {\n    const getRes = await asyncIOResultify(wx.getStorageInfo)();\n\n    return getRes.map(x => x.keys);\n}\n\n/**\n * 同步获取所有存储键名。\n */\nfunction getStorageKeysSync(): IOResult<string[]> {\n    return syncIOResultify(wx.getStorageInfoSync)()\n        .map(x => x.keys);\n}\n\n// #endregion","/**\n * @internal\n * Web 平台的存储操作实现。\n */\n\nimport { Err, Ok, RESULT_VOID, tryResult, type IOResult, type VoidIOResult } from 'happy-rusty';\n\n/**\n * 设置存储项。\n * @param key - 存储键名。\n * @param data - 要存储的字符串数据。\n * @returns 返回操作结果。\n */\nexport function setItem(key: string, data: string): VoidIOResult {\n    return tryResult(() => {\n        // 可能会抛出异常，例如存储空间不足等情况\n        localStorage.setItem(key, data);\n    });\n}\n\n/**\n * 获取存储项。\n * @param key - 存储键名。\n * @returns 返回存储的字符串数据，若不存在则返回错误。\n */\nexport function getItem(key: string): IOResult<string> {\n    const data = localStorage.getItem(key);\n    return data == null ? Err(new Error(`Key '${key}' does not exist`)) : Ok(data);\n}\n\n/**\n * 移除存储项。\n * @param key - 要移除的存储键名。\n * @returns 返回操作结果。\n */\nexport function removeItem(key: string): VoidIOResult {\n    localStorage.removeItem(key);\n    return RESULT_VOID;\n}\n\n/**\n * 清空所有存储数据。\n * @returns 返回操作结果。\n */\nexport function clear(): VoidIOResult {\n    localStorage.clear();\n    return RESULT_VOID;\n}\n\n/**\n * 获取存储项数量。\n * @returns 返回存储项的数量。\n */\nexport function getLength(): IOResult<number> {\n    return Ok(localStorage.length);\n}\n\n/**\n * 检查存储项是否存在。\n * @param key - 要检查的存储键名。\n * @returns 返回是否存在的布尔值。\n */\nexport function hasItem(key: string): IOResult<boolean> {\n    return Ok(localStorage.getItem(key) != null);\n}\n","/**\n * 本地存储模块，提供同步和异步的键值对存储功能。\n * @module storage\n */\nimport type { AsyncIOResult, AsyncVoidIOResult, IOResult, VoidIOResult } from 'happy-rusty';\nimport { IS_MINA } from '../../macros/env.ts';\nimport { validateString } from '../internal/mod.ts';\nimport {\n    clear as minaClear,\n    clearSync as minaClearSync,\n    getItem as minaGetItem,\n    getItemSync as minaGetItemSync,\n    getLength as minaGetLength,\n    getLengthSync as minaGetLengthSync,\n    hasItem as minaHasItem,\n    hasItemSync as minaHasItemSync,\n    removeItem as minaRemoveItem,\n    removeItemSync as minaRemoveItemSync,\n    setItem as minaSetItem,\n    setItemSync as minaSetItemSync,\n} from './mina_storage.ts';\nimport {\n    clear as webClear,\n    getItem as webGetItem,\n    getLength as webGetLength,\n    hasItem as webHasItem,\n    removeItem as webRemoveItem,\n    setItem as webSetItem,\n} from './web_storage.ts';\n\n/**\n * 将数据存储在本地缓存中。\n * @param key - 数据的键名。\n * @param data - 要存储的数据。\n * @returns 存储操作的异步结果。\n * @since 1.0.0\n * @example\n * ```ts\n * const result = await setItem('username', 'john');\n * if (result.isOk()) {\n *     console.log('存储成功');\n * }\n * ```\n */\nexport async function setItem(key: string, data: string): AsyncVoidIOResult {\n    const keyRes = validateString(key, 'key');\n    if (keyRes.isErr()) return keyRes;\n\n    const dataRes = validateString(data, 'data');\n    if (dataRes.isErr()) return dataRes;\n\n    return IS_MINA\n        ? minaSetItem(key, data)\n        : webSetItem(key, data);\n}\n\n/**\n * 从本地缓存中读取数据。\n * @param key - 数据的键名。\n * @returns 包含数据的异步结果，如果不存在则返回空字符串。\n * @since 1.0.0\n * @example\n * ```ts\n * const result = await getItem('username');\n * if (result.isOk()) {\n *     console.log('用户名:', result.unwrap());\n * }\n * ```\n */\nexport async function getItem(key: string): AsyncIOResult<string> {\n    const keyRes = validateString(key, 'key');\n    if (keyRes.isErr()) return keyRes.asErr();\n\n    return IS_MINA\n        ? minaGetItem(key)\n        : webGetItem(key);\n}\n\n/**\n * 从本地缓存中移除指定的数据。\n * @param key - 数据的键名。\n * @returns 移除操作的异步结果。\n * @since 1.0.0\n * @example\n * ```ts\n * const result = await removeItem('username');\n * if (result.isOk()) {\n *     console.log('移除成功');\n * }\n * ```\n */\nexport async function removeItem(key: string): AsyncVoidIOResult {\n    const keyRes = validateString(key, 'key');\n    if (keyRes.isErr()) return keyRes;\n\n    return IS_MINA\n        ? minaRemoveItem(key)\n        : webRemoveItem(key);\n}\n\n/**\n * 清除所有的本地存储数据。\n * @returns 清除操作的异步结果。\n * @since 1.0.0\n * @example\n * ```ts\n * const result = await clear();\n * if (result.isOk()) {\n *     console.log('所有数据已清除');\n * }\n * ```\n */\nexport function clear(): AsyncVoidIOResult {\n    return IS_MINA\n        ? minaClear()\n        : Promise.resolve(webClear());\n}\n\n/**\n * 获取本地存储数据的项数。\n * @returns 包含存储项数的异步结果。\n * @since 1.2.0\n * @example\n * ```ts\n * const result = await getLength();\n * if (result.isOk()) {\n *     console.log('存储项数:', result.unwrap());\n * }\n * ```\n */\nexport function getLength(): AsyncIOResult<number> {\n    return IS_MINA\n        ? minaGetLength()\n        : Promise.resolve(webGetLength());\n}\n\n/**\n * 检查本地存储中是否存在指定的数据。\n * @param key - 数据的键名。\n * @returns 包含是否存在的布尔值的异步结果。\n * @since 1.9.3\n * @example\n * ```ts\n * const result = await hasItem('username');\n * if (result.isOk() && result.unwrap()) {\n *     console.log('键存在');\n * }\n * ```\n */\nexport async function hasItem(key: string): AsyncIOResult<boolean> {\n    const keyRes = validateString(key, 'key');\n    if (keyRes.isErr()) return keyRes.asErr();\n\n    return IS_MINA\n        ? minaHasItem(key)\n        : webHasItem(key);\n}\n\n/**\n * `setItem` 的同步版本，将数据存储在本地缓存中。\n * @param key - 数据的键名。\n * @param data - 要存储的数据。\n * @returns 存储操作的结果。\n * @since 1.0.0\n * @example\n * ```ts\n * const result = setItemSync('username', 'john');\n * if (result.isOk()) {\n *     console.log('存储成功');\n * }\n * ```\n */\nexport function setItemSync(key: string, data: string): VoidIOResult {\n    const keyRes = validateString(key, 'key');\n    if (keyRes.isErr()) return keyRes;\n\n    const dataRes = validateString(data, 'data');\n    if (dataRes.isErr()) return dataRes;\n\n    return (IS_MINA ? minaSetItemSync : webSetItem)(key, data);\n}\n\n/**\n * `getItem` 的同步版本，从本地缓存中读取数据。\n * @param key - 数据的键名。\n * @returns 包含数据的操作结果。\n * @since 1.0.0\n * @example\n * ```ts\n * const result = getItemSync('username');\n * if (result.isOk()) {\n *     console.log('用户名:', result.unwrap());\n * }\n * ```\n */\nexport function getItemSync(key: string): IOResult<string> {\n    const keyRes = validateString(key, 'key');\n    if (keyRes.isErr()) return keyRes.asErr();\n\n    return (IS_MINA ? minaGetItemSync : webGetItem)(key);\n}\n\n/**\n * `removeItem` 的同步版本，从本地缓存中移除指定的数据。\n * @param key - 数据的键名。\n * @returns 移除操作的结果。\n * @since 1.0.0\n * @example\n * ```ts\n * const result = removeItemSync('username');\n * if (result.isOk()) {\n *     console.log('移除成功');\n * }\n * ```\n */\nexport function removeItemSync(key: string): VoidIOResult {\n    const keyRes = validateString(key, 'key');\n    if (keyRes.isErr()) return keyRes;\n\n    return (IS_MINA ? minaRemoveItemSync : webRemoveItem)(key);\n}\n\n/**\n * `clear` 的同步版本，清除所有的本地存储数据。\n * @returns 清除操作的结果。\n * @since 1.0.0\n * @example\n * ```ts\n * const result = clearSync();\n * if (result.isOk()) {\n *     console.log('所有数据已清除');\n * }\n * ```\n */\nexport function clearSync(): VoidIOResult {\n    return (IS_MINA ? minaClearSync : webClear)();\n}\n\n/**\n * `getLength` 的同步版本，获取本地存储数据的项数。\n * @returns 包含存储项数的操作结果。\n * @since 1.2.0\n * @example\n * ```ts\n * const result = getLengthSync();\n * if (result.isOk()) {\n *     console.log('存储项数:', result.unwrap());\n * }\n * ```\n */\nexport function getLengthSync(): IOResult<number> {\n    return (IS_MINA ? minaGetLengthSync : webGetLength)();\n}\n\n/**\n * `hasItem` 的同步版本，检查本地存储中是否存在指定的数据。\n * @param key - 数据的键名。\n * @returns 包含是否存在的布尔值的操作结果。\n * @since 1.9.3\n * @example\n * ```ts\n * const result = hasItemSync('username');\n * if (result.isOk() && result.unwrap()) {\n *     console.log('键存在');\n * }\n * ```\n */\nexport function hasItemSync(key: string): IOResult<boolean> {\n    const keyRes = validateString(key, 'key');\n    if (keyRes.isErr()) return keyRes.asErr();\n\n    return (IS_MINA ? minaHasItemSync : webHasItem)(key);\n}\n"],"mappings":"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"}