wiki-saikou
Version:
The library provides the out of box accessing to MediaWiki API in both browsers & Node.js, and the syntax is very similar to vanilla `new mw.Api()`. TypeScript definition included~
1 lines • 48.3 kB
Source Map (JSON)
{"version":3,"file":"index.cjs","sources":["../node_modules/.pnpm/fexios@3.0.0/node_modules/fexios/dist/index.js","../src/index.ts"],"sourcesContent":["var y = /* @__PURE__ */ ((s) => (s.BODY_USED = \"BODY_USED\", s.NO_BODY_READER = \"NO_BODY_READER\", s.TIMEOUT = \"TIMEOUT\", s.NETWORK_ERROR = \"NETWORK_ERROR\", s.BODY_NOT_ALLOWED = \"BODY_NOT_ALLOWED\", s.HOOK_CONTEXT_CHANGED = \"HOOK_CONTEXT_CHANGED\", s.ABORTED_BY_HOOK = \"ABORTED_BY_HOOK\", s.INVALID_HOOK_CALLBACK = \"INVALID_HOOK_CALLBACK\", s.UNEXPECTED_HOOK_RETURN = \"UNEXPECTED_HOOK_RETURN\", s))(y || {});\nclass d extends Error {\n constructor(r, t, e, o) {\n super(t, o), this.code = r, this.context = e, this.name = \"FexiosError\";\n }\n}\nclass H extends d {\n constructor(r, t, e) {\n super(t.statusText, r, void 0, e), this.response = t, this.name = \"FexiosResponseError\";\n }\n}\nconst K = (s) => !(s instanceof H) && s instanceof d;\nfunction j(s, r = 1024) {\n if (!(s instanceof Uint8Array))\n throw new TypeError(\"Input must be a Uint8Array\");\n const t = s.slice(0, r), e = new TextDecoder(\"utf-8\", { fatal: !0 });\n try {\n const o = e.decode(t), n = /[\\x00-\\x08\\x0E-\\x1F\\x7F]/g, h = o.match(n);\n return !(h && h.length / o.length > 0.1);\n } catch {\n return !1;\n }\n}\nfunction S(s) {\n if (typeof s != \"object\" || s === null || Object.prototype.toString.call(s) !== \"[object Object]\")\n return !1;\n const r = Object.getPrototypeOf(s);\n return r === Object.prototype || r === null;\n}\nfunction U(s, r = {}) {\n const t = {};\n return Object.entries(s).forEach(([e, o]) => {\n o != null && (r.dropEmptyString && o === \"\" || (t[e] = o));\n }), t;\n}\nclass E {\n constructor(r, t, e) {\n this.rawResponse = r, this.data = t, this.ok = r.ok, this.status = r.status, this.statusText = r.statusText, this.headers = r.headers, Object.entries(e || {}).forEach(([o, n]) => {\n this[o] = n;\n });\n }\n}\nasync function I(s, r, t) {\n var l;\n if (s.bodyUsed)\n throw new d(\n y.BODY_USED,\n \"Response body has already been used or locked\"\n );\n const e = s.headers.get(\"content-type\") || \"\", o = Number(s.headers.get(\"content-length\")) || 0, n = (i, c) => c === \"json\" || i.startsWith(\"application/json\"), h = (i, c, a) => a === \"blob\" || i.startsWith(\"image/\") || i.startsWith(\"video/\") || i.startsWith(\"audio/\") || !j(c);\n if ((s.status === 101 || s.status === 426 || s.headers.get(\"upgrade\")) && typeof globalThis.WebSocket < \"u\") {\n const i = new WebSocket(s.url);\n return await new Promise((c, a) => {\n i.onopen = c, i.onerror = a;\n }), new E(s, i, {\n ok: !0,\n status: 101,\n statusText: \"Switching Protocols\"\n });\n } else if (e.startsWith(\"text/event-stream\") && ![\"text\", \"json\"].includes(r || \"\") && typeof globalThis.EventSource < \"u\") {\n const i = new EventSource(s.url);\n return await new Promise((c, a) => {\n i.onopen = c, i.onerror = a;\n }), new E(s, i);\n } else {\n if (r === \"stream\")\n return new E(\n s,\n s.body\n );\n {\n const c = (l = s.clone().body) == null ? void 0 : l.getReader();\n if (!c)\n throw new d(\n y.NO_BODY_READER,\n \"Failed to get ReadableStream from response body\"\n );\n let a = new Uint8Array();\n for (; ; ) {\n const { done: O, value: b } = await c.read();\n if (O) break;\n if (b && (a = new Uint8Array([...a, ...b]), t && o > 0)) {\n const m = Math.min(a.length / o, 1);\n t(m, a);\n }\n }\n const f = new E(s, void 0);\n if (h(e, a, r) ? f.data = new Blob([a], {\n type: s.headers.get(\"content-type\") || void 0\n }) : f.data = new TextDecoder().decode(a), n(e, r))\n try {\n f.data = JSON.parse(f.data);\n } catch {\n }\n if (typeof f.data == \"string\" && r !== \"text\") {\n const O = f.data.trim(), b = O[0], m = O[O.length - 1];\n if (b === \"{\" && m === \"}\" || b === \"[\" && m === \"]\")\n try {\n f.data = JSON.parse(f.data);\n } catch {\n }\n }\n if (typeof f.data > \"u\" && (f.data = a.length > 0 ? a : void 0), f.ok)\n return f;\n throw new H(\n `Request failed with status code ${s.status}`,\n f\n );\n }\n }\n}\nclass P {\n /**\n * Build URLSearchParams from a record object with proper array handling\n * @param query - The query object containing key-value pairs\n * @returns URLSearchParams instance\n */\n static makeSearchParams(r) {\n const t = new URLSearchParams();\n return Object.entries(r).forEach(([e, o]) => {\n Array.isArray(o) ? o.forEach((n) => t.append(e, String(n))) : t.set(e, String(o));\n }), t;\n }\n /**\n * Build query string from a record object with proper array handling\n * @param query - The query object containing key-value pairs\n * @returns URL-encoded query string\n */\n static makeQueryString(r) {\n return this.makeSearchParams(r).toString();\n }\n}\nfunction C(s) {\n return s && s.__esModule && Object.prototype.hasOwnProperty.call(s, \"default\") ? s.default : s;\n}\nvar D, A;\nfunction B() {\n if (A) return D;\n A = 1;\n function s(r) {\n var t = this.constructor.prototype[r], e = function() {\n return t.apply(e, arguments);\n };\n return Object.setPrototypeOf(e, this.constructor.prototype), Object.getOwnPropertyNames(t).forEach(function(o) {\n Object.defineProperty(e, o, Object.getOwnPropertyDescriptor(t, o));\n }), e;\n }\n return s.prototype = Object.create(Function.prototype), D = s, D;\n}\nvar q = B();\nconst W = /* @__PURE__ */ C(q);\nclass T extends W {\n constructor(r = {}) {\n super(\"request\"), this.baseConfigs = r, this.hooks = [], this.DEFAULT_CONFIGS = {\n baseURL: \"\",\n timeout: 60 * 1e3,\n credentials: \"same-origin\",\n headers: {},\n query: {},\n responseType: void 0\n }, this.ALL_METHODS = [\n \"get\",\n \"post\",\n \"put\",\n \"patch\",\n \"delete\",\n \"head\",\n \"options\",\n \"trace\"\n ], this.METHODS_WITHOUT_BODY = [\n \"get\",\n \"head\",\n \"options\",\n \"trace\"\n ], this.interceptors = {\n request: this.createInterceptor(\"beforeRequest\"),\n response: this.createInterceptor(\"afterResponse\")\n }, this.create = T.create, this.dropUndefinedAndNull = U, this.checkIsPlainObject = S, this.ALL_METHODS.forEach(this.createMethodShortcut.bind(this));\n }\n async request(r, t) {\n var m, R, k, L;\n let e = t = t || {};\n typeof r == \"string\" || r instanceof URL ? e.url = r.toString() : typeof r == \"object\" && (e = { ...r, ...e }), e = await this.emit(\"beforeInit\", e);\n const o = t.baseURL || this.baseConfigs.baseURL || ((m = globalThis.location) == null ? void 0 : m.href), n = o ? new URL(o, (R = globalThis.location) == null ? void 0 : R.href) : void 0, h = new URL(e.url.toString(), n);\n e.url = h.href, e.baseURL = n ? n.href : h.origin, e.headers = this.mergeHeaders(\n this.baseConfigs.headers,\n t.headers\n );\n const l = n == null ? void 0 : n.searchParams, i = new URLSearchParams(h.searchParams);\n if (h.search = \"\", e.url = h.href, e.query = this.mergeQuery(\n l,\n // baseURL query (lowest priority)\n this.baseConfigs.query,\n // defaultOptions (baseOptions)\n i,\n // requestURL query (urlParams)\n t.query\n // requestOptions (highest priority)\n ), h.search = P.makeQueryString(e.query), e.url = h.toString(), this.METHODS_WITHOUT_BODY.includes(\n (k = e.method) == null ? void 0 : k.toLocaleLowerCase()\n ) && e.body)\n throw new d(\n y.BODY_NOT_ALLOWED,\n `Request method \"${e.method}\" does not allow body`\n );\n e = await this.emit(\"beforeRequest\", e);\n let c;\n typeof e.body < \"u\" && e.body !== null && (e.body instanceof Blob || e.body instanceof FormData || e.body instanceof URLSearchParams ? c = e.body : typeof e.body == \"object\" && e.body !== null ? (c = JSON.stringify(e.body), e.headers[\"content-type\"] = \"application/json\") : c = e.body), !((L = t.headers) != null && L[\"content-type\"]) && c && (c instanceof FormData || c instanceof URLSearchParams ? delete e.headers[\"content-type\"] : typeof c == \"string\" && typeof e.body == \"object\" ? e.headers[\"content-type\"] = \"application/json\" : c instanceof Blob && (e.headers[\"content-type\"] = c.type)), e.body = c, e = await this.emit(\"afterBodyTransformed\", e);\n const a = e.abortController || globalThis.AbortController ? new AbortController() : void 0, f = new Request(e.url, {\n method: e.method || \"GET\",\n credentials: e.credentials,\n cache: e.cache,\n mode: e.mode,\n headers: e.headers,\n body: e.body,\n signal: a == null ? void 0 : a.signal\n });\n e.rawRequest = f, e = await this.emit(\"beforeActualFetch\", e);\n const O = e.timeout || this.baseConfigs.timeout || 60 * 1e3;\n if (e.url.startsWith(\"ws\"))\n try {\n const u = new WebSocket(e.url);\n return await new Promise((g, p) => {\n const w = setTimeout(() => {\n p(\n new d(\n y.TIMEOUT,\n `WebSocket connection timed out after ${O}ms`,\n e\n )\n );\n }, O);\n u.onopen = () => {\n clearTimeout(w), g();\n }, u.onerror = (_) => {\n clearTimeout(w), p(\n new d(\n y.NETWORK_ERROR,\n \"WebSocket connection failed\",\n e\n )\n );\n }, u.onclose = (_) => {\n _.code !== 1e3 && (clearTimeout(w), p(\n new d(\n y.NETWORK_ERROR,\n `WebSocket closed with code ${_.code}`,\n e\n )\n ));\n };\n }), e.rawResponse = new Response(), e.response = new E(e.rawResponse, u, {\n ok: !0,\n status: 101,\n statusText: \"Switching Protocols\"\n }), e.data = u, e.headers = new Headers(), this.emit(\"afterResponse\", e);\n } catch (u) {\n throw u instanceof d ? u : new d(\n y.NETWORK_ERROR,\n `WebSocket creation failed: ${u}`,\n e\n );\n }\n let b;\n try {\n a && (b = setTimeout(() => {\n a.abort();\n }, O));\n const u = await fetch(e.rawRequest).catch((g) => {\n throw b && clearTimeout(b), a != null && a.signal.aborted ? new d(\n y.TIMEOUT,\n `Request timed out after ${O}ms`,\n e\n ) : new d(y.NETWORK_ERROR, g.message, e);\n });\n return b && clearTimeout(b), e.rawResponse = u, e.response = await I(\n u,\n e.responseType,\n (g, p) => {\n var w;\n (w = t == null ? void 0 : t.onProgress) == null || w.call(t, g, p);\n }\n ), e.data = e.response.data, e.headers = e.response.headers, this.emit(\"afterResponse\", e);\n } catch (u) {\n throw b && clearTimeout(b), u;\n }\n }\n mergeQuery(r, ...t) {\n const e = {}, o = (n) => {\n n && (S(n) ? Object.entries(n).forEach(([h, l]) => {\n l == null ? delete e[h] : Array.isArray(l) ? (h.endsWith(\"[]\"), e[h] = l.map(String)) : e[h] = String(l);\n }) : new URLSearchParams(n).forEach((l, i) => {\n e[i] = l;\n }));\n };\n return o(r), t.forEach(o), e;\n }\n mergeHeaders(r, ...t) {\n const e = {}, o = new Headers(r);\n for (const n of t) {\n if (n == null) continue;\n if (S(n)) {\n const l = U(n);\n if (Object.keys(l).length === 0) continue;\n new Headers(l).forEach((c, a) => {\n o.set(a, c);\n });\n } else\n new Headers(n).forEach((i, c) => {\n o.set(c, i);\n });\n }\n return o.forEach((n, h) => {\n e[h] = n;\n }), e;\n }\n async emit(r, t) {\n const e = this.hooks.filter((o) => o.event === r);\n try {\n let o = 0;\n for (const n of e) {\n const h = `${r}#${n.action.name || `anonymous#${o}`}`, l = Symbol(\"FexiosHookContext\");\n t[l] = l;\n const i = await n.action.call(this, t);\n if (i === !1)\n throw new d(\n y.ABORTED_BY_HOOK,\n `Request aborted by hook \"${h}\"`,\n t\n );\n if (typeof i == \"object\" && i[l] === l)\n t = i;\n else {\n const c = globalThis[\"\".concat(\"console\")];\n try {\n throw new d(\n y.HOOK_CONTEXT_CHANGED,\n `Hook \"${h}\" should return the original FexiosContext or return false to abort the request, but got \"${i}\".`\n );\n } catch (a) {\n c.warn(a.stack || a);\n }\n }\n delete t[l], o++;\n }\n } catch (o) {\n return Promise.reject(o);\n }\n return t;\n }\n on(r, t, e = !1) {\n if (typeof t != \"function\")\n throw new d(\n y.INVALID_HOOK_CALLBACK,\n `Hook should be a function, but got \"${typeof t}\"`\n );\n return this.hooks[e ? \"unshift\" : \"push\"]({\n event: r,\n action: t\n }), this;\n }\n off(r, t) {\n return r === \"*\" || !r ? this.hooks = this.hooks.filter((e) => e.action !== t) : this.hooks = this.hooks.filter(\n (e) => e.event !== r || e.action !== t\n ), this;\n }\n createInterceptor(r) {\n return {\n handlers: () => this.hooks.filter((t) => t.event === r).map((t) => t.action),\n use: (t, e = !1) => this.on(r, t, e),\n clear: () => {\n this.hooks = this.hooks.filter((t) => t.event !== r);\n }\n };\n }\n createMethodShortcut(r) {\n return Object.defineProperty(this, r, {\n value: (t, e, o) => (this.METHODS_WITHOUT_BODY.includes(\n r.toLocaleLowerCase()\n ) ? o = e : (o = o || {}, o.body = e), this.request(t, {\n ...o,\n method: r\n }))\n }), this;\n }\n extends(r) {\n const t = new T({ ...this.baseConfigs, ...r });\n return t.hooks = [...this.hooks], t;\n }\n static create(r) {\n return new T(r);\n }\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 x = T.create, N = x();\ntypeof globalThis < \"u\" ? globalThis.fexios = N : typeof window < \"u\" && (window.fexios = N);\nexport {\n T as Fexios,\n d as FexiosError,\n y as FexiosErrorCodes,\n P as FexiosQueryBuilder,\n E as FexiosResponse,\n H as FexiosResponseError,\n j as checkIfTextData,\n S as checkIsPlainObject,\n x as createFexios,\n N as default,\n U as dropUndefinedAndNull,\n N as fexios,\n K as isFexiosError,\n I as resolveResponseBody\n};\n//# sourceMappingURL=index.js.map\n","import {\n Fexios,\n FexiosConfigs,\n FexiosRequestOptions,\n FexiosFinalContext,\n} from 'fexios'\n\n/**\n * MediaWiki Api for Axios\n * Provides the API call methods similar to `mw.Api` at non-mw environments\n *\n * @author Dragon-Fish <dragon-fish@qq.com>\n * @license MIT\n */\nexport class MediaWikiApi {\n readonly version = import.meta.env.__VERSION__\n readonly request: Fexios\n private tokens: Record<string, string>\n readonly cookies: Map<string, string> = new Map()\n\n readonly defaultParams: MwApiParams\n readonly defaultOptions: Partial<FexiosConfigs>\n\n static INIT_DEFAULT_PARAMS: MwApiParams = {\n action: 'query',\n errorformat: 'plaintext',\n format: 'json',\n formatversion: 2,\n }\n\n constructor(\n readonly baseURL?: string,\n defaultOptions?: Partial<FexiosConfigs>,\n defaultParams?: MwApiParams\n ) {\n // For MediaWiki browser environment\n if (!baseURL && typeof window === 'object' && (window as any).mediaWiki) {\n const { wgServer, wgScriptPath } =\n (window as any).mediaWiki?.config?.get(['wgServer', 'wgScriptPath']) ||\n {}\n if (typeof wgServer === 'string' && typeof wgScriptPath === 'string') {\n baseURL = `${wgServer}${wgScriptPath}/api.php`\n }\n }\n if (typeof baseURL !== 'string') {\n throw new Error('baseURL is undefined')\n }\n // Init\n this.baseURL = baseURL\n this.tokens = {}\n this.defaultParams = {\n ...MediaWikiApi.INIT_DEFAULT_PARAMS,\n ...defaultParams,\n }\n this.defaultOptions = defaultOptions || {}\n\n const instance = MediaWikiApi.createRequestHandler(this.baseURL)\n this.request = instance\n\n // Handle cookies for Node.js\n if (!('document' in globalThis)) {\n instance.interceptors.request.use((ctx) => {\n ctx.headers = (ctx.headers as Record<string, string>) || {}\n ctx.headers['cookie'] = Array.from(this.cookies.entries())\n .map(([name, value]) => `${name}=${value}`)\n .join('; ')\n return ctx\n })\n instance.interceptors.response.use((ctx) => {\n const cookieHeaders = (ctx.rawResponse!.headers as Headers).get(\n 'set-cookie'\n )\n const rawCookies = cookieHeaders?.split(',').map((i) => i.trim())\n rawCookies?.forEach((i) => {\n const [name, ...value] = i.split(';')[0].split('=')\n this.cookies.set(name, value.join('='))\n })\n return ctx\n })\n }\n }\n\n setBaseURL(baseURL: string) {\n this.request.baseConfigs.baseURL = baseURL\n return this\n }\n\n static normalizeParamValue(item: MwApiParams[keyof MwApiParams]) {\n if (Array.isArray(item)) {\n return item.join('|')\n } else if (typeof item === 'boolean') {\n return item ? '1' : undefined\n } else if (typeof item === 'number') {\n return '' + item\n } else {\n return item\n }\n }\n static createRequestHandler(baseURL: string) {\n const instance = new Fexios({\n baseURL,\n responseType: 'json',\n })\n\n // Adjust body\n instance.on('beforeInit', (ctx) => {\n if (ctx.method?.toLowerCase() !== 'post') {\n return ctx\n }\n\n if (\n typeof ctx.body === 'object' &&\n ctx.body !== null &&\n !(ctx.body instanceof URLSearchParams) &&\n !(ctx.body instanceof FormData)\n ) {\n const body: any = ctx.body\n Object.keys(body).forEach((key) => {\n const data = MediaWikiApi.normalizeParamValue(body[key])\n if (typeof data === 'undefined' || data === null) {\n delete body[key]\n } else if (data !== body[key]) {\n body[key] = data\n }\n })\n ctx.body = new URLSearchParams(ctx.body as any)\n }\n\n if (\n (globalThis.FormData && ctx.body instanceof FormData) ||\n ctx.body instanceof URLSearchParams\n ) {\n const body = ctx.body\n // Adjust params\n body.forEach((value, key) => {\n const data = MediaWikiApi.normalizeParamValue(value)\n if (typeof data === 'undefined' || data === null) {\n body.delete(key)\n } else if (data !== value) {\n body.set(key, data as any)\n }\n })\n // Adjust query\n const searchParams = new URLSearchParams(ctx.query as any)\n !searchParams.has('format') &&\n searchParams.set('format', '' + (body.get('format') || 'json'))\n !searchParams.has('formatversion') &&\n searchParams.set(\n 'formatversion',\n '' + (body.get('formatversion') || '2')\n )\n body.has('origin') &&\n searchParams.set('origin', '' + body.get('origin'))\n ctx.query = Object.fromEntries(searchParams.entries())\n\n // DONT REMOVE THIS\n // TODO: Remove duplicate parameters. There should be a better solution.\n body.has('action') && (ctx.query.action = '' + body.get('action'))\n }\n\n return ctx\n })\n\n // Adjust query\n instance.on('beforeInit', (ctx) => {\n ctx.query = ctx.query as Record<string, any>\n for (const key in ctx.query) {\n const data = MediaWikiApi.normalizeParamValue(ctx.query[key])\n if (typeof data === 'undefined' || data === null) {\n delete ctx.query[key]\n } else if (data !== ctx.query[key]) {\n ctx.query[key] = '' + data\n }\n }\n return ctx\n })\n\n // Adjust origin param\n instance.on('beforeRequest', (ctx) => {\n const url = new URL(ctx.url!)\n const searchParams = url.searchParams\n // Adjust origin param\n if (globalThis.location) {\n if (\n !searchParams.has('origin') &&\n location.origin !== new URL(baseURL).origin\n ) {\n searchParams.set('origin', location.origin)\n instance.baseConfigs.credentials = 'include'\n instance.baseConfigs.mode = 'cors'\n } else if (location.origin === new URL(baseURL).origin) {\n searchParams.delete('origin')\n instance.baseConfigs.credentials = undefined\n instance.baseConfigs.mode = undefined\n }\n }\n\n if (url.searchParams.has('origin')) {\n const origin = encodeURIComponent(\n url.searchParams.get('origin') || ''\n ).replace(/\\./g, '%2E')\n ctx.query = {}\n url.searchParams.delete('origin')\n ctx.url = `${url}${url.search ? '&' : '?'}origin=${origin}`\n }\n return ctx\n })\n\n return instance\n }\n\n /** Base methods encapsulation */\n get<T = any>(query: MwApiParams, options?: FexiosRequestOptions) {\n return this.request.get<T>('', {\n ...this.defaultOptions,\n query: {\n ...this.defaultParams,\n ...this.defaultOptions.query,\n ...(query as any),\n },\n ...options,\n })\n }\n post<T = any>(\n data: MwApiParams | URLSearchParams | FormData,\n options?: FexiosRequestOptions\n ) {\n return this.request.post<T>('', data, {\n ...this.defaultOptions,\n query: { ...(this.defaultParams as any), ...this.defaultOptions.query },\n ...options,\n })\n }\n\n async login(\n lgname: string,\n lgpassword: string,\n params?: MwApiParams,\n postOptions?: { retry?: number; noCache?: boolean }\n ): Promise<{\n result: 'Success' | 'NeedToken' | 'WrongToken' | 'Failed'\n token?: string\n reason?: {\n code: string\n text: string\n }\n lguserid: number\n lgusername: string\n }> {\n this.defaultOptions.credentials = 'include'\n\n postOptions = postOptions || {}\n postOptions.retry ??= 3\n\n if (postOptions.retry < 1) {\n throw new WikiSaikouError(\n WikiSaikouErrorCode.LOGIN_RETRY_LIMIT_EXCEEDED,\n 'The limit of the number of times to automatically re-login has been exceeded'\n )\n }\n\n // FIXME: This is ugly\n let data: any\n try {\n const res = await this.postWithToken(\n 'login',\n {\n action: 'login',\n lgname,\n lgpassword,\n ...params,\n },\n { tokenName: 'lgtoken', ...postOptions }\n )\n if (res?.data?.login) {\n data = res.data\n } else {\n throw res\n }\n } catch (e: any) {\n if (e instanceof WikiSaikouError) {\n throw e\n } else if (e?.ok === false) {\n return this.login(lgname, lgpassword, params, {\n ...postOptions,\n noCache: true,\n retry: postOptions.retry - 1,\n })\n } else {\n throw new WikiSaikouError(\n WikiSaikouErrorCode.HTTP_ERROR,\n \"The server returns an error, but it doesn't seem to be caused by MediaWiki\",\n e\n )\n }\n }\n\n if (data?.login?.result !== 'Success') {\n throw new WikiSaikouError(\n WikiSaikouErrorCode.LOGIN_FAILED,\n data?.login?.reason?.text ||\n data?.login?.result ||\n 'Login failed with unknown reason',\n data\n )\n }\n return data.login\n }\n async getUserInfo() {\n const { data } = await this.get<{\n query: {\n userinfo: {\n id: number\n name: string\n groups: string[]\n rights: string[]\n blockid?: number\n blockedby?: string\n blockedbyid?: number\n blockreason?: string\n blockexpiry?: string\n blockedtimestamp?: string\n }\n }\n }>({\n action: 'query',\n meta: 'userinfo',\n uiprop: ['groups', 'rights', 'blockinfo'],\n })\n return data?.query?.userinfo\n }\n\n /** Token Handler */\n async getTokens(type: MwTokenName[] = ['csrf']) {\n this.defaultOptions.credentials = 'include'\n const { data } = await this.get({\n action: 'query',\n meta: 'tokens',\n type,\n })\n this.tokens = { ...this.tokens, ...data.query.tokens }\n return this.tokens\n }\n async token(type: MwTokenName = 'csrf', noCache = false) {\n if (!this.tokens[`${type}token`] || noCache) {\n delete this.tokens[`${type}token`]\n await this.getTokens([type])\n }\n return this.tokens[`${type}token`]\n }\n\n async postWithToken<T = any>(\n tokenType: MwTokenName,\n body: MwApiParams,\n options?: { tokenName?: string; retry?: number; noCache?: boolean }\n ): Promise<FexiosFinalContext<T>> {\n const { tokenName = 'token', retry = 3, noCache = false } = options || {}\n\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\n const token = await this.token(tokenType, noCache)\n\n const doRetry = () =>\n this.postWithToken(tokenType, body, {\n tokenName,\n retry: retry - 1,\n noCache: true,\n })\n\n return this.post<T>({\n [tokenName]: token,\n ...body,\n })\n .then((ctx) => {\n const data = ctx.data\n if (MediaWikiApi.isBadTokenError(data)) {\n return doRetry()\n }\n return ctx\n })\n .catch((err) => {\n const data = err.data\n if (MediaWikiApi.isBadTokenError(data) || err?.ok === false) {\n return doRetry()\n } else if (typeof data === 'object' && data !== null) {\n return Promise.reject(data)\n } else {\n throw new WikiSaikouError(\n WikiSaikouErrorCode.HTTP_ERROR,\n 'The server returns an error, but it doesn’t seem to be caused by MediaWiki',\n err\n )\n }\n })\n }\n postWithEditToken<T = any>(body: MwApiParams) {\n return this.postWithToken<T>('csrf', body)\n }\n\n static isBadTokenError(data?: any) {\n return (\n data?.error?.code === 'badtoken' ||\n data?.errors?.some((i: any) => i.code === 'badtoken') ||\n ['NeedToken', 'WrongToken'].includes(data?.login?.result)\n )\n }\n\n async getMessages(ammessages: string[], amlang = 'zh', options: MwApiParams) {\n const { data } = await this.get({\n action: 'query',\n meta: 'allmessages',\n ammessages,\n amlang,\n ...options,\n })\n const result: Record<string, string> = {}\n data.query.allmessages.forEach(function (obj: {\n missing?: boolean\n name: string\n content: string\n }) {\n if (!obj.missing) {\n result[obj.name] = obj.content\n }\n })\n return result\n }\n\n async parseWikitext(\n wikitext: string,\n title?: string,\n extraBody?: MwApiParams,\n options?: FexiosRequestOptions\n ): Promise<string> {\n const { data } = await this.post(\n {\n action: 'parse',\n title,\n text: wikitext,\n ...extraBody,\n },\n options\n )\n return data.parse.text\n }\n}\n\nexport class MediaWikiForeignApi extends MediaWikiApi {\n constructor(\n baseURL?: string,\n defaultOptions?: Partial<FexiosConfigs>,\n defaultParams?: MwApiParams\n ) {\n super(\n baseURL,\n {\n credentials: 'include',\n mode: 'cors',\n ...defaultOptions,\n },\n {\n origin: location.origin,\n ...defaultParams,\n }\n )\n }\n}\n\n// Aliases\nexport default MediaWikiApi\nexport { MediaWikiApi as MwApi, MediaWikiForeignApi as ForeignApi }\n\n// Errors\nexport enum WikiSaikouErrorCode {\n HTTP_ERROR = 'HTTP_ERROR',\n LOGIN_FAILED = 'LOGIN_FAILED',\n LOGIN_RETRY_LIMIT_EXCEEDED = 'LOGIN_RETRY_LIMIT_EXCEEDED',\n TOKEN_RETRY_LIMIT_EXCEEDED = 'TOKEN_RETRY_LIMIT_EXCEEDED',\n}\nexport class WikiSaikouError extends Error {\n readonly name = 'WikiSaikouError'\n constructor(\n readonly code: WikiSaikouErrorCode,\n readonly message: string = '',\n readonly cause?: FexiosFinalContext\n ) {\n super()\n }\n}\n\n// Types\nexport type MwApiParams = Record<\n string,\n string | number | string[] | undefined | boolean | File\n>\nexport type MwTokenName =\n | 'createaccount'\n | 'csrf'\n | 'login'\n | 'patrol'\n | 'rollback'\n | 'userrights'\n | 'watch'\n"],"names":["y","s","d","r","t","e","o","H","j","h","S","U","E","I","l","n","i","a","c","O","m","f","P","C","D","A","B","q","W","R","k","L","u","g","p","w","_","b","x","N","_MediaWikiApi","baseURL","defaultOptions","defaultParams","wgServer","wgScriptPath","_b","_a","instance","ctx","name","value","cookieHeaders","rawCookies","item","Fexios","body","key","data","searchParams","url","origin","query","options","lgname","lgpassword","params","postOptions","WikiSaikouError","res","_d","_c","_e","type","noCache","tokenType","tokenName","retry","token","doRetry","err","ammessages","amlang","result","obj","wikitext","title","extraBody","MediaWikiApi","MediaWikiForeignApi","WikiSaikouErrorCode","code","message","cause"],"mappings":"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","x_google_ignoreList":[0]}