@waline/client 2.12.0 → 2.13.1

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 (72) 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 +271 -53
  5. package/dist/api.d.mts +271 -53
  6. package/dist/api.d.ts +271 -53
  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 +1 -1
  12. package/dist/comment.d.mts +1 -1
  13. package/dist/comment.d.ts +1 -1
  14. package/dist/comment.js +73 -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 +8 -8
  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 +126 -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 +75 -11
  35. package/dist/shim.d.mts +75 -11
  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 +75 -11
  43. package/dist/waline.d.mts +75 -11
  44. package/dist/waline.d.ts +75 -11
  45. package/dist/waline.js +6795 -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 +50 -16
  51. package/src/api/comment.ts +131 -39
  52. package/src/api/commentCount.ts +25 -20
  53. package/src/api/index.ts +1 -0
  54. package/src/api/login.ts +49 -6
  55. package/src/api/pageview.ts +25 -12
  56. package/src/api/recentComment.ts +23 -7
  57. package/src/api/user.ts +43 -0
  58. package/src/api/utils.ts +21 -5
  59. package/src/components/ArticleReaction.vue +12 -3
  60. package/src/components/CommentBox.vue +26 -21
  61. package/src/components/ImageWall.vue +14 -14
  62. package/src/components/Waline.vue +25 -16
  63. package/src/composables/userInfo.ts +1 -2
  64. package/src/composables/vote.ts +1 -1
  65. package/src/config/default.ts +23 -24
  66. package/src/pageview.ts +2 -2
  67. package/src/styles/index.scss +2 -1
  68. package/src/styles/userlist.scss +158 -0
  69. package/src/utils/emoji.ts +1 -1
  70. package/src/widgets/index.ts +1 -0
  71. package/src/widgets/recentComments.ts +2 -2
  72. package/src/widgets/userList.ts +136 -0
package/dist/api.d.ts CHANGED
@@ -1,16 +1,60 @@
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
+
16
+ interface GetArticleCounterOptions extends BaseAPIOptions {
17
+ /**
18
+ * 待获取计数器的 path
19
+ *
20
+ * Path of counters
21
+ */
4
22
  paths: string[];
5
- signal: AbortSignal;
23
+ /**
24
+ * 待获取计数器的类型
25
+ *
26
+ * Counter type to be fetched
27
+ */
6
28
  type: string[];
29
+ /**
30
+ * 取消请求的信号
31
+ *
32
+ * AbortSignal to cancel request
33
+ */
34
+ signal?: AbortSignal;
7
35
  }
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;
36
+ type GetArticleCounterResponse = Record<string, number>[] | Record<string, number> | number[] | number;
37
+ declare const getArticleCounter: ({ serverURL, lang, paths, type, signal, }: GetArticleCounterOptions) => Promise<GetArticleCounterResponse>;
38
+ interface UpdateArticleCounterOptions extends BaseAPIOptions {
39
+ /**
40
+ * 待更新计数器的 path
41
+ *
42
+ * Path of counter to be updated
43
+ */
12
44
  path: string;
45
+ /**
46
+ * 待更新计数器的类型
47
+ *
48
+ * Counter type to be updated
49
+ */
13
50
  type: string;
51
+ /**
52
+ * 更新操作
53
+ *
54
+ * Update operation
55
+ *
56
+ * @default 'inc'
57
+ */
14
58
  action?: 'inc' | 'desc';
15
59
  }
16
60
  declare const updateArticleCounter: ({ serverURL, lang, path, type, action, }: UpdateArticleCounterOptions) => Promise<number>;
@@ -61,7 +105,7 @@ interface WalineCommentData {
61
105
  */
62
106
  recaptchaV3?: string;
63
107
  }
64
- declare type WalineCommentStatus = 'approved' | 'waiting' | 'spam';
108
+ type WalineCommentStatus = 'approved' | 'waiting' | 'spam';
65
109
  interface WalineComment extends Exclude<WalineCommentData, 'ua'> {
66
110
  /**
67
111
  * User avatar
@@ -91,105 +135,279 @@ interface WalineComment extends Exclude<WalineCommentData, 'ua'> {
91
135
  orig?: string;
92
136
  }
93
137
 
94
- interface FetchCommentOptions {
95
- serverURL: string;
138
+ interface GetCommentOptions extends BaseAPIOptions {
139
+ /**
140
+ * 待获取评论列hi奥德路径
141
+ *
142
+ * Path of comment list
143
+ */
96
144
  path: string;
145
+ /**
146
+ * 评论分页数
147
+ *
148
+ * Comment panination number
149
+ */
97
150
  page: number;
151
+ /**
152
+ * 评论每页个数
153
+ *
154
+ * Comment number per page
155
+ */
98
156
  pageSize: number;
157
+ /**
158
+ * 排序方式
159
+ *
160
+ * Sort method
161
+ */
99
162
  sortBy: string;
100
- signal: AbortSignal;
163
+ /**
164
+ * 用户令牌
165
+ *
166
+ * User token
167
+ */
101
168
  token?: string;
102
- lang: string;
169
+ /**
170
+ * 取消请求的信号
171
+ *
172
+ * AbortSignal to cancel request
173
+ */
174
+ signal?: AbortSignal;
103
175
  }
104
- interface CommentData {
176
+ interface GetCommentResponse {
177
+ /**
178
+ * 评论数量
179
+ *
180
+ * Comment number
181
+ */
105
182
  count: number;
183
+ /**
184
+ * 评论数据
185
+ *
186
+ * Comment Data
187
+ */
106
188
  data: WalineComment[];
189
+ /**
190
+ * 页面总数
191
+ *
192
+ * Page number
193
+ */
107
194
  totalPages: number;
108
195
  }
109
- declare const fetchComment: ({ serverURL, lang, path, page, pageSize, sortBy, signal, token, }: FetchCommentOptions) => Promise<CommentData>;
110
- interface PostCommentOptions {
111
- serverURL: string;
112
- lang: string;
196
+ declare const getComment: ({ serverURL, lang, path, page, pageSize, sortBy, signal, token, }: GetCommentOptions) => Promise<GetCommentResponse>;
197
+ interface AddCommentOptions extends BaseAPIOptions {
198
+ /**
199
+ * 用户令牌
200
+ *
201
+ * User token
202
+ */
113
203
  token?: string;
204
+ /**
205
+ * 用户待提交的评论数据
206
+ *
207
+ * Comment data being submitted by user
208
+ */
114
209
  comment: WalineCommentData;
115
210
  }
116
- interface PostCommentResponse {
211
+ interface AddCommentResponse {
212
+ /**
213
+ * 渲染好的评论数据
214
+ *
215
+ * Comment data rendered
216
+ */
117
217
  data?: WalineComment;
218
+ /** 错误原因 */
118
219
  errmsg?: string;
119
220
  }
120
- declare const postComment: ({ serverURL, lang, token, comment, }: PostCommentOptions) => Promise<PostCommentResponse>;
121
- interface DeleteCommentOptions {
122
- serverURL: string;
123
- lang: string;
221
+ declare const addComment: ({ serverURL, lang, token, comment, }: AddCommentOptions) => Promise<AddCommentResponse>;
222
+ interface DeleteCommentOptions extends BaseAPIOptions {
124
223
  token: string;
125
224
  objectId: string | number;
126
225
  }
127
226
  declare const deleteComment: ({ serverURL, lang, token, objectId, }: DeleteCommentOptions) => Promise<void>;
128
- interface LikeCommentOptions {
129
- serverURL: string;
130
- lang: string;
227
+ interface LikeCommentOptions extends BaseAPIOptions {
228
+ /**
229
+ * 评论的 ID
230
+ *
231
+ * Comment ID
232
+ */
131
233
  objectId: number | string;
234
+ /**
235
+ * 点赞还是取消点赞
236
+ *
237
+ * Like or dislike
238
+ */
132
239
  like: boolean;
133
240
  }
134
241
  declare const likeComment: ({ serverURL, lang, objectId, like, }: LikeCommentOptions) => Promise<void>;
135
- interface UpdateCommentOptions {
136
- serverURL: string;
137
- lang: string;
242
+ interface UpdateCommentOptions extends BaseAPIOptions {
243
+ /**
244
+ * 用户令牌
245
+ *
246
+ * User token
247
+ */
138
248
  token: string;
249
+ /**
250
+ * 评论的 ID
251
+ *
252
+ * Comment ID
253
+ */
139
254
  objectId: number | string;
255
+ /**
256
+ * 评论的状态
257
+ *
258
+ * Comment status
259
+ */
140
260
  status?: 'approved' | 'waiting' | 'spam';
141
- sticky?: number;
261
+ /**
262
+ * 评论指定状态
263
+ *
264
+ * Comment sticky status
265
+ *
266
+ * @description 0 means not sticky and 1 means sticky
267
+ */
268
+ sticky?: 0 | 1;
142
269
  }
143
270
  declare const updateComment: ({ serverURL, lang, token, objectId, ...data }: UpdateCommentOptions) => Promise<void>;
144
271
 
145
- interface FetchCommentCountOptions {
146
- serverURL: string;
147
- lang: string;
272
+ interface GetCommentCountOptions extends BaseAPIOptions {
273
+ /**
274
+ * 待获取评论数的 path
275
+ *
276
+ * Path of pages to be fetched
277
+ */
148
278
  paths: string[];
149
- signal: AbortSignal;
279
+ /**
280
+ * 取消请求的信号
281
+ *
282
+ * AbortSignal to cancel request
283
+ */
284
+ signal?: AbortSignal;
150
285
  }
151
- declare const fetchCommentCount: ({ serverURL, lang, paths, signal, }: FetchCommentCountOptions) => Promise<number[]>;
286
+ declare const fetchCommentCount: ({ serverURL, lang, paths, signal, }: GetCommentCountOptions) => Promise<number[]>;
152
287
 
153
- interface LoginOptions {
154
- lang: string;
155
- serverURL: string;
156
- }
157
288
  interface UserInfo {
289
+ /**
290
+ * 显示姓名
291
+ *
292
+ * User name displayed
293
+ */
158
294
  display_name: string;
295
+ /**
296
+ * 用户电子邮件地址
297
+ *
298
+ * User email
299
+ */
159
300
  email: string;
301
+ /**
302
+ * 用户网站地址
303
+ *
304
+ * User website
305
+ */
160
306
  url: string;
307
+ /**
308
+ * 用户令牌
309
+ *
310
+ * User token
311
+ */
161
312
  token: string;
313
+ /**
314
+ * 用户头像
315
+ *
316
+ * User avatar
317
+ */
162
318
  avatar: string;
319
+ /**
320
+ * 用户邮箱 MD5
321
+ *
322
+ * MD5 of User email
323
+ */
163
324
  mailMd5: string;
325
+ /**
326
+ * 用户对象 ID
327
+ *
328
+ * User object ID
329
+ */
164
330
  objectId: string | number;
331
+ /**
332
+ * 用户身份
333
+ *
334
+ * User role
335
+ */
165
336
  type: 'administrator' | 'guest';
166
337
  }
167
- declare const login: ({ lang, serverURL, }: LoginOptions) => Promise<UserInfo & {
338
+ declare const login: ({ lang, serverURL, }: BaseAPIOptions) => Promise<UserInfo & {
168
339
  remember: boolean;
169
340
  }>;
170
341
 
171
- interface FetchPageviewOptions {
172
- serverURL: string;
173
- lang: string;
342
+ interface GetPageviewOptions extends BaseAPIOptions {
343
+ /**
344
+ * 待获取页面的 path
345
+ *
346
+ * Path of pages
347
+ */
174
348
  paths: string[];
175
- signal: AbortSignal;
349
+ /**
350
+ * 取消请求的信号
351
+ *
352
+ * AbortSignal to cancel request
353
+ */
354
+ signal?: AbortSignal;
176
355
  }
177
- declare const fetchPageviews: ({ serverURL, lang, paths, signal, }: FetchPageviewOptions) => Promise<number[]>;
178
- interface UpdatePageviewOptions {
179
- serverURL: string;
180
- lang: string;
356
+ declare const getPageviews: ({ serverURL, lang, paths, signal, }: GetPageviewOptions) => Promise<number[]>;
357
+ interface UpdatePageviewOptions extends BaseAPIOptions {
358
+ /**
359
+ * 待更新页面的 path
360
+ *
361
+ * Path of pages
362
+ */
181
363
  path: string;
182
- action?: 'inc' | 'desc';
183
364
  }
184
365
  declare const updatePageviews: (options: UpdatePageviewOptions) => Promise<number>;
185
366
 
186
- interface FetchRecentCommentOptions {
187
- serverURL: string;
188
- lang: string;
367
+ interface GetRecentCommentOptions extends BaseAPIOptions {
368
+ /**
369
+ * 获取评论的数量
370
+ *
371
+ * Comment numebr to be fetched
372
+ */
189
373
  count: number;
190
- signal: AbortSignal;
374
+ /**
375
+ * 取消请求的信号
376
+ *
377
+ * AbortSignal to cancel request
378
+ */
379
+ signal?: AbortSignal;
380
+ /**
381
+ * 用户令牌
382
+ *
383
+ * User token
384
+ */
191
385
  token?: string;
192
386
  }
193
- declare const fetchRecentComment: ({ serverURL, lang, count, signal, token, }: FetchRecentCommentOptions) => Promise<WalineComment[]>;
387
+ declare const getRecentComment: ({ serverURL, lang, count, signal, token, }: GetRecentCommentOptions) => Promise<WalineComment[]>;
388
+
389
+ interface GetUserListOptions extends BaseAPIOptions {
390
+ /**
391
+ * 每页个数
392
+ *
393
+ * Number per page
394
+ */
395
+ pageSize: number;
396
+ /**
397
+ * 取消请求的信号
398
+ *
399
+ * AbortSignal to cancel request
400
+ */
401
+ signal?: AbortSignal;
402
+ }
403
+ interface WalineUser extends Pick<WalineComment, 'nick' | 'link' | 'avatar' | 'label' | 'level'> {
404
+ count: number;
405
+ }
406
+ interface GetUserListResponse {
407
+ errno: number;
408
+ message: string;
409
+ data: WalineUser[];
410
+ }
411
+ declare const getUserList: ({ serverURL, signal, pageSize, lang, }: GetUserListOptions) => Promise<WalineUser[]>;
194
412
 
195
- export { CommentData, DeleteCommentOptions, FetchArticleCounterOptions, FetchCommentCountOptions, FetchCommentOptions, FetchRecentCommentOptions, LikeCommentOptions, LoginOptions, PostCommentOptions, PostCommentResponse, UpdateArticleCounterOptions, UpdateCommentOptions, UpdatePageviewOptions, UserInfo, deleteComment, fetchArticleCounter, fetchComment, fetchCommentCount, fetchPageviews, fetchRecentComment, likeComment, login, postComment, updateArticleCounter, updateComment, updatePageviews };
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 };
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:r,signal:a})=>fetch(`${e}/article?path=${encodeURIComponent(o.join(","))}&type=${encodeURIComponent(r.join(","))}&lang=${t}`,{signal:a}).then((e=>e.json())).then((e=>n(e,"article count"))),o=({serverURL:t,lang:o,path:r,type:a,action:s})=>fetch(`${t}/article?lang=${o}`,{method:"POST",headers:e,body:JSON.stringify({path:r,type:a,action:s})}).then((e=>e.json())).then((e=>n(e,"article count"))),r=({serverURL:e,lang:t,path:o,page:r,pageSize:a,sortBy:s,signal:i,token:h})=>{const c={};return h&&(c.Authorization=`Bearer ${h}`),fetch(`${e}/comment?path=${encodeURIComponent(o)}&pageSize=${a}&page=${r}&lang=${t}&sortBy=${s}`,{signal:i,headers:c}).then((e=>e.json())).then((e=>n(e,"comment data")))},a=({serverURL:e,lang:n,token:t,comment:o})=>{const r={"Content-Type":"application/json"};return t&&(r.Authorization=`Bearer ${t}`),o.eid?fetch(`${e}/comment/${o.eid}?lang=${n}`,{method:"PUT",headers:r,body:JSON.stringify(o)}).then((e=>e.json())):fetch(`${e}/comment?lang=${n}`,{method:"POST",headers:r,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:r})=>fetch(`${n}/comment/${o}?lang=${t}`,{method:"PUT",headers:e,body:JSON.stringify({like:r})}).then((e=>e.json())),h=({serverURL:n,lang:t,token:o,objectId:r,...a})=>fetch(`${n}/comment/${r}?lang=${t}`,{method:"PUT",headers:{...e,Authorization:`Bearer ${o}`},body:JSON.stringify(a)}).then((e=>e.json())),c=({serverURL:e,lang:t,paths:o,signal:r})=>fetch(`${e}/comment?type=count&url=${encodeURIComponent(o.join(","))}&lang=${t}`,{signal:r,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,r=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 r?.postMessage({type:"TOKEN",data:null},"*"),new Promise((e=>{const n=({data:t})=>{t&&"object"==typeof t&&"userInfo"===t.type&&t.data.token&&(r?.close(),window.removeEventListener("message",n),e(t.data))};window.addEventListener("message",n)}))},g=({serverURL:e,lang:n,paths:o,signal:r})=>t({serverURL:e,lang:n,paths:o,type:["time"],signal:r}).then((e=>Array.isArray(e)?e:[e])),d=e=>o({...e,type:"time"}),$=({serverURL:e,lang:t,count:o,signal:r,token:a})=>{const s={};return a&&(s.Authorization=`Bearer ${a}`),fetch(`${e}/comment?type=recent&count=${o}&lang=${t}`,{signal:r,headers:s}).then((e=>e.json())).then((e=>n(e,"recent comment")))};export{s as deleteComment,t as fetchArticleCounter,r as fetchComment,c as fetchCommentCount,g as fetchPageviews,$ as fetchRecentComment,i as likeComment,l as login,a as postComment,o as updateArticleCounter,h as updateComment,d as updatePageviews};
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};
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"],"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"],"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"],"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 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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"}
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.12.0";
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";
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/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,4 +1,4 @@
1
- declare type WalineAbort = (reason?: any) => void;
1
+ type WalineAbort = (reason?: any) => void;
2
2
 
3
3
  interface WalineCommentCountOptions {
4
4
  /**
@@ -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
  /**
package/dist/comment.d.ts CHANGED
@@ -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
  /**