@inpageedit/core 0.16.0 → 0.17.0

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.
Files changed (51) hide show
  1. package/dist/InPageEdit.js +2 -2
  2. package/dist/{PluginImagesUsed-BVyvFA1_.js → PluginImagesUsed-CD7t5kqv.js} +2 -2
  3. package/dist/{PluginImagesUsed-BVyvFA1_.js.map → PluginImagesUsed-CD7t5kqv.js.map} +1 -1
  4. package/dist/{PluginPrefSync-CUKkx4Qk.js → PluginPrefSync-DgKVDgiK.js} +2 -2
  5. package/dist/{PluginPrefSync-CUKkx4Qk.js.map → PluginPrefSync-DgKVDgiK.js.map} +1 -1
  6. package/dist/{PluginStoreApp-CoOAw1fr.js → PluginStoreApp-BwiAYQMA.js} +2 -2
  7. package/dist/{PluginStoreApp-CoOAw1fr.js.map → PluginStoreApp-BwiAYQMA.js.map} +1 -1
  8. package/dist/{PluginTemplatesUsed-CdjT1wR4.js → PluginTemplatesUsed-CmYn48Wd.js} +2 -2
  9. package/dist/{PluginTemplatesUsed-CdjT1wR4.js.map → PluginTemplatesUsed-CmYn48Wd.js.map} +1 -1
  10. package/dist/core.js +2 -2
  11. package/dist/{index-BYlcHc-O.js → index-5DLUhCA3.js} +3 -3
  12. package/dist/{index-BYlcHc-O.js.map → index-5DLUhCA3.js.map} +1 -1
  13. package/dist/{index-CVCy0wPP.js → index-B5UcAL5E.js} +2 -2
  14. package/dist/{index-CVCy0wPP.js.map → index-B5UcAL5E.js.map} +1 -1
  15. package/dist/{index-CAtPo7xJ.js → index-BMd6Bo6r.js} +101 -113
  16. package/dist/{index-CAtPo7xJ.js.map → index-BMd6Bo6r.js.map} +1 -1
  17. package/dist/{index-1tsXE6ax.js → index-BTLjDVvD.js} +2 -2
  18. package/dist/{index-1tsXE6ax.js.map → index-BTLjDVvD.js.map} +1 -1
  19. package/dist/{index-QnWieXQc.js → index-BfW7ObKf.js} +719 -638
  20. package/dist/index-BfW7ObKf.js.map +1 -0
  21. package/dist/{index-NWWeW3tX.js → index-BvHXETfl.js} +2 -2
  22. package/dist/{index-NWWeW3tX.js.map → index-BvHXETfl.js.map} +1 -1
  23. package/dist/index-C0spLL-i.js +1661 -0
  24. package/dist/index-C0spLL-i.js.map +1 -0
  25. package/dist/{index-bQ0CVu3l.js → index-C2_G8gLW.js} +3 -3
  26. package/dist/{index-bQ0CVu3l.js.map → index-C2_G8gLW.js.map} +1 -1
  27. package/dist/{index-Dm2vgYkZ.js → index-C4ncbyR6.js} +2 -2
  28. package/dist/{index-Dm2vgYkZ.js.map → index-C4ncbyR6.js.map} +1 -1
  29. package/dist/{index-BPTMltVf.js → index-CZ56EKIK.js} +2 -2
  30. package/dist/{index-BPTMltVf.js.map → index-CZ56EKIK.js.map} +1 -1
  31. package/dist/{index-ygc4AMy4.js → index-Cjyf3z1w.js} +3 -3
  32. package/dist/{index-ygc4AMy4.js.map → index-Cjyf3z1w.js.map} +1 -1
  33. package/dist/{index-C4qm_X_A.js → index-Dfp9Vp36.js} +2 -2
  34. package/dist/{index-C4qm_X_A.js.map → index-Dfp9Vp36.js.map} +1 -1
  35. package/dist/{index-B32tFyLB.js → index-s7aFr-gn.js} +3 -3
  36. package/dist/{index-B32tFyLB.js.map → index-s7aFr-gn.js.map} +1 -1
  37. package/dist/{index-DZa9mxN4.js → index-siZBRSp0.js} +2 -2
  38. package/dist/{index-DZa9mxN4.js.map → index-siZBRSp0.js.map} +1 -1
  39. package/dist/index.d.ts +37414 -1356
  40. package/dist/index.js +2 -2
  41. package/dist/models/index.js +1 -1
  42. package/dist/plugins/index.js +12 -12
  43. package/dist/services/index.js +14 -12
  44. package/dist/style.css +1 -1
  45. package/lib/index.umd.js +20 -20
  46. package/lib/index.umd.js.map +1 -1
  47. package/lib/style.css +1 -1
  48. package/package.json +14 -14
  49. package/dist/index-CYfkwXRf.js +0 -1631
  50. package/dist/index-CYfkwXRf.js.map +0 -1
  51. package/dist/index-QnWieXQc.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-C0spLL-i.js","sources":["../../../node_modules/.pnpm/fexios@6.1.1/node_modules/fexios/dist/shared/fexios.DtQgiOCE.mjs","../../../node_modules/.pnpm/fexios@6.1.1/node_modules/fexios/dist/utils/index.mjs","../../../node_modules/.pnpm/fexios@6.1.1/node_modules/fexios/dist/shared/fexios.B-14qd8n.mjs","../../../node_modules/.pnpm/fexios@6.1.1/node_modules/fexios/dist/shared/fexios.TxSvO_qH.mjs","../../../node_modules/.pnpm/fexios@6.1.1/node_modules/fexios/dist/shared/fexios.DFl5Gol9.mjs","../../../node_modules/.pnpm/fexios@6.1.1/node_modules/fexios/dist/models/index.mjs","../../../node_modules/.pnpm/fexios@6.1.1/node_modules/fexios/dist/fexios.mjs","../../../node_modules/.pnpm/fexios@6.1.1/node_modules/fexios/dist/index.mjs","../../../node_modules/.pnpm/wiki-saikou@7.5.0/node_modules/wiki-saikou/dist/shared/wiki-saikou._bdNL3q3.mjs","../src/models/MemoryStorage.ts","../src/models/WikiPage/index.ts","../src/models/WikiTitle/index.ts"],"sourcesContent":["function clone(value) {\n if (typeof globalThis.structuredClone === \"function\") {\n try {\n return globalThis.structuredClone(value);\n } catch {\n }\n }\n return _structuredClone(value, /* @__PURE__ */ new WeakMap());\n}\nfunction _structuredClone(value, seen) {\n if (typeof value !== \"object\" || value === null) return value;\n const cached = seen.get(value);\n if (cached) return cached;\n if (value instanceof Date) return new Date(value.getTime());\n if (value instanceof RegExp)\n return new RegExp(value.source, value.flags);\n if (value instanceof URL) return new URL(value.toString());\n if (value instanceof URLSearchParams)\n return new URLSearchParams(value.toString());\n if (value instanceof ArrayBuffer) return value.slice(0);\n if (ArrayBuffer.isView(value)) {\n if (value instanceof DataView) {\n return new DataView(\n value.buffer.slice(0),\n value.byteOffset,\n value.byteLength\n );\n }\n const ta = value;\n const Ctor = ta.constructor;\n return new Ctor(ta.buffer.slice(0), ta.byteOffset, ta.length);\n }\n if (value instanceof Map) {\n const out2 = /* @__PURE__ */ new Map();\n seen.set(value, out2);\n value.forEach((v, k) => {\n out2.set(_structuredClone(k, seen), _structuredClone(v, seen));\n });\n return out2;\n }\n if (value instanceof Set) {\n const out2 = /* @__PURE__ */ new Set();\n seen.set(value, out2);\n value.forEach((v) => out2.add(_structuredClone(v, seen)));\n return out2;\n }\n if (Array.isArray(value)) {\n const arr = new Array(value.length);\n seen.set(value, arr);\n for (let i = 0; i < arr.length; i++) {\n arr[i] = _structuredClone(value[i], seen);\n }\n return arr;\n }\n const proto = Object.getPrototypeOf(value);\n const out = Object.create(proto);\n seen.set(value, out);\n const descriptors = Object.getOwnPropertyDescriptors(value);\n for (const key of Reflect.ownKeys(descriptors)) {\n const d = descriptors[key];\n if (\"value\" in d) {\n d.value = _structuredClone(d.value, seen);\n }\n Object.defineProperty(out, key, d);\n }\n return out;\n}\n\nfunction isPlainObject(payload) {\n if (typeof payload !== \"object\" || payload === null) {\n return false;\n }\n const proto = Object.getPrototypeOf(payload);\n return proto === Object.prototype || proto === null;\n}\n\nexport { clone as c, isPlainObject as i };\n//# sourceMappingURL=fexios.DtQgiOCE.mjs.map\n","import { c as clone, i as isPlainObject } from '../shared/fexios.DtQgiOCE.mjs';\n\nconst CallableInstanceImpl = function(property) {\n const proto = this.constructor.prototype;\n const func = Reflect.get(proto, property, proto);\n function apply(...args) {\n return Reflect.apply(func, apply, args);\n }\n Reflect.setPrototypeOf(apply, proto);\n for (const key of Reflect.ownKeys(func)) {\n const desc = Reflect.getOwnPropertyDescriptor(func, key);\n if (desc) Reflect.defineProperty(apply, key, desc);\n }\n return apply;\n};\nCallableInstanceImpl.prototype = Object.create(Function.prototype);\nconst CallableInstance = CallableInstanceImpl;\n\nfunction deepMerge(obj, ...incomes) {\n const result = clone(obj || {});\n for (const inc of incomes) {\n if (inc == null) continue;\n for (const key of Reflect.ownKeys(inc)) {\n const nextVal = inc[key];\n if (typeof nextVal === \"undefined\") continue;\n if (nextVal === null) {\n delete result[key];\n continue;\n }\n const prevVal = result[key];\n if (isPlainObject(prevVal) && isPlainObject(nextVal)) {\n result[key] = deepMerge(prevVal, nextVal);\n } else {\n result[key] = clone(nextVal);\n }\n }\n }\n return result;\n}\n\nexport { CallableInstance, clone, deepMerge, isPlainObject };\n//# sourceMappingURL=index.mjs.map\n","var FexiosErrorCodes = /* @__PURE__ */ ((FexiosErrorCodes2) => {\n FexiosErrorCodes2[\"BODY_USED\"] = \"BODY_USED\";\n FexiosErrorCodes2[\"NO_BODY_READER\"] = \"NO_BODY_READER\";\n FexiosErrorCodes2[\"TIMEOUT\"] = \"TIMEOUT\";\n FexiosErrorCodes2[\"NETWORK_ERROR\"] = \"NETWORK_ERROR\";\n FexiosErrorCodes2[\"BODY_NOT_ALLOWED\"] = \"BODY_NOT_ALLOWED\";\n FexiosErrorCodes2[\"HOOK_CONTEXT_CHANGED\"] = \"HOOK_CONTEXT_CHANGED\";\n FexiosErrorCodes2[\"ABORTED_BY_HOOK\"] = \"ABORTED_BY_HOOK\";\n FexiosErrorCodes2[\"INVALID_HOOK_CALLBACK\"] = \"INVALID_HOOK_CALLBACK\";\n FexiosErrorCodes2[\"UNEXPECTED_HOOK_RETURN\"] = \"UNEXPECTED_HOOK_RETURN\";\n FexiosErrorCodes2[\"UNSUPPORTED_RESPONSE_TYPE\"] = \"UNSUPPORTED_RESPONSE_TYPE\";\n FexiosErrorCodes2[\"FEATURE_MOVED_TO_PLUGIN\"] = \"FEATURE_MOVED_TO_PLUGIN\";\n FexiosErrorCodes2[\"BODY_TRANSFORM_ERROR\"] = \"BODY_TRANSFORM_ERROR\";\n return FexiosErrorCodes2;\n})(FexiosErrorCodes || {});\nclass FexiosError extends Error {\n constructor(code, message, context, options) {\n super(message, options);\n this.code = code;\n this.context = context;\n }\n name = \"FexiosError\";\n static is(e, code) {\n if (!(e instanceof FexiosError) || e instanceof FexiosResponseError) {\n return false;\n }\n return code ? e.code === code : true;\n }\n}\nclass FexiosResponseError extends FexiosError {\n constructor(message, response, options) {\n super(response.statusText, message, void 0, options);\n this.response = response;\n }\n name = \"FexiosResponseError\";\n static is(e) {\n return e instanceof FexiosResponseError;\n }\n}\nconst isFexiosError = (e) => {\n return FexiosError.is(e);\n};\n\nexport { FexiosErrorCodes as F, FexiosError as a, FexiosResponseError as b, isFexiosError as i };\n//# sourceMappingURL=fexios.B-14qd8n.mjs.map\n","import { i as isPlainObject, c as clone } from './fexios.DtQgiOCE.mjs';\n\nvar FexiosQueryBuilder;\n((FexiosQueryBuilder2) => {\n FexiosQueryBuilder2.makeSearchParams = (params) => {\n if (!params) {\n return new URLSearchParams();\n }\n if (params instanceof URLSearchParams) {\n return params;\n }\n if (typeof params !== \"object\" || params?.constructor !== Object) {\n throw new TypeError(\"only plain object is supported\");\n }\n const sp = new URLSearchParams();\n const appendValue = (k, v) => {\n if (v === void 0 || v === null) return;\n sp.append(k, v);\n };\n const setValue = (k, v) => {\n if (v === void 0 || v === null) return;\n sp.set(k, v);\n };\n const handleNested = (prefix, val) => {\n if (val === void 0 || val === null) return;\n if (Array.isArray(val)) {\n for (const item of val) appendValue(prefix, item?.toString());\n return;\n }\n if (typeof val === \"object\" && val.constructor === Object) {\n for (const [k, v] of Object.entries(val)) {\n if (v === void 0 || v === null) continue;\n const isBracketArrayKey = k.endsWith(\"[]\");\n const cleanKey = isBracketArrayKey ? k.slice(0, -2) : k;\n const nextPrefix = `${prefix}[${cleanKey}]`;\n if (isBracketArrayKey) {\n const arrayKey = `${nextPrefix}[]`;\n if (Array.isArray(v)) {\n for (const item of v) appendValue(arrayKey, item?.toString());\n } else if (typeof v === \"object\" && v !== null && v.constructor === Object) {\n handleNested(`${nextPrefix}[]`, v);\n } else {\n appendValue(arrayKey, v?.toString());\n }\n } else {\n if (Array.isArray(v)) {\n for (const item of v) appendValue(nextPrefix, item?.toString());\n } else if (typeof v === \"object\" && v !== null && v.constructor === Object) {\n handleNested(nextPrefix, v);\n } else {\n setValue(nextPrefix, v?.toString());\n }\n }\n }\n return;\n }\n setValue(prefix, val?.toString());\n };\n for (const [key, value] of Object.entries(params)) {\n handleNested(key, value);\n }\n return sp;\n };\n FexiosQueryBuilder2.makeQueryString = (query) => {\n return (0, FexiosQueryBuilder2.makeSearchParams)(query).toString();\n };\n FexiosQueryBuilder2.makeURL = (url, params, hash, base) => {\n const fallbackBase = typeof window !== \"undefined\" && window.location?.origin || \"http://localhost\";\n const u = typeof url === \"string\" ? new URL(url, base ?? fallbackBase) : new URL(url);\n const existingParams = (0, FexiosQueryBuilder2.toQueryRecord)(u.searchParams);\n const mergedRecord = (0, FexiosQueryBuilder2.mergeQueries)(existingParams, params || {});\n const mergedParams = (0, FexiosQueryBuilder2.makeSearchParams)(mergedRecord);\n u.search = mergedParams.toString();\n if (typeof hash !== \"undefined\") u.hash = hash;\n return u;\n };\n FexiosQueryBuilder2.toQueryRecord = (input) => {\n if (typeof input === \"string\") {\n input = (0, FexiosQueryBuilder2.fromString)(input);\n }\n const output = {};\n const parseKey = (key) => {\n if (!key.includes(\"[\")) return { path: [key], forceArray: false };\n const base = key.slice(0, key.indexOf(\"[\"));\n const parts = [base];\n const re = /\\[([^\\]]*)\\]/g;\n let m;\n let forceArray = false;\n let lastWasEmpty = false;\n while (m = re.exec(key)) {\n if (m[1] === \"\") {\n forceArray = true;\n lastWasEmpty = true;\n } else {\n parts.push(m[1]);\n lastWasEmpty = false;\n }\n }\n if (forceArray && lastWasEmpty) {\n parts[parts.length - 1] = parts[parts.length - 1] + \"[]\";\n }\n return { path: parts, forceArray };\n };\n const setDeep = (obj, path, value, forceArray) => {\n let cur = obj;\n for (let i = 0; i < path.length; i++) {\n const k = path[i];\n const last = i === path.length - 1;\n if (last) {\n if (forceArray) {\n if (cur[k] === void 0) cur[k] = [value];\n else if (Array.isArray(cur[k])) cur[k].push(value);\n else cur[k] = [cur[k], value];\n } else {\n if (cur[k] === void 0) cur[k] = value;\n else if (Array.isArray(cur[k])) cur[k].push(value);\n else cur[k] = [cur[k], value];\n }\n } else {\n if (cur[k] === void 0 || typeof cur[k] !== \"object\" || Array.isArray(cur[k])) {\n cur[k] = {};\n }\n cur = cur[k];\n }\n }\n };\n for (const [rawKey, val] of input.entries()) {\n const { path, forceArray } = parseKey(String(rawKey));\n setDeep(output, path, val?.toString(), forceArray);\n }\n return output;\n };\n FexiosQueryBuilder2.fromString = (s) => {\n const t = s.trim();\n if (!t) return new URLSearchParams();\n if (t.startsWith(\"?\")) return new URLSearchParams(t.slice(1));\n const qIndex = t.indexOf(\"?\");\n if (qIndex >= 0) {\n const hashIndex = t.indexOf(\"#\", qIndex + 1);\n const query = t.slice(qIndex + 1, hashIndex >= 0 ? hashIndex : void 0);\n return new URLSearchParams(query);\n }\n return new URLSearchParams(t);\n };\n FexiosQueryBuilder2.mergeQueries = (...incomes) => {\n const output = {};\n for (const input of incomes) {\n if (input == null) continue;\n mergeOne(output, toPlain(input));\n }\n return output;\n };\n function toPlain(src) {\n if (!src) return {};\n if (src instanceof URLSearchParams || src instanceof FormData || src instanceof Map)\n return (0, FexiosQueryBuilder2.toQueryRecord)(src);\n if (typeof src === \"string\") return (0, FexiosQueryBuilder2.toQueryRecord)((0, FexiosQueryBuilder2.fromString)(src));\n if (isPlainObject(src)) return src;\n throw new TypeError(\n `unsupported type transformation, got: ${Object.prototype.toString.call(\n src\n )}`\n );\n }\n function mergeOne(target, patch) {\n for (const [k, v] of Object.entries(patch)) {\n if (v === void 0) continue;\n if (v === null) {\n delete target[k];\n continue;\n }\n const cur = target[k];\n if (isPlainObject(cur) && isPlainObject(v)) {\n mergeOne(cur, v);\n } else {\n target[k] = clone(v);\n }\n }\n }\n})(FexiosQueryBuilder || (FexiosQueryBuilder = {}));\n\nexport { FexiosQueryBuilder as F };\n//# sourceMappingURL=fexios.TxSvO_qH.mjs.map\n","import { a as FexiosError, F as FexiosErrorCodes, b as FexiosResponseError } from './fexios.B-14qd8n.mjs';\n\nclass FexiosResponse {\n constructor(rawResponse, data, responseType) {\n this.rawResponse = rawResponse;\n this.data = data;\n this.responseType = responseType;\n [\"ok\", \"status\", \"statusText\", \"headers\", \"url\", \"redirected\"].forEach(\n (key) => {\n Reflect.defineProperty(this, key, {\n get: () => rawResponse[key]\n });\n }\n );\n }\n ok;\n status;\n statusText;\n headers;\n url;\n redirected;\n}\nconst concatUint8Arrays = (parts) => {\n const total = parts.reduce((n, p) => n + p.length, 0);\n const out = new Uint8Array(total);\n let off = 0;\n for (const p of parts) {\n out.set(p, off);\n off += p.length;\n }\n return out;\n};\nasync function readBody(stream, contentLength, onProgress) {\n const reader = stream.getReader();\n if (!reader) {\n throw new FexiosError(\n FexiosErrorCodes.NO_BODY_READER,\n \"Failed to get ReadableStream from response body\"\n );\n }\n const chunks = [];\n let received = 0;\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n chunks.push(value);\n received += value.length;\n if (onProgress && contentLength > 0)\n onProgress(received / contentLength, concatUint8Arrays(chunks));\n }\n } finally {\n reader.releaseLock?.();\n }\n const data = concatUint8Arrays(chunks);\n onProgress?.(1, data);\n return data;\n}\nconst guessFexiosResponseType = (contentType) => {\n if (!contentType) return void 0;\n if (contentType.includes(\"application/json\") || contentType.endsWith(\"+json\"))\n return \"json\";\n if (contentType.startsWith(\"text/\")) return \"text\";\n if (contentType.includes(\"multipart/form-data\") || contentType.includes(\"application/x-www-form-urlencoded\"))\n return \"form\";\n if (/^image\\//.test(contentType) || /^video\\//.test(contentType) || /^audio\\//.test(contentType) || contentType.includes(\"application/pdf\"))\n return \"blob\";\n if (contentType.includes(\"application/octet-stream\") || contentType.includes(\"application/zip\") || contentType.includes(\"application/x-tar\") || contentType.includes(\"application/x-7z-compressed\") || contentType.includes(\"application/x-gzip\"))\n return \"arrayBuffer\";\n return void 0;\n};\nasync function createFexiosResponse(rawResponse, expectedType, onProgress, shouldThrow, timeout) {\n const decodeResponse = rawResponse.clone();\n const contentType = rawResponse.headers.get(\"content-type\")?.toLowerCase() ?? \"\";\n const lenHeader = rawResponse.headers.get(\"content-length\");\n const total = lenHeader ? Number(lenHeader) : 0;\n const upgrade = rawResponse.headers.get(\"upgrade\")?.toLowerCase();\n const connection = rawResponse.headers.get(\"connection\")?.toLowerCase();\n if (expectedType === \"ws\" || expectedType === \"stream\") {\n throw new FexiosError(\n FexiosErrorCodes.FEATURE_MOVED_TO_PLUGIN,\n `responseType \"${String(\n expectedType\n )}\" has been moved to plugins. Use \"fexios/plugins\" (fx.plugin(pluginWebSocket) / fx.plugin(pluginSSE)) and call fx.ws()/fx.sse() instead.`\n );\n }\n if (upgrade === \"websocket\" && connection === \"upgrade\") {\n throw new FexiosError(\n FexiosErrorCodes.FEATURE_MOVED_TO_PLUGIN,\n `WebSocket upgrade response detected. WebSocket support has been moved to plugins. Please use \"fexios/plugins\" and call fx.ws().`\n );\n }\n if (contentType.includes(\"text/event-stream\")) {\n throw new FexiosError(\n FexiosErrorCodes.FEATURE_MOVED_TO_PLUGIN,\n `SSE (text/event-stream) response detected. SSE support has been moved to plugins. Please use \"fexios/plugins\" and call fx.sse().`\n );\n }\n let resolvedType = expectedType ?? guessFexiosResponseType(contentType) ?? \"text\";\n const charset = /\\bcharset=([^;]+)/i.exec(contentType)?.[1]?.trim() || \"utf-8\";\n const decoder = new TextDecoder(charset);\n let data;\n try {\n if (resolvedType === \"form\") {\n data = await decodeResponse.formData();\n } else {\n const bytes = await readBody(decodeResponse.body, total, onProgress);\n if (resolvedType === \"arrayBuffer\") {\n data = bytes.buffer.slice(\n bytes.byteOffset,\n bytes.byteOffset + bytes.byteLength\n );\n } else if (resolvedType === \"blob\") {\n data = new Blob([bytes], {\n type: contentType || \"application/octet-stream\"\n });\n } else if (resolvedType === \"text\") {\n const text = decoder.decode(bytes);\n if (!expectedType) {\n const trimmed = text.trim();\n if (trimmed.startsWith(\"{\") && trimmed.endsWith(\"}\") || trimmed.startsWith(\"[\") && trimmed.endsWith(\"]\")) {\n try {\n data = JSON.parse(trimmed);\n resolvedType = \"json\";\n } catch {\n data = text;\n }\n } else {\n data = text;\n }\n } else {\n data = text;\n }\n } else if (resolvedType === \"json\") {\n const text = decoder.decode(bytes);\n data = text.length ? JSON.parse(text) : null;\n } else {\n data = bytes;\n }\n }\n } catch (e) {\n if (!(e instanceof Error)) throw e;\n try {\n const t = await decodeResponse.text();\n data = t;\n resolvedType = \"text\";\n } catch {\n throw new FexiosError(\n FexiosErrorCodes.BODY_TRANSFORM_ERROR,\n `Failed to transform response body to ${resolvedType}`,\n void 0,\n { cause: e }\n );\n }\n }\n const response = new FexiosResponse(\n rawResponse,\n data,\n resolvedType\n );\n const decision = shouldThrow?.(response);\n if (typeof decision === \"boolean\" ? decision : !response.ok) {\n throw new FexiosResponseError(response.statusText, response);\n }\n return response;\n}\n\nexport { FexiosResponse as F, createFexiosResponse as c };\n//# sourceMappingURL=fexios.DFl5Gol9.mjs.map\n","export { a as FexiosError, F as FexiosErrorCodes, b as FexiosResponseError, i as isFexiosError } from '../shared/fexios.B-14qd8n.mjs';\nimport { i as isPlainObject } from '../shared/fexios.DtQgiOCE.mjs';\nexport { F as FexiosQueryBuilder } from '../shared/fexios.TxSvO_qH.mjs';\nexport { F as FexiosResponse, c as createFexiosResponse } from '../shared/fexios.DFl5Gol9.mjs';\n\nvar FexiosHeaderBuilder;\n((FexiosHeaderBuilder2) => {\n FexiosHeaderBuilder2.makeHeaders = (input) => {\n if (!input) return new Headers();\n if (input instanceof Headers) return new Headers(input);\n const h = new Headers();\n if (input instanceof Map) {\n for (const [k, v] of input.entries()) {\n if (v == null) continue;\n if (Array.isArray(v)) {\n for (const item of v) {\n if (item == null) continue;\n h.append(k, String(item));\n }\n } else {\n h.append(k, String(v));\n }\n }\n return h;\n }\n if (isPlainObject(input)) {\n for (const [k, v] of Object.entries(input)) {\n if (v == null) continue;\n if (Array.isArray(v)) {\n for (const item of v) {\n if (item == null) continue;\n h.append(k, String(item));\n }\n } else {\n h.append(k, String(v));\n }\n }\n return h;\n }\n throw new TypeError(\n \"only plain object, Map/ReadonlyMap, or Headers is supported\"\n );\n };\n FexiosHeaderBuilder2.toHeaderRecord = (input) => {\n if (input instanceof Headers) {\n const out = {};\n input.forEach((value, key) => {\n out[key] = out[key] ? [...out[key], value] : [value];\n });\n return out;\n }\n if (input instanceof Map) {\n const output = {};\n for (const [key, raw] of input.entries()) {\n if (raw == null) continue;\n if (Array.isArray(raw)) {\n const arr = raw.filter((v) => v != null).map((v) => String(v));\n if (arr.length) output[key] = (output[key] ?? []).concat(arr);\n } else {\n const v = String(raw);\n output[key] = output[key] ? [...output[key], v] : [v];\n }\n }\n return output;\n }\n throw new TypeError(\n `unsupported type transformation, got: ${Object.prototype.toString.call(\n input\n )}`\n );\n };\n FexiosHeaderBuilder2.mergeHeaders = (...incomes) => {\n const output = new Headers();\n const mergeOneFromObject = (patch) => {\n for (const [k, v] of Object.entries(patch)) {\n if (v === void 0) continue;\n if (v === null) {\n output.delete(k);\n continue;\n }\n if (Array.isArray(v)) {\n output.delete(k);\n for (const item of v) {\n if (item == null) continue;\n output.append(k, String(item));\n }\n } else {\n output.set(k, String(v));\n }\n }\n };\n for (const input of incomes) {\n if (input == null) continue;\n if (input instanceof Headers) {\n input.forEach((value, key) => {\n output.set(key, value);\n });\n continue;\n }\n if (isPlainObject(input)) {\n mergeOneFromObject(input);\n continue;\n }\n const rec = (0, FexiosHeaderBuilder2.toHeaderRecord)(input);\n for (const [key, arr] of Object.entries(rec)) {\n output.delete(key);\n for (const v of arr) output.append(key, v);\n }\n }\n return output;\n };\n})(FexiosHeaderBuilder || (FexiosHeaderBuilder = {}));\n\nexport { FexiosHeaderBuilder };\n//# sourceMappingURL=index.mjs.map\n","import { CallableInstance, deepMerge } from './utils/index.mjs';\nimport { a as FexiosError, F as FexiosErrorCodes } from './shared/fexios.B-14qd8n.mjs';\nimport { FexiosHeaderBuilder } from './models/index.mjs';\nimport { F as FexiosQueryBuilder } from './shared/fexios.TxSvO_qH.mjs';\nimport { c as createFexiosResponse } from './shared/fexios.DFl5Gol9.mjs';\nimport { i as isPlainObject } from './shared/fexios.DtQgiOCE.mjs';\n\nclass Fexios extends CallableInstance {\n static version = \"6.1.1\";\n static FINAL_SYMBOL = Symbol(\"FEXIOS_FINAL_CONTEXT\");\n baseConfigs;\n // for axios compatibility\n get defaults() {\n return this.baseConfigs;\n }\n set defaults(configs) {\n this.baseConfigs = configs;\n }\n static DEFAULT_CONFIGS = {\n baseURL: \"\",\n timeout: 0,\n credentials: void 0,\n headers: {},\n query: {},\n responseType: void 0,\n shouldThrow(response) {\n return !response.ok;\n },\n fetch: globalThis.fetch\n };\n hooks = [];\n static ALL_METHODS = [\n \"get\",\n \"post\",\n \"put\",\n \"patch\",\n \"delete\",\n \"head\",\n \"options\",\n \"trace\"\n ];\n static METHODS_WITHOUT_BODY = [\n \"get\",\n \"head\",\n \"options\",\n \"trace\"\n ];\n constructor(baseConfigs = {}) {\n super(\"request\");\n this.baseConfigs = deepMerge(Fexios.DEFAULT_CONFIGS, baseConfigs);\n Fexios.ALL_METHODS.forEach(\n (m) => this.createMethodShortcut(m.toLowerCase())\n );\n }\n attachLegacyAliases(ctx) {\n const req = () => ctx.request;\n const rt = () => ctx.runtime;\n const define = (k, desc) => {\n try {\n Object.defineProperty(ctx, k, { configurable: true, ...desc });\n } catch {\n }\n };\n define(\"url\", {\n get: () => req().url,\n set: (v) => {\n req().url = v?.toString?.() ?? String(v);\n }\n });\n define(\"method\", {\n get: () => req().method,\n set: (v) => req().method = v\n });\n define(\"headers\", {\n get: () => req().headers,\n set: (v) => req().headers = v\n });\n define(\"query\", { get: () => req().query, set: (v) => req().query = v });\n define(\"body\", { get: () => req().body, set: (v) => req().body = v });\n define(\"baseURL\", {\n get: () => req().baseURL,\n set: (v) => req().baseURL = v\n });\n define(\"timeout\", {\n get: () => req().timeout,\n set: (v) => req().timeout = v\n });\n define(\"credentials\", {\n get: () => req().credentials,\n set: (v) => req().credentials = v\n });\n define(\"cache\", { get: () => req().cache, set: (v) => req().cache = v });\n define(\"mode\", { get: () => req().mode, set: (v) => req().mode = v });\n define(\"fetch\", { get: () => req().fetch, set: (v) => req().fetch = v });\n define(\"shouldThrow\", {\n get: () => req().shouldThrow,\n set: (v) => req().shouldThrow = v\n });\n define(\"responseType\", {\n get: () => req().responseType,\n set: (v) => req().responseType = v\n });\n define(\"abortController\", {\n get: () => rt().abortController,\n set: (v) => rt().abortController = v\n });\n define(\"onProgress\", {\n get: () => rt().onProgress,\n set: (v) => rt().onProgress = v\n });\n define(\"customEnv\", {\n get: () => rt().customEnv,\n set: (v) => rt().customEnv = v\n });\n define(\"rawRequest\", {\n get: () => req().rawRequest,\n set: (v) => req().rawRequest = v\n });\n define(\"data\", {\n get: () => ctx.response ? ctx.response.data : void 0,\n set: (v) => {\n if (ctx.response) ctx.response.data = v;\n }\n });\n }\n finalizeContext(ctx, fallbackURL) {\n const response = ctx.response;\n const rawResponse = response?.rawResponse ?? ctx.rawResponse;\n const req = ctx.request;\n Object.defineProperties(ctx, {\n url: { get: () => rawResponse?.url || fallbackURL },\n data: { get: () => response.data },\n headers: { get: () => rawResponse.headers },\n responseType: { get: () => response.responseType },\n rawRequest: { get: () => req.rawRequest }\n });\n }\n async request(urlOrOptions, options) {\n const thisApp = this;\n let reqInit = options || {};\n if (typeof urlOrOptions === \"string\" || urlOrOptions instanceof URL) {\n reqInit = { ...options || {}, url: urlOrOptions };\n } else if (typeof urlOrOptions === \"object\") {\n reqInit = urlOrOptions;\n }\n const {\n abortController: inputAbortController,\n onProgress,\n customEnv,\n ...requestOnly\n } = reqInit;\n let ctx = {\n get app() {\n return thisApp;\n },\n request: {\n ...requestOnly,\n url: reqInit.url?.toString?.() ?? String(reqInit.url)\n },\n runtime: {\n abortController: inputAbortController,\n onProgress,\n customEnv\n },\n response: void 0,\n rawResponse: void 0,\n // legacy fields are attached via defineProperty\n url: \"\",\n headers: {},\n query: {}\n };\n this.attachLegacyAliases(ctx);\n ctx = await this.emit(\"beforeInit\", ctx);\n if (ctx[Fexios.FINAL_SYMBOL]) return ctx;\n if (\"customEnv\" in this.baseConfigs) {\n ctx.runtime.customEnv = deepMerge(\n {},\n // ensure we don't mutate baseConfigs\n this.baseConfigs.customEnv,\n ctx.runtime.customEnv\n );\n }\n ctx.request = this.applyDefaults(ctx.request);\n if (Fexios.METHODS_WITHOUT_BODY.includes(\n ctx.request.method?.toLocaleLowerCase?.()\n ) && ctx.request.body) {\n throw new FexiosError(\n FexiosErrorCodes.BODY_NOT_ALLOWED,\n `Request method \"${ctx.request.method}\" does not allow body`\n );\n }\n ctx = await this.emit(\"beforeRequest\", ctx);\n if (ctx[Fexios.FINAL_SYMBOL]) return ctx;\n let body;\n const headerAutoPatch = {};\n const req = ctx.request;\n if (typeof req.body !== \"undefined\" && req.body !== null) {\n if (req.body instanceof Blob || req.body instanceof FormData || req.body instanceof URLSearchParams) {\n body = req.body;\n } else if (typeof req.body === \"object\" && req.body !== null) {\n body = JSON.stringify(req.body);\n req.headers = this.mergeHeaders(req.headers, {\n \"Content-Type\": \"application/json\"\n });\n } else {\n body = req.body;\n }\n }\n const optionsHeaders = FexiosHeaderBuilder.makeHeaders(req.headers || {});\n if (!optionsHeaders.get(\"content-type\") && body) {\n if (body instanceof FormData || body instanceof URLSearchParams) {\n headerAutoPatch[\"content-type\"] = null;\n } else if (typeof body === \"string\" && typeof req.body === \"object\") {\n headerAutoPatch[\"content-type\"] = \"application/json\";\n } else if (body instanceof Blob) {\n headerAutoPatch[\"content-type\"] = body.type || \"application/octet-stream\";\n }\n }\n req.body = body;\n ctx = await this.emit(\"afterBodyTransformed\", ctx);\n if (ctx[Fexios.FINAL_SYMBOL]) return ctx;\n const abortController = ctx.runtime.abortController ?? (globalThis.AbortController ? new AbortController() : void 0);\n const fallback = globalThis.location?.href || \"http://localhost\";\n const baseForRequest = new URL(\n ctx.request.baseURL || this.baseConfigs.baseURL || fallback,\n fallback\n );\n const urlObjForRequest = new URL(ctx.request.url, baseForRequest);\n const finalURLForRequest = FexiosQueryBuilder.makeURL(\n urlObjForRequest,\n ctx.request.query,\n urlObjForRequest.hash\n // 保留 hash\n ).toString();\n const rawRequest = new Request(finalURLForRequest, {\n method: ctx.request.method || \"GET\",\n credentials: ctx.request.credentials,\n cache: ctx.request.cache,\n mode: ctx.request.mode,\n headers: FexiosHeaderBuilder.mergeHeaders(\n this.baseConfigs.headers,\n ctx.request.headers || {},\n headerAutoPatch\n ),\n body: ctx.request.body,\n signal: abortController?.signal\n });\n ctx.request.rawRequest = rawRequest;\n ctx = await this.emit(\"beforeActualFetch\", ctx);\n if (ctx[Fexios.FINAL_SYMBOL]) return ctx;\n const timeout = ctx.request.timeout ?? this.baseConfigs.timeout ?? 60 * 1e3;\n const shouldThrow = ctx.request.shouldThrow ?? this.baseConfigs.shouldThrow;\n if (ctx.request.url.startsWith(\"ws\") || ctx.request.responseType === \"ws\") {\n throw new FexiosError(\n FexiosErrorCodes.FEATURE_MOVED_TO_PLUGIN,\n `WebSocket support has been moved to plugins. Use \"fexios/plugins\" and call fx.ws() instead.`,\n ctx\n );\n }\n if (ctx.request.responseType === \"stream\") {\n throw new FexiosError(\n FexiosErrorCodes.FEATURE_MOVED_TO_PLUGIN,\n `SSE support has been moved to plugins. Use \"fexios/plugins\" and call fx.sse() instead.`,\n ctx\n );\n }\n let timer;\n try {\n if (abortController) {\n timer = timeout > 0 ? setTimeout(() => {\n abortController.abort();\n }, timeout) : void 0;\n }\n const fetch = ctx.request.fetch || this.baseConfigs.fetch || globalThis.fetch;\n const rawResponse = await fetch(ctx.request.rawRequest).catch(\n (err) => {\n if (timer) clearTimeout(timer);\n if (abortController?.signal.aborted) {\n throw new FexiosError(\n FexiosErrorCodes.TIMEOUT,\n `Request timed out after ${timeout}ms`,\n ctx\n );\n }\n throw new FexiosError(\n FexiosErrorCodes.NETWORK_ERROR,\n err.message,\n ctx\n );\n }\n );\n if (timer) clearTimeout(timer);\n ctx.rawResponse = rawResponse;\n await this.emit(\"afterRawResponse\", ctx);\n if (ctx[Fexios.FINAL_SYMBOL]) return ctx;\n ctx.response = await createFexiosResponse(\n rawResponse,\n ctx.request.responseType,\n (progress, buffer) => {\n ctx.runtime.onProgress?.(progress, buffer);\n },\n shouldThrow,\n timeout\n );\n ctx.rawResponse = ctx.response.rawResponse;\n this.finalizeContext(ctx, finalURLForRequest);\n return this.emit(\"afterResponse\", ctx);\n } catch (error) {\n if (timer) clearTimeout(timer);\n throw error;\n }\n }\n mergeQueries = FexiosQueryBuilder.mergeQueries;\n mergeHeaders = FexiosHeaderBuilder.mergeHeaders;\n applyDefaults(ctx) {\n const c = ctx;\n const fallback = globalThis.location?.href || \"http://localhost\";\n const effectiveBase = c.baseURL || this.baseConfigs.baseURL || fallback;\n const baseObj = new URL(effectiveBase, fallback);\n const reqURL = new URL(c.url.toString(), baseObj);\n const baseSearchParams = FexiosQueryBuilder.toQueryRecord(\n baseObj.searchParams\n );\n const reqSearchParams = FexiosQueryBuilder.toQueryRecord(\n reqURL.searchParams\n );\n const mergedSearchParams = FexiosQueryBuilder.mergeQueries(\n baseSearchParams,\n reqSearchParams\n );\n reqURL.search = FexiosQueryBuilder.makeSearchParams(mergedSearchParams).toString();\n c.url = reqURL.toString();\n const mergedQuery = FexiosQueryBuilder.mergeQueries(\n this.baseConfigs.query,\n c.query\n );\n if (c.query) {\n this.restoreNulls(mergedQuery, c.query);\n }\n c.query = mergedQuery;\n return c;\n }\n restoreNulls(target, source) {\n if (!source || typeof source !== \"object\") return;\n for (const [k, v] of Object.entries(source)) {\n if (v === null) {\n target[k] = null;\n } else if (isPlainObject(v)) {\n if (!target[k] || typeof target[k] !== \"object\") {\n target[k] = {};\n }\n this.restoreNulls(target[k], v);\n }\n }\n }\n async emit(event, ctx, opts = {\n shouldHandleShortCircuitResponse: true\n }) {\n const hooks = this.hooks.filter((h) => h.event === event);\n if (hooks.length === 0) return ctx;\n const shortCircuit = async (baseCtx, raw) => {\n const finalCtx = baseCtx;\n finalCtx.rawResponse = raw;\n if (!finalCtx.request?.rawRequest) {\n try {\n finalCtx.request.rawRequest = new Request(finalCtx.request.url, {\n method: finalCtx.request.method || \"GET\",\n headers: finalCtx.request.headers,\n body: finalCtx.request.body\n });\n } catch {\n }\n }\n const response = await createFexiosResponse(\n raw,\n baseCtx.request?.responseType,\n (progress, buffer) => baseCtx.runtime?.onProgress?.(progress, buffer),\n baseCtx.request?.shouldThrow ?? this.baseConfigs.shouldThrow,\n baseCtx.request?.timeout ?? this.baseConfigs.timeout ?? 60 * 1e3\n );\n finalCtx.response = response;\n finalCtx.rawResponse = response.rawResponse;\n this.finalizeContext(finalCtx, raw.url || \"\");\n if (event !== \"afterResponse\") {\n const after = await this.emit(\"afterResponse\", finalCtx);\n after[Fexios.FINAL_SYMBOL] = true;\n return after;\n } else {\n finalCtx[Fexios.FINAL_SYMBOL] = true;\n return finalCtx;\n }\n };\n for (let i = 0; i < hooks.length; i++) {\n const hook = hooks[i];\n const hookName = `${String(event)}#${hook.action.name || `anonymous#${i}`}`;\n const marker = Symbol(\"FEXIOS_HOOK_CTX_MARK\");\n try {\n ;\n ctx[marker] = marker;\n } catch {\n }\n const result = await hook.action.call(this, ctx);\n try {\n delete ctx[marker];\n } catch {\n }\n if (result === false) {\n throw new FexiosError(\n FexiosErrorCodes.ABORTED_BY_HOOK,\n `Request aborted by hook \"${hookName}\"`,\n ctx\n );\n }\n if (result instanceof Response) {\n if (opts.shouldHandleShortCircuitResponse !== false) {\n return shortCircuit(ctx, result);\n }\n ctx.rawResponse = result;\n } else if (result && typeof result === \"object\" && result[marker] === marker) {\n ctx = result;\n } else ;\n }\n return ctx;\n }\n on(event, action, prepend = false) {\n if (typeof action !== \"function\") {\n throw new FexiosError(\n FexiosErrorCodes.INVALID_HOOK_CALLBACK,\n `Hook should be a function, but got \"${typeof action}\"`\n );\n }\n this.hooks[prepend ? \"unshift\" : \"push\"]({\n event,\n action\n });\n return this;\n }\n off(event, action) {\n if (event === \"*\" || !event) {\n this.hooks = this.hooks.filter((hook) => hook.action !== action);\n } else {\n this.hooks = this.hooks.filter(\n (hook) => hook.event !== event || hook.action !== action\n );\n }\n return this;\n }\n createInterceptor(event) {\n return {\n handlers: () => this.hooks.filter((hook) => hook.event === event).map((hook) => hook.action),\n use: (hook, prepend = false) => {\n return this.on(event, hook, prepend);\n },\n clear: () => {\n this.hooks = this.hooks.filter((hook) => hook.event !== event);\n }\n };\n }\n interceptors = {\n request: this.createInterceptor(\"beforeRequest\"),\n response: this.createInterceptor(\"afterResponse\")\n };\n createMethodShortcut(method) {\n Reflect.defineProperty(this, method, {\n get: () => {\n return (url, bodyOrQuery, options) => {\n if (Fexios.METHODS_WITHOUT_BODY.includes(\n method.toLocaleLowerCase()\n )) {\n options = bodyOrQuery;\n } else {\n options = options || {};\n options.body = bodyOrQuery;\n }\n return this.request(url, {\n ...options,\n method\n });\n };\n }\n });\n return this;\n }\n extends(configs) {\n const fexios = new Fexios(deepMerge(this.baseConfigs, configs));\n fexios.hooks = [...this.hooks];\n fexios._plugins = new Map(this._plugins);\n fexios._plugins.forEach(async (plugin) => {\n await fexios.plugin(plugin);\n });\n return fexios;\n }\n create = Fexios.create;\n static create(configs) {\n return new Fexios(configs);\n }\n _plugins = /* @__PURE__ */ new Map();\n plugin(plugin) {\n if (typeof plugin?.name === \"string\" && typeof plugin?.install === \"function\") {\n if (this._plugins.has(plugin.name)) {\n return this;\n }\n const fx = plugin.install(this);\n this._plugins.set(plugin.name, plugin);\n if (fx instanceof Fexios) {\n return fx;\n }\n }\n return this;\n }\n uninstall(plugin) {\n if (typeof plugin === \"string\") {\n plugin = this._plugins.get(plugin);\n }\n if (plugin) {\n plugin?.uninstall?.(this);\n this._plugins.delete(plugin.name);\n }\n return this;\n }\n // 版本弃子们.jpg\n /** @deprecated Use `mergeQueries` instead */\n mergeQuery = this.mergeQueries;\n}\n\nexport { Fexios };\n//# sourceMappingURL=fexios.mjs.map\n","import { Fexios } from './fexios.mjs';\nexport { F as FexiosResponse, F as FexiosResponseContext, c as createFexiosResponse } from './shared/fexios.DFl5Gol9.mjs';\nexport { a as FexiosError, F as FexiosErrorCodes, b as FexiosResponseError, i as isFexiosError } from './shared/fexios.B-14qd8n.mjs';\nexport { FexiosHeaderBuilder } from './models/index.mjs';\nexport { F as FexiosQueryBuilder } from './shared/fexios.TxSvO_qH.mjs';\nexport { CallableInstance, deepMerge } from './utils/index.mjs';\nexport { c as clone, i as isPlainObject } from './shared/fexios.DtQgiOCE.mjs';\n\n/**\n * Fexios\n * @desc Fetch based HTTP client with similar API to axios for browser and Node.js\n *\n * @license MIT\n * @author dragon-fish <dragon-fish@qq.com>\n */\nconst createFexios = Fexios.create;\nconst fexios = createFexios();\n\nexport { Fexios, createFexios, fexios as default, fexios };\n//# sourceMappingURL=index.mjs.map\n","import { isPlainObject, Fexios, FexiosQueryBuilder, deepMerge } from 'fexios';\n\nvar MwParamNormalizer;\n((MwParamNormalizer2) => {\n function normalizeParamValue(item) {\n if (Array.isArray(item)) {\n return item.join(\"|\");\n } else if (typeof item === \"boolean\" || item === null) {\n return item ? \"1\" : void 0;\n } else if (typeof item === \"number\") {\n return \"\" + item;\n } else {\n return item;\n }\n }\n MwParamNormalizer2.normalizeParamValue = normalizeParamValue;\n function normalizeBody(body) {\n const isFormLike = (body2) => body2 && (body2 instanceof URLSearchParams || body2 instanceof FormData);\n if (body === void 0 || body === null) {\n return void 0;\n }\n const formData = new FormData();\n if (isFormLike(body)) {\n body.forEach((value, key) => {\n const data = normalizeParamValue(value);\n if (data !== null && data !== void 0) {\n formData.append(key, data);\n }\n });\n return formData;\n }\n if (isPlainObject(body)) {\n Object.entries(body).forEach(([key, value]) => {\n const data = normalizeParamValue(value);\n if (data !== null && data !== void 0) {\n formData.append(key, data);\n }\n });\n return formData;\n }\n return void 0;\n }\n MwParamNormalizer2.normalizeBody = normalizeBody;\n})(MwParamNormalizer || (MwParamNormalizer = {}));\n\nvar WikiSaikouErrorCode = /* @__PURE__ */ ((WikiSaikouErrorCode2) => {\n WikiSaikouErrorCode2[\"HTTP_ERROR\"] = \"HTTP_ERROR\";\n WikiSaikouErrorCode2[\"LOGIN_FAILED\"] = \"LOGIN_FAILED\";\n WikiSaikouErrorCode2[\"LOGIN_RETRY_LIMIT_EXCEEDED\"] = \"LOGIN_RETRY_LIMIT_EXCEEDED\";\n WikiSaikouErrorCode2[\"TOKEN_RETRY_LIMIT_EXCEEDED\"] = \"TOKEN_RETRY_LIMIT_EXCEEDED\";\n return WikiSaikouErrorCode2;\n})(WikiSaikouErrorCode || {});\nclass WikiSaikouError extends Error {\n constructor(code, message = \"\", cause) {\n super();\n this.code = code;\n this.message = message;\n this.cause = cause;\n }\n name = \"WikiSaikouError\";\n static is(data, code) {\n return data instanceof this && (code === void 0 || data.code === code);\n }\n}\nclass MediaWikiApiError extends Error {\n constructor(errors, cause) {\n super();\n this.errors = errors;\n this.cause = cause;\n this.errors = MediaWikiApiError.normalizeErrors(errors);\n this.message = errors.map((error) => error.text).filter(Boolean).join(\"\\n\");\n this.code = this.isBadTokenError() ? \"badtoken\" : this.errors[0]?.code || \"Unknown Error\";\n }\n name = \"MediaWikiApiError\";\n code;\n get firstError() {\n return this.errors[0];\n }\n isBadTokenError() {\n return this.errors.some((error) => error.code === \"badtoken\") || [\"NeedToken\", \"WrongToken\"].includes(this.cause?.data?.login?.result);\n }\n toString() {\n return `[${this.name} ${this.code}]`;\n }\n static is(data) {\n return data instanceof this;\n }\n static normalizeErrors(errors) {\n if (Array.isArray(errors) === false) {\n return [];\n }\n return errors.filter((e) => typeof e === \"object\" && !!e?.code).map((error) => {\n if (!error.text) {\n if (error.info) {\n return { ...error, text: error.info };\n } else if (error[\"*\"]) {\n return { ...error, text: error[\"*\"] };\n } else {\n return { ...error, text: \"\" };\n }\n }\n return error;\n });\n }\n}\n((WikiSaikouError2) => {\n function extractResponseDataFromAny(data) {\n if (data == null) return void 0;\n if (data?.response?.data !== void 0) return data.response.data;\n if (data?.data !== void 0) return data.data;\n const cause = data instanceof Error ? data.cause : void 0;\n if (cause?.response?.data !== void 0) return cause.response.data;\n if (cause?.data !== void 0) return cause.data;\n return data || void 0;\n }\n function includesMediaWikiApiError(data) {\n return extractMediaWikiApiErrors(data).length > 0;\n }\n WikiSaikouError2.includesMediaWikiApiError = includesMediaWikiApiError;\n WikiSaikouError2.normalizeMwApiErrors = MediaWikiApiError.normalizeErrors;\n function extractMediaWikiApiErrors(data) {\n let r = extractResponseDataFromAny(data);\n if (typeof r !== \"object\" || r === null) {\n return [];\n }\n const error = r?.error;\n const errors = r?.errors;\n const result = [];\n if (error) {\n result.push(error);\n }\n if (Array.isArray(errors)) {\n result.push(...errors);\n }\n return (0, WikiSaikouError2.normalizeMwApiErrors)(result);\n }\n WikiSaikouError2.extractMediaWikiApiErrors = extractMediaWikiApiErrors;\n function isBadTokenError(data) {\n if (MediaWikiApiError.is(data)) {\n return data.isBadTokenError();\n } else {\n const errors = extractMediaWikiApiErrors(data);\n return new MediaWikiApiError(errors).isBadTokenError();\n }\n }\n WikiSaikouError2.isBadTokenError = isBadTokenError;\n})(WikiSaikouError || (WikiSaikouError = {}));\n\nconst FEXIOS_SAIKOU_MARKER = Symbol.for(\"__FEXIOS_SAIKOU__\");\n/**\n * FexiosSaikou\n *\n * A pre-configured Fexios instance with MediaWiki-friendly defaults:\n * - MediaWiki-specific request/response params normalization\n * - built-in token management\n * - error handling\n *\n * @author dragon-fish <dragon-fish@qq.com>\n * @license MIT\n *\n * @param {string|URL} payload create a new FexiosSaikou instance with the given baseURL\n * @param {Fexios} payload or make the given Fexios instance a FexiosSaikou instance\n */\nfunction createFexiosSaikou(payload) {\n const instance = payload instanceof Fexios ? payload : new Fexios({\n baseURL: payload instanceof URL ? payload.toString() : String(payload),\n responseType: \"json\"\n });\n if (instance[FEXIOS_SAIKOU_MARKER]) {\n return instance;\n } else {\n Reflect.defineProperty(instance, FEXIOS_SAIKOU_MARKER, {\n get: () => true,\n enumerable: false,\n configurable: false\n });\n }\n instance.on(\"beforeInit\", (ctx) => {\n if (ctx.request.method?.toLowerCase() !== \"post\") {\n return ctx;\n }\n if (ctx.request.body === void 0 || ctx.request.body === null) {\n ctx.request.body = void 0;\n return ctx;\n }\n const body = ctx.request.body = MwParamNormalizer.normalizeBody(\n ctx.request.body\n );\n const query = new URLSearchParams(ctx.request.query);\n if (body.has(\"format\")) {\n query.delete(\"format\");\n }\n if (body.has(\"formatversion\")) {\n query.delete(\"formatversion\");\n }\n if (body.has(\"action\")) {\n query.delete(\"action\");\n }\n if (body.has(\"origin\")) {\n query.set(\"origin\", \"\" + body.get(\"origin\"));\n body.delete(\"origin\");\n }\n ctx.request.query = Object.fromEntries(query.entries());\n return ctx;\n });\n instance.on(\"beforeInit\", (ctx) => {\n ctx.request.query = FexiosQueryBuilder.mergeQueries(\n {},\n MwParamNormalizer.normalizeBody(ctx.request.query)\n );\n return ctx;\n });\n instance.on(\"beforeRequest\", (ctx) => {\n const url = new URL(ctx.request.url);\n const query = FexiosQueryBuilder.mergeQueries(url.searchParams, ctx.query);\n if (globalThis.location) {\n if (!query.origin && location.origin !== url.origin) {\n query.origin = location.origin;\n instance.baseConfigs.credentials = \"include\";\n instance.baseConfigs.mode = \"cors\";\n } else if (location.origin === url.origin) {\n delete query.origin;\n instance.baseConfigs.credentials = void 0;\n instance.baseConfigs.mode = void 0;\n }\n }\n if (query.origin) {\n const origin = encodeURIComponent(query.origin).replace(/\\./g, \"%2E\");\n delete query.origin;\n ctx.request.query = query;\n ctx.request.url = `${url.origin}${url.pathname}?origin=${origin}`;\n } else {\n ctx.request.query = query;\n }\n return ctx;\n });\n instance._tokens = /* @__PURE__ */ new Map();\n instance.on(\"afterResponse\", (ctx) => {\n const { data } = ctx;\n const tokenName = ctx.runtime.customEnv?.mwTokenName;\n if (tokenName && WikiSaikouError.isBadTokenError(data)) {\n instance._tokens.delete(tokenName);\n }\n const tokens = data?.query?.tokens;\n if (tokens && typeof tokens === \"object\") {\n Object.entries(tokens).forEach(([type, token]) => {\n typeof token === \"string\" && instance._tokens.set(type.replace(/token$/i, \"\").toLowerCase(), token);\n });\n }\n const loginToken = data?.login?.token;\n if (typeof loginToken === \"string\") {\n instance._tokens.set(\"login\", loginToken);\n }\n return ctx;\n });\n return instance;\n}\n\nconst resolveLegacyCtor = (configOrBaseURL, defaultOptions, defaultParams) => {\n let config = { ...WikiSaikouCore.DEFAULT_CONFIGS };\n if (typeof configOrBaseURL === \"string\") {\n config = deepMerge(config, {\n baseURL: configOrBaseURL,\n fexiosConfigs: defaultOptions || {},\n defaultParams: defaultParams || {},\n throwOnApiError: false\n // Set a default value for throwOnApiError\n });\n } else if (typeof configOrBaseURL === \"object\" && configOrBaseURL !== null) {\n config = deepMerge(config, configOrBaseURL);\n }\n if (!config.baseURL && typeof window === \"object\" && window.mediaWiki) {\n const { wgServer, wgScriptPath } = window.mediaWiki?.config?.get([\"wgServer\", \"wgScriptPath\"]) || {};\n if (typeof wgServer === \"string\" && typeof wgScriptPath === \"string\") {\n config.baseURL = `${wgServer}${wgScriptPath}/api.php`;\n }\n }\n if (typeof config.baseURL !== \"string\") {\n throw new Error(\"baseURL is required\");\n }\n return config;\n};\n\nconst noop = () => {\n};\nconst useRetry = async (fn, options) => {\n let retryCount = 0;\n const { retry = 3, onRetry = noop, shouldRetry = () => true } = options;\n let lastError;\n do {\n try {\n return await fn();\n } catch (error) {\n lastError = error;\n if (shouldRetry(error, retryCount)) {\n onRetry(error, retryCount);\n retryCount++;\n } else {\n throw error;\n }\n }\n } while (retryCount < retry);\n throw lastError || new Error(\"Retry failed\");\n};\n\n/**\n * WikiSaikou Core class\n * @internal You **SHOULD NOT** use this class directly, instead, use the `MediaWikiApi` class.\n * @author dragon-fish <dragon-fish@qq.com>\n * @license MIT\n */\nclass WikiSaikouCore {\n config;\n version = \"7.5.0\";\n request;\n static INIT_DEFAULT_PARAMS = {\n action: \"query\",\n errorformat: \"plaintext\",\n format: \"json\",\n formatversion: 2\n };\n static DEFAULT_CONFIGS = {\n baseURL: void 0,\n fexiosConfigs: {\n responseType: \"json\"\n },\n defaultParams: this.INIT_DEFAULT_PARAMS,\n throwOnApiError: false\n };\n constructor(configOrBaseURL, defaultOptions, defaultParams) {\n const config = this.config = resolveLegacyCtor(\n configOrBaseURL,\n defaultOptions,\n defaultParams\n );\n this.request = createFexiosSaikou(config.baseURL);\n }\n setBaseURL(baseURL) {\n this.config.baseURL = baseURL;\n this.request.baseConfigs.baseURL = baseURL;\n return this;\n }\n /** Base methods encapsulation */\n async get(query, options) {\n const payload = deepMerge(\n {},\n this.config.fexiosConfigs,\n {\n query: FexiosQueryBuilder.mergeQueries(\n this.config.defaultParams,\n query\n )\n },\n options\n );\n return this.runRequestWithApiErrorMapping(\n () => this.request.get(\"\", payload)\n );\n }\n async post(data, options) {\n return this.runRequestWithApiErrorMapping(\n () => this.request.post(\n \"\",\n data,\n deepMerge(\n {},\n this.config.fexiosConfigs,\n {\n query: this.config.defaultParams\n },\n options\n )\n )\n );\n }\n /**\n * Wrap a request to map non-2xx responses containing MediaWiki API error bodies\n * into MediaWikiApiError when throwOnApiError=true, and then pass 2xx responses\n * through handleApiResponse for unified processing.\n */\n async runRequestWithApiErrorMapping(doRequest) {\n try {\n const res = await doRequest();\n return this.handleApiResponse(res);\n } catch (err) {\n if (this.config.throwOnApiError && WikiSaikouError.includesMediaWikiApiError(err)) {\n throw new MediaWikiApiError(\n WikiSaikouError.extractMediaWikiApiErrors(err),\n err\n );\n }\n throw err;\n }\n }\n throwIfApiError(data) {\n const errors = WikiSaikouError.extractMediaWikiApiErrors(data);\n if (errors.length > 0) {\n throw new MediaWikiApiError(errors, data);\n }\n }\n handleApiResponse(res) {\n if (this.config.throwOnApiError) {\n this.throwIfApiError(res.data);\n }\n return res;\n }\n /** Token Handler */\n get tokens() {\n return this.request._tokens;\n }\n async fetchTokens(types = [\"csrf\"]) {\n this.config.fexiosConfigs.credentials = \"include\";\n await this.get({\n action: \"query\",\n meta: \"tokens\",\n type: types\n });\n return this.tokens;\n }\n async getToken(type = \"csrf\", noCache = false) {\n if (!this.tokens.get(type) || noCache) {\n this.tokens.delete(type);\n await this.fetchTokens([type]);\n }\n return this.tokens.get(type);\n }\n badToken(type) {\n this.tokens.delete(type);\n return this.tokens;\n }\n async postWithToken(tokenType, body, options) {\n const {\n tokenName = \"token\",\n retry = 3,\n noCache = false,\n fexiosOptions\n } = options || {};\n if (retry < 1) {\n throw new WikiSaikouError(\n WikiSaikouErrorCode.TOKEN_RETRY_LIMIT_EXCEEDED,\n \"The limit of the number of times to automatically re-acquire the token has been exceeded\"\n );\n }\n let attemptIndex = 0;\n return useRetry(\n async () => {\n const token = await this.getToken(\n tokenType,\n noCache || attemptIndex > 0\n );\n try {\n const ctx = await this.post(\n {\n [tokenName]: token,\n ...body\n },\n deepMerge(fexiosOptions || {}, {\n customEnv: {\n mwTokenName: tokenType\n }\n })\n );\n if (WikiSaikouError.isBadTokenError(ctx.data)) {\n throw ctx;\n }\n return ctx;\n } catch (err) {\n if (WikiSaikouError.isBadTokenError(err) || err?.ok === false) {\n throw err;\n } else if (MediaWikiApiError.is(err)) {\n throw err;\n } else {\n throw new WikiSaikouError(\n WikiSaikouErrorCode.HTTP_ERROR,\n \"Network/transport or SDK-internal error (not a MediaWiki API error)\",\n err\n );\n }\n }\n },\n {\n retry,\n onRetry: (_error, count) => {\n attemptIndex = count + 1;\n },\n shouldRetry: (error) => WikiSaikouError.isBadTokenError(error) || error?.ok === false\n }\n ).catch((err) => {\n if (WikiSaikouError.isBadTokenError(err) || err?.ok === false) {\n throw new WikiSaikouError(\n WikiSaikouErrorCode.TOKEN_RETRY_LIMIT_EXCEEDED,\n \"Retry attempts for acquiring/using token exhausted\",\n err\n );\n }\n throw err;\n });\n }\n postWithEditToken(body) {\n return this.postWithToken(\"csrf\", body);\n }\n // for backward compatibility\n /** @deprecated Use `this.config.baseURL` instead */\n get baseURL() {\n return this.config.baseURL;\n }\n /** @deprecated Use `this.config.defaultParams` instead */\n get defaultParams() {\n return this.config.defaultParams;\n }\n /** @deprecated Use `this.config.fexiosConfigs` instead */\n get defaultOptions() {\n return this.config.fexiosConfigs;\n }\n /** @deprecated Use `createFexiosSaikou` instead */\n static createRequestHandler = createFexiosSaikou;\n /** @deprecated Use `this.getToken` instead */\n token = this.getToken;\n}\n\nexport { MediaWikiApiError as M, WikiSaikouCore as W, WikiSaikouError as a, WikiSaikouErrorCode as b, createFexiosSaikou as c, MwParamNormalizer as d, resolveLegacyCtor as r };\n//# sourceMappingURL=wiki-saikou._bdNL3q3.mjs.map\n","export class MemoryStorage implements Storage {\n private values: Record<string, string> = {}\n get length(): number {\n return Object.keys(this.values).length\n }\n clear(): void {\n this.values = {}\n }\n getItem(key: string): string | null {\n return this.values[key] ?? null\n }\n setItem(key: string, value: string): void {\n this.values[key] = typeof value === 'string' ? value : String(value)\n }\n removeItem(key: string): void {\n delete this.values[key]\n }\n key(index: number): string | null {\n const keys = Object.keys(this.values)\n return keys[index] ?? null\n }\n}\nexport const useMemoryStorage = () => {\n // handle storage.foo = 'bar' case\n return new Proxy(new MemoryStorage(), {\n set(target, prop, value) {\n if (typeof prop === 'string') {\n target.setItem(prop, value)\n }\n return true\n },\n get(target, prop) {\n if (typeof prop === 'string' && !(prop in target)) {\n return target.getItem(prop)\n }\n return Reflect.get(target, prop)\n },\n })\n}\n","import type { PageInfo } from './types/PageInfo'\nimport { PageParseData } from './types/PageParseData'\nimport {\n MediaWikiApi,\n MwApiParams,\n MwApiResponse,\n FexiosFinalContext,\n MediaWikiApiError,\n} from 'wiki-saikou/browser'\nimport { WikiPageActionEditRequest, WikiPageActionEditResult } from './types/WikiPageActionEdit.js'\n\nexport interface IWikiPage {\n pageInfo: PageInfo\n parse(params?: MwApiParams): Promise<FexiosFinalContext<MwApiResponse<{ parse: PageParseData }>>>\n preview(\n text: string,\n params?: MwApiParams\n ): Promise<FexiosFinalContext<MwApiResponse<{ parse: PageParseData }>>>\n edit(\n payload: WikiPageActionEditRequest & MwApiParams,\n /** @deprecated Append params in `payload` instead */\n params?: MwApiParams\n ): Promise<FexiosFinalContext<MwApiResponse<{ edit: WikiPageActionEditResult }>>>\n createOnly(\n payload: Pick<WikiPageActionEditRequest, 'summary' | 'watchlist'> & {\n text: string\n recreate?: boolean\n },\n params?: MwApiParams\n ): Promise<FexiosFinalContext<MwApiResponse<{ edit: WikiPageActionEditResult }>>>\n delete(\n reason?: string,\n params?: MwApiParams\n ): Promise<\n FexiosFinalContext<\n MwApiResponse<{\n delete: {\n title: string\n reason: string\n logid: boolean\n }\n }>\n >\n >\n moveTo(\n title: string,\n reason?: string,\n params?: Partial<\n MwApiParams & {\n movetalk: boolean\n movesubpages: boolean\n }\n >\n ): Promise<FexiosFinalContext<MwApiResponse<{ success: boolean }>>>\n userCan(action: keyof PageInfo['actions']): boolean\n userCanEdit(): boolean\n reloadSelfInfo(): Promise<this>\n // sugar getters (instance level)\n readonly pageid: PageInfo['pageid']\n readonly title: PageInfo['title']\n readonly ns: PageInfo['ns']\n readonly contentmodel: PageInfo['contentmodel']\n readonly fullurl: PageInfo['fullurl']\n readonly canonicalurl: PageInfo['canonicalurl']\n readonly editurl: PageInfo['editurl']\n readonly revisions: NonNullable<PageInfo['revisions']>\n readonly lastrevid: PageInfo['lastrevid']\n readonly templates: NonNullable<PageInfo['templates']>\n readonly images: NonNullable<PageInfo['images']>\n}\n\nexport interface WikiPageConstructor {\n // Constructor\n new (pageInfo: Partial<PageInfo>, loaded?: boolean): IWikiPage\n // Static members\n newFromApi(payload: MwApiParams): Promise<IWikiPage>\n newBlankPage(init?: Partial<PageInfo>): IWikiPage\n /**\n * Create a new WikiPage instance from any kind of identifier\n * priority: revid > pageid > title\n */\n newFromAnyKind(payload: {\n title?: string\n pageid?: number\n revid?: number\n }): Promise<IWikiPage | null>\n newBatchFromApi(\n params: MwApiParams & {\n titles?: string[]\n pageids?: number[]\n revids?: number[]\n }\n ): Promise<IWikiPage[]>\n}\n\nexport function createWikiPageModel(api: MediaWikiApi): WikiPageConstructor {\n class WikiPage implements IWikiPage {\n private static readonly api = api\n readonly api = api\n public pageInfo: PageInfo\n static readonly DEFAULT_QUERY_PARAMS: MwApiParams = {\n action: 'query',\n prop: 'info|templates|transcludedin|images|pageimages|revisions',\n inprop: 'protection|url|varianttitles',\n intestactions: 'edit|move|delete',\n tllimit: 'max',\n tilimit: 'max',\n imlimit: 'max',\n piprop: 'thumbnail|name|original',\n pithumbsize: '200',\n pilimit: 'max',\n rvprop: 'ids|timestamp|flags|comment|user|content',\n rvslots: 'main',\n }\n static readonly DEFAULT_PAGE_INFO: PageInfo = {\n pageid: 0,\n ns: 0,\n title: '',\n contentmodel: 'wikitext',\n pagelanguage: '',\n pagelanguagehtmlcode: '',\n pagelanguagedir: 'ltr',\n touched: new Date().toISOString(),\n lastrevid: 0,\n length: 0,\n protection: [],\n restrictiontypes: [],\n fullurl: '',\n canonicalurl: '',\n editurl: '',\n varianttitles: {},\n actions: {\n edit: true,\n move: false,\n delete: false,\n },\n revisions: [],\n templates: [],\n images: [],\n }\n\n constructor(\n pageInfo: Partial<PageInfo>,\n public _loaded = true\n ) {\n // Handle modern MW content model slots\n pageInfo.revisions?.forEach((rev) => {\n // @ts-ignore\n if (typeof rev?.slots?.main === 'object') {\n Object.assign(rev, (rev as any).slots.main)\n }\n })\n this.pageInfo = {\n ...WikiPage.DEFAULT_PAGE_INFO,\n ...pageInfo,\n }\n }\n\n // Utils\n static async newFromApi(payload: MwApiParams) {\n const { data } = await this.api.get<{\n query: {\n pages: PageInfo[]\n }\n }>({\n ...WikiPage.DEFAULT_QUERY_PARAMS,\n ...payload,\n })\n const info = data?.query?.pages?.[0]\n if (!info || !info.title) {\n throw new Error('Invalid page info', { cause: data })\n }\n return new WikiPage(info, true)\n }\n static newBlankPage(init: Partial<PageInfo> = {}) {\n return new WikiPage(init, false)\n }\n static async newFromAnyKind(payload: { title?: string; pageId?: number; revisionId?: number }) {\n const { title, pageId, revisionId } = payload || {}\n if (revisionId) {\n return this.newFromApi({ revids: parseInt(revisionId.toString(), 10) })\n } else if (pageId) {\n return this.newFromApi({ pageids: parseInt(pageId.toString(), 10) })\n } else if (title) {\n return this.newFromApi({ titles: title.toString() })\n }\n return null\n }\n static async newBatchFromApi(\n params: MwApiParams & {\n titles?: string[]\n pageids?: number[]\n revids?: number[]\n }\n ) {\n const { titles, pageids, revids, ...rest } = params || {}\n const { data } = await this.api.post<{\n query: {\n pages: PageInfo[]\n }\n }>({\n ...WikiPage.DEFAULT_QUERY_PARAMS,\n titles: titles?.join('|') ?? undefined,\n pageids: pageids?.join('|') ?? undefined,\n revids: revids?.join('|') ?? undefined,\n ...rest,\n })\n return data?.query?.pages?.map((page) => new WikiPage(page, true)) || []\n }\n\n // Page actions\n async parse(params?: MwApiParams) {\n return this.api.post({\n action: 'parse',\n page: this.pageInfo.title,\n prop: 'text|langlinks|categories|links|templates|images|externallinks|sections|revid|displaytitle|iwlinks|properties|parsewarnings',\n ...params,\n })\n }\n async preview(text: string, params?: MwApiParams) {\n return this.parse({\n action: 'parse',\n page: undefined,\n title: this.title,\n text,\n pst: 1,\n preview: 1,\n disableeditsection: 1,\n disablelimitreport: 1,\n ...params,\n })\n }\n async edit(payload: WikiPageActionEditRequest & MwApiParams, params?: MwApiParams) {\n const response = await this.api.postWithEditToken<{ edit: WikiPageActionEditResult }>({\n action: 'edit',\n title: this.title,\n starttimestamp: this.pageInfo.touched,\n basetimestamp: this.revisions[0]?.timestamp,\n ...payload,\n ...params,\n })\n if (response.data?.edit?.result === 'Success') {\n return response\n } else {\n /**\n * This situation is rare, but it may happen.\n * In most cases, failed edit will throw a MediaWikiApiError like `{ \"error\": { \"code\": \"editconflict\", \"info\": \"...\" } }`, but not `{ \"edit\": { \"result\": \"Failure\" } }`.\n * We need to build a MediaWikiApiError manually.\n * @see https://github.com/inpageedit/inpageedit-next/issues/13\n */\n throw new MediaWikiApiError(\n [\n {\n module: 'edit',\n code: 'editfailure',\n text: 'Unknown edit failure. Please try again.',\n docref: 'https://www.mediawiki.org/wiki/API:Edit',\n },\n ],\n response\n )\n }\n }\n async createOnly(\n payload: Pick<WikiPageActionEditRequest, 'summary' | 'watchlist'> & {\n text: string\n recreate?: boolean\n },\n params?: MwApiParams\n ) {\n return this.edit(payload, { createonly: 1, recreate: payload.recreate, ...params })\n }\n async delete(reason?: string, params?: MwApiParams & { deletetalk?: boolean }) {\n return this.api.postWithEditToken<{\n delete: {\n title: string\n reason: string\n logid: boolean\n }\n }>({\n action: 'delete',\n title: this.pageInfo.title || undefined,\n pageid: this.pageInfo.pageid || undefined,\n reason,\n deletetalk: params?.deletetalk,\n ...params,\n })\n }\n async moveTo(\n title: string,\n reason?: string,\n params?: Partial<\n MwApiParams & {\n movetalk: boolean\n movesubpages: boolean\n }\n >\n ) {\n return this.api.postWithEditToken({\n action: 'move',\n from: this.pageInfo.title,\n to: title,\n reason,\n movetalk: 1,\n movesubpages: 1,\n ...params,\n })\n }\n\n // === utilities ===\n\n userCan(action: keyof PageInfo['actions']) {\n const val = this.pageInfo?.actions?.[action]\n return !!val\n }\n userCanEdit() {\n return this.userCan('edit')\n }\n async reloadSelfInfo() {\n const page = await WikiPage.newFromApi({\n pageids: this.pageInfo.pageid,\n titles: this.pageInfo.title,\n })\n const revisions = (this.pageInfo.revisions || [])\n .concat(page.revisions || [])\n .sort((a, b) => a.revid - b.revid)\n .reduce(\n (acc, cur) => {\n if (!acc.find((rev) => rev.revid === cur.revid)) acc.push(cur)\n return acc\n },\n [] as Required<PageInfo>['revisions']\n )\n this.pageInfo = page.pageInfo\n this.pageInfo.revisions = revisions\n this._loaded = true\n return this\n }\n\n // === sugar getters ===\n get pageid() {\n return this.pageInfo.pageid\n }\n get title() {\n return this.pageInfo.title\n }\n get ns() {\n return this.pageInfo.ns\n }\n get contentmodel() {\n return this.pageInfo.contentmodel\n }\n get fullurl() {\n return this.pageInfo.fullurl\n }\n get canonicalurl() {\n return this.pageInfo.canonicalurl\n }\n get editurl() {\n return this.pageInfo.editurl\n }\n get revisions() {\n return this.pageInfo.revisions || []\n }\n get lastrevid() {\n return this.pageInfo.lastrevid\n }\n get templates() {\n return this.pageInfo.templates || []\n }\n get images() {\n return this.pageInfo.images || []\n }\n }\n\n return WikiPage as WikiPageConstructor\n}\n\n// re-export types\nexport * from './types/PageInfo'\nexport * from './types/PageParseData'\nexport * from './types/WatchlistAction'\n","import { WikiSiteInfo } from '@/types/WikiMetadata'\n\n// 使用 WeakMap 避免内存泄漏\nconst caches = new WeakMap<WikiSiteInfo, WikiTitleConstructor>()\n\n// 命名空间查找索引\ninterface NamespaceIndex {\n byName: Map<string, number>\n byCanonical: Map<string, number>\n byAlias: Map<string, number>\n byNormalized: Map<string, number> // 标准化索引:全小写+下划线格式\n}\n\n// 特殊页面别名索引\ninterface SpecialPageIndex {\n byRealName: Map<string, string> // realname -> realname\n byAlias: Map<string, string> // alias -> realname\n byNormalized: Map<string, string> // normalized -> realname\n}\n\nexport interface IWikiTitle {\n /**\n * Get db key without namespace prefix\n * e.g. \"template:hello world\" -> \"Hello_world\"\n */\n getMainDBKey(): string\n\n /**\n * Get page name without namespace prefix\n * e.g. \"template:hello world\" -> \"Hello world\"\n */\n getMainText(): string\n\n /**\n * Get db key with namespace prefix\n * e.g. \"template:hello world\" -> \"Template:Hello_world\"\n */\n getPrefixedDBKey(): string\n\n /**\n * Get page name with namespace prefix\n * e.g. \"template:hello world\" -> \"Template:Hello world\"\n */\n getPrefixedText(): string\n\n // Shortcuts\n toText: () => string\n toString: () => string\n\n /**\n * Get namespace ID\n * e.g. \"template:hello world\" -> 10\n */\n getNamespaceId(): number\n\n /**\n * Get namespace text\n * e.g. \"template:hello world\" -> \"Template\"\n */\n getNamespaceText(): string\n\n /**\n * Get namespace db key\n * e.g. \"template talk:hello world\" -> \"Template_talk\"\n */\n getNamespaceDBKey(): string\n\n /**\n * Get subject page\n * If current page is subject page, return itself\n * e.g. \"template talk:hello world\" -> new WikiTitle(\"Template:Hello world\")\n */\n getSubjectPage(): IWikiTitle\n\n /**\n * Get talk page\n * If current page is talk page, return itself\n * If current page cannot have talk page, return null\n * e.g. \"template:hello world\" -> new WikiTitle(\"Template talk:Hello world\")\n */\n getTalkPage(): IWikiTitle | null\n\n /**\n * Get URL of the page\n * e.g. \"template:hello world\" -> \"https://example.com/wiki/Template:Hello_world\"\n */\n getURL(params?: Record<string, string> | URLSearchParams): URL\n\n /**\n * Reset current title with given title string\n */\n setTitle(title: string): IWikiTitle\n\n /**\n * Set main title, keep current ns, update dbkey\n */\n setMainText(mainTitle: string): IWikiTitle\n\n /**\n * Set namespace by text\n */\n setNamespaceText(namespaceText: string): IWikiTitle\n\n /**\n * Set namespace by ID\n */\n setNamespaceId(namespaceId: number): IWikiTitle\n\n /**\n * Check if the title is equal to another title\n */\n equals(other: IWikiTitle | string): boolean\n\n /**\n * Check if the title is specific special page\n * e.g. \"Special:Diff\" is \"差异\" or \"diff\" -> true\n */\n isSpecial(alia: string): boolean\n\n newTitle(title: string, namespace?: number): IWikiTitle\n}\n\nexport interface WikiTitleConstructor {\n new (title: string, namespace?: number): IWikiTitle\n create(title: string, namespace?: number): IWikiTitle\n}\n\n// 工具函数\nconst titleUtils = {\n toDBKey: (text: string): string => text.replace(/ /g, '_'),\n toNormalText: (text: string): string => text.replace(/_/g, ' '),\n ensureCase: (text: string, caseType: string): string => {\n if (caseType === 'first-letter') {\n return text.charAt(0).toUpperCase() + text.slice(1)\n } else {\n return text\n }\n },\n}\n\n// 特殊页面工具函数\nconst specialPageUtils = {\n /**\n * 标准化特殊页面名称:转换为全小写\n */\n normalizeSpecialPageName: (name: string): string => {\n return name.toLowerCase()\n },\n\n /**\n * 构建特殊页面别名索引\n */\n buildSpecialPageIndex: (metadata: WikiSiteInfo): SpecialPageIndex => {\n const byRealName = new Map<string, string>()\n const byAlias = new Map<string, string>()\n const byNormalized = new Map<string, string>()\n\n for (const specialPage of metadata.specialpagealiases) {\n const realName = specialPage.realname\n byRealName.set(realName, realName)\n\n // 添加标准化索引\n const normalizedRealName = specialPageUtils.normalizeSpecialPageName(realName)\n byNormalized.set(normalizedRealName, realName)\n\n // 处理别名\n for (const alias of specialPage.aliases) {\n byAlias.set(alias, realName)\n\n // 添加标准化的别名索引\n const normalizedAlias = specialPageUtils.normalizeSpecialPageName(alias)\n byNormalized.set(normalizedAlias, realName)\n }\n }\n\n return { byRealName, byAlias, byNormalized }\n },\n\n /**\n * 查找特殊页面的真实名称\n */\n findSpecialPageRealName: (name: string, index: SpecialPageIndex): string | null => {\n // 提取主部分(忽略子页面)\n const mainPart = name.split('/')[0]\n\n // 首先尝试原始输入(精确匹配)\n let result = index.byRealName.get(mainPart) ?? index.byAlias.get(mainPart)\n if (result !== undefined) {\n return result\n }\n\n // 标准化输入并查找\n const normalized = specialPageUtils.normalizeSpecialPageName(mainPart)\n return index.byNormalized.get(normalized) ?? null\n },\n}\n\n// 命名空间工具函数\nconst namespaceUtils = {\n /**\n * 标准化命名空间文本:转换为全小写+下划线格式\n */\n normalizeNamespaceText: (text: string): string => {\n return text\n .replace(/[_\\s]+/g, '_') // 将空格和下划线统一为下划线\n .toLowerCase()\n .replace(/^_+|_+$/g, '') // 移除首尾下划线\n },\n\n buildIndex: (metadata: WikiSiteInfo): NamespaceIndex => {\n const byName = new Map<string, number>()\n const byCanonical = new Map<string, number>()\n const byAlias = new Map<string, number>()\n const byNormalized = new Map<string, number>()\n\n // 构建命名空间索引\n for (const [id, ns] of Object.entries(metadata.namespaces)) {\n const nsId = parseInt(id)\n byName.set(ns.name, nsId)\n byCanonical.set(ns.canonical ?? '', nsId)\n\n // 添加标准化索引\n const normalizedName = namespaceUtils.normalizeNamespaceText(ns.name)\n const normalizedCanonical = namespaceUtils.normalizeNamespaceText(ns.canonical ?? '')\n byNormalized.set(normalizedName, nsId)\n byNormalized.set(normalizedCanonical, nsId)\n }\n\n // 构建别名索引\n for (const alias of metadata.namespacealiases) {\n byAlias.set(alias.alias, alias.id)\n\n // 添加标准化的别名索引\n const normalizedAlias = namespaceUtils.normalizeNamespaceText(alias.alias)\n byNormalized.set(normalizedAlias, alias.id)\n }\n\n return { byName, byCanonical, byAlias, byNormalized }\n },\n\n findNamespaceId: (namespaceText: string, index: NamespaceIndex): number | null => {\n // 首先尝试原始输入(精确匹配)\n let result =\n index.byName.get(namespaceText) ??\n index.byCanonical.get(namespaceText) ??\n index.byAlias.get(namespaceText)\n if (result !== undefined) {\n return result\n }\n\n // 标准化输入并查找\n const normalized = namespaceUtils.normalizeNamespaceText(namespaceText)\n return index.byNormalized.get(normalized) ?? null\n },\n\n isTalkPage: (ns: number): boolean => ns % 2 === 1 && ns > 0,\n\n getDefaultNamespaceInfo: (ns: number) => ({\n id: ns,\n name: '',\n canonical: '',\n case: 'first-letter' as const,\n content: false,\n nonincludable: false,\n subpages: false,\n }),\n}\n\nexport function createWikiTitleModel(metadata: WikiSiteInfo): WikiTitleConstructor {\n const exists = caches.get(metadata)\n if (exists) {\n return exists\n }\n\n // 预建命名空间索引\n const namespaceIndex = namespaceUtils.buildIndex(metadata)\n // 预建特殊页面索引\n const specialPageIndex = specialPageUtils.buildSpecialPageIndex(metadata)\n\n class WikiTitle implements IWikiTitle {\n static readonly _meta = metadata\n static readonly _namespaceIndex = namespaceIndex\n static readonly _specialPageIndex = specialPageIndex\n\n /** 缓存的 main title,不包含命名空间前缀,大小写和空格状态不确定 */\n #title: string\n /** 缓存的 namespace ID */\n #ns: number\n\n constructor(title: string, namespace?: number) {\n this.#title = title || ''\n this.#ns = namespace ?? 0\n\n // 只有在没有显式命名空间参数时才解析标题中的命名空间前缀\n if (namespace === void 0) {\n this.fixNSByTitle()\n } else {\n // 显式传入命名空间时:仅当标题中的前缀与显式命名空间一致时才移除前缀\n const parsed = this.parseTitlePrefix(this.#title)\n if (parsed && parsed.namespaceId === this.#ns) {\n this.#title = parsed.mainTitle\n }\n }\n\n if (this.getMainText() === '') {\n throw new Error('Invalid title')\n }\n }\n\n static create(title: string, namespace?: number): WikiTitle {\n return new WikiTitle(title, namespace)\n }\n newTitle = WikiTitle.create.bind(WikiTitle)\n\n /**\n * 解析标题前缀,返回匹配到的命名空间 ID 与剥离后的主标题\n */\n private parseTitlePrefix(rawTitle: string): { namespaceId: number; mainTitle: string } | null {\n const colonIndex = rawTitle.indexOf(':')\n if (colonIndex <= 0) {\n return null\n }\n const potentialNamespace = rawTitle.substring(0, colonIndex)\n const mainTitle = rawTitle.substring(colonIndex + 1)\n const namespaceId = namespaceUtils.findNamespaceId(\n potentialNamespace,\n WikiTitle._namespaceIndex\n )\n if (namespaceId === null) return null\n return { namespaceId, mainTitle }\n }\n\n /**\n * 如果标题包含可识别命名空间,则采用该命名空间并剥离前缀\n */\n private adoptNamespaceFromTitle(): void {\n const parsed = this.parseTitlePrefix(this.#title)\n if (!parsed) return\n this.#title = parsed.mainTitle\n this.#ns = parsed.namespaceId\n }\n\n private fixNSByTitle(): void {\n const colonIndex = this.#title.indexOf(':')\n if (colonIndex === -1) {\n return // 没有命名空间前缀\n }\n\n if (colonIndex === 0) {\n // 只有冒号,将冒号后的部分作为标题\n this.#title = this.#title.substring(1)\n return\n }\n\n // 查找匹配的命名空间并采用\n this.adoptNamespaceFromTitle()\n }\n\n private getNamespaceInfo() {\n return (\n WikiTitle._meta.namespaces[this.#ns] ?? namespaceUtils.getDefaultNamespaceInfo(this.#ns)\n )\n }\n\n /**\n * 若为特殊页面,返回解析后的真实主名(含子页面);否则返回 null\n */\n private resolveSpecialFullTitle(): string | null {\n if (this.#ns !== -1) return null\n const realName = specialPageUtils.findSpecialPageRealName(\n this.#title,\n WikiTitle._specialPageIndex\n )\n if (!realName) return null\n const subPage = this.#title.includes('/')\n ? this.#title.substring(this.#title.indexOf('/'))\n : ''\n return realName + subPage\n }\n\n /**\n * 将主标题格式化为输出内容(文本或 DBKey),并做大小写规范化\n */\n private formatMainForOutput(mode: 'text' | 'db'): string {\n const nsInfo = this.getNamespaceInfo()\n const resolved = this.resolveSpecialFullTitle()\n const base = resolved ?? this.#title\n const converted = mode === 'db' ? titleUtils.toDBKey(base) : titleUtils.toNormalText(base)\n return titleUtils.ensureCase(converted, nsInfo.case)\n }\n\n getMainDBKey(): string {\n return this.formatMainForOutput('db')\n }\n\n getMainText(): string {\n return this.formatMainForOutput('text')\n }\n\n private getMainRootText(): string {\n return this.getMainText().split('/')[0]\n }\n\n getPrefixedDBKey(): string {\n if (this.#ns === 0) {\n return this.getMainDBKey()\n }\n return `${this.getNamespaceDBKey()}:${this.getMainDBKey()}`\n }\n\n getPrefixedText(): string {\n if (this.#ns === 0) {\n return this.getMainText()\n }\n return `${this.getNamespaceText()}:${this.getMainText()}`\n }\n\n // aliases\n toText = this.getPrefixedText.bind(this)\n toString = this.getPrefixedDBKey.bind(this)\n\n getNamespaceId(): number {\n return this.#ns\n }\n\n getNamespaceText(): string {\n return this.getNamespaceInfo().name ?? ''\n }\n getNamespaceDBKey(): string {\n const nsInfo = this.getNamespaceInfo()\n return titleUtils.ensureCase(titleUtils.toDBKey(this.getNamespaceText()), nsInfo.case)\n }\n\n getSubjectPage(): IWikiTitle {\n if (namespaceUtils.isTalkPage(this.#ns)) {\n const subjectNs = this.#ns - 1\n return new WikiTitle(this.#title, subjectNs)\n }\n return this\n }\n\n getTalkPage(): IWikiTitle | null {\n if (namespaceUtils.isTalkPage(this.#ns)) {\n return this\n }\n\n // 特殊页面和媒体页面没有讨论页\n if (this.#ns < 0) {\n return null\n }\n\n const talkNs = this.#ns + 1\n const talkNsInfo = WikiTitle._meta.namespaces[talkNs.toString()]\n if (!talkNsInfo) {\n return null\n }\n\n return new WikiTitle(this.#title, talkNs)\n }\n\n getURL(params?: Record<string, string> | URLSearchParams): URL {\n const prefixedDbKey = this.getPrefixedDBKey()\n return this.buildArticleURL(prefixedDbKey, params)\n }\n\n /**\n * 构建文章 URL 并附加查询参数\n */\n private buildArticleURL(\n prefixedDbKey: string,\n params?: Record<string, string> | URLSearchParams\n ): URL {\n const articlePath = WikiTitle._meta.general.articlepath\n const path = articlePath.replace('$1', prefixedDbKey)\n const url = new URL(path, location.origin)\n if (params) {\n const searchParams =\n params instanceof URLSearchParams ? params : new URLSearchParams(params)\n searchParams.forEach((value, key) => {\n url.searchParams.set(key, value)\n })\n }\n return url\n }\n\n /**\n * 设置标题,重置当前实例的 dbkey 和 ns\n * 行为:\n * - 如果标题包含可识别的命名空间前缀,则以该前缀为准更新 ns,并移除前缀\n * - 如果标题前缀与当前 ns 相同,则仅移除冗余前缀并保留当前 ns\n * - 否则(无前缀),重置为主命名空间\n */\n setTitle(title: string): this {\n this.#title = title\n const previousNs = this.#ns\n // 默认重置为主命名空间\n this.#ns = 0\n\n const parsed = this.parseTitlePrefix(this.#title)\n if (parsed) {\n // 如果与之前的 ns 一致,则视为冗余前缀,仅剥离前缀并保持 ns\n if (previousNs !== 0 && parsed.namespaceId === previousNs) {\n this.#title = parsed.mainTitle\n this.#ns = previousNs\n } else {\n // 使用标题中的命名空间\n this.#title = parsed.mainTitle\n this.#ns = parsed.namespaceId\n }\n return this\n }\n\n // 无可识别前缀,保持主命名空间\n return this\n }\n\n setMainText(text: string): this {\n this.#title = text\n return this\n }\n\n setNamespaceText(namespaceText: string): this {\n const namespaceId = namespaceUtils.findNamespaceId(namespaceText, WikiTitle._namespaceIndex)\n if (namespaceId !== null) {\n this.#ns = namespaceId\n }\n return this\n }\n\n setNamespaceId(namespaceId: number): this {\n this.#ns = namespaceId\n return this\n }\n\n equals(other: IWikiTitle | string): boolean {\n if (typeof other === 'string') {\n other = new WikiTitle(other)\n }\n return this.getPrefixedDBKey() === other.getPrefixedDBKey()\n }\n\n isSpecial(alia: string): boolean {\n // 如果不是特殊页面命名空间,直接返回 false\n if (this.#ns !== -1) {\n return false\n }\n const targetTitle = new WikiTitle(alia, -1)\n return this.getMainRootText() === targetTitle.getMainRootText()\n }\n\n toJSON(): Record<string, any> {\n return {\n ns: this.#ns,\n text: this.getMainText(),\n title: this.getPrefixedText(),\n url: this.getURL().toString(),\n isSpecial: this.#ns < 0,\n }\n }\n }\n\n caches.set(metadata, WikiTitle)\n return WikiTitle\n}\n"],"names":["clone","value","_structuredClone","seen","cached","ta","Ctor","out2","v","k","arr","i","proto","out","descriptors","key","d","isPlainObject","payload","CallableInstanceImpl","property","func","apply","args","desc","CallableInstance","deepMerge","obj","incomes","result","inc","nextVal","prevVal","FexiosErrorCodes","FexiosErrorCodes2","FexiosError","code","message","context","options","FexiosResponseError","response","FexiosQueryBuilder","FexiosQueryBuilder2","params","sp","appendValue","setValue","handleNested","prefix","val","item","isBracketArrayKey","cleanKey","nextPrefix","arrayKey","query","url","hash","base","fallbackBase","u","existingParams","mergedRecord","mergedParams","input","output","parseKey","parts","re","m","forceArray","lastWasEmpty","setDeep","path","cur","rawKey","t","qIndex","hashIndex","mergeOne","toPlain","src","target","patch","FexiosResponse","rawResponse","data","responseType","concatUint8Arrays","total","n","p","off","readBody","stream","contentLength","onProgress","reader","chunks","received","done","guessFexiosResponseType","contentType","createFexiosResponse","expectedType","shouldThrow","timeout","decodeResponse","lenHeader","upgrade","connection","resolvedType","charset","decoder","bytes","text","trimmed","e","decision","FexiosHeaderBuilder","FexiosHeaderBuilder2","h","raw","mergeOneFromObject","rec","Fexios","configs","baseConfigs","ctx","req","rt","define","fallbackURL","urlOrOptions","thisApp","reqInit","inputAbortController","customEnv","requestOnly","body","headerAutoPatch","abortController","fallback","baseForRequest","urlObjForRequest","finalURLForRequest","rawRequest","timer","err","progress","buffer","error","c","effectiveBase","baseObj","reqURL","baseSearchParams","reqSearchParams","mergedSearchParams","mergedQuery","source","event","opts","hooks","shortCircuit","baseCtx","finalCtx","after","hook","hookName","marker","action","prepend","method","bodyOrQuery","fexios","plugin","fx","createFexios","MwParamNormalizer","MwParamNormalizer2","normalizeParamValue","normalizeBody","isFormLike","body2","formData","WikiSaikouErrorCode","WikiSaikouErrorCode2","WikiSaikouError","cause","MediaWikiApiError","errors","WikiSaikouError2","extractResponseDataFromAny","includesMediaWikiApiError","extractMediaWikiApiErrors","r","isBadTokenError","FEXIOS_SAIKOU_MARKER","createFexiosSaikou","instance","origin","tokenName","tokens","type","token","loginToken","resolveLegacyCtor","configOrBaseURL","defaultOptions","defaultParams","config","WikiSaikouCore","wgServer","wgScriptPath","noop","useRetry","fn","retryCount","retry","onRetry","shouldRetry","lastError","baseURL","doRequest","res","types","noCache","tokenType","fexiosOptions","attemptIndex","_error","count","MemoryStorage","index","useMemoryStorage","prop","createWikiPageModel","api","WikiPage","pageInfo","_loaded","rev","info","init","title","pageId","revisionId","titles","pageids","revids","rest","page","reason","revisions","a","b","acc","caches","titleUtils","caseType","specialPageUtils","name","metadata","byRealName","byAlias","byNormalized","specialPage","realName","normalizedRealName","alias","normalizedAlias","mainPart","normalized","namespaceUtils","byName","byCanonical","id","ns","nsId","normalizedName","normalizedCanonical","namespaceText","createWikiTitleModel","exists","namespaceIndex","specialPageIndex","WikiTitle","namespace","#title","#ns","parsed","rawTitle","colonIndex","potentialNamespace","mainTitle","namespaceId","subPage","mode","nsInfo","converted","subjectNs","talkNs","prefixedDbKey","previousNs","other","alia","targetTitle"],"mappings":"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","x_google_ignoreList":[0,1,2,3,4,5,6,7,8]}
@@ -1,5 +1,5 @@
1
1
  import { j as R } from "./Promise.withResolvers-C4chhLB1.js";
2
- import { S as s, E as C, a as j } from "./index-QnWieXQc.js";
2
+ import { S as s, E as C, a as j } from "./index-BfW7ObKf.js";
3
3
  import { BasePlugin as L } from "./core.js";
4
4
  import { c as O, d as F } from "./vueHooks-Bs93iP61.js";
5
5
  const G = 1;
@@ -111,7 +111,7 @@ let w = class x extends (T = L) {
111
111
  this.install(t.registry, t.id, t.source, "user-preference");
112
112
  }
113
113
  async _createManagementApp() {
114
- const e = await this.ctx.withInject(["store"]), t = F(() => import("./PluginStoreApp-CoOAw1fr.js"));
114
+ const e = await this.ctx.withInject(["store"]), t = F(() => import("./PluginStoreApp-BwiAYQMA.js"));
115
115
  return O(e, t);
116
116
  }
117
117
  async _injectPreferenceUI() {
@@ -384,4 +384,4 @@ let X = w;
384
384
  export {
385
385
  X as PluginPluginStore
386
386
  };
387
- //# sourceMappingURL=index-bQ0CVu3l.js.map
387
+ //# sourceMappingURL=index-C2_G8gLW.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index-bQ0CVu3l.js","sources":["../src/plugins/plugin-store/schema.ts","../src/plugins/plugin-store/index.tsx"],"sourcesContent":["import Schema from 'schemastery'\n\nexport const PLUGIN_STORE_REGISTRY_MANIFEST_VERSION = 1\n\nexport interface PluginStoreRegistry {\n manifest_version: number\n name: string\n base_url: string\n homepage?: string\n maintainers?: PluginStoreRegistryMaintainer[]\n repository?: PluginStoreRegistryRepository\n packages: PluginStorePackage[]\n}\n\nexport interface PluginStoreRegistryMaintainer {\n name: string\n email?: string\n}\n\nexport interface PluginStoreRegistryRepository {\n type: string\n url: string\n}\n\nexport interface PluginStorePackage {\n id: string\n name: string\n version: string\n description?: string\n author?: string\n license?: string\n loader: PluginStorePackageLoader\n}\n\nexport interface PluginStorePackageLoader {\n kind: 'autoload' | 'module' | 'umd' | 'styles'\n entry?: string\n styles?: string[]\n main_export?: string\n}\n\nexport namespace PluginStoreSchemas {\n export const PackageLoader = new Schema<PluginStorePackageLoader>(\n Schema.object({\n kind: Schema.union(['autoload', 'module', 'umd', 'styles']).required().default('autoload'),\n entry: Schema.string(),\n styles: Schema.array(Schema.string()),\n main_export: Schema.string(),\n })\n )\n\n export const Package = new Schema<PluginStorePackage>(\n Schema.object({\n id: Schema.string().required(),\n name: Schema.string().required(),\n version: Schema.string().required(),\n description: Schema.string(),\n author: Schema.string(),\n license: Schema.string(),\n loader: PackageLoader.required(),\n })\n )\n\n export const RegistryMaintainer = new Schema<PluginStoreRegistryMaintainer>(\n Schema.object({\n name: Schema.string().required(),\n email: Schema.string(),\n })\n )\n\n export const RegistryRepository = new Schema<PluginStoreRegistryRepository>(\n Schema.object({\n type: Schema.string().required(),\n url: Schema.string().required(),\n })\n )\n\n export const Registry = new Schema<PluginStoreRegistry>(\n Schema.object({\n manifest_version: Schema.number().min(PLUGIN_STORE_REGISTRY_MANIFEST_VERSION).required(),\n name: Schema.string().required(),\n base_url: Schema.string().required(),\n homepage: Schema.string(),\n maintainers: Schema.array(RegistryMaintainer),\n repository: RegistryRepository,\n packages: Schema.array(Package).required(),\n })\n )\n}\n","import { InPageEdit, Schema } from '@/InPageEdit'\nimport { ForkScope, Inject } from '@cordisjs/core'\nimport { defineAsyncComponent, type App as VueApp } from 'vue'\nimport { PluginStoreRegistry, PluginStoreSchemas } from './schema'\nimport { AbstractIPEStorageManager } from '@/services/storage/index.js'\n\ndeclare module '@/InPageEdit' {\n interface InPageEdit {\n store: PluginPluginStore\n }\n interface PreferencesMap {\n 'pluginStore.registries': string[]\n 'pluginStore.plugins': { source?: 'online_manifest' | 'npm'; registry: string; id: string }[]\n 'pluginStore.cdnForNpm': string\n }\n interface Events {\n 'plugin-store/registry-fetched'(payload: {\n ctx: InPageEdit\n registry: PluginStoreRegistry\n }): void\n 'plugin-store/registry-not-found'(payload: { ctx: InPageEdit; registryUrl: string }): void\n 'plugin-store/registry-removed'(payload: { ctx: InPageEdit; registryUrl: string }): void\n 'plugin-store/plugin-installed'(payload: {\n ctx: InPageEdit\n registry: PluginStoreRegistry\n id: string\n // 新安装 or 通过用户配置加载\n by: 'new-added' | 'user-preference'\n }): void\n 'plugin-store/plugin-uninstalled'(payload: {\n ctx: InPageEdit\n registry: PluginStoreRegistry\n id: string\n }): void\n }\n}\n\nexport type PluginStoreRegistrySource = 'online_manifest' | 'npm'\n\nconst tryGetGlobalPlugin = (main_export: string) => {\n if (!main_export) return null\n try {\n return main_export\n .split('.')\n .reduce<any>((acc, key) => (acc == null ? acc : acc[key]), globalThis as any)\n } catch {\n return null\n }\n}\n\n/**\n * 解析资源URL\n * @param resourcePath - entry或style路径,可能是相对路径或完整URL\n * @param baseUrl - registry中的base_url,可能是完整URL或相对路径\n * @param registryUrl - registry的URL(必须是绝对URL,作为相对baseUrl时的基准)\n * @returns 解析后的完整URL\n */\nconst resolveResourceUrl = (resourcePath: string, baseUrl: string, registryUrl: string): string => {\n // 完整URL:直接返回\n if (/^https?:\\/\\//i.test(resourcePath)) return resourcePath\n\n // 兜底:规范化一个“带尾斜杠”的 helper\n const ensureSlash = (s: string) => (s.endsWith('/') ? s : s + '/')\n\n // 如果 baseUrl 是完整URL:直接用它当基准(并确保目录语义)\n if (/^https?:\\/\\//i.test(baseUrl)) {\n const normalizedBase = ensureSlash(baseUrl)\n return new URL(resourcePath, normalizedBase).href\n }\n\n // baseUrl 是相对路径(如 './' 或 '/plugins')\n // 先把 baseUrl 相对于 registryUrl 解析成绝对URL\n // 注意:当 baseUrl 是 '/plugins' 这种根相对路径时,new URL 会以 registryUrl 的 origin 作为根。\n const registryAbs = (() => {\n try {\n return new URL(registryUrl).href\n } catch {\n // 极端情况(开发环境传了相对 registry),用页面 origin 兜底\n return new URL(registryUrl, location.origin).href\n }\n })()\n\n const resolvedBaseUrl = new URL(ensureSlash(baseUrl), registryAbs).href\n return new URL(resourcePath, resolvedBaseUrl).href\n}\n\n@Inject(['storage', 'preferences', 'resourceLoader', '$'])\nexport class PluginPluginStore extends BasePlugin {\n // re-export for external usage\n static readonly PluginStoreSchemas = PluginStoreSchemas\n static REGISTRY_INFO_CACHE_TTL = 1000 * 60 * 60 * 24 // 1 day\n static REGISTRY_INFO_STORAGE_NAME = 'plugin-store-registry'\n static REGISTRY_ETAG_STORAGE_NAME = 'psreg-etag'\n private regInfoDB: AbstractIPEStorageManager<PluginStoreRegistry>\n\n constructor(public ctx: InPageEdit) {\n super(ctx, {}, 'plugin-store')\n ctx.set('store', this)\n this.regInfoDB = ctx.storage.createDatabase<PluginStoreRegistry>(\n PluginPluginStore.REGISTRY_INFO_STORAGE_NAME,\n PluginPluginStore.REGISTRY_INFO_CACHE_TTL,\n 1,\n 'indexedDB'\n )\n }\n\n protected async start() {\n this._installUserPlugins()\n this._injectPreferenceUI()\n }\n\n private async _installUserPlugins() {\n const prefs = await this.ctx.preferences.get('pluginStore.plugins', [])\n if (!prefs?.length) {\n return\n }\n for (const pref of prefs) {\n this.install(pref.registry, pref.id, pref.source, 'user-preference')\n }\n }\n\n private async _createManagementApp() {\n const ctx = await this.ctx.withInject(['store'])\n const PluginStoreApp = defineAsyncComponent(() => import('./components/PluginStoreApp.vue'))\n const app = createVueAppWithIPE(ctx, PluginStoreApp)\n return app\n }\n\n private async _injectPreferenceUI() {\n const ctx = this.ctx\n const $ = ctx.$\n\n ctx.preferences.defineCategory({\n name: 'plugin-store',\n label: $`Plugin Store`,\n description: $`Plugin Store`,\n index: 90,\n autoGenerateForm: false,\n customRenderer: async ({ onUnmount }) => {\n const container = <div id=\"ipe-plugin-store-preferences-vue\"></div>\n const app = await this._createManagementApp()\n app.mount(container)\n\n onUnmount(() => {\n app.unmount()\n this.ctx.logger.debug('Plugin Store preferences app unmounted')\n })\n\n return (\n <section>\n {container}\n {/* <div className=\"theme-ipe-prose\">\n <hr />\n <div style={{ textAlign: 'center', marginBottom: '1em', fontSize: '0.8em' }}>\n 🚫 DO NOT edit fields below manually 🚫\n </div>\n </div> */}\n </section>\n )\n },\n })\n\n ctx.preferences.registerCustomConfig(\n 'plugin-store',\n Schema.object({\n 'pluginStore.registries': Schema.array(Schema.string())\n .default([\n import.meta.env.PROD\n ? Endpoints.PLUGIN_REGISTRY_URL\n : import.meta.resolve('/src/__mock__/plugin-registry/index.json'),\n ])\n .description($`Registry URLs`)\n .hidden(),\n 'pluginStore.cdnForNpm': Schema.string()\n .description($`CDN to install packages from npm`)\n .default('https://cdn.jsdelivr.net/npm/{{ package }}{{ version ? \"@\" + version : \"\" }}')\n .hidden(),\n 'pluginStore.plugins': Schema.array(\n Schema.object({\n source: Schema.union(['online_manifest', 'npm']).default('online_manifest'),\n registry: Schema.string().required(),\n id: Schema.string().required(),\n })\n )\n .description($`Installed plugins`)\n .default([])\n .hidden(),\n }),\n 'plugin-store'\n )\n }\n\n async showModal() {\n const modal = this.ctx.modal.show({\n title: $`Plugin Store`,\n sizeClass: 'small',\n })\n const container = <section id=\"ipe-plugin-store-vue\"></section>\n modal.setContent(container)\n const app = await this._createManagementApp()\n app.mount(container)\n modal.on(modal.Event.Close, () => {\n app.unmount()\n })\n return modal\n }\n\n private _installedPlugins = new Map<string, Promise<ForkScope<InPageEdit> | null>>()\n async install(\n registry: string,\n id: string,\n source: PluginStoreRegistrySource = 'online_manifest',\n _by: 'new-added' | 'user-preference' = 'new-added'\n ): Promise<ForkScope<InPageEdit> | null> {\n const registryInfo = await this.getRegistryInfo(registry, source)\n if (!registryInfo) {\n this.ctx.logger.warn(`Registry ${registry} not found`)\n return null\n }\n const key = `${registry}#${id}`\n if (this._installedPlugins.has(key)) {\n return (await this._installedPlugins.get(key)) ?? null\n }\n // 2) 把 registry 原始 URL 传进去,供 URL 解析使用\n const scope = this._installOneByRegistryInfo(registry, registryInfo, id)\n this._installedPlugins.set(key, scope)\n const fork = await scope\n if (fork) {\n this.ctx.emit('plugin-store/plugin-installed', {\n ctx: this.ctx,\n registry: registryInfo,\n id,\n by: _by,\n })\n }\n return fork\n }\n async uninstall(registry: string, id: string): Promise<boolean> {\n const promise = this._installedPlugins.get(`${registry}#${id}`)\n if (promise === void 0) {\n return true // not installed or already uninstalled\n }\n this._installedPlugins.delete(`${registry}#${id}`)\n const scope = await promise\n if (scope) {\n const disposed = scope.dispose?.() ?? true // disposed successfully\n try {\n const registryInfo =\n (await this.getRegistryCache(registry)) ||\n (await this.getRegistryInfo(registry).catch(() => null))\n if (registryInfo) {\n this.ctx.emit('plugin-store/plugin-uninstalled', {\n ctx: this.ctx,\n registry: registryInfo,\n id,\n })\n }\n } catch {}\n return disposed\n }\n return true // not a plugin, just removed from the list\n }\n\n async addToPreferences(registry: string, id: string) {\n let prefs =\n (await this.ctx.preferences.get<{ registry: string; id: string }[]>('pluginStore.plugins')) ||\n []\n const existed = prefs.some((p) => p.registry === registry && p.id === id)\n if (existed) {\n return true\n }\n prefs.push({ registry, id })\n await this.ctx.preferences.set('pluginStore.plugins', prefs)\n return true\n }\n async removeFromPreferences(registry: string, id: string) {\n let prefs =\n (await this.ctx.preferences.get<{ registry: string; id: string }[]>('pluginStore.plugins')) ||\n []\n prefs = prefs.filter((p) => p.registry !== registry || p.id !== id)\n await this.ctx.preferences.set('pluginStore.plugins', prefs)\n return true\n }\n\n async installAndSetPreference(registry: string, id: string) {\n await this.addToPreferences(registry, id)\n return this.install(registry, id, 'online_manifest', 'new-added')\n }\n async uninstallAndRemovePreference(registry: string, id: string) {\n await this.removeFromPreferences(registry, id)\n return this.uninstall(registry, id)\n }\n\n // 3) 增加 registryUrl 参数\n private async _installOneByRegistryInfo(\n registryUrl: string,\n registryInfo: PluginStoreRegistry,\n id: string\n ): Promise<ForkScope<InPageEdit> | null> {\n const baseUrl = registryInfo.base_url\n const pkg = registryInfo.packages.find((p) => p.id === id)\n if (!pkg) {\n this.ctx.logger.warn(`Package ${id} not found in registry ${registryUrl}`)\n return null\n }\n\n const loader = pkg.loader\n const { kind, entry = 'index.js', styles = [], main_export = null } = loader\n\n // 4) 统一用 resolveResourceUrl 解析入口\n let entryUrl: string | null = null\n if (kind !== 'styles') {\n if (!entry) {\n this.ctx.logger.warn(`Entry url missing for ${id}`, loader)\n return null\n }\n try {\n entryUrl = resolveResourceUrl(entry, baseUrl, registryUrl)\n } catch (e) {\n this.ctx.logger.warn(\n `Failed to resolve entry \"${entry}\" with base \"${baseUrl}\" and registry \"${registryUrl}\"`,\n e\n )\n return null\n }\n }\n\n const datasets = {\n 'data-plugin-registry': registryUrl,\n 'data-plugin-id': id,\n }\n\n let fork: ForkScope<InPageEdit> | null = null\n\n switch (kind) {\n case 'autoload': {\n fork = this.ctx.plugin({\n inject: ['resourceLoader'],\n name: `plugin-store-${registryUrl}-${id}`,\n apply: (ctx) => {\n if (!entryUrl) return\n ctx.resourceLoader.loadScript(entryUrl, { ...datasets })\n },\n })\n break\n }\n case 'module': {\n if (!entryUrl) {\n this.ctx.logger.warn(`Entry url missing for module kind, package ${id}`)\n return null\n }\n const apply = await import(/* @vite-ignore */ entryUrl).then(\n (m) => (main_export ? m[main_export] : m.default) ?? m\n )\n if (!apply) {\n this.ctx.logger.warn(`Main export ${main_export} not found in module ${entryUrl}`)\n return null\n }\n fork = this.ctx.plugin(apply)\n break\n }\n case 'umd': {\n let apply = tryGetGlobalPlugin(main_export!)\n if (!apply) {\n if (!entryUrl) {\n this.ctx.logger.warn(`Entry url missing for umd kind, package ${id}`)\n return null\n }\n await this.ctx.resourceLoader.loadScript(entryUrl, { ...datasets })\n apply = tryGetGlobalPlugin(main_export!)\n }\n if (!apply) {\n this.ctx.logger.warn(\n `Main export ${main_export} not found on globalThis after loading ${entryUrl}`\n )\n return null\n }\n fork = this.ctx.plugin(apply)\n break\n }\n case 'styles': {\n // 没有脚本,仅样式。下面统一样式注入逻辑会覆盖\n break\n }\n }\n\n // 5) 统一解析并注入样式(兼容绝对URL与相对 + base_url 的组合)\n if (styles && styles.length > 0) {\n let urls: string[] = []\n try {\n urls = styles.map((u) => resolveResourceUrl(u, baseUrl, registryUrl)).filter(Boolean)\n } catch (e) {\n this.ctx.logger.warn(`Failed to resolve styles for ${id}`, styles, e)\n }\n\n // 确保存在父 fork\n fork ||= this.ctx.plugin({ name: `plugin-store-${registryUrl}-${id}`, apply() {} })\n\n // 在子插件里加载样式,并在卸载时清理\n fork.ctx.plugin({\n inject: ['resourceLoader'],\n name: `plugin-store-${registryUrl}-${id}-styles`,\n apply: (ctx) => {\n urls.forEach((u) => ctx.resourceLoader.loadStyle(u, { ...datasets }))\n ctx.on('dispose', () => {\n try {\n urls.forEach((u) => ctx.resourceLoader.removeStyle(u))\n } catch (e) {\n console.info('styles cleanup failed', e)\n }\n })\n },\n })\n }\n\n return fork\n }\n\n validateRegistry(data: any): PluginStoreRegistry {\n return PluginStoreSchemas.Registry(data)\n }\n\n async getRegistryInfo(\n registry: string,\n source: PluginStoreRegistrySource = 'online_manifest',\n noCache = false\n ): Promise<PluginStoreRegistry> {\n try {\n let info: PluginStoreRegistry\n switch (source) {\n case 'online_manifest': {\n info = await this._fetchOnlineRegistryInfo(registry, noCache)\n this.logger.debug('Fetched registry info from online manifest', info)\n this.setRegistryCache(registry, info)\n break\n }\n default: {\n throw new Error(`Unsupported registry source: ${source}`)\n }\n }\n\n return info\n } catch (e) {\n this.ctx.logger.warn('Failed to fetch registry info', e)\n }\n\n const info = await this.getRegistryCache(registry)\n if (!info) {\n this.ctx.emit('plugin-store/registry-not-found', {\n ctx: this.ctx,\n registryUrl: registry,\n })\n throw new Error(`Failed to fetch registry info: ${registry}`)\n }\n return info\n }\n\n private _onlineRegistryQueries = new Map<string, Promise<PluginStoreRegistry>>()\n private async _fetchOnlineRegistryInfo(\n registry: string,\n noCache = false\n ): Promise<PluginStoreRegistry> {\n if (!noCache && this._onlineRegistryQueries.has(registry)) {\n return await this._onlineRegistryQueries.get(registry)!\n }\n const task = async () => {\n const payload: RequestInit = {\n method: 'GET',\n }\n if (noCache) {\n payload.cache = 'no-store'\n }\n const response = await fetch(registry, payload)\n const data = await response.json()\n const validated = this.validateRegistry(data)\n // 成功在线获取并校验后触发事件\n this.ctx.emit('plugin-store/registry-fetched', {\n ctx: this.ctx,\n registry: validated,\n })\n return validated\n }\n const promise = task()\n this._onlineRegistryQueries.set(registry, promise)\n return await promise\n }\n\n private async getRegistryCache(registry: string) {\n const data = await this.regInfoDB.get(registry)\n if (data) {\n try {\n const validated = this.validateRegistry(data)\n return validated\n } catch (e) {\n this.ctx.logger.warn('Invalid cached registry', e, data)\n this.regInfoDB.delete(registry)\n }\n }\n return null\n }\n private async setRegistryCache(registry: string, data: PluginStoreRegistry) {\n return this.regInfoDB.set(registry, data)\n }\n private async deleteRegistryCache(registry: string) {\n await this.regInfoDB.delete(registry)\n this.ctx.emit('plugin-store/registry-removed', {\n ctx: this.ctx,\n registryUrl: registry,\n })\n }\n async clearAllRegistryCaches() {\n await this.regInfoDB.clear()\n this.ctx.logger.debug('All registry caches cleared')\n }\n\n /**\n * 刷新指定 registry 的缓存(重新从网络获取)\n */\n async refreshRegistryCache(registry: string): Promise<PluginStoreRegistry> {\n const data = await this.getRegistryInfo(registry, 'online_manifest', true)\n if (!data) {\n throw new Error(`Failed to refresh registry cache: ${registry}`)\n }\n this.ctx.logger.debug('Registry cache refreshed:', registry)\n return data\n }\n\n /**\n * 刷新所有已配置的 registry 缓存\n */\n async refreshAllRegistryCaches(): Promise<Record<string, PluginStoreRegistry | null>> {\n const registryUrls = (await this.ctx.preferences.get('pluginStore.registries')) || []\n const responses = await Promise.allSettled(\n registryUrls.map((url) => this.refreshRegistryCache(url))\n )\n const results: Record<string, PluginStoreRegistry | null> = {}\n for (const [index, response] of responses.entries()) {\n if (response.status === 'fulfilled') {\n results[registryUrls[index]] = response.value\n } else {\n results[registryUrls[index]] = null\n }\n }\n return results\n }\n}\n"],"names":["PLUGIN_STORE_REGISTRY_MANIFEST_VERSION","PluginStoreSchemas","Schema","_PluginPluginStore_decorators","_init","_a","tryGetGlobalPlugin","main_export","acc","key","resolveResourceUrl","resourcePath","baseUrl","registryUrl","ensureSlash","s","normalizedBase","registryAbs","resolvedBaseUrl","Inject","_PluginPluginStore","BasePlugin","ctx","prefs","pref","PluginStoreApp","defineAsyncComponent","createVueAppWithIPE","$","onUnmount","container","jsx","app","Endpoints","modal","registry","id","source","_by","registryInfo","scope","fork","promise","disposed","p","pkg","loader","kind","entry","styles","entryUrl","e","datasets","apply","m","urls","u","data","noCache","info","payload","validated","registryUrls","responses","url","results","index","response","__decoratorStart","__decorateElement","__runInitializers","PluginPluginStore"],"mappings":"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"}
1
+ {"version":3,"file":"index-C2_G8gLW.js","sources":["../src/plugins/plugin-store/schema.ts","../src/plugins/plugin-store/index.tsx"],"sourcesContent":["import Schema from 'schemastery'\n\nexport const PLUGIN_STORE_REGISTRY_MANIFEST_VERSION = 1\n\nexport interface PluginStoreRegistry {\n manifest_version: number\n name: string\n base_url: string\n homepage?: string\n maintainers?: PluginStoreRegistryMaintainer[]\n repository?: PluginStoreRegistryRepository\n packages: PluginStorePackage[]\n}\n\nexport interface PluginStoreRegistryMaintainer {\n name: string\n email?: string\n}\n\nexport interface PluginStoreRegistryRepository {\n type: string\n url: string\n}\n\nexport interface PluginStorePackage {\n id: string\n name: string\n version: string\n description?: string\n author?: string\n license?: string\n loader: PluginStorePackageLoader\n}\n\nexport interface PluginStorePackageLoader {\n kind: 'autoload' | 'module' | 'umd' | 'styles'\n entry?: string\n styles?: string[]\n main_export?: string\n}\n\nexport namespace PluginStoreSchemas {\n export const PackageLoader = new Schema<PluginStorePackageLoader>(\n Schema.object({\n kind: Schema.union(['autoload', 'module', 'umd', 'styles']).required().default('autoload'),\n entry: Schema.string(),\n styles: Schema.array(Schema.string()),\n main_export: Schema.string(),\n })\n )\n\n export const Package = new Schema<PluginStorePackage>(\n Schema.object({\n id: Schema.string().required(),\n name: Schema.string().required(),\n version: Schema.string().required(),\n description: Schema.string(),\n author: Schema.string(),\n license: Schema.string(),\n loader: PackageLoader.required(),\n })\n )\n\n export const RegistryMaintainer = new Schema<PluginStoreRegistryMaintainer>(\n Schema.object({\n name: Schema.string().required(),\n email: Schema.string(),\n })\n )\n\n export const RegistryRepository = new Schema<PluginStoreRegistryRepository>(\n Schema.object({\n type: Schema.string().required(),\n url: Schema.string().required(),\n })\n )\n\n export const Registry = new Schema<PluginStoreRegistry>(\n Schema.object({\n manifest_version: Schema.number().min(PLUGIN_STORE_REGISTRY_MANIFEST_VERSION).required(),\n name: Schema.string().required(),\n base_url: Schema.string().required(),\n homepage: Schema.string(),\n maintainers: Schema.array(RegistryMaintainer),\n repository: RegistryRepository,\n packages: Schema.array(Package).required(),\n })\n )\n}\n","import { InPageEdit, Schema } from '@/InPageEdit'\nimport { ForkScope, Inject } from '@cordisjs/core'\nimport { defineAsyncComponent, type App as VueApp } from 'vue'\nimport { PluginStoreRegistry, PluginStoreSchemas } from './schema'\nimport { AbstractIPEStorageManager } from '@/services/storage/index.js'\n\ndeclare module '@/InPageEdit' {\n interface InPageEdit {\n store: PluginPluginStore\n }\n interface PreferencesMap {\n 'pluginStore.registries': string[]\n 'pluginStore.plugins': { source?: 'online_manifest' | 'npm'; registry: string; id: string }[]\n 'pluginStore.cdnForNpm': string\n }\n interface Events {\n 'plugin-store/registry-fetched'(payload: {\n ctx: InPageEdit\n registry: PluginStoreRegistry\n }): void\n 'plugin-store/registry-not-found'(payload: { ctx: InPageEdit; registryUrl: string }): void\n 'plugin-store/registry-removed'(payload: { ctx: InPageEdit; registryUrl: string }): void\n 'plugin-store/plugin-installed'(payload: {\n ctx: InPageEdit\n registry: PluginStoreRegistry\n id: string\n // 新安装 or 通过用户配置加载\n by: 'new-added' | 'user-preference'\n }): void\n 'plugin-store/plugin-uninstalled'(payload: {\n ctx: InPageEdit\n registry: PluginStoreRegistry\n id: string\n }): void\n }\n}\n\nexport type PluginStoreRegistrySource = 'online_manifest' | 'npm'\n\nconst tryGetGlobalPlugin = (main_export: string) => {\n if (!main_export) return null\n try {\n return main_export\n .split('.')\n .reduce<any>((acc, key) => (acc == null ? acc : acc[key]), globalThis as any)\n } catch {\n return null\n }\n}\n\n/**\n * 解析资源URL\n * @param resourcePath - entry或style路径,可能是相对路径或完整URL\n * @param baseUrl - registry中的base_url,可能是完整URL或相对路径\n * @param registryUrl - registry的URL(必须是绝对URL,作为相对baseUrl时的基准)\n * @returns 解析后的完整URL\n */\nconst resolveResourceUrl = (resourcePath: string, baseUrl: string, registryUrl: string): string => {\n // 完整URL:直接返回\n if (/^https?:\\/\\//i.test(resourcePath)) return resourcePath\n\n // 兜底:规范化一个“带尾斜杠”的 helper\n const ensureSlash = (s: string) => (s.endsWith('/') ? s : s + '/')\n\n // 如果 baseUrl 是完整URL:直接用它当基准(并确保目录语义)\n if (/^https?:\\/\\//i.test(baseUrl)) {\n const normalizedBase = ensureSlash(baseUrl)\n return new URL(resourcePath, normalizedBase).href\n }\n\n // baseUrl 是相对路径(如 './' 或 '/plugins')\n // 先把 baseUrl 相对于 registryUrl 解析成绝对URL\n // 注意:当 baseUrl 是 '/plugins' 这种根相对路径时,new URL 会以 registryUrl 的 origin 作为根。\n const registryAbs = (() => {\n try {\n return new URL(registryUrl).href\n } catch {\n // 极端情况(开发环境传了相对 registry),用页面 origin 兜底\n return new URL(registryUrl, location.origin).href\n }\n })()\n\n const resolvedBaseUrl = new URL(ensureSlash(baseUrl), registryAbs).href\n return new URL(resourcePath, resolvedBaseUrl).href\n}\n\n@Inject(['storage', 'preferences', 'resourceLoader', '$'])\nexport class PluginPluginStore extends BasePlugin {\n // re-export for external usage\n static readonly PluginStoreSchemas = PluginStoreSchemas\n static REGISTRY_INFO_CACHE_TTL = 1000 * 60 * 60 * 24 // 1 day\n static REGISTRY_INFO_STORAGE_NAME = 'plugin-store-registry'\n static REGISTRY_ETAG_STORAGE_NAME = 'psreg-etag'\n private regInfoDB: AbstractIPEStorageManager<PluginStoreRegistry>\n\n constructor(public ctx: InPageEdit) {\n super(ctx, {}, 'plugin-store')\n ctx.set('store', this)\n this.regInfoDB = ctx.storage.createDatabase<PluginStoreRegistry>(\n PluginPluginStore.REGISTRY_INFO_STORAGE_NAME,\n PluginPluginStore.REGISTRY_INFO_CACHE_TTL,\n 1,\n 'indexedDB'\n )\n }\n\n protected async start() {\n this._installUserPlugins()\n this._injectPreferenceUI()\n }\n\n private async _installUserPlugins() {\n const prefs = await this.ctx.preferences.get('pluginStore.plugins', [])\n if (!prefs?.length) {\n return\n }\n for (const pref of prefs) {\n this.install(pref.registry, pref.id, pref.source, 'user-preference')\n }\n }\n\n private async _createManagementApp() {\n const ctx = await this.ctx.withInject(['store'])\n const PluginStoreApp = defineAsyncComponent(() => import('./components/PluginStoreApp.vue'))\n const app = createVueAppWithIPE(ctx, PluginStoreApp)\n return app\n }\n\n private async _injectPreferenceUI() {\n const ctx = this.ctx\n const $ = ctx.$\n\n ctx.preferences.defineCategory({\n name: 'plugin-store',\n label: $`Plugin Store`,\n description: $`Plugin Store`,\n index: 90,\n autoGenerateForm: false,\n customRenderer: async ({ onUnmount }) => {\n const container = <div id=\"ipe-plugin-store-preferences-vue\"></div>\n const app = await this._createManagementApp()\n app.mount(container)\n\n onUnmount(() => {\n app.unmount()\n this.ctx.logger.debug('Plugin Store preferences app unmounted')\n })\n\n return (\n <section>\n {container}\n {/* <div className=\"theme-ipe-prose\">\n <hr />\n <div style={{ textAlign: 'center', marginBottom: '1em', fontSize: '0.8em' }}>\n 🚫 DO NOT edit fields below manually 🚫\n </div>\n </div> */}\n </section>\n )\n },\n })\n\n ctx.preferences.registerCustomConfig(\n 'plugin-store',\n Schema.object({\n 'pluginStore.registries': Schema.array(Schema.string())\n .default([\n import.meta.env.PROD\n ? Endpoints.PLUGIN_REGISTRY_URL\n : import.meta.resolve('/src/__mock__/plugin-registry/index.json'),\n ])\n .description($`Registry URLs`)\n .hidden(),\n 'pluginStore.cdnForNpm': Schema.string()\n .description($`CDN to install packages from npm`)\n .default('https://cdn.jsdelivr.net/npm/{{ package }}{{ version ? \"@\" + version : \"\" }}')\n .hidden(),\n 'pluginStore.plugins': Schema.array(\n Schema.object({\n source: Schema.union(['online_manifest', 'npm']).default('online_manifest'),\n registry: Schema.string().required(),\n id: Schema.string().required(),\n })\n )\n .description($`Installed plugins`)\n .default([])\n .hidden(),\n }),\n 'plugin-store'\n )\n }\n\n async showModal() {\n const modal = this.ctx.modal.show({\n title: $`Plugin Store`,\n sizeClass: 'small',\n })\n const container = <section id=\"ipe-plugin-store-vue\"></section>\n modal.setContent(container)\n const app = await this._createManagementApp()\n app.mount(container)\n modal.on(modal.Event.Close, () => {\n app.unmount()\n })\n return modal\n }\n\n private _installedPlugins = new Map<string, Promise<ForkScope<InPageEdit> | null>>()\n async install(\n registry: string,\n id: string,\n source: PluginStoreRegistrySource = 'online_manifest',\n _by: 'new-added' | 'user-preference' = 'new-added'\n ): Promise<ForkScope<InPageEdit> | null> {\n const registryInfo = await this.getRegistryInfo(registry, source)\n if (!registryInfo) {\n this.ctx.logger.warn(`Registry ${registry} not found`)\n return null\n }\n const key = `${registry}#${id}`\n if (this._installedPlugins.has(key)) {\n return (await this._installedPlugins.get(key)) ?? null\n }\n // 2) 把 registry 原始 URL 传进去,供 URL 解析使用\n const scope = this._installOneByRegistryInfo(registry, registryInfo, id)\n this._installedPlugins.set(key, scope)\n const fork = await scope\n if (fork) {\n this.ctx.emit('plugin-store/plugin-installed', {\n ctx: this.ctx,\n registry: registryInfo,\n id,\n by: _by,\n })\n }\n return fork\n }\n async uninstall(registry: string, id: string): Promise<boolean> {\n const promise = this._installedPlugins.get(`${registry}#${id}`)\n if (promise === void 0) {\n return true // not installed or already uninstalled\n }\n this._installedPlugins.delete(`${registry}#${id}`)\n const scope = await promise\n if (scope) {\n const disposed = scope.dispose?.() ?? true // disposed successfully\n try {\n const registryInfo =\n (await this.getRegistryCache(registry)) ||\n (await this.getRegistryInfo(registry).catch(() => null))\n if (registryInfo) {\n this.ctx.emit('plugin-store/plugin-uninstalled', {\n ctx: this.ctx,\n registry: registryInfo,\n id,\n })\n }\n } catch {}\n return disposed\n }\n return true // not a plugin, just removed from the list\n }\n\n async addToPreferences(registry: string, id: string) {\n let prefs =\n (await this.ctx.preferences.get<{ registry: string; id: string }[]>('pluginStore.plugins')) ||\n []\n const existed = prefs.some((p) => p.registry === registry && p.id === id)\n if (existed) {\n return true\n }\n prefs.push({ registry, id })\n await this.ctx.preferences.set('pluginStore.plugins', prefs)\n return true\n }\n async removeFromPreferences(registry: string, id: string) {\n let prefs =\n (await this.ctx.preferences.get<{ registry: string; id: string }[]>('pluginStore.plugins')) ||\n []\n prefs = prefs.filter((p) => p.registry !== registry || p.id !== id)\n await this.ctx.preferences.set('pluginStore.plugins', prefs)\n return true\n }\n\n async installAndSetPreference(registry: string, id: string) {\n await this.addToPreferences(registry, id)\n return this.install(registry, id, 'online_manifest', 'new-added')\n }\n async uninstallAndRemovePreference(registry: string, id: string) {\n await this.removeFromPreferences(registry, id)\n return this.uninstall(registry, id)\n }\n\n // 3) 增加 registryUrl 参数\n private async _installOneByRegistryInfo(\n registryUrl: string,\n registryInfo: PluginStoreRegistry,\n id: string\n ): Promise<ForkScope<InPageEdit> | null> {\n const baseUrl = registryInfo.base_url\n const pkg = registryInfo.packages.find((p) => p.id === id)\n if (!pkg) {\n this.ctx.logger.warn(`Package ${id} not found in registry ${registryUrl}`)\n return null\n }\n\n const loader = pkg.loader\n const { kind, entry = 'index.js', styles = [], main_export = null } = loader\n\n // 4) 统一用 resolveResourceUrl 解析入口\n let entryUrl: string | null = null\n if (kind !== 'styles') {\n if (!entry) {\n this.ctx.logger.warn(`Entry url missing for ${id}`, loader)\n return null\n }\n try {\n entryUrl = resolveResourceUrl(entry, baseUrl, registryUrl)\n } catch (e) {\n this.ctx.logger.warn(\n `Failed to resolve entry \"${entry}\" with base \"${baseUrl}\" and registry \"${registryUrl}\"`,\n e\n )\n return null\n }\n }\n\n const datasets = {\n 'data-plugin-registry': registryUrl,\n 'data-plugin-id': id,\n }\n\n let fork: ForkScope<InPageEdit> | null = null\n\n switch (kind) {\n case 'autoload': {\n fork = this.ctx.plugin({\n inject: ['resourceLoader'],\n name: `plugin-store-${registryUrl}-${id}`,\n apply: (ctx) => {\n if (!entryUrl) return\n ctx.resourceLoader.loadScript(entryUrl, { ...datasets })\n },\n })\n break\n }\n case 'module': {\n if (!entryUrl) {\n this.ctx.logger.warn(`Entry url missing for module kind, package ${id}`)\n return null\n }\n const apply = await import(/* @vite-ignore */ entryUrl).then(\n (m) => (main_export ? m[main_export] : m.default) ?? m\n )\n if (!apply) {\n this.ctx.logger.warn(`Main export ${main_export} not found in module ${entryUrl}`)\n return null\n }\n fork = this.ctx.plugin(apply)\n break\n }\n case 'umd': {\n let apply = tryGetGlobalPlugin(main_export!)\n if (!apply) {\n if (!entryUrl) {\n this.ctx.logger.warn(`Entry url missing for umd kind, package ${id}`)\n return null\n }\n await this.ctx.resourceLoader.loadScript(entryUrl, { ...datasets })\n apply = tryGetGlobalPlugin(main_export!)\n }\n if (!apply) {\n this.ctx.logger.warn(\n `Main export ${main_export} not found on globalThis after loading ${entryUrl}`\n )\n return null\n }\n fork = this.ctx.plugin(apply)\n break\n }\n case 'styles': {\n // 没有脚本,仅样式。下面统一样式注入逻辑会覆盖\n break\n }\n }\n\n // 5) 统一解析并注入样式(兼容绝对URL与相对 + base_url 的组合)\n if (styles && styles.length > 0) {\n let urls: string[] = []\n try {\n urls = styles.map((u) => resolveResourceUrl(u, baseUrl, registryUrl)).filter(Boolean)\n } catch (e) {\n this.ctx.logger.warn(`Failed to resolve styles for ${id}`, styles, e)\n }\n\n // 确保存在父 fork\n fork ||= this.ctx.plugin({ name: `plugin-store-${registryUrl}-${id}`, apply() {} })\n\n // 在子插件里加载样式,并在卸载时清理\n fork.ctx.plugin({\n inject: ['resourceLoader'],\n name: `plugin-store-${registryUrl}-${id}-styles`,\n apply: (ctx) => {\n urls.forEach((u) => ctx.resourceLoader.loadStyle(u, { ...datasets }))\n ctx.on('dispose', () => {\n try {\n urls.forEach((u) => ctx.resourceLoader.removeStyle(u))\n } catch (e) {\n console.info('styles cleanup failed', e)\n }\n })\n },\n })\n }\n\n return fork\n }\n\n validateRegistry(data: any): PluginStoreRegistry {\n return PluginStoreSchemas.Registry(data)\n }\n\n async getRegistryInfo(\n registry: string,\n source: PluginStoreRegistrySource = 'online_manifest',\n noCache = false\n ): Promise<PluginStoreRegistry> {\n try {\n let info: PluginStoreRegistry\n switch (source) {\n case 'online_manifest': {\n info = await this._fetchOnlineRegistryInfo(registry, noCache)\n this.logger.debug('Fetched registry info from online manifest', info)\n this.setRegistryCache(registry, info)\n break\n }\n default: {\n throw new Error(`Unsupported registry source: ${source}`)\n }\n }\n\n return info\n } catch (e) {\n this.ctx.logger.warn('Failed to fetch registry info', e)\n }\n\n const info = await this.getRegistryCache(registry)\n if (!info) {\n this.ctx.emit('plugin-store/registry-not-found', {\n ctx: this.ctx,\n registryUrl: registry,\n })\n throw new Error(`Failed to fetch registry info: ${registry}`)\n }\n return info\n }\n\n private _onlineRegistryQueries = new Map<string, Promise<PluginStoreRegistry>>()\n private async _fetchOnlineRegistryInfo(\n registry: string,\n noCache = false\n ): Promise<PluginStoreRegistry> {\n if (!noCache && this._onlineRegistryQueries.has(registry)) {\n return await this._onlineRegistryQueries.get(registry)!\n }\n const task = async () => {\n const payload: RequestInit = {\n method: 'GET',\n }\n if (noCache) {\n payload.cache = 'no-store'\n }\n const response = await fetch(registry, payload)\n const data = await response.json()\n const validated = this.validateRegistry(data)\n // 成功在线获取并校验后触发事件\n this.ctx.emit('plugin-store/registry-fetched', {\n ctx: this.ctx,\n registry: validated,\n })\n return validated\n }\n const promise = task()\n this._onlineRegistryQueries.set(registry, promise)\n return await promise\n }\n\n private async getRegistryCache(registry: string) {\n const data = await this.regInfoDB.get(registry)\n if (data) {\n try {\n const validated = this.validateRegistry(data)\n return validated\n } catch (e) {\n this.ctx.logger.warn('Invalid cached registry', e, data)\n this.regInfoDB.delete(registry)\n }\n }\n return null\n }\n private async setRegistryCache(registry: string, data: PluginStoreRegistry) {\n return this.regInfoDB.set(registry, data)\n }\n private async deleteRegistryCache(registry: string) {\n await this.regInfoDB.delete(registry)\n this.ctx.emit('plugin-store/registry-removed', {\n ctx: this.ctx,\n registryUrl: registry,\n })\n }\n async clearAllRegistryCaches() {\n await this.regInfoDB.clear()\n this.ctx.logger.debug('All registry caches cleared')\n }\n\n /**\n * 刷新指定 registry 的缓存(重新从网络获取)\n */\n async refreshRegistryCache(registry: string): Promise<PluginStoreRegistry> {\n const data = await this.getRegistryInfo(registry, 'online_manifest', true)\n if (!data) {\n throw new Error(`Failed to refresh registry cache: ${registry}`)\n }\n this.ctx.logger.debug('Registry cache refreshed:', registry)\n return data\n }\n\n /**\n * 刷新所有已配置的 registry 缓存\n */\n async refreshAllRegistryCaches(): Promise<Record<string, PluginStoreRegistry | null>> {\n const registryUrls = (await this.ctx.preferences.get('pluginStore.registries')) || []\n const responses = await Promise.allSettled(\n registryUrls.map((url) => this.refreshRegistryCache(url))\n )\n const results: Record<string, PluginStoreRegistry | null> = {}\n for (const [index, response] of responses.entries()) {\n if (response.status === 'fulfilled') {\n results[registryUrls[index]] = response.value\n } else {\n results[registryUrls[index]] = null\n }\n }\n return results\n }\n}\n"],"names":["PLUGIN_STORE_REGISTRY_MANIFEST_VERSION","PluginStoreSchemas","Schema","_PluginPluginStore_decorators","_init","_a","tryGetGlobalPlugin","main_export","acc","key","resolveResourceUrl","resourcePath","baseUrl","registryUrl","ensureSlash","s","normalizedBase","registryAbs","resolvedBaseUrl","Inject","_PluginPluginStore","BasePlugin","ctx","prefs","pref","PluginStoreApp","defineAsyncComponent","createVueAppWithIPE","$","onUnmount","container","jsx","app","Endpoints","modal","registry","id","source","_by","registryInfo","scope","fork","promise","disposed","p","pkg","loader","kind","entry","styles","entryUrl","e","datasets","apply","m","urls","u","data","noCache","info","payload","validated","registryUrls","responses","url","results","index","response","__decoratorStart","__decorateElement","__runInitializers","PluginPluginStore"],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import { j as i, F as S, P as E } from "./Promise.withResolvers-C4chhLB1.js";
2
- import { q as C, h as q, a as $, R as z, S as b } from "./index-QnWieXQc.js";
2
+ import { q as C, h as q, a as $, R as z, S as b } from "./index-BfW7ObKf.js";
3
3
  import { I as j, M as I } from "./IconQuickEdit-BiRYADU_.js";
4
4
  import { BasePlugin as Q } from "./core.js";
5
5
  import { I as T } from "./IconQuickDiff-BkbxyY-d.js";
@@ -389,4 +389,4 @@ J(g, 1, v);
389
389
  export {
390
390
  v as PluginQuickDiff
391
391
  };
392
- //# sourceMappingURL=index-Dm2vgYkZ.js.map
392
+ //# sourceMappingURL=index-C4ncbyR6.js.map