{"version":3,"file":"api.cjs","sources":["../src/api/utils.ts","../src/api/articleCounter.ts","../src/api/comment.ts","../src/api/commentCount.ts","../src/api/pageview.ts","../src/api/recentComment.ts","../src/api/user.ts","../src/api/login.ts"],"sourcesContent":["export interface BaseAPIOptions {\n  /**\n   * Waline 服务端地址\n   *\n   * Waline serverURL\n   */\n  serverURL: string;\n\n  /**\n   * 错误信息所使用的语言\n   *\n   * Language used in error text\n   */\n  lang: string;\n}\n\nexport interface ErrorStatusResponse {\n  /**\n   * 错误代码\n   *\n   * Error number\n   */\n  errno: number;\n\n  /**\n   * 错误消息\n   *\n   * Error msg\n   */\n  errmsg: string;\n}\n\nexport const JSON_HEADERS: Record<string, string> = {\n  // eslint-disable-next-line @typescript-eslint/naming-convention\n  'Content-Type': 'application/json',\n};\n\nexport const errorCheck = <T extends ErrorStatusResponse>(\n  data: T,\n  name = ''\n): T => {\n  if (typeof data === 'object' && data.errno)\n    throw new TypeError(`${name} failed with ${data.errno}: ${data.errmsg}`);\n\n  return data;\n};\n","import { JSON_HEADERS } from './utils';\nimport type { BaseAPIOptions } from './utils';\n\nexport interface GetArticleCounterOptions extends BaseAPIOptions {\n  /**\n   * 待获取计数器的 path\n   *\n   * Path of counters\n   */\n  paths: string[];\n\n  /**\n   * 待获取计数器的类型\n   *\n   * Counter type to be fetched\n   */\n  type: string[];\n\n  /**\n   * 取消请求的信号\n   *\n   * AbortSignal to cancel request\n   */\n  signal?: AbortSignal;\n}\n\nexport type GetArticleCounterResponse =\n  | Record<string, number>[]\n  | Record<string, number>\n  | number[]\n  | number;\n\nexport const getArticleCounter = ({\n  serverURL,\n  lang,\n  paths,\n  type,\n  signal,\n}: GetArticleCounterOptions): Promise<GetArticleCounterResponse> =>\n  fetch(\n    `${serverURL}/article?path=${encodeURIComponent(\n      paths.join(',')\n    )}&type=${encodeURIComponent(type.join(','))}&lang=${lang}`,\n    { signal }\n  ).then((resp) => <Promise<GetArticleCounterResponse>>resp.json());\n\nexport interface UpdateArticleCounterOptions extends BaseAPIOptions {\n  /**\n   * 待更新计数器的 path\n   *\n   * Path of counter to be updated\n   */\n  path: string;\n\n  /**\n   * 待更新计数器的类型\n   *\n   * Counter type to be updated\n   */\n  type: string;\n\n  /**\n   * 更新操作\n   *\n   * Update operation\n   *\n   * @default 'inc'\n   */\n  action?: 'inc' | 'desc';\n}\n\nexport const updateArticleCounter = ({\n  serverURL,\n  lang,\n  path,\n  type,\n  action,\n}: UpdateArticleCounterOptions): Promise<number> =>\n  fetch(`${serverURL}/article?lang=${lang}`, {\n    method: 'POST',\n    headers: JSON_HEADERS,\n    body: JSON.stringify({ path, type, action }),\n  }).then((resp) => <Promise<number>>resp.json());\n","import { JSON_HEADERS, errorCheck } from './utils';\nimport type { BaseAPIOptions, ErrorStatusResponse } from './utils';\nimport type { WalineComment, WalineCommentData } from '../typings';\n\nexport interface GetCommentOptions extends BaseAPIOptions {\n  /**\n   * 待获取评论列表的 path\n   *\n   * Path of comment list\n   */\n  path: string;\n\n  /**\n   * 评论分页数\n   *\n   * Comment pagination number\n   */\n  page: number;\n\n  /**\n   * 每页评论个数\n   *\n   * Comment number per page\n   */\n  pageSize: number;\n\n  /**\n   * 排序方式\n   *\n   * Sort method\n   */\n  sortBy: string;\n\n  /**\n   * 用户令牌\n   *\n   * User token\n   */\n  token?: string;\n\n  /**\n   * 取消请求的信号\n   *\n   * AbortSignal to cancel request\n   */\n  signal?: AbortSignal;\n}\n\nexport interface GetCommentResponse extends ErrorStatusResponse {\n  /**\n   * 评论数量\n   *\n   * Comment number\n   */\n  count: number;\n\n  /**\n   * 评论分页数\n   *\n   * Comment pagination number\n   */\n  page: number;\n\n  /**\n   * 每页评论个数\n   *\n   * Comment number per page\n   */\n  pageSize: number;\n\n  /**\n   * 评论数据\n   *\n   * Comment Data\n   */\n  data: WalineComment[];\n\n  /**\n   * 页面总数\n   *\n   * Page number\n   */\n  totalPages: number;\n}\n\nexport const getComment = ({\n  serverURL,\n  lang,\n  path,\n  page,\n  pageSize,\n  sortBy,\n  signal,\n  token,\n}: GetCommentOptions): Promise<GetCommentResponse> => {\n  const headers: Record<string, string> = {};\n\n  if (token) headers.Authorization = `Bearer ${token}`;\n\n  return fetch(\n    `${serverURL}/comment?path=${encodeURIComponent(\n      path\n    )}&pageSize=${pageSize}&page=${page}&lang=${lang}&sortBy=${sortBy}`,\n    { signal, headers }\n  )\n    .then((resp) => <Promise<GetCommentResponse>>resp.json())\n    .then((data) => errorCheck(data, 'Get comment data'));\n};\n\nexport interface AddCommentOptions extends BaseAPIOptions {\n  /**\n   * 用户令牌\n   *\n   * User token\n   */\n  token?: string;\n\n  /**\n   * 用户待提交的评论数据\n   *\n   * Comment data being submitted by user\n   */\n  comment: WalineCommentData;\n}\n\nexport interface AddCommentResponse extends ErrorStatusResponse {\n  /**\n   * 渲染好的评论数据\n   *\n   * Comment data rendered\n   */\n  data?: WalineComment;\n}\n\nexport const addComment = ({\n  serverURL,\n  lang,\n  token,\n  comment,\n}: AddCommentOptions): Promise<AddCommentResponse> => {\n  const headers: Record<string, string> = {\n    // eslint-disable-next-line @typescript-eslint/naming-convention\n    'Content-Type': 'application/json',\n  };\n\n  if (token) headers.Authorization = `Bearer ${token}`;\n\n  return fetch(`${serverURL}/comment?lang=${lang}`, {\n    method: 'POST',\n    headers,\n    body: JSON.stringify(comment),\n  }).then((resp) => <Promise<AddCommentResponse>>resp.json());\n};\n\nexport interface DeleteCommentOptions extends BaseAPIOptions {\n  token: string;\n  objectId: string | number;\n}\n\nexport interface DeleteCommentResponse extends ErrorStatusResponse {\n  data: '';\n}\n\nexport const deleteComment = ({\n  serverURL,\n  lang,\n  token,\n  objectId,\n}: DeleteCommentOptions): Promise<DeleteCommentResponse> =>\n  fetch(`${serverURL}/comment/${objectId}?lang=${lang}`, {\n    method: 'DELETE',\n    headers: {\n      Authorization: `Bearer ${token}`,\n    },\n  })\n    .then((resp) => <Promise<DeleteCommentResponse>>resp.json())\n    .then((resp) => errorCheck(resp, 'Delete comment'));\n\nexport interface UpdateCommentOptions extends BaseAPIOptions {\n  /**\n   * 用户令牌\n   *\n   * User token\n   */\n  token: string;\n\n  /**\n   * 评论的 ID\n   *\n   * Comment ID\n   */\n  objectId: number | string;\n\n  /**\n   * 评论数据\n   *\n   * Comment data\n   */\n  comment?: WalineCommentData;\n\n  /**\n   * 点赞还是取消点赞\n   *\n   * Like or dislike\n   */\n  like?: boolean;\n\n  /**\n   * 评论的状态\n   *\n   * Comment status\n   */\n  status?: 'approved' | 'waiting' | 'spam';\n\n  /**\n   * 评论指定状态\n   *\n   * Comment sticky status\n   *\n   * @description 0 means not sticky and 1 means sticky\n   */\n  sticky?: 0 | 1;\n}\n\nexport interface UpdateCommentResponse extends ErrorStatusResponse {\n  /**\n   * 更新后的评论数据\n   *\n   * Comment data rendered\n   */\n  data: WalineComment;\n}\n\nexport const updateComment = ({\n  serverURL,\n  lang,\n  token,\n  objectId,\n  ...data\n}: UpdateCommentOptions): Promise<UpdateCommentResponse> =>\n  fetch(`${serverURL}/comment/${objectId}?lang=${lang}`, {\n    method: 'PUT',\n    headers: {\n      ...JSON_HEADERS,\n      Authorization: `Bearer ${token}`,\n    },\n    body: JSON.stringify(data),\n  })\n    .then((resp) => <Promise<UpdateCommentResponse>>resp.json())\n    .then((resp) => errorCheck(resp, 'Update comment'));\n","import type { BaseAPIOptions } from './utils';\n\nexport interface GetCommentCountOptions extends BaseAPIOptions {\n  /**\n   * 待获取评论数的 path\n   *\n   * Path of pages to be fetched\n   */\n  paths: string[];\n\n  /**\n   * 取消请求的信号\n   *\n   * AbortSignal to cancel request\n   */\n  signal?: AbortSignal;\n}\n\nexport const fetchCommentCount = ({\n  serverURL,\n  lang,\n  paths,\n  signal,\n}: GetCommentCountOptions): Promise<number[]> =>\n  fetch(\n    `${serverURL}/comment?type=count&url=${encodeURIComponent(\n      paths.join(',')\n    )}&lang=${lang}`,\n    { signal }\n  )\n    .then((resp) => <Promise<number | number[]>>resp.json())\n    // TODO: Improve this API\n    .then((counts) => (Array.isArray(counts) ? counts : [counts]));\n","import { getArticleCounter, updateArticleCounter } from './articleCounter';\nimport type { BaseAPIOptions } from './utils';\n\ninterface GetPageviewOptions extends BaseAPIOptions {\n  /**\n   * 待获取页面的 path\n   *\n   * Path of pages\n   */\n  paths: string[];\n\n  /**\n   * 取消请求的信号\n   *\n   * AbortSignal to cancel request\n   */\n  signal?: AbortSignal;\n}\n\nexport const getPageview = ({\n  serverURL,\n  lang,\n  paths,\n  signal,\n}: GetPageviewOptions): Promise<number[]> =>\n  getArticleCounter({\n    serverURL,\n    lang,\n    paths,\n    type: ['time'],\n    signal,\n  })\n    // TODO: Improve this API\n    .then((counts) => (Array.isArray(counts) ? counts : [counts])) as Promise<\n    number[]\n  >;\n\nexport interface UpdatePageviewOptions extends BaseAPIOptions {\n  /**\n   * 待更新页面的 path\n   *\n   * Path of pages\n   */\n  path: string;\n}\n\nexport const updatePageview = (\n  options: UpdatePageviewOptions\n): Promise<number> =>\n  updateArticleCounter({\n    ...options,\n    type: 'time',\n    action: 'inc',\n  });\n","import type { BaseAPIOptions } from './utils';\nimport type { WalineComment } from '../typings';\n\nexport interface GetRecentCommentOptions extends BaseAPIOptions {\n  /**\n   * 获取评论的数量\n   *\n   * Comment number to be fetched\n   */\n  count: number;\n\n  /**\n   * 取消请求的信号\n   *\n   * AbortSignal to cancel request\n   */\n  signal?: AbortSignal;\n\n  /**\n   * 用户令牌\n   *\n   * User token\n   */\n  token?: string;\n}\n\nexport const getRecentComment = ({\n  serverURL,\n  lang,\n  count,\n  signal,\n  token,\n}: GetRecentCommentOptions): Promise<WalineComment[]> => {\n  const headers: Record<string, string> = {};\n\n  if (token) headers.Authorization = `Bearer ${token}`;\n\n  return fetch(`${serverURL}/comment?type=recent&count=${count}&lang=${lang}`, {\n    signal,\n    headers,\n  }).then((resp) => <Promise<WalineComment[]>>resp.json());\n};\n","import { errorCheck, ErrorStatusResponse } from './utils';\nimport type { BaseAPIOptions } from './utils';\nimport type { WalineComment } from '../typings';\n\nexport interface GetUserListOptions extends BaseAPIOptions {\n  /**\n   * 每页个数\n   *\n   * Number per page\n   */\n  pageSize: number;\n\n  /**\n   * 取消请求的信号\n   *\n   * AbortSignal to cancel request\n   */\n  signal?: AbortSignal;\n}\n\nexport interface WalineUser\n  extends Pick<WalineComment, 'nick' | 'link' | 'avatar' | 'label' | 'level'> {\n  count: number;\n}\n\nexport interface GetUserListResponse extends ErrorStatusResponse {\n  data: WalineUser[];\n}\n\nexport const getUserList = ({\n  serverURL,\n  signal,\n  pageSize,\n  lang,\n}: GetUserListOptions): Promise<WalineUser[]> =>\n  fetch(`${serverURL}/user?pageSize=${pageSize}&lang=${lang}`, {\n    signal,\n  })\n    .then((resp) => <Promise<GetUserListResponse>>resp.json())\n    .then((resp) => errorCheck(resp, 'user list'))\n    .then((resp) => resp.data);\n","/* eslint-disable @typescript-eslint/no-unsafe-member-access */\nimport type { BaseAPIOptions } from './utils';\n\nexport interface UserInfo {\n  /**\n   * 显示姓名\n   *\n   * User name displayed\n   */\n  // eslint-disable-next-line @typescript-eslint/naming-convention\n  display_name: string;\n\n  /**\n   * 用户电子邮件地址\n   *\n   * User email\n   */\n  email: string;\n\n  /**\n   * 用户网站地址\n   *\n   * User website\n   */\n  url: string;\n\n  /**\n   * 用户令牌\n   *\n   * User token\n   */\n  token: string;\n\n  /**\n   * 用户头像\n   *\n   * User avatar\n   */\n  avatar: string;\n\n  /**\n   * 用户邮箱 MD5\n   *\n   * MD5 of User email\n   */\n  mailMd5: string;\n\n  /**\n   * 用户对象 ID\n   *\n   * User object ID\n   */\n  objectId: string | number;\n\n  /**\n   * 用户身份\n   *\n   * User role\n   */\n  type: 'administrator' | 'guest';\n}\n\nexport const login = ({\n  lang,\n  serverURL,\n}: BaseAPIOptions): Promise<UserInfo & { remember: boolean }> => {\n  const width = 450;\n  const height = 450;\n  const left = (window.innerWidth - width) / 2;\n  const top = (window.innerHeight - height) / 2;\n\n  const handler = window.open(\n    `${serverURL}/ui/login?lng=${encodeURIComponent(lang)}`,\n    '_blank',\n    `width=${width},height=${height},left=${left},top=${top},scrollbars=no,resizable=no,status=no,location=no,toolbar=no,menubar=no`\n  );\n\n  handler?.postMessage({ type: 'TOKEN', data: null }, '*');\n\n  return new Promise((resolve) => {\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    const receiver = ({ data }: any): void => {\n      if (!data || typeof data !== 'object' || data.type !== 'userInfo') return;\n\n      if (data.data.token) {\n        handler?.close();\n\n        window.removeEventListener('message', receiver);\n\n        resolve(data.data as UserInfo & { remember: boolean });\n      }\n    };\n\n    window.addEventListener('message', receiver);\n  });\n};\n"],"names":["JSON_HEADERS","errorCheck","data","name","errno","TypeError","errmsg","getArticleCounter","serverURL","lang","paths","type","signal","fetch","encodeURIComponent","join","then","resp","json","updateArticleCounter","path","action","method","headers","body","JSON","stringify","token","comment","Authorization","objectId","counts","Array","isArray","page","pageSize","sortBy","count","left","window","innerWidth","top","innerHeight","handler","open","postMessage","Promise","resolve","receiver","close","removeEventListener","addEventListener","options"],"mappings":"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"}