@waline/client 2.0.0-alpha.3 → 2.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@waline/client",
3
- "version": "2.0.0-alpha.3",
3
+ "version": "2.0.1",
4
4
  "description": "client for waline comment system",
5
5
  "keywords": [
6
6
  "valine",
package/src/comment.ts CHANGED
@@ -1,9 +1,31 @@
1
1
  import { useUserInfo } from './composables';
2
2
  import { decodePath, errorHandler, fetchCommentCount } from './utils';
3
+ import type { WalineAbort } from './typings';
3
4
 
4
- export interface CommentCountOptions {
5
+ export interface WalineCommentCountOptions {
6
+ /**
7
+ * Waline 服务端地址
8
+ *
9
+ * Waline server url
10
+ */
5
11
  serverURL: string;
12
+
13
+ /**
14
+ * 评论数 CSS 选择器
15
+ *
16
+ * Commment count CSS selector
17
+ *
18
+ * @default '.waline-comment-count'
19
+ */
6
20
  selector?: string;
21
+
22
+ /**
23
+ * 需要获取的默认路径
24
+ *
25
+ * Path to be fetched by default
26
+ *
27
+ * @default window.location.pathname
28
+ */
7
29
  path?: string;
8
30
  }
9
31
 
@@ -11,7 +33,8 @@ export const commentCount = ({
11
33
  serverURL,
12
34
  path = window.location.pathname,
13
35
  selector = '.waline-comment-count',
14
- }: CommentCountOptions): ((reason?: unknown) => void) => {
36
+ }: // eslint-disable-next-line @typescript-eslint/no-explicit-any
37
+ WalineCommentCountOptions): WalineAbort => {
15
38
  const controller = new AbortController();
16
39
 
17
40
  // comment count
@@ -9,52 +9,54 @@ import {
9
9
  import type { DeprecatedWalineOptions } from './v1';
10
10
  import type { WalineInitOptions } from '../typings';
11
11
 
12
- export const covertOptions = ({
13
- // Options which needs to be polyfilled
14
- placeholder,
15
- langMode = {},
16
- emojiCDN,
17
- emojiMaps,
18
- requiredFields = [],
19
- anonymous,
20
- previewMath,
21
- uploadImage,
22
- highlight,
23
- copyRight,
24
- visitor,
12
+ export const covertOptions = (
13
+ options: WalineInitOptions & DeprecatedValineOptions & DeprecatedWalineOptions
14
+ ): WalineInitOptions => {
15
+ const {
16
+ // Options which needs to be polyfilled
17
+ placeholder,
18
+ langMode = {},
19
+ emojiCDN,
20
+ emojiMaps,
21
+ requiredFields = [],
22
+ anonymous,
23
+ previewMath,
24
+ uploadImage,
25
+ highlight,
26
+ copyRight,
27
+ visitor,
28
+
29
+ pageview = visitor === true
30
+ ? '.leancloud_visitors,.waline-visitor-count,.waline-pageview-count'
31
+ : visitor,
32
+ locale = langMode,
33
+ emoji,
34
+ requiredMeta = requiredFields,
35
+ highlighter = highlight,
36
+ imageUploader = uploadImage,
37
+ texRenderer = previewMath,
38
+ copyright = copyRight,
39
+ login = anonymous === true
40
+ ? 'disable'
41
+ : anonymous === false
42
+ ? 'force'
43
+ : 'enable',
44
+ ...more
45
+ } = options;
25
46
 
26
- pageview = visitor === true
27
- ? '.leancloud_visitors,.waline-visitor-count,.waline-pageview-count'
28
- : visitor,
29
- locale = langMode,
30
- emoji,
31
- requiredMeta = requiredFields,
32
- highlighter = highlight,
33
- imageUploader = uploadImage,
34
- texRenderer = previewMath,
35
- copyright = copyRight,
36
- login = anonymous === true
37
- ? 'disable'
38
- : anonymous === false
39
- ? 'force'
40
- : 'enable',
41
- ...more
42
- }: WalineInitOptions &
43
- DeprecatedValineOptions &
44
- DeprecatedWalineOptions): WalineInitOptions => {
45
47
  // error with those which can no longr be handled
46
48
  DROPPED_OPTIONS_WHICH_CAN_NOT_BE_POLYFILLED.filter((item) =>
47
- Object.keys(more).includes(item)
49
+ Object.keys(options).includes(item)
48
50
  ).forEach((item) =>
49
- warning(`Option ${item} is removed and can NOT be polyfilled!`)
51
+ warning(`Option "${item}" is REMOVED and CAN NOT be polyfilled!`)
50
52
  );
51
53
 
52
54
  // warnings with those which can no longr be handled
53
55
  DROPPED_OPTIONS_WHICH_CAN_STILL_BE_POLYFILLED.filter(([oldOption]) =>
54
- Object.keys(more).includes(oldOption)
56
+ Object.keys(options).includes(oldOption)
55
57
  ).forEach(([oldOption, newOption]) =>
56
58
  warning(
57
- `Option ${oldOption} waas deprecated in v1 and is currently being polyfilled, Please move to option ${newOption} in v2!`
59
+ `Deprecated option "${oldOption}" is currently being polyfilled, Please switch to option "${newOption}" in v2!`
58
60
  )
59
61
  );
60
62
 
@@ -27,7 +27,7 @@ export const DROPPED_OPTIONS_WHICH_CAN_STILL_BE_POLYFILLED: [string, string][] =
27
27
  ['placeholder', 'locale.placeholder'],
28
28
 
29
29
  // waline v1
30
- ['hightlight', 'highlighter'],
30
+ ['highlight', 'highlighter'],
31
31
  ['uploadImage', 'imageUploader'],
32
32
  ['previewMath', 'texRenderer'],
33
33
  ['anonymous', 'login'],
@@ -5,7 +5,7 @@ export const CloseIcon: FunctionalComponent<{ size: number }> = ({ size }) =>
5
5
  h(
6
6
  'svg',
7
7
  {
8
- class: 'vclose-icon',
8
+ class: 'wl-close-icon',
9
9
  viewBox: '0 0 1024 1024',
10
10
  width: size,
11
11
  height: size,
@@ -6,6 +6,18 @@
6
6
  {{ i18n.comment }}
7
7
  </div>
8
8
 
9
+ <div class="wl-cards">
10
+ <CommentCard
11
+ v-for="comment in data"
12
+ :key="comment.objectId"
13
+ :root-id="comment.objectId"
14
+ :comment="comment"
15
+ :reply="reply"
16
+ @reply="onReply"
17
+ @submit="onSubmit"
18
+ />
19
+ </div>
20
+
9
21
  <div v-if="status === 'error'" class="wl-action">
10
22
  <button
11
23
  type="button"
@@ -15,27 +27,15 @@
15
27
  />
16
28
  </div>
17
29
 
18
- <div v-else-if="status === 'loading'" class="wl-loading">
19
- <LoadingIcon :size="30" />
20
- </div>
21
-
22
30
  <template v-else>
23
- <div v-if="!data.length" class="wl-empty" v-text="i18n.sofa" />
24
-
25
- <div v-else class="wl-cards">
26
- <CommentCard
27
- v-for="comment in data"
28
- :key="comment.objectId"
29
- :root-id="comment.objectId"
30
- :comment="comment"
31
- :reply="reply"
32
- @reply="onReply"
33
- @submit="onSubmit"
34
- />
31
+ <div v-if="status === 'loading'" class="wl-loading">
32
+ <LoadingIcon :size="30" />
35
33
  </div>
36
34
 
35
+ <div v-else-if="!data.length" class="wl-empty" v-text="i18n.sofa" />
36
+
37
37
  <!-- Load more button -->
38
- <div v-if="page < totalPages" class="wl-more">
38
+ <div v-else-if="page < totalPages" class="wl-more">
39
39
  <button
40
40
  type="button"
41
41
  class="wl-btn"
@@ -93,7 +93,7 @@ declare const SHOULD_VALIDATE: boolean;
93
93
  declare const VERSION: string;
94
94
 
95
95
  export default defineComponent({
96
- name: 'Waline-Root',
96
+ name: 'WalineRoot',
97
97
 
98
98
  components: {
99
99
  CommentBox,
@@ -10,7 +10,7 @@ import type { WalineInitOptions } from '../typings';
10
10
  export { WalineInstance } from '../init';
11
11
 
12
12
  warning(
13
- ' This is a legacy package compatable with Valine and Waline@v1, please switch to Waline v2 using https://CDN.LINK/@waline/client@next/dist/waline.js instead!'
13
+ ' This is a legacy package compatable with Valine and Waline@v1, please switch to Waline@v2 using https://<CDN.LINK>/@waline/client/dist/waline.js instead!'
14
14
  );
15
15
 
16
16
  // inject css styles
@@ -18,7 +18,7 @@ warning(
18
18
  const link = document.createElement('link');
19
19
 
20
20
  link.rel = 'stylesheet';
21
- link.href = '//cdn.jsdelivr.net/npm/@waline/client@next/dist/waline.css';
21
+ link.href = '//cdn.jsdelivr.net/npm/@waline/client/dist/waline.css';
22
22
 
23
23
  document.head.appendChild(link);
24
24
 
package/src/init.ts CHANGED
@@ -5,11 +5,36 @@ import { commentCount } from './comment';
5
5
  import { pageviewCount } from './pageview';
6
6
  import { getRoot } from './utils';
7
7
 
8
- import type { WalineInitOptions, WalineProps } from './typings';
8
+ import type { WalineInitOptions } from './typings';
9
9
 
10
10
  export interface WalineInstance {
11
+ /**
12
+ * Waline 被挂载到的元素
13
+ *
14
+ * @description 当通过 `el: null` 初始化,值为 `null`
15
+ *
16
+ * Element where Waline is mounted
17
+ *
18
+ * @description when initialized with `el: null`, it will be `null`
19
+ */
11
20
  el: HTMLElement | null;
12
- update: (newOptions: Partial<WalineProps>) => void;
21
+
22
+ /**
23
+ * 更新 Waline 实例
24
+ *
25
+ * @description 只要不设置`path` 选项,更新时它就会被重置为 `windows.location.pathname`
26
+ *
27
+ * Update Waline instance
28
+ *
29
+ * @description when not setting `path` option, it will be reset to `window.location.pathname`
30
+ */
31
+ update: (newOptions: Partial<Omit<WalineInitOptions, 'el'>>) => void;
32
+
33
+ /**
34
+ * 取消挂载并摧毁 Waline 实例
35
+ *
36
+ * Unmount and destroy Waline instance
37
+ */
13
38
  destroy: () => void;
14
39
  }
15
40
 
package/src/pageview.ts CHANGED
@@ -5,53 +5,59 @@ import {
5
5
  updatePageviews,
6
6
  } from './utils';
7
7
 
8
- const renderVisitorCount = (
9
- counts: number[],
10
- countElements: HTMLElement[]
11
- ): void => {
12
- countElements.forEach((element, index) => {
13
- element.innerText = counts[index].toString();
14
- });
15
- };
8
+ import type { WalineAbort } from './typings';
16
9
 
17
- export interface VisitorCountOptions {
10
+ export interface WalinePageviewCountOptions {
18
11
  /**
19
- * Waline server url
20
- *
21
12
  * Waline 服务端地址
13
+ *
14
+ * Waline server url
22
15
  */
23
16
  serverURL: string;
24
17
 
25
18
  /**
26
- * Path to be fetched and updated
19
+ * 浏览量 CSS 选择器
27
20
  *
28
- * 需要更新和获取的路径
21
+ * Pageview CSS selector
29
22
  *
30
- * @default window.location.pathname
31
- */
32
- path?: string;
33
-
34
- /**
35
23
  * @default '.waline-pageview-count'
36
24
  */
37
25
  selector?: string;
38
26
 
39
27
  /**
40
- * Whether update pageviews when fetching path result
28
+ * 需要更新和获取的路径
29
+ *
30
+ * Path to be fetched and updated
41
31
  *
32
+ * @default window.location.pathname
33
+ */
34
+ path?: string;
35
+
36
+ /**
42
37
  * 是否在查询时更新 path 的浏览量
43
38
  *
39
+ * Whether update pageviews when fetching path result
40
+ *
44
41
  * @default true
45
42
  */
46
43
  update?: boolean;
47
44
  }
48
45
 
46
+ const renderVisitorCount = (
47
+ counts: number[],
48
+ countElements: HTMLElement[]
49
+ ): void => {
50
+ countElements.forEach((element, index) => {
51
+ element.innerText = counts[index].toString();
52
+ });
53
+ };
54
+
49
55
  export const pageviewCount = ({
50
56
  serverURL,
51
57
  path = window.location.pathname,
52
58
  selector = '.waline-pageview-count',
53
59
  update = true,
54
- }: VisitorCountOptions): ((reason?: unknown) => void) => {
60
+ }: WalinePageviewCountOptions): WalineAbort => {
55
61
  const controller = new AbortController();
56
62
 
57
63
  const elements = Array.from(
@@ -81,7 +81,7 @@
81
81
  .wl-tabs {
82
82
  position: relative;
83
83
  height: 2em;
84
- padding: 0 6px;
84
+ padding: 0 6px 1px;
85
85
 
86
86
  &::before {
87
87
  content: ' ';
@@ -20,6 +20,8 @@
20
20
 
21
21
  text-decoration: none;
22
22
 
23
+ word-break: break-word;
24
+
23
25
  cursor: pointer;
24
26
 
25
27
  &:hover {
@@ -39,3 +39,6 @@ export interface WalineInitOptions extends Omit<WalineProps, 'path'> {
39
39
  */
40
40
  path?: string;
41
41
  }
42
+
43
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
44
+ export type WalineAbort = (reason?: any) => void;