@waline/client 3.0.0-alpha.1 → 3.0.0-alpha.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/comment.cjs +1 -1
- package/dist/comment.cjs.map +1 -1
- package/dist/comment.js +1 -1
- package/dist/comment.js.map +1 -1
- package/dist/comment.mjs +1 -1
- package/dist/comment.mjs.map +1 -1
- package/dist/component.mjs +1 -1
- package/dist/component.mjs.map +1 -1
- package/dist/pageview.cjs +1 -1
- package/dist/pageview.cjs.map +1 -1
- package/dist/pageview.js +1 -1
- package/dist/pageview.js.map +1 -1
- package/dist/pageview.mjs +1 -1
- package/dist/pageview.mjs.map +1 -1
- package/dist/shim.cjs +1 -1
- package/dist/shim.cjs.map +1 -1
- package/dist/shim.mjs +1 -1
- package/dist/shim.mjs.map +1 -1
- package/dist/waline.cjs +18 -18
- package/dist/waline.cjs.map +1 -1
- package/dist/waline.js +19 -19
- package/dist/waline.js.map +1 -1
- package/dist/waline.mjs +18 -18
- package/dist/waline.mjs.map +1 -1
- package/package.json +10 -10
package/dist/comment.cjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";const i=e=>`${e.replace(/\/?$/,"/")}api/`,h=(e,t="")=>{if(typeof e=="object"&&e.errno)throw new TypeError(`${t} failed with ${e.errno}: ${e.errmsg}`);return e},m=({serverURL:e,lang:t,paths:r,signal:o})=>fetch(`${i(e)}comment?type=count&url=${encodeURIComponent(r.join(","))}&lang=${t}`,{signal:o}).then(n=>n.json()).then(n=>h(n,"Get comment count").data),g=e=>{try{e=decodeURI(e)}catch{}return e},p=(e="")=>e.replace(/\/$/u,""),u=e=>/^(https?:)?\/\//.test(e),d=e=>{const t=p(e);return u(t)?t:`https://${t}`},$=e=>{e.name!=="AbortError"&&console.error(e.message)},v=e=>e.dataset.path||null,f=({serverURL:e,path:t=window.location.pathname,selector:r=".waline-comment-count",lang:o=navigator.language})=>{const n=new AbortController,a=document.querySelectorAll(r);return a.length&&m({serverURL:d(e),paths:Array.from(a).map(c=>g(v(c)||t)),lang:o,signal:n.signal}).then(c=>{a.forEach((s,l)=>{s.innerText=c[l].toString()})}).catch($),n.abort.bind(n)},w="3.0.0-alpha.
|
|
1
|
+
"use strict";const i=e=>`${e.replace(/\/?$/,"/")}api/`,h=(e,t="")=>{if(typeof e=="object"&&e.errno)throw new TypeError(`${t} failed with ${e.errno}: ${e.errmsg}`);return e},m=({serverURL:e,lang:t,paths:r,signal:o})=>fetch(`${i(e)}comment?type=count&url=${encodeURIComponent(r.join(","))}&lang=${t}`,{signal:o}).then(n=>n.json()).then(n=>h(n,"Get comment count").data),g=e=>{try{e=decodeURI(e)}catch{}return e},p=(e="")=>e.replace(/\/$/u,""),u=e=>/^(https?:)?\/\//.test(e),d=e=>{const t=p(e);return u(t)?t:`https://${t}`},$=e=>{e.name!=="AbortError"&&console.error(e.message)},v=e=>e.dataset.path||null,f=({serverURL:e,path:t=window.location.pathname,selector:r=".waline-comment-count",lang:o=navigator.language})=>{const n=new AbortController,a=document.querySelectorAll(r);return a.length&&m({serverURL:d(e),paths:Array.from(a).map(c=>g(v(c)||t)),lang:o,signal:n.signal}).then(c=>{a.forEach((s,l)=>{s.innerText=c[l].toString()})}).catch($),n.abort.bind(n)},w="3.0.0-alpha.2";exports.commentCount=f,exports.version=w;
|
|
2
2
|
//# sourceMappingURL=comment.cjs.map
|
package/dist/comment.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"comment.cjs","sources":["../../api/dist/api.mjs","../src/utils/path.ts","../src/utils/config.ts","../src/utils/error.ts","../src/utils/query.ts","../src/comment.ts","../src/version.ts"],"sourcesContent":["const m={\"Content-Type\":\"application/json\"},s=t=>`${t.replace(/\\/?$/,\"/\")}api/`,h=(t,n=\"\")=>{if(typeof t==\"object\"&&t.errno)throw new TypeError(`${n} failed with ${t.errno}: ${t.errmsg}`);return t},p=({serverURL:t,lang:n,paths:o,type:a,signal:e})=>fetch(`${s(t)}article?path=${encodeURIComponent(o.join(\",\"))}&type=${encodeURIComponent(a.join(\",\"))}&lang=${n}`,{signal:e}).then(r=>r.json()),d=({serverURL:t,lang:n,path:o,type:a,action:e})=>fetch(`${s(t)}article?lang=${n}`,{method:\"POST\",headers:m,body:JSON.stringify({path:o,type:a,action:e})}).then(r=>r.json()).then(r=>h(r,\"Update counter\").data),$=({serverURL:t,lang:n,path:o,page:a,pageSize:e,sortBy:r,signal:c,token:i})=>{const l={};return i&&(l.Authorization=`Bearer ${i}`),fetch(`${s(t)}comment?path=${encodeURIComponent(o)}&pageSize=${e}&page=${a}&lang=${n}&sortBy=${r}`,{signal:c,headers:l}).then(g=>g.json()).then(g=>h(g,\"Get comment data\").data)},u=({serverURL:t,lang:n,token:o,comment:a})=>{const e={\"Content-Type\":\"application/json\"};return o&&(e.Authorization=`Bearer ${o}`),fetch(`${s(t)}comment?lang=${n}`,{method:\"POST\",headers:e,body:JSON.stringify(a)}).then(r=>r.json())},y=({serverURL:t,lang:n,token:o,objectId:a})=>fetch(`${s(t)}comment/${a}?lang=${n}`,{method:\"DELETE\",headers:{Authorization:`Bearer ${o}`}}).then(e=>e.json()).then(e=>h(e,\"Delete comment\")),U=({serverURL:t,lang:n,token:o,objectId:a,comment:e})=>fetch(`${s(t)}comment/${a}?lang=${n}`,{method:\"PUT\",headers:{...m,Authorization:`Bearer ${o}`},body:JSON.stringify(e)}).then(r=>r.json()).then(r=>h(r,\"Update comment\")),f=({serverURL:t,lang:n,paths:o,signal:a})=>fetch(`${s(t)}comment?type=count&url=${encodeURIComponent(o.join(\",\"))}&lang=${n}`,{signal:a}).then(e=>e.json()).then(e=>h(e,\"Get comment count\").data),R=({lang:t,serverURL:n})=>{const o=(window.innerWidth-450)/2,a=(window.innerHeight-450)/2,e=window.open(`${n.replace(/\\/$/,\"\")}/ui/login?lng=${encodeURIComponent(t)}`,\"_blank\",`width=450,height=450,left=${o},top=${a},scrollbars=no,resizable=no,status=no,location=no,toolbar=no,menubar=no`);return e?.postMessage({type:\"TOKEN\",data:null},\"*\"),new Promise(r=>{const c=({data:i})=>{!i||typeof i!=\"object\"||i.type!==\"userInfo\"||i.data.token&&(e?.close(),window.removeEventListener(\"message\",c),r(i.data))};window.addEventListener(\"message\",c)})},j=({serverURL:t,lang:n,paths:o,signal:a})=>p({serverURL:t,lang:n,paths:o,type:[\"time\"],signal:a}).then(e=>Array.isArray(e)?e:[e]),v=t=>d({...t,type:\"time\",action:\"inc\"}),w=({serverURL:t,lang:n,count:o,signal:a,token:e})=>{const r={};return e&&(r.Authorization=`Bearer ${e}`),fetch(`${s(t)}comment?type=recent&count=${o}&lang=${n}`,{signal:a,headers:r}).then(c=>c.json())},C=({serverURL:t,signal:n,pageSize:o,lang:a})=>fetch(`${s(t)}user?pageSize=${o}&lang=${a}`,{signal:n}).then(e=>e.json()).then(e=>h(e,\"user list\")).then(e=>e.data);export{u as addComment,y as deleteComment,f as fetchCommentCount,p as getArticleCounter,$ as getComment,j as getPageview,w as getRecentComment,C as getUserList,R as login,d as updateArticleCounter,U as updateComment,v as updatePageview};\n//# sourceMappingURL=api.mjs.map\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","import { decodePath, isLinkHttp, removeEndingSplash } from './path.js';\nimport {\n DEFAULT_EMOJI,\n DEFAULT_LANG,\n DEFAULT_LOCALES,\n DEFAULT_REACTION,\n defaultUploadImage,\n defaultHighlighter,\n defaultTeXRenderer,\n getDefaultSearchOptions,\n getMeta,\n} from '../config/index.js';\nimport {\n type WalineEmojiInfo,\n type WalineEmojiMaps,\n type WalineLocale,\n type WalineProps,\n} from '../typings/index.js';\n\nexport interface WalineEmojiConfig {\n tabs: Pick<WalineEmojiInfo, 'name' | 'icon' | 'items'>[];\n map: WalineEmojiMaps;\n}\n\nexport interface WalineConfig\n extends Required<\n Omit<\n WalineProps,\n | 'emoji'\n | 'imageUploader'\n | 'highlighter'\n | 'texRenderer'\n | 'wordLimit'\n | 'reaction'\n | 'search'\n >\n > {\n locale: WalineLocale;\n wordLimit: [number, number] | false;\n reaction: string[];\n emoji: Exclude<WalineProps['emoji'], boolean | undefined>;\n highlighter: Exclude<WalineProps['highlighter'], true | undefined>;\n imageUploader: Exclude<WalineProps['imageUploader'], true | undefined>;\n texRenderer: Exclude<WalineProps['texRenderer'], true | undefined>;\n search: Exclude<WalineProps['search'], true | undefined>;\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 | boolean | 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 = typeof navigator === 'undefined' ? 'en-US' : navigator.language,\n locale,\n emoji = DEFAULT_EMOJI,\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 turnstileKey = '',\n commentSorting = 'latest',\n ...more\n}: WalineProps): WalineConfig => ({\n serverURL: getServerURL(serverURL),\n path: decodePath(path),\n locale: {\n ...(DEFAULT_LOCALES[lang] || DEFAULT_LOCALES[DEFAULT_LANG]),\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: Object.keys(DEFAULT_LOCALES).includes(lang) ? lang : 'en-US',\n dark,\n emoji: typeof emoji === 'boolean' ? (emoji ? DEFAULT_EMOJI : []) : emoji,\n pageSize,\n login,\n copyright,\n search:\n search === false\n ? false\n : typeof search === 'object'\n ? search\n : getDefaultSearchOptions(lang),\n recaptchaV3Key,\n turnstileKey,\n reaction: Array.isArray(reaction)\n ? reaction\n : reaction === true\n ? DEFAULT_REACTION\n : [],\n commentSorting,\n ...more,\n});\n","export const errorHandler = (err: Error): void => {\n if (err.name !== 'AbortError') console.error(err.message);\n};\n","export const getQuery = (element: HTMLElement): string | null =>\n element.dataset.path || null;\n","import { fetchCommentCount } from '@waline/api';\n\nimport { type WalineAbort } from './typings/index.js';\nimport {\n decodePath,\n errorHandler,\n getQuery,\n getServerURL,\n} from './utils/index.js';\n\nexport interface WalineCommentCountOptions {\n /**\n * Waline 服务端地址\n *\n * Waline server url\n */\n serverURL: string;\n\n /**\n * 评论数 CSS 选择器\n *\n * Comment count CSS selector\n *\n * @default '.waline-comment-count'\n */\n selector?: string;\n\n /**\n * 需要获取的默认路径\n *\n * Path to be fetched by default\n *\n * @default window.location.pathname\n */\n path?: string;\n\n /**\n * 错误提示消息所使用的语言\n *\n * Language of error message\n *\n * @default navigator.language\n */\n lang?: string;\n}\n\nexport { type WalineAbort } from './typings/index.js';\n\nexport const commentCount = ({\n serverURL,\n path = window.location.pathname,\n selector = '.waline-comment-count',\n lang = navigator.language,\n}: WalineCommentCountOptions): 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(getQuery(element) || 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":["s","t","n","f","o","a","e","decodePath","path","removeEndingSplash","content","isLinkHttp","link","getServerURL","serverURL","result","errorHandler","err","getQuery","element","commentCount","selector","lang","controller","elements","fetchCommentCount","counts","index","version"],"mappings":"aAAK,MAAuCA,EAAEC,GAAG,GAAGA,EAAE,QAAQ,OAAO,GAAG,CAAC,OAAO,EAAE,CAACA,EAAEC,EAAE,KAAK,CAAC,GAAG,OAAOD,GAAG,UAAUA,EAAE,MAAM,MAAM,IAAI,UAAU,GAAGC,CAAC,gBAAgBD,EAAE,KAAK,KAAKA,EAAE,MAAM,EAAE,EAAE,OAAOA,CAAC,EAA+0CE,EAAE,CAAC,CAAC,UAAUF,EAAE,KAAKC,EAAE,MAAME,EAAE,OAAOC,CAAC,IAAI,MAAM,GAAGL,EAAEC,CAAC,CAAC,0BAA0B,mBAAmBG,EAAE,KAAK,GAAG,CAAC,CAAC,SAASF,CAAC,GAAG,CAAC,OAAOG,CAAC,CAAC,EAAE,KAAKC,GAAGA,EAAE,KAAM,CAAA,EAAE,KAAKA,GAAG,EAAEA,EAAE,mBAAmB,EAAE,IAAI,ECAvsDC,EAAcC,GAAyB,CAClD,GAAI,CACFA,EAAO,UAAUA,CAAI,CACvB,MAAc,CAAA,CAId,OAAOA,CACT,EAEaC,EAAqB,CAACC,EAAU,KAC3CA,EAAQ,QAAQ,OAAQ,EAAE,EAEfC,EAAcC,GACzB,kBAAkB,KAAKA,CAAI,ECiChBC,EAAgBC,GAA8B,CACzD,MAAMC,EAASN,EAAmBK,CAAS,EAE3C,OAAOH,EAAWI,CAAM,EAAIA,EAAS,WAAWA,CAAM,EACxD,ECnDaC,EAAgBC,GAAqB,CAC5CA,EAAI,OAAS,cAAc,QAAQ,MAAMA,EAAI,OAAO,CAC1D,ECFaC,EAAYC,GACvBA,EAAQ,QAAQ,MAAQ,KC+CbC,EAAe,CAAC,CAC3B,UAAAN,EACA,KAAAN,EAAO,OAAO,SAAS,SACvB,SAAAa,EAAW,wBACX,KAAAC,EAAO,UAAU,QACnB,IAA8C,CAC5C,MAAMC,EAAa,IAAI,gBAGjBC,EAAW,SAAS,iBAA8BH,CAAQ,EAEhE,OAAIG,EAAS,QACNC,EAAkB,CACrB,UAAWZ,EAAaC,CAAS,EACjC,MAAO,MAAM,KAAKU,CAAQ,EAAE,IAAKL,GAC/BZ,EAAWW,EAASC,CAAO,GAAKX,CAAI,CACtC,EACA,KAAAc,EACA,OAAQC,EAAW,MACrB,CAAC,EACE,KAAMG,GAAW,CAChBF,EAAS,QAAQ,CAACL,EAASQ,IAAU,CACnCR,EAAQ,UAAYO,EAAOC,CAAK,EAAE,SAAS,CAC7C,CAAC,CACH,CAAC,EACA,MAAMX,CAAY,EAEhBO,EAAW,MAAM,KAAKA,CAAU,CACzC,EC1EaK,EAAU"}
|
|
1
|
+
{"version":3,"file":"comment.cjs","sources":["../../api/dist/api.mjs","../src/utils/path.ts","../src/utils/config.ts","../src/utils/error.ts","../src/utils/query.ts","../src/comment.ts","../src/version.ts"],"sourcesContent":["const m={\"Content-Type\":\"application/json\"},s=t=>`${t.replace(/\\/?$/,\"/\")}api/`,h=(t,n=\"\")=>{if(typeof t==\"object\"&&t.errno)throw new TypeError(`${n} failed with ${t.errno}: ${t.errmsg}`);return t},p=({serverURL:t,lang:n,paths:o,type:a,signal:e})=>fetch(`${s(t)}article?path=${encodeURIComponent(o.join(\",\"))}&type=${encodeURIComponent(a.join(\",\"))}&lang=${n}`,{signal:e}).then(r=>r.json()),d=({serverURL:t,lang:n,path:o,type:a,action:e})=>fetch(`${s(t)}article?lang=${n}`,{method:\"POST\",headers:m,body:JSON.stringify({path:o,type:a,action:e})}).then(r=>r.json()).then(r=>h(r,\"Update counter\").data),$=({serverURL:t,lang:n,path:o,page:a,pageSize:e,sortBy:r,signal:c,token:i})=>{const l={};return i&&(l.Authorization=`Bearer ${i}`),fetch(`${s(t)}comment?path=${encodeURIComponent(o)}&pageSize=${e}&page=${a}&lang=${n}&sortBy=${r}`,{signal:c,headers:l}).then(g=>g.json()).then(g=>h(g,\"Get comment data\").data)},u=({serverURL:t,lang:n,token:o,comment:a})=>{const e={\"Content-Type\":\"application/json\"};return o&&(e.Authorization=`Bearer ${o}`),fetch(`${s(t)}comment?lang=${n}`,{method:\"POST\",headers:e,body:JSON.stringify(a)}).then(r=>r.json())},y=({serverURL:t,lang:n,token:o,objectId:a})=>fetch(`${s(t)}comment/${a}?lang=${n}`,{method:\"DELETE\",headers:{Authorization:`Bearer ${o}`}}).then(e=>e.json()).then(e=>h(e,\"Delete comment\")),U=({serverURL:t,lang:n,token:o,objectId:a,comment:e})=>fetch(`${s(t)}comment/${a}?lang=${n}`,{method:\"PUT\",headers:{...m,Authorization:`Bearer ${o}`},body:JSON.stringify(e)}).then(r=>r.json()).then(r=>h(r,\"Update comment\")),f=({serverURL:t,lang:n,paths:o,signal:a})=>fetch(`${s(t)}comment?type=count&url=${encodeURIComponent(o.join(\",\"))}&lang=${n}`,{signal:a}).then(e=>e.json()).then(e=>h(e,\"Get comment count\").data),R=({lang:t,serverURL:n})=>{const o=(window.innerWidth-450)/2,a=(window.innerHeight-450)/2,e=window.open(`${n.replace(/\\/$/,\"\")}/ui/login?lng=${encodeURIComponent(t)}`,\"_blank\",`width=450,height=450,left=${o},top=${a},scrollbars=no,resizable=no,status=no,location=no,toolbar=no,menubar=no`);return e?.postMessage({type:\"TOKEN\",data:null},\"*\"),new Promise(r=>{const c=({data:i})=>{!i||typeof i!=\"object\"||i.type!==\"userInfo\"||i.data.token&&(e?.close(),window.removeEventListener(\"message\",c),r(i.data))};window.addEventListener(\"message\",c)})},j=({serverURL:t,lang:n,paths:o,signal:a})=>p({serverURL:t,lang:n,paths:o,type:[\"time\"],signal:a}).then(e=>Array.isArray(e)?e:[e]),v=t=>d({...t,type:\"time\",action:\"inc\"}),w=({serverURL:t,lang:n,count:o,signal:a,token:e})=>{const r={};return e&&(r.Authorization=`Bearer ${e}`),fetch(`${s(t)}comment?type=recent&count=${o}&lang=${n}`,{signal:a,headers:r}).then(c=>c.json())},C=({serverURL:t,signal:n,pageSize:o,lang:a})=>fetch(`${s(t)}user?pageSize=${o}&lang=${a}`,{signal:n}).then(e=>e.json()).then(e=>h(e,\"user list\")).then(e=>e.data);export{u as addComment,y as deleteComment,f as fetchCommentCount,p as getArticleCounter,$ as getComment,j as getPageview,w as getRecentComment,C as getUserList,R as login,d as updateArticleCounter,U as updateComment,v as updatePageview};\n//# sourceMappingURL=api.mjs.map\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","import { decodePath, isLinkHttp, removeEndingSplash } from './path.js';\nimport {\n DEFAULT_EMOJI,\n DEFAULT_LANG,\n DEFAULT_LOCALES,\n DEFAULT_REACTION,\n defaultUploadImage,\n defaultHighlighter,\n defaultTeXRenderer,\n getDefaultSearchOptions,\n getMeta,\n} from '../config/index.js';\nimport {\n type WalineEmojiInfo,\n type WalineEmojiMaps,\n type WalineLocale,\n type WalineProps,\n} from '../typings/index.js';\n\nexport interface WalineEmojiConfig {\n tabs: Pick<WalineEmojiInfo, 'name' | 'icon' | 'items'>[];\n map: WalineEmojiMaps;\n}\n\nexport interface WalineConfig\n extends Required<\n Omit<\n WalineProps,\n | 'emoji'\n | 'imageUploader'\n | 'highlighter'\n | 'texRenderer'\n | 'wordLimit'\n | 'reaction'\n | 'search'\n >\n > {\n locale: WalineLocale;\n wordLimit: [number, number] | false;\n reaction: string[];\n emoji: Exclude<WalineProps['emoji'], boolean | undefined>;\n highlighter: Exclude<WalineProps['highlighter'], true | undefined>;\n imageUploader: Exclude<WalineProps['imageUploader'], true | undefined>;\n texRenderer: Exclude<WalineProps['texRenderer'], true | undefined>;\n search: Exclude<WalineProps['search'], true | undefined>;\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 | boolean | 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 = typeof navigator === 'undefined' ? 'en-US' : navigator.language,\n locale,\n emoji = DEFAULT_EMOJI,\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 turnstileKey = '',\n commentSorting = 'latest',\n ...more\n}: WalineProps): WalineConfig => ({\n serverURL: getServerURL(serverURL),\n path: decodePath(path),\n locale: {\n ...(DEFAULT_LOCALES[lang] || DEFAULT_LOCALES[DEFAULT_LANG]),\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: Object.keys(DEFAULT_LOCALES).includes(lang) ? lang : 'en-US',\n dark,\n emoji: typeof emoji === 'boolean' ? (emoji ? DEFAULT_EMOJI : []) : emoji,\n pageSize,\n login,\n copyright,\n search:\n search === false\n ? false\n : typeof search === 'object'\n ? search\n : getDefaultSearchOptions(lang),\n recaptchaV3Key,\n turnstileKey,\n reaction: Array.isArray(reaction)\n ? reaction\n : reaction === true\n ? DEFAULT_REACTION\n : [],\n commentSorting,\n ...more,\n});\n","export const errorHandler = (err: Error): void => {\n if (err.name !== 'AbortError') console.error(err.message);\n};\n","export const getQuery = (element: HTMLElement): string | null =>\n element.dataset.path || null;\n","import { fetchCommentCount } from '@waline/api';\n\nimport { type WalineAbort } from './typings/index.js';\nimport {\n decodePath,\n errorHandler,\n getQuery,\n getServerURL,\n} from './utils/index.js';\n\nexport interface WalineCommentCountOptions {\n /**\n * Waline 服务端地址\n *\n * Waline server url\n */\n serverURL: string;\n\n /**\n * 评论数 CSS 选择器\n *\n * Comment count CSS selector\n *\n * @default '.waline-comment-count'\n */\n selector?: string;\n\n /**\n * 需要获取的默认路径\n *\n * Path to be fetched by default\n *\n * @default window.location.pathname\n */\n path?: string;\n\n /**\n * 错误提示消息所使用的语言\n *\n * Language of error message\n *\n * @default navigator.language\n */\n lang?: string;\n}\n\nexport { type WalineAbort } from './typings/index.js';\n\nexport const commentCount = ({\n serverURL,\n path = window.location.pathname,\n selector = '.waline-comment-count',\n lang = navigator.language,\n}: WalineCommentCountOptions): 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(getQuery(element) || 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":["s","t","n","f","o","a","e","decodePath","path","removeEndingSplash","content","isLinkHttp","link","getServerURL","serverURL","result","errorHandler","err","getQuery","element","commentCount","selector","lang","controller","elements","fetchCommentCount","counts","index","version"],"mappings":"aAAK,MAAuCA,EAAEC,GAAG,GAAGA,EAAE,QAAQ,OAAO,GAAG,CAAC,OAAO,EAAE,CAACA,EAAEC,EAAE,KAAK,CAAC,GAAG,OAAOD,GAAG,UAAUA,EAAE,MAAM,MAAM,IAAI,UAAU,GAAGC,CAAC,gBAAgBD,EAAE,KAAK,KAAKA,EAAE,MAAM,EAAE,EAAE,OAAOA,CAAC,EAA+0CE,EAAE,CAAC,CAAC,UAAUF,EAAE,KAAKC,EAAE,MAAME,EAAE,OAAOC,CAAC,IAAI,MAAM,GAAGL,EAAEC,CAAC,CAAC,0BAA0B,mBAAmBG,EAAE,KAAK,GAAG,CAAC,CAAC,SAASF,CAAC,GAAG,CAAC,OAAOG,CAAC,CAAC,EAAE,KAAKC,GAAGA,EAAE,KAAM,CAAA,EAAE,KAAKA,GAAG,EAAEA,EAAE,mBAAmB,EAAE,IAAI,ECAvsDC,EAAcC,GAAyB,CAClD,GAAI,CACFA,EAAO,UAAUA,CAAI,CACvB,MAAc,CAAA,CAId,OAAOA,CACT,EAEaC,EAAqB,CAACC,EAAU,KAC3CA,EAAQ,QAAQ,OAAQ,EAAE,EAEfC,EAAcC,GACzB,kBAAkB,KAAKA,CAAI,ECiChBC,EAAgBC,GAA8B,CACzD,MAAMC,EAASN,EAAmBK,CAAS,EAE3C,OAAOH,EAAWI,CAAM,EAAIA,EAAS,WAAWA,CAAM,EACxD,ECnDaC,EAAgBC,GAAqB,CAC5CA,EAAI,OAAS,cAAc,QAAQ,MAAMA,EAAI,OAAO,CAC1D,ECFaC,EAAYC,GACvBA,EAAQ,QAAQ,MAAQ,KC+CbC,EAAe,CAAC,CAC3B,UAAAN,EACA,KAAAN,EAAO,OAAO,SAAS,SACvB,SAAAa,EAAW,wBACX,KAAAC,EAAO,UAAU,QACnB,IAA8C,CAC5C,MAAMC,EAAa,IAAI,gBAGjBC,EAAW,SAAS,iBAA8BH,CAAQ,EAEhE,OAAIG,EAAS,QACNC,EAAkB,CACrB,UAAWZ,EAAaC,CAAS,EACjC,MAAO,MAAM,KAAKU,CAAQ,EAAE,IAAKL,GAC/BZ,EAAWW,EAASC,CAAO,GAAKX,CAAI,CACtC,EACA,KAAAc,EACA,OAAQC,EAAW,MACrB,CAAC,EACE,KAAMG,GAAW,CAChBF,EAAS,QAAQ,CAACL,EAASQ,IAAU,CACnCR,EAAQ,UAAYO,EAAOC,CAAK,EAAE,SAAS,CAC7C,CAAC,CACH,CAAC,EACA,MAAMX,CAAY,EAEhBO,EAAW,MAAM,KAAKA,CAAU,CACzC,EC1EaK,EAAU"}
|
package/dist/comment.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
(function(o,r){typeof exports=="object"&&typeof module<"u"?r(exports):typeof define=="function"&&define.amd?define(["exports"],r):(o=typeof globalThis<"u"?globalThis:o||self,r(o.Waline={}))})(this,function(o){"use strict";const r=e=>`${e.replace(/\/?$/,"/")}api/`,l=(e,n="")=>{if(typeof e=="object"&&e.errno)throw new TypeError(`${n} failed with ${e.errno}: ${e.errmsg}`);return e},h=({serverURL:e,lang:n,paths:a,signal:s})=>fetch(`${r(e)}comment?type=count&url=${encodeURIComponent(a.join(","))}&lang=${n}`,{signal:s}).then(t=>t.json()).then(t=>l(t,"Get comment count").data),p=e=>{try{e=decodeURI(e)}catch{}return e},u=(e="")=>e.replace(/\/$/u,""),d=e=>/^(https?:)?\/\//.test(e),m=e=>{const n=u(e);return d(n)?n:`https://${n}`},f=e=>{e.name!=="AbortError"&&console.error(e.message)},g=e=>e.dataset.path||null,$=({serverURL:e,path:n=window.location.pathname,selector:a=".waline-comment-count",lang:s=navigator.language})=>{const t=new AbortController,c=document.querySelectorAll(a);return c.length&&h({serverURL:m(e),paths:Array.from(c).map(i=>p(g(i)||n)),lang:s,signal:t.signal}).then(i=>{c.forEach((v,w)=>{v.innerText=i[w].toString()})}).catch(f),t.abort.bind(t)},y="3.0.0-alpha.
|
|
1
|
+
(function(o,r){typeof exports=="object"&&typeof module<"u"?r(exports):typeof define=="function"&&define.amd?define(["exports"],r):(o=typeof globalThis<"u"?globalThis:o||self,r(o.Waline={}))})(this,function(o){"use strict";const r=e=>`${e.replace(/\/?$/,"/")}api/`,l=(e,n="")=>{if(typeof e=="object"&&e.errno)throw new TypeError(`${n} failed with ${e.errno}: ${e.errmsg}`);return e},h=({serverURL:e,lang:n,paths:a,signal:s})=>fetch(`${r(e)}comment?type=count&url=${encodeURIComponent(a.join(","))}&lang=${n}`,{signal:s}).then(t=>t.json()).then(t=>l(t,"Get comment count").data),p=e=>{try{e=decodeURI(e)}catch{}return e},u=(e="")=>e.replace(/\/$/u,""),d=e=>/^(https?:)?\/\//.test(e),m=e=>{const n=u(e);return d(n)?n:`https://${n}`},f=e=>{e.name!=="AbortError"&&console.error(e.message)},g=e=>e.dataset.path||null,$=({serverURL:e,path:n=window.location.pathname,selector:a=".waline-comment-count",lang:s=navigator.language})=>{const t=new AbortController,c=document.querySelectorAll(a);return c.length&&h({serverURL:m(e),paths:Array.from(c).map(i=>p(g(i)||n)),lang:s,signal:t.signal}).then(i=>{c.forEach((v,w)=>{v.innerText=i[w].toString()})}).catch(f),t.abort.bind(t)},y="3.0.0-alpha.2";o.commentCount=$,o.version=y});
|
|
2
2
|
//# sourceMappingURL=comment.js.map
|
package/dist/comment.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"comment.js","sources":["../../api/dist/api.mjs","../src/utils/path.ts","../src/utils/config.ts","../src/utils/error.ts","../src/utils/query.ts","../src/comment.ts","../src/version.ts"],"sourcesContent":["const m={\"Content-Type\":\"application/json\"},s=t=>`${t.replace(/\\/?$/,\"/\")}api/`,h=(t,n=\"\")=>{if(typeof t==\"object\"&&t.errno)throw new TypeError(`${n} failed with ${t.errno}: ${t.errmsg}`);return t},p=({serverURL:t,lang:n,paths:o,type:a,signal:e})=>fetch(`${s(t)}article?path=${encodeURIComponent(o.join(\",\"))}&type=${encodeURIComponent(a.join(\",\"))}&lang=${n}`,{signal:e}).then(r=>r.json()),d=({serverURL:t,lang:n,path:o,type:a,action:e})=>fetch(`${s(t)}article?lang=${n}`,{method:\"POST\",headers:m,body:JSON.stringify({path:o,type:a,action:e})}).then(r=>r.json()).then(r=>h(r,\"Update counter\").data),$=({serverURL:t,lang:n,path:o,page:a,pageSize:e,sortBy:r,signal:c,token:i})=>{const l={};return i&&(l.Authorization=`Bearer ${i}`),fetch(`${s(t)}comment?path=${encodeURIComponent(o)}&pageSize=${e}&page=${a}&lang=${n}&sortBy=${r}`,{signal:c,headers:l}).then(g=>g.json()).then(g=>h(g,\"Get comment data\").data)},u=({serverURL:t,lang:n,token:o,comment:a})=>{const e={\"Content-Type\":\"application/json\"};return o&&(e.Authorization=`Bearer ${o}`),fetch(`${s(t)}comment?lang=${n}`,{method:\"POST\",headers:e,body:JSON.stringify(a)}).then(r=>r.json())},y=({serverURL:t,lang:n,token:o,objectId:a})=>fetch(`${s(t)}comment/${a}?lang=${n}`,{method:\"DELETE\",headers:{Authorization:`Bearer ${o}`}}).then(e=>e.json()).then(e=>h(e,\"Delete comment\")),U=({serverURL:t,lang:n,token:o,objectId:a,comment:e})=>fetch(`${s(t)}comment/${a}?lang=${n}`,{method:\"PUT\",headers:{...m,Authorization:`Bearer ${o}`},body:JSON.stringify(e)}).then(r=>r.json()).then(r=>h(r,\"Update comment\")),f=({serverURL:t,lang:n,paths:o,signal:a})=>fetch(`${s(t)}comment?type=count&url=${encodeURIComponent(o.join(\",\"))}&lang=${n}`,{signal:a}).then(e=>e.json()).then(e=>h(e,\"Get comment count\").data),R=({lang:t,serverURL:n})=>{const o=(window.innerWidth-450)/2,a=(window.innerHeight-450)/2,e=window.open(`${n.replace(/\\/$/,\"\")}/ui/login?lng=${encodeURIComponent(t)}`,\"_blank\",`width=450,height=450,left=${o},top=${a},scrollbars=no,resizable=no,status=no,location=no,toolbar=no,menubar=no`);return e?.postMessage({type:\"TOKEN\",data:null},\"*\"),new Promise(r=>{const c=({data:i})=>{!i||typeof i!=\"object\"||i.type!==\"userInfo\"||i.data.token&&(e?.close(),window.removeEventListener(\"message\",c),r(i.data))};window.addEventListener(\"message\",c)})},j=({serverURL:t,lang:n,paths:o,signal:a})=>p({serverURL:t,lang:n,paths:o,type:[\"time\"],signal:a}).then(e=>Array.isArray(e)?e:[e]),v=t=>d({...t,type:\"time\",action:\"inc\"}),w=({serverURL:t,lang:n,count:o,signal:a,token:e})=>{const r={};return e&&(r.Authorization=`Bearer ${e}`),fetch(`${s(t)}comment?type=recent&count=${o}&lang=${n}`,{signal:a,headers:r}).then(c=>c.json())},C=({serverURL:t,signal:n,pageSize:o,lang:a})=>fetch(`${s(t)}user?pageSize=${o}&lang=${a}`,{signal:n}).then(e=>e.json()).then(e=>h(e,\"user list\")).then(e=>e.data);export{u as addComment,y as deleteComment,f as fetchCommentCount,p as getArticleCounter,$ as getComment,j as getPageview,w as getRecentComment,C as getUserList,R as login,d as updateArticleCounter,U as updateComment,v as updatePageview};\n//# sourceMappingURL=api.mjs.map\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","import { decodePath, isLinkHttp, removeEndingSplash } from './path.js';\nimport {\n DEFAULT_EMOJI,\n DEFAULT_LANG,\n DEFAULT_LOCALES,\n DEFAULT_REACTION,\n defaultUploadImage,\n defaultHighlighter,\n defaultTeXRenderer,\n getDefaultSearchOptions,\n getMeta,\n} from '../config/index.js';\nimport {\n type WalineEmojiInfo,\n type WalineEmojiMaps,\n type WalineLocale,\n type WalineProps,\n} from '../typings/index.js';\n\nexport interface WalineEmojiConfig {\n tabs: Pick<WalineEmojiInfo, 'name' | 'icon' | 'items'>[];\n map: WalineEmojiMaps;\n}\n\nexport interface WalineConfig\n extends Required<\n Omit<\n WalineProps,\n | 'emoji'\n | 'imageUploader'\n | 'highlighter'\n | 'texRenderer'\n | 'wordLimit'\n | 'reaction'\n | 'search'\n >\n > {\n locale: WalineLocale;\n wordLimit: [number, number] | false;\n reaction: string[];\n emoji: Exclude<WalineProps['emoji'], boolean | undefined>;\n highlighter: Exclude<WalineProps['highlighter'], true | undefined>;\n imageUploader: Exclude<WalineProps['imageUploader'], true | undefined>;\n texRenderer: Exclude<WalineProps['texRenderer'], true | undefined>;\n search: Exclude<WalineProps['search'], true | undefined>;\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 | boolean | 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 = typeof navigator === 'undefined' ? 'en-US' : navigator.language,\n locale,\n emoji = DEFAULT_EMOJI,\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 turnstileKey = '',\n commentSorting = 'latest',\n ...more\n}: WalineProps): WalineConfig => ({\n serverURL: getServerURL(serverURL),\n path: decodePath(path),\n locale: {\n ...(DEFAULT_LOCALES[lang] || DEFAULT_LOCALES[DEFAULT_LANG]),\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: Object.keys(DEFAULT_LOCALES).includes(lang) ? lang : 'en-US',\n dark,\n emoji: typeof emoji === 'boolean' ? (emoji ? DEFAULT_EMOJI : []) : emoji,\n pageSize,\n login,\n copyright,\n search:\n search === false\n ? false\n : typeof search === 'object'\n ? search\n : getDefaultSearchOptions(lang),\n recaptchaV3Key,\n turnstileKey,\n reaction: Array.isArray(reaction)\n ? reaction\n : reaction === true\n ? DEFAULT_REACTION\n : [],\n commentSorting,\n ...more,\n});\n","export const errorHandler = (err: Error): void => {\n if (err.name !== 'AbortError') console.error(err.message);\n};\n","export const getQuery = (element: HTMLElement): string | null =>\n element.dataset.path || null;\n","import { fetchCommentCount } from '@waline/api';\n\nimport { type WalineAbort } from './typings/index.js';\nimport {\n decodePath,\n errorHandler,\n getQuery,\n getServerURL,\n} from './utils/index.js';\n\nexport interface WalineCommentCountOptions {\n /**\n * Waline 服务端地址\n *\n * Waline server url\n */\n serverURL: string;\n\n /**\n * 评论数 CSS 选择器\n *\n * Comment count CSS selector\n *\n * @default '.waline-comment-count'\n */\n selector?: string;\n\n /**\n * 需要获取的默认路径\n *\n * Path to be fetched by default\n *\n * @default window.location.pathname\n */\n path?: string;\n\n /**\n * 错误提示消息所使用的语言\n *\n * Language of error message\n *\n * @default navigator.language\n */\n lang?: string;\n}\n\nexport { type WalineAbort } from './typings/index.js';\n\nexport const commentCount = ({\n serverURL,\n path = window.location.pathname,\n selector = '.waline-comment-count',\n lang = navigator.language,\n}: WalineCommentCountOptions): 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(getQuery(element) || 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":["s","t","h","f","o","a","e","decodePath","path","removeEndingSplash","content","isLinkHttp","link","getServerURL","serverURL","result","errorHandler","err","getQuery","element","commentCount","selector","lang","controller","elements","fetchCommentCount","counts","index","version"],"mappings":"8NAAK,MAAuCA,EAAEC,GAAG,GAAGA,EAAE,QAAQ,OAAO,GAAG,CAAC,OAAOC,EAAE,CAACD,EAAE,EAAE,KAAK,CAAC,GAAG,OAAOA,GAAG,UAAUA,EAAE,MAAM,MAAM,IAAI,UAAU,GAAG,CAAC,gBAAgBA,EAAE,KAAK,KAAKA,EAAE,MAAM,EAAE,EAAE,OAAOA,CAAC,EAA+0CE,EAAE,CAAC,CAAC,UAAUF,EAAE,KAAK,EAAE,MAAMG,EAAE,OAAOC,CAAC,IAAI,MAAM,GAAGL,EAAEC,CAAC,CAAC,0BAA0B,mBAAmBG,EAAE,KAAK,GAAG,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,OAAOC,CAAC,CAAC,EAAE,KAAKC,GAAGA,EAAE,KAAM,CAAA,EAAE,KAAKA,GAAGJ,EAAEI,EAAE,mBAAmB,EAAE,IAAI,ECAvsDC,EAAcC,GAAyB,CAClD,GAAI,CACFA,EAAO,UAAUA,CAAI,CACvB,MAAc,CAAA,CAId,OAAOA,CACT,EAEaC,EAAqB,CAACC,EAAU,KAC3CA,EAAQ,QAAQ,OAAQ,EAAE,EAEfC,EAAcC,GACzB,kBAAkB,KAAKA,CAAI,ECiChBC,EAAgBC,GAA8B,CACzD,MAAMC,EAASN,EAAmBK,CAAS,EAE3C,OAAOH,EAAWI,CAAM,EAAIA,EAAS,WAAWA,CAAM,EACxD,ECnDaC,EAAgBC,GAAqB,CAC5CA,EAAI,OAAS,cAAc,QAAQ,MAAMA,EAAI,OAAO,CAC1D,ECFaC,EAAYC,GACvBA,EAAQ,QAAQ,MAAQ,KC+CbC,EAAe,CAAC,CAC3B,UAAAN,EACA,KAAAN,EAAO,OAAO,SAAS,SACvB,SAAAa,EAAW,wBACX,KAAAC,EAAO,UAAU,QACnB,IAA8C,CAC5C,MAAMC,EAAa,IAAI,gBAGjBC,EAAW,SAAS,iBAA8BH,CAAQ,EAEhE,OAAIG,EAAS,QACNC,EAAkB,CACrB,UAAWZ,EAAaC,CAAS,EACjC,MAAO,MAAM,KAAKU,CAAQ,EAAE,IAAKL,GAC/BZ,EAAWW,EAASC,CAAO,GAAKX,CAAI,CACtC,EACA,KAAAc,EACA,OAAQC,EAAW,MACrB,CAAC,EACE,KAAMG,GAAW,CAChBF,EAAS,QAAQ,CAACL,EAASQ,IAAU,CACnCR,EAAQ,UAAYO,EAAOC,CAAK,EAAE,SAAS,CAC7C,CAAC,CACH,CAAC,EACA,MAAMX,CAAY,EAEhBO,EAAW,MAAM,KAAKA,CAAU,CACzC,EC1EaK,EAAU"}
|
|
1
|
+
{"version":3,"file":"comment.js","sources":["../../api/dist/api.mjs","../src/utils/path.ts","../src/utils/config.ts","../src/utils/error.ts","../src/utils/query.ts","../src/comment.ts","../src/version.ts"],"sourcesContent":["const m={\"Content-Type\":\"application/json\"},s=t=>`${t.replace(/\\/?$/,\"/\")}api/`,h=(t,n=\"\")=>{if(typeof t==\"object\"&&t.errno)throw new TypeError(`${n} failed with ${t.errno}: ${t.errmsg}`);return t},p=({serverURL:t,lang:n,paths:o,type:a,signal:e})=>fetch(`${s(t)}article?path=${encodeURIComponent(o.join(\",\"))}&type=${encodeURIComponent(a.join(\",\"))}&lang=${n}`,{signal:e}).then(r=>r.json()),d=({serverURL:t,lang:n,path:o,type:a,action:e})=>fetch(`${s(t)}article?lang=${n}`,{method:\"POST\",headers:m,body:JSON.stringify({path:o,type:a,action:e})}).then(r=>r.json()).then(r=>h(r,\"Update counter\").data),$=({serverURL:t,lang:n,path:o,page:a,pageSize:e,sortBy:r,signal:c,token:i})=>{const l={};return i&&(l.Authorization=`Bearer ${i}`),fetch(`${s(t)}comment?path=${encodeURIComponent(o)}&pageSize=${e}&page=${a}&lang=${n}&sortBy=${r}`,{signal:c,headers:l}).then(g=>g.json()).then(g=>h(g,\"Get comment data\").data)},u=({serverURL:t,lang:n,token:o,comment:a})=>{const e={\"Content-Type\":\"application/json\"};return o&&(e.Authorization=`Bearer ${o}`),fetch(`${s(t)}comment?lang=${n}`,{method:\"POST\",headers:e,body:JSON.stringify(a)}).then(r=>r.json())},y=({serverURL:t,lang:n,token:o,objectId:a})=>fetch(`${s(t)}comment/${a}?lang=${n}`,{method:\"DELETE\",headers:{Authorization:`Bearer ${o}`}}).then(e=>e.json()).then(e=>h(e,\"Delete comment\")),U=({serverURL:t,lang:n,token:o,objectId:a,comment:e})=>fetch(`${s(t)}comment/${a}?lang=${n}`,{method:\"PUT\",headers:{...m,Authorization:`Bearer ${o}`},body:JSON.stringify(e)}).then(r=>r.json()).then(r=>h(r,\"Update comment\")),f=({serverURL:t,lang:n,paths:o,signal:a})=>fetch(`${s(t)}comment?type=count&url=${encodeURIComponent(o.join(\",\"))}&lang=${n}`,{signal:a}).then(e=>e.json()).then(e=>h(e,\"Get comment count\").data),R=({lang:t,serverURL:n})=>{const o=(window.innerWidth-450)/2,a=(window.innerHeight-450)/2,e=window.open(`${n.replace(/\\/$/,\"\")}/ui/login?lng=${encodeURIComponent(t)}`,\"_blank\",`width=450,height=450,left=${o},top=${a},scrollbars=no,resizable=no,status=no,location=no,toolbar=no,menubar=no`);return e?.postMessage({type:\"TOKEN\",data:null},\"*\"),new Promise(r=>{const c=({data:i})=>{!i||typeof i!=\"object\"||i.type!==\"userInfo\"||i.data.token&&(e?.close(),window.removeEventListener(\"message\",c),r(i.data))};window.addEventListener(\"message\",c)})},j=({serverURL:t,lang:n,paths:o,signal:a})=>p({serverURL:t,lang:n,paths:o,type:[\"time\"],signal:a}).then(e=>Array.isArray(e)?e:[e]),v=t=>d({...t,type:\"time\",action:\"inc\"}),w=({serverURL:t,lang:n,count:o,signal:a,token:e})=>{const r={};return e&&(r.Authorization=`Bearer ${e}`),fetch(`${s(t)}comment?type=recent&count=${o}&lang=${n}`,{signal:a,headers:r}).then(c=>c.json())},C=({serverURL:t,signal:n,pageSize:o,lang:a})=>fetch(`${s(t)}user?pageSize=${o}&lang=${a}`,{signal:n}).then(e=>e.json()).then(e=>h(e,\"user list\")).then(e=>e.data);export{u as addComment,y as deleteComment,f as fetchCommentCount,p as getArticleCounter,$ as getComment,j as getPageview,w as getRecentComment,C as getUserList,R as login,d as updateArticleCounter,U as updateComment,v as updatePageview};\n//# sourceMappingURL=api.mjs.map\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","import { decodePath, isLinkHttp, removeEndingSplash } from './path.js';\nimport {\n DEFAULT_EMOJI,\n DEFAULT_LANG,\n DEFAULT_LOCALES,\n DEFAULT_REACTION,\n defaultUploadImage,\n defaultHighlighter,\n defaultTeXRenderer,\n getDefaultSearchOptions,\n getMeta,\n} from '../config/index.js';\nimport {\n type WalineEmojiInfo,\n type WalineEmojiMaps,\n type WalineLocale,\n type WalineProps,\n} from '../typings/index.js';\n\nexport interface WalineEmojiConfig {\n tabs: Pick<WalineEmojiInfo, 'name' | 'icon' | 'items'>[];\n map: WalineEmojiMaps;\n}\n\nexport interface WalineConfig\n extends Required<\n Omit<\n WalineProps,\n | 'emoji'\n | 'imageUploader'\n | 'highlighter'\n | 'texRenderer'\n | 'wordLimit'\n | 'reaction'\n | 'search'\n >\n > {\n locale: WalineLocale;\n wordLimit: [number, number] | false;\n reaction: string[];\n emoji: Exclude<WalineProps['emoji'], boolean | undefined>;\n highlighter: Exclude<WalineProps['highlighter'], true | undefined>;\n imageUploader: Exclude<WalineProps['imageUploader'], true | undefined>;\n texRenderer: Exclude<WalineProps['texRenderer'], true | undefined>;\n search: Exclude<WalineProps['search'], true | undefined>;\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 | boolean | 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 = typeof navigator === 'undefined' ? 'en-US' : navigator.language,\n locale,\n emoji = DEFAULT_EMOJI,\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 turnstileKey = '',\n commentSorting = 'latest',\n ...more\n}: WalineProps): WalineConfig => ({\n serverURL: getServerURL(serverURL),\n path: decodePath(path),\n locale: {\n ...(DEFAULT_LOCALES[lang] || DEFAULT_LOCALES[DEFAULT_LANG]),\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: Object.keys(DEFAULT_LOCALES).includes(lang) ? lang : 'en-US',\n dark,\n emoji: typeof emoji === 'boolean' ? (emoji ? DEFAULT_EMOJI : []) : emoji,\n pageSize,\n login,\n copyright,\n search:\n search === false\n ? false\n : typeof search === 'object'\n ? search\n : getDefaultSearchOptions(lang),\n recaptchaV3Key,\n turnstileKey,\n reaction: Array.isArray(reaction)\n ? reaction\n : reaction === true\n ? DEFAULT_REACTION\n : [],\n commentSorting,\n ...more,\n});\n","export const errorHandler = (err: Error): void => {\n if (err.name !== 'AbortError') console.error(err.message);\n};\n","export const getQuery = (element: HTMLElement): string | null =>\n element.dataset.path || null;\n","import { fetchCommentCount } from '@waline/api';\n\nimport { type WalineAbort } from './typings/index.js';\nimport {\n decodePath,\n errorHandler,\n getQuery,\n getServerURL,\n} from './utils/index.js';\n\nexport interface WalineCommentCountOptions {\n /**\n * Waline 服务端地址\n *\n * Waline server url\n */\n serverURL: string;\n\n /**\n * 评论数 CSS 选择器\n *\n * Comment count CSS selector\n *\n * @default '.waline-comment-count'\n */\n selector?: string;\n\n /**\n * 需要获取的默认路径\n *\n * Path to be fetched by default\n *\n * @default window.location.pathname\n */\n path?: string;\n\n /**\n * 错误提示消息所使用的语言\n *\n * Language of error message\n *\n * @default navigator.language\n */\n lang?: string;\n}\n\nexport { type WalineAbort } from './typings/index.js';\n\nexport const commentCount = ({\n serverURL,\n path = window.location.pathname,\n selector = '.waline-comment-count',\n lang = navigator.language,\n}: WalineCommentCountOptions): 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(getQuery(element) || 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":["s","t","h","f","o","a","e","decodePath","path","removeEndingSplash","content","isLinkHttp","link","getServerURL","serverURL","result","errorHandler","err","getQuery","element","commentCount","selector","lang","controller","elements","fetchCommentCount","counts","index","version"],"mappings":"8NAAK,MAAuCA,EAAEC,GAAG,GAAGA,EAAE,QAAQ,OAAO,GAAG,CAAC,OAAOC,EAAE,CAACD,EAAE,EAAE,KAAK,CAAC,GAAG,OAAOA,GAAG,UAAUA,EAAE,MAAM,MAAM,IAAI,UAAU,GAAG,CAAC,gBAAgBA,EAAE,KAAK,KAAKA,EAAE,MAAM,EAAE,EAAE,OAAOA,CAAC,EAA+0CE,EAAE,CAAC,CAAC,UAAUF,EAAE,KAAK,EAAE,MAAMG,EAAE,OAAOC,CAAC,IAAI,MAAM,GAAGL,EAAEC,CAAC,CAAC,0BAA0B,mBAAmBG,EAAE,KAAK,GAAG,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,OAAOC,CAAC,CAAC,EAAE,KAAKC,GAAGA,EAAE,KAAM,CAAA,EAAE,KAAKA,GAAGJ,EAAEI,EAAE,mBAAmB,EAAE,IAAI,ECAvsDC,EAAcC,GAAyB,CAClD,GAAI,CACFA,EAAO,UAAUA,CAAI,CACvB,MAAc,CAAA,CAId,OAAOA,CACT,EAEaC,EAAqB,CAACC,EAAU,KAC3CA,EAAQ,QAAQ,OAAQ,EAAE,EAEfC,EAAcC,GACzB,kBAAkB,KAAKA,CAAI,ECiChBC,EAAgBC,GAA8B,CACzD,MAAMC,EAASN,EAAmBK,CAAS,EAE3C,OAAOH,EAAWI,CAAM,EAAIA,EAAS,WAAWA,CAAM,EACxD,ECnDaC,EAAgBC,GAAqB,CAC5CA,EAAI,OAAS,cAAc,QAAQ,MAAMA,EAAI,OAAO,CAC1D,ECFaC,EAAYC,GACvBA,EAAQ,QAAQ,MAAQ,KC+CbC,EAAe,CAAC,CAC3B,UAAAN,EACA,KAAAN,EAAO,OAAO,SAAS,SACvB,SAAAa,EAAW,wBACX,KAAAC,EAAO,UAAU,QACnB,IAA8C,CAC5C,MAAMC,EAAa,IAAI,gBAGjBC,EAAW,SAAS,iBAA8BH,CAAQ,EAEhE,OAAIG,EAAS,QACNC,EAAkB,CACrB,UAAWZ,EAAaC,CAAS,EACjC,MAAO,MAAM,KAAKU,CAAQ,EAAE,IAAKL,GAC/BZ,EAAWW,EAASC,CAAO,GAAKX,CAAI,CACtC,EACA,KAAAc,EACA,OAAQC,EAAW,MACrB,CAAC,EACE,KAAMG,GAAW,CAChBF,EAAS,QAAQ,CAACL,EAASQ,IAAU,CACnCR,EAAQ,UAAYO,EAAOC,CAAK,EAAE,SAAS,CAC7C,CAAC,CACH,CAAC,EACA,MAAMX,CAAY,EAEhBO,EAAW,MAAM,KAAKA,CAAU,CACzC,EC1EaK,EAAU"}
|
package/dist/comment.mjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
const h=e=>`${e.replace(/\/?$/,"/")}api/`,i=(e,t="")=>{if(typeof e=="object"&&e.errno)throw new TypeError(`${t} failed with ${e.errno}: ${e.errmsg}`);return e},p=({serverURL:e,lang:t,paths:r,signal:o})=>fetch(`${h(e)}comment?type=count&url=${encodeURIComponent(r.join(","))}&lang=${t}`,{signal:o}).then(n=>n.json()).then(n=>i(n,"Get comment count").data),g=e=>{try{e=decodeURI(e)}catch{}return e},m=(e="")=>e.replace(/\/$/u,""),u=e=>/^(https?:)?\/\//.test(e),d=e=>{const t=m(e);return u(t)?t:`https://${t}`},$=e=>{e.name!=="AbortError"&&console.error(e.message)},f=e=>e.dataset.path||null,v=({serverURL:e,path:t=window.location.pathname,selector:r=".waline-comment-count",lang:o=navigator.language})=>{const n=new AbortController,a=document.querySelectorAll(r);return a.length&&p({serverURL:d(e),paths:Array.from(a).map(c=>g(f(c)||t)),lang:o,signal:n.signal}).then(c=>{a.forEach((s,l)=>{s.innerText=c[l].toString()})}).catch($),n.abort.bind(n)},w="3.0.0-alpha.
|
|
1
|
+
const h=e=>`${e.replace(/\/?$/,"/")}api/`,i=(e,t="")=>{if(typeof e=="object"&&e.errno)throw new TypeError(`${t} failed with ${e.errno}: ${e.errmsg}`);return e},p=({serverURL:e,lang:t,paths:r,signal:o})=>fetch(`${h(e)}comment?type=count&url=${encodeURIComponent(r.join(","))}&lang=${t}`,{signal:o}).then(n=>n.json()).then(n=>i(n,"Get comment count").data),g=e=>{try{e=decodeURI(e)}catch{}return e},m=(e="")=>e.replace(/\/$/u,""),u=e=>/^(https?:)?\/\//.test(e),d=e=>{const t=m(e);return u(t)?t:`https://${t}`},$=e=>{e.name!=="AbortError"&&console.error(e.message)},f=e=>e.dataset.path||null,v=({serverURL:e,path:t=window.location.pathname,selector:r=".waline-comment-count",lang:o=navigator.language})=>{const n=new AbortController,a=document.querySelectorAll(r);return a.length&&p({serverURL:d(e),paths:Array.from(a).map(c=>g(f(c)||t)),lang:o,signal:n.signal}).then(c=>{a.forEach((s,l)=>{s.innerText=c[l].toString()})}).catch($),n.abort.bind(n)},w="3.0.0-alpha.2";export{v as commentCount,w as version};
|
|
2
2
|
//# sourceMappingURL=comment.mjs.map
|
package/dist/comment.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"comment.mjs","sources":["../../api/dist/api.mjs","../src/utils/path.ts","../src/utils/config.ts","../src/utils/error.ts","../src/utils/query.ts","../src/comment.ts","../src/version.ts"],"sourcesContent":["const m={\"Content-Type\":\"application/json\"},s=t=>`${t.replace(/\\/?$/,\"/\")}api/`,h=(t,n=\"\")=>{if(typeof t==\"object\"&&t.errno)throw new TypeError(`${n} failed with ${t.errno}: ${t.errmsg}`);return t},p=({serverURL:t,lang:n,paths:o,type:a,signal:e})=>fetch(`${s(t)}article?path=${encodeURIComponent(o.join(\",\"))}&type=${encodeURIComponent(a.join(\",\"))}&lang=${n}`,{signal:e}).then(r=>r.json()),d=({serverURL:t,lang:n,path:o,type:a,action:e})=>fetch(`${s(t)}article?lang=${n}`,{method:\"POST\",headers:m,body:JSON.stringify({path:o,type:a,action:e})}).then(r=>r.json()).then(r=>h(r,\"Update counter\").data),$=({serverURL:t,lang:n,path:o,page:a,pageSize:e,sortBy:r,signal:c,token:i})=>{const l={};return i&&(l.Authorization=`Bearer ${i}`),fetch(`${s(t)}comment?path=${encodeURIComponent(o)}&pageSize=${e}&page=${a}&lang=${n}&sortBy=${r}`,{signal:c,headers:l}).then(g=>g.json()).then(g=>h(g,\"Get comment data\").data)},u=({serverURL:t,lang:n,token:o,comment:a})=>{const e={\"Content-Type\":\"application/json\"};return o&&(e.Authorization=`Bearer ${o}`),fetch(`${s(t)}comment?lang=${n}`,{method:\"POST\",headers:e,body:JSON.stringify(a)}).then(r=>r.json())},y=({serverURL:t,lang:n,token:o,objectId:a})=>fetch(`${s(t)}comment/${a}?lang=${n}`,{method:\"DELETE\",headers:{Authorization:`Bearer ${o}`}}).then(e=>e.json()).then(e=>h(e,\"Delete comment\")),U=({serverURL:t,lang:n,token:o,objectId:a,comment:e})=>fetch(`${s(t)}comment/${a}?lang=${n}`,{method:\"PUT\",headers:{...m,Authorization:`Bearer ${o}`},body:JSON.stringify(e)}).then(r=>r.json()).then(r=>h(r,\"Update comment\")),f=({serverURL:t,lang:n,paths:o,signal:a})=>fetch(`${s(t)}comment?type=count&url=${encodeURIComponent(o.join(\",\"))}&lang=${n}`,{signal:a}).then(e=>e.json()).then(e=>h(e,\"Get comment count\").data),R=({lang:t,serverURL:n})=>{const o=(window.innerWidth-450)/2,a=(window.innerHeight-450)/2,e=window.open(`${n.replace(/\\/$/,\"\")}/ui/login?lng=${encodeURIComponent(t)}`,\"_blank\",`width=450,height=450,left=${o},top=${a},scrollbars=no,resizable=no,status=no,location=no,toolbar=no,menubar=no`);return e?.postMessage({type:\"TOKEN\",data:null},\"*\"),new Promise(r=>{const c=({data:i})=>{!i||typeof i!=\"object\"||i.type!==\"userInfo\"||i.data.token&&(e?.close(),window.removeEventListener(\"message\",c),r(i.data))};window.addEventListener(\"message\",c)})},j=({serverURL:t,lang:n,paths:o,signal:a})=>p({serverURL:t,lang:n,paths:o,type:[\"time\"],signal:a}).then(e=>Array.isArray(e)?e:[e]),v=t=>d({...t,type:\"time\",action:\"inc\"}),w=({serverURL:t,lang:n,count:o,signal:a,token:e})=>{const r={};return e&&(r.Authorization=`Bearer ${e}`),fetch(`${s(t)}comment?type=recent&count=${o}&lang=${n}`,{signal:a,headers:r}).then(c=>c.json())},C=({serverURL:t,signal:n,pageSize:o,lang:a})=>fetch(`${s(t)}user?pageSize=${o}&lang=${a}`,{signal:n}).then(e=>e.json()).then(e=>h(e,\"user list\")).then(e=>e.data);export{u as addComment,y as deleteComment,f as fetchCommentCount,p as getArticleCounter,$ as getComment,j as getPageview,w as getRecentComment,C as getUserList,R as login,d as updateArticleCounter,U as updateComment,v as updatePageview};\n//# sourceMappingURL=api.mjs.map\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","import { decodePath, isLinkHttp, removeEndingSplash } from './path.js';\nimport {\n DEFAULT_EMOJI,\n DEFAULT_LANG,\n DEFAULT_LOCALES,\n DEFAULT_REACTION,\n defaultUploadImage,\n defaultHighlighter,\n defaultTeXRenderer,\n getDefaultSearchOptions,\n getMeta,\n} from '../config/index.js';\nimport {\n type WalineEmojiInfo,\n type WalineEmojiMaps,\n type WalineLocale,\n type WalineProps,\n} from '../typings/index.js';\n\nexport interface WalineEmojiConfig {\n tabs: Pick<WalineEmojiInfo, 'name' | 'icon' | 'items'>[];\n map: WalineEmojiMaps;\n}\n\nexport interface WalineConfig\n extends Required<\n Omit<\n WalineProps,\n | 'emoji'\n | 'imageUploader'\n | 'highlighter'\n | 'texRenderer'\n | 'wordLimit'\n | 'reaction'\n | 'search'\n >\n > {\n locale: WalineLocale;\n wordLimit: [number, number] | false;\n reaction: string[];\n emoji: Exclude<WalineProps['emoji'], boolean | undefined>;\n highlighter: Exclude<WalineProps['highlighter'], true | undefined>;\n imageUploader: Exclude<WalineProps['imageUploader'], true | undefined>;\n texRenderer: Exclude<WalineProps['texRenderer'], true | undefined>;\n search: Exclude<WalineProps['search'], true | undefined>;\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 | boolean | 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 = typeof navigator === 'undefined' ? 'en-US' : navigator.language,\n locale,\n emoji = DEFAULT_EMOJI,\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 turnstileKey = '',\n commentSorting = 'latest',\n ...more\n}: WalineProps): WalineConfig => ({\n serverURL: getServerURL(serverURL),\n path: decodePath(path),\n locale: {\n ...(DEFAULT_LOCALES[lang] || DEFAULT_LOCALES[DEFAULT_LANG]),\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: Object.keys(DEFAULT_LOCALES).includes(lang) ? lang : 'en-US',\n dark,\n emoji: typeof emoji === 'boolean' ? (emoji ? DEFAULT_EMOJI : []) : emoji,\n pageSize,\n login,\n copyright,\n search:\n search === false\n ? false\n : typeof search === 'object'\n ? search\n : getDefaultSearchOptions(lang),\n recaptchaV3Key,\n turnstileKey,\n reaction: Array.isArray(reaction)\n ? reaction\n : reaction === true\n ? DEFAULT_REACTION\n : [],\n commentSorting,\n ...more,\n});\n","export const errorHandler = (err: Error): void => {\n if (err.name !== 'AbortError') console.error(err.message);\n};\n","export const getQuery = (element: HTMLElement): string | null =>\n element.dataset.path || null;\n","import { fetchCommentCount } from '@waline/api';\n\nimport { type WalineAbort } from './typings/index.js';\nimport {\n decodePath,\n errorHandler,\n getQuery,\n getServerURL,\n} from './utils/index.js';\n\nexport interface WalineCommentCountOptions {\n /**\n * Waline 服务端地址\n *\n * Waline server url\n */\n serverURL: string;\n\n /**\n * 评论数 CSS 选择器\n *\n * Comment count CSS selector\n *\n * @default '.waline-comment-count'\n */\n selector?: string;\n\n /**\n * 需要获取的默认路径\n *\n * Path to be fetched by default\n *\n * @default window.location.pathname\n */\n path?: string;\n\n /**\n * 错误提示消息所使用的语言\n *\n * Language of error message\n *\n * @default navigator.language\n */\n lang?: string;\n}\n\nexport { type WalineAbort } from './typings/index.js';\n\nexport const commentCount = ({\n serverURL,\n path = window.location.pathname,\n selector = '.waline-comment-count',\n lang = navigator.language,\n}: WalineCommentCountOptions): 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(getQuery(element) || 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":["s","t","h","n","f","o","a","e","decodePath","path","removeEndingSplash","content","isLinkHttp","link","getServerURL","serverURL","result","errorHandler","err","getQuery","element","commentCount","selector","lang","controller","elements","fetchCommentCount","counts","index","version"],"mappings":"AAAK,MAAuCA,EAAEC,GAAG,GAAGA,EAAE,QAAQ,OAAO,GAAG,CAAC,OAAOC,EAAE,CAACD,EAAEE,EAAE,KAAK,CAAC,GAAG,OAAOF,GAAG,UAAUA,EAAE,MAAM,MAAM,IAAI,UAAU,GAAGE,CAAC,gBAAgBF,EAAE,KAAK,KAAKA,EAAE,MAAM,EAAE,EAAE,OAAOA,CAAC,EAA+0CG,EAAE,CAAC,CAAC,UAAUH,EAAE,KAAKE,EAAE,MAAME,EAAE,OAAOC,CAAC,IAAI,MAAM,GAAGN,EAAEC,CAAC,CAAC,0BAA0B,mBAAmBI,EAAE,KAAK,GAAG,CAAC,CAAC,SAASF,CAAC,GAAG,CAAC,OAAOG,CAAC,CAAC,EAAE,KAAKC,GAAGA,EAAE,KAAM,CAAA,EAAE,KAAKA,GAAGL,EAAEK,EAAE,mBAAmB,EAAE,IAAI,ECAvsDC,EAAcC,GAAyB,CAClD,GAAI,CACFA,EAAO,UAAUA,CAAI,CACvB,MAAc,CAAA,CAId,OAAOA,CACT,EAEaC,EAAqB,CAACC,EAAU,KAC3CA,EAAQ,QAAQ,OAAQ,EAAE,EAEfC,EAAcC,GACzB,kBAAkB,KAAKA,CAAI,ECiChBC,EAAgBC,GAA8B,CACzD,MAAMC,EAASN,EAAmBK,CAAS,EAE3C,OAAOH,EAAWI,CAAM,EAAIA,EAAS,WAAWA,CAAM,EACxD,ECnDaC,EAAgBC,GAAqB,CAC5CA,EAAI,OAAS,cAAc,QAAQ,MAAMA,EAAI,OAAO,CAC1D,ECFaC,EAAYC,GACvBA,EAAQ,QAAQ,MAAQ,KC+CbC,EAAe,CAAC,CAC3B,UAAAN,EACA,KAAAN,EAAO,OAAO,SAAS,SACvB,SAAAa,EAAW,wBACX,KAAAC,EAAO,UAAU,QACnB,IAA8C,CAC5C,MAAMC,EAAa,IAAI,gBAGjBC,EAAW,SAAS,iBAA8BH,CAAQ,EAEhE,OAAIG,EAAS,QACNC,EAAkB,CACrB,UAAWZ,EAAaC,CAAS,EACjC,MAAO,MAAM,KAAKU,CAAQ,EAAE,IAAKL,GAC/BZ,EAAWW,EAASC,CAAO,GAAKX,CAAI,CACtC,EACA,KAAAc,EACA,OAAQC,EAAW,MACrB,CAAC,EACE,KAAMG,GAAW,CAChBF,EAAS,QAAQ,CAACL,EAASQ,IAAU,CACnCR,EAAQ,UAAYO,EAAOC,CAAK,EAAE,SAAS,CAC7C,CAAC,CACH,CAAC,EACA,MAAMX,CAAY,EAEhBO,EAAW,MAAM,KAAKA,CAAU,CACzC,EC1EaK,EAAU"}
|
|
1
|
+
{"version":3,"file":"comment.mjs","sources":["../../api/dist/api.mjs","../src/utils/path.ts","../src/utils/config.ts","../src/utils/error.ts","../src/utils/query.ts","../src/comment.ts","../src/version.ts"],"sourcesContent":["const m={\"Content-Type\":\"application/json\"},s=t=>`${t.replace(/\\/?$/,\"/\")}api/`,h=(t,n=\"\")=>{if(typeof t==\"object\"&&t.errno)throw new TypeError(`${n} failed with ${t.errno}: ${t.errmsg}`);return t},p=({serverURL:t,lang:n,paths:o,type:a,signal:e})=>fetch(`${s(t)}article?path=${encodeURIComponent(o.join(\",\"))}&type=${encodeURIComponent(a.join(\",\"))}&lang=${n}`,{signal:e}).then(r=>r.json()),d=({serverURL:t,lang:n,path:o,type:a,action:e})=>fetch(`${s(t)}article?lang=${n}`,{method:\"POST\",headers:m,body:JSON.stringify({path:o,type:a,action:e})}).then(r=>r.json()).then(r=>h(r,\"Update counter\").data),$=({serverURL:t,lang:n,path:o,page:a,pageSize:e,sortBy:r,signal:c,token:i})=>{const l={};return i&&(l.Authorization=`Bearer ${i}`),fetch(`${s(t)}comment?path=${encodeURIComponent(o)}&pageSize=${e}&page=${a}&lang=${n}&sortBy=${r}`,{signal:c,headers:l}).then(g=>g.json()).then(g=>h(g,\"Get comment data\").data)},u=({serverURL:t,lang:n,token:o,comment:a})=>{const e={\"Content-Type\":\"application/json\"};return o&&(e.Authorization=`Bearer ${o}`),fetch(`${s(t)}comment?lang=${n}`,{method:\"POST\",headers:e,body:JSON.stringify(a)}).then(r=>r.json())},y=({serverURL:t,lang:n,token:o,objectId:a})=>fetch(`${s(t)}comment/${a}?lang=${n}`,{method:\"DELETE\",headers:{Authorization:`Bearer ${o}`}}).then(e=>e.json()).then(e=>h(e,\"Delete comment\")),U=({serverURL:t,lang:n,token:o,objectId:a,comment:e})=>fetch(`${s(t)}comment/${a}?lang=${n}`,{method:\"PUT\",headers:{...m,Authorization:`Bearer ${o}`},body:JSON.stringify(e)}).then(r=>r.json()).then(r=>h(r,\"Update comment\")),f=({serverURL:t,lang:n,paths:o,signal:a})=>fetch(`${s(t)}comment?type=count&url=${encodeURIComponent(o.join(\",\"))}&lang=${n}`,{signal:a}).then(e=>e.json()).then(e=>h(e,\"Get comment count\").data),R=({lang:t,serverURL:n})=>{const o=(window.innerWidth-450)/2,a=(window.innerHeight-450)/2,e=window.open(`${n.replace(/\\/$/,\"\")}/ui/login?lng=${encodeURIComponent(t)}`,\"_blank\",`width=450,height=450,left=${o},top=${a},scrollbars=no,resizable=no,status=no,location=no,toolbar=no,menubar=no`);return e?.postMessage({type:\"TOKEN\",data:null},\"*\"),new Promise(r=>{const c=({data:i})=>{!i||typeof i!=\"object\"||i.type!==\"userInfo\"||i.data.token&&(e?.close(),window.removeEventListener(\"message\",c),r(i.data))};window.addEventListener(\"message\",c)})},j=({serverURL:t,lang:n,paths:o,signal:a})=>p({serverURL:t,lang:n,paths:o,type:[\"time\"],signal:a}).then(e=>Array.isArray(e)?e:[e]),v=t=>d({...t,type:\"time\",action:\"inc\"}),w=({serverURL:t,lang:n,count:o,signal:a,token:e})=>{const r={};return e&&(r.Authorization=`Bearer ${e}`),fetch(`${s(t)}comment?type=recent&count=${o}&lang=${n}`,{signal:a,headers:r}).then(c=>c.json())},C=({serverURL:t,signal:n,pageSize:o,lang:a})=>fetch(`${s(t)}user?pageSize=${o}&lang=${a}`,{signal:n}).then(e=>e.json()).then(e=>h(e,\"user list\")).then(e=>e.data);export{u as addComment,y as deleteComment,f as fetchCommentCount,p as getArticleCounter,$ as getComment,j as getPageview,w as getRecentComment,C as getUserList,R as login,d as updateArticleCounter,U as updateComment,v as updatePageview};\n//# sourceMappingURL=api.mjs.map\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","import { decodePath, isLinkHttp, removeEndingSplash } from './path.js';\nimport {\n DEFAULT_EMOJI,\n DEFAULT_LANG,\n DEFAULT_LOCALES,\n DEFAULT_REACTION,\n defaultUploadImage,\n defaultHighlighter,\n defaultTeXRenderer,\n getDefaultSearchOptions,\n getMeta,\n} from '../config/index.js';\nimport {\n type WalineEmojiInfo,\n type WalineEmojiMaps,\n type WalineLocale,\n type WalineProps,\n} from '../typings/index.js';\n\nexport interface WalineEmojiConfig {\n tabs: Pick<WalineEmojiInfo, 'name' | 'icon' | 'items'>[];\n map: WalineEmojiMaps;\n}\n\nexport interface WalineConfig\n extends Required<\n Omit<\n WalineProps,\n | 'emoji'\n | 'imageUploader'\n | 'highlighter'\n | 'texRenderer'\n | 'wordLimit'\n | 'reaction'\n | 'search'\n >\n > {\n locale: WalineLocale;\n wordLimit: [number, number] | false;\n reaction: string[];\n emoji: Exclude<WalineProps['emoji'], boolean | undefined>;\n highlighter: Exclude<WalineProps['highlighter'], true | undefined>;\n imageUploader: Exclude<WalineProps['imageUploader'], true | undefined>;\n texRenderer: Exclude<WalineProps['texRenderer'], true | undefined>;\n search: Exclude<WalineProps['search'], true | undefined>;\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 | boolean | 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 = typeof navigator === 'undefined' ? 'en-US' : navigator.language,\n locale,\n emoji = DEFAULT_EMOJI,\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 turnstileKey = '',\n commentSorting = 'latest',\n ...more\n}: WalineProps): WalineConfig => ({\n serverURL: getServerURL(serverURL),\n path: decodePath(path),\n locale: {\n ...(DEFAULT_LOCALES[lang] || DEFAULT_LOCALES[DEFAULT_LANG]),\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: Object.keys(DEFAULT_LOCALES).includes(lang) ? lang : 'en-US',\n dark,\n emoji: typeof emoji === 'boolean' ? (emoji ? DEFAULT_EMOJI : []) : emoji,\n pageSize,\n login,\n copyright,\n search:\n search === false\n ? false\n : typeof search === 'object'\n ? search\n : getDefaultSearchOptions(lang),\n recaptchaV3Key,\n turnstileKey,\n reaction: Array.isArray(reaction)\n ? reaction\n : reaction === true\n ? DEFAULT_REACTION\n : [],\n commentSorting,\n ...more,\n});\n","export const errorHandler = (err: Error): void => {\n if (err.name !== 'AbortError') console.error(err.message);\n};\n","export const getQuery = (element: HTMLElement): string | null =>\n element.dataset.path || null;\n","import { fetchCommentCount } from '@waline/api';\n\nimport { type WalineAbort } from './typings/index.js';\nimport {\n decodePath,\n errorHandler,\n getQuery,\n getServerURL,\n} from './utils/index.js';\n\nexport interface WalineCommentCountOptions {\n /**\n * Waline 服务端地址\n *\n * Waline server url\n */\n serverURL: string;\n\n /**\n * 评论数 CSS 选择器\n *\n * Comment count CSS selector\n *\n * @default '.waline-comment-count'\n */\n selector?: string;\n\n /**\n * 需要获取的默认路径\n *\n * Path to be fetched by default\n *\n * @default window.location.pathname\n */\n path?: string;\n\n /**\n * 错误提示消息所使用的语言\n *\n * Language of error message\n *\n * @default navigator.language\n */\n lang?: string;\n}\n\nexport { type WalineAbort } from './typings/index.js';\n\nexport const commentCount = ({\n serverURL,\n path = window.location.pathname,\n selector = '.waline-comment-count',\n lang = navigator.language,\n}: WalineCommentCountOptions): 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(getQuery(element) || 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":["s","t","h","n","f","o","a","e","decodePath","path","removeEndingSplash","content","isLinkHttp","link","getServerURL","serverURL","result","errorHandler","err","getQuery","element","commentCount","selector","lang","controller","elements","fetchCommentCount","counts","index","version"],"mappings":"AAAK,MAAuCA,EAAEC,GAAG,GAAGA,EAAE,QAAQ,OAAO,GAAG,CAAC,OAAOC,EAAE,CAACD,EAAEE,EAAE,KAAK,CAAC,GAAG,OAAOF,GAAG,UAAUA,EAAE,MAAM,MAAM,IAAI,UAAU,GAAGE,CAAC,gBAAgBF,EAAE,KAAK,KAAKA,EAAE,MAAM,EAAE,EAAE,OAAOA,CAAC,EAA+0CG,EAAE,CAAC,CAAC,UAAUH,EAAE,KAAKE,EAAE,MAAME,EAAE,OAAOC,CAAC,IAAI,MAAM,GAAGN,EAAEC,CAAC,CAAC,0BAA0B,mBAAmBI,EAAE,KAAK,GAAG,CAAC,CAAC,SAASF,CAAC,GAAG,CAAC,OAAOG,CAAC,CAAC,EAAE,KAAKC,GAAGA,EAAE,KAAM,CAAA,EAAE,KAAKA,GAAGL,EAAEK,EAAE,mBAAmB,EAAE,IAAI,ECAvsDC,EAAcC,GAAyB,CAClD,GAAI,CACFA,EAAO,UAAUA,CAAI,CACvB,MAAc,CAAA,CAId,OAAOA,CACT,EAEaC,EAAqB,CAACC,EAAU,KAC3CA,EAAQ,QAAQ,OAAQ,EAAE,EAEfC,EAAcC,GACzB,kBAAkB,KAAKA,CAAI,ECiChBC,EAAgBC,GAA8B,CACzD,MAAMC,EAASN,EAAmBK,CAAS,EAE3C,OAAOH,EAAWI,CAAM,EAAIA,EAAS,WAAWA,CAAM,EACxD,ECnDaC,EAAgBC,GAAqB,CAC5CA,EAAI,OAAS,cAAc,QAAQ,MAAMA,EAAI,OAAO,CAC1D,ECFaC,EAAYC,GACvBA,EAAQ,QAAQ,MAAQ,KC+CbC,EAAe,CAAC,CAC3B,UAAAN,EACA,KAAAN,EAAO,OAAO,SAAS,SACvB,SAAAa,EAAW,wBACX,KAAAC,EAAO,UAAU,QACnB,IAA8C,CAC5C,MAAMC,EAAa,IAAI,gBAGjBC,EAAW,SAAS,iBAA8BH,CAAQ,EAEhE,OAAIG,EAAS,QACNC,EAAkB,CACrB,UAAWZ,EAAaC,CAAS,EACjC,MAAO,MAAM,KAAKU,CAAQ,EAAE,IAAKL,GAC/BZ,EAAWW,EAASC,CAAO,GAAKX,CAAI,CACtC,EACA,KAAAc,EACA,OAAQC,EAAW,MACrB,CAAC,EACE,KAAMG,GAAW,CAChBF,EAAS,QAAQ,CAACL,EAASQ,IAAU,CACnCR,EAAQ,UAAYO,EAAOC,CAAK,EAAE,SAAS,CAC7C,CAAC,CACH,CAAC,EACA,MAAMX,CAAY,EAEhBO,EAAW,MAAM,KAAKA,CAAU,CACzC,EC1EaK,EAAU"}
|
package/dist/component.mjs
CHANGED
|
@@ -5,5 +5,5 @@ import{h as R,defineComponent as ce,inject as be,ref as L,computed as N,onMounte
|
|
|
5
5
|
Номер текущего слова: $2`,"Анонимный","Dwarves","Hobbits","Ents","Wizards","Elves","Maiar","GIF","Поиск GIF","Персональные данные","Одобренный","Ожидающий","Спам","Нелипкий","самый старый","последний","самый горячий","Что вы думаете?"]),Ee=re(["昵称","昵称不能少于3个字符","邮箱","请填写正确的邮件地址","网址","可选","欢迎评论","来发评论吧~","提交","喜欢","取消喜欢","回复","取消回复","评论","刷新","加载更多...","预览","表情","上传图片","秒前","分钟前","小时前","天前","刚刚","正在上传","登录","退出","博主","置顶","字",`评论字数应在 $0 到 $1 字之间!
|
|
6
6
|
当前字数:$2`,"匿名","潜水","冒泡","吐槽","活跃","话痨","传说","表情包","搜索表情包","个人资料","通过","待审核","垃圾","取消置顶","按倒序","按正序","按热度","你认为这篇文章怎么样?"]),it=re(["暱稱","暱稱不能少於3個字元","郵箱","請填寫正確的郵件地址","網址","可選","歡迎留言","來發留言吧~","送出","喜歡","取消喜歡","回覆","取消回覆","留言","重整","載入更多...","預覽","表情","上傳圖片","秒前","分鐘前","小時前","天前","剛剛","正在上傳","登入","登出","管理者","置頂","字",`留言字數應在 $0 到 $1 字之間!
|
|
7
7
|
目前字數:$2`,"匿名","潛水","冒泡","吐槽","活躍","多話","傳說","表情包","搜尋表情包","個人資料","通過","待審核","垃圾","取消置頂","最早","最新","熱門","你認為這篇文章怎麼樣?"]);const Re={zh:Ee,"zh-cn":Ee,"zh-CN":Ee,"zh-tw":it,"zh-TW":it,en:Ie,"en-US":Ie,"en-us":Ie,jp:ye,ja:ye,"jp-jp":ye,"jp-JP":ye,"pt-br":nt,"pt-BR":nt,ru:xe,"ru-ru":xe,"ru-RU":xe},xl=e=>{const a=Qe(e);return et(a)?a:`https://${a}`},El=e=>Array.isArray(e)?e:e?[0,e]:!1,_e=(e,a)=>typeof e=="function"?e:e===!1?!1:a,Rl=({serverURL:e,path:a=location.pathname,lang:t=typeof navigator>"u"?"en-US":navigator.language,locale:l,emoji:u=lt,meta:o=["nick","mail","link"],requiredMeta:k=[],dark:M=!1,pageSize:b=10,wordLimit:I,imageUploader:C,highlighter:V,texRenderer:m,copyright:S=!0,login:A="enable",search:$,reaction:p,recaptchaV3Key:n="",turnstileKey:d="",commentSorting:W="latest",...P})=>({serverURL:xl(e),path:ml(a),locale:{...Re[t]||Re[pl],...typeof l=="object"?l:{}},wordLimit:El(I),meta:tt(o),requiredMeta:tt(k),imageUploader:_e(C,hl),highlighter:_e(V,Ll),texRenderer:_e(m,fl),lang:Object.keys(Re).includes(t)?t:"en-US",dark:M,emoji:typeof u=="boolean"?u?lt:[]:u,pageSize:b,login:A,copyright:S,search:$===!1?!1:typeof $=="object"?$:yl(t),recaptchaV3Key:n,turnstileKey:d,reaction:Array.isArray(p)?p:p===!0?gl:[],commentSorting:W,...P}),Me="{--waline-white:#000;--waline-light-grey:#666;--waline-dark-grey:#999;--waline-color:#888;--waline-bg-color:#1e1e1e;--waline-bg-color-light:#272727;--waline-bg-color-hover: #444;--waline-border-color:#333;--waline-disable-bg-color:#444;--waline-disable-color:#272727;--waline-bq-color:#272727;--waline-info-bg-color:#272727;--waline-info-color:#666}",_l=e=>typeof e=="string"?e==="auto"?`@media(prefers-color-scheme:dark){body${Me}}`:`${e}${Me}`:e===!0?`:root${Me}`:"",Se=(e,a)=>{let t=e.toString();for(;t.length<a;)t="0"+t;return t},Ml=e=>{const a=Se(e.getDate(),2),t=Se(e.getMonth()+1,2);return`${Se(e.getFullYear(),2)}-${t}-${a}`},Sl=(e,a,t)=>{if(!e)return"";const l=typeof e=="string"?new Date(e.indexOf(" ")!==-1?e.replace(/-/g,"/"):e):e,u=a.getTime()-l.getTime(),o=Math.floor(u/(24*3600*1e3));if(o===0){const k=u%864e5,M=Math.floor(k/(3600*1e3));if(M===0){const b=k%36e5,I=Math.floor(b/(60*1e3));if(I===0){const C=b%6e4;return`${Math.round(C/1e3)} ${t.seconds}`}return`${I} ${t.minutes}`}return`${M} ${t.hours}`}return o<0?t.now:o<8?`${o} ${t.days}`:Ml(l)},jl=/^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/,Al=e=>jl.test(e),zl=e=>!!/@[0-9]+\.[0-9]+\.[0-9]+/.test(e),Ul=e=>{const a=oe("WALINE_EMOJI",{}),t=zl(e);if(t){const l=a.value[e];if(l)return Promise.resolve(l)}return fetch(`${e}/info.json`).then(l=>l.json()).then(l=>{const u={folder:e,...l};return t&&(a.value[e]=u),u})},ot=(e,a="",t="",l="")=>`${a?`${a}/`:""}${t}${e}${l?`.${l}`:""}`,Vl=e=>Promise.all(e.map(a=>typeof a=="string"?Ul(Qe(a)):Promise.resolve(a))).then(a=>{const t={tabs:[],map:{}};return a.forEach(l=>{const{name:u,folder:o,icon:k,prefix:M,type:b,items:I}=l;t.tabs.push({name:u,icon:ot(k,o,M,b),items:I.map(C=>{const V=`${M||""}${C}`;return t.map[V]=ot(C,o,M,b),V})})}),t}),Hl=e=>e.type.includes("image"),rt=e=>{const a=Array.from(e).find(Hl);return a?a.getAsFile():null},Tl=/\$.*?\$/,Wl=/^\$(.*?)\$/,Fl=/^(?:\s{0,3})\$\$((?:[^\n]|\n[^\n])+?)\n{0,1}\$\$/,Nl=e=>[{name:"blockMath",level:"block",tokenizer(a){const t=Fl.exec(a);if(t!==null)return{type:"html",raw:t[0],text:e(!0,t[1])}}},{name:"inlineMath",level:"inline",start(a){const t=a.search(Tl);return t!==-1?t:a.length},tokenizer(a){const t=Wl.exec(a);if(t!==null)return{type:"html",raw:t[0],text:e(!1,t[1])}}}],st=(e="",a={})=>e.replace(/:(.+?):/g,(t,l)=>a[l]?`<img class="wl-emoji" src="${a[l]}" alt="${l}">`:t),Bl=(e,{emojiMap:a,highlighter:t,texRenderer:l})=>{const u=new St;if(u.setOptions({breaks:!0}),t&&u.use(jt({highlight:t})),l){const o=Nl(l);u.use({extensions:o})}return u.parse(st(e,a))},Pl=e=>e.match(/[\w\d\s,.\u00C0-\u024F\u0400-\u04FF]+/giu),Dl=e=>e.match(/[\u4E00-\u9FD5]/gu),Ol=e=>{var a,t;return(((a=Pl(e))==null?void 0:a.reduce((l,u)=>l+(["",",","."].includes(u.trim())?0:u.trim().split(/\s+/u).length),0))||0)+(((t=Dl(e))==null?void 0:t.length)||0)},ql=async()=>{if(!navigator)return"";const{userAgentData:e}=navigator;let a=navigator.userAgent;if(!e||e.platform!=="Windows")return a;const{platformVersion:t}=await e.getHighEntropyValues(["platformVersion"]);return t&&parseInt(t.split(".")[0])>=13&&(a=a.replace("Windows NT 10.0","Windows NT 11.0")),a},Kl={class:"wl-comment"},Zl={key:0,class:"wl-login-info"},Gl={class:"wl-avatar"},Jl=["title"],Xl=["title"],Yl=["src"],Ql=["title","textContent"],ea={class:"wl-panel"},ta=["for","textContent"],la=["id","onUpdate:modelValue","name","type"],aa=["placeholder"],na={class:"wl-preview"},ia=v("hr",null,null,-1),oa=["innerHTML"],ra={class:"wl-footer"},sa={class:"wl-actions"},ca={href:"https://guides.github.com/features/mastering-markdown/",title:"Markdown Guide","aria-label":"Markdown is supported",class:"wl-action",target:"_blank",rel:"noopener noreferrer"},ua=["title"],va=["title"],ma=["title"],da=["title"],pa={class:"wl-info"},ga=v("div",{class:"wl-captcha-container"},null,-1),ha={class:"wl-text-number"},fa={key:0},ya=["textContent"],wa=["textContent"],ka=["disabled"],ba=["placeholder"],Ca={key:1,class:"wl-loading"},$a={key:0,class:"wl-tab-wrapper"},La=["title","onClick"],Ia=["src","alt"],xa={key:0,class:"wl-tabs"},Ea=["onClick"],Ra=["src","alt","title"],_a=["title"];var Ma=ce({__name:"CommentBox",props:{edit:{default:null},rootId:{default:""},replyId:{default:""},replyUser:{default:""}},emits:["log","cancelEdit","cancelReply","submit"],setup(e,{expose:a,emit:t}){const l=e,u=t;a();const o=be("config"),k=Ot(),M=Dt(),b=$e(),I=L({}),C=L(null),V=L(null),m=L(null),S=L(null),A=L(null),$=L(null),p=L(null),n=L({tabs:[],map:{}}),d=L(0),W=L(!1),P=L(!1),E=L(!1),z=L(""),ie=L(0),H=ht({loading:!0,list:[]}),ne=L(0),ee=L(!1),me=L(""),Y=L(!1),y=L(!1),g=N(()=>o.value.locale),j=N(()=>{var c;return!!((c=b.value)!=null&&c.token)}),K=N(()=>o.value.imageUploader!==!1),D=c=>{const r=C.value,h=r.selectionStart,U=r.selectionEnd||0,f=r.scrollTop;k.value=r.value.substring(0,h)+c+r.value.substring(U,r.value.length),r.focus(),r.selectionStart=h+c.length,r.selectionEnd=h+c.length,r.scrollTop=f},J=c=>{const r=c.key;(c.ctrlKey||c.metaKey)&&r==="Enter"&&Ae()},Z=c=>{const r=`![${o.value.locale.uploading} ${c.name}]()`;return D(r),Y.value=!0,Promise.resolve().then(()=>o.value.imageUploader(c)).then(h=>{k.value=k.value.replace(r,`\r
|
|
8
|
-
`)}).catch(h=>{alert(h.message),k.value=k.value.replace(r,"")}).then(()=>{Y.value=!1})},se=c=>{var r;if((r=c.dataTransfer)!=null&&r.items){const h=rt(c.dataTransfer.items);h&&K.value&&(Z(h),c.preventDefault())}},je=c=>{if(c.clipboardData){const r=rt(c.clipboardData.items);r&&K.value&&Z(r)}},we=()=>{const c=V.value;c.files&&K.value&&Z(c.files[0]).then(()=>{c.value=""})},Ae=async()=>{var c,r,h,U,f,O;const{serverURL:F,lang:Q,login:de,wordLimit:We,requiredMeta:Fe,recaptchaV3Key:Ne,turnstileKey:Be}=o.value,dt=await ql(),T={comment:me.value,nick:M.value.nick,mail:M.value.mail,link:M.value.link,url:o.value.path,ua:dt};if((c=b.value)!=null&&c.token)T.nick=b.value.display_name,T.mail=b.value.email,T.link=b.value.url;else{if(de==="force")return;if(Fe.indexOf("nick")>-1&&!T.nick)return(r=I.value.nick)==null||r.focus(),alert(g.value.nickError);if(Fe.indexOf("mail")>-1&&!T.mail||T.mail&&!Al(T.mail))return(h=I.value.mail)==null||h.focus(),alert(g.value.mailError);T.nick||(T.nick=g.value.anonymous)}if(!T.comment){(U=C.value)==null||U.focus();return}if(!ee.value)return alert(g.value.wordHint.replace("$0",We[0].toString()).replace("$1",We[1].toString()).replace("$2",ie.value.toString()));T.comment=st(T.comment,n.value.map),l.replyId&&l.rootId&&(T.pid=l.replyId,T.rid=l.rootId,T.at=l.replyUser),Y.value=!0;try{Ne&&(T.recaptchaV3=await Gt(Ne).execute("social")),Be&&(T.turnstile=await Jt(Be).execute("social"));const pe={serverURL:F,lang:Q,token:(f=b.value)==null?void 0:f.token,comment:T},ke=await(l.edit?fe({objectId:l.edit.objectId,...pe}):Et(pe));if(Y.value=!1,ke.errmsg)return alert(ke.errmsg);u("submit",ke.data),k.value="",z.value="",l.replyId&&u("cancelReply"),(O=l.edit)!=null&&O.objectId&&u("cancelEdit")}catch(pe){Y.value=!1,alert(pe.message)}},vt=c=>{c.preventDefault();const{lang:r,serverURL:h}=o.value;Rt({serverURL:h,lang:r}).then(U=>{b.value=U,(U.remember?localStorage:sessionStorage).setItem("WALINE_USER",JSON.stringify(U)),u("log")})},mt=()=>{b.value={},localStorage.setItem("WALINE_USER","null"),sessionStorage.setItem("WALINE_USER","null"),u("log")},ze=c=>{c.preventDefault();const{lang:r,serverURL:h}=o.value,U=800,f=800,O=(window.innerWidth-U)/2,F=(window.innerHeight-f)/2,Q=new URLSearchParams({lng:r,token:b.value.token}),de=window.open(`${h}/ui/profile?${Q.toString()}`,"_blank",`width=${U},height=${f},left=${O},top=${F},scrollbars=no,resizable=no,status=no,location=no,toolbar=no,menubar=no`);de==null||de.postMessage({type:"TOKEN",data:b.value.token},"*")},Ue=c=>{var r,h,U,f;!((r=m.value)!=null&&r.contains(c.target))&&!((h=S.value)!=null&&h.contains(c.target))&&(W.value=!1),!((U=A.value)!=null&&U.contains(c.target))&&!((f=$.value)!=null&&f.contains(c.target))&&(P.value=!1)},Ve=async c=>{var r;const{scrollTop:h,clientHeight:U,scrollHeight:f}=c.target,O=(U+h)/f,F=o.value.search,Q=((r=p.value)==null?void 0:r.value)||"";O<.9||H.loading||y.value||(H.loading=!0,(F.more&&H.list.length?await F.more(Q,H.list.length):await F.search(Q)).length?H.list=[...H.list,...F.more&&H.list.length?await F.more(Q,H.list.length):await F.search(Q)]:y.value=!0,H.loading=!1,setTimeout(()=>{c.target.scrollTop=h},50))},He=$t(c=>{H.list=[],y.value=!1,Ve(c)},300);te([o,ie],([c,r])=>{const{wordLimit:h}=c;h?r<h[0]&&h[0]!==0?(ne.value=h[0],ee.value=!1):r>h[1]?(ne.value=h[1],ee.value=!1):(ne.value=h[1],ee.value=!0):(ne.value=0,ee.value=!0)},{immediate:!0});const Te=({data:c})=>{!c||c.type!=="profile"||(b.value={...b.value,...c.data},[localStorage,sessionStorage].filter(r=>r.getItem("WALINE_USER")).forEach(r=>r.setItem("WALINE_USER",JSON.stringify(b))))};return ge(()=>{var c;document.body.addEventListener("click",Ue),window.addEventListener("message",Te),(c=l.edit)!=null&&c.objectId&&(k.value=l.edit.orig),te(P,async r=>{if(!r)return;const h=o.value.search;p.value&&(p.value.value=""),H.loading=!0,H.list=h.default?await h.default():await h.search(""),H.loading=!1}),te(()=>k.value,r=>{const{highlighter:h,texRenderer:U}=o.value;me.value=r,z.value=Bl(r,{emojiMap:n.value.map,highlighter:h,texRenderer:U}),ie.value=Ol(r),r?qe(C.value):qe.destroy(C.value)},{immediate:!0}),te(()=>o.value.emoji,r=>Vl(r).then(h=>{n.value=h}),{immediate:!0})}),Ce(()=>{document.body.removeEventListener("click",Ue),window.removeEventListener("message",Te)}),(c,r)=>{var h,U;return i(),s("div",Kl,[w(o).login!=="disable"&&j.value&&!((h=c.edit)!=null&&h.objectId)?(i(),s("div",Zl,[v("div",Gl,[v("button",{type:"submit",class:"wl-logout-btn",title:g.value.logout,onClick:mt},[G(w(Ke),{size:14})],8,Jl),v("a",{href:"#",class:"wl-login-nick","aria-label":"Profile",title:g.value.profile,onClick:ze},[v("img",{src:w(b).avatar,alt:"avatar"},null,8,Yl)],8,Xl)]),v("a",{href:"#",class:"wl-login-nick","aria-label":"Profile",title:g.value.profile,onClick:ze,textContent:_(w(b).display_name)},null,8,Ql)])):x("v-if",!0),v("div",ea,[w(o).login!=="force"&&w(o).meta.length&&!j.value?(i(),s("div",{key:0,class:q(["wl-header",`item${w(o).meta.length}`])},[(i(!0),s(B,null,X(w(o).meta,f=>(i(),s("div",{key:f,class:"wl-header-item"},[v("label",{for:`wl-${f}`,textContent:_(g.value[f]+(w(o).requiredMeta.includes(f)||!w(o).requiredMeta.length?"":`(${g.value.optional})`))},null,8,ta),he(v("input",{id:`wl-${f}`,ref_for:!0,ref:O=>{O&&(I.value[f]=O)},"onUpdate:modelValue":O=>w(M)[f]=O,class:q(["wl-input",`wl-${f}`]),name:f,type:f==="mail"?"email":"text"},null,10,la),[[ft,w(M)[f]]])]))),128))],2)):x("v-if",!0),he(v("textarea",{id:"wl-edit",ref_key:"editorRef",ref:C,"onUpdate:modelValue":r[0]||(r[0]=f=>yt(k)?k.value=f:null),class:"wl-editor",placeholder:c.replyUser?`@${c.replyUser}`:g.value.placeholder,onKeydown:J,onDrop:se,onPaste:je},null,40,aa),[[wt,w(k)]]),he(v("div",na,[ia,v("h4",null,_(g.value.preview)+":",1),v("div",{class:"wl-content",innerHTML:z.value},null,8,oa)],512),[[De,E.value]]),v("div",ra,[v("div",sa,[v("a",ca,[G(w(Wt))]),he(v("button",{ref_key:"emojiButtonRef",ref:m,type:"button",class:q(["wl-action",{active:W.value}]),title:g.value.emoji,onClick:r[1]||(r[1]=f=>W.value=!W.value)},[G(w(Ut))],10,ua),[[De,n.value.tabs.length]]),w(o).search?(i(),s("button",{key:0,ref_key:"gifButtonRef",ref:A,type:"button",class:q(["wl-action",{active:P.value}]),title:g.value.gif,onClick:r[2]||(r[2]=f=>P.value=!P.value)},[G(w(Pt))],10,va)):x("v-if",!0),v("input",{id:"wl-image-upload",ref_key:"imageUploadRef",ref:V,class:"upload",type:"file",accept:".png,.jpg,.jpeg,.webp,.bmp,.gif",onChange:we},null,544),K.value?(i(),s("label",{key:1,for:"wl-image-upload",class:"wl-action",title:g.value.uploadImage},[G(w(Vt))],8,ma)):x("v-if",!0),v("button",{type:"button",class:q(["wl-action",{active:E.value}]),title:g.value.preview,onClick:r[3]||(r[3]=f=>E.value=!E.value)},[G(w(Tt))],10,da)]),v("div",pa,[ga,v("div",ha,[ae(_(ie.value)+" ",1),w(o).wordLimit?(i(),s("span",fa,[ae(" / "),v("span",{class:q({illegal:!ee.value}),textContent:_(ne.value)},null,10,ya)])):x("v-if",!0),ae(" "+_(g.value.word),1)]),w(o).login!=="disable"&&!j.value?(i(),s("button",{key:0,type:"button",class:"wl-btn",onClick:vt,textContent:_(g.value.login)},null,8,wa)):x("v-if",!0),w(o).login!=="force"||j.value?(i(),s("button",{key:1,type:"submit",class:"primary wl-btn",title:"Cmd|Ctrl + Enter",disabled:Y.value,onClick:Ae},[Y.value?(i(),le(w(ue),{key:0,size:16})):(i(),s(B,{key:1},[ae(_(g.value.submit),1)],64))],8,ka)):x("v-if",!0)]),v("div",{ref_key:"gifPopupRef",ref:$,class:q(["wl-gif-popup",{display:P.value}])},[v("input",{ref_key:"gifSearchInputRef",ref:p,type:"text",placeholder:g.value.gifSearchPlaceholder,onInput:r[4]||(r[4]=(...f)=>w(He)&&w(He)(...f))},null,40,ba),H.list.length?(i(),le(vl,{key:0,items:H.list,"column-width":200,gap:6,onInsert:r[5]||(r[5]=f=>D(f)),onScroll:Ve},null,8,["items"])):x("v-if",!0),H.loading?(i(),s("div",Ca,[G(w(ue),{size:30})])):x("v-if",!0)],2),v("div",{ref_key:"emojiPopupRef",ref:S,class:q(["wl-emoji-popup",{display:W.value}])},[(i(!0),s(B,null,X(n.value.tabs,(f,O)=>(i(),s(B,{key:f.name},[O===d.value?(i(),s("div",$a,[(i(!0),s(B,null,X(f.items,F=>(i(),s("button",{key:F,type:"button",title:F,onClick:Q=>D(`:${F}:`)},[W.value?(i(),s("img",{key:0,class:"wl-emoji",src:n.value.map[F],alt:F,loading:"lazy",referrerPolicy:"no-referrer"},null,8,Ia)):x("v-if",!0)],8,La))),128))])):x("v-if",!0)],64))),128)),n.value.tabs.length>1?(i(),s("div",xa,[(i(!0),s(B,null,X(n.value.tabs,(f,O)=>(i(),s("button",{key:f.name,type:"button",class:q(["wl-tab",{active:d.value===O}]),onClick:F=>d.value=O},[v("img",{class:"wl-emoji",src:f.icon,alt:f.name,title:f.name,loading:"lazy",referrerPolicy:"no-referrer"},null,8,Ra)],10,Ea))),128))])):x("v-if",!0)],2)])]),c.replyId||(U=c.edit)!=null&&U.objectId?(i(),s("button",{key:1,type:"button",class:"wl-close",title:g.value.cancelReply,onClick:r[6]||(r[6]=f=>c.$emit(c.replyId?"cancelReply":"cancelEdit"))},[G(w(Ke),{size:24})],8,_a)):x("v-if",!0)])}}}),ct=ve(Ma,[["__file","CommentBox.vue"]]);const Sa=["id"],ja={class:"wl-user","aria-hidden":"true"},Aa=["src"],za={class:"wl-card"},Ua={class:"wl-head"},Va=["href"],Ha={key:1,class:"wl-nick"},Ta=["textContent"],Wa=["textContent"],Fa=["textContent"],Na=["textContent"],Ba=["textContent"],Pa={class:"wl-comment-actions"},Da=["title"],Oa=["title"],qa={class:"wl-meta","aria-hidden":"true"},Ka=["data-value","textContent"],Za=["innerHTML"],Ga={key:1,class:"wl-admin-actions"},Ja={class:"wl-comment-status"},Xa=["disabled","onClick","textContent"],Ya={key:3,class:"wl-quote"};var Qa=ce({__name:"CommentCard",props:{comment:{},edit:{default:null},rootId:{},reply:{default:null}},emits:["log","submit","delete","edit","like","status","sticky","reply"],setup(e,{emit:a}){const t=e,l=a,u=["approved","waiting","spam"],o=be("config"),k=Ge(),M=Lt(),b=$e(),I=N(()=>o.value.locale),C=N(()=>{const{link:n}=t.comment;return n?et(n)?n:`https://${n}`:""}),V=N(()=>k.value.includes(t.comment.objectId)),m=N(()=>Sl(t.comment.insertedAt,M.value,I.value)),S=N(()=>b.value.type==="administrator"),A=N(()=>t.comment.user_id&&b.value.objectId===t.comment.user_id),$=N(()=>{var n;return t.comment.objectId===((n=t.reply)==null?void 0:n.objectId)}),p=N(()=>{var n;return t.comment.objectId===((n=t.edit)==null?void 0:n.objectId)});return(n,d)=>{var W;const P=kt("CommentCard",!0);return i(),s("div",{id:n.comment.objectId,class:"wl-card-item"},[v("div",ja,[n.comment.avatar?(i(),s("img",{key:0,class:"wl-user-avatar",src:n.comment.avatar},null,8,Aa)):x("v-if",!0),n.comment.type?(i(),le(w(Bt),{key:1})):x("v-if",!0)]),v("div",za,[v("div",Ua,[C.value?(i(),s("a",{key:0,class:"wl-nick",href:C.value,target:"_blank",rel:"nofollow noopener noreferrer"},_(n.comment.nick),9,Va)):(i(),s("span",Ha,_(n.comment.nick),1)),n.comment.type==="administrator"?(i(),s("span",{key:2,class:"wl-badge",textContent:_(I.value.admin)},null,8,Ta)):x("v-if",!0),n.comment.label?(i(),s("span",{key:3,class:"wl-badge",textContent:_(n.comment.label)},null,8,Wa)):x("v-if",!0),n.comment.sticky?(i(),s("span",{key:4,class:"wl-badge",textContent:_(I.value.sticky)},null,8,Fa)):x("v-if",!0),typeof n.comment.level=="number"?(i(),s("span",{key:5,class:q(`wl-badge level${n.comment.level}`),textContent:_(I.value[`level${n.comment.level}`]||`Level ${n.comment.level}`)},null,10,Na)):x("v-if",!0),v("span",{class:"wl-time",textContent:_(m.value)},null,8,Ba),v("div",Pa,[S.value||A.value?(i(),s(B,{key:0},[v("button",{type:"button",class:"wl-edit",onClick:d[0]||(d[0]=E=>l("edit",n.comment))},[G(w(Nt))]),v("button",{type:"button",class:"wl-delete",onClick:d[1]||(d[1]=E=>l("delete",n.comment))},[G(w(zt))])],64)):x("v-if",!0),v("button",{type:"button",class:"wl-like",title:V.value?I.value.cancelLike:I.value.like,onClick:d[2]||(d[2]=E=>l("like",n.comment))},[G(w(Ht),{active:V.value},null,8,["active"]),ae(" "+_("like"in n.comment?n.comment.like:""),1)],8,Da),v("button",{type:"button",class:q(["wl-reply",{active:$.value}]),title:$.value?I.value.cancelReply:I.value.reply,onClick:d[3]||(d[3]=E=>l("reply",$.value?null:n.comment))},[G(w(Ft))],10,Oa)])]),v("div",qa,[(i(),s(B,null,X(["addr","browser","os"],E=>(i(),s(B,null,[n.comment[E]?(i(),s("span",{key:E,class:q(`wl-${E}`),"data-value":n.comment[E],textContent:_(n.comment[E])},null,10,Ka)):x("v-if",!0)],64))),64))]),p.value?x("v-if",!0):(i(),s("div",{key:0,class:"wl-content",innerHTML:n.comment.comment},null,8,Za)),S.value&&!p.value?(i(),s("div",Ga,[v("span",Ja,[(i(),s(B,null,X(u,E=>v("button",{key:E,type:"submit",class:q(`wl-btn wl-${E}`),disabled:n.comment.status===E,onClick:z=>l("status",{status:E,comment:n.comment}),textContent:_(I.value[E])},null,10,Xa)),64))]),S.value&&!("rid"in n.comment)?(i(),s("button",{key:0,type:"submit",class:"wl-btn wl-sticky",onClick:d[4]||(d[4]=E=>l("sticky",n.comment))},_(n.comment.sticky?I.value.unsticky:I.value.sticky),1)):x("v-if",!0)])):x("v-if",!0),$.value||p.value?(i(),s("div",{key:2,class:q({"wl-reply-wrapper":$.value,"wl-edit-wrapper":p.value})},[G(ct,{edit:n.edit,"reply-id":(W=n.reply)==null?void 0:W.objectId,"reply-user":n.comment.nick,"root-id":n.rootId,onLog:d[5]||(d[5]=E=>l("log")),onCancelReply:d[6]||(d[6]=E=>l("reply",null)),onCancelEdit:d[7]||(d[7]=E=>l("edit",null)),onSubmit:d[8]||(d[8]=E=>l("submit",E))},null,8,["edit","reply-id","reply-user","root-id"])],2)):x("v-if",!0),"children"in n.comment?(i(),s("div",Ya,[(i(!0),s(B,null,X(n.comment.children,E=>(i(),le(P,{key:E.objectId,comment:E,reply:n.reply,edit:n.edit,"root-id":n.rootId,onLog:d[9]||(d[9]=z=>l("log")),onDelete:d[10]||(d[10]=z=>l("delete",z)),onEdit:d[11]||(d[11]=z=>l("edit",z)),onLike:d[12]||(d[12]=z=>l("like",z)),onReply:d[13]||(d[13]=z=>l("reply",z)),onStatus:d[14]||(d[14]=z=>l("status",z)),onSticky:d[15]||(d[15]=z=>l("sticky",z)),onSubmit:d[16]||(d[16]=z=>l("submit",z))},null,8,["comment","reply","edit","root-id"]))),128))])):x("v-if",!0)])],8,Sa)}}}),en=ve(Qa,[["__file","CommentCard.vue"]]);const ut="3.0.0-alpha.1",tn={"data-waline":""},ln={class:"wl-meta-head"},an={class:"wl-count"},nn=["textContent"],on={class:"wl-sort"},rn=["onClick"],sn={class:"wl-cards"},cn={key:1,class:"wl-operation"},un=["textContent"],vn={key:2,class:"wl-loading"},mn=["textContent"],dn={key:4,class:"wl-operation"},pn=["textContent"],gn={key:5,class:"wl-power"},hn=v("a",{href:"https://github.com/walinejs/waline",target:"_blank",rel:"noopener noreferrer"}," Waline ",-1);var fn=ce({__name:"WalineComment",props:["serverURL","path","meta","requiredMeta","dark","commentSorting","lang","locale","pageSize","wordLimit","emoji","login","highlighter","texRenderer","imageUploader","search","copyright","recaptchaV3Key","turnstileKey","reaction"],setup(e){const a=e,t={latest:"insertedAt_desc",oldest:"insertedAt_asc",hottest:"like_desc"},l=Object.keys(t),u=$e(),o=Ge(),k=L("loading"),M=L(0),b=L(1),I=L(0),C=N(()=>Rl(a)),V=L(C.value.commentSorting),m=L([]),S=L(null),A=L(null),$=N(()=>_l(C.value.dark)),p=N(()=>C.value.locale);It($,{id:"waline-darkmode"});let n;const d=y=>{var g;const{serverURL:j,path:K,pageSize:D}=C.value,J=new AbortController;k.value="loading",n==null||n(),Mt({serverURL:j,lang:C.value.lang,path:K,pageSize:D,sortBy:t[V.value],page:y,signal:J.signal,token:(g=u.value)==null?void 0:g.token}).then(Z=>{k.value="success",M.value=Z.count,m.value.push(...Z.data),b.value=y,I.value=Z.totalPages}).catch(Z=>{Z.name!=="AbortError"&&(console.error(Z.message),k.value="error")}),n=J.abort.bind(J)},W=()=>d(b.value+1),P=()=>{M.value=0,m.value=[],d(1)},E=y=>{V.value!==y&&(V.value=y,P())},z=y=>{S.value=y},ie=y=>{A.value=y},H=y=>{if(A.value)A.value.comment=y.comment,A.value.orig=y.orig;else if("rid"in y){const g=m.value.find(({objectId:j})=>j===y.rid);if(!g)return;Array.isArray(g.children)||(g.children=[]),g.children.push(y)}else m.value.unshift(y),M.value+=1},ne=async({comment:y,status:g})=>{var j;if(y.status===g)return;const{serverURL:K,lang:D}=C.value;await fe({serverURL:K,lang:D,token:(j=u.value)==null?void 0:j.token,objectId:y.objectId,comment:{status:g}}),y.status=g},ee=async y=>{var g;if("rid"in y)return;const{serverURL:j,lang:K}=C.value;await fe({serverURL:j,lang:K,token:(g=u.value)==null?void 0:g.token,objectId:y.objectId,comment:{sticky:y.sticky?0:1}}),y.sticky=!y.sticky},me=async({objectId:y})=>{var g;if(!confirm("Are you sure you want to delete this comment?"))return;const{serverURL:j,lang:K}=C.value;await _t({serverURL:j,lang:K,token:(g=u.value)==null?void 0:g.token,objectId:y}),m.value.some((D,J)=>D.objectId===y?(m.value=m.value.filter((Z,se)=>se!==J),!0):D.children.some((Z,se)=>Z.objectId===y?(m.value[J].children=D.children.filter((je,we)=>we!==se),!0):!1))},Y=async y=>{var g;const{serverURL:j,lang:K}=C.value,{objectId:D}=y,J=o.value.includes(D);await fe({serverURL:j,lang:K,objectId:D,token:(g=u.value)==null?void 0:g.token,comment:{like:!J}}),J?o.value=o.value.filter(Z=>Z!==D):(o.value=[...o.value,D],o.value.length>50&&(o.value=o.value.slice(-50))),y.like=(y.like||0)+(J?-1:1)};return bt("config",C),ge(()=>{te(()=>[a.serverURL,a.path],()=>P(),{immediate:!0})}),Ce(()=>n==null?void 0:n()),(y,g)=>(i(),s("div",tn,[G(rl),S.value?x("v-if",!0):(i(),le(ct,{key:0,onLog:P,onSubmit:H})),v("div",ln,[v("div",an,[M.value?(i(),s("span",{key:0,class:"wl-num",textContent:_(M.value)},null,8,nn)):x("v-if",!0),ae(" "+_(p.value.comment),1)]),v("ul",on,[(i(!0),s(B,null,X(w(l),j=>(i(),s("li",{key:j,class:q([j===V.value?"active":""]),onClick:K=>E(j)},_(p.value[j]),11,rn))),128))])]),v("div",sn,[(i(!0),s(B,null,X(m.value,j=>(i(),le(en,{key:j.objectId,"root-id":j.objectId,comment:j,reply:S.value,edit:A.value,onLog:P,onReply:z,onEdit:ie,onSubmit:H,onStatus:ne,onDelete:me,onSticky:ee,onLike:Y},null,8,["root-id","comment","reply","edit"]))),128))]),k.value==="error"?(i(),s("div",cn,[v("button",{type:"button",class:"wl-btn",onClick:P,textContent:_(p.value.refresh)},null,8,un)])):k.value==="loading"?(i(),s("div",vn,[G(w(ue),{size:30})])):m.value.length?b.value<I.value?(i(),s("div",dn,[v("button",{type:"button",class:"wl-btn",onClick:W,textContent:_(p.value.more)},null,8,pn)])):x("v-if",!0):(i(),s("div",{key:3,class:"wl-empty",textContent:_(p.value.sofa)},null,8,mn)),C.value.copyright?(i(),s("div",gn,[ae(" Powered by "),hn,ae(" v"+_(w(ut)),1)])):x("v-if",!0)]))}}),yn=ve(fn,[["__file","WalineComment.vue"]]);export{yn as Waline,ut as version};
|
|
8
|
+
`)}).catch(h=>{alert(h.message),k.value=k.value.replace(r,"")}).then(()=>{Y.value=!1})},se=c=>{var r;if((r=c.dataTransfer)!=null&&r.items){const h=rt(c.dataTransfer.items);h&&K.value&&(Z(h),c.preventDefault())}},je=c=>{if(c.clipboardData){const r=rt(c.clipboardData.items);r&&K.value&&Z(r)}},we=()=>{const c=V.value;c.files&&K.value&&Z(c.files[0]).then(()=>{c.value=""})},Ae=async()=>{var c,r,h,U,f,O;const{serverURL:F,lang:Q,login:de,wordLimit:We,requiredMeta:Fe,recaptchaV3Key:Ne,turnstileKey:Be}=o.value,dt=await ql(),T={comment:me.value,nick:M.value.nick,mail:M.value.mail,link:M.value.link,url:o.value.path,ua:dt};if((c=b.value)!=null&&c.token)T.nick=b.value.display_name,T.mail=b.value.email,T.link=b.value.url;else{if(de==="force")return;if(Fe.indexOf("nick")>-1&&!T.nick)return(r=I.value.nick)==null||r.focus(),alert(g.value.nickError);if(Fe.indexOf("mail")>-1&&!T.mail||T.mail&&!Al(T.mail))return(h=I.value.mail)==null||h.focus(),alert(g.value.mailError);T.nick||(T.nick=g.value.anonymous)}if(!T.comment){(U=C.value)==null||U.focus();return}if(!ee.value)return alert(g.value.wordHint.replace("$0",We[0].toString()).replace("$1",We[1].toString()).replace("$2",ie.value.toString()));T.comment=st(T.comment,n.value.map),l.replyId&&l.rootId&&(T.pid=l.replyId,T.rid=l.rootId,T.at=l.replyUser),Y.value=!0;try{Ne&&(T.recaptchaV3=await Gt(Ne).execute("social")),Be&&(T.turnstile=await Jt(Be).execute("social"));const pe={serverURL:F,lang:Q,token:(f=b.value)==null?void 0:f.token,comment:T},ke=await(l.edit?fe({objectId:l.edit.objectId,...pe}):Et(pe));if(Y.value=!1,ke.errmsg)return alert(ke.errmsg);u("submit",ke.data),k.value="",z.value="",l.replyId&&u("cancelReply"),(O=l.edit)!=null&&O.objectId&&u("cancelEdit")}catch(pe){Y.value=!1,alert(pe.message)}},vt=c=>{c.preventDefault();const{lang:r,serverURL:h}=o.value;Rt({serverURL:h,lang:r}).then(U=>{b.value=U,(U.remember?localStorage:sessionStorage).setItem("WALINE_USER",JSON.stringify(U)),u("log")})},mt=()=>{b.value={},localStorage.setItem("WALINE_USER","null"),sessionStorage.setItem("WALINE_USER","null"),u("log")},ze=c=>{c.preventDefault();const{lang:r,serverURL:h}=o.value,U=800,f=800,O=(window.innerWidth-U)/2,F=(window.innerHeight-f)/2,Q=new URLSearchParams({lng:r,token:b.value.token}),de=window.open(`${h}/ui/profile?${Q.toString()}`,"_blank",`width=${U},height=${f},left=${O},top=${F},scrollbars=no,resizable=no,status=no,location=no,toolbar=no,menubar=no`);de==null||de.postMessage({type:"TOKEN",data:b.value.token},"*")},Ue=c=>{var r,h,U,f;!((r=m.value)!=null&&r.contains(c.target))&&!((h=S.value)!=null&&h.contains(c.target))&&(W.value=!1),!((U=A.value)!=null&&U.contains(c.target))&&!((f=$.value)!=null&&f.contains(c.target))&&(P.value=!1)},Ve=async c=>{var r;const{scrollTop:h,clientHeight:U,scrollHeight:f}=c.target,O=(U+h)/f,F=o.value.search,Q=((r=p.value)==null?void 0:r.value)||"";O<.9||H.loading||y.value||(H.loading=!0,(F.more&&H.list.length?await F.more(Q,H.list.length):await F.search(Q)).length?H.list=[...H.list,...F.more&&H.list.length?await F.more(Q,H.list.length):await F.search(Q)]:y.value=!0,H.loading=!1,setTimeout(()=>{c.target.scrollTop=h},50))},He=$t(c=>{H.list=[],y.value=!1,Ve(c)},300);te([o,ie],([c,r])=>{const{wordLimit:h}=c;h?r<h[0]&&h[0]!==0?(ne.value=h[0],ee.value=!1):r>h[1]?(ne.value=h[1],ee.value=!1):(ne.value=h[1],ee.value=!0):(ne.value=0,ee.value=!0)},{immediate:!0});const Te=({data:c})=>{!c||c.type!=="profile"||(b.value={...b.value,...c.data},[localStorage,sessionStorage].filter(r=>r.getItem("WALINE_USER")).forEach(r=>r.setItem("WALINE_USER",JSON.stringify(b))))};return ge(()=>{var c;document.body.addEventListener("click",Ue),window.addEventListener("message",Te),(c=l.edit)!=null&&c.objectId&&(k.value=l.edit.orig),te(P,async r=>{if(!r)return;const h=o.value.search;p.value&&(p.value.value=""),H.loading=!0,H.list=h.default?await h.default():await h.search(""),H.loading=!1}),te(()=>k.value,r=>{const{highlighter:h,texRenderer:U}=o.value;me.value=r,z.value=Bl(r,{emojiMap:n.value.map,highlighter:h,texRenderer:U}),ie.value=Ol(r),r?qe(C.value):qe.destroy(C.value)},{immediate:!0}),te(()=>o.value.emoji,r=>Vl(r).then(h=>{n.value=h}),{immediate:!0})}),Ce(()=>{document.body.removeEventListener("click",Ue),window.removeEventListener("message",Te)}),(c,r)=>{var h,U;return i(),s("div",Kl,[w(o).login!=="disable"&&j.value&&!((h=c.edit)!=null&&h.objectId)?(i(),s("div",Zl,[v("div",Gl,[v("button",{type:"submit",class:"wl-logout-btn",title:g.value.logout,onClick:mt},[G(w(Ke),{size:14})],8,Jl),v("a",{href:"#",class:"wl-login-nick","aria-label":"Profile",title:g.value.profile,onClick:ze},[v("img",{src:w(b).avatar,alt:"avatar"},null,8,Yl)],8,Xl)]),v("a",{href:"#",class:"wl-login-nick","aria-label":"Profile",title:g.value.profile,onClick:ze,textContent:_(w(b).display_name)},null,8,Ql)])):x("v-if",!0),v("div",ea,[w(o).login!=="force"&&w(o).meta.length&&!j.value?(i(),s("div",{key:0,class:q(["wl-header",`item${w(o).meta.length}`])},[(i(!0),s(B,null,X(w(o).meta,f=>(i(),s("div",{key:f,class:"wl-header-item"},[v("label",{for:`wl-${f}`,textContent:_(g.value[f]+(w(o).requiredMeta.includes(f)||!w(o).requiredMeta.length?"":`(${g.value.optional})`))},null,8,ta),he(v("input",{id:`wl-${f}`,ref_for:!0,ref:O=>{O&&(I.value[f]=O)},"onUpdate:modelValue":O=>w(M)[f]=O,class:q(["wl-input",`wl-${f}`]),name:f,type:f==="mail"?"email":"text"},null,10,la),[[ft,w(M)[f]]])]))),128))],2)):x("v-if",!0),he(v("textarea",{id:"wl-edit",ref_key:"editorRef",ref:C,"onUpdate:modelValue":r[0]||(r[0]=f=>yt(k)?k.value=f:null),class:"wl-editor",placeholder:c.replyUser?`@${c.replyUser}`:g.value.placeholder,onKeydown:J,onDrop:se,onPaste:je},null,40,aa),[[wt,w(k)]]),he(v("div",na,[ia,v("h4",null,_(g.value.preview)+":",1),v("div",{class:"wl-content",innerHTML:z.value},null,8,oa)],512),[[De,E.value]]),v("div",ra,[v("div",sa,[v("a",ca,[G(w(Wt))]),he(v("button",{ref_key:"emojiButtonRef",ref:m,type:"button",class:q(["wl-action",{active:W.value}]),title:g.value.emoji,onClick:r[1]||(r[1]=f=>W.value=!W.value)},[G(w(Ut))],10,ua),[[De,n.value.tabs.length]]),w(o).search?(i(),s("button",{key:0,ref_key:"gifButtonRef",ref:A,type:"button",class:q(["wl-action",{active:P.value}]),title:g.value.gif,onClick:r[2]||(r[2]=f=>P.value=!P.value)},[G(w(Pt))],10,va)):x("v-if",!0),v("input",{id:"wl-image-upload",ref_key:"imageUploadRef",ref:V,class:"upload",type:"file",accept:".png,.jpg,.jpeg,.webp,.bmp,.gif",onChange:we},null,544),K.value?(i(),s("label",{key:1,for:"wl-image-upload",class:"wl-action",title:g.value.uploadImage},[G(w(Vt))],8,ma)):x("v-if",!0),v("button",{type:"button",class:q(["wl-action",{active:E.value}]),title:g.value.preview,onClick:r[3]||(r[3]=f=>E.value=!E.value)},[G(w(Tt))],10,da)]),v("div",pa,[ga,v("div",ha,[ae(_(ie.value)+" ",1),w(o).wordLimit?(i(),s("span",fa,[ae(" / "),v("span",{class:q({illegal:!ee.value}),textContent:_(ne.value)},null,10,ya)])):x("v-if",!0),ae(" "+_(g.value.word),1)]),w(o).login!=="disable"&&!j.value?(i(),s("button",{key:0,type:"button",class:"wl-btn",onClick:vt,textContent:_(g.value.login)},null,8,wa)):x("v-if",!0),w(o).login!=="force"||j.value?(i(),s("button",{key:1,type:"submit",class:"primary wl-btn",title:"Cmd|Ctrl + Enter",disabled:Y.value,onClick:Ae},[Y.value?(i(),le(w(ue),{key:0,size:16})):(i(),s(B,{key:1},[ae(_(g.value.submit),1)],64))],8,ka)):x("v-if",!0)]),v("div",{ref_key:"gifPopupRef",ref:$,class:q(["wl-gif-popup",{display:P.value}])},[v("input",{ref_key:"gifSearchInputRef",ref:p,type:"text",placeholder:g.value.gifSearchPlaceholder,onInput:r[4]||(r[4]=(...f)=>w(He)&&w(He)(...f))},null,40,ba),H.list.length?(i(),le(vl,{key:0,items:H.list,"column-width":200,gap:6,onInsert:r[5]||(r[5]=f=>D(f)),onScroll:Ve},null,8,["items"])):x("v-if",!0),H.loading?(i(),s("div",Ca,[G(w(ue),{size:30})])):x("v-if",!0)],2),v("div",{ref_key:"emojiPopupRef",ref:S,class:q(["wl-emoji-popup",{display:W.value}])},[(i(!0),s(B,null,X(n.value.tabs,(f,O)=>(i(),s(B,{key:f.name},[O===d.value?(i(),s("div",$a,[(i(!0),s(B,null,X(f.items,F=>(i(),s("button",{key:F,type:"button",title:F,onClick:Q=>D(`:${F}:`)},[W.value?(i(),s("img",{key:0,class:"wl-emoji",src:n.value.map[F],alt:F,loading:"lazy",referrerPolicy:"no-referrer"},null,8,Ia)):x("v-if",!0)],8,La))),128))])):x("v-if",!0)],64))),128)),n.value.tabs.length>1?(i(),s("div",xa,[(i(!0),s(B,null,X(n.value.tabs,(f,O)=>(i(),s("button",{key:f.name,type:"button",class:q(["wl-tab",{active:d.value===O}]),onClick:F=>d.value=O},[v("img",{class:"wl-emoji",src:f.icon,alt:f.name,title:f.name,loading:"lazy",referrerPolicy:"no-referrer"},null,8,Ra)],10,Ea))),128))])):x("v-if",!0)],2)])]),c.replyId||(U=c.edit)!=null&&U.objectId?(i(),s("button",{key:1,type:"button",class:"wl-close",title:g.value.cancelReply,onClick:r[6]||(r[6]=f=>c.$emit(c.replyId?"cancelReply":"cancelEdit"))},[G(w(Ke),{size:24})],8,_a)):x("v-if",!0)])}}}),ct=ve(Ma,[["__file","CommentBox.vue"]]);const Sa=["id"],ja={class:"wl-user","aria-hidden":"true"},Aa=["src"],za={class:"wl-card"},Ua={class:"wl-head"},Va=["href"],Ha={key:1,class:"wl-nick"},Ta=["textContent"],Wa=["textContent"],Fa=["textContent"],Na=["textContent"],Ba=["textContent"],Pa={class:"wl-comment-actions"},Da=["title"],Oa=["title"],qa={class:"wl-meta","aria-hidden":"true"},Ka=["data-value","textContent"],Za=["innerHTML"],Ga={key:1,class:"wl-admin-actions"},Ja={class:"wl-comment-status"},Xa=["disabled","onClick","textContent"],Ya={key:3,class:"wl-quote"};var Qa=ce({__name:"CommentCard",props:{comment:{},edit:{default:null},rootId:{},reply:{default:null}},emits:["log","submit","delete","edit","like","status","sticky","reply"],setup(e,{emit:a}){const t=e,l=a,u=["approved","waiting","spam"],o=be("config"),k=Ge(),M=Lt(),b=$e(),I=N(()=>o.value.locale),C=N(()=>{const{link:n}=t.comment;return n?et(n)?n:`https://${n}`:""}),V=N(()=>k.value.includes(t.comment.objectId)),m=N(()=>Sl(t.comment.insertedAt,M.value,I.value)),S=N(()=>b.value.type==="administrator"),A=N(()=>t.comment.user_id&&b.value.objectId===t.comment.user_id),$=N(()=>{var n;return t.comment.objectId===((n=t.reply)==null?void 0:n.objectId)}),p=N(()=>{var n;return t.comment.objectId===((n=t.edit)==null?void 0:n.objectId)});return(n,d)=>{var W;const P=kt("CommentCard",!0);return i(),s("div",{id:n.comment.objectId,class:"wl-card-item"},[v("div",ja,[n.comment.avatar?(i(),s("img",{key:0,class:"wl-user-avatar",src:n.comment.avatar},null,8,Aa)):x("v-if",!0),n.comment.type?(i(),le(w(Bt),{key:1})):x("v-if",!0)]),v("div",za,[v("div",Ua,[C.value?(i(),s("a",{key:0,class:"wl-nick",href:C.value,target:"_blank",rel:"nofollow noopener noreferrer"},_(n.comment.nick),9,Va)):(i(),s("span",Ha,_(n.comment.nick),1)),n.comment.type==="administrator"?(i(),s("span",{key:2,class:"wl-badge",textContent:_(I.value.admin)},null,8,Ta)):x("v-if",!0),n.comment.label?(i(),s("span",{key:3,class:"wl-badge",textContent:_(n.comment.label)},null,8,Wa)):x("v-if",!0),n.comment.sticky?(i(),s("span",{key:4,class:"wl-badge",textContent:_(I.value.sticky)},null,8,Fa)):x("v-if",!0),typeof n.comment.level=="number"?(i(),s("span",{key:5,class:q(`wl-badge level${n.comment.level}`),textContent:_(I.value[`level${n.comment.level}`]||`Level ${n.comment.level}`)},null,10,Na)):x("v-if",!0),v("span",{class:"wl-time",textContent:_(m.value)},null,8,Ba),v("div",Pa,[S.value||A.value?(i(),s(B,{key:0},[v("button",{type:"button",class:"wl-edit",onClick:d[0]||(d[0]=E=>l("edit",n.comment))},[G(w(Nt))]),v("button",{type:"button",class:"wl-delete",onClick:d[1]||(d[1]=E=>l("delete",n.comment))},[G(w(zt))])],64)):x("v-if",!0),v("button",{type:"button",class:"wl-like",title:V.value?I.value.cancelLike:I.value.like,onClick:d[2]||(d[2]=E=>l("like",n.comment))},[G(w(Ht),{active:V.value},null,8,["active"]),ae(" "+_("like"in n.comment?n.comment.like:""),1)],8,Da),v("button",{type:"button",class:q(["wl-reply",{active:$.value}]),title:$.value?I.value.cancelReply:I.value.reply,onClick:d[3]||(d[3]=E=>l("reply",$.value?null:n.comment))},[G(w(Ft))],10,Oa)])]),v("div",qa,[(i(),s(B,null,X(["addr","browser","os"],E=>(i(),s(B,null,[n.comment[E]?(i(),s("span",{key:E,class:q(`wl-${E}`),"data-value":n.comment[E],textContent:_(n.comment[E])},null,10,Ka)):x("v-if",!0)],64))),64))]),p.value?x("v-if",!0):(i(),s("div",{key:0,class:"wl-content",innerHTML:n.comment.comment},null,8,Za)),S.value&&!p.value?(i(),s("div",Ga,[v("span",Ja,[(i(),s(B,null,X(u,E=>v("button",{key:E,type:"submit",class:q(`wl-btn wl-${E}`),disabled:n.comment.status===E,onClick:z=>l("status",{status:E,comment:n.comment}),textContent:_(I.value[E])},null,10,Xa)),64))]),S.value&&!("rid"in n.comment)?(i(),s("button",{key:0,type:"submit",class:"wl-btn wl-sticky",onClick:d[4]||(d[4]=E=>l("sticky",n.comment))},_(n.comment.sticky?I.value.unsticky:I.value.sticky),1)):x("v-if",!0)])):x("v-if",!0),$.value||p.value?(i(),s("div",{key:2,class:q({"wl-reply-wrapper":$.value,"wl-edit-wrapper":p.value})},[G(ct,{edit:n.edit,"reply-id":(W=n.reply)==null?void 0:W.objectId,"reply-user":n.comment.nick,"root-id":n.rootId,onLog:d[5]||(d[5]=E=>l("log")),onCancelReply:d[6]||(d[6]=E=>l("reply",null)),onCancelEdit:d[7]||(d[7]=E=>l("edit",null)),onSubmit:d[8]||(d[8]=E=>l("submit",E))},null,8,["edit","reply-id","reply-user","root-id"])],2)):x("v-if",!0),"children"in n.comment?(i(),s("div",Ya,[(i(!0),s(B,null,X(n.comment.children,E=>(i(),le(P,{key:E.objectId,comment:E,reply:n.reply,edit:n.edit,"root-id":n.rootId,onLog:d[9]||(d[9]=z=>l("log")),onDelete:d[10]||(d[10]=z=>l("delete",z)),onEdit:d[11]||(d[11]=z=>l("edit",z)),onLike:d[12]||(d[12]=z=>l("like",z)),onReply:d[13]||(d[13]=z=>l("reply",z)),onStatus:d[14]||(d[14]=z=>l("status",z)),onSticky:d[15]||(d[15]=z=>l("sticky",z)),onSubmit:d[16]||(d[16]=z=>l("submit",z))},null,8,["comment","reply","edit","root-id"]))),128))])):x("v-if",!0)])],8,Sa)}}}),en=ve(Qa,[["__file","CommentCard.vue"]]);const ut="3.0.0-alpha.2",tn={"data-waline":""},ln={class:"wl-meta-head"},an={class:"wl-count"},nn=["textContent"],on={class:"wl-sort"},rn=["onClick"],sn={class:"wl-cards"},cn={key:1,class:"wl-operation"},un=["textContent"],vn={key:2,class:"wl-loading"},mn=["textContent"],dn={key:4,class:"wl-operation"},pn=["textContent"],gn={key:5,class:"wl-power"},hn=v("a",{href:"https://github.com/walinejs/waline",target:"_blank",rel:"noopener noreferrer"}," Waline ",-1);var fn=ce({__name:"WalineComment",props:["serverURL","path","meta","requiredMeta","dark","commentSorting","lang","locale","pageSize","wordLimit","emoji","login","highlighter","texRenderer","imageUploader","search","copyright","recaptchaV3Key","turnstileKey","reaction"],setup(e){const a=e,t={latest:"insertedAt_desc",oldest:"insertedAt_asc",hottest:"like_desc"},l=Object.keys(t),u=$e(),o=Ge(),k=L("loading"),M=L(0),b=L(1),I=L(0),C=N(()=>Rl(a)),V=L(C.value.commentSorting),m=L([]),S=L(null),A=L(null),$=N(()=>_l(C.value.dark)),p=N(()=>C.value.locale);It($,{id:"waline-darkmode"});let n;const d=y=>{var g;const{serverURL:j,path:K,pageSize:D}=C.value,J=new AbortController;k.value="loading",n==null||n(),Mt({serverURL:j,lang:C.value.lang,path:K,pageSize:D,sortBy:t[V.value],page:y,signal:J.signal,token:(g=u.value)==null?void 0:g.token}).then(Z=>{k.value="success",M.value=Z.count,m.value.push(...Z.data),b.value=y,I.value=Z.totalPages}).catch(Z=>{Z.name!=="AbortError"&&(console.error(Z.message),k.value="error")}),n=J.abort.bind(J)},W=()=>d(b.value+1),P=()=>{M.value=0,m.value=[],d(1)},E=y=>{V.value!==y&&(V.value=y,P())},z=y=>{S.value=y},ie=y=>{A.value=y},H=y=>{if(A.value)A.value.comment=y.comment,A.value.orig=y.orig;else if("rid"in y){const g=m.value.find(({objectId:j})=>j===y.rid);if(!g)return;Array.isArray(g.children)||(g.children=[]),g.children.push(y)}else m.value.unshift(y),M.value+=1},ne=async({comment:y,status:g})=>{var j;if(y.status===g)return;const{serverURL:K,lang:D}=C.value;await fe({serverURL:K,lang:D,token:(j=u.value)==null?void 0:j.token,objectId:y.objectId,comment:{status:g}}),y.status=g},ee=async y=>{var g;if("rid"in y)return;const{serverURL:j,lang:K}=C.value;await fe({serverURL:j,lang:K,token:(g=u.value)==null?void 0:g.token,objectId:y.objectId,comment:{sticky:y.sticky?0:1}}),y.sticky=!y.sticky},me=async({objectId:y})=>{var g;if(!confirm("Are you sure you want to delete this comment?"))return;const{serverURL:j,lang:K}=C.value;await _t({serverURL:j,lang:K,token:(g=u.value)==null?void 0:g.token,objectId:y}),m.value.some((D,J)=>D.objectId===y?(m.value=m.value.filter((Z,se)=>se!==J),!0):D.children.some((Z,se)=>Z.objectId===y?(m.value[J].children=D.children.filter((je,we)=>we!==se),!0):!1))},Y=async y=>{var g;const{serverURL:j,lang:K}=C.value,{objectId:D}=y,J=o.value.includes(D);await fe({serverURL:j,lang:K,objectId:D,token:(g=u.value)==null?void 0:g.token,comment:{like:!J}}),J?o.value=o.value.filter(Z=>Z!==D):(o.value=[...o.value,D],o.value.length>50&&(o.value=o.value.slice(-50))),y.like=(y.like||0)+(J?-1:1)};return bt("config",C),ge(()=>{te(()=>[a.serverURL,a.path],()=>P(),{immediate:!0})}),Ce(()=>n==null?void 0:n()),(y,g)=>(i(),s("div",tn,[G(rl),S.value?x("v-if",!0):(i(),le(ct,{key:0,onLog:P,onSubmit:H})),v("div",ln,[v("div",an,[M.value?(i(),s("span",{key:0,class:"wl-num",textContent:_(M.value)},null,8,nn)):x("v-if",!0),ae(" "+_(p.value.comment),1)]),v("ul",on,[(i(!0),s(B,null,X(w(l),j=>(i(),s("li",{key:j,class:q([j===V.value?"active":""]),onClick:K=>E(j)},_(p.value[j]),11,rn))),128))])]),v("div",sn,[(i(!0),s(B,null,X(m.value,j=>(i(),le(en,{key:j.objectId,"root-id":j.objectId,comment:j,reply:S.value,edit:A.value,onLog:P,onReply:z,onEdit:ie,onSubmit:H,onStatus:ne,onDelete:me,onSticky:ee,onLike:Y},null,8,["root-id","comment","reply","edit"]))),128))]),k.value==="error"?(i(),s("div",cn,[v("button",{type:"button",class:"wl-btn",onClick:P,textContent:_(p.value.refresh)},null,8,un)])):k.value==="loading"?(i(),s("div",vn,[G(w(ue),{size:30})])):m.value.length?b.value<I.value?(i(),s("div",dn,[v("button",{type:"button",class:"wl-btn",onClick:W,textContent:_(p.value.more)},null,8,pn)])):x("v-if",!0):(i(),s("div",{key:3,class:"wl-empty",textContent:_(p.value.sofa)},null,8,mn)),C.value.copyright?(i(),s("div",gn,[ae(" Powered by "),hn,ae(" v"+_(w(ut)),1)])):x("v-if",!0)]))}}),yn=ve(fn,[["__file","WalineComment.vue"]]);export{yn as Waline,ut as version};
|
|
9
9
|
//# sourceMappingURL=component.mjs.map
|