@waline/client 2.13.1 → 2.14.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 (66) hide show
  1. package/dist/api.cjs +1 -1
  2. package/dist/api.cjs.map +1 -1
  3. package/dist/api.d.cts +60 -34
  4. package/dist/api.d.mts +60 -34
  5. package/dist/api.d.ts +60 -34
  6. package/dist/api.mjs +1 -1
  7. package/dist/api.mjs.map +1 -1
  8. package/dist/comment.cjs +1 -1
  9. package/dist/comment.cjs.map +1 -1
  10. package/dist/comment.d.cts +1 -1
  11. package/dist/comment.d.mts +1 -1
  12. package/dist/comment.d.ts +1 -1
  13. package/dist/comment.js +40 -45
  14. package/dist/comment.js.map +1 -1
  15. package/dist/comment.mjs +1 -1
  16. package/dist/comment.mjs.map +1 -1
  17. package/dist/component.mjs +1 -1
  18. package/dist/component.mjs.map +1 -1
  19. package/dist/legacy.umd.d.ts +13 -3
  20. package/dist/legacy.umd.js +1 -1
  21. package/dist/legacy.umd.js.map +1 -1
  22. package/dist/pageview.cjs +1 -1
  23. package/dist/pageview.cjs.map +1 -1
  24. package/dist/pageview.js +44 -49
  25. package/dist/pageview.js.map +1 -1
  26. package/dist/pageview.mjs +1 -1
  27. package/dist/pageview.mjs.map +1 -1
  28. package/dist/shim.cjs +1 -1
  29. package/dist/shim.cjs.map +1 -1
  30. package/dist/shim.d.cts +15 -9
  31. package/dist/shim.d.mts +15 -9
  32. package/dist/shim.mjs +1 -1
  33. package/dist/shim.mjs.map +1 -1
  34. package/dist/waline.cjs +1 -1
  35. package/dist/waline.cjs.map +1 -1
  36. package/dist/waline.css +1 -1
  37. package/dist/waline.css.map +1 -1
  38. package/dist/waline.d.cts +15 -9
  39. package/dist/waline.d.mts +15 -9
  40. package/dist/waline.d.ts +15 -9
  41. package/dist/waline.js +441 -449
  42. package/dist/waline.js.map +1 -1
  43. package/dist/waline.mjs +1 -1
  44. package/dist/waline.mjs.map +1 -1
  45. package/package.json +1 -1
  46. package/src/api/articleCounter.ts +3 -7
  47. package/src/api/comment.ts +60 -49
  48. package/src/api/commentCount.ts +0 -2
  49. package/src/api/pageview.ts +2 -2
  50. package/src/api/recentComment.ts +2 -5
  51. package/src/api/user.ts +2 -4
  52. package/src/api/utils.ts +17 -10
  53. package/src/comment.ts +1 -1
  54. package/src/compact/convert.ts +1 -1
  55. package/src/components/CommentBox.vue +14 -11
  56. package/src/components/Waline.vue +35 -34
  57. package/src/pageview.ts +3 -3
  58. package/src/styles/index.scss +2 -2
  59. package/src/styles/{nomalize.scss → normalize.scss} +0 -0
  60. package/src/styles/panel.scss +1 -1
  61. package/src/styles/{userlist.scss → user-list.scss} +0 -0
  62. package/src/typings/base.ts +5 -1
  63. package/src/typings/comment.ts +1 -5
  64. package/src/typings/waline.ts +13 -2
  65. package/src/utils/config.ts +2 -0
  66. package/src/utils/date.ts +3 -3
package/dist/api.d.ts CHANGED
@@ -12,6 +12,20 @@ interface BaseAPIOptions {
12
12
  */
13
13
  lang: string;
14
14
  }
15
+ interface ErrorStatusResponse {
16
+ /**
17
+ * 错误代码
18
+ *
19
+ * Error number
20
+ */
21
+ errno: number;
22
+ /**
23
+ * 错误消息
24
+ *
25
+ * Error msg
26
+ */
27
+ errmsg: string;
28
+ }
15
29
 
16
30
  interface GetArticleCounterOptions extends BaseAPIOptions {
17
31
  /**
@@ -92,10 +106,6 @@ interface WalineCommentData {
92
106
  * User id being at
93
107
  */
94
108
  at?: string;
95
- /**
96
- * edit comment id
97
- */
98
- eid?: string;
99
109
  /**
100
110
  * Comment link
101
111
  */
@@ -137,7 +147,7 @@ interface WalineComment extends Exclude<WalineCommentData, 'ua'> {
137
147
 
138
148
  interface GetCommentOptions extends BaseAPIOptions {
139
149
  /**
140
- * 待获取评论列hi奥德路径
150
+ * 待获取评论列表的 path
141
151
  *
142
152
  * Path of comment list
143
153
  */
@@ -145,11 +155,11 @@ interface GetCommentOptions extends BaseAPIOptions {
145
155
  /**
146
156
  * 评论分页数
147
157
  *
148
- * Comment panination number
158
+ * Comment pagination number
149
159
  */
150
160
  page: number;
151
161
  /**
152
- * 评论每页个数
162
+ * 每页评论个数
153
163
  *
154
164
  * Comment number per page
155
165
  */
@@ -173,13 +183,25 @@ interface GetCommentOptions extends BaseAPIOptions {
173
183
  */
174
184
  signal?: AbortSignal;
175
185
  }
176
- interface GetCommentResponse {
186
+ interface GetCommentResponse extends ErrorStatusResponse {
177
187
  /**
178
188
  * 评论数量
179
189
  *
180
190
  * Comment number
181
191
  */
182
192
  count: number;
193
+ /**
194
+ * 评论分页数
195
+ *
196
+ * Comment pagination number
197
+ */
198
+ page: number;
199
+ /**
200
+ * 每页评论个数
201
+ *
202
+ * Comment number per page
203
+ */
204
+ pageSize: number;
183
205
  /**
184
206
  * 评论数据
185
207
  *
@@ -208,37 +230,23 @@ interface AddCommentOptions extends BaseAPIOptions {
208
230
  */
209
231
  comment: WalineCommentData;
210
232
  }
211
- interface AddCommentResponse {
233
+ interface AddCommentResponse extends ErrorStatusResponse {
212
234
  /**
213
235
  * 渲染好的评论数据
214
236
  *
215
237
  * Comment data rendered
216
238
  */
217
239
  data?: WalineComment;
218
- /** 错误原因 */
219
- errmsg?: string;
220
240
  }
221
241
  declare const addComment: ({ serverURL, lang, token, comment, }: AddCommentOptions) => Promise<AddCommentResponse>;
222
242
  interface DeleteCommentOptions extends BaseAPIOptions {
223
243
  token: string;
224
244
  objectId: string | number;
225
245
  }
226
- declare const deleteComment: ({ serverURL, lang, token, objectId, }: DeleteCommentOptions) => Promise<void>;
227
- interface LikeCommentOptions extends BaseAPIOptions {
228
- /**
229
- * 评论的 ID
230
- *
231
- * Comment ID
232
- */
233
- objectId: number | string;
234
- /**
235
- * 点赞还是取消点赞
236
- *
237
- * Like or dislike
238
- */
239
- like: boolean;
246
+ interface DeleteCommentResponse extends ErrorStatusResponse {
247
+ data: '';
240
248
  }
241
- declare const likeComment: ({ serverURL, lang, objectId, like, }: LikeCommentOptions) => Promise<void>;
249
+ declare const deleteComment: ({ serverURL, lang, token, objectId, }: DeleteCommentOptions) => Promise<DeleteCommentResponse>;
242
250
  interface UpdateCommentOptions extends BaseAPIOptions {
243
251
  /**
244
252
  * 用户令牌
@@ -252,6 +260,18 @@ interface UpdateCommentOptions extends BaseAPIOptions {
252
260
  * Comment ID
253
261
  */
254
262
  objectId: number | string;
263
+ /**
264
+ * 评论数据
265
+ *
266
+ * Comment data
267
+ */
268
+ comment?: WalineCommentData;
269
+ /**
270
+ * 点赞还是取消点赞
271
+ *
272
+ * Like or dislike
273
+ */
274
+ like?: boolean;
255
275
  /**
256
276
  * 评论的状态
257
277
  *
@@ -267,7 +287,15 @@ interface UpdateCommentOptions extends BaseAPIOptions {
267
287
  */
268
288
  sticky?: 0 | 1;
269
289
  }
270
- declare const updateComment: ({ serverURL, lang, token, objectId, ...data }: UpdateCommentOptions) => Promise<void>;
290
+ interface UpdateCommentResponse extends ErrorStatusResponse {
291
+ /**
292
+ * 更新后的评论数据
293
+ *
294
+ * Comment data rendered
295
+ */
296
+ data: WalineComment;
297
+ }
298
+ declare const updateComment: ({ serverURL, lang, token, objectId, ...data }: UpdateCommentOptions) => Promise<UpdateCommentResponse>;
271
299
 
272
300
  interface GetCommentCountOptions extends BaseAPIOptions {
273
301
  /**
@@ -353,7 +381,7 @@ interface GetPageviewOptions extends BaseAPIOptions {
353
381
  */
354
382
  signal?: AbortSignal;
355
383
  }
356
- declare const getPageviews: ({ serverURL, lang, paths, signal, }: GetPageviewOptions) => Promise<number[]>;
384
+ declare const getPageview: ({ serverURL, lang, paths, signal, }: GetPageviewOptions) => Promise<number[]>;
357
385
  interface UpdatePageviewOptions extends BaseAPIOptions {
358
386
  /**
359
387
  * 待更新页面的 path
@@ -362,13 +390,13 @@ interface UpdatePageviewOptions extends BaseAPIOptions {
362
390
  */
363
391
  path: string;
364
392
  }
365
- declare const updatePageviews: (options: UpdatePageviewOptions) => Promise<number>;
393
+ declare const updatePageview: (options: UpdatePageviewOptions) => Promise<number>;
366
394
 
367
395
  interface GetRecentCommentOptions extends BaseAPIOptions {
368
396
  /**
369
397
  * 获取评论的数量
370
398
  *
371
- * Comment numebr to be fetched
399
+ * Comment number to be fetched
372
400
  */
373
401
  count: number;
374
402
  /**
@@ -403,11 +431,9 @@ interface GetUserListOptions extends BaseAPIOptions {
403
431
  interface WalineUser extends Pick<WalineComment, 'nick' | 'link' | 'avatar' | 'label' | 'level'> {
404
432
  count: number;
405
433
  }
406
- interface GetUserListResponse {
407
- errno: number;
408
- message: string;
434
+ interface GetUserListResponse extends ErrorStatusResponse {
409
435
  data: WalineUser[];
410
436
  }
411
437
  declare const getUserList: ({ serverURL, signal, pageSize, lang, }: GetUserListOptions) => Promise<WalineUser[]>;
412
438
 
413
- export { AddCommentOptions, AddCommentResponse, DeleteCommentOptions, GetArticleCounterOptions, GetArticleCounterResponse, GetCommentCountOptions, GetCommentOptions, GetCommentResponse, GetRecentCommentOptions, GetUserListOptions, GetUserListResponse, LikeCommentOptions, UpdateArticleCounterOptions, UpdateCommentOptions, UpdatePageviewOptions, UserInfo, WalineUser, addComment, deleteComment, fetchCommentCount, getArticleCounter, getComment, getPageviews, getRecentComment, getUserList, likeComment, login, updateArticleCounter, updateComment, updatePageviews };
439
+ export { AddCommentOptions, AddCommentResponse, DeleteCommentOptions, DeleteCommentResponse, GetArticleCounterOptions, GetArticleCounterResponse, GetCommentCountOptions, GetCommentOptions, GetCommentResponse, GetRecentCommentOptions, GetUserListOptions, GetUserListResponse, UpdateArticleCounterOptions, UpdateCommentOptions, UpdateCommentResponse, UpdatePageviewOptions, UserInfo, WalineUser, addComment, deleteComment, fetchCommentCount, getArticleCounter, getComment, getPageview, getRecentComment, getUserList, login, updateArticleCounter, updateComment, updatePageview };
package/dist/api.mjs CHANGED
@@ -1,2 +1,2 @@
1
- const e={"Content-Type":"application/json"},n=(e,n="")=>{if("object"==typeof e&&e.errno)throw new TypeError(`Fetch ${n} failed with ${e.errno}: ${e.errmsg}`);return e},t=({serverURL:e,lang:t,paths:o,type:a,signal:r})=>fetch(`${e}/article?path=${encodeURIComponent(o.join(","))}&type=${encodeURIComponent(a.join(","))}&lang=${t}`,{signal:r}).then((e=>e.json())).then((e=>n(e,"article count"))),o=({serverURL:t,lang:o,path:a,type:r,action:s})=>fetch(`${t}/article?lang=${o}`,{method:"POST",headers:e,body:JSON.stringify({path:a,type:r,action:s})}).then((e=>e.json())).then((e=>n(e,"article count"))),a=({serverURL:e,lang:t,path:o,page:a,pageSize:r,sortBy:s,signal:i,token:h})=>{const c={};return h&&(c.Authorization=`Bearer ${h}`),fetch(`${e}/comment?path=${encodeURIComponent(o)}&pageSize=${r}&page=${a}&lang=${t}&sortBy=${s}`,{signal:i,headers:c}).then((e=>e.json())).then((e=>n(e,"comment data")))},r=({serverURL:e,lang:n,token:t,comment:o})=>{const a={"Content-Type":"application/json"};return t&&(a.Authorization=`Bearer ${t}`),fetch(`${e}/comment${o.eid?`/${o.eid}`:""}?lang=${n}`,{method:"PUT",headers:a,body:JSON.stringify(o)}).then((e=>e.json()))},s=({serverURL:e,lang:n,token:t,objectId:o})=>fetch(`${e}/comment/${o}?lang=${n}`,{method:"DELETE",headers:{Authorization:`Bearer ${t}`}}).then((e=>e.json())),i=({serverURL:n,lang:t,objectId:o,like:a})=>fetch(`${n}/comment/${o}?lang=${t}`,{method:"PUT",headers:e,body:JSON.stringify({like:a})}).then((e=>e.json())),h=({serverURL:n,lang:t,token:o,objectId:a,...r})=>fetch(`${n}/comment/${a}?lang=${t}`,{method:"PUT",headers:{...e,Authorization:`Bearer ${o}`},body:JSON.stringify(r)}).then((e=>e.json())),c=({serverURL:e,lang:t,paths:o,signal:a})=>fetch(`${e}/comment?type=count&url=${encodeURIComponent(o.join(","))}&lang=${t}`,{signal:a}).then((e=>e.json())).then((e=>n(e,"comment count"))).then((e=>Array.isArray(e)?e:[e])),l=({lang:e,serverURL:n})=>{const t=(window.innerWidth-450)/2,o=(window.innerHeight-450)/2,a=window.open(`${n}/ui/login?lng=${encodeURIComponent(e)}`,"_blank",`width=450,height=450,left=${t},top=${o},scrollbars=no,resizable=no,status=no,location=no,toolbar=no,menubar=no`);return a?.postMessage({type:"TOKEN",data:null},"*"),new Promise((e=>{const n=({data:t})=>{t&&"object"==typeof t&&"userInfo"===t.type&&t.data.token&&(a?.close(),window.removeEventListener("message",n),e(t.data))};window.addEventListener("message",n)}))},g=({serverURL:e,lang:n,paths:o,signal:a})=>t({serverURL:e,lang:n,paths:o,type:["time"],signal:a}).then((e=>Array.isArray(e)?e:[e])),$=e=>o({...e,type:"time",action:"inc"}),p=({serverURL:e,lang:t,count:o,signal:a,token:r})=>{const s={};return r&&(s.Authorization=`Bearer ${r}`),fetch(`${e}/comment?type=recent&count=${o}&lang=${t}`,{signal:a,headers:s}).then((e=>e.json())).then((e=>n(e,"recent comment")))},d=({serverURL:e,signal:t,pageSize:o,lang:a})=>fetch(`${e}/user?pageSize=${o}&lang=${a}`,{signal:t}).then((e=>e.json())).then((e=>n(e,"user list"))).then((e=>e.data));export{r as addComment,s as deleteComment,c as fetchCommentCount,t as getArticleCounter,a as getComment,g as getPageviews,p as getRecentComment,d as getUserList,i as likeComment,l as login,o as updateArticleCounter,h as updateComment,$ as updatePageviews};
1
+ const e={"Content-Type":"application/json"},n=(e,n="")=>{if("object"==typeof e&&e.errno)throw new TypeError(`${n} failed with ${e.errno}: ${e.errmsg}`);return e},t=({serverURL:e,lang:n,paths:t,type:o,signal:a})=>fetch(`${e}/article?path=${encodeURIComponent(t.join(","))}&type=${encodeURIComponent(o.join(","))}&lang=${n}`,{signal:a}).then((e=>e.json())),o=({serverURL:n,lang:t,path:o,type:a,action:r})=>fetch(`${n}/article?lang=${t}`,{method:"POST",headers:e,body:JSON.stringify({path:o,type:a,action:r})}).then((e=>e.json())),a=({serverURL:e,lang:t,path:o,page:a,pageSize:r,sortBy:s,signal:i,token:h})=>{const l={};return h&&(l.Authorization=`Bearer ${h}`),fetch(`${e}/comment?path=${encodeURIComponent(o)}&pageSize=${r}&page=${a}&lang=${t}&sortBy=${s}`,{signal:i,headers:l}).then((e=>e.json())).then((e=>n(e,"Get comment data")))},r=({serverURL:e,lang:n,token:t,comment:o})=>{const a={"Content-Type":"application/json"};return t&&(a.Authorization=`Bearer ${t}`),fetch(`${e}/comment?lang=${n}`,{method:"POST",headers:a,body:JSON.stringify(o)}).then((e=>e.json()))},s=({serverURL:e,lang:t,token:o,objectId:a})=>fetch(`${e}/comment/${a}?lang=${t}`,{method:"DELETE",headers:{Authorization:`Bearer ${o}`}}).then((e=>e.json())).then((e=>n(e,"Delete comment"))),i=({serverURL:t,lang:o,token:a,objectId:r,...s})=>fetch(`${t}/comment/${r}?lang=${o}`,{method:"PUT",headers:{...e,Authorization:`Bearer ${a}`},body:JSON.stringify(s)}).then((e=>e.json())).then((e=>n(e,"Update comment"))),h=({serverURL:e,lang:n,paths:t,signal:o})=>fetch(`${e}/comment?type=count&url=${encodeURIComponent(t.join(","))}&lang=${n}`,{signal:o}).then((e=>e.json())).then((e=>Array.isArray(e)?e:[e])),l=({lang:e,serverURL:n})=>{const t=(window.innerWidth-450)/2,o=(window.innerHeight-450)/2,a=window.open(`${n}/ui/login?lng=${encodeURIComponent(e)}`,"_blank",`width=450,height=450,left=${t},top=${o},scrollbars=no,resizable=no,status=no,location=no,toolbar=no,menubar=no`);return a?.postMessage({type:"TOKEN",data:null},"*"),new Promise((e=>{const n=({data:t})=>{t&&"object"==typeof t&&"userInfo"===t.type&&t.data.token&&(a?.close(),window.removeEventListener("message",n),e(t.data))};window.addEventListener("message",n)}))},g=({serverURL:e,lang:n,paths:o,signal:a})=>t({serverURL:e,lang:n,paths:o,type:["time"],signal:a}).then((e=>Array.isArray(e)?e:[e])),c=e=>o({...e,type:"time",action:"inc"}),p=({serverURL:e,lang:n,count:t,signal:o,token:a})=>{const r={};return a&&(r.Authorization=`Bearer ${a}`),fetch(`${e}/comment?type=recent&count=${t}&lang=${n}`,{signal:o,headers:r}).then((e=>e.json()))},$=({serverURL:e,signal:t,pageSize:o,lang:a})=>fetch(`${e}/user?pageSize=${o}&lang=${a}`,{signal:t}).then((e=>e.json())).then((e=>n(e,"user list"))).then((e=>e.data));export{r as addComment,s as deleteComment,h as fetchCommentCount,t as getArticleCounter,a as getComment,g as getPageview,p as getRecentComment,$ as getUserList,l as login,o as updateArticleCounter,i as updateComment,c as updatePageview};
2
2
  //# sourceMappingURL=api.mjs.map
package/dist/api.mjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"api.mjs","sources":["../src/api/utils.ts","../src/api/articleCounter.ts","../src/api/comment.ts","../src/api/commentCount.ts","../src/api/login.ts","../src/api/pageview.ts","../src/api/recentComment.ts","../src/api/user.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 APIErrorResponse {\n errno: number;\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 = unknown>(\n data: T | APIErrorResponse,\n name = ''\n): T => {\n if (typeof data === 'object' && (data as APIErrorResponse).errno)\n throw new TypeError(\n `Fetch ${name} failed with ${(data as APIErrorResponse).errno}: ${\n (data as APIErrorResponse).errmsg\n }`\n );\n\n return data as T;\n};\n","import { JSON_HEADERS, errorCheck } 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 )\n .then((resp) => <Promise<GetArticleCounterResponse>>resp.json())\n .then((data) => errorCheck(data, 'article count'));\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 })\n .then((resp) => <Promise<number>>resp.json())\n .then((data) => errorCheck(data, 'article count'));\n","import { JSON_HEADERS, errorCheck } from './utils';\nimport type { BaseAPIOptions } from './utils';\nimport type { WalineComment, WalineCommentData } from '../typings';\n\nexport interface GetCommentOptions extends BaseAPIOptions {\n /**\n * 待获取评论列hi奥德路径\n *\n * Path of comment list\n */\n path: string;\n\n /**\n * 评论分页数\n *\n * Comment panination 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 {\n /**\n * 评论数量\n *\n * Comment number\n */\n count: 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, '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 {\n /**\n * 渲染好的评论数据\n *\n * Comment data rendered\n */\n data?: WalineComment;\n\n /** 错误原因 */\n errmsg?: string;\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(\n `${serverURL}/comment${comment.eid ? `/${comment.eid}` : ''}?lang=${lang}`,\n {\n method: 'PUT',\n headers,\n body: JSON.stringify(comment),\n }\n ).then((resp) => <Promise<AddCommentResponse>>resp.json());\n};\n\nexport interface DeleteCommentOptions extends BaseAPIOptions {\n token: string;\n objectId: string | number;\n}\n\nexport const deleteComment = ({\n serverURL,\n lang,\n token,\n objectId,\n}: DeleteCommentOptions): Promise<void> =>\n fetch(`${serverURL}/comment/${objectId}?lang=${lang}`, {\n method: 'DELETE',\n headers: {\n Authorization: `Bearer ${token}`,\n },\n }).then((resp) => <Promise<void>>resp.json());\n\nexport interface LikeCommentOptions extends BaseAPIOptions {\n /**\n * 评论的 ID\n *\n * Comment ID\n */\n objectId: number | string;\n\n /**\n * 点赞还是取消点赞\n *\n * Like or dislike\n */\n like: boolean;\n}\n\nexport const likeComment = ({\n serverURL,\n lang,\n objectId,\n like,\n}: LikeCommentOptions): Promise<void> =>\n fetch(`${serverURL}/comment/${objectId}?lang=${lang}`, {\n method: 'PUT',\n headers: JSON_HEADERS,\n body: JSON.stringify({ like }),\n }).then((resp) => <Promise<void>>resp.json());\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 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 const updateComment = ({\n serverURL,\n lang,\n token,\n objectId,\n ...data\n}: UpdateCommentOptions): Promise<void> =>\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 }).then((resp) => <Promise<void>>resp.json());\n","import { errorCheck } from './utils';\nimport 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 .then((data) => errorCheck(data, 'comment count'))\n // TODO: Improve this API\n .then((counts) => (Array.isArray(counts) ? counts : [counts]));\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","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 getPageviews = ({\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 updatePageviews = (\n options: UpdatePageviewOptions\n): Promise<number> =>\n updateArticleCounter({\n ...options,\n type: 'time',\n action: 'inc',\n });\n","import { errorCheck } from './utils';\nimport type { BaseAPIOptions } from './utils';\nimport type { WalineComment } from '../typings';\n\nexport interface GetRecentCommentOptions extends BaseAPIOptions {\n /**\n * 获取评论的数量\n *\n * Comment numebr 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 })\n .then((resp) => <Promise<WalineComment[]>>resp.json())\n .then((data) => errorCheck(data, 'recent comment'));\n};\n","import { errorCheck } 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 {\n errno: number;\n message: string;\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"],"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","getComment","page","pageSize","sortBy","token","Authorization","addComment","comment","eid","deleteComment","objectId","likeComment","like","updateComment","fetchCommentCount","counts","Array","isArray","login","left","window","innerWidth","top","innerHeight","handler","open","postMessage","Promise","resolve","receiver","close","removeEventListener","addEventListener","getPageviews","updatePageviews","options","getRecentComment","count","getUserList"],"mappings":"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"}
1
+ {"version":3,"file":"api.mjs","sources":["../src/api/utils.ts","../src/api/articleCounter.ts","../src/api/comment.ts","../src/api/commentCount.ts","../src/api/login.ts","../src/api/pageview.ts","../src/api/recentComment.ts","../src/api/user.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","/* 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","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"],"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","getComment","page","pageSize","sortBy","token","Authorization","addComment","comment","deleteComment","objectId","updateComment","fetchCommentCount","counts","Array","isArray","login","left","window","innerWidth","top","innerHeight","handler","open","postMessage","Promise","resolve","receiver","close","removeEventListener","addEventListener","getPageview","updatePageview","options","getRecentComment","count","getUserList"],"mappings":"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"}
package/dist/comment.cjs CHANGED
@@ -1,2 +1,2 @@
1
- "use strict";const t=({serverURL:t,lang:e,paths:r,signal:n})=>fetch(`${t}/comment?type=count&url=${encodeURIComponent(r.join(","))}&lang=${e}`,{signal:n}).then((t=>t.json())).then((t=>((t,e="")=>{if("object"==typeof t&&t.errno)throw new TypeError(`Fetch ${e} failed with ${t.errno}: ${t.errmsg}`);return t})(t,"comment count"))).then((t=>Array.isArray(t)?t:[t])),e=t=>{const e=((t="")=>t.replace(/\/$/u,""))(t);return/^(https?:)?\/\//.test(e)?e:`https://${e}`},r=t=>{"AbortError"!==t.name&&console.error(t.message)};exports.commentCount=({serverURL:n,path:o=window.location.pathname,selector:a=".waline-comment-count",lang:s="zh-CN"})=>{const c=new AbortController,l=document.querySelectorAll(a);return l.length&&t({serverURL:e(n),paths:Array.from(l).map((t=>(t=>{try{t=decodeURI(t)}catch(t){}return t})(t.dataset.path||t.getAttribute("id")||o))),lang:s,signal:c.signal}).then((t=>{l.forEach(((e,r)=>{e.innerText=t[r].toString()}))})).catch(r),c.abort.bind(c)},exports.version="2.13.1";
1
+ "use strict";const t=t=>{const e=((t="")=>t.replace(/\/$/u,""))(t);return/^(https?:)?\/\//.test(e)?e:`https://${e}`},e=t=>{"AbortError"!==t.name&&console.error(t.message)};exports.commentCount=({serverURL:r,path:n=window.location.pathname,selector:o=".waline-comment-count",lang:a="zh-CN"})=>{const s=new AbortController,c=document.querySelectorAll(o);return c.length&&(({serverURL:t,lang:e,paths:r,signal:n})=>fetch(`${t}/comment?type=count&url=${encodeURIComponent(r.join(","))}&lang=${e}`,{signal:n}).then((t=>t.json())).then((t=>Array.isArray(t)?t:[t])))({serverURL:t(r),paths:Array.from(c).map((t=>(t=>{try{t=decodeURI(t)}catch(t){}return t})(t.dataset.path||t.getAttribute("id")||n))),lang:a,signal:s.signal}).then((t=>{c.forEach(((e,r)=>{e.innerText=t[r].toString()}))})).catch(e),s.abort.bind(s)},exports.version="2.14.0";
2
2
  //# sourceMappingURL=comment.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"comment.cjs","sources":["../src/api/utils.ts","../src/api/commentCount.ts","../src/utils/config.ts","../src/utils/path.ts","../src/utils/error.ts","../src/comment.ts","../src/version.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 APIErrorResponse {\n errno: number;\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 = unknown>(\n data: T | APIErrorResponse,\n name = ''\n): T => {\n if (typeof data === 'object' && (data as APIErrorResponse).errno)\n throw new TypeError(\n `Fetch ${name} failed with ${(data as APIErrorResponse).errno}: ${\n (data as APIErrorResponse).errmsg\n }`\n );\n\n return data as T;\n};\n","import { errorCheck } from './utils';\nimport 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 .then((data) => errorCheck(data, 'comment count'))\n // TODO: Improve this API\n .then((counts) => (Array.isArray(counts) ? counts : [counts]));\n","import {\n defaultLang,\n defaultLocales,\n defaultReaction,\n defaultUploadImage,\n defaultHighlighter,\n defaultTexRenderer,\n getDefaultSearchOptions,\n getMeta,\n} from '../config';\n\nimport { decodePath, isLinkHttp, removeEndingSplash } from './path';\n\nimport type {\n WalineEmojiInfo,\n WalineEmojiMaps,\n WalineLocale,\n WalineProps,\n} from '../typings';\n\nexport interface WalineEmojiConfig {\n tabs: Pick<WalineEmojiInfo, 'name' | 'icon' | 'items'>[];\n map: WalineEmojiMaps;\n}\n\nexport interface WalineConfig\n extends Required<Omit<WalineProps, 'wordLimit' | 'reaction'>> {\n locale: WalineLocale;\n wordLimit: [number, number] | false;\n reaction: string[];\n}\n\nexport const getServerURL = (serverURL: string): string => {\n const result = removeEndingSplash(serverURL);\n\n return isLinkHttp(result) ? result : `https://${result}`;\n};\n\nconst getWordLimit = (\n wordLimit: WalineProps['wordLimit']\n): [number, number] | false =>\n Array.isArray(wordLimit) ? wordLimit : wordLimit ? [0, wordLimit] : false;\n\nconst fallback = <T = unknown>(\n value: T | false | undefined,\n fallback: T\n): T | false =>\n typeof value === 'function' ? value : value === false ? false : fallback;\n\nexport const getConfig = ({\n serverURL,\n\n path = location.pathname,\n lang = defaultLang,\n locale,\n emoji = ['//unpkg.com/@waline/emojis@1.1.0/weibo'],\n meta = ['nick', 'mail', 'link'],\n requiredMeta = [],\n dark = false,\n pageSize = 10,\n wordLimit,\n imageUploader,\n highlighter,\n texRenderer,\n copyright = true,\n login = 'enable',\n search,\n reaction,\n recaptchaV3Key = '',\n ...more\n}: WalineProps): WalineConfig => ({\n serverURL: getServerURL(serverURL),\n path: decodePath(path),\n locale: {\n ...(defaultLocales[lang] || defaultLocales[defaultLang]),\n ...(typeof locale === 'object' ? locale : {}),\n } as WalineLocale,\n wordLimit: getWordLimit(wordLimit),\n meta: getMeta(meta),\n requiredMeta: getMeta(requiredMeta),\n imageUploader: fallback(imageUploader, defaultUploadImage),\n highlighter: fallback(highlighter, defaultHighlighter),\n texRenderer: fallback(texRenderer, defaultTexRenderer),\n lang,\n dark,\n emoji,\n pageSize,\n login,\n copyright,\n search: search || getDefaultSearchOptions(lang),\n recaptchaV3Key,\n reaction: Array.isArray(reaction)\n ? reaction\n : reaction === true\n ? defaultReaction\n : [],\n ...more,\n});\n","export const decodePath = (path: string): string => {\n try {\n path = decodeURI(path);\n } catch (err) {\n // ignore error\n }\n\n return path;\n};\n\nexport const removeEndingSplash = (content = ''): string =>\n content.replace(/\\/$/u, '');\n\nexport const isLinkHttp = (link: string): boolean =>\n /^(https?:)?\\/\\//.test(link);\n","export const errorHandler = (err: Error): void => {\n if (err.name !== 'AbortError') console.error(err.message);\n};\n","import { fetchCommentCount } from './api';\nimport { decodePath, errorHandler, getServerURL } from './utils';\nimport type { WalineAbort } from './typings';\n\nexport interface WalineCommentCountOptions {\n /**\n * Waline 服务端地址\n *\n * Waline server url\n */\n serverURL: string;\n\n /**\n * 评论数 CSS 选择器\n *\n * Commment count CSS selector\n *\n * @default '.waline-comment-count'\n */\n selector?: string;\n\n /**\n * 需要获取的默认路径\n *\n * Path to be fetched by default\n *\n * @default window.location.pathname\n */\n path?: string;\n\n /**\n * 错误提示消息所使用的语言\n *\n * Language of error message\n *\n * @default 'zh-CN'\n */\n lang?: string;\n}\n\nexport const commentCount = ({\n serverURL,\n path = window.location.pathname,\n selector = '.waline-comment-count',\n lang = 'zh-CN',\n}: // eslint-disable-next-line @typescript-eslint/no-explicit-any\nWalineCommentCountOptions): WalineAbort => {\n const controller = new AbortController();\n\n // comment count\n const elements = document.querySelectorAll<HTMLElement>(selector);\n\n if (elements.length)\n void fetchCommentCount({\n serverURL: getServerURL(serverURL),\n paths: Array.from(elements).map((element) =>\n decodePath(element.dataset.path || element.getAttribute('id') || path)\n ),\n lang,\n signal: controller.signal,\n })\n .then((counts) => {\n elements.forEach((element, index) => {\n element.innerText = counts[index].toString();\n });\n })\n .catch(errorHandler);\n\n return controller.abort.bind(controller);\n};\n","declare const VERSION: string;\n\nexport const version = VERSION;\n"],"names":["fetchCommentCount","serverURL","lang","paths","signal","fetch","encodeURIComponent","join","then","resp","json","data","name","errno","TypeError","errmsg","errorCheck","counts","Array","isArray","getServerURL","result","content","replace","removeEndingSplash","test","errorHandler","err","console","error","message","path","window","location","pathname","selector","controller","AbortController","elements","document","querySelectorAll","length","from","map","element","decodeURI","decodePath","dataset","getAttribute","forEach","index","innerText","toString","catch","abort","bind"],"mappings":"aA0BO,MCPMA,EAAoB,EAC/BC,YACAC,OACAC,QACAC,YAEAC,MACE,GAAGJ,4BAAoCK,mBACrCH,EAAMI,KAAK,cACHL,IACV,CAAEE,WAEDI,MAAMC,GAAqCA,EAAKC,SAChDF,MAAMG,GDNe,EACxBA,EACAC,EAAO,MAEP,GAAoB,iBAATD,GAAsBA,EAA0BE,MACzD,MAAM,IAAIC,UACR,SAASF,iBAAqBD,EAA0BE,UACrDF,EAA0BI,UAIjC,OAAOJ,CAAS,ECLEK,CAAWL,EAAM,mBAEhCH,MAAMS,GAAYC,MAAMC,QAAQF,GAAUA,EAAS,CAACA,KCF5CG,EAAgBnB,IAC3B,MAAMoB,ECvB0B,EAACC,EAAU,KAC3CA,EAAQC,QAAQ,OAAQ,IDsBTC,CAAmBvB,GAElC,MCrBA,kBAAkBwB,KDqBAJ,GAAUA,EAAS,WAAWA,GAAQ,EEnC7CK,EAAgBC,IACV,eAAbA,EAAIf,MAAuBgB,QAAQC,MAAMF,EAAIG,QAAQ,uBCuC/B,EAC1B7B,YACA8B,OAAOC,OAAOC,SAASC,SACvBC,WAAW,wBACXjC,OAAO,YAGP,MAAMkC,EAAa,IAAIC,gBAGjBC,EAAWC,SAASC,iBAA8BL,GAkBxD,OAhBIG,EAASG,QACNzC,EAAkB,CACrBC,UAAWmB,EAAanB,GACxBE,MAAOe,MAAMwB,KAAKJ,GAAUK,KAAKC,GFvDb,CAACb,IACzB,IACEA,EAAOc,UAAUd,EAGlB,CAFC,MAAOJ,GAER,CAED,OAAOI,CAAI,EEiDLe,CAAWF,EAAQG,QAAQhB,MAAQa,EAAQI,aAAa,OAASjB,KAEnE7B,OACAE,OAAQgC,EAAWhC,SAElBI,MAAMS,IACLqB,EAASW,SAAQ,CAACL,EAASM,KACzBN,EAAQO,UAAYlC,EAAOiC,GAAOE,UAAU,GAC5C,IAEHC,MAAM3B,GAEJU,EAAWkB,MAAMC,KAAKnB,EAAW,kBClEnB"}
1
+ {"version":3,"file":"comment.cjs","sources":["../src/api/commentCount.ts","../src/utils/config.ts","../src/utils/path.ts","../src/utils/error.ts","../src/comment.ts","../src/version.ts"],"sourcesContent":["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 {\n defaultLang,\n defaultLocales,\n defaultReaction,\n defaultUploadImage,\n defaultHighlighter,\n defaultTexRenderer,\n getDefaultSearchOptions,\n getMeta,\n} from '../config';\n\nimport { decodePath, isLinkHttp, removeEndingSplash } from './path';\n\nimport type {\n WalineEmojiInfo,\n WalineEmojiMaps,\n WalineLocale,\n WalineProps,\n} from '../typings';\n\nexport interface WalineEmojiConfig {\n tabs: Pick<WalineEmojiInfo, 'name' | 'icon' | 'items'>[];\n map: WalineEmojiMaps;\n}\n\nexport interface WalineConfig\n extends Required<Omit<WalineProps, 'wordLimit' | 'reaction'>> {\n locale: WalineLocale;\n wordLimit: [number, number] | false;\n reaction: string[];\n}\n\nexport const getServerURL = (serverURL: string): string => {\n const result = removeEndingSplash(serverURL);\n\n return isLinkHttp(result) ? result : `https://${result}`;\n};\n\nconst getWordLimit = (\n wordLimit: WalineProps['wordLimit']\n): [number, number] | false =>\n Array.isArray(wordLimit) ? wordLimit : wordLimit ? [0, wordLimit] : false;\n\nconst fallback = <T = unknown>(\n value: T | false | undefined,\n fallback: T\n): T | false =>\n typeof value === 'function' ? value : value === false ? false : fallback;\n\nexport const getConfig = ({\n serverURL,\n\n path = location.pathname,\n lang = defaultLang,\n locale,\n emoji = ['//unpkg.com/@waline/emojis@1.1.0/weibo'],\n meta = ['nick', 'mail', 'link'],\n requiredMeta = [],\n dark = false,\n pageSize = 10,\n wordLimit,\n imageUploader,\n highlighter,\n texRenderer,\n copyright = true,\n login = 'enable',\n search,\n reaction,\n recaptchaV3Key = '',\n commentSorting = 'latest',\n ...more\n}: WalineProps): WalineConfig => ({\n serverURL: getServerURL(serverURL),\n path: decodePath(path),\n locale: {\n ...(defaultLocales[lang] || defaultLocales[defaultLang]),\n ...(typeof locale === 'object' ? locale : {}),\n } as WalineLocale,\n wordLimit: getWordLimit(wordLimit),\n meta: getMeta(meta),\n requiredMeta: getMeta(requiredMeta),\n imageUploader: fallback(imageUploader, defaultUploadImage),\n highlighter: fallback(highlighter, defaultHighlighter),\n texRenderer: fallback(texRenderer, defaultTexRenderer),\n lang,\n dark,\n emoji,\n pageSize,\n login,\n copyright,\n search: search || getDefaultSearchOptions(lang),\n recaptchaV3Key,\n reaction: Array.isArray(reaction)\n ? reaction\n : reaction === true\n ? defaultReaction\n : [],\n commentSorting,\n ...more,\n});\n","export const decodePath = (path: string): string => {\n try {\n path = decodeURI(path);\n } catch (err) {\n // ignore error\n }\n\n return path;\n};\n\nexport const removeEndingSplash = (content = ''): string =>\n content.replace(/\\/$/u, '');\n\nexport const isLinkHttp = (link: string): boolean =>\n /^(https?:)?\\/\\//.test(link);\n","export const errorHandler = (err: Error): void => {\n if (err.name !== 'AbortError') console.error(err.message);\n};\n","import { fetchCommentCount } from './api';\nimport { decodePath, errorHandler, getServerURL } from './utils';\nimport type { WalineAbort } from './typings';\n\nexport interface WalineCommentCountOptions {\n /**\n * Waline 服务端地址\n *\n * Waline server url\n */\n serverURL: string;\n\n /**\n * 评论数 CSS 选择器\n *\n * Comment count CSS selector\n *\n * @default '.waline-comment-count'\n */\n selector?: string;\n\n /**\n * 需要获取的默认路径\n *\n * Path to be fetched by default\n *\n * @default window.location.pathname\n */\n path?: string;\n\n /**\n * 错误提示消息所使用的语言\n *\n * Language of error message\n *\n * @default 'zh-CN'\n */\n lang?: string;\n}\n\nexport const commentCount = ({\n serverURL,\n path = window.location.pathname,\n selector = '.waline-comment-count',\n lang = 'zh-CN',\n}: // eslint-disable-next-line @typescript-eslint/no-explicit-any\nWalineCommentCountOptions): WalineAbort => {\n const controller = new AbortController();\n\n // comment count\n const elements = document.querySelectorAll<HTMLElement>(selector);\n\n if (elements.length)\n void fetchCommentCount({\n serverURL: getServerURL(serverURL),\n paths: Array.from(elements).map((element) =>\n decodePath(element.dataset.path || element.getAttribute('id') || path)\n ),\n lang,\n signal: controller.signal,\n })\n .then((counts) => {\n elements.forEach((element, index) => {\n element.innerText = counts[index].toString();\n });\n })\n .catch(errorHandler);\n\n return controller.abort.bind(controller);\n};\n","declare const VERSION: string;\n\nexport const version = VERSION;\n"],"names":["getServerURL","serverURL","result","content","replace","removeEndingSplash","test","errorHandler","err","name","console","error","message","path","window","location","pathname","selector","lang","controller","AbortController","elements","document","querySelectorAll","length","paths","signal","fetch","encodeURIComponent","join","then","resp","json","counts","Array","isArray","fetchCommentCount","from","map","element","decodeURI","decodePath","dataset","getAttribute","forEach","index","innerText","toString","catch","abort","bind"],"mappings":"aAkBO,MCcMA,EAAgBC,IAC3B,MAAMC,ECvB0B,EAACC,EAAU,KAC3CA,EAAQC,QAAQ,OAAQ,IDsBTC,CAAmBJ,GAElC,MCrBA,kBAAkBK,KDqBAJ,GAAUA,EAAS,WAAWA,GAAQ,EEnC7CK,EAAgBC,IACV,eAAbA,EAAIC,MAAuBC,QAAQC,MAAMH,EAAII,QAAQ,uBCuC/B,EAC1BX,YACAY,OAAOC,OAAOC,SAASC,SACvBC,WAAW,wBACXC,OAAO,YAGP,MAAMC,EAAa,IAAIC,gBAGjBC,EAAWC,SAASC,iBAA8BN,GAkBxD,OAhBII,EAASG,QJlCkB,GAC/BvB,YACAiB,OACAO,QACAC,YAEAC,MACE,GAAG1B,4BAAoC2B,mBACrCH,EAAMI,KAAK,cACHX,IACV,CAAEQ,WAEDI,MAAMC,GAAqCA,EAAKC,SAEhDF,MAAMG,GAAYC,MAAMC,QAAQF,GAAUA,EAAS,CAACA,KIqBhDG,CAAkB,CACrBnC,UAAWD,EAAaC,GACxBwB,MAAOS,MAAMG,KAAKhB,GAAUiB,KAAKC,GFvDb,CAAC1B,IACzB,IACEA,EAAO2B,UAAU3B,EAGlB,CAFC,MAAOL,GAER,CAED,OAAOK,CAAI,EEiDL4B,CAAWF,EAAQG,QAAQ7B,MAAQ0B,EAAQI,aAAa,OAAS9B,KAEnEK,OACAQ,OAAQP,EAAWO,SAElBI,MAAMG,IACLZ,EAASuB,SAAQ,CAACL,EAASM,KACzBN,EAAQO,UAAYb,EAAOY,GAAOE,UAAU,GAC5C,IAEHC,MAAMzC,GAEJY,EAAW8B,MAAMC,KAAK/B,EAAW,kBClEnB"}
@@ -10,7 +10,7 @@ interface WalineCommentCountOptions {
10
10
  /**
11
11
  * 评论数 CSS 选择器
12
12
  *
13
- * Commment count CSS selector
13
+ * Comment count CSS selector
14
14
  *
15
15
  * @default '.waline-comment-count'
16
16
  */
@@ -10,7 +10,7 @@ interface WalineCommentCountOptions {
10
10
  /**
11
11
  * 评论数 CSS 选择器
12
12
  *
13
- * Commment count CSS selector
13
+ * Comment count CSS selector
14
14
  *
15
15
  * @default '.waline-comment-count'
16
16
  */
package/dist/comment.d.ts CHANGED
@@ -10,7 +10,7 @@ interface WalineCommentCountOptions {
10
10
  /**
11
11
  * 评论数 CSS 选择器
12
12
  *
13
- * Commment count CSS selector
13
+ * Comment count CSS selector
14
14
  *
15
15
  * @default '.waline-comment-count'
16
16
  */
package/dist/comment.js CHANGED
@@ -17,58 +17,53 @@
17
17
  value: true
18
18
  });
19
19
  _exports.version = _exports.commentCount = void 0;
20
- const e = _ref => {
21
- let {
22
- serverURL: e,
23
- lang: t,
24
- paths: r,
25
- signal: n
26
- } = _ref;
27
- return fetch(`${e}/comment?type=count&url=${encodeURIComponent(r.join(","))}&lang=${t}`, {
28
- signal: n
29
- }).then(e => e.json()).then(e => function (e) {
30
- let t = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : "";
31
- if ("object" == typeof e && e.errno) throw new TypeError(`Fetch ${t} failed with ${e.errno}: ${e.errmsg}`);
32
- return e;
33
- }(e, "comment count")).then(e => Array.isArray(e) ? e : [e]);
20
+ const t = t => {
21
+ const e = function () {
22
+ let t = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : "";
23
+ return t.replace(/\/$/u, "");
24
+ }(t);
25
+ return /^(https?:)?\/\//.test(e) ? e : `https://${e}`;
34
26
  },
35
- t = e => {
36
- const t = function () {
37
- let e = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : "";
38
- return e.replace(/\/$/u, "");
39
- }(e);
40
- return /^(https?:)?\/\//.test(t) ? t : `https://${t}`;
27
+ e = t => {
28
+ "AbortError" !== t.name && console.error(t.message);
41
29
  },
42
- r = e => {
43
- "AbortError" !== e.name && console.error(e.message);
44
- },
45
- n = _ref2 => {
30
+ r = _ref => {
46
31
  let {
47
- serverURL: n,
48
- path: o = window.location.pathname,
49
- selector: a = ".waline-comment-count",
50
- lang: c = "zh-CN"
51
- } = _ref2;
32
+ serverURL: r,
33
+ path: n = window.location.pathname,
34
+ selector: o = ".waline-comment-count",
35
+ lang: a = "zh-CN"
36
+ } = _ref;
52
37
  const s = new AbortController(),
53
- l = document.querySelectorAll(a);
54
- return l.length && e({
55
- serverURL: t(n),
56
- paths: Array.from(l).map(e => (e => {
38
+ c = document.querySelectorAll(o);
39
+ return c.length && (_ref2 => {
40
+ let {
41
+ serverURL: t,
42
+ lang: e,
43
+ paths: r,
44
+ signal: n
45
+ } = _ref2;
46
+ return fetch(`${t}/comment?type=count&url=${encodeURIComponent(r.join(","))}&lang=${e}`, {
47
+ signal: n
48
+ }).then(t => t.json()).then(t => Array.isArray(t) ? t : [t]);
49
+ })({
50
+ serverURL: t(r),
51
+ paths: Array.from(c).map(t => (t => {
57
52
  try {
58
- e = decodeURI(e);
59
- } catch (e) {}
60
- return e;
61
- })(e.dataset.path || e.getAttribute("id") || o)),
62
- lang: c,
53
+ t = decodeURI(t);
54
+ } catch (t) {}
55
+ return t;
56
+ })(t.dataset.path || t.getAttribute("id") || n)),
57
+ lang: a,
63
58
  signal: s.signal
64
- }).then(e => {
65
- l.forEach((t, r) => {
66
- t.innerText = e[r].toString();
59
+ }).then(t => {
60
+ c.forEach((e, r) => {
61
+ e.innerText = t[r].toString();
67
62
  });
68
- }).catch(r), s.abort.bind(s);
63
+ }).catch(e), s.abort.bind(s);
69
64
  },
70
- o = "2.13.1";
71
- _exports.version = o;
72
- _exports.commentCount = n;
65
+ n = "2.14.0";
66
+ _exports.version = n;
67
+ _exports.commentCount = r;
73
68
  });
74
69
  //# sourceMappingURL=comment.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"comment.js","sources":["../src/api/utils.ts","../src/api/commentCount.ts","../src/utils/config.ts","../src/utils/path.ts","../src/utils/error.ts","../src/comment.ts","../src/version.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 APIErrorResponse {\n errno: number;\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 = unknown>(\n data: T | APIErrorResponse,\n name = ''\n): T => {\n if (typeof data === 'object' && (data as APIErrorResponse).errno)\n throw new TypeError(\n `Fetch ${name} failed with ${(data as APIErrorResponse).errno}: ${\n (data as APIErrorResponse).errmsg\n }`\n );\n\n return data as T;\n};\n","import { errorCheck } from './utils';\nimport 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 .then((data) => errorCheck(data, 'comment count'))\n // TODO: Improve this API\n .then((counts) => (Array.isArray(counts) ? counts : [counts]));\n","import {\n defaultLang,\n defaultLocales,\n defaultReaction,\n defaultUploadImage,\n defaultHighlighter,\n defaultTexRenderer,\n getDefaultSearchOptions,\n getMeta,\n} from '../config';\n\nimport { decodePath, isLinkHttp, removeEndingSplash } from './path';\n\nimport type {\n WalineEmojiInfo,\n WalineEmojiMaps,\n WalineLocale,\n WalineProps,\n} from '../typings';\n\nexport interface WalineEmojiConfig {\n tabs: Pick<WalineEmojiInfo, 'name' | 'icon' | 'items'>[];\n map: WalineEmojiMaps;\n}\n\nexport interface WalineConfig\n extends Required<Omit<WalineProps, 'wordLimit' | 'reaction'>> {\n locale: WalineLocale;\n wordLimit: [number, number] | false;\n reaction: string[];\n}\n\nexport const getServerURL = (serverURL: string): string => {\n const result = removeEndingSplash(serverURL);\n\n return isLinkHttp(result) ? result : `https://${result}`;\n};\n\nconst getWordLimit = (\n wordLimit: WalineProps['wordLimit']\n): [number, number] | false =>\n Array.isArray(wordLimit) ? wordLimit : wordLimit ? [0, wordLimit] : false;\n\nconst fallback = <T = unknown>(\n value: T | false | undefined,\n fallback: T\n): T | false =>\n typeof value === 'function' ? value : value === false ? false : fallback;\n\nexport const getConfig = ({\n serverURL,\n\n path = location.pathname,\n lang = defaultLang,\n locale,\n emoji = ['//unpkg.com/@waline/emojis@1.1.0/weibo'],\n meta = ['nick', 'mail', 'link'],\n requiredMeta = [],\n dark = false,\n pageSize = 10,\n wordLimit,\n imageUploader,\n highlighter,\n texRenderer,\n copyright = true,\n login = 'enable',\n search,\n reaction,\n recaptchaV3Key = '',\n ...more\n}: WalineProps): WalineConfig => ({\n serverURL: getServerURL(serverURL),\n path: decodePath(path),\n locale: {\n ...(defaultLocales[lang] || defaultLocales[defaultLang]),\n ...(typeof locale === 'object' ? locale : {}),\n } as WalineLocale,\n wordLimit: getWordLimit(wordLimit),\n meta: getMeta(meta),\n requiredMeta: getMeta(requiredMeta),\n imageUploader: fallback(imageUploader, defaultUploadImage),\n highlighter: fallback(highlighter, defaultHighlighter),\n texRenderer: fallback(texRenderer, defaultTexRenderer),\n lang,\n dark,\n emoji,\n pageSize,\n login,\n copyright,\n search: search || getDefaultSearchOptions(lang),\n recaptchaV3Key,\n reaction: Array.isArray(reaction)\n ? reaction\n : reaction === true\n ? defaultReaction\n : [],\n ...more,\n});\n","export const decodePath = (path: string): string => {\n try {\n path = decodeURI(path);\n } catch (err) {\n // ignore error\n }\n\n return path;\n};\n\nexport const removeEndingSplash = (content = ''): string =>\n content.replace(/\\/$/u, '');\n\nexport const isLinkHttp = (link: string): boolean =>\n /^(https?:)?\\/\\//.test(link);\n","export const errorHandler = (err: Error): void => {\n if (err.name !== 'AbortError') console.error(err.message);\n};\n","import { fetchCommentCount } from './api';\nimport { decodePath, errorHandler, getServerURL } from './utils';\nimport type { WalineAbort } from './typings';\n\nexport interface WalineCommentCountOptions {\n /**\n * Waline 服务端地址\n *\n * Waline server url\n */\n serverURL: string;\n\n /**\n * 评论数 CSS 选择器\n *\n * Commment count CSS selector\n *\n * @default '.waline-comment-count'\n */\n selector?: string;\n\n /**\n * 需要获取的默认路径\n *\n * Path to be fetched by default\n *\n * @default window.location.pathname\n */\n path?: string;\n\n /**\n * 错误提示消息所使用的语言\n *\n * Language of error message\n *\n * @default 'zh-CN'\n */\n lang?: string;\n}\n\nexport const commentCount = ({\n serverURL,\n path = window.location.pathname,\n selector = '.waline-comment-count',\n lang = 'zh-CN',\n}: // eslint-disable-next-line @typescript-eslint/no-explicit-any\nWalineCommentCountOptions): WalineAbort => {\n const controller = new AbortController();\n\n // comment count\n const elements = document.querySelectorAll<HTMLElement>(selector);\n\n if (elements.length)\n void fetchCommentCount({\n serverURL: getServerURL(serverURL),\n paths: Array.from(elements).map((element) =>\n decodePath(element.dataset.path || element.getAttribute('id') || path)\n ),\n lang,\n signal: controller.signal,\n })\n .then((counts) => {\n elements.forEach((element, index) => {\n element.innerText = counts[index].toString();\n });\n })\n .catch(errorHandler);\n\n return controller.abort.bind(controller);\n};\n","declare const VERSION: string;\n\nexport const version = VERSION;\n"],"names":["fetchCommentCount","serverURL","lang","paths","signal","fetch","encodeURIComponent","join","then","resp","json","data","name","errno","TypeError","errmsg","counts","Array","isArray","getServerURL","result","content","replace","removeEndingSplash","test","errorHandler","err","console","error","message","commentCount","path","window","location","pathname","selector","controller","AbortController","elements","document","querySelectorAll","length","from","map","element","decodeURI","decodePath","dataset","getAttribute","forEach","index","innerText","toString","catch","abort","bind","version"],"mappings":";;;;;;;;;;;;;;;;;;;EA0BO,MCPMA,IAAoB;MAAA,IAC/BC;QAAAA,SAAAA,EAAAA,CAAAA;QACAC,IACAC,EAAAA,CAAAA;QAAAA,KAAAA,EAAAA,CAAAA;QACAC;;aAEAC,KACE,CAAA,GAAGJ,CAAoCK,2BAAAA,kBAAAA,CACrCH,EAAMI,IAAK,CAAA,GAAA,CAAA,CAAA,SACHL,KACV;QAAEE,MAAAA,EAAAA;MAAAA,CAAAA,CAAAA,CAEDI,KAAMC,CAAqCA,IAAAA,CAAAA,CAAKC,IAChDF,EAAAA,CAAAA,CAAAA,IAAAA,CAAMG,KDLTA,UAAAA,CAAAA,EACO;QAAA,IAAPC,CAAO,uEAAA,EAAA;QAEP,IAAoB,QAATD,IAAAA,OAAAA,CAAAA,IAAsBA,CAA0BE,CAAAA,KAAAA,EACzD,MAAM,IAAIC,SAAAA,UACCF,CAAqBD,gBAAAA,CAAAA,CAA0BE,UACrDF,CAA0BI,CAAAA,MAAAA,EAAAA,CAAAA;QAIjC,OAAOJ,CAAS;MAAA,ECLaA,CAAAA,EAAM,eAEhCH,CAAAA,CAAAA,CAAAA,IAAAA,CAAMQ,KAAYC,KAAMC,CAAAA,OAAAA,CAAQF,CAAUA,CAAAA,GAAAA,CAAAA,GAAS,CAACA,CCF5CG,CAAAA,CAAAA;IAAAA;IAAAA,CAAAA,GAAgBlB;MAC3B,MAAMmB,CAAAA;YCvB2BC,CAAU,uEAAA,EAAA;QAAA,OAC3CA,CAAQC,CAAAA,OAAAA,CAAQ,QAAQ,EDsBTC,CAAAA;MAAAA,EAAmBtB;MAElC,OCrBA,iBAAA,CAAkBuB,KDqBAJ,CAAUA,CAAAA,GAAAA,CAAAA,GAAoBA,WAAAA,CAAAA,EAAQ;IAAA;IEnC7CK,CAAgBC,GAAAA,CAAAA,IAAAA;MACV,iBAAbA,CAAId,CAAAA,IAAAA,IAAuBe,QAAQC,KAAMF,CAAAA,CAAAA,CAAIG,OAAQ,CAAA;IAAA,CAAA;ICuC9CC,IAAe;UAC1B7B;QAAAA,SAAAA,EAAAA,CAAAA;QACA8B,IAAOC,EAAAA,CAAAA,GAAAA,MAAAA,CAAOC,SAASC,QACvBC;QAAAA,QAAAA,EAAAA,CAAAA,GAAW,uBACXjC;QAAAA,IAAAA,EAAAA,CAAAA,GAAO;;MAGP,MAAMkC,CAAAA,GAAa,IAAIC,eAGjBC;QAAAA,CAAAA,GAAWC,SAASC,gBAA8BL,CAAAA,CAAAA,CAAAA;MAkBxD,OAhBIG,CAAAA,CAASG,UACNzC,CAAkB,CAAA;QACrBC,SAAWkB,EAAAA,CAAAA,CAAalB;QACxBE,KAAOc,EAAAA,KAAAA,CAAMyB,IAAKJ,CAAAA,CAAAA,CAAAA,CAAUK,IAAKC,CFvDb,IAAA,CAACb;UACzB,IACEA;YAAAA,CAAAA,GAAOc,UAAUd,CAGlB,CAAA;UAAA,CAFC,QAAOL,CAAAA,EAAAA,CAER;UAED,OAAOK,CAAI;QAAA,CEiDLe,EAAWF,EAAQG,OAAQhB,CAAAA,IAAAA,IAAQa,CAAQI,CAAAA,YAAAA,CAAa,SAASjB,CAEnE7B,CAAAA,CAAAA;QAAAA,IAAAA,EAAAA,CAAAA;QACAE,QAAQgC,CAAWhC,CAAAA;MAAAA,CAAAA,CAAAA,CAElBI,KAAMQ,CACLsB,IAAAA;QAAAA,CAAAA,CAASW,OAAQ,CAAA,CAACL,GAASM,CACzBN,KAAAA;UAAAA,CAAAA,CAAQO,YAAYnC,CAAOkC,CAAAA,CAAAA,CAAAA,CAAOE,UAAU;QAAA,CAC5C,CAAA;MAAA,CAAA,CAAA,CAEHC,KAAM5B,CAAAA,CAAAA,CAAAA,EAEJW,EAAWkB,KAAMC,CAAAA,IAAAA,CAAKnB,EAAW;IAAA,CClE7BoB;IAAAA,CAAAA,GAAU;;;"}
1
+ {"version":3,"file":"comment.js","sources":["../src/api/commentCount.ts","../src/utils/config.ts","../src/utils/path.ts","../src/utils/error.ts","../src/comment.ts","../src/version.ts"],"sourcesContent":["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 {\n defaultLang,\n defaultLocales,\n defaultReaction,\n defaultUploadImage,\n defaultHighlighter,\n defaultTexRenderer,\n getDefaultSearchOptions,\n getMeta,\n} from '../config';\n\nimport { decodePath, isLinkHttp, removeEndingSplash } from './path';\n\nimport type {\n WalineEmojiInfo,\n WalineEmojiMaps,\n WalineLocale,\n WalineProps,\n} from '../typings';\n\nexport interface WalineEmojiConfig {\n tabs: Pick<WalineEmojiInfo, 'name' | 'icon' | 'items'>[];\n map: WalineEmojiMaps;\n}\n\nexport interface WalineConfig\n extends Required<Omit<WalineProps, 'wordLimit' | 'reaction'>> {\n locale: WalineLocale;\n wordLimit: [number, number] | false;\n reaction: string[];\n}\n\nexport const getServerURL = (serverURL: string): string => {\n const result = removeEndingSplash(serverURL);\n\n return isLinkHttp(result) ? result : `https://${result}`;\n};\n\nconst getWordLimit = (\n wordLimit: WalineProps['wordLimit']\n): [number, number] | false =>\n Array.isArray(wordLimit) ? wordLimit : wordLimit ? [0, wordLimit] : false;\n\nconst fallback = <T = unknown>(\n value: T | false | undefined,\n fallback: T\n): T | false =>\n typeof value === 'function' ? value : value === false ? false : fallback;\n\nexport const getConfig = ({\n serverURL,\n\n path = location.pathname,\n lang = defaultLang,\n locale,\n emoji = ['//unpkg.com/@waline/emojis@1.1.0/weibo'],\n meta = ['nick', 'mail', 'link'],\n requiredMeta = [],\n dark = false,\n pageSize = 10,\n wordLimit,\n imageUploader,\n highlighter,\n texRenderer,\n copyright = true,\n login = 'enable',\n search,\n reaction,\n recaptchaV3Key = '',\n commentSorting = 'latest',\n ...more\n}: WalineProps): WalineConfig => ({\n serverURL: getServerURL(serverURL),\n path: decodePath(path),\n locale: {\n ...(defaultLocales[lang] || defaultLocales[defaultLang]),\n ...(typeof locale === 'object' ? locale : {}),\n } as WalineLocale,\n wordLimit: getWordLimit(wordLimit),\n meta: getMeta(meta),\n requiredMeta: getMeta(requiredMeta),\n imageUploader: fallback(imageUploader, defaultUploadImage),\n highlighter: fallback(highlighter, defaultHighlighter),\n texRenderer: fallback(texRenderer, defaultTexRenderer),\n lang,\n dark,\n emoji,\n pageSize,\n login,\n copyright,\n search: search || getDefaultSearchOptions(lang),\n recaptchaV3Key,\n reaction: Array.isArray(reaction)\n ? reaction\n : reaction === true\n ? defaultReaction\n : [],\n commentSorting,\n ...more,\n});\n","export const decodePath = (path: string): string => {\n try {\n path = decodeURI(path);\n } catch (err) {\n // ignore error\n }\n\n return path;\n};\n\nexport const removeEndingSplash = (content = ''): string =>\n content.replace(/\\/$/u, '');\n\nexport const isLinkHttp = (link: string): boolean =>\n /^(https?:)?\\/\\//.test(link);\n","export const errorHandler = (err: Error): void => {\n if (err.name !== 'AbortError') console.error(err.message);\n};\n","import { fetchCommentCount } from './api';\nimport { decodePath, errorHandler, getServerURL } from './utils';\nimport type { WalineAbort } from './typings';\n\nexport interface WalineCommentCountOptions {\n /**\n * Waline 服务端地址\n *\n * Waline server url\n */\n serverURL: string;\n\n /**\n * 评论数 CSS 选择器\n *\n * Comment count CSS selector\n *\n * @default '.waline-comment-count'\n */\n selector?: string;\n\n /**\n * 需要获取的默认路径\n *\n * Path to be fetched by default\n *\n * @default window.location.pathname\n */\n path?: string;\n\n /**\n * 错误提示消息所使用的语言\n *\n * Language of error message\n *\n * @default 'zh-CN'\n */\n lang?: string;\n}\n\nexport const commentCount = ({\n serverURL,\n path = window.location.pathname,\n selector = '.waline-comment-count',\n lang = 'zh-CN',\n}: // eslint-disable-next-line @typescript-eslint/no-explicit-any\nWalineCommentCountOptions): WalineAbort => {\n const controller = new AbortController();\n\n // comment count\n const elements = document.querySelectorAll<HTMLElement>(selector);\n\n if (elements.length)\n void fetchCommentCount({\n serverURL: getServerURL(serverURL),\n paths: Array.from(elements).map((element) =>\n decodePath(element.dataset.path || element.getAttribute('id') || path)\n ),\n lang,\n signal: controller.signal,\n })\n .then((counts) => {\n elements.forEach((element, index) => {\n element.innerText = counts[index].toString();\n });\n })\n .catch(errorHandler);\n\n return controller.abort.bind(controller);\n};\n","declare const VERSION: string;\n\nexport const version = VERSION;\n"],"names":["getServerURL","serverURL","result","content","replace","removeEndingSplash","test","errorHandler","err","name","console","error","message","commentCount","path","window","location","pathname","selector","lang","a","controller","AbortController","elements","document","querySelectorAll","length","paths","signal","fetch","encodeURIComponent","join","then","resp","json","counts","Array","isArray","from","map","element","decodeURI","decodePath","dataset","getAttribute","forEach","index","innerText","toString","catch","abort","bind","version"],"mappings":";;;;;;;;;;;;;;;;;;;EAkBO,MCcMA,CAAgBC,GAAAA,CAAAA,IAAAA;MAC3B,MAAMC,CAAAA,GCvB2BC;QAAAA,IAAAA,CAAAA,uEAAU,EAC3CA;QAAAA,OAAAA,CAAAA,CAAQC,OAAQ,CAAA,MAAA,EAAQ,EDsBTC,CAAAA;MAAAA,EAAmBJ;MAElC,OCrBA,iBAAA,CAAkBK,IDqBAJ,CAAAA,CAAAA,CAAAA,GAAUA,CAAS,GAAA,WAAWA,CAAQ,EAAA;IAAA,CAAA;IEnC7CK,IAAgBC,CACV,IAAA;MAAA,YAAA,KAAbA,CAAIC,CAAAA,IAAAA,IAAuBC,OAAQC,CAAAA,KAAAA,CAAMH,CAAII,CAAAA,OAAAA,CAAQ;IAAA;ICuC9CC,CAAe,GAAA,QAInB;MAAA,IAJmB;QAC1BZ,SACAa,EAAAA,CAAAA;QAAAA,IAAAA,EAAAA,CAAAA,GAAOC,MAAOC,CAAAA,QAAAA,CAASC,QACvBC;QAAAA,QAAAA,EAAAA,CAAAA,GAAW;QACXC,IAAO,EAAAC,CAAA,GAAA;MAAA,CAAA;MAGP,MAAMC,CAAAA,GAAa,IAAIC,eAAAA;QAGjBC,CAAWC,GAAAA,QAAAA,CAASC,iBAA8BP,CAkBxD,CAAA;MAAA,OAhBIK,CAASG,CAAAA,MAAAA,IJlCkB,CAC/BzB;QAAAA,IAAAA;UAAAA,SAAAA,EAAAA,CAAAA;UACAkB,IACAQ,EAAAA,CAAAA;UAAAA,KAAAA,EAAAA,CAAAA;UACAC;;eAEAC,KACE,CAAA,GAAG5B,CAAoC6B,2BAAAA,kBAAAA,CACrCH,CAAMI,CAAAA,IAAAA,CAAK,GACHZ,CAAAA,CAAAA,SAAAA,CAAAA,EAAAA,EACV;UAAES,MAEDI,EAAAA;QAAAA,CAAAA,CAAAA,CAAAA,IAAAA,CAAMC,CAAqCA,IAAAA,CAAAA,CAAKC,IAEhDF,EAAAA,CAAAA,CAAAA,IAAAA,CAAMG,CAAYC,IAAAA,KAAAA,CAAMC,QAAQF,CAAUA,CAAAA,GAAAA,CAAAA,GAAS,CAACA,CAAAA,CAAAA,CAAAA;MAAAA,GIqB9B;QACrBlC,SAAWD,EAAAA,CAAAA,CAAaC;QACxB0B,KAAOS,EAAAA,KAAAA,CAAME,IAAKf,CAAAA,CAAAA,CAAAA,CAAUgB,GAAKC,CAAAA,CAAAA,IFvDb,CAAC1B,CAAAA,IAAAA;UACzB;YACEA,CAAO2B,GAAAA,SAAAA,CAAU3B,CAGlB,CAAA;UAAA,CAFC,QAAON,CAAAA,EAAAA,CAER;UAED,OAAOM,CAAI;QAAA,CEiDL4B,EAAWF,CAAQG,CAAAA,OAAAA,CAAQ7B,IAAQ0B,IAAAA,CAAAA,CAAQI,YAAa,CAAA,IAAA,CAAA,IAAS9B;QAEnEK,IACAS,EAAAA,CAAAA;QAAAA,MAAAA,EAAQP,CAAWO,CAAAA;MAAAA,CAAAA,CAAAA,CAElBI,IAAMG,CAAAA,CAAAA,IAAAA;QACLZ,CAASsB,CAAAA,OAAAA,CAAQ,CAACL,CAASM,EAAAA,CAAAA,KAAAA;UACzBN,CAAQO,CAAAA,SAAAA,GAAYZ,CAAOW,CAAAA,CAAAA,CAAAA,CAAOE,QAAU,EAAA;QAAA,CAAA,CAC5C;MAAA,GAEHC,KAAM1C,CAAAA,CAAAA,CAAAA,EAEJc,CAAW6B,CAAAA,KAAAA,CAAMC,IAAK9B,CAAAA,CAAAA,CAAW;IAAA,CClE7B+B;IAAAA,CAAAA,GAAU;;;"}
package/dist/comment.mjs CHANGED
@@ -1,2 +1,2 @@
1
- const e=({serverURL:e,lang:t,paths:r,signal:n})=>fetch(`${e}/comment?type=count&url=${encodeURIComponent(r.join(","))}&lang=${t}`,{signal:n}).then((e=>e.json())).then((e=>((e,t="")=>{if("object"==typeof e&&e.errno)throw new TypeError(`Fetch ${t} failed with ${e.errno}: ${e.errmsg}`);return e})(e,"comment count"))).then((e=>Array.isArray(e)?e:[e])),t=e=>{const t=((e="")=>e.replace(/\/$/u,""))(e);return/^(https?:)?\/\//.test(t)?t:`https://${t}`},r=e=>{"AbortError"!==e.name&&console.error(e.message)},n=({serverURL:n,path:o=window.location.pathname,selector:a=".waline-comment-count",lang:c="zh-CN"})=>{const s=new AbortController,l=document.querySelectorAll(a);return l.length&&e({serverURL:t(n),paths:Array.from(l).map((e=>(e=>{try{e=decodeURI(e)}catch(e){}return e})(e.dataset.path||e.getAttribute("id")||o))),lang:c,signal:s.signal}).then((e=>{l.forEach(((t,r)=>{t.innerText=e[r].toString()}))})).catch(r),s.abort.bind(s)},o="2.13.1";export{n as commentCount,o as version};
1
+ const t=t=>{const e=((t="")=>t.replace(/\/$/u,""))(t);return/^(https?:)?\/\//.test(e)?e:`https://${e}`},e=t=>{"AbortError"!==t.name&&console.error(t.message)},r=({serverURL:r,path:n=window.location.pathname,selector:o=".waline-comment-count",lang:a="zh-CN"})=>{const s=new AbortController,c=document.querySelectorAll(o);return c.length&&(({serverURL:t,lang:e,paths:r,signal:n})=>fetch(`${t}/comment?type=count&url=${encodeURIComponent(r.join(","))}&lang=${e}`,{signal:n}).then((t=>t.json())).then((t=>Array.isArray(t)?t:[t])))({serverURL:t(r),paths:Array.from(c).map((t=>(t=>{try{t=decodeURI(t)}catch(t){}return t})(t.dataset.path||t.getAttribute("id")||n))),lang:a,signal:s.signal}).then((t=>{c.forEach(((e,r)=>{e.innerText=t[r].toString()}))})).catch(e),s.abort.bind(s)},n="2.14.0";export{r as commentCount,n as version};
2
2
  //# sourceMappingURL=comment.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"comment.mjs","sources":["../src/api/utils.ts","../src/api/commentCount.ts","../src/utils/config.ts","../src/utils/path.ts","../src/utils/error.ts","../src/comment.ts","../src/version.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 APIErrorResponse {\n errno: number;\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 = unknown>(\n data: T | APIErrorResponse,\n name = ''\n): T => {\n if (typeof data === 'object' && (data as APIErrorResponse).errno)\n throw new TypeError(\n `Fetch ${name} failed with ${(data as APIErrorResponse).errno}: ${\n (data as APIErrorResponse).errmsg\n }`\n );\n\n return data as T;\n};\n","import { errorCheck } from './utils';\nimport 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 .then((data) => errorCheck(data, 'comment count'))\n // TODO: Improve this API\n .then((counts) => (Array.isArray(counts) ? counts : [counts]));\n","import {\n defaultLang,\n defaultLocales,\n defaultReaction,\n defaultUploadImage,\n defaultHighlighter,\n defaultTexRenderer,\n getDefaultSearchOptions,\n getMeta,\n} from '../config';\n\nimport { decodePath, isLinkHttp, removeEndingSplash } from './path';\n\nimport type {\n WalineEmojiInfo,\n WalineEmojiMaps,\n WalineLocale,\n WalineProps,\n} from '../typings';\n\nexport interface WalineEmojiConfig {\n tabs: Pick<WalineEmojiInfo, 'name' | 'icon' | 'items'>[];\n map: WalineEmojiMaps;\n}\n\nexport interface WalineConfig\n extends Required<Omit<WalineProps, 'wordLimit' | 'reaction'>> {\n locale: WalineLocale;\n wordLimit: [number, number] | false;\n reaction: string[];\n}\n\nexport const getServerURL = (serverURL: string): string => {\n const result = removeEndingSplash(serverURL);\n\n return isLinkHttp(result) ? result : `https://${result}`;\n};\n\nconst getWordLimit = (\n wordLimit: WalineProps['wordLimit']\n): [number, number] | false =>\n Array.isArray(wordLimit) ? wordLimit : wordLimit ? [0, wordLimit] : false;\n\nconst fallback = <T = unknown>(\n value: T | false | undefined,\n fallback: T\n): T | false =>\n typeof value === 'function' ? value : value === false ? false : fallback;\n\nexport const getConfig = ({\n serverURL,\n\n path = location.pathname,\n lang = defaultLang,\n locale,\n emoji = ['//unpkg.com/@waline/emojis@1.1.0/weibo'],\n meta = ['nick', 'mail', 'link'],\n requiredMeta = [],\n dark = false,\n pageSize = 10,\n wordLimit,\n imageUploader,\n highlighter,\n texRenderer,\n copyright = true,\n login = 'enable',\n search,\n reaction,\n recaptchaV3Key = '',\n ...more\n}: WalineProps): WalineConfig => ({\n serverURL: getServerURL(serverURL),\n path: decodePath(path),\n locale: {\n ...(defaultLocales[lang] || defaultLocales[defaultLang]),\n ...(typeof locale === 'object' ? locale : {}),\n } as WalineLocale,\n wordLimit: getWordLimit(wordLimit),\n meta: getMeta(meta),\n requiredMeta: getMeta(requiredMeta),\n imageUploader: fallback(imageUploader, defaultUploadImage),\n highlighter: fallback(highlighter, defaultHighlighter),\n texRenderer: fallback(texRenderer, defaultTexRenderer),\n lang,\n dark,\n emoji,\n pageSize,\n login,\n copyright,\n search: search || getDefaultSearchOptions(lang),\n recaptchaV3Key,\n reaction: Array.isArray(reaction)\n ? reaction\n : reaction === true\n ? defaultReaction\n : [],\n ...more,\n});\n","export const decodePath = (path: string): string => {\n try {\n path = decodeURI(path);\n } catch (err) {\n // ignore error\n }\n\n return path;\n};\n\nexport const removeEndingSplash = (content = ''): string =>\n content.replace(/\\/$/u, '');\n\nexport const isLinkHttp = (link: string): boolean =>\n /^(https?:)?\\/\\//.test(link);\n","export const errorHandler = (err: Error): void => {\n if (err.name !== 'AbortError') console.error(err.message);\n};\n","import { fetchCommentCount } from './api';\nimport { decodePath, errorHandler, getServerURL } from './utils';\nimport type { WalineAbort } from './typings';\n\nexport interface WalineCommentCountOptions {\n /**\n * Waline 服务端地址\n *\n * Waline server url\n */\n serverURL: string;\n\n /**\n * 评论数 CSS 选择器\n *\n * Commment count CSS selector\n *\n * @default '.waline-comment-count'\n */\n selector?: string;\n\n /**\n * 需要获取的默认路径\n *\n * Path to be fetched by default\n *\n * @default window.location.pathname\n */\n path?: string;\n\n /**\n * 错误提示消息所使用的语言\n *\n * Language of error message\n *\n * @default 'zh-CN'\n */\n lang?: string;\n}\n\nexport const commentCount = ({\n serverURL,\n path = window.location.pathname,\n selector = '.waline-comment-count',\n lang = 'zh-CN',\n}: // eslint-disable-next-line @typescript-eslint/no-explicit-any\nWalineCommentCountOptions): WalineAbort => {\n const controller = new AbortController();\n\n // comment count\n const elements = document.querySelectorAll<HTMLElement>(selector);\n\n if (elements.length)\n void fetchCommentCount({\n serverURL: getServerURL(serverURL),\n paths: Array.from(elements).map((element) =>\n decodePath(element.dataset.path || element.getAttribute('id') || path)\n ),\n lang,\n signal: controller.signal,\n })\n .then((counts) => {\n elements.forEach((element, index) => {\n element.innerText = counts[index].toString();\n });\n })\n .catch(errorHandler);\n\n return controller.abort.bind(controller);\n};\n","declare const VERSION: string;\n\nexport const version = VERSION;\n"],"names":["fetchCommentCount","serverURL","lang","paths","signal","fetch","encodeURIComponent","join","then","resp","json","data","name","errno","TypeError","errmsg","errorCheck","counts","Array","isArray","getServerURL","result","content","replace","removeEndingSplash","test","errorHandler","err","console","error","message","commentCount","path","window","location","pathname","selector","controller","AbortController","elements","document","querySelectorAll","length","from","map","element","decodeURI","decodePath","dataset","getAttribute","forEach","index","innerText","toString","catch","abort","bind","version"],"mappings":"AA0BO,MCPMA,EAAoB,EAC/BC,YACAC,OACAC,QACAC,YAEAC,MACE,GAAGJ,4BAAoCK,mBACrCH,EAAMI,KAAK,cACHL,IACV,CAAEE,WAEDI,MAAMC,GAAqCA,EAAKC,SAChDF,MAAMG,GDNe,EACxBA,EACAC,EAAO,MAEP,GAAoB,iBAATD,GAAsBA,EAA0BE,MACzD,MAAM,IAAIC,UACR,SAASF,iBAAqBD,EAA0BE,UACrDF,EAA0BI,UAIjC,OAAOJ,CAAS,ECLEK,CAAWL,EAAM,mBAEhCH,MAAMS,GAAYC,MAAMC,QAAQF,GAAUA,EAAS,CAACA,KCF5CG,EAAgBnB,IAC3B,MAAMoB,ECvB0B,EAACC,EAAU,KAC3CA,EAAQC,QAAQ,OAAQ,IDsBTC,CAAmBvB,GAElC,MCrBA,kBAAkBwB,KDqBAJ,GAAUA,EAAS,WAAWA,GAAQ,EEnC7CK,EAAgBC,IACV,eAAbA,EAAIf,MAAuBgB,QAAQC,MAAMF,EAAIG,QAAQ,ECuC9CC,EAAe,EAC1B9B,YACA+B,OAAOC,OAAOC,SAASC,SACvBC,WAAW,wBACXlC,OAAO,YAGP,MAAMmC,EAAa,IAAIC,gBAGjBC,EAAWC,SAASC,iBAA8BL,GAkBxD,OAhBIG,EAASG,QACN1C,EAAkB,CACrBC,UAAWmB,EAAanB,GACxBE,MAAOe,MAAMyB,KAAKJ,GAAUK,KAAKC,GFvDb,CAACb,IACzB,IACEA,EAAOc,UAAUd,EAGlB,CAFC,MAAOL,GAER,CAED,OAAOK,CAAI,EEiDLe,CAAWF,EAAQG,QAAQhB,MAAQa,EAAQI,aAAa,OAASjB,KAEnE9B,OACAE,OAAQiC,EAAWjC,SAElBI,MAAMS,IACLsB,EAASW,SAAQ,CAACL,EAASM,KACzBN,EAAQO,UAAYnC,EAAOkC,GAAOE,UAAU,GAC5C,IAEHC,MAAM5B,GAEJW,EAAWkB,MAAMC,KAAKnB,EAAW,EClE7BoB,EAAU"}
1
+ {"version":3,"file":"comment.mjs","sources":["../src/api/commentCount.ts","../src/utils/config.ts","../src/utils/path.ts","../src/utils/error.ts","../src/comment.ts","../src/version.ts"],"sourcesContent":["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 {\n defaultLang,\n defaultLocales,\n defaultReaction,\n defaultUploadImage,\n defaultHighlighter,\n defaultTexRenderer,\n getDefaultSearchOptions,\n getMeta,\n} from '../config';\n\nimport { decodePath, isLinkHttp, removeEndingSplash } from './path';\n\nimport type {\n WalineEmojiInfo,\n WalineEmojiMaps,\n WalineLocale,\n WalineProps,\n} from '../typings';\n\nexport interface WalineEmojiConfig {\n tabs: Pick<WalineEmojiInfo, 'name' | 'icon' | 'items'>[];\n map: WalineEmojiMaps;\n}\n\nexport interface WalineConfig\n extends Required<Omit<WalineProps, 'wordLimit' | 'reaction'>> {\n locale: WalineLocale;\n wordLimit: [number, number] | false;\n reaction: string[];\n}\n\nexport const getServerURL = (serverURL: string): string => {\n const result = removeEndingSplash(serverURL);\n\n return isLinkHttp(result) ? result : `https://${result}`;\n};\n\nconst getWordLimit = (\n wordLimit: WalineProps['wordLimit']\n): [number, number] | false =>\n Array.isArray(wordLimit) ? wordLimit : wordLimit ? [0, wordLimit] : false;\n\nconst fallback = <T = unknown>(\n value: T | false | undefined,\n fallback: T\n): T | false =>\n typeof value === 'function' ? value : value === false ? false : fallback;\n\nexport const getConfig = ({\n serverURL,\n\n path = location.pathname,\n lang = defaultLang,\n locale,\n emoji = ['//unpkg.com/@waline/emojis@1.1.0/weibo'],\n meta = ['nick', 'mail', 'link'],\n requiredMeta = [],\n dark = false,\n pageSize = 10,\n wordLimit,\n imageUploader,\n highlighter,\n texRenderer,\n copyright = true,\n login = 'enable',\n search,\n reaction,\n recaptchaV3Key = '',\n commentSorting = 'latest',\n ...more\n}: WalineProps): WalineConfig => ({\n serverURL: getServerURL(serverURL),\n path: decodePath(path),\n locale: {\n ...(defaultLocales[lang] || defaultLocales[defaultLang]),\n ...(typeof locale === 'object' ? locale : {}),\n } as WalineLocale,\n wordLimit: getWordLimit(wordLimit),\n meta: getMeta(meta),\n requiredMeta: getMeta(requiredMeta),\n imageUploader: fallback(imageUploader, defaultUploadImage),\n highlighter: fallback(highlighter, defaultHighlighter),\n texRenderer: fallback(texRenderer, defaultTexRenderer),\n lang,\n dark,\n emoji,\n pageSize,\n login,\n copyright,\n search: search || getDefaultSearchOptions(lang),\n recaptchaV3Key,\n reaction: Array.isArray(reaction)\n ? reaction\n : reaction === true\n ? defaultReaction\n : [],\n commentSorting,\n ...more,\n});\n","export const decodePath = (path: string): string => {\n try {\n path = decodeURI(path);\n } catch (err) {\n // ignore error\n }\n\n return path;\n};\n\nexport const removeEndingSplash = (content = ''): string =>\n content.replace(/\\/$/u, '');\n\nexport const isLinkHttp = (link: string): boolean =>\n /^(https?:)?\\/\\//.test(link);\n","export const errorHandler = (err: Error): void => {\n if (err.name !== 'AbortError') console.error(err.message);\n};\n","import { fetchCommentCount } from './api';\nimport { decodePath, errorHandler, getServerURL } from './utils';\nimport type { WalineAbort } from './typings';\n\nexport interface WalineCommentCountOptions {\n /**\n * Waline 服务端地址\n *\n * Waline server url\n */\n serverURL: string;\n\n /**\n * 评论数 CSS 选择器\n *\n * Comment count CSS selector\n *\n * @default '.waline-comment-count'\n */\n selector?: string;\n\n /**\n * 需要获取的默认路径\n *\n * Path to be fetched by default\n *\n * @default window.location.pathname\n */\n path?: string;\n\n /**\n * 错误提示消息所使用的语言\n *\n * Language of error message\n *\n * @default 'zh-CN'\n */\n lang?: string;\n}\n\nexport const commentCount = ({\n serverURL,\n path = window.location.pathname,\n selector = '.waline-comment-count',\n lang = 'zh-CN',\n}: // eslint-disable-next-line @typescript-eslint/no-explicit-any\nWalineCommentCountOptions): WalineAbort => {\n const controller = new AbortController();\n\n // comment count\n const elements = document.querySelectorAll<HTMLElement>(selector);\n\n if (elements.length)\n void fetchCommentCount({\n serverURL: getServerURL(serverURL),\n paths: Array.from(elements).map((element) =>\n decodePath(element.dataset.path || element.getAttribute('id') || path)\n ),\n lang,\n signal: controller.signal,\n })\n .then((counts) => {\n elements.forEach((element, index) => {\n element.innerText = counts[index].toString();\n });\n })\n .catch(errorHandler);\n\n return controller.abort.bind(controller);\n};\n","declare const VERSION: string;\n\nexport const version = VERSION;\n"],"names":["getServerURL","serverURL","result","content","replace","removeEndingSplash","test","errorHandler","err","name","console","error","message","commentCount","path","window","location","pathname","selector","lang","controller","AbortController","elements","document","querySelectorAll","length","paths","signal","fetch","encodeURIComponent","join","then","resp","json","counts","Array","isArray","fetchCommentCount","from","map","element","decodeURI","decodePath","dataset","getAttribute","forEach","index","innerText","toString","catch","abort","bind","version"],"mappings":"AAkBO,MCcMA,EAAgBC,IAC3B,MAAMC,ECvB0B,EAACC,EAAU,KAC3CA,EAAQC,QAAQ,OAAQ,IDsBTC,CAAmBJ,GAElC,MCrBA,kBAAkBK,KDqBAJ,GAAUA,EAAS,WAAWA,GAAQ,EEnC7CK,EAAgBC,IACV,eAAbA,EAAIC,MAAuBC,QAAQC,MAAMH,EAAII,QAAQ,ECuC9CC,EAAe,EAC1BZ,YACAa,OAAOC,OAAOC,SAASC,SACvBC,WAAW,wBACXC,OAAO,YAGP,MAAMC,EAAa,IAAIC,gBAGjBC,EAAWC,SAASC,iBAA8BN,GAkBxD,OAhBII,EAASG,QJlCkB,GAC/BxB,YACAkB,OACAO,QACAC,YAEAC,MACE,GAAG3B,4BAAoC4B,mBACrCH,EAAMI,KAAK,cACHX,IACV,CAAEQ,WAEDI,MAAMC,GAAqCA,EAAKC,SAEhDF,MAAMG,GAAYC,MAAMC,QAAQF,GAAUA,EAAS,CAACA,KIqBhDG,CAAkB,CACrBpC,UAAWD,EAAaC,GACxByB,MAAOS,MAAMG,KAAKhB,GAAUiB,KAAKC,GFvDb,CAAC1B,IACzB,IACEA,EAAO2B,UAAU3B,EAGlB,CAFC,MAAON,GAER,CAED,OAAOM,CAAI,EEiDL4B,CAAWF,EAAQG,QAAQ7B,MAAQ0B,EAAQI,aAAa,OAAS9B,KAEnEK,OACAQ,OAAQP,EAAWO,SAElBI,MAAMG,IACLZ,EAASuB,SAAQ,CAACL,EAASM,KACzBN,EAAQO,UAAYb,EAAOY,GAAOE,UAAU,GAC5C,IAEHC,MAAM1C,GAEJa,EAAW8B,MAAMC,KAAK/B,EAAW,EClE7BgC,EAAU"}