artalk 2.3.3 → 2.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (105) hide show
  1. package/dist/Artalk.css +1 -1
  2. package/dist/Artalk.es.js +3184 -2888
  3. package/dist/Artalk.iife.js +1 -1
  4. package/dist/Artalk.js +1 -1
  5. package/dist/ArtalkLite.css +1 -1
  6. package/dist/ArtalkLite.es.js +3157 -2887
  7. package/dist/ArtalkLite.iife.js +1 -1
  8. package/dist/ArtalkLite.js +1 -1
  9. package/dist/src/api/admin.d.ts +10 -0
  10. package/dist/src/api/api-base.d.ts +14 -0
  11. package/dist/src/api/captcha.d.ts +14 -0
  12. package/dist/src/api/comment.d.ts +29 -0
  13. package/dist/src/api/index.d.ts +31 -0
  14. package/dist/src/api/page.d.ts +22 -0
  15. package/dist/src/api/request.d.ts +12 -0
  16. package/dist/src/api/site.d.ts +17 -0
  17. package/dist/src/api/system.d.ts +13 -0
  18. package/dist/src/api/upload.d.ts +11 -0
  19. package/dist/src/api/user.d.ts +28 -0
  20. package/dist/src/artalk.d.ts +56 -0
  21. package/dist/src/comment/actions.d.ts +17 -0
  22. package/dist/src/comment/comment.d.ts +67 -0
  23. package/dist/src/comment/index.d.ts +2 -0
  24. package/dist/src/comment/render.d.ts +76 -0
  25. package/dist/src/components/action-btn.d.ts +52 -0
  26. package/dist/src/components/dialog.d.ts +18 -0
  27. package/dist/src/components/pagination.d.ts +30 -0
  28. package/dist/src/components/read-more-btn.d.ts +33 -0
  29. package/dist/src/context.d.ts +72 -0
  30. package/dist/src/defaults.d.ts +3 -0
  31. package/dist/src/editor/editor.d.ts +84 -0
  32. package/dist/src/editor/index.d.ts +2 -0
  33. package/dist/src/editor/plugs/editor-plug.d.ts +26 -0
  34. package/dist/src/editor/plugs/emoticons-plug.d.ts +36 -0
  35. package/dist/src/editor/plugs/header-input-plug.d.ts +13 -0
  36. package/dist/src/editor/plugs/preview-plug.d.ts +10 -0
  37. package/dist/src/editor/plugs/upload-plug.d.ts +10 -0
  38. package/dist/src/i18n/en.d.ts +69 -0
  39. package/dist/src/i18n/index.d.ts +294 -0
  40. package/dist/src/i18n/zh-CN.d.ts +3 -0
  41. package/dist/src/layer/index.d.ts +3 -0
  42. package/dist/src/layer/layer.d.ts +32 -0
  43. package/dist/src/layer/sidebar-layer.d.ts +20 -0
  44. package/dist/src/lib/checker/admin-checker.d.ts +3 -0
  45. package/dist/src/lib/checker/captcha-checker.d.ts +3 -0
  46. package/dist/src/lib/checker/index.d.ts +42 -0
  47. package/dist/src/lib/component.d.ts +12 -0
  48. package/dist/src/lib/detect.d.ts +10 -0
  49. package/dist/src/lib/stat.d.ts +15 -0
  50. package/dist/src/lib/ui.d.ts +23 -0
  51. package/dist/src/lib/user.d.ts +13 -0
  52. package/dist/src/lib/utils.d.ts +39 -0
  53. package/dist/src/list/index.d.ts +2 -0
  54. package/dist/src/list/list-lite.d.ts +63 -0
  55. package/dist/src/list/list-nest.d.ts +10 -0
  56. package/dist/src/list/list.d.ts +26 -0
  57. package/dist/src/main.d.ts +4 -0
  58. package/dist/types/artalk-config.d.ts +132 -0
  59. package/dist/types/artalk-data.d.ts +204 -0
  60. package/dist/types/context.d.ts +146 -0
  61. package/dist/types/event.d.ts +28 -0
  62. package/dist/types/global.d.ts +0 -0
  63. package/dist/types/plug.d.ts +4 -0
  64. package/index.html +3 -3
  65. package/package.json +5 -5
  66. package/src/api/admin.ts +18 -0
  67. package/src/api/api-base.ts +27 -0
  68. package/src/api/captcha.ts +24 -0
  69. package/src/api/comment.ts +84 -0
  70. package/src/api/index.ts +25 -361
  71. package/src/api/page.ts +85 -0
  72. package/src/api/request.ts +12 -8
  73. package/src/api/site.ts +51 -0
  74. package/src/api/system.ts +39 -0
  75. package/src/api/upload.ts +29 -0
  76. package/src/api/user.ts +75 -0
  77. package/src/artalk.ts +75 -76
  78. package/src/comment/actions.ts +3 -3
  79. package/src/comment/comment.ts +6 -9
  80. package/src/comment/render.ts +93 -47
  81. package/src/components/pagination.ts +0 -1
  82. package/src/context.ts +57 -18
  83. package/src/editor/editor.ts +111 -18
  84. package/src/editor/plugs/header-input-plug.ts +1 -1
  85. package/src/editor/plugs/upload-plug.ts +1 -1
  86. package/src/i18n/en.ts +3 -0
  87. package/src/i18n/index.ts +117 -2
  88. package/src/i18n/zh-CN.ts +4 -1
  89. package/src/layer/sidebar-layer.ts +1 -3
  90. package/src/lib/checker/admin-checker.ts +1 -1
  91. package/src/lib/checker/captcha-checker.ts +3 -3
  92. package/src/lib/stat.ts +2 -2
  93. package/src/lib/ui.ts +6 -0
  94. package/src/list/list-lite.ts +33 -25
  95. package/src/list/list.ts +3 -4
  96. package/src/main.ts +3 -0
  97. package/src/style/comment.less +2 -3
  98. package/src/style/main.less +6 -0
  99. package/test/CSRF.html +26 -0
  100. package/types/artalk-data.d.ts +3 -0
  101. package/types/context.d.ts +19 -1
  102. package/types/global.d.ts +0 -2
  103. package/vite-base.config.ts +9 -5
  104. package/vite.config.ts +5 -1
  105. package/types/index.d.ts +0 -3
@@ -0,0 +1,15 @@
1
+ import ContextApi from '../../types/context';
2
+ import ArtalkPlug from '../../types/plug';
3
+ export interface CountConf {
4
+ ctx: ContextApi;
5
+ /** 是否增加当前页面 PV 数 */
6
+ pvAdd?: boolean;
7
+ }
8
+ export declare const PvCountWidget: ArtalkPlug;
9
+ /** 初始化评论数和 PV 数量展示元素 */
10
+ export declare function initCountWidget(p: CountConf): Promise<void>;
11
+ export declare function handleStatCount(p: CountConf, args: {
12
+ api: 'page_pv' | 'page_comment';
13
+ countEl: string;
14
+ curtPageCount?: number;
15
+ }): Promise<void>;
@@ -0,0 +1,23 @@
1
+ /** 显示加载 */
2
+ export declare function showLoading(parentElem: HTMLElement, conf?: {
3
+ transparentBg?: boolean;
4
+ }): void;
5
+ /** 隐藏加载 */
6
+ export declare function hideLoading(parentElem: HTMLElement): void;
7
+ /** 元素加载动画 */
8
+ export declare function setLoading(val: boolean, parentElem: HTMLElement): void;
9
+ /** 元素是否用户可见 */
10
+ export declare function isVisible(el: HTMLElement, viewport?: HTMLElement): boolean;
11
+ /** 滚动到元素中心 */
12
+ export declare function scrollIntoView(elem: HTMLElement, enableAnim?: boolean): void;
13
+ /** 显示消息 */
14
+ export declare function showNotify(wrapElem: HTMLElement, msg: string, type: 's' | 'e' | 'w' | 'i'): void;
15
+ /** fade 动画 */
16
+ export declare function playFadeAnim(elem: HTMLElement, after?: () => void, type?: 'in' | 'out'): void;
17
+ /** 渐入动画 */
18
+ export declare function playFadeInAnim(elem: HTMLElement, after?: () => void): void;
19
+ /** 渐出动画 */
20
+ export declare function playFadeOutAnim(elem: HTMLElement, after?: () => void): void;
21
+ /** 设置全局错误 */
22
+ export declare function setError(parentElem: HTMLElement, html: string | HTMLElement | null, title?: string): void;
23
+ export declare function getScrollBarWidth(): number;
@@ -0,0 +1,13 @@
1
+ import { LocalUser } from '../../types/artalk-config';
2
+ import Context from '../../types/context';
3
+ export default class User {
4
+ ctx: Context;
5
+ data: LocalUser;
6
+ constructor(ctx: Context);
7
+ /** 保存用户到 localStorage 中 */
8
+ update(obj?: Partial<LocalUser>): void;
9
+ /** 注销,清除用户登录状态 */
10
+ logout(): void;
11
+ /** 是否已填写基本用户信息 */
12
+ checkHasBasicUserInfo(): boolean;
13
+ }
@@ -0,0 +1,39 @@
1
+ import Context from '../../types/context';
2
+ export declare function createElement<E extends HTMLElement = HTMLElement>(htmlStr?: string): E;
3
+ export declare function getHeight(el: HTMLElement): number;
4
+ export declare function htmlEncode(str: string): string;
5
+ export declare function htmlDecode(str: string): string;
6
+ export declare function getQueryParam(name: string): string | null;
7
+ export declare function getOffset(el: HTMLElement): {
8
+ top: number;
9
+ left: number;
10
+ };
11
+ export declare function padWithZeros(vNumber: number, width: number): string;
12
+ export declare function dateFormat(date: Date): string;
13
+ export declare function timeAgo(date: Date, ctx: Context): string;
14
+ /** 所有图片加载完毕后执行 */
15
+ export declare function onImagesLoaded($container: HTMLElement, event: Function): void;
16
+ export declare function getGravatarURL(ctx: Context, emailMD5: string): string;
17
+ export declare function sleep(ms: number): Promise<unknown>;
18
+ /** 版本号比较(a < b :-1 | 0 | b < a :1) */
19
+ export declare function versionCompare(a: string, b: string): 0 | 1 | -1;
20
+ /** 初始化 marked */
21
+ export declare function initMarked(ctx: Context): void;
22
+ /** 解析 markdown */
23
+ export declare function marked(ctx: Context, src: string): string;
24
+ /** 获取修正后的 UserAgent */
25
+ export declare function getCorrectUserAgent(): Promise<string>;
26
+ /** 是否为完整的 URL */
27
+ export declare function isValidURL(urlRaw: string): boolean;
28
+ /** 获取基于 conf.server 的 URL */
29
+ export declare function getURLBasedOnApi(ctx: Context, path: string): string;
30
+ /** 获取基于某个 baseURL 的 URL */
31
+ export declare function getURLBasedOn(baseURL: string, path: string): string;
32
+ /**
33
+ * Performs a deep merge of `source` into `target`.
34
+ * Mutates `target` only but not its objects and arrays.
35
+ *
36
+ * @author inspired by [jhildenbiddle](https://stackoverflow.com/a/48218209).
37
+ * @link https://gist.github.com/ahtcx/0cd94e62691f539160b32ecda18af3d6
38
+ */
39
+ export declare function mergeDeep(target: any, source: any): any;
@@ -0,0 +1,2 @@
1
+ import List from './list';
2
+ export default List;
@@ -0,0 +1,63 @@
1
+ import { ListData, CommentData, NotifyData } from '../../types/artalk-data';
2
+ import Context from '../../types/context';
3
+ import Component from '../lib/component';
4
+ import Comment from '../comment';
5
+ import Pagination from '../components/pagination';
6
+ import ReadMoreBtn from '../components/read-more-btn';
7
+ import * as ListNest from './list-nest';
8
+ export default class ListLite extends Component {
9
+ protected $commentsWrap: HTMLElement;
10
+ protected data?: ListData;
11
+ protected isLoading: boolean;
12
+ noCommentText: string;
13
+ /** 平铺模式 */
14
+ flatMode: boolean;
15
+ /** 嵌套模式 */
16
+ nestSortBy: ListNest.SortByType;
17
+ /** 分页 */
18
+ pageMode: 'pagination' | 'read-more';
19
+ pageSize: number;
20
+ scrollListenerAt?: HTMLElement;
21
+ repositionAt?: HTMLElement;
22
+ protected pagination?: Pagination;
23
+ protected readMoreBtn?: ReadMoreBtn;
24
+ protected autoLoadScrollEvent?: any;
25
+ renderComment?: (comment: Comment) => void;
26
+ paramsEditor?: (params: any) => void;
27
+ onAfterLoad?: (data: ListData) => void;
28
+ protected unread: NotifyData[];
29
+ unreadHighlight?: boolean;
30
+ constructor(ctx: Context);
31
+ getData(): ListData | undefined;
32
+ clearData(): void;
33
+ getCommentsWrapEl(): HTMLElement;
34
+ /** 加载动画 */
35
+ setLoading(val: boolean, isFirstLoad?: boolean): void;
36
+ /** 评论获取 */
37
+ fetchComments(offset: number): Promise<void>;
38
+ protected onLoad(data: ListData, offset: number): void;
39
+ /** 分页模式 */
40
+ private refreshPagination;
41
+ private initPagination;
42
+ /** 错误处理 */
43
+ protected onError(msg: any, offset: number, errData?: any): void;
44
+ /** 刷新界面 */
45
+ refreshUI(): void;
46
+ /** 重新加载列表 */
47
+ reload(): void;
48
+ /** 创建新评论 */
49
+ protected createComment(cData: CommentData, ctxData?: CommentData[]): Comment;
50
+ /** 导入评论 · 通过请求数据 */
51
+ importComments(srcData: CommentData[]): void;
52
+ private importCommentsNest;
53
+ /** 导入评论 · 平铺模式 */
54
+ private putCommentFlatMode;
55
+ /** 新增评论 · 首部添加 */
56
+ insertComment(commentData: CommentData): void;
57
+ /** 更新评论 */
58
+ updateComment(commentData: CommentData): void;
59
+ /** 更新未读数据 */
60
+ updateUnread(notifies: NotifyData[]): void;
61
+ /** 版本检测 */
62
+ versionCheck(name: 'frontend' | 'backend', needVersion: string, curtVersion: string): boolean;
63
+ }
@@ -0,0 +1,10 @@
1
+ import { CommentData } from '../../types/artalk-data';
2
+ export declare type CommentNode = {
3
+ id: number;
4
+ comment: CommentData;
5
+ children: CommentNode[];
6
+ parent?: CommentNode;
7
+ level: number;
8
+ };
9
+ export declare type SortByType = 'DATE_DESC' | 'DATE_ASC' | 'SRC_INDEX' | 'VOTE_UP_DESC';
10
+ export declare function makeNestCommentNodeList(srcData: CommentData[], sortBy?: SortByType, nestMax?: number): CommentNode[];
@@ -0,0 +1,26 @@
1
+ import { ListData, NotifyData } from '../../types/artalk-data';
2
+ import Context from '../../types/context';
3
+ import ListLite from './list-lite';
4
+ export default class List extends ListLite {
5
+ private $closeCommentBtn;
6
+ private $openSidebarBtn;
7
+ private $unreadBadge;
8
+ private $commentCount;
9
+ private $commentCountNum;
10
+ private $dropdownWrap?;
11
+ constructor(ctx: Context);
12
+ private initListActionBtn;
13
+ /** 刷新界面 */
14
+ refreshUI(): void;
15
+ protected onLoad(data: ListData, offset: number): void;
16
+ private goToCommentFounded;
17
+ goToCommentDelay: boolean;
18
+ /** 跳到评论项位置 - 根据 `location.hash` */
19
+ checkGoToCommentByUrlHash(): void;
20
+ /** 管理员设置页面信息 */
21
+ adminPageEditSave(): void;
22
+ showUnreadBadge(count: number): void;
23
+ /** 初始化选择下拉层 */
24
+ protected initDropdown(): void;
25
+ updateUnread(notifies: NotifyData[]): void;
26
+ }
@@ -0,0 +1,4 @@
1
+ import Artalk from './artalk';
2
+ import ListLite from './list/list-lite';
3
+ export default Artalk;
4
+ export { ListLite };
@@ -0,0 +1,132 @@
1
+ import { I18n } from '../src/i18n'
2
+
3
+ export default interface ArtalkConfig {
4
+ /** 装载元素 */
5
+ el: string|HTMLElement
6
+
7
+ /** 页面唯一标识(完整 URL) */
8
+ pageKey: string
9
+
10
+ /** 页面标题 */
11
+ pageTitle: string
12
+
13
+ /** 服务器地址 */
14
+ server: string
15
+
16
+ /** 站点名 */
17
+ site: string
18
+
19
+ /** 评论框占位字符 */
20
+ placeholder: string
21
+
22
+ /** 评论为空时显示字符 */
23
+ noComment: string
24
+
25
+ /** 发送按钮文字 */
26
+ sendBtn: string
27
+
28
+ /** 评论框旅行(显示在待回复评论后面) */
29
+ editorTravel: boolean
30
+
31
+ /** 表情包 */
32
+ emoticons: object|any[]|string|false
33
+
34
+ /** Gravatar 头像 */
35
+ gravatar: {
36
+ /** 镜像 */
37
+ mirror: string
38
+ /** 默认头像(URL or Gravatar Type) */
39
+ default: string
40
+ }
41
+
42
+ /** 分页配置 */
43
+ pagination: {
44
+ /** 每次请求获取数量 */
45
+ pageSize: number
46
+ /** 阅读更多模式 */
47
+ readMore: boolean
48
+ /** 滚动到底部自动加载 */
49
+ autoLoad: boolean
50
+ }
51
+
52
+ /** 内容限高 */
53
+ heightLimit: {
54
+ /** 评论内容限高 */
55
+ content: number
56
+
57
+ /** 子评论区域限高 */
58
+ children: number
59
+ }
60
+
61
+ /** 评论投票按钮 */
62
+ vote: boolean
63
+
64
+ /** 评论投票反对按钮 */
65
+ voteDown: boolean
66
+
67
+ /** 评论预览功能 */
68
+ preview: boolean
69
+
70
+ /** 评论数绑定元素 Selector */
71
+ countEl: string
72
+
73
+ /** PV 数绑定元素 Selector */
74
+ pvEl: string
75
+
76
+ /** 暗黑模式 */
77
+ darkMode: boolean|'auto'
78
+
79
+ /** 请求超时(单位:秒) */
80
+ reqTimeout: number
81
+
82
+ /** 平铺模式 */
83
+ flatMode: boolean|'auto'
84
+
85
+ /** 嵌套模式 · 最大层数 */
86
+ nestMax: number
87
+
88
+ /** 嵌套模式 · 排序方式 */
89
+ nestSort: 'DATE_ASC'|'DATE_DESC'
90
+
91
+ /** 显示 UA 徽标 */
92
+ uaBadge: boolean
93
+
94
+ /** 评论列表排序功能 (显示 Dropdown) */
95
+ listSort: boolean
96
+
97
+ /** 图片上传功能 */
98
+ imgUpload: boolean
99
+
100
+ /** 图片上传器 */
101
+ imgUploader?: (file: File) => Promise<string>
102
+
103
+ /** 版本检测 */
104
+ versionCheck: boolean
105
+
106
+ /** 应用后端配置 */
107
+ useBackendConf: boolean
108
+
109
+ /** 语言本地化 */
110
+ locale: I18n|string
111
+ }
112
+
113
+ /**
114
+ * 本地持久化用户数据
115
+ * @note 始终保持一层结构,不支持多层结构
116
+ */
117
+ export interface LocalUser {
118
+ /** 昵称 */
119
+ nick: string
120
+
121
+ /** 邮箱 */
122
+ email: string
123
+
124
+ /** 链接 */
125
+ link: string
126
+
127
+ /** TOKEN */
128
+ token: string
129
+
130
+ /** 是否为管理员 */
131
+ isAdmin: boolean
132
+ }
@@ -0,0 +1,204 @@
1
+ export interface CommentData {
2
+ /** 评论 ID */
3
+ id: number
4
+
5
+ /** 评论正文 */
6
+ content: string
7
+
8
+ /** 用户昵称 */
9
+ nick: string
10
+
11
+ /** 用户邮箱 (该字段仅管理员可见) */
12
+ email?: string
13
+
14
+ /** 用户邮箱(已加密) */
15
+ email_encrypted: string
16
+
17
+ /** 用户链接 */
18
+ link: string
19
+
20
+ /** 回复目标评论 ID */
21
+ rid: number
22
+
23
+ /** User Agent */
24
+ ua: string
25
+
26
+ /** 评论日期 */
27
+ date: string
28
+
29
+ /** 是否折叠 */
30
+ is_collapsed?: boolean
31
+
32
+ /** 是否待审 */
33
+ is_pending?: boolean
34
+
35
+ /** 是否置顶 */
36
+ is_pinned?: boolean
37
+
38
+ /** 是否为管理员 */
39
+ is_admin?: boolean
40
+
41
+ /** 徽章文字 */
42
+ badge_name?: string
43
+
44
+ /** 徽章颜色 */
45
+ badge_color?: string
46
+
47
+ /** 是否允许回复 */
48
+ is_allow_reply?: boolean
49
+
50
+ /** 评论页面 key */
51
+ page_key: string
52
+
53
+ /** 评论页面 url */
54
+ page_url?: string
55
+
56
+ /** 是否可见 */
57
+ visible: boolean
58
+
59
+ /** 站点名(用于隔离) */
60
+ site_name: string
61
+
62
+ /** 赞同数 */
63
+ vote_up: number
64
+
65
+ /** 反对数 */
66
+ vote_down: number
67
+ }
68
+
69
+ export interface ListData {
70
+ /** 评论数据 */
71
+ comments: CommentData[]
72
+
73
+ /** 根评论总数 */
74
+ total_roots: number
75
+
76
+ /** 评论总数(包括所有子评论) */
77
+ total: number
78
+
79
+ /** 页面信息 */
80
+ page: PageData
81
+
82
+ /** 站点信息 */
83
+ site: SiteData
84
+
85
+ /** 未读的 Notifies */
86
+ unread: NotifyData[]
87
+
88
+ /** 未读计数 */
89
+ unread_count: number
90
+
91
+ /** API 版本 */
92
+ api_version: ApiVersionData
93
+
94
+ /** 后端配置 */
95
+ conf: any // TODO
96
+ }
97
+
98
+ export interface PageData {
99
+ /** 页面 ID */
100
+ id: number
101
+
102
+ /** 页面唯一标识符 */
103
+ key: string
104
+
105
+ /** 页面标题 */
106
+ title: string
107
+
108
+ /** 页面 url */
109
+ url: string
110
+
111
+ /** 仅管理员可评 */
112
+ admin_only: boolean
113
+
114
+ /** 站点名(用于隔离) */
115
+ site_name: string
116
+
117
+ /** 赞同数 */
118
+ vote_up: number
119
+
120
+ /** 反对数 */
121
+ vote_down: number
122
+ }
123
+
124
+ export interface SiteData {
125
+ /** 站点 ID */
126
+ id: number
127
+
128
+ /** 站点名 */
129
+ name: string
130
+
131
+ /** 站点 URLs */
132
+ urls: string[]
133
+
134
+ /** 站点 URLs(原始字符串) */
135
+ urls_raw: string
136
+
137
+ /** 站点主 URL */
138
+ first_url: string
139
+ }
140
+
141
+ export interface UserData {
142
+ /** 用户 ID */
143
+ id: number
144
+
145
+ /** 用户名 */
146
+ name: string
147
+
148
+ /** 邮箱 */
149
+ email: string
150
+
151
+ /** 链接 */
152
+ link: string
153
+
154
+ /** 徽章名称 */
155
+ badge_name: string
156
+
157
+ /** 徽章颜色 */
158
+ badge_color: string
159
+
160
+ /** 是否属于管理员 */
161
+ is_admin: boolean
162
+ }
163
+
164
+ export interface NotifyData {
165
+ /** 通知 ID */
166
+ id: number
167
+
168
+ /** 用户 ID */
169
+ user_id: number
170
+
171
+ /** 评论 ID */
172
+ comment_id: number
173
+
174
+ /** 是否已读 */
175
+ is_read: boolean
176
+
177
+ /** 是否已发送邮件通知 */
178
+ is_emailed: boolean
179
+
180
+ /** 标为已读地址 */
181
+ read_link: string
182
+ }
183
+
184
+ export type EmoticonGrpData = {
185
+ name: string,
186
+ type: 'emoticon'|'image'|'emoji'
187
+ items: {key: string, val: string}[]
188
+ }
189
+
190
+ export type EmoticonListData = EmoticonGrpData[]
191
+
192
+ export interface ApiVersionData {
193
+ /** API 程序名 */
194
+ app: string
195
+
196
+ /** API 程序版本号 */
197
+ version: string
198
+
199
+ /** API 程序 CommitHash */
200
+ commit_hash: string
201
+
202
+ /** API 程序要求前端最小版本 */
203
+ fe_min_version: string
204
+ }
@@ -0,0 +1,146 @@
1
+ import { marked as libMarked } from 'marked'
2
+ import ArtalkConfig from './artalk-config'
3
+ import { CommentData, NotifyData } from './artalk-data'
4
+ import { EventPayloadMap, Event, EventScopeType, Handler } from './event'
5
+ import { internal as internalLocales, I18n } from '../src/i18n'
6
+ import Api from '../src/api'
7
+ import User from '../src/lib/user'
8
+ import Editor from '../src/editor'
9
+ import Comment from '../src/comment'
10
+ import ListLite from '../src/list/list-lite'
11
+ import SidebarLayer, { SidebarShowPayload } from '../src/layer/sidebar-layer'
12
+ import CheckerLauncher, { CheckerCaptchaPayload, CheckerPayload } from '../src/lib/checker'
13
+
14
+ /**
15
+ * Context 接口
16
+ *
17
+ * (面向接口的编程)
18
+ */
19
+ export default interface ContextApi {
20
+ /** Context 唯一标识 */
21
+ cid: number
22
+
23
+ /** Artalk 根元素对象 */
24
+ $root: HTMLElement
25
+
26
+ /** 配置对象 */
27
+ conf: ArtalkConfig
28
+
29
+ /** 用户对象 */
30
+ user: User
31
+
32
+ /** marked 依赖对象 */
33
+ markedInstance?: typeof libMarked
34
+
35
+ /** marked 内容替换器 */
36
+ markedReplacers: ((raw: string) => string)[]
37
+
38
+ /* 设置持有的同事类 (中介者模式) */
39
+ setApi(api: Api): void
40
+ setEditor(editor: Editor): void
41
+ setList(list?: ListLite): void
42
+ setSidebarLayer(list: SidebarLayer): void
43
+ setCheckerLauncher(checkerLauncher: CheckerLauncher): void
44
+
45
+ /** 获取 API 以供 HTTP 请求 */
46
+ getApi(): Api
47
+
48
+ /** 获取评论实例对象列表 */
49
+ getCommentList(): Comment[]
50
+
51
+ /** 获取评论数据列表 */
52
+ getCommentDataList(): CommentData[]
53
+
54
+ /** 查找评论 */
55
+ findComment(id: number): Comment|undefined
56
+
57
+ /** 删除评论 */
58
+ deleteComment(comment: number|Comment): void
59
+
60
+ /** 清空评论 */
61
+ clearAllComments(): void
62
+
63
+ /** 插入评论 */
64
+ insertComment(commentData: CommentData): void
65
+
66
+ /** 更新评论 */
67
+ updateComment(commentData: CommentData): void
68
+
69
+ /** 评论回复 */
70
+ replyComment(commentData: CommentData, $comment: HTMLElement, scroll?: boolean): void
71
+
72
+ /** 取消回复评论 */
73
+ cancelReplyComment(): void
74
+
75
+ /** 编辑评论 */
76
+ editComment(commentData: CommentData, $comment: HTMLElement): void
77
+
78
+ /** 取消编辑评论 */
79
+ cancelEditComment(): void
80
+
81
+ /** 更新通知数据 */
82
+ updateNotifies(notifies: NotifyData[]): void
83
+
84
+ /** 列表 - 重新加载数据 */
85
+ listReload(): void
86
+
87
+ /** 列表 - 重新加载数据 (别名) */
88
+ reload(): void
89
+
90
+ /** 列表 - UI 更新 */
91
+ listRefreshUI(): void
92
+
93
+ /** 列表 - HashGoto 功能检测 */
94
+ listHashGotoCheck(): void
95
+
96
+ /** 显示侧边栏 */
97
+ showSidebar(payload?: SidebarShowPayload): void
98
+
99
+ /** 隐藏侧边栏 */
100
+ hideSidebar(): void
101
+
102
+ /** 编辑器 - 关闭评论 */
103
+ editorClose(): void
104
+
105
+ /** 编辑器 - 打开评论 */
106
+ editorOpen(): void
107
+
108
+ /** 编辑器 - 显示加载 */
109
+ editorShowLoading(): void
110
+
111
+ /** 编辑器 - 隐藏加载 */
112
+ editorHideLoading(): void
113
+
114
+ /** 编辑器 - 显示提示消息 */
115
+ editorShowNotify(msg: string, type: "i" | "s" | "w" | "e"): void
116
+
117
+ /** 评论框 - 位置移动 */
118
+ editorTravel($el: HTMLElement): void
119
+
120
+ /** 评论框 - 位置回归 */
121
+ editorTravelBack(): void
122
+
123
+ /** 验证码检测 */
124
+ checkCaptcha(payload: CheckerCaptchaPayload): void
125
+
126
+ /** 管理员检测 */
127
+ checkAdmin(payload: CheckerPayload): void
128
+
129
+ /** 管理员显示元素可见性更新 */
130
+ checkAdminShowEl(): void
131
+
132
+ /** 订阅注册 */
133
+ on<K extends keyof EventPayloadMap>(name: K, handler: Handler<EventPayloadMap[K]>, scope?: EventScopeType): void
134
+
135
+ /** 订阅取消 */
136
+ off<K extends keyof EventPayloadMap>(name: K, handler?: Handler<EventPayloadMap[K]>, scope?: EventScopeType): void
137
+
138
+ /** 订阅发布 */
139
+ trigger<K extends keyof EventPayloadMap>(name: K, payload?: EventPayloadMap[K], scope?: EventScopeType): void
140
+
141
+ /** i18n 翻译 */
142
+ $t(key: keyof I18n, args?: {[key: string]: string}): string
143
+
144
+ /** 设置暗黑模式 */
145
+ setDarkMode(darkMode: boolean): void
146
+ }