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 • 39.2 kB
Source Map (JSON)
{"version":3,"file":"wiki-saikou.1DPaxo4l.cjs","sources":["../../src/models/MwParamNormalizer.ts","../../src/models/errors.ts","../../src/models/FexiosSaikou.ts","../../src/utils/resolveLegacyCtor.ts","../../src/utils/useRetry.ts","../../src/WikiSaikou.ts"],"sourcesContent":["import { isPlainObject } from 'fexios'\n\nexport namespace MwParamNormalizer {\n export function normalizeParamValue(item: any): string | Blob | undefined {\n if (Array.isArray(item)) {\n return item.join('|')\n } else if (typeof item === 'boolean' || item === null) {\n return item ? '1' : undefined\n } else if (typeof item === 'number') {\n return '' + item\n } else {\n return item\n }\n }\n\n export function normalizeBody(body: any): FormData | undefined {\n const isFormLike = (body: any): body is URLSearchParams | FormData =>\n body && (body instanceof URLSearchParams || body instanceof FormData)\n\n if (body === void 0 || body === null) {\n return void 0\n }\n\n const formData = new FormData()\n\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 as any)\n }\n })\n return formData\n }\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 as any)\n }\n })\n return formData\n }\n\n return void 0\n }\n}\n","import type { FexiosFinalContext } from 'fexios'\nimport { MwApiResponse, MwApiResponseError } from '../types.js'\n\n/**\n * Error codes for WikiSaikouError\n */\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}\n\n/**\n * WikiSaikou Error:\n * - Transport/network failures (e.g., fetch failure, HTTP layer issues)\n * - SDK behavioral errors such as exhausted internal retries or misconfigurations\n * Note: When MediaWiki API responds with JSON containing error/errors, a MediaWikiApiError should be thrown instead\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 static is(data?: any, code?: WikiSaikouErrorCode): data is WikiSaikouError {\n return data instanceof this && (code === undefined || data.code === code)\n }\n}\n\n/**\n * Server-side (MediaWiki API) business error:\n * - fetch succeeded but JSON includes `error` or `errors.length > 0`\n * - Special states (e.g., login NeedToken/WrongToken) are also considered API-side errors\n * Note: network/retry issues belong to WikiSaikouError, not this class\n */\nexport class MediaWikiApiError extends Error {\n readonly name = 'MediaWikiApiError'\n readonly code: string\n constructor(\n readonly errors: MwApiResponseError[],\n readonly cause?: FexiosFinalContext\n ) {\n super()\n this.errors = MediaWikiApiError.normalizeErrors(errors)\n this.message = errors\n .map((error) => error.text)\n .filter(Boolean)\n .join('\\n')\n this.code = this.isBadTokenError()\n ? 'badtoken'\n : this.errors[0]?.code || 'Unknown Error'\n }\n get firstError() {\n return this.errors[0]\n }\n isBadTokenError() {\n return (\n this.errors.some((error) => error.code === 'badtoken') ||\n ['NeedToken', 'WrongToken'].includes(this.cause?.data?.login?.result)\n )\n }\n toString() {\n return `[${this.name} ${this.code}]`\n }\n static is(data?: any): data is MediaWikiApiError {\n return data instanceof this\n }\n static normalizeErrors(errors: MwApiResponseError[]): MwApiResponseError[] {\n if (Array.isArray(errors) === false) {\n return []\n }\n return errors\n .filter((e) => typeof e === 'object' && !!e?.code)\n .map((error: any) => {\n if (!error.text) {\n if (error.info) {\n // in rare cases, `info` appears instead of `text`\n return { ...error, text: error.info }\n } else if (error['*']) {\n // for formatversion=1, `*` is preferred over `text`\n return { ...error, text: error['*'] }\n } else {\n return { ...error, text: '' }\n }\n }\n return error\n })\n }\n}\n\n/**\n * Helper functions for WikiSaikouError and MediaWikiApiError\n */\nexport namespace WikiSaikouError {\n function extractResponseDataFromAny<T = any>(data?: any): T | undefined {\n if (data == null) return undefined\n // Prefer FexiosResponseError.response.data if present\n if (data?.response?.data !== undefined) return data.response.data as T\n // Then prefer context-like objects that already have data\n if (data?.data !== undefined) return data.data as T\n // Fall back to Error.cause chain\n const cause = data instanceof Error ? (data as any).cause : undefined\n if (cause?.response?.data !== undefined) return cause.response.data as T\n if (cause?.data !== undefined) return cause.data as T\n return (data as T) || undefined\n }\n\n export function includesMediaWikiApiError(data?: any) {\n return extractMediaWikiApiErrors(data).length > 0\n }\n\n export const normalizeMwApiErrors = MediaWikiApiError.normalizeErrors\n\n export function extractMediaWikiApiErrors(data?: any): MwApiResponseError[] {\n let r = extractResponseDataFromAny<MwApiResponse>(data)\n if (typeof r !== 'object' || r === null) {\n return []\n }\n const error = r?.error\n const errors = r?.errors\n const result: MwApiResponseError[] = []\n if (error) {\n result.push(error)\n }\n if (Array.isArray(errors)) {\n result.push(...errors)\n }\n return normalizeMwApiErrors(result)\n }\n\n export function isBadTokenError(data?: any): boolean {\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}\n","import { Fexios, FexiosQueryBuilder } from 'fexios'\nimport { MwParamNormalizer } from './MwParamNormalizer.js'\nimport { WikiSaikouError } from './errors.js'\nimport { MwTokenName } from '../types.js'\n\nexport interface FexiosSaikou extends Fexios {\n _tokens: Map<string, string>\n}\n\nconst FEXIOS_SAIKOU_MARKER = Symbol.for('__FEXIOS_SAIKOU__')\n\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 */\nexport function createFexiosSaikou(\n payload: string | URL | Fexios\n): FexiosSaikou {\n const instance = (\n payload instanceof Fexios\n ? payload\n : new Fexios({\n baseURL:\n payload instanceof URL ? payload.toString() : String(payload),\n responseType: 'json',\n })\n ) as FexiosSaikou\n\n if ((instance as any)[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\n // Adjust request body for POST requests\n instance.on('beforeInit', (ctx) => {\n if (ctx.request.method?.toLowerCase() !== 'post') {\n return ctx\n }\n\n if (ctx.request.body === void 0 || ctx.request.body === null) {\n ctx.request.body = void 0\n return ctx\n }\n\n const body = (ctx.request.body = MwParamNormalizer.normalizeBody(\n ctx.request.body\n )!)\n\n // Remove duplicate params: prefer body over query for these keys\n const query = new URLSearchParams(ctx.request.query as any)\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 // `origin` must be in query due to CORS requirements\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\n return ctx\n })\n\n // Normalize query into FormData-like object\n instance.on('beforeInit', (ctx) => {\n ctx.request.query = FexiosQueryBuilder.mergeQueries(\n {},\n MwParamNormalizer.normalizeBody(ctx.request.query)\n )\n return ctx\n })\n\n // Adjust origin parameter and CORS related runtime configs\n instance.on('beforeRequest', (ctx) => {\n const url = new URL(ctx.request.url!)\n // Convert ctx.query to a plain object for easier manipulation\n const query = FexiosQueryBuilder.mergeQueries(url.searchParams, ctx.query)\n\n // Automatically add/remove origin based on current location and baseURL\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 = undefined\n instance.baseConfigs.mode = undefined\n }\n }\n\n if (query.origin) {\n const origin = encodeURIComponent(query.origin).replace(/\\./g, '%2E')\n // Remove origin from query record, it will be added to URL directly\n delete query.origin\n ctx.request.query = query\n // Append origin to URL directly with proper encoding\n ctx.request.url = `${url.origin}${url.pathname}?origin=${origin}`\n } else {\n ctx.request.query = query\n }\n return ctx\n })\n\n // Token handler\n instance._tokens = new Map<MwTokenName, string>()\n instance.on('afterResponse', (ctx) => {\n const { data } = ctx\n // Remove bad token\n const tokenName = ctx.runtime.customEnv?.mwTokenName as MwTokenName\n if (tokenName && WikiSaikouError.isBadTokenError(data)) {\n instance._tokens.delete(tokenName)\n }\n\n // Store new tokens\n const tokens = data?.query?.tokens\n if (tokens && typeof tokens === 'object') {\n Object.entries(tokens).forEach(([type, token]) => {\n typeof token === 'string' &&\n 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\n return instance\n}\n","import type { FexiosConfigs } from 'fexios'\nimport {\n WikiSaikouCore,\n WikiSaikouConfig,\n WikiSaikouInitConfig,\n} from '../WikiSaikou.js'\nimport { deepMerge } from '../utils/deepMerge.js'\nimport { MwApiParams } from '../types.js'\n\nexport const resolveLegacyCtor = (\n configOrBaseURL?: WikiSaikouInitConfig | string,\n defaultOptions?: Partial<FexiosConfigs>,\n defaultParams?: MwApiParams\n) => {\n let config: Required<WikiSaikouConfig> = { ...WikiSaikouCore.DEFAULT_CONFIGS }\n if (typeof configOrBaseURL === 'string') {\n config = deepMerge(config, {\n baseURL: configOrBaseURL,\n fexiosConfigs: defaultOptions || {},\n defaultParams: defaultParams || {},\n throwOnApiError: false, // Set a default value for throwOnApiError\n })\n } else if (typeof configOrBaseURL === 'object' && configOrBaseURL !== null) {\n config = deepMerge(config, configOrBaseURL)\n }\n // For MediaWiki browser environment\n if (\n !config.baseURL &&\n typeof window === 'object' &&\n (window as any).mediaWiki\n ) {\n const { wgServer, wgScriptPath } =\n (window as any).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","const noop = () => {}\n\nexport const useRetry = async <T>(\n fn: () => Promise<T>,\n options: {\n retry?: number\n onRetry?: (error: Error, retryCount: number) => void\n shouldRetry?: (error: Error, retryCount: number) => boolean\n }\n): Promise<T> => {\n let retryCount = 0\n const { retry = 3, onRetry = noop, shouldRetry = () => true } = options\n let lastError: unknown\n do {\n try {\n return await fn()\n } catch (error) {\n lastError = error\n if (shouldRetry(error as Error, retryCount)) {\n onRetry(error as Error, retryCount)\n retryCount++\n } else {\n throw error\n }\n }\n } while (retryCount < retry)\n throw (lastError as Error) || new Error('Retry failed')\n}\n","import type {\n FexiosConfigs,\n FexiosRequestOptions,\n FexiosFinalContext,\n} from 'fexios'\nimport { FexiosQueryBuilder } from 'fexios'\nimport { createFexiosSaikou, FexiosSaikou } from './models/FexiosSaikou.js'\nimport { resolveLegacyCtor } from './utils/resolveLegacyCtor.js'\nimport { deepMerge } from './utils/deepMerge.js'\nimport { useRetry } from './utils/useRetry.js'\nimport {\n MediaWikiApiError,\n WikiSaikouError,\n WikiSaikouErrorCode,\n} from './models/errors.js'\nimport { MwApiParams, MwApiResponse, MwTokenName } from './types.js'\n\nexport interface WikiSaikouConfig {\n /**\n * @default undefined // required in Node.js environment\n * @default `${wgServer}${wgScriptPath}/api.php` // in MW pages\n * @description The MediaWiki API endpoint, e.g. \"https://www.mediawiki.org/w/api.php\"\n * @optional In real MediaWiki browser pages, `baseURL` can be omitted and will be inferred automatically based on `window.mw`\n */\n baseURL: string\n /**\n * Transport/runtime options passed to the underlying Fexios instance (headers, fetch, credentials, etc.).\n * @default { responseType: 'json' }\n */\n fexiosConfigs: Partial<FexiosConfigs>\n /**\n * Default query parameters merged into every request.\n * @default { action: 'query' }\n */\n defaultParams: MwApiParams\n /**\n * When true, responses whose JSON body contains `error`/`errors` will throw `MediaWikiApiError` even if HTTP status is 2xx.\n * @default false\n */\n throwOnApiError: boolean\n}\n\nexport type WikiSaikouInitConfig = Omit<\n Partial<WikiSaikouConfig>,\n 'baseURL'\n> & {\n baseURL: string\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 */\nexport class WikiSaikouCore {\n readonly config: Required<WikiSaikouConfig>\n readonly version = import.meta.env.__VERSION__\n readonly request: FexiosSaikou\n\n static INIT_DEFAULT_PARAMS: MwApiParams = {\n action: 'query',\n errorformat: 'plaintext',\n format: 'json',\n formatversion: 2,\n }\n static DEFAULT_CONFIGS: Required<WikiSaikouConfig> = {\n baseURL: undefined as unknown as string,\n fexiosConfigs: {\n responseType: 'json',\n },\n defaultParams: this.INIT_DEFAULT_PARAMS,\n throwOnApiError: false,\n }\n\n /** @deprecated Use `new MediaWikiApi(config)` instead */\n constructor(\n baseURL?: string,\n defaultOptions?: Partial<FexiosConfigs>,\n defaultParams?: MwApiParams\n )\n constructor(config?: WikiSaikouInitConfig)\n constructor(\n configOrBaseURL?: WikiSaikouInitConfig | string,\n defaultOptions?: Partial<FexiosConfigs>,\n defaultParams?: MwApiParams\n ) {\n const config = (this.config = resolveLegacyCtor(\n configOrBaseURL,\n defaultOptions,\n defaultParams\n ))\n this.request = createFexiosSaikou(config.baseURL)\n }\n\n setBaseURL(baseURL: string) {\n this.config.baseURL = baseURL\n this.request.baseConfigs.baseURL = baseURL\n return this\n }\n\n /** Base methods encapsulation */\n async get<T = any>(\n query: MwApiParams,\n options?: Partial<FexiosRequestOptions>\n ): Promise<FexiosFinalContext<MwApiResponse<T>>> {\n const payload = deepMerge<Partial<FexiosRequestOptions>>(\n {},\n this.config.fexiosConfigs as Partial<FexiosRequestOptions>,\n {\n query: FexiosQueryBuilder.mergeQueries(\n this.config.defaultParams,\n query\n ),\n },\n options\n )\n return this.runRequestWithApiErrorMapping(() =>\n this.request.get<MwApiResponse<T>>('', payload)\n )\n }\n async post<T = any>(\n data: MwApiParams | URLSearchParams | FormData,\n options?: Partial<FexiosRequestOptions>\n ): Promise<FexiosFinalContext<MwApiResponse<T>>> {\n return this.runRequestWithApiErrorMapping(() =>\n this.request.post<MwApiResponse<T>>(\n '',\n data,\n deepMerge<Partial<FexiosRequestOptions>>(\n {},\n this.config.fexiosConfigs as Partial<FexiosRequestOptions>,\n {\n query: this.config.defaultParams,\n },\n options\n )\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 private async runRequestWithApiErrorMapping<T = any>(\n doRequest: () => Promise<FexiosFinalContext<MwApiResponse<T>>>\n ): Promise<FexiosFinalContext<MwApiResponse<T>>> {\n try {\n const res = await doRequest()\n return this.handleApiResponse(res)\n } catch (err) {\n // If HTTP is non-2xx but body includes MW API error, convert to MediaWikiApiError\n if (\n this.config.throwOnApiError &&\n WikiSaikouError.includesMediaWikiApiError(err)\n ) {\n throw new MediaWikiApiError(\n WikiSaikouError.extractMediaWikiApiErrors(err),\n err as any\n )\n }\n throw err as any\n }\n }\n\n private throwIfApiError(data?: any) {\n const errors = WikiSaikouError.extractMediaWikiApiErrors(data)\n if (errors.length > 0) {\n throw new MediaWikiApiError(errors, data)\n }\n }\n private handleApiResponse<T = any>(\n res: FexiosFinalContext<MwApiResponse<T>>\n ) {\n if (this.config.throwOnApiError) {\n this.throwIfApiError(res.data)\n }\n return res\n }\n\n /** Token Handler */\n get tokens() {\n return this.request._tokens\n }\n async fetchTokens(types: MwTokenName[] = ['csrf']) {\n this.config.fexiosConfigs.credentials = 'include'\n await this.get<{\n query: { tokens: Record<MwTokenName, string> }\n }>({\n action: 'query',\n meta: 'tokens',\n type: types,\n })\n return this.tokens\n }\n async getToken(type: MwTokenName = '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: MwTokenName) {\n this.tokens.delete(type)\n return this.tokens\n }\n\n async postWithToken<T = any>(\n tokenType: MwTokenName,\n body: MwApiParams,\n options?: {\n tokenName?: string\n retry?: number\n noCache?: boolean\n fexiosOptions?: Partial<FexiosRequestOptions>\n }\n ): Promise<FexiosFinalContext<MwApiResponse<T>>> {\n const {\n tokenName = 'token',\n retry = 3,\n noCache = false,\n fexiosOptions,\n } = 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 let attemptIndex = 0\n return useRetry<FexiosFinalContext<MwApiResponse<T>>>(\n async () => {\n const token = await this.getToken(\n tokenType,\n noCache || attemptIndex > 0\n )\n\n try {\n const ctx = await this.post<MwApiResponse<T>>(\n {\n [tokenName]: token,\n ...body,\n },\n deepMerge(fexiosOptions || {}, {\n customEnv: {\n mwTokenName: tokenType,\n },\n })\n )\n\n if (WikiSaikouError.isBadTokenError(ctx.data)) {\n throw ctx\n }\n return ctx\n } catch (err: any) {\n if (WikiSaikouError.isBadTokenError(err) || err?.ok === false) {\n throw err\n } else if (MediaWikiApiError.is(err)) {\n // MW 业务错误,直接透传\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) =>\n WikiSaikouError.isBadTokenError(error) ||\n (error as any)?.ok === false,\n }\n ).catch((err) => {\n // Map exhausted retry of retryable errors into SDK-level error\n if (WikiSaikouError.isBadTokenError(err) || (err as any)?.ok === false) {\n throw new WikiSaikouError(\n WikiSaikouErrorCode.TOKEN_RETRY_LIMIT_EXCEEDED,\n 'Retry attempts for acquiring/using token exhausted',\n err as any\n )\n }\n // For non-retryable errors like MediaWikiApiError, keep propagation as is\n throw err\n })\n }\n postWithEditToken<T = any>(\n body: MwApiParams\n ): Promise<FexiosFinalContext<MwApiResponse<T>>> {\n return this.postWithToken<T>('csrf', body)\n }\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(): MwApiParams {\n return this.config.defaultParams\n }\n /** @deprecated Use `this.config.fexiosConfigs` instead */\n get defaultOptions(): Partial<FexiosConfigs> {\n return this.config.fexiosConfigs\n }\n /** @deprecated Use `createFexiosSaikou` instead */\n static readonly createRequestHandler = createFexiosSaikou\n /** @deprecated Use `this.getToken` instead */\n token = this.getToken\n}\n\n// re-export for library users\nexport * from './models/errors.js'\nexport * from './models/FexiosSaikou.js'\nexport * from './models/MwParamNormalizer.js'\nexport * from './types.js'\nexport * from 'fexios'\n\n// for backward compatibility\nexport {\n /** @deprecated Use `WikiSaikou` instead */\n WikiSaikouCore as MwApiBase,\n}\n"],"names":["MwParamNormalizer","body","isPlainObject","WikiSaikouErrorCode","WikiSaikouError","Fexios","FexiosQueryBuilder","deepMerge"],"mappings":"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"}