@waline/client 2.13.0 → 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 (78) hide show
  1. package/LICENSE +339 -0
  2. package/dist/api.cjs +1 -1
  3. package/dist/api.cjs.map +1 -1
  4. package/dist/api.d.cts +302 -69
  5. package/dist/api.d.mts +302 -69
  6. package/dist/api.d.ts +302 -69
  7. package/dist/api.mjs +1 -1
  8. package/dist/api.mjs.map +1 -1
  9. package/dist/comment.cjs +1 -1
  10. package/dist/comment.cjs.map +1 -1
  11. package/dist/comment.d.cts +2 -2
  12. package/dist/comment.d.mts +2 -2
  13. package/dist/comment.d.ts +2 -2
  14. package/dist/comment.js +68 -1
  15. package/dist/comment.js.map +1 -1
  16. package/dist/comment.mjs +1 -1
  17. package/dist/comment.mjs.map +1 -1
  18. package/dist/component.mjs +1 -1
  19. package/dist/component.mjs.map +1 -1
  20. package/dist/legacy.umd.d.ts +21 -11
  21. package/dist/legacy.umd.js +1 -1
  22. package/dist/legacy.umd.js.map +1 -1
  23. package/dist/pageview.cjs +1 -1
  24. package/dist/pageview.cjs.map +1 -1
  25. package/dist/pageview.d.cts +1 -1
  26. package/dist/pageview.d.mts +1 -1
  27. package/dist/pageview.d.ts +1 -1
  28. package/dist/pageview.js +121 -1
  29. package/dist/pageview.js.map +1 -1
  30. package/dist/pageview.mjs +1 -1
  31. package/dist/pageview.mjs.map +1 -1
  32. package/dist/shim.cjs +1 -1
  33. package/dist/shim.cjs.map +1 -1
  34. package/dist/shim.d.cts +25 -19
  35. package/dist/shim.d.mts +25 -19
  36. package/dist/shim.mjs +1 -1
  37. package/dist/shim.mjs.map +1 -1
  38. package/dist/waline.cjs +1 -1
  39. package/dist/waline.cjs.map +1 -1
  40. package/dist/waline.css +1 -1
  41. package/dist/waline.css.map +1 -1
  42. package/dist/waline.d.cts +25 -19
  43. package/dist/waline.d.mts +25 -19
  44. package/dist/waline.d.ts +25 -19
  45. package/dist/waline.js +6787 -1
  46. package/dist/waline.js.map +1 -1
  47. package/dist/waline.mjs +1 -1
  48. package/dist/waline.mjs.map +1 -1
  49. package/package.json +28 -29
  50. package/src/api/articleCounter.ts +52 -22
  51. package/src/api/comment.ts +158 -55
  52. package/src/api/commentCount.ts +24 -21
  53. package/src/api/login.ts +49 -6
  54. package/src/api/pageview.ts +26 -13
  55. package/src/api/recentComment.ts +23 -10
  56. package/src/api/user.ts +24 -18
  57. package/src/api/utils.ts +33 -10
  58. package/src/comment.ts +1 -1
  59. package/src/compact/convert.ts +1 -1
  60. package/src/components/ArticleReaction.vue +12 -3
  61. package/src/components/CommentBox.vue +37 -29
  62. package/src/components/ImageWall.vue +14 -14
  63. package/src/components/Waline.vue +59 -49
  64. package/src/config/default.ts +23 -24
  65. package/src/pageview.ts +3 -3
  66. package/src/styles/index.scss +3 -3
  67. package/src/styles/{nomalize.scss → normalize.scss} +0 -0
  68. package/src/styles/panel.scss +1 -1
  69. package/src/styles/user-list.scss +158 -0
  70. package/src/typings/base.ts +5 -1
  71. package/src/typings/comment.ts +1 -5
  72. package/src/typings/waline.ts +13 -2
  73. package/src/utils/config.ts +2 -0
  74. package/src/utils/date.ts +3 -3
  75. package/src/utils/emoji.ts +1 -1
  76. package/src/widgets/recentComments.ts +2 -2
  77. package/src/widgets/userList.ts +8 -10
  78. package/src/styles/userlist.scss +0 -116
package/dist/api.d.ts CHANGED
@@ -1,16 +1,74 @@
1
- interface FetchArticleCounterOptions {
1
+ interface BaseAPIOptions {
2
+ /**
3
+ * Waline 服务端地址
4
+ *
5
+ * Waline serverURL
6
+ */
2
7
  serverURL: string;
8
+ /**
9
+ * 错误信息所使用的语言
10
+ *
11
+ * Language used in error text
12
+ */
3
13
  lang: string;
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
+ }
29
+
30
+ interface GetArticleCounterOptions extends BaseAPIOptions {
31
+ /**
32
+ * 待获取计数器的 path
33
+ *
34
+ * Path of counters
35
+ */
4
36
  paths: string[];
5
- signal: AbortSignal;
37
+ /**
38
+ * 待获取计数器的类型
39
+ *
40
+ * Counter type to be fetched
41
+ */
6
42
  type: string[];
43
+ /**
44
+ * 取消请求的信号
45
+ *
46
+ * AbortSignal to cancel request
47
+ */
48
+ signal?: AbortSignal;
7
49
  }
8
- declare const fetchArticleCounter: ({ serverURL, lang, paths, type, signal, }: FetchArticleCounterOptions) => Promise<Record<string, number>[] | Record<string, number> | number[] | number>;
9
- interface UpdateArticleCounterOptions {
10
- serverURL: string;
11
- lang: string;
50
+ type GetArticleCounterResponse = Record<string, number>[] | Record<string, number> | number[] | number;
51
+ declare const getArticleCounter: ({ serverURL, lang, paths, type, signal, }: GetArticleCounterOptions) => Promise<GetArticleCounterResponse>;
52
+ interface UpdateArticleCounterOptions extends BaseAPIOptions {
53
+ /**
54
+ * 待更新计数器的 path
55
+ *
56
+ * Path of counter to be updated
57
+ */
12
58
  path: string;
59
+ /**
60
+ * 待更新计数器的类型
61
+ *
62
+ * Counter type to be updated
63
+ */
13
64
  type: string;
65
+ /**
66
+ * 更新操作
67
+ *
68
+ * Update operation
69
+ *
70
+ * @default 'inc'
71
+ */
14
72
  action?: 'inc' | 'desc';
15
73
  }
16
74
  declare const updateArticleCounter: ({ serverURL, lang, path, type, action, }: UpdateArticleCounterOptions) => Promise<number>;
@@ -48,10 +106,6 @@ interface WalineCommentData {
48
106
  * User id being at
49
107
  */
50
108
  at?: string;
51
- /**
52
- * edit comment id
53
- */
54
- eid?: string;
55
109
  /**
56
110
  * Comment link
57
111
  */
@@ -61,7 +115,7 @@ interface WalineCommentData {
61
115
  */
62
116
  recaptchaV3?: string;
63
117
  }
64
- declare type WalineCommentStatus = 'approved' | 'waiting' | 'spam';
118
+ type WalineCommentStatus = 'approved' | 'waiting' | 'spam';
65
119
  interface WalineComment extends Exclude<WalineCommentData, 'ua'> {
66
120
  /**
67
121
  * User avatar
@@ -91,116 +145,295 @@ interface WalineComment extends Exclude<WalineCommentData, 'ua'> {
91
145
  orig?: string;
92
146
  }
93
147
 
94
- interface FetchCommentOptions {
95
- serverURL: string;
148
+ interface GetCommentOptions extends BaseAPIOptions {
149
+ /**
150
+ * 待获取评论列表的 path
151
+ *
152
+ * Path of comment list
153
+ */
96
154
  path: string;
155
+ /**
156
+ * 评论分页数
157
+ *
158
+ * Comment pagination number
159
+ */
97
160
  page: number;
161
+ /**
162
+ * 每页评论个数
163
+ *
164
+ * Comment number per page
165
+ */
98
166
  pageSize: number;
167
+ /**
168
+ * 排序方式
169
+ *
170
+ * Sort method
171
+ */
99
172
  sortBy: string;
100
- signal: AbortSignal;
173
+ /**
174
+ * 用户令牌
175
+ *
176
+ * User token
177
+ */
101
178
  token?: string;
102
- lang: string;
179
+ /**
180
+ * 取消请求的信号
181
+ *
182
+ * AbortSignal to cancel request
183
+ */
184
+ signal?: AbortSignal;
103
185
  }
104
- interface CommentData {
186
+ interface GetCommentResponse extends ErrorStatusResponse {
187
+ /**
188
+ * 评论数量
189
+ *
190
+ * Comment number
191
+ */
105
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;
205
+ /**
206
+ * 评论数据
207
+ *
208
+ * Comment Data
209
+ */
106
210
  data: WalineComment[];
211
+ /**
212
+ * 页面总数
213
+ *
214
+ * Page number
215
+ */
107
216
  totalPages: number;
108
217
  }
109
- declare const fetchComment: ({ serverURL, lang, path, page, pageSize, sortBy, signal, token, }: FetchCommentOptions) => Promise<CommentData>;
110
- interface PostCommentOptions {
111
- serverURL: string;
112
- lang: string;
218
+ declare const getComment: ({ serverURL, lang, path, page, pageSize, sortBy, signal, token, }: GetCommentOptions) => Promise<GetCommentResponse>;
219
+ interface AddCommentOptions extends BaseAPIOptions {
220
+ /**
221
+ * 用户令牌
222
+ *
223
+ * User token
224
+ */
113
225
  token?: string;
226
+ /**
227
+ * 用户待提交的评论数据
228
+ *
229
+ * Comment data being submitted by user
230
+ */
114
231
  comment: WalineCommentData;
115
232
  }
116
- interface PostCommentResponse {
233
+ interface AddCommentResponse extends ErrorStatusResponse {
234
+ /**
235
+ * 渲染好的评论数据
236
+ *
237
+ * Comment data rendered
238
+ */
117
239
  data?: WalineComment;
118
- errmsg?: string;
119
240
  }
120
- declare const postComment: ({ serverURL, lang, token, comment, }: PostCommentOptions) => Promise<PostCommentResponse>;
121
- interface DeleteCommentOptions {
122
- serverURL: string;
123
- lang: string;
241
+ declare const addComment: ({ serverURL, lang, token, comment, }: AddCommentOptions) => Promise<AddCommentResponse>;
242
+ interface DeleteCommentOptions extends BaseAPIOptions {
124
243
  token: string;
125
244
  objectId: string | number;
126
245
  }
127
- declare const deleteComment: ({ serverURL, lang, token, objectId, }: DeleteCommentOptions) => Promise<void>;
128
- interface LikeCommentOptions {
129
- serverURL: string;
130
- lang: string;
131
- objectId: number | string;
132
- like: boolean;
246
+ interface DeleteCommentResponse extends ErrorStatusResponse {
247
+ data: '';
133
248
  }
134
- declare const likeComment: ({ serverURL, lang, objectId, like, }: LikeCommentOptions) => Promise<void>;
135
- interface UpdateCommentOptions {
136
- serverURL: string;
137
- lang: string;
249
+ declare const deleteComment: ({ serverURL, lang, token, objectId, }: DeleteCommentOptions) => Promise<DeleteCommentResponse>;
250
+ interface UpdateCommentOptions extends BaseAPIOptions {
251
+ /**
252
+ * 用户令牌
253
+ *
254
+ * User token
255
+ */
138
256
  token: string;
257
+ /**
258
+ * 评论的 ID
259
+ *
260
+ * Comment ID
261
+ */
139
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;
275
+ /**
276
+ * 评论的状态
277
+ *
278
+ * Comment status
279
+ */
140
280
  status?: 'approved' | 'waiting' | 'spam';
141
- sticky?: number;
281
+ /**
282
+ * 评论指定状态
283
+ *
284
+ * Comment sticky status
285
+ *
286
+ * @description 0 means not sticky and 1 means sticky
287
+ */
288
+ sticky?: 0 | 1;
289
+ }
290
+ interface UpdateCommentResponse extends ErrorStatusResponse {
291
+ /**
292
+ * 更新后的评论数据
293
+ *
294
+ * Comment data rendered
295
+ */
296
+ data: WalineComment;
142
297
  }
143
- declare const updateComment: ({ serverURL, lang, token, objectId, ...data }: UpdateCommentOptions) => Promise<void>;
298
+ declare const updateComment: ({ serverURL, lang, token, objectId, ...data }: UpdateCommentOptions) => Promise<UpdateCommentResponse>;
144
299
 
145
- interface FetchCommentCountOptions {
146
- serverURL: string;
147
- lang: string;
300
+ interface GetCommentCountOptions extends BaseAPIOptions {
301
+ /**
302
+ * 待获取评论数的 path
303
+ *
304
+ * Path of pages to be fetched
305
+ */
148
306
  paths: string[];
149
- signal: AbortSignal;
307
+ /**
308
+ * 取消请求的信号
309
+ *
310
+ * AbortSignal to cancel request
311
+ */
312
+ signal?: AbortSignal;
150
313
  }
151
- declare const fetchCommentCount: ({ serverURL, lang, paths, signal, }: FetchCommentCountOptions) => Promise<number[]>;
314
+ declare const fetchCommentCount: ({ serverURL, lang, paths, signal, }: GetCommentCountOptions) => Promise<number[]>;
152
315
 
153
- interface LoginOptions {
154
- lang: string;
155
- serverURL: string;
156
- }
157
316
  interface UserInfo {
317
+ /**
318
+ * 显示姓名
319
+ *
320
+ * User name displayed
321
+ */
158
322
  display_name: string;
323
+ /**
324
+ * 用户电子邮件地址
325
+ *
326
+ * User email
327
+ */
159
328
  email: string;
329
+ /**
330
+ * 用户网站地址
331
+ *
332
+ * User website
333
+ */
160
334
  url: string;
335
+ /**
336
+ * 用户令牌
337
+ *
338
+ * User token
339
+ */
161
340
  token: string;
341
+ /**
342
+ * 用户头像
343
+ *
344
+ * User avatar
345
+ */
162
346
  avatar: string;
347
+ /**
348
+ * 用户邮箱 MD5
349
+ *
350
+ * MD5 of User email
351
+ */
163
352
  mailMd5: string;
353
+ /**
354
+ * 用户对象 ID
355
+ *
356
+ * User object ID
357
+ */
164
358
  objectId: string | number;
359
+ /**
360
+ * 用户身份
361
+ *
362
+ * User role
363
+ */
165
364
  type: 'administrator' | 'guest';
166
365
  }
167
- declare const login: ({ lang, serverURL, }: LoginOptions) => Promise<UserInfo & {
366
+ declare const login: ({ lang, serverURL, }: BaseAPIOptions) => Promise<UserInfo & {
168
367
  remember: boolean;
169
368
  }>;
170
369
 
171
- interface FetchPageviewOptions {
172
- serverURL: string;
173
- lang: string;
370
+ interface GetPageviewOptions extends BaseAPIOptions {
371
+ /**
372
+ * 待获取页面的 path
373
+ *
374
+ * Path of pages
375
+ */
174
376
  paths: string[];
175
- signal: AbortSignal;
377
+ /**
378
+ * 取消请求的信号
379
+ *
380
+ * AbortSignal to cancel request
381
+ */
382
+ signal?: AbortSignal;
176
383
  }
177
- declare const fetchPageviews: ({ serverURL, lang, paths, signal, }: FetchPageviewOptions) => Promise<number[]>;
178
- interface UpdatePageviewOptions {
179
- serverURL: string;
180
- lang: string;
384
+ declare const getPageview: ({ serverURL, lang, paths, signal, }: GetPageviewOptions) => Promise<number[]>;
385
+ interface UpdatePageviewOptions extends BaseAPIOptions {
386
+ /**
387
+ * 待更新页面的 path
388
+ *
389
+ * Path of pages
390
+ */
181
391
  path: string;
182
- action?: 'inc' | 'desc';
183
392
  }
184
- declare const updatePageviews: (options: UpdatePageviewOptions) => Promise<number>;
393
+ declare const updatePageview: (options: UpdatePageviewOptions) => Promise<number>;
185
394
 
186
- interface FetchRecentCommentOptions {
187
- serverURL: string;
188
- lang: string;
395
+ interface GetRecentCommentOptions extends BaseAPIOptions {
396
+ /**
397
+ * 获取评论的数量
398
+ *
399
+ * Comment number to be fetched
400
+ */
189
401
  count: number;
190
- signal: AbortSignal;
402
+ /**
403
+ * 取消请求的信号
404
+ *
405
+ * AbortSignal to cancel request
406
+ */
407
+ signal?: AbortSignal;
408
+ /**
409
+ * 用户令牌
410
+ *
411
+ * User token
412
+ */
191
413
  token?: string;
192
414
  }
193
- declare const fetchRecentComment: ({ serverURL, lang, count, signal, token, }: FetchRecentCommentOptions) => Promise<WalineComment[]>;
415
+ declare const getRecentComment: ({ serverURL, lang, count, signal, token, }: GetRecentCommentOptions) => Promise<WalineComment[]>;
194
416
 
195
- interface FetchUserListOptions {
196
- serverURL: string;
417
+ interface GetUserListOptions extends BaseAPIOptions {
418
+ /**
419
+ * 每页个数
420
+ *
421
+ * Number per page
422
+ */
197
423
  pageSize: number;
198
- signal: AbortSignal;
199
- lang: string;
424
+ /**
425
+ * 取消请求的信号
426
+ *
427
+ * AbortSignal to cancel request
428
+ */
429
+ signal?: AbortSignal;
200
430
  }
201
431
  interface WalineUser extends Pick<WalineComment, 'nick' | 'link' | 'avatar' | 'label' | 'level'> {
202
432
  count: number;
203
433
  }
204
- declare const fetchUserList: ({ serverURL, signal, pageSize, lang, }: FetchUserListOptions) => Promise<WalineUser[]>;
434
+ interface GetUserListResponse extends ErrorStatusResponse {
435
+ data: WalineUser[];
436
+ }
437
+ declare const getUserList: ({ serverURL, signal, pageSize, lang, }: GetUserListOptions) => Promise<WalineUser[]>;
205
438
 
206
- export { CommentData, DeleteCommentOptions, FetchArticleCounterOptions, FetchCommentCountOptions, FetchCommentOptions, FetchRecentCommentOptions, FetchUserListOptions, LikeCommentOptions, LoginOptions, PostCommentOptions, PostCommentResponse, UpdateArticleCounterOptions, UpdateCommentOptions, UpdatePageviewOptions, UserInfo, WalineUser, deleteComment, fetchArticleCounter, fetchComment, fetchCommentCount, fetchPageviews, fetchRecentComment, fetchUserList, likeComment, login, postComment, 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}`),o.eid?fetch(`${e}/comment/${o.eid}?lang=${n}`,{method:"PUT",headers:a,body:JSON.stringify(o)}).then((e=>e.json())):fetch(`${e}/comment?lang=${n}`,{method:"POST",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,headers:{}}).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"}),d=({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")))},m=({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{s as deleteComment,t as fetchArticleCounter,a as fetchComment,c as fetchCommentCount,g as fetchPageviews,d as fetchRecentComment,m as fetchUserList,i as likeComment,l as login,r as postComment,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 FetchErrorData {\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 | FetchErrorData,\n name = ''\n): T => {\n if (typeof data === 'object' && (data as FetchErrorData).errno)\n throw new TypeError(\n `Fetch ${name} failed with ${(data as FetchErrorData).errno}: ${\n (data as FetchErrorData).errmsg\n }`\n );\n\n return data as T;\n};\n","import { JSON_HEADERS, errorCheck } from './utils';\n\nexport interface FetchArticleCounterOptions {\n serverURL: string;\n lang: string;\n paths: string[];\n signal: AbortSignal;\n type: string[];\n}\n\nexport const fetchArticleCounter = ({\n serverURL,\n lang,\n paths,\n type,\n signal,\n}: FetchArticleCounterOptions): Promise<\n Record<string, number>[] | Record<string, number> | number[] | number\n> =>\n fetch(\n `${serverURL}/article?path=${encodeURIComponent(\n paths.join(',')\n )}&type=${encodeURIComponent(type.join(','))}&lang=${lang}`,\n { signal }\n )\n .then(\n (resp) =>\n resp.json() as Promise<Record<string, number>[] | number[] | number>\n )\n .then((data) => errorCheck(data, 'article count'));\n\nexport interface UpdateArticleCounterOptions {\n serverURL: string;\n lang: string;\n path: string;\n type: string;\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) => resp.json() as Promise<number>)\n .then((data) => errorCheck(data, 'article count'));\n","import { JSON_HEADERS, errorCheck } from './utils';\nimport type { WalineComment, WalineCommentData } from '../typings';\n\nexport interface FetchCommentOptions {\n serverURL: string;\n path: string;\n page: number;\n pageSize: number;\n sortBy: string;\n signal: AbortSignal;\n token?: string;\n lang: string;\n}\n\nexport interface CommentData {\n count: number;\n data: WalineComment[];\n totalPages: number;\n}\n\nexport const fetchComment = ({\n serverURL,\n lang,\n path,\n page,\n pageSize,\n sortBy,\n signal,\n token,\n}: FetchCommentOptions): Promise<CommentData> => {\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) => resp.json() as Promise<CommentData>)\n .then((data) => errorCheck(data, 'comment data'));\n};\n\nexport interface PostCommentOptions {\n serverURL: string;\n lang: string;\n token?: string;\n comment: WalineCommentData;\n}\n\nexport interface PostCommentResponse {\n data?: WalineComment;\n errmsg?: string;\n}\n\nexport const postComment = ({\n serverURL,\n lang,\n token,\n comment,\n}: PostCommentOptions): Promise<PostCommentResponse> => {\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 if (comment.eid) {\n return fetch(`${serverURL}/comment/${comment.eid}?lang=${lang}`, {\n method: 'PUT',\n headers,\n body: JSON.stringify(comment),\n }).then((resp) => resp.json() as Promise<PostCommentResponse>);\n }\n\n return fetch(`${serverURL}/comment?lang=${lang}`, {\n method: 'POST',\n headers,\n body: JSON.stringify(comment),\n }).then((resp) => resp.json() as Promise<PostCommentResponse>);\n};\n\nexport interface DeleteCommentOptions {\n serverURL: string;\n lang: string;\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) => resp.json() as Promise<void>);\n\nexport interface LikeCommentOptions {\n serverURL: string;\n lang: string;\n objectId: number | string;\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) => resp.json() as Promise<void>);\n\nexport interface UpdateCommentOptions {\n serverURL: string;\n lang: string;\n token: string;\n objectId: number | string;\n status?: 'approved' | 'waiting' | 'spam';\n sticky?: number;\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) => resp.json() as Promise<void>);\n","import { errorCheck } from './utils';\n\nexport interface FetchCommentCountOptions {\n serverURL: string;\n lang: string;\n paths: string[];\n signal: AbortSignal;\n}\n\nexport const fetchCommentCount = ({\n serverURL,\n lang,\n paths,\n signal,\n}: FetchCommentCountOptions): Promise<number[]> => {\n const headers: Record<string, string> = {};\n\n return (\n fetch(\n `${serverURL}/comment?type=count&url=${encodeURIComponent(\n paths.join(',')\n )}&lang=${lang}`,\n { signal, headers }\n )\n .then((resp) => resp.json() as Promise<number | number[]>)\n .then((data) => errorCheck(data, 'comment count'))\n // TODO: Improve this API\n .then((counts) => (Array.isArray(counts) ? counts : [counts]))\n );\n};\n","/* eslint-disable @typescript-eslint/no-unsafe-member-access */\n\nexport interface LoginOptions {\n lang: string;\n serverURL: string;\n}\n\nexport interface UserInfo {\n // eslint-disable-next-line @typescript-eslint/naming-convention\n display_name: string;\n email: string;\n url: string;\n token: string;\n avatar: string;\n mailMd5: string;\n objectId: string | number;\n type: 'administrator' | 'guest';\n}\n\nexport const login = ({\n lang,\n serverURL,\n}: LoginOptions): 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 { fetchArticleCounter, updateArticleCounter } from './articleCounter';\n\ninterface FetchPageviewOptions {\n serverURL: string;\n lang: string;\n paths: string[];\n signal: AbortSignal;\n}\n\nexport const fetchPageviews = ({\n serverURL,\n lang,\n paths,\n signal,\n}: FetchPageviewOptions): Promise<number[]> =>\n fetchArticleCounter({\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 {\n serverURL: string;\n lang: string;\n path: string;\n action?: 'inc' | 'desc';\n}\n\nexport const updatePageviews = (\n options: UpdatePageviewOptions\n): Promise<number> =>\n updateArticleCounter({\n ...options,\n type: 'time',\n });\n","import { errorCheck } from './utils';\nimport type { WalineComment } from '../typings';\n\nexport interface FetchRecentCommentOptions {\n serverURL: string;\n lang: string;\n count: number;\n signal: AbortSignal;\n token?: string;\n}\n\nexport const fetchRecentComment = ({\n serverURL,\n lang,\n count,\n signal,\n token,\n}: FetchRecentCommentOptions): 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) => resp.json() as Promise<WalineComment[]>)\n .then((data) => errorCheck(data, 'recent comment'));\n};\n","import { WalineComment } from '../typings';\nimport { errorCheck } from './utils';\n\nexport interface FetchUserListOptions {\n serverURL: string;\n pageSize: number;\n signal: AbortSignal;\n lang: string;\n}\n\nexport interface WalineUser\n extends Pick<WalineComment, 'nick' | 'link' | 'avatar' | 'label' | 'level'> {\n count: number;\n}\n\nexport const fetchUserList = ({\n serverURL,\n signal,\n pageSize,\n lang,\n}: FetchUserListOptions): Promise<WalineUser[]> => {\n return fetch(`${serverURL}/user?pageSize=${pageSize}&lang=${lang}`, {\n signal,\n })\n .then(\n (resp) =>\n resp.json() as Promise<{\n errno: number;\n message: string;\n data: WalineUser[];\n }>\n )\n .then((resp) => errorCheck(resp, 'user list'))\n .then((resp) => resp.data);\n};\n"],"names":["JSON_HEADERS","errorCheck","data","name","errno","TypeError","errmsg","fetchArticleCounter","serverURL","lang","paths","type","signal","fetch","encodeURIComponent","join","then","resp","json","updateArticleCounter","path","action","method","headers","body","JSON","stringify","fetchComment","page","pageSize","sortBy","token","Authorization","postComment","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","fetchPageviews","updatePageviews","options","fetchRecentComment","count","fetchUserList"],"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";Object.defineProperty(exports,"__esModule",{value:!0});const e=({serverURL:e,lang:t,paths:r,signal:n})=>fetch(`${e}/comment?type=count&url=${encodeURIComponent(r.join(","))}&lang=${t}`,{signal:n,headers:{}}).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)};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&&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:s,signal:c.signal}).then((e=>{l.forEach(((t,r)=>{t.innerText=e[r].toString()}))})).catch(r),c.abort.bind(c)},exports.version="2.13.0";
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 FetchErrorData {\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 | FetchErrorData,\n name = ''\n): T => {\n if (typeof data === 'object' && (data as FetchErrorData).errno)\n throw new TypeError(\n `Fetch ${name} failed with ${(data as FetchErrorData).errno}: ${\n (data as FetchErrorData).errmsg\n }`\n );\n\n return data as T;\n};\n","import { errorCheck } from './utils';\n\nexport interface FetchCommentCountOptions {\n serverURL: string;\n lang: string;\n paths: string[];\n signal: AbortSignal;\n}\n\nexport const fetchCommentCount = ({\n serverURL,\n lang,\n paths,\n signal,\n}: FetchCommentCountOptions): Promise<number[]> => {\n const headers: Record<string, string> = {};\n\n return (\n fetch(\n `${serverURL}/comment?type=count&url=${encodeURIComponent(\n paths.join(',')\n )}&lang=${lang}`,\n { signal, headers }\n )\n .then((resp) => resp.json() as Promise<number | number[]>)\n .then((data) => errorCheck(data, 'comment count'))\n // TODO: Improve this API\n .then((counts) => (Array.isArray(counts) ? counts : [counts]))\n );\n};\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","headers","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":"oEAUO,MCDMA,EAAoB,EAC/BC,YACAC,OACAC,QACAC,YAKEC,MACE,GAAGJ,4BAAoCK,mBACrCH,EAAMI,KAAK,cACHL,IACV,CAAEE,SAAQI,QAP0B,CAAA,IASnCC,MAAMC,GAASA,EAAKC,SACpBF,MAAMG,GDfa,EACxBA,EACAC,EAAO,MAEP,GAAoB,iBAATD,GAAsBA,EAAwBE,MACvD,MAAM,IAAIC,UACR,SAASF,iBAAqBD,EAAwBE,UACnDF,EAAwBI,UAI/B,OAAOJ,CAAS,ECIIK,CAAWL,EAAM,mBAEhCH,MAAMS,GAAYC,MAAMC,QAAQF,GAAUA,EAAS,CAACA,KCK9CG,EAAgBpB,IAC3B,MAAMqB,ECvB0B,EAACC,EAAU,KAC3CA,EAAQC,QAAQ,OAAQ,IDsBTC,CAAmBxB,GAElC,MCrBA,kBAAkByB,KDqBAJ,GAAUA,EAAS,WAAWA,GAAQ,EEnC7CK,EAAgBC,IACV,eAAbA,EAAIf,MAAuBgB,QAAQC,MAAMF,EAAIG,QAAQ,uBCuC/B,EAC1B9B,YACA+B,OAAOC,OAAOC,SAASC,SACvBC,WAAW,wBACXlC,OAAO,YAGP,MAAMmC,EAAa,IAAIC,gBAGjBC,EAAWC,SAASC,iBAA8BL,GAkBxD,OAhBIG,EAASG,QACN1C,EAAkB,CACrBC,UAAWoB,EAAapB,GACxBE,MAAOgB,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,KAEnE9B,OACAE,OAAQiC,EAAWjC,SAElBK,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"}
@@ -1,4 +1,4 @@
1
- declare type WalineAbort = (reason?: any) => void;
1
+ type WalineAbort = (reason?: any) => void;
2
2
 
3
3
  interface WalineCommentCountOptions {
4
4
  /**
@@ -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
  */
@@ -1,4 +1,4 @@
1
- declare type WalineAbort = (reason?: any) => void;
1
+ type WalineAbort = (reason?: any) => void;
2
2
 
3
3
  interface WalineCommentCountOptions {
4
4
  /**
@@ -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
  */