@waline/client 2.3.2 → 2.4.2
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.
- package/dist/component.esm.js +1 -1
- package/dist/component.esm.js.map +1 -1
- package/dist/component.js +1 -1
- package/dist/component.js.map +1 -1
- package/dist/legacy.d.ts +4 -9
- package/dist/legacy.js +1 -1
- package/dist/legacy.js.map +1 -1
- package/dist/pageview.cjs.d.ts +47 -0
- package/dist/pageview.cjs.js +1 -1
- package/dist/pageview.cjs.js.map +1 -1
- package/dist/pageview.esm.d.ts +47 -0
- package/dist/pageview.esm.js +1 -1
- package/dist/pageview.esm.js.map +1 -1
- package/dist/pageview.js +1 -1
- package/dist/pageview.js.map +1 -1
- package/dist/shim.d.ts +46 -11
- package/dist/shim.esm.d.ts +46 -11
- package/dist/shim.esm.js +1 -1
- package/dist/shim.esm.js.map +1 -1
- package/dist/shim.js +1 -1
- package/dist/shim.js.map +1 -1
- package/dist/waline.cjs.d.ts +46 -11
- package/dist/waline.cjs.js +1 -1
- package/dist/waline.cjs.js.map +1 -1
- package/dist/waline.css +1 -1
- package/dist/waline.css.map +1 -1
- package/dist/waline.d.ts +46 -11
- package/dist/waline.esm.d.ts +46 -11
- package/dist/waline.esm.js +1 -1
- package/dist/waline.esm.js.map +1 -1
- package/dist/waline.js +1 -1
- package/dist/waline.js.map +1 -1
- package/package.json +19 -5
- package/src/components/CommentCard.vue +80 -14
- package/src/components/Icons.ts +28 -2
- package/src/components/Waline.vue +115 -2
- package/src/composables/index.ts +1 -0
- package/src/composables/like.ts +14 -0
- package/src/composables/userInfo.ts +9 -1
- package/src/config/i18n/en.ts +2 -0
- package/src/config/i18n/generate.ts +2 -0
- package/src/config/i18n/jp.ts +2 -0
- package/src/config/i18n/pt-BR.ts +2 -0
- package/src/config/i18n/ru.ts +2 -0
- package/src/config/i18n/vi-VN.ts +2 -0
- package/src/config/i18n/zh-CN.ts +2 -0
- package/src/config/i18n/zh-TW.ts +2 -0
- package/src/styles/card.scss +55 -27
- package/src/styles/nomalize.scss +0 -1
- package/src/styles/panel.scss +0 -1
- package/src/typings/comment.ts +56 -1
- package/src/typings/locale.ts +3 -8
- package/src/typings/waline.ts +1 -1
- package/src/utils/config.ts +1 -1
- package/src/utils/fetch.ts +77 -4
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
declare const version: string;
|
|
2
|
+
|
|
3
|
+
declare type WalineAbort = (reason?: any) => void;
|
|
4
|
+
|
|
5
|
+
interface WalinePageviewCountOptions {
|
|
6
|
+
/**
|
|
7
|
+
* Waline 服务端地址
|
|
8
|
+
*
|
|
9
|
+
* Waline server url
|
|
10
|
+
*/
|
|
11
|
+
serverURL: string;
|
|
12
|
+
/**
|
|
13
|
+
* 浏览量 CSS 选择器
|
|
14
|
+
*
|
|
15
|
+
* Pageview CSS selector
|
|
16
|
+
*
|
|
17
|
+
* @default '.waline-pageview-count'
|
|
18
|
+
*/
|
|
19
|
+
selector?: string;
|
|
20
|
+
/**
|
|
21
|
+
* 需要更新和获取的路径
|
|
22
|
+
*
|
|
23
|
+
* Path to be fetched and updated
|
|
24
|
+
*
|
|
25
|
+
* @default window.location.pathname
|
|
26
|
+
*/
|
|
27
|
+
path?: string;
|
|
28
|
+
/**
|
|
29
|
+
* 是否在查询时更新 path 的浏览量
|
|
30
|
+
*
|
|
31
|
+
* Whether update pageviews when fetching path result
|
|
32
|
+
*
|
|
33
|
+
* @default true
|
|
34
|
+
*/
|
|
35
|
+
update?: boolean;
|
|
36
|
+
/**
|
|
37
|
+
* 错误提示消息所使用的语言
|
|
38
|
+
*
|
|
39
|
+
* Language of error message
|
|
40
|
+
*
|
|
41
|
+
* @default 'zh-CN'
|
|
42
|
+
*/
|
|
43
|
+
lang?: string;
|
|
44
|
+
}
|
|
45
|
+
declare const pageviewCount: ({ serverURL, path, selector, update, lang, }: WalinePageviewCountOptions) => WalineAbort;
|
|
46
|
+
|
|
47
|
+
export { WalinePageviewCountOptions, pageviewCount, version };
|
package/dist/pageview.cjs.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});const e=e=>{"AbortError"!==e.name&&console.error(e.message)},t=(e,t="")=>{if("object"==typeof e&&e.errno)throw new TypeError(`Fetch ${t} failed with ${e.errno}: ${e.errmsg}`);return e},
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});const e=e=>{"AbortError"!==e.name&&console.error(e.message)},t={"Content-Type":"application/json"},r=(e,t="")=>{if("object"==typeof e&&e.errno)throw new TypeError(`Fetch ${t} failed with ${e.errno}: ${e.errmsg}`);return e},n=({serverURL:e,lang:t,paths:n,signal:o})=>fetch(`${e}/article?path=${encodeURIComponent(n.join(","))}&lang=${t}`,{signal:o}).then((e=>e.json())).then((e=>r(e,"visit count"))).then((e=>Array.isArray(e)?e:[e])),o=({serverURL:e,lang:n,path:o})=>fetch(`${e}/article?lang=${n}`,{method:"POST",headers:t,body:JSON.stringify({path:o})}).then((e=>e.json())).then((e=>r(e,"visit count"))),a=e=>e.dataset.path||e.getAttribute("id"),s=(e,t)=>{t.forEach(((t,r)=>{t.innerText=e[r].toString()}))};exports.pageviewCount=({serverURL:t,path:r=window.location.pathname,selector:i=".waline-pageview-count",update:l=!0,lang:h="zh-CN"})=>{const c=new AbortController,p=Array.from(document.querySelectorAll(i)),g=e=>{const t=a(e);return null!==t&&r!==t},u=o=>n({serverURL:t,paths:o.map((e=>a(e)||r)),lang:h,signal:c.signal}).then((e=>s(e,o))).catch(e);if(l){const e=p.filter((e=>!g(e))),n=p.filter(g);o({serverURL:t,path:r,lang:h}).then((t=>s(new Array(e.length).fill(t),e))),n.length&&u(n)}else u(p);return c.abort.bind(c)},exports.version="2.4.2";
|
|
2
2
|
//# sourceMappingURL=pageview.cjs.js.map
|
package/dist/pageview.cjs.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pageview.cjs.js","sources":["../src/version.ts","../src/utils/error.ts","../src/utils/fetch.ts","../src/utils/query.ts","../src/pageview.ts"],"sourcesContent":["declare const VERSION: string;\n\nexport const version = VERSION;\n","export const errorHandler = (err: Error): void => {\n if (err.name !== 'AbortError') console.error(err.message);\n};\n","import type { WalineComment, WalineCommentData } from '../typings';\n\nexport interface FetchErrorData {\n errno: number;\n errmsg: string;\n}\n\nconst errorCheck = <T = unknown>(data: T | FetchErrorData, name = ''): 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\nexport interface FetchCountOptions {\n serverURL: string;\n lang: string;\n paths: string[];\n signal: AbortSignal;\n token?: string;\n}\n\nexport const fetchCommentCount = ({\n serverURL,\n lang,\n paths,\n signal,\n token,\n}: FetchCountOptions): Promise<number[]> => {\n const headers: Record<string, string> = {};\n if (token) headers.Authorization = `Bearer ${token}`;\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};\nexport interface FetchRecentOptions {\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}: FetchRecentOptions): Promise<WalineComment[]> => {\n const headers: Record<string, string> = {};\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\nexport interface FetchListOptions {\n serverURL: string;\n path: string;\n page: number;\n pageSize: number;\n signal: AbortSignal;\n token?: string;\n lang: string;\n}\n\nexport interface FetchListResult {\n count: number;\n data: WalineComment[];\n totalPages: number;\n}\n\nexport const fetchCommentList = ({\n serverURL,\n lang,\n path,\n page,\n pageSize,\n signal,\n token,\n}: FetchListOptions): Promise<FetchListResult> => {\n const headers: Record<string, string> = {};\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}`,\n { signal, headers }\n )\n .then((resp) => resp.json() as Promise<FetchListResult>)\n .then((data) => errorCheck(data, 'comment list'));\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 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 FetchPageviewsOptions {\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}: FetchPageviewsOptions): Promise<number[]> =>\n fetch(\n `${serverURL}/article?path=${encodeURIComponent(\n paths.join(',')\n )}&lang=${lang}`,\n { signal }\n )\n .then((resp) => resp.json() as Promise<number[] | number>)\n .then((data) => errorCheck(data, 'visit count'))\n // TODO: Improve this API\n .then((counts) => (Array.isArray(counts) ? counts : [counts]));\n\nexport interface UpdatePageviewsOptions {\n serverURL: string;\n lang: string;\n path: string;\n}\n\nexport const updatePageviews = ({\n serverURL,\n lang,\n path,\n}: UpdatePageviewsOptions): Promise<number> =>\n fetch(`${serverURL}/article?lang=${lang}`, {\n method: 'POST',\n headers: {\n // eslint-disable-next-line @typescript-eslint/naming-convention\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ path }),\n })\n .then((resp) => resp.json() as Promise<number>)\n .then((data) => errorCheck(data, 'visit count'));\n","export const getQuery = (element: HTMLElement): string | null =>\n element.dataset.path || element.getAttribute('id');\n","import {\n errorHandler,\n fetchPageviews,\n getQuery,\n updatePageviews,\n} from './utils';\n\nimport type { WalineAbort } from './typings';\n\nexport interface WalinePageviewCountOptions {\n /**\n * Waline 服务端地址\n *\n * Waline server url\n */\n serverURL: string;\n\n /**\n * 浏览量 CSS 选择器\n *\n * Pageview CSS selector\n *\n * @default '.waline-pageview-count'\n */\n selector?: string;\n\n /**\n * 需要更新和获取的路径\n *\n * Path to be fetched and updated\n *\n * @default window.location.pathname\n */\n path?: string;\n\n /**\n * 是否在查询时更新 path 的浏览量\n *\n * Whether update pageviews when fetching path result\n *\n * @default true\n */\n update?: boolean;\n\n /**\n * 错误提示消息所使用的语言\n *\n * Language of error message\n *\n * @default 'zh-CN'\n */\n lang?: string;\n}\n\nconst renderVisitorCount = (\n counts: number[],\n countElements: HTMLElement[]\n): void => {\n countElements.forEach((element, index) => {\n element.innerText = counts[index].toString();\n });\n};\n\nexport const pageviewCount = ({\n serverURL,\n path = window.location.pathname,\n selector = '.waline-pageview-count',\n update = true,\n lang = 'zh-CN',\n}: WalinePageviewCountOptions): WalineAbort => {\n const controller = new AbortController();\n\n const elements = Array.from(\n // pageview selectors\n document.querySelectorAll<HTMLElement>(selector)\n );\n\n const filter = (element: HTMLElement): boolean => {\n const query = getQuery(element);\n\n return query !== null && path !== query;\n };\n\n const fetch = (elements: HTMLElement[]): Promise<void> =>\n fetchPageviews({\n serverURL,\n paths: elements.map((element) => getQuery(element) || path),\n lang,\n signal: controller.signal,\n })\n .then((counts) => renderVisitorCount(counts, elements))\n .catch(errorHandler);\n\n // we should update pageviews\n if (update) {\n const normalElements = elements.filter((element) => !filter(element));\n const elementsNeedstoBeFetched = elements.filter(filter);\n\n void updatePageviews({ serverURL, path, lang }).then((count) =>\n renderVisitorCount(\n new Array<number>(normalElements.length).fill(count),\n normalElements\n )\n );\n\n // if we should fetch count of other pages\n if (elementsNeedstoBeFetched.length) {\n void fetch(elementsNeedstoBeFetched);\n }\n }\n // we should not update pageviews\n else {\n void fetch(elements);\n }\n\n return controller.abort.bind(controller);\n};\n"],"names":["errorHandler","err","name","console","error","message","errorCheck","data","errno","TypeError","errmsg","fetchPageviews","serverURL","lang","paths","signal","fetch","encodeURIComponent","join","then","resp","json","counts","Array","isArray","updatePageviews","path","method","headers","body","JSON","stringify","getQuery","element","dataset","getAttribute","renderVisitorCount","countElements","forEach","index","innerText","toString","window","location","pathname","selector","update","controller","AbortController","elements","from","document","querySelectorAll","filter","query","map","catch","normalElements","elementsNeedstoBeFetched","count","length","fill","abort","bind"],"mappings":"oEAEO,MCFMA,EAAgBC,IACV,eAAbA,EAAIC,MAAuBC,QAAQC,MAAMH,EAAII,UCM7CC,EAAa,CAAcC,EAA0BL,EAAO,MAChE,GAAoB,iBAATK,GAAsBA,EAAwBC,MACvD,MAAM,IAAIC,UACR,SAASP,iBAAqBK,EAAwBC,UACnDD,EAAwBG,UAI/B,OAAOH,GAyIII,EAAiB,EAC5BC,UAAAA,EACAC,KAAAA,EACAC,MAAAA,EACAC,OAAAA,KAEAC,MACE,GAAGJ,kBAA0BK,mBAC3BH,EAAMI,KAAK,cACHL,IACV,CAAEE,OAAAA,IAEDI,MAAMC,GAASA,EAAKC,SACpBF,MAAMZ,GAASD,EAAWC,EAAM,iBAEhCY,MAAMG,GAAYC,MAAMC,QAAQF,GAAUA,EAAS,CAACA,KAQ5CG,EAAkB,EAC7Bb,UAAAA,EACAC,KAAAA,EACAa,KAAAA,KAEAV,MAAM,GAAGJ,kBAA0BC,IAAQ,CACzCc,OAAQ,OACRC,QAAS,CAEP,eAAgB,oBAElBC,KAAMC,KAAKC,UAAU,CAAEL,KAAAA,MAEtBP,MAAMC,GAASA,EAAKC,SACpBF,MAAMZ,GAASD,EAAWC,EAAM,iBC7LxByB,EAAYC,GACvBA,EAAQC,QAAQR,MAAQO,EAAQE,aAAa,MCqDzCC,EAAqB,CACzBd,EACAe,KAEAA,EAAcC,SAAQ,CAACL,EAASM,KAC9BN,EAAQO,UAAYlB,EAAOiB,GAAOE,qCAIT,EAC3B7B,UAAAA,EACAc,KAAAA,EAAOgB,OAAOC,SAASC,SACvBC,SAAAA,EAAW,yBACXC,OAAAA,GAAS,EACTjC,KAAAA,EAAO,YAEP,MAAMkC,EAAa,IAAIC,gBAEjBC,EAAW1B,MAAM2B,KAErBC,SAASC,iBAA8BP,IAGnCQ,EAAUpB,IACd,MAAMqB,EAAQtB,EAASC,GAEvB,OAAiB,OAAVqB,GAAkB5B,IAAS4B,GAG9BtC,EAASiC,GACbtC,EAAe,CACbC,UAAAA,EACAE,MAAOmC,EAASM,KAAKtB,GAAYD,EAASC,IAAYP,IACtDb,KAAAA,EACAE,OAAQgC,EAAWhC,SAElBI,MAAMG,GAAWc,EAAmBd,EAAQ2B,KAC5CO,MAAMxD,GAGX,GAAI8C,EAAQ,CACV,MAAMW,EAAiBR,EAASI,QAAQpB,IAAaoB,EAAOpB,KACtDyB,EAA2BT,EAASI,OAAOA,GAE5C5B,EAAgB,CAAEb,UAAAA,EAAWc,KAAAA,EAAMb,KAAAA,IAAQM,MAAMwC,GACpDvB,EACE,IAAIb,MAAckC,EAAeG,QAAQC,KAAKF,GAC9CF,KAKAC,EAAyBE,QACtB5C,EAAM0C,QAKR1C,EAAMiC,GAGb,OAAOF,EAAWe,MAAMC,KAAKhB,oBJjHR"}
|
|
1
|
+
{"version":3,"file":"pageview.cjs.js","sources":["../src/version.ts","../src/utils/error.ts","../src/utils/fetch.ts","../src/utils/query.ts","../src/pageview.ts"],"sourcesContent":["declare const VERSION: string;\n\nexport const version = VERSION;\n","export const errorHandler = (err: Error): void => {\n if (err.name !== 'AbortError') console.error(err.message);\n};\n","import type { WalineComment, WalineCommentData } from '../typings';\n\nexport interface FetchErrorData {\n errno: number;\n errmsg: string;\n}\n\nconst JSON_HEADERS: Record<string, string> = {\n // eslint-disable-next-line @typescript-eslint/naming-convention\n 'Content-Type': 'application/json',\n};\n\nconst errorCheck = <T = unknown>(data: T | FetchErrorData, name = ''): 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\nexport interface FetchCountOptions {\n serverURL: string;\n lang: string;\n paths: string[];\n signal: AbortSignal;\n token?: string;\n}\n\nexport const fetchCommentCount = ({\n serverURL,\n lang,\n paths,\n signal,\n token,\n}: FetchCountOptions): Promise<number[]> => {\n const headers: Record<string, string> = {};\n if (token) headers.Authorization = `Bearer ${token}`;\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};\nexport interface FetchRecentOptions {\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}: FetchRecentOptions): Promise<WalineComment[]> => {\n const headers: Record<string, string> = {};\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\nexport interface FetchListOptions {\n serverURL: string;\n path: string;\n page: number;\n pageSize: number;\n signal: AbortSignal;\n token?: string;\n lang: string;\n}\n\nexport interface FetchListResult {\n count: number;\n data: WalineComment[];\n totalPages: number;\n}\n\nexport const fetchCommentList = ({\n serverURL,\n lang,\n path,\n page,\n pageSize,\n signal,\n token,\n}: FetchListOptions): Promise<FetchListResult> => {\n const headers: Record<string, string> = {};\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}`,\n { signal, headers }\n )\n .then((resp) => resp.json() as Promise<FetchListResult>)\n .then((data) => errorCheck(data, 'comment list'));\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 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 const headers: Record<string, string> = {\n Authorization: `Bearer ${token}`,\n };\n\n return fetch(`${serverURL}/comment/${objectId}?lang=${lang}`, {\n method: 'DELETE',\n headers,\n }).then((resp) => resp.json() as Promise<void>);\n};\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 const headers: Record<string, string> = {\n // eslint-disable-next-line @typescript-eslint/naming-convention\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${token}`,\n };\n\n return fetch(`${serverURL}/comment/${objectId}?lang=${lang}`, {\n method: 'PUT',\n headers,\n body: JSON.stringify(data),\n }).then((resp) => resp.json() as Promise<void>);\n};\n\nexport interface FetchPageviewsOptions {\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}: FetchPageviewsOptions): Promise<number[]> =>\n fetch(\n `${serverURL}/article?path=${encodeURIComponent(\n paths.join(',')\n )}&lang=${lang}`,\n { signal }\n )\n .then((resp) => resp.json() as Promise<number[] | number>)\n .then((data) => errorCheck(data, 'visit count'))\n // TODO: Improve this API\n .then((counts) => (Array.isArray(counts) ? counts : [counts]));\n\nexport interface UpdatePageviewsOptions {\n serverURL: string;\n lang: string;\n path: string;\n}\n\nexport const updatePageviews = ({\n serverURL,\n lang,\n path,\n}: UpdatePageviewsOptions): Promise<number> =>\n fetch(`${serverURL}/article?lang=${lang}`, {\n method: 'POST',\n headers: JSON_HEADERS,\n body: JSON.stringify({ path }),\n })\n .then((resp) => resp.json() as Promise<number>)\n .then((data) => errorCheck(data, 'visit count'));\n","export const getQuery = (element: HTMLElement): string | null =>\n element.dataset.path || element.getAttribute('id');\n","import {\n errorHandler,\n fetchPageviews,\n getQuery,\n updatePageviews,\n} from './utils';\n\nimport type { WalineAbort } from './typings';\n\nexport interface WalinePageviewCountOptions {\n /**\n * Waline 服务端地址\n *\n * Waline server url\n */\n serverURL: string;\n\n /**\n * 浏览量 CSS 选择器\n *\n * Pageview CSS selector\n *\n * @default '.waline-pageview-count'\n */\n selector?: string;\n\n /**\n * 需要更新和获取的路径\n *\n * Path to be fetched and updated\n *\n * @default window.location.pathname\n */\n path?: string;\n\n /**\n * 是否在查询时更新 path 的浏览量\n *\n * Whether update pageviews when fetching path result\n *\n * @default true\n */\n update?: boolean;\n\n /**\n * 错误提示消息所使用的语言\n *\n * Language of error message\n *\n * @default 'zh-CN'\n */\n lang?: string;\n}\n\nconst renderVisitorCount = (\n counts: number[],\n countElements: HTMLElement[]\n): void => {\n countElements.forEach((element, index) => {\n element.innerText = counts[index].toString();\n });\n};\n\nexport const pageviewCount = ({\n serverURL,\n path = window.location.pathname,\n selector = '.waline-pageview-count',\n update = true,\n lang = 'zh-CN',\n}: WalinePageviewCountOptions): WalineAbort => {\n const controller = new AbortController();\n\n const elements = Array.from(\n // pageview selectors\n document.querySelectorAll<HTMLElement>(selector)\n );\n\n const filter = (element: HTMLElement): boolean => {\n const query = getQuery(element);\n\n return query !== null && path !== query;\n };\n\n const fetch = (elements: HTMLElement[]): Promise<void> =>\n fetchPageviews({\n serverURL,\n paths: elements.map((element) => getQuery(element) || path),\n lang,\n signal: controller.signal,\n })\n .then((counts) => renderVisitorCount(counts, elements))\n .catch(errorHandler);\n\n // we should update pageviews\n if (update) {\n const normalElements = elements.filter((element) => !filter(element));\n const elementsNeedstoBeFetched = elements.filter(filter);\n\n void updatePageviews({ serverURL, path, lang }).then((count) =>\n renderVisitorCount(\n new Array<number>(normalElements.length).fill(count),\n normalElements\n )\n );\n\n // if we should fetch count of other pages\n if (elementsNeedstoBeFetched.length) {\n void fetch(elementsNeedstoBeFetched);\n }\n }\n // we should not update pageviews\n else {\n void fetch(elements);\n }\n\n return controller.abort.bind(controller);\n};\n"],"names":["errorHandler","err","name","console","error","message","JSON_HEADERS","errorCheck","data","errno","TypeError","errmsg","fetchPageviews","serverURL","lang","paths","signal","fetch","encodeURIComponent","join","then","resp","json","counts","Array","isArray","updatePageviews","path","method","headers","body","JSON","stringify","getQuery","element","dataset","getAttribute","renderVisitorCount","countElements","forEach","index","innerText","toString","window","location","pathname","selector","update","controller","AbortController","elements","from","document","querySelectorAll","filter","query","map","catch","normalElements","elementsNeedstoBeFetched","count","length","fill","abort","bind"],"mappings":"oEAEO,MCFMA,EAAgBC,IACV,eAAbA,EAAIC,MAAuBC,QAAQC,MAAMH,EAAII,UCM7CC,EAAuC,CAE3C,eAAgB,oBAGZC,EAAa,CAAcC,EAA0BN,EAAO,MAChE,GAAoB,iBAATM,GAAsBA,EAAwBC,MACvD,MAAM,IAAIC,UACR,SAASR,iBAAqBM,EAAwBC,UACnDD,EAAwBG,UAI/B,OAAOH,GAgNII,EAAiB,EAC5BC,UAAAA,EACAC,KAAAA,EACAC,MAAAA,EACAC,OAAAA,KAEAC,MACE,GAAGJ,kBAA0BK,mBAC3BH,EAAMI,KAAK,cACHL,IACV,CAAEE,OAAAA,IAEDI,MAAMC,GAASA,EAAKC,SACpBF,MAAMZ,GAASD,EAAWC,EAAM,iBAEhCY,MAAMG,GAAYC,MAAMC,QAAQF,GAAUA,EAAS,CAACA,KAQ5CG,EAAkB,EAC7Bb,UAAAA,EACAC,KAAAA,EACAa,KAAAA,KAEAV,MAAM,GAAGJ,kBAA0BC,IAAQ,CACzCc,OAAQ,OACRC,QAASvB,EACTwB,KAAMC,KAAKC,UAAU,CAAEL,KAAAA,MAEtBP,MAAMC,GAASA,EAAKC,SACpBF,MAAMZ,GAASD,EAAWC,EAAM,iBCtQxByB,EAAYC,GACvBA,EAAQC,QAAQR,MAAQO,EAAQE,aAAa,MCqDzCC,EAAqB,CACzBd,EACAe,KAEAA,EAAcC,SAAQ,CAACL,EAASM,KAC9BN,EAAQO,UAAYlB,EAAOiB,GAAOE,qCAIT,EAC3B7B,UAAAA,EACAc,KAAAA,EAAOgB,OAAOC,SAASC,SACvBC,SAAAA,EAAW,yBACXC,OAAAA,GAAS,EACTjC,KAAAA,EAAO,YAEP,MAAMkC,EAAa,IAAIC,gBAEjBC,EAAW1B,MAAM2B,KAErBC,SAASC,iBAA8BP,IAGnCQ,EAAUpB,IACd,MAAMqB,EAAQtB,EAASC,GAEvB,OAAiB,OAAVqB,GAAkB5B,IAAS4B,GAG9BtC,EAASiC,GACbtC,EAAe,CACbC,UAAAA,EACAE,MAAOmC,EAASM,KAAKtB,GAAYD,EAASC,IAAYP,IACtDb,KAAAA,EACAE,OAAQgC,EAAWhC,SAElBI,MAAMG,GAAWc,EAAmBd,EAAQ2B,KAC5CO,MAAMzD,GAGX,GAAI+C,EAAQ,CACV,MAAMW,EAAiBR,EAASI,QAAQpB,IAAaoB,EAAOpB,KACtDyB,EAA2BT,EAASI,OAAOA,GAE5C5B,EAAgB,CAAEb,UAAAA,EAAWc,KAAAA,EAAMb,KAAAA,IAAQM,MAAMwC,GACpDvB,EACE,IAAIb,MAAckC,EAAeG,QAAQC,KAAKF,GAC9CF,KAKAC,EAAyBE,QACtB5C,EAAM0C,QAKR1C,EAAMiC,GAGb,OAAOF,EAAWe,MAAMC,KAAKhB,oBJjHR"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
declare const version: string;
|
|
2
|
+
|
|
3
|
+
declare type WalineAbort = (reason?: any) => void;
|
|
4
|
+
|
|
5
|
+
interface WalinePageviewCountOptions {
|
|
6
|
+
/**
|
|
7
|
+
* Waline 服务端地址
|
|
8
|
+
*
|
|
9
|
+
* Waline server url
|
|
10
|
+
*/
|
|
11
|
+
serverURL: string;
|
|
12
|
+
/**
|
|
13
|
+
* 浏览量 CSS 选择器
|
|
14
|
+
*
|
|
15
|
+
* Pageview CSS selector
|
|
16
|
+
*
|
|
17
|
+
* @default '.waline-pageview-count'
|
|
18
|
+
*/
|
|
19
|
+
selector?: string;
|
|
20
|
+
/**
|
|
21
|
+
* 需要更新和获取的路径
|
|
22
|
+
*
|
|
23
|
+
* Path to be fetched and updated
|
|
24
|
+
*
|
|
25
|
+
* @default window.location.pathname
|
|
26
|
+
*/
|
|
27
|
+
path?: string;
|
|
28
|
+
/**
|
|
29
|
+
* 是否在查询时更新 path 的浏览量
|
|
30
|
+
*
|
|
31
|
+
* Whether update pageviews when fetching path result
|
|
32
|
+
*
|
|
33
|
+
* @default true
|
|
34
|
+
*/
|
|
35
|
+
update?: boolean;
|
|
36
|
+
/**
|
|
37
|
+
* 错误提示消息所使用的语言
|
|
38
|
+
*
|
|
39
|
+
* Language of error message
|
|
40
|
+
*
|
|
41
|
+
* @default 'zh-CN'
|
|
42
|
+
*/
|
|
43
|
+
lang?: string;
|
|
44
|
+
}
|
|
45
|
+
declare const pageviewCount: ({ serverURL, path, selector, update, lang, }: WalinePageviewCountOptions) => WalineAbort;
|
|
46
|
+
|
|
47
|
+
export { WalinePageviewCountOptions, pageviewCount, version };
|
package/dist/pageview.esm.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
const e="2.
|
|
1
|
+
const e="2.4.2",t=e=>{"AbortError"!==e.name&&console.error(e.message)},r={"Content-Type":"application/json"},n=(e,t="")=>{if("object"==typeof e&&e.errno)throw new TypeError(`Fetch ${t} failed with ${e.errno}: ${e.errmsg}`);return e},a=({serverURL:e,lang:t,paths:r,signal:a})=>fetch(`${e}/article?path=${encodeURIComponent(r.join(","))}&lang=${t}`,{signal:a}).then((e=>e.json())).then((e=>n(e,"visit count"))).then((e=>Array.isArray(e)?e:[e])),o=({serverURL:e,lang:t,path:a})=>fetch(`${e}/article?lang=${t}`,{method:"POST",headers:r,body:JSON.stringify({path:a})}).then((e=>e.json())).then((e=>n(e,"visit count"))),l=e=>e.dataset.path||e.getAttribute("id"),i=(e,t)=>{t.forEach(((t,r)=>{t.innerText=e[r].toString()}))},s=({serverURL:e,path:r=window.location.pathname,selector:n=".waline-pageview-count",update:s=!0,lang:h="zh-CN"})=>{const c=new AbortController,g=Array.from(document.querySelectorAll(n)),p=e=>{const t=l(e);return null!==t&&r!==t},f=n=>a({serverURL:e,paths:n.map((e=>l(e)||r)),lang:h,signal:c.signal}).then((e=>i(e,n))).catch(t);if(s){const t=g.filter((e=>!p(e))),n=g.filter(p);o({serverURL:e,path:r,lang:h}).then((e=>i(new Array(t.length).fill(e),t))),n.length&&f(n)}else f(g);return c.abort.bind(c)};export{s as pageviewCount,e as version};
|
|
2
2
|
//# sourceMappingURL=pageview.esm.js.map
|
package/dist/pageview.esm.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pageview.esm.js","sources":["../src/version.ts","../src/utils/error.ts","../src/utils/fetch.ts","../src/utils/query.ts","../src/pageview.ts"],"sourcesContent":["declare const VERSION: string;\n\nexport const version = VERSION;\n","export const errorHandler = (err: Error): void => {\n if (err.name !== 'AbortError') console.error(err.message);\n};\n","import type { WalineComment, WalineCommentData } from '../typings';\n\nexport interface FetchErrorData {\n errno: number;\n errmsg: string;\n}\n\nconst errorCheck = <T = unknown>(data: T | FetchErrorData, name = ''): 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\nexport interface FetchCountOptions {\n serverURL: string;\n lang: string;\n paths: string[];\n signal: AbortSignal;\n token?: string;\n}\n\nexport const fetchCommentCount = ({\n serverURL,\n lang,\n paths,\n signal,\n token,\n}: FetchCountOptions): Promise<number[]> => {\n const headers: Record<string, string> = {};\n if (token) headers.Authorization = `Bearer ${token}`;\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};\nexport interface FetchRecentOptions {\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}: FetchRecentOptions): Promise<WalineComment[]> => {\n const headers: Record<string, string> = {};\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\nexport interface FetchListOptions {\n serverURL: string;\n path: string;\n page: number;\n pageSize: number;\n signal: AbortSignal;\n token?: string;\n lang: string;\n}\n\nexport interface FetchListResult {\n count: number;\n data: WalineComment[];\n totalPages: number;\n}\n\nexport const fetchCommentList = ({\n serverURL,\n lang,\n path,\n page,\n pageSize,\n signal,\n token,\n}: FetchListOptions): Promise<FetchListResult> => {\n const headers: Record<string, string> = {};\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}`,\n { signal, headers }\n )\n .then((resp) => resp.json() as Promise<FetchListResult>)\n .then((data) => errorCheck(data, 'comment list'));\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 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 FetchPageviewsOptions {\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}: FetchPageviewsOptions): Promise<number[]> =>\n fetch(\n `${serverURL}/article?path=${encodeURIComponent(\n paths.join(',')\n )}&lang=${lang}`,\n { signal }\n )\n .then((resp) => resp.json() as Promise<number[] | number>)\n .then((data) => errorCheck(data, 'visit count'))\n // TODO: Improve this API\n .then((counts) => (Array.isArray(counts) ? counts : [counts]));\n\nexport interface UpdatePageviewsOptions {\n serverURL: string;\n lang: string;\n path: string;\n}\n\nexport const updatePageviews = ({\n serverURL,\n lang,\n path,\n}: UpdatePageviewsOptions): Promise<number> =>\n fetch(`${serverURL}/article?lang=${lang}`, {\n method: 'POST',\n headers: {\n // eslint-disable-next-line @typescript-eslint/naming-convention\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ path }),\n })\n .then((resp) => resp.json() as Promise<number>)\n .then((data) => errorCheck(data, 'visit count'));\n","export const getQuery = (element: HTMLElement): string | null =>\n element.dataset.path || element.getAttribute('id');\n","import {\n errorHandler,\n fetchPageviews,\n getQuery,\n updatePageviews,\n} from './utils';\n\nimport type { WalineAbort } from './typings';\n\nexport interface WalinePageviewCountOptions {\n /**\n * Waline 服务端地址\n *\n * Waline server url\n */\n serverURL: string;\n\n /**\n * 浏览量 CSS 选择器\n *\n * Pageview CSS selector\n *\n * @default '.waline-pageview-count'\n */\n selector?: string;\n\n /**\n * 需要更新和获取的路径\n *\n * Path to be fetched and updated\n *\n * @default window.location.pathname\n */\n path?: string;\n\n /**\n * 是否在查询时更新 path 的浏览量\n *\n * Whether update pageviews when fetching path result\n *\n * @default true\n */\n update?: boolean;\n\n /**\n * 错误提示消息所使用的语言\n *\n * Language of error message\n *\n * @default 'zh-CN'\n */\n lang?: string;\n}\n\nconst renderVisitorCount = (\n counts: number[],\n countElements: HTMLElement[]\n): void => {\n countElements.forEach((element, index) => {\n element.innerText = counts[index].toString();\n });\n};\n\nexport const pageviewCount = ({\n serverURL,\n path = window.location.pathname,\n selector = '.waline-pageview-count',\n update = true,\n lang = 'zh-CN',\n}: WalinePageviewCountOptions): WalineAbort => {\n const controller = new AbortController();\n\n const elements = Array.from(\n // pageview selectors\n document.querySelectorAll<HTMLElement>(selector)\n );\n\n const filter = (element: HTMLElement): boolean => {\n const query = getQuery(element);\n\n return query !== null && path !== query;\n };\n\n const fetch = (elements: HTMLElement[]): Promise<void> =>\n fetchPageviews({\n serverURL,\n paths: elements.map((element) => getQuery(element) || path),\n lang,\n signal: controller.signal,\n })\n .then((counts) => renderVisitorCount(counts, elements))\n .catch(errorHandler);\n\n // we should update pageviews\n if (update) {\n const normalElements = elements.filter((element) => !filter(element));\n const elementsNeedstoBeFetched = elements.filter(filter);\n\n void updatePageviews({ serverURL, path, lang }).then((count) =>\n renderVisitorCount(\n new Array<number>(normalElements.length).fill(count),\n normalElements\n )\n );\n\n // if we should fetch count of other pages\n if (elementsNeedstoBeFetched.length) {\n void fetch(elementsNeedstoBeFetched);\n }\n }\n // we should not update pageviews\n else {\n void fetch(elements);\n }\n\n return controller.abort.bind(controller);\n};\n"],"names":["version","errorHandler","err","name","console","error","message","errorCheck","data","errno","TypeError","errmsg","fetchPageviews","serverURL","lang","paths","signal","fetch","encodeURIComponent","join","then","resp","json","counts","Array","isArray","updatePageviews","path","method","headers","body","JSON","stringify","getQuery","element","dataset","getAttribute","renderVisitorCount","countElements","forEach","index","innerText","toString","pageviewCount","window","location","pathname","selector","update","controller","AbortController","elements","from","document","querySelectorAll","filter","query","map","catch","normalElements","elementsNeedstoBeFetched","count","length","fill","abort","bind"],"mappings":"AAEO,MAAMA,EAAU,QCFVC,EAAgBC,IACV,eAAbA,EAAIC,MAAuBC,QAAQC,MAAMH,EAAII,UCM7CC,EAAa,CAAcC,EAA0BL,EAAO,MAChE,GAAoB,iBAATK,GAAsBA,EAAwBC,MACvD,MAAM,IAAIC,UACR,SAASP,iBAAqBK,EAAwBC,UACnDD,EAAwBG,UAI/B,OAAOH,GAyIII,EAAiB,EAC5BC,UAAAA,EACAC,KAAAA,EACAC,MAAAA,EACAC,OAAAA,KAEAC,MACE,GAAGJ,kBAA0BK,mBAC3BH,EAAMI,KAAK,cACHL,IACV,CAAEE,OAAAA,IAEDI,MAAMC,GAASA,EAAKC,SACpBF,MAAMZ,GAASD,EAAWC,EAAM,iBAEhCY,MAAMG,GAAYC,MAAMC,QAAQF,GAAUA,EAAS,CAACA,KAQ5CG,EAAkB,EAC7Bb,UAAAA,EACAC,KAAAA,EACAa,KAAAA,KAEAV,MAAM,GAAGJ,kBAA0BC,IAAQ,CACzCc,OAAQ,OACRC,QAAS,CAEP,eAAgB,oBAElBC,KAAMC,KAAKC,UAAU,CAAEL,KAAAA,MAEtBP,MAAMC,GAASA,EAAKC,SACpBF,MAAMZ,GAASD,EAAWC,EAAM,iBC7LxByB,EAAYC,GACvBA,EAAQC,QAAQR,MAAQO,EAAQE,aAAa,MCqDzCC,EAAqB,CACzBd,EACAe,KAEAA,EAAcC,SAAQ,CAACL,EAASM,KAC9BN,EAAQO,UAAYlB,EAAOiB,GAAOE,eAIzBC,EAAgB,EAC3B9B,UAAAA,EACAc,KAAAA,EAAOiB,OAAOC,SAASC,SACvBC,SAAAA,EAAW,yBACXC,OAAAA,GAAS,EACTlC,KAAAA,EAAO,YAEP,MAAMmC,EAAa,IAAIC,gBAEjBC,EAAW3B,MAAM4B,KAErBC,SAASC,iBAA8BP,IAGnCQ,EAAUrB,IACd,MAAMsB,EAAQvB,EAASC,GAEvB,OAAiB,OAAVsB,GAAkB7B,IAAS6B,GAG9BvC,EAASkC,GACbvC,EAAe,CACbC,UAAAA,EACAE,MAAOoC,EAASM,KAAKvB,GAAYD,EAASC,IAAYP,IACtDb,KAAAA,EACAE,OAAQiC,EAAWjC,SAElBI,MAAMG,GAAWc,EAAmBd,EAAQ4B,KAC5CO,MAAMzD,GAGX,GAAI+C,EAAQ,CACV,MAAMW,EAAiBR,EAASI,QAAQrB,IAAaqB,EAAOrB,KACtD0B,EAA2BT,EAASI,OAAOA,GAE5C7B,EAAgB,CAAEb,UAAAA,EAAWc,KAAAA,EAAMb,KAAAA,IAAQM,MAAMyC,GACpDxB,EACE,IAAIb,MAAcmC,EAAeG,QAAQC,KAAKF,GAC9CF,KAKAC,EAAyBE,QACtB7C,EAAM2C,QAKR3C,EAAMkC,GAGb,OAAOF,EAAWe,MAAMC,KAAKhB"}
|
|
1
|
+
{"version":3,"file":"pageview.esm.js","sources":["../src/version.ts","../src/utils/error.ts","../src/utils/fetch.ts","../src/utils/query.ts","../src/pageview.ts"],"sourcesContent":["declare const VERSION: string;\n\nexport const version = VERSION;\n","export const errorHandler = (err: Error): void => {\n if (err.name !== 'AbortError') console.error(err.message);\n};\n","import type { WalineComment, WalineCommentData } from '../typings';\n\nexport interface FetchErrorData {\n errno: number;\n errmsg: string;\n}\n\nconst JSON_HEADERS: Record<string, string> = {\n // eslint-disable-next-line @typescript-eslint/naming-convention\n 'Content-Type': 'application/json',\n};\n\nconst errorCheck = <T = unknown>(data: T | FetchErrorData, name = ''): 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\nexport interface FetchCountOptions {\n serverURL: string;\n lang: string;\n paths: string[];\n signal: AbortSignal;\n token?: string;\n}\n\nexport const fetchCommentCount = ({\n serverURL,\n lang,\n paths,\n signal,\n token,\n}: FetchCountOptions): Promise<number[]> => {\n const headers: Record<string, string> = {};\n if (token) headers.Authorization = `Bearer ${token}`;\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};\nexport interface FetchRecentOptions {\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}: FetchRecentOptions): Promise<WalineComment[]> => {\n const headers: Record<string, string> = {};\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\nexport interface FetchListOptions {\n serverURL: string;\n path: string;\n page: number;\n pageSize: number;\n signal: AbortSignal;\n token?: string;\n lang: string;\n}\n\nexport interface FetchListResult {\n count: number;\n data: WalineComment[];\n totalPages: number;\n}\n\nexport const fetchCommentList = ({\n serverURL,\n lang,\n path,\n page,\n pageSize,\n signal,\n token,\n}: FetchListOptions): Promise<FetchListResult> => {\n const headers: Record<string, string> = {};\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}`,\n { signal, headers }\n )\n .then((resp) => resp.json() as Promise<FetchListResult>)\n .then((data) => errorCheck(data, 'comment list'));\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 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 const headers: Record<string, string> = {\n Authorization: `Bearer ${token}`,\n };\n\n return fetch(`${serverURL}/comment/${objectId}?lang=${lang}`, {\n method: 'DELETE',\n headers,\n }).then((resp) => resp.json() as Promise<void>);\n};\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 const headers: Record<string, string> = {\n // eslint-disable-next-line @typescript-eslint/naming-convention\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${token}`,\n };\n\n return fetch(`${serverURL}/comment/${objectId}?lang=${lang}`, {\n method: 'PUT',\n headers,\n body: JSON.stringify(data),\n }).then((resp) => resp.json() as Promise<void>);\n};\n\nexport interface FetchPageviewsOptions {\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}: FetchPageviewsOptions): Promise<number[]> =>\n fetch(\n `${serverURL}/article?path=${encodeURIComponent(\n paths.join(',')\n )}&lang=${lang}`,\n { signal }\n )\n .then((resp) => resp.json() as Promise<number[] | number>)\n .then((data) => errorCheck(data, 'visit count'))\n // TODO: Improve this API\n .then((counts) => (Array.isArray(counts) ? counts : [counts]));\n\nexport interface UpdatePageviewsOptions {\n serverURL: string;\n lang: string;\n path: string;\n}\n\nexport const updatePageviews = ({\n serverURL,\n lang,\n path,\n}: UpdatePageviewsOptions): Promise<number> =>\n fetch(`${serverURL}/article?lang=${lang}`, {\n method: 'POST',\n headers: JSON_HEADERS,\n body: JSON.stringify({ path }),\n })\n .then((resp) => resp.json() as Promise<number>)\n .then((data) => errorCheck(data, 'visit count'));\n","export const getQuery = (element: HTMLElement): string | null =>\n element.dataset.path || element.getAttribute('id');\n","import {\n errorHandler,\n fetchPageviews,\n getQuery,\n updatePageviews,\n} from './utils';\n\nimport type { WalineAbort } from './typings';\n\nexport interface WalinePageviewCountOptions {\n /**\n * Waline 服务端地址\n *\n * Waline server url\n */\n serverURL: string;\n\n /**\n * 浏览量 CSS 选择器\n *\n * Pageview CSS selector\n *\n * @default '.waline-pageview-count'\n */\n selector?: string;\n\n /**\n * 需要更新和获取的路径\n *\n * Path to be fetched and updated\n *\n * @default window.location.pathname\n */\n path?: string;\n\n /**\n * 是否在查询时更新 path 的浏览量\n *\n * Whether update pageviews when fetching path result\n *\n * @default true\n */\n update?: boolean;\n\n /**\n * 错误提示消息所使用的语言\n *\n * Language of error message\n *\n * @default 'zh-CN'\n */\n lang?: string;\n}\n\nconst renderVisitorCount = (\n counts: number[],\n countElements: HTMLElement[]\n): void => {\n countElements.forEach((element, index) => {\n element.innerText = counts[index].toString();\n });\n};\n\nexport const pageviewCount = ({\n serverURL,\n path = window.location.pathname,\n selector = '.waline-pageview-count',\n update = true,\n lang = 'zh-CN',\n}: WalinePageviewCountOptions): WalineAbort => {\n const controller = new AbortController();\n\n const elements = Array.from(\n // pageview selectors\n document.querySelectorAll<HTMLElement>(selector)\n );\n\n const filter = (element: HTMLElement): boolean => {\n const query = getQuery(element);\n\n return query !== null && path !== query;\n };\n\n const fetch = (elements: HTMLElement[]): Promise<void> =>\n fetchPageviews({\n serverURL,\n paths: elements.map((element) => getQuery(element) || path),\n lang,\n signal: controller.signal,\n })\n .then((counts) => renderVisitorCount(counts, elements))\n .catch(errorHandler);\n\n // we should update pageviews\n if (update) {\n const normalElements = elements.filter((element) => !filter(element));\n const elementsNeedstoBeFetched = elements.filter(filter);\n\n void updatePageviews({ serverURL, path, lang }).then((count) =>\n renderVisitorCount(\n new Array<number>(normalElements.length).fill(count),\n normalElements\n )\n );\n\n // if we should fetch count of other pages\n if (elementsNeedstoBeFetched.length) {\n void fetch(elementsNeedstoBeFetched);\n }\n }\n // we should not update pageviews\n else {\n void fetch(elements);\n }\n\n return controller.abort.bind(controller);\n};\n"],"names":["version","errorHandler","err","name","console","error","message","JSON_HEADERS","errorCheck","data","errno","TypeError","errmsg","fetchPageviews","serverURL","lang","paths","signal","fetch","encodeURIComponent","join","then","resp","json","counts","Array","isArray","updatePageviews","path","method","headers","body","JSON","stringify","getQuery","element","dataset","getAttribute","renderVisitorCount","countElements","forEach","index","innerText","toString","pageviewCount","window","location","pathname","selector","update","controller","AbortController","elements","from","document","querySelectorAll","filter","query","map","catch","normalElements","elementsNeedstoBeFetched","count","length","fill","abort","bind"],"mappings":"AAEO,MAAMA,EAAU,QCFVC,EAAgBC,IACV,eAAbA,EAAIC,MAAuBC,QAAQC,MAAMH,EAAII,UCM7CC,EAAuC,CAE3C,eAAgB,oBAGZC,EAAa,CAAcC,EAA0BN,EAAO,MAChE,GAAoB,iBAATM,GAAsBA,EAAwBC,MACvD,MAAM,IAAIC,UACR,SAASR,iBAAqBM,EAAwBC,UACnDD,EAAwBG,UAI/B,OAAOH,GAgNII,EAAiB,EAC5BC,UAAAA,EACAC,KAAAA,EACAC,MAAAA,EACAC,OAAAA,KAEAC,MACE,GAAGJ,kBAA0BK,mBAC3BH,EAAMI,KAAK,cACHL,IACV,CAAEE,OAAAA,IAEDI,MAAMC,GAASA,EAAKC,SACpBF,MAAMZ,GAASD,EAAWC,EAAM,iBAEhCY,MAAMG,GAAYC,MAAMC,QAAQF,GAAUA,EAAS,CAACA,KAQ5CG,EAAkB,EAC7Bb,UAAAA,EACAC,KAAAA,EACAa,KAAAA,KAEAV,MAAM,GAAGJ,kBAA0BC,IAAQ,CACzCc,OAAQ,OACRC,QAASvB,EACTwB,KAAMC,KAAKC,UAAU,CAAEL,KAAAA,MAEtBP,MAAMC,GAASA,EAAKC,SACpBF,MAAMZ,GAASD,EAAWC,EAAM,iBCtQxByB,EAAYC,GACvBA,EAAQC,QAAQR,MAAQO,EAAQE,aAAa,MCqDzCC,EAAqB,CACzBd,EACAe,KAEAA,EAAcC,SAAQ,CAACL,EAASM,KAC9BN,EAAQO,UAAYlB,EAAOiB,GAAOE,eAIzBC,EAAgB,EAC3B9B,UAAAA,EACAc,KAAAA,EAAOiB,OAAOC,SAASC,SACvBC,SAAAA,EAAW,yBACXC,OAAAA,GAAS,EACTlC,KAAAA,EAAO,YAEP,MAAMmC,EAAa,IAAIC,gBAEjBC,EAAW3B,MAAM4B,KAErBC,SAASC,iBAA8BP,IAGnCQ,EAAUrB,IACd,MAAMsB,EAAQvB,EAASC,GAEvB,OAAiB,OAAVsB,GAAkB7B,IAAS6B,GAG9BvC,EAASkC,GACbvC,EAAe,CACbC,UAAAA,EACAE,MAAOoC,EAASM,KAAKvB,GAAYD,EAASC,IAAYP,IACtDb,KAAAA,EACAE,OAAQiC,EAAWjC,SAElBI,MAAMG,GAAWc,EAAmBd,EAAQ4B,KAC5CO,MAAM1D,GAGX,GAAIgD,EAAQ,CACV,MAAMW,EAAiBR,EAASI,QAAQrB,IAAaqB,EAAOrB,KACtD0B,EAA2BT,EAASI,OAAOA,GAE5C7B,EAAgB,CAAEb,UAAAA,EAAWc,KAAAA,EAAMb,KAAAA,IAAQM,MAAMyC,GACpDxB,EACE,IAAIb,MAAcmC,EAAeG,QAAQC,KAAKF,GAC9CF,KAKAC,EAAyBE,QACtB7C,EAAM2C,QAKR3C,EAAMkC,GAGb,OAAOF,EAAWe,MAAMC,KAAKhB"}
|
package/dist/pageview.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
!function(e,t){if("function"==typeof define&&define.amd)define("Waline",["exports"],t);else if("undefined"!=typeof exports)t(exports);else{var n={exports:{}};t(n.exports),e.Waline=n.exports}}("undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:this,(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.version=e.pageviewCount=void 0;e.version="2.
|
|
1
|
+
!function(e,t){if("function"==typeof define&&define.amd)define("Waline",["exports"],t);else if("undefined"!=typeof exports)t(exports);else{var n={exports:{}};t(n.exports),e.Waline=n.exports}}("undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:this,(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.version=e.pageviewCount=void 0;e.version="2.4.2";const t=e=>{"AbortError"!==e.name&&console.error(e.message)},n={"Content-Type":"application/json"},o=function(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"";if("object"==typeof e&&e.errno)throw new TypeError("Fetch ".concat(t," failed with ").concat(e.errno,": ").concat(e.errmsg));return e},r=e=>{let{serverURL:t,lang:n,paths:r,signal:a}=e;return fetch("".concat(t,"/article?path=").concat(encodeURIComponent(r.join(",")),"&lang=").concat(n),{signal:a}).then((e=>e.json())).then((e=>o(e,"visit count"))).then((e=>Array.isArray(e)?e:[e]))},a=e=>{let{serverURL:t,lang:r,path:a}=e;return fetch("".concat(t,"/article?lang=").concat(r),{method:"POST",headers:n,body:JSON.stringify({path:a})}).then((e=>e.json())).then((e=>o(e,"visit count")))},i=e=>e.dataset.path||e.getAttribute("id"),l=(e,t)=>{t.forEach(((t,n)=>{t.innerText=e[n].toString()}))};e.pageviewCount=e=>{let{serverURL:n,path:o=window.location.pathname,selector:s=".waline-pageview-count",update:c=!0,lang:h="zh-CN"}=e;const f=new AbortController,p=Array.from(document.querySelectorAll(s)),d=e=>{const t=i(e);return null!==t&&o!==t},g=e=>r({serverURL:n,paths:e.map((e=>i(e)||o)),lang:h,signal:f.signal}).then((t=>l(t,e))).catch(t);if(c){const e=p.filter((e=>!d(e))),t=p.filter(d);a({serverURL:n,path:o,lang:h}).then((t=>l(new Array(e.length).fill(t),e))),t.length&&g(t)}else g(p);return f.abort.bind(f)}}));
|
|
2
2
|
//# sourceMappingURL=pageview.js.map
|
package/dist/pageview.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pageview.js","sources":["../src/version.ts","../src/utils/error.ts","../src/utils/fetch.ts","../src/utils/query.ts","../src/pageview.ts"],"sourcesContent":["declare const VERSION: string;\n\nexport const version = VERSION;\n","export const errorHandler = (err: Error): void => {\n if (err.name !== 'AbortError') console.error(err.message);\n};\n","import type { WalineComment, WalineCommentData } from '../typings';\n\nexport interface FetchErrorData {\n errno: number;\n errmsg: string;\n}\n\nconst errorCheck = <T = unknown>(data: T | FetchErrorData, name = ''): 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\nexport interface FetchCountOptions {\n serverURL: string;\n lang: string;\n paths: string[];\n signal: AbortSignal;\n token?: string;\n}\n\nexport const fetchCommentCount = ({\n serverURL,\n lang,\n paths,\n signal,\n token,\n}: FetchCountOptions): Promise<number[]> => {\n const headers: Record<string, string> = {};\n if (token) headers.Authorization = `Bearer ${token}`;\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};\nexport interface FetchRecentOptions {\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}: FetchRecentOptions): Promise<WalineComment[]> => {\n const headers: Record<string, string> = {};\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\nexport interface FetchListOptions {\n serverURL: string;\n path: string;\n page: number;\n pageSize: number;\n signal: AbortSignal;\n token?: string;\n lang: string;\n}\n\nexport interface FetchListResult {\n count: number;\n data: WalineComment[];\n totalPages: number;\n}\n\nexport const fetchCommentList = ({\n serverURL,\n lang,\n path,\n page,\n pageSize,\n signal,\n token,\n}: FetchListOptions): Promise<FetchListResult> => {\n const headers: Record<string, string> = {};\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}`,\n { signal, headers }\n )\n .then((resp) => resp.json() as Promise<FetchListResult>)\n .then((data) => errorCheck(data, 'comment list'));\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 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 FetchPageviewsOptions {\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}: FetchPageviewsOptions): Promise<number[]> =>\n fetch(\n `${serverURL}/article?path=${encodeURIComponent(\n paths.join(',')\n )}&lang=${lang}`,\n { signal }\n )\n .then((resp) => resp.json() as Promise<number[] | number>)\n .then((data) => errorCheck(data, 'visit count'))\n // TODO: Improve this API\n .then((counts) => (Array.isArray(counts) ? counts : [counts]));\n\nexport interface UpdatePageviewsOptions {\n serverURL: string;\n lang: string;\n path: string;\n}\n\nexport const updatePageviews = ({\n serverURL,\n lang,\n path,\n}: UpdatePageviewsOptions): Promise<number> =>\n fetch(`${serverURL}/article?lang=${lang}`, {\n method: 'POST',\n headers: {\n // eslint-disable-next-line @typescript-eslint/naming-convention\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ path }),\n })\n .then((resp) => resp.json() as Promise<number>)\n .then((data) => errorCheck(data, 'visit count'));\n","export const getQuery = (element: HTMLElement): string | null =>\n element.dataset.path || element.getAttribute('id');\n","import {\n errorHandler,\n fetchPageviews,\n getQuery,\n updatePageviews,\n} from './utils';\n\nimport type { WalineAbort } from './typings';\n\nexport interface WalinePageviewCountOptions {\n /**\n * Waline 服务端地址\n *\n * Waline server url\n */\n serverURL: string;\n\n /**\n * 浏览量 CSS 选择器\n *\n * Pageview CSS selector\n *\n * @default '.waline-pageview-count'\n */\n selector?: string;\n\n /**\n * 需要更新和获取的路径\n *\n * Path to be fetched and updated\n *\n * @default window.location.pathname\n */\n path?: string;\n\n /**\n * 是否在查询时更新 path 的浏览量\n *\n * Whether update pageviews when fetching path result\n *\n * @default true\n */\n update?: boolean;\n\n /**\n * 错误提示消息所使用的语言\n *\n * Language of error message\n *\n * @default 'zh-CN'\n */\n lang?: string;\n}\n\nconst renderVisitorCount = (\n counts: number[],\n countElements: HTMLElement[]\n): void => {\n countElements.forEach((element, index) => {\n element.innerText = counts[index].toString();\n });\n};\n\nexport const pageviewCount = ({\n serverURL,\n path = window.location.pathname,\n selector = '.waline-pageview-count',\n update = true,\n lang = 'zh-CN',\n}: WalinePageviewCountOptions): WalineAbort => {\n const controller = new AbortController();\n\n const elements = Array.from(\n // pageview selectors\n document.querySelectorAll<HTMLElement>(selector)\n );\n\n const filter = (element: HTMLElement): boolean => {\n const query = getQuery(element);\n\n return query !== null && path !== query;\n };\n\n const fetch = (elements: HTMLElement[]): Promise<void> =>\n fetchPageviews({\n serverURL,\n paths: elements.map((element) => getQuery(element) || path),\n lang,\n signal: controller.signal,\n })\n .then((counts) => renderVisitorCount(counts, elements))\n .catch(errorHandler);\n\n // we should update pageviews\n if (update) {\n const normalElements = elements.filter((element) => !filter(element));\n const elementsNeedstoBeFetched = elements.filter(filter);\n\n void updatePageviews({ serverURL, path, lang }).then((count) =>\n renderVisitorCount(\n new Array<number>(normalElements.length).fill(count),\n normalElements\n )\n );\n\n // if we should fetch count of other pages\n if (elementsNeedstoBeFetched.length) {\n void fetch(elementsNeedstoBeFetched);\n }\n }\n // we should not update pageviews\n else {\n void fetch(elements);\n }\n\n return controller.abort.bind(controller);\n};\n"],"names":["errorHandler","err","name","console","error","message","errorCheck","data","errno","TypeError","errmsg","fetchPageviews","_ref","serverURL","lang","paths","signal","fetch","concat","encodeURIComponent","join","then","resp","json","counts","Array","isArray","updatePageviews","_ref2","path","method","headers","body","JSON","stringify","getQuery","element","dataset","getAttribute","renderVisitorCount","countElements","forEach","index","innerText","toString","_ref3","window","location","pathname","selector","update","controller","AbortController","elements","from","document","querySelectorAll","filter","query","map","catch","normalElements","elementsNeedstoBeFetched","count","length","fill","abort","bind"],"mappings":"sXAEuB,QCFhB,MAAMA,EAAgBC,IACV,eAAbA,EAAIC,MAAuBC,QAAQC,MAAMH,EAAII,UCM7CC,EAAa,SAAcC,GAA0C,IAAhBL,yDAAO,GAChE,GAAoB,iBAATK,GAAsBA,EAAwBC,MACvD,MAAM,IAAIC,UACCP,SAAAA,OAAAA,0BAAqBK,EAAwBC,MACnDD,MAAAA,OAAAA,EAAwBG,SAI/B,OAAOH,GAyIII,EAAiBC,IAAA,IAACC,UAC7BA,EAD6BC,KAE7BA,EAF6BC,MAG7BA,EAH6BC,OAI7BA,GAJ4BJ,EAAA,OAM5BK,MAAK,GAAAC,OACAL,EADA,kBAAAK,OAC0BC,mBAC3BJ,EAAMK,KAAK,MAFV,UAAAF,OAGOJ,GACV,CAAEE,OAAAA,IAEDK,MAAMC,GAASA,EAAKC,SACpBF,MAAMd,GAASD,EAAWC,EAAM,iBAEhCc,MAAMG,GAAYC,MAAMC,QAAQF,GAAUA,EAAS,CAACA,MAQ5CG,EAAkBC,IAAA,IAACf,UAC9BA,EAD8BC,KAE9BA,EAF8Be,KAG9BA,GAH6BD,EAAA,OAK7BX,MAAK,GAAAC,OAAIL,EAAJ,kBAAAK,OAA8BJ,GAAQ,CACzCgB,OAAQ,OACRC,QAAS,CAEP,eAAgB,oBAElBC,KAAMC,KAAKC,UAAU,CAAEL,KAAAA,MAEtBR,MAAMC,GAASA,EAAKC,SACpBF,MAAMd,GAASD,EAAWC,EAAM,kBC7LxB4B,EAAYC,GACvBA,EAAQC,QAAQR,MAAQO,EAAQE,aAAa,MCqDzCC,EAAqB,CACzBf,EACAgB,KAEAA,EAAcC,SAAQ,CAACL,EAASM,KAC9BN,EAAQO,UAAYnB,EAAOkB,GAAOE,+BAITC,IAMiB,IANhBhC,UAC5BA,EAD4BgB,KAE5BA,EAAOiB,OAAOC,SAASC,SAFKC,SAG5BA,EAAW,yBAHiBC,OAI5BA,GAAS,EAJmBpC,KAK5BA,EAAO,SACqC+B,EAC5C,MAAMM,EAAa,IAAIC,gBAEjBC,EAAW5B,MAAM6B,KAErBC,SAASC,iBAA8BP,IAGnCQ,EAAUrB,IACd,MAAMsB,EAAQvB,EAASC,GAEvB,OAAiB,OAAVsB,GAAkB7B,IAAS6B,GAG9BzC,EAASoC,GACb1C,EAAe,CACbE,UAAAA,EACAE,MAAOsC,EAASM,KAAKvB,GAAYD,EAASC,IAAYP,IACtDf,KAAAA,EACAE,OAAQmC,EAAWnC,SAElBK,MAAMG,GAAWe,EAAmBf,EAAQ6B,KAC5CO,MAAM5D,GAGX,GAAIkD,EAAQ,CACV,MAAMW,EAAiBR,EAASI,QAAQrB,IAAaqB,EAAOrB,KACtD0B,EAA2BT,EAASI,OAAOA,GAE5C9B,EAAgB,CAAEd,UAAAA,EAAWgB,KAAAA,EAAMf,KAAAA,IAAQO,MAAM0C,GACpDxB,EACE,IAAId,MAAcoC,EAAeG,QAAQC,KAAKF,GAC9CF,KAKAC,EAAyBE,QACtB/C,EAAM6C,QAKR7C,EAAMoC,GAGb,OAAOF,EAAWe,MAAMC,KAAKhB"}
|
|
1
|
+
{"version":3,"file":"pageview.js","sources":["../src/version.ts","../src/utils/error.ts","../src/utils/fetch.ts","../src/utils/query.ts","../src/pageview.ts"],"sourcesContent":["declare const VERSION: string;\n\nexport const version = VERSION;\n","export const errorHandler = (err: Error): void => {\n if (err.name !== 'AbortError') console.error(err.message);\n};\n","import type { WalineComment, WalineCommentData } from '../typings';\n\nexport interface FetchErrorData {\n errno: number;\n errmsg: string;\n}\n\nconst JSON_HEADERS: Record<string, string> = {\n // eslint-disable-next-line @typescript-eslint/naming-convention\n 'Content-Type': 'application/json',\n};\n\nconst errorCheck = <T = unknown>(data: T | FetchErrorData, name = ''): 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\nexport interface FetchCountOptions {\n serverURL: string;\n lang: string;\n paths: string[];\n signal: AbortSignal;\n token?: string;\n}\n\nexport const fetchCommentCount = ({\n serverURL,\n lang,\n paths,\n signal,\n token,\n}: FetchCountOptions): Promise<number[]> => {\n const headers: Record<string, string> = {};\n if (token) headers.Authorization = `Bearer ${token}`;\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};\nexport interface FetchRecentOptions {\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}: FetchRecentOptions): Promise<WalineComment[]> => {\n const headers: Record<string, string> = {};\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\nexport interface FetchListOptions {\n serverURL: string;\n path: string;\n page: number;\n pageSize: number;\n signal: AbortSignal;\n token?: string;\n lang: string;\n}\n\nexport interface FetchListResult {\n count: number;\n data: WalineComment[];\n totalPages: number;\n}\n\nexport const fetchCommentList = ({\n serverURL,\n lang,\n path,\n page,\n pageSize,\n signal,\n token,\n}: FetchListOptions): Promise<FetchListResult> => {\n const headers: Record<string, string> = {};\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}`,\n { signal, headers }\n )\n .then((resp) => resp.json() as Promise<FetchListResult>)\n .then((data) => errorCheck(data, 'comment list'));\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 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 const headers: Record<string, string> = {\n Authorization: `Bearer ${token}`,\n };\n\n return fetch(`${serverURL}/comment/${objectId}?lang=${lang}`, {\n method: 'DELETE',\n headers,\n }).then((resp) => resp.json() as Promise<void>);\n};\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 const headers: Record<string, string> = {\n // eslint-disable-next-line @typescript-eslint/naming-convention\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${token}`,\n };\n\n return fetch(`${serverURL}/comment/${objectId}?lang=${lang}`, {\n method: 'PUT',\n headers,\n body: JSON.stringify(data),\n }).then((resp) => resp.json() as Promise<void>);\n};\n\nexport interface FetchPageviewsOptions {\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}: FetchPageviewsOptions): Promise<number[]> =>\n fetch(\n `${serverURL}/article?path=${encodeURIComponent(\n paths.join(',')\n )}&lang=${lang}`,\n { signal }\n )\n .then((resp) => resp.json() as Promise<number[] | number>)\n .then((data) => errorCheck(data, 'visit count'))\n // TODO: Improve this API\n .then((counts) => (Array.isArray(counts) ? counts : [counts]));\n\nexport interface UpdatePageviewsOptions {\n serverURL: string;\n lang: string;\n path: string;\n}\n\nexport const updatePageviews = ({\n serverURL,\n lang,\n path,\n}: UpdatePageviewsOptions): Promise<number> =>\n fetch(`${serverURL}/article?lang=${lang}`, {\n method: 'POST',\n headers: JSON_HEADERS,\n body: JSON.stringify({ path }),\n })\n .then((resp) => resp.json() as Promise<number>)\n .then((data) => errorCheck(data, 'visit count'));\n","export const getQuery = (element: HTMLElement): string | null =>\n element.dataset.path || element.getAttribute('id');\n","import {\n errorHandler,\n fetchPageviews,\n getQuery,\n updatePageviews,\n} from './utils';\n\nimport type { WalineAbort } from './typings';\n\nexport interface WalinePageviewCountOptions {\n /**\n * Waline 服务端地址\n *\n * Waline server url\n */\n serverURL: string;\n\n /**\n * 浏览量 CSS 选择器\n *\n * Pageview CSS selector\n *\n * @default '.waline-pageview-count'\n */\n selector?: string;\n\n /**\n * 需要更新和获取的路径\n *\n * Path to be fetched and updated\n *\n * @default window.location.pathname\n */\n path?: string;\n\n /**\n * 是否在查询时更新 path 的浏览量\n *\n * Whether update pageviews when fetching path result\n *\n * @default true\n */\n update?: boolean;\n\n /**\n * 错误提示消息所使用的语言\n *\n * Language of error message\n *\n * @default 'zh-CN'\n */\n lang?: string;\n}\n\nconst renderVisitorCount = (\n counts: number[],\n countElements: HTMLElement[]\n): void => {\n countElements.forEach((element, index) => {\n element.innerText = counts[index].toString();\n });\n};\n\nexport const pageviewCount = ({\n serverURL,\n path = window.location.pathname,\n selector = '.waline-pageview-count',\n update = true,\n lang = 'zh-CN',\n}: WalinePageviewCountOptions): WalineAbort => {\n const controller = new AbortController();\n\n const elements = Array.from(\n // pageview selectors\n document.querySelectorAll<HTMLElement>(selector)\n );\n\n const filter = (element: HTMLElement): boolean => {\n const query = getQuery(element);\n\n return query !== null && path !== query;\n };\n\n const fetch = (elements: HTMLElement[]): Promise<void> =>\n fetchPageviews({\n serverURL,\n paths: elements.map((element) => getQuery(element) || path),\n lang,\n signal: controller.signal,\n })\n .then((counts) => renderVisitorCount(counts, elements))\n .catch(errorHandler);\n\n // we should update pageviews\n if (update) {\n const normalElements = elements.filter((element) => !filter(element));\n const elementsNeedstoBeFetched = elements.filter(filter);\n\n void updatePageviews({ serverURL, path, lang }).then((count) =>\n renderVisitorCount(\n new Array<number>(normalElements.length).fill(count),\n normalElements\n )\n );\n\n // if we should fetch count of other pages\n if (elementsNeedstoBeFetched.length) {\n void fetch(elementsNeedstoBeFetched);\n }\n }\n // we should not update pageviews\n else {\n void fetch(elements);\n }\n\n return controller.abort.bind(controller);\n};\n"],"names":["errorHandler","err","name","console","error","message","JSON_HEADERS","errorCheck","data","errno","TypeError","errmsg","fetchPageviews","_ref","serverURL","lang","paths","signal","fetch","concat","encodeURIComponent","join","then","resp","json","counts","Array","isArray","updatePageviews","_ref2","path","method","headers","body","JSON","stringify","getQuery","element","dataset","getAttribute","renderVisitorCount","countElements","forEach","index","innerText","toString","_ref3","window","location","pathname","selector","update","controller","AbortController","elements","from","document","querySelectorAll","filter","query","map","catch","normalElements","elementsNeedstoBeFetched","count","length","fill","abort","bind"],"mappings":"sXAEuB,QCFhB,MAAMA,EAAgBC,IACV,eAAbA,EAAIC,MAAuBC,QAAQC,MAAMH,EAAII,UCM7CC,EAAuC,CAE3C,eAAgB,oBAGZC,EAAa,SAAcC,GAA0C,IAAhBN,yDAAO,GAChE,GAAoB,iBAATM,GAAsBA,EAAwBC,MACvD,MAAM,IAAIC,UACCR,SAAAA,OAAAA,0BAAqBM,EAAwBC,MACnDD,MAAAA,OAAAA,EAAwBG,SAI/B,OAAOH,GAgNII,EAAiBC,IAAA,IAACC,UAC7BA,EAD6BC,KAE7BA,EAF6BC,MAG7BA,EAH6BC,OAI7BA,GAJ4BJ,EAAA,OAM5BK,MAAK,GAAAC,OACAL,EADA,kBAAAK,OAC0BC,mBAC3BJ,EAAMK,KAAK,MAFV,UAAAF,OAGOJ,GACV,CAAEE,OAAAA,IAEDK,MAAMC,GAASA,EAAKC,SACpBF,MAAMd,GAASD,EAAWC,EAAM,iBAEhCc,MAAMG,GAAYC,MAAMC,QAAQF,GAAUA,EAAS,CAACA,MAQ5CG,EAAkBC,IAAA,IAACf,UAC9BA,EAD8BC,KAE9BA,EAF8Be,KAG9BA,GAH6BD,EAAA,OAK7BX,MAAK,GAAAC,OAAIL,EAAJ,kBAAAK,OAA8BJ,GAAQ,CACzCgB,OAAQ,OACRC,QAAS1B,EACT2B,KAAMC,KAAKC,UAAU,CAAEL,KAAAA,MAEtBR,MAAMC,GAASA,EAAKC,SACpBF,MAAMd,GAASD,EAAWC,EAAM,kBCtQxB4B,EAAYC,GACvBA,EAAQC,QAAQR,MAAQO,EAAQE,aAAa,MCqDzCC,EAAqB,CACzBf,EACAgB,KAEAA,EAAcC,SAAQ,CAACL,EAASM,KAC9BN,EAAQO,UAAYnB,EAAOkB,GAAOE,+BAITC,IAMiB,IANhBhC,UAC5BA,EAD4BgB,KAE5BA,EAAOiB,OAAOC,SAASC,SAFKC,SAG5BA,EAAW,yBAHiBC,OAI5BA,GAAS,EAJmBpC,KAK5BA,EAAO,SACqC+B,EAC5C,MAAMM,EAAa,IAAIC,gBAEjBC,EAAW5B,MAAM6B,KAErBC,SAASC,iBAA8BP,IAGnCQ,EAAUrB,IACd,MAAMsB,EAAQvB,EAASC,GAEvB,OAAiB,OAAVsB,GAAkB7B,IAAS6B,GAG9BzC,EAASoC,GACb1C,EAAe,CACbE,UAAAA,EACAE,MAAOsC,EAASM,KAAKvB,GAAYD,EAASC,IAAYP,IACtDf,KAAAA,EACAE,OAAQmC,EAAWnC,SAElBK,MAAMG,GAAWe,EAAmBf,EAAQ6B,KAC5CO,MAAM7D,GAGX,GAAImD,EAAQ,CACV,MAAMW,EAAiBR,EAASI,QAAQrB,IAAaqB,EAAOrB,KACtD0B,EAA2BT,EAASI,OAAOA,GAE5C9B,EAAgB,CAAEd,UAAAA,EAAWgB,KAAAA,EAAMf,KAAAA,IAAQO,MAAM0C,GACpDxB,EACE,IAAId,MAAcoC,EAAeG,QAAQC,KAAKF,GAC9CF,KAKAC,EAAyBE,QACtB/C,EAAM6C,QAKR7C,EAAMoC,GAGb,OAAOF,EAAWe,MAAMC,KAAKhB"}
|
package/dist/shim.d.ts
CHANGED
|
@@ -43,20 +43,57 @@ declare type WalineHighlighter = (code: string, lang: string) => string;
|
|
|
43
43
|
declare type WalineTexRenderer = (blockMode: boolean, tex: string) => string;
|
|
44
44
|
|
|
45
45
|
interface WalineCommentData {
|
|
46
|
+
/**
|
|
47
|
+
* User Nickname
|
|
48
|
+
*/
|
|
46
49
|
nick: string;
|
|
50
|
+
/**
|
|
51
|
+
* User email
|
|
52
|
+
*/
|
|
47
53
|
mail: string;
|
|
54
|
+
/**
|
|
55
|
+
* User link
|
|
56
|
+
*/
|
|
48
57
|
link?: string;
|
|
58
|
+
/**
|
|
59
|
+
* Content of comment
|
|
60
|
+
*/
|
|
49
61
|
comment: string;
|
|
62
|
+
/**
|
|
63
|
+
* User Agent
|
|
64
|
+
*/
|
|
50
65
|
ua: string;
|
|
66
|
+
/**
|
|
67
|
+
* Parent comment id
|
|
68
|
+
*/
|
|
51
69
|
pid?: string;
|
|
70
|
+
/**
|
|
71
|
+
* Root comment id
|
|
72
|
+
*/
|
|
52
73
|
rid?: string;
|
|
74
|
+
/**
|
|
75
|
+
* User id being at
|
|
76
|
+
*/
|
|
53
77
|
at?: string;
|
|
78
|
+
/**
|
|
79
|
+
* Comment link
|
|
80
|
+
*/
|
|
54
81
|
url: string;
|
|
55
82
|
}
|
|
83
|
+
declare type WalineCommentStatus = 'approved' | 'waiting' | 'spam';
|
|
56
84
|
interface WalineComment extends Exclude<WalineCommentData, 'ua'> {
|
|
85
|
+
/**
|
|
86
|
+
* User avatar
|
|
87
|
+
*/
|
|
57
88
|
avatar: string;
|
|
58
|
-
|
|
89
|
+
/**
|
|
90
|
+
* User type
|
|
91
|
+
*/
|
|
92
|
+
type?: 'administrator' | 'guest' | `verify:${string}`;
|
|
59
93
|
objectId: string;
|
|
94
|
+
/**
|
|
95
|
+
* Time ISOString when the comment is created
|
|
96
|
+
*/
|
|
60
97
|
createdAt: string;
|
|
61
98
|
insertedAt: string;
|
|
62
99
|
updatedAt: string;
|
|
@@ -67,6 +104,9 @@ interface WalineComment extends Exclude<WalineCommentData, 'ua'> {
|
|
|
67
104
|
level?: number;
|
|
68
105
|
addr?: string;
|
|
69
106
|
label?: string;
|
|
107
|
+
user_id?: string | number;
|
|
108
|
+
status?: WalineCommentStatus;
|
|
109
|
+
like?: number;
|
|
70
110
|
}
|
|
71
111
|
|
|
72
112
|
interface WalineDateLocale {
|
|
@@ -76,14 +116,7 @@ interface WalineDateLocale {
|
|
|
76
116
|
days: string;
|
|
77
117
|
now: string;
|
|
78
118
|
}
|
|
79
|
-
|
|
80
|
-
level0: string;
|
|
81
|
-
level1: string;
|
|
82
|
-
level2: string;
|
|
83
|
-
level3: string;
|
|
84
|
-
level4: string;
|
|
85
|
-
level5: string;
|
|
86
|
-
}
|
|
119
|
+
declare type WalineLevelLocale = Record<`level${number}`, string>;
|
|
87
120
|
interface WalineLocale extends WalineDateLocale, WalineLevelLocale {
|
|
88
121
|
nick: string;
|
|
89
122
|
nickError: string;
|
|
@@ -94,6 +127,8 @@ interface WalineLocale extends WalineDateLocale, WalineLevelLocale {
|
|
|
94
127
|
placeholder: string;
|
|
95
128
|
sofa: string;
|
|
96
129
|
submit: string;
|
|
130
|
+
like: string;
|
|
131
|
+
cancelLike: string;
|
|
97
132
|
reply: string;
|
|
98
133
|
cancelReply: string;
|
|
99
134
|
comment: string;
|
|
@@ -240,7 +275,7 @@ interface WalineProps {
|
|
|
240
275
|
*
|
|
241
276
|
* Set Emojis
|
|
242
277
|
*
|
|
243
|
-
* @default ['
|
|
278
|
+
* @default ['//unpkg.com/@waline/emojis@1.0.1/weibo']
|
|
244
279
|
*/
|
|
245
280
|
emoji?: (string | WalineEmojiInfo)[] | false;
|
|
246
281
|
/**
|
|
@@ -489,4 +524,4 @@ interface WalineRecentCommentsResult {
|
|
|
489
524
|
}
|
|
490
525
|
declare const RecentComments: ({ el, serverURL, count, lang, }: WalineRecentCommentsOptions) => Promise<WalineRecentCommentsResult>;
|
|
491
526
|
|
|
492
|
-
export { RecentComments, WalineAbort, WalineComment, WalineCommentCountOptions, WalineCommentData, WalineDateLocale, WalineEmojiInfo, WalineEmojiMaps, WalineHighlighter, WalineImageUploader, WalineInitOptions, WalineInstance, WalineLevelLocale, WalineLocale, WalineMeta, WalinePageviewCountOptions, WalineProps, WalineRecentCommentsOptions, WalineRecentCommentsResult, WalineTexRenderer, commentCount, defaultLocales, init, pageviewCount, version };
|
|
527
|
+
export { RecentComments, WalineAbort, WalineComment, WalineCommentCountOptions, WalineCommentData, WalineCommentStatus, WalineDateLocale, WalineEmojiInfo, WalineEmojiMaps, WalineHighlighter, WalineImageUploader, WalineInitOptions, WalineInstance, WalineLevelLocale, WalineLocale, WalineMeta, WalinePageviewCountOptions, WalineProps, WalineRecentCommentsOptions, WalineRecentCommentsResult, WalineTexRenderer, commentCount, defaultLocales, init, pageviewCount, version };
|
package/dist/shim.esm.d.ts
CHANGED
|
@@ -43,20 +43,57 @@ declare type WalineHighlighter = (code: string, lang: string) => string;
|
|
|
43
43
|
declare type WalineTexRenderer = (blockMode: boolean, tex: string) => string;
|
|
44
44
|
|
|
45
45
|
interface WalineCommentData {
|
|
46
|
+
/**
|
|
47
|
+
* User Nickname
|
|
48
|
+
*/
|
|
46
49
|
nick: string;
|
|
50
|
+
/**
|
|
51
|
+
* User email
|
|
52
|
+
*/
|
|
47
53
|
mail: string;
|
|
54
|
+
/**
|
|
55
|
+
* User link
|
|
56
|
+
*/
|
|
48
57
|
link?: string;
|
|
58
|
+
/**
|
|
59
|
+
* Content of comment
|
|
60
|
+
*/
|
|
49
61
|
comment: string;
|
|
62
|
+
/**
|
|
63
|
+
* User Agent
|
|
64
|
+
*/
|
|
50
65
|
ua: string;
|
|
66
|
+
/**
|
|
67
|
+
* Parent comment id
|
|
68
|
+
*/
|
|
51
69
|
pid?: string;
|
|
70
|
+
/**
|
|
71
|
+
* Root comment id
|
|
72
|
+
*/
|
|
52
73
|
rid?: string;
|
|
74
|
+
/**
|
|
75
|
+
* User id being at
|
|
76
|
+
*/
|
|
53
77
|
at?: string;
|
|
78
|
+
/**
|
|
79
|
+
* Comment link
|
|
80
|
+
*/
|
|
54
81
|
url: string;
|
|
55
82
|
}
|
|
83
|
+
declare type WalineCommentStatus = 'approved' | 'waiting' | 'spam';
|
|
56
84
|
interface WalineComment extends Exclude<WalineCommentData, 'ua'> {
|
|
85
|
+
/**
|
|
86
|
+
* User avatar
|
|
87
|
+
*/
|
|
57
88
|
avatar: string;
|
|
58
|
-
|
|
89
|
+
/**
|
|
90
|
+
* User type
|
|
91
|
+
*/
|
|
92
|
+
type?: 'administrator' | 'guest' | `verify:${string}`;
|
|
59
93
|
objectId: string;
|
|
94
|
+
/**
|
|
95
|
+
* Time ISOString when the comment is created
|
|
96
|
+
*/
|
|
60
97
|
createdAt: string;
|
|
61
98
|
insertedAt: string;
|
|
62
99
|
updatedAt: string;
|
|
@@ -67,6 +104,9 @@ interface WalineComment extends Exclude<WalineCommentData, 'ua'> {
|
|
|
67
104
|
level?: number;
|
|
68
105
|
addr?: string;
|
|
69
106
|
label?: string;
|
|
107
|
+
user_id?: string | number;
|
|
108
|
+
status?: WalineCommentStatus;
|
|
109
|
+
like?: number;
|
|
70
110
|
}
|
|
71
111
|
|
|
72
112
|
interface WalineDateLocale {
|
|
@@ -76,14 +116,7 @@ interface WalineDateLocale {
|
|
|
76
116
|
days: string;
|
|
77
117
|
now: string;
|
|
78
118
|
}
|
|
79
|
-
|
|
80
|
-
level0: string;
|
|
81
|
-
level1: string;
|
|
82
|
-
level2: string;
|
|
83
|
-
level3: string;
|
|
84
|
-
level4: string;
|
|
85
|
-
level5: string;
|
|
86
|
-
}
|
|
119
|
+
declare type WalineLevelLocale = Record<`level${number}`, string>;
|
|
87
120
|
interface WalineLocale extends WalineDateLocale, WalineLevelLocale {
|
|
88
121
|
nick: string;
|
|
89
122
|
nickError: string;
|
|
@@ -94,6 +127,8 @@ interface WalineLocale extends WalineDateLocale, WalineLevelLocale {
|
|
|
94
127
|
placeholder: string;
|
|
95
128
|
sofa: string;
|
|
96
129
|
submit: string;
|
|
130
|
+
like: string;
|
|
131
|
+
cancelLike: string;
|
|
97
132
|
reply: string;
|
|
98
133
|
cancelReply: string;
|
|
99
134
|
comment: string;
|
|
@@ -240,7 +275,7 @@ interface WalineProps {
|
|
|
240
275
|
*
|
|
241
276
|
* Set Emojis
|
|
242
277
|
*
|
|
243
|
-
* @default ['
|
|
278
|
+
* @default ['//unpkg.com/@waline/emojis@1.0.1/weibo']
|
|
244
279
|
*/
|
|
245
280
|
emoji?: (string | WalineEmojiInfo)[] | false;
|
|
246
281
|
/**
|
|
@@ -489,4 +524,4 @@ interface WalineRecentCommentsResult {
|
|
|
489
524
|
}
|
|
490
525
|
declare const RecentComments: ({ el, serverURL, count, lang, }: WalineRecentCommentsOptions) => Promise<WalineRecentCommentsResult>;
|
|
491
526
|
|
|
492
|
-
export { RecentComments, WalineAbort, WalineComment, WalineCommentCountOptions, WalineCommentData, WalineDateLocale, WalineEmojiInfo, WalineEmojiMaps, WalineHighlighter, WalineImageUploader, WalineInitOptions, WalineInstance, WalineLevelLocale, WalineLocale, WalineMeta, WalinePageviewCountOptions, WalineProps, WalineRecentCommentsOptions, WalineRecentCommentsResult, WalineTexRenderer, commentCount, defaultLocales, init, pageviewCount, version };
|
|
527
|
+
export { RecentComments, WalineAbort, WalineComment, WalineCommentCountOptions, WalineCommentData, WalineCommentStatus, WalineDateLocale, WalineEmojiInfo, WalineEmojiMaps, WalineHighlighter, WalineImageUploader, WalineInitOptions, WalineInstance, WalineLevelLocale, WalineLocale, WalineMeta, WalinePageviewCountOptions, WalineProps, WalineRecentCommentsOptions, WalineRecentCommentsResult, WalineTexRenderer, commentCount, defaultLocales, init, pageviewCount, version };
|