@inpageedit/core 0.10.0 → 0.11.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (63) hide show
  1. package/README.md +9 -2
  2. package/dist/PluginPrefSync-COidewzp.js +258 -0
  3. package/dist/PluginPrefSync-COidewzp.js.map +1 -0
  4. package/dist/__test__/utils/constants.d.ts +3 -2
  5. package/dist/components/index.js +69 -51
  6. package/dist/components/index.js.map +1 -1
  7. package/dist/constants/endpoints.d.ts +1 -1
  8. package/dist/{index-BR6gK_ki.js → index-BNDyaWnI.js} +44 -38
  9. package/dist/index-BNDyaWnI.js.map +1 -0
  10. package/dist/{index-BnAhw94L.js → index-BQzuJxBO.js} +2 -2
  11. package/dist/{index-BnAhw94L.js.map → index-BQzuJxBO.js.map} +1 -1
  12. package/dist/{index-Z-_kjibx.js → index-BUI2IX49.js} +763 -699
  13. package/dist/index-BUI2IX49.js.map +1 -0
  14. package/dist/{index-Cx-YiN1j.js → index-CBszdxJJ.js} +22 -21
  15. package/dist/index-CBszdxJJ.js.map +1 -0
  16. package/dist/index-CfgnJ51A.js +185 -0
  17. package/dist/index-CfgnJ51A.js.map +1 -0
  18. package/dist/index-Cx4qgCJK.js +4914 -0
  19. package/dist/{index-DqJUIV2e.js.map → index-Cx4qgCJK.js.map} +1 -1
  20. package/dist/index-D5J7RU5I.js +211 -0
  21. package/dist/index-D5J7RU5I.js.map +1 -0
  22. package/dist/{index-ByzgI28q.js → index-MhNAv9Vf.js} +6 -2
  23. package/dist/index-MhNAv9Vf.js.map +1 -0
  24. package/dist/{index-ByJfEsN8.js → index-U2RPZk8N.js} +148 -110
  25. package/dist/index-U2RPZk8N.js.map +1 -0
  26. package/dist/{index-CAiGct8U.js → index-VnRKIVau.js} +42 -42
  27. package/dist/index-VnRKIVau.js.map +1 -0
  28. package/dist/{index-eOIVMf9E.js → index-etJXONAj.js} +46 -35
  29. package/dist/index-etJXONAj.js.map +1 -0
  30. package/dist/index.js +1 -1
  31. package/dist/models/WikiTitle/index.d.ts +2 -2
  32. package/dist/plugins/analytics/index.d.ts +41 -0
  33. package/dist/plugins/in-article-links/index.d.ts +14 -0
  34. package/dist/plugins/preferences-ui/PluginPrefSync.d.ts +2 -0
  35. package/dist/plugins/preferences-ui/index.d.ts +3 -1
  36. package/dist/plugins/quick-delete/index.d.ts +3 -0
  37. package/dist/plugins/quick-diff/index.d.ts +17 -0
  38. package/dist/plugins/quick-edit/index.d.ts +8 -0
  39. package/dist/plugins/quick-move/index.d.ts +16 -0
  40. package/dist/plugins/quick-redirect/index.d.ts +15 -0
  41. package/dist/plugins/toolbox/index.d.ts +9 -0
  42. package/dist/services/PreferencesService.d.ts +9 -2
  43. package/dist/services/WikiMetadataService.d.ts +23 -23
  44. package/dist/style.css +1 -1
  45. package/dist/types/WikiMetadata.d.ts +6 -8
  46. package/lib/index.umd.js +24 -24
  47. package/lib/index.umd.js.map +1 -1
  48. package/lib/style.css +1 -1
  49. package/package.json +3 -3
  50. package/dist/ActionButton-BgbTKTg7.js +0 -24
  51. package/dist/ActionButton-BgbTKTg7.js.map +0 -1
  52. package/dist/PluginPrefSync-CNCU2DJU.js +0 -171
  53. package/dist/PluginPrefSync-CNCU2DJU.js.map +0 -1
  54. package/dist/index-2mNdeL-V.js +0 -193
  55. package/dist/index-2mNdeL-V.js.map +0 -1
  56. package/dist/index-BR6gK_ki.js.map +0 -1
  57. package/dist/index-ByJfEsN8.js.map +0 -1
  58. package/dist/index-ByzgI28q.js.map +0 -1
  59. package/dist/index-CAiGct8U.js.map +0 -1
  60. package/dist/index-Cx-YiN1j.js.map +0 -1
  61. package/dist/index-DqJUIV2e.js +0 -4861
  62. package/dist/index-Z-_kjibx.js.map +0 -1
  63. package/dist/index-eOIVMf9E.js.map +0 -1
package/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  <div align="center">
2
2
 
3
- [<img src="/docs/.vitepress/public/images/logo/ipe-next-uwu.png" width="280" alt="InPageEdit Logo">](https://www.ipe.wiki)
3
+ [<img src="https://www.ipe.wiki/images/logo/ipe-next-uwu.png" width="280" alt="InPageEdit Logo">](https://www.ipe.wiki)
4
4
 
5
5
  # InPageEdit NEXT
6
6
 
@@ -8,6 +8,8 @@
8
8
 
9
9
  **InPageEdit NEXT**是由机智的小鱼君开发的一款 MediaWiki 多功能插件。主要功能旨在使许多 MediaWiki 的功能在不打开新标签页的情况下完成(包括但不限于编辑),极大加快维护 wiki 的速度。模块化设计、类型定义清晰完整,插件可自由热插拔。
10
10
 
11
+ → <https://www.ipe.wiki> ←
12
+
11
13
  </div>
12
14
 
13
15
  ## 快速上手 / Quick Start
@@ -19,7 +21,12 @@
19
21
  <!-- prettier-ignore -->
20
22
  ```javascript
21
23
  // InPageEdit NEXT
22
- $('<script src="https://unpkg.com/@inpageedit/core" type="module"></script>').appendTo('body')
24
+ document.body.append(
25
+ Object.assign(document.createElement('script'), {
26
+ src: 'https://cdn.jsdelivr.net/npm/@inpageedit/core/dist/index.js',
27
+ type: 'module',
28
+ })
29
+ )
23
30
  ```
24
31
 
25
32
  ## 特色功能 / Features
@@ -0,0 +1,258 @@
1
+ import { j as s } from "./index-CvhkVj_L.js";
2
+ import { B as I, S as d, W as E, I as k } from "./index-BUI2IX49.js";
3
+ var U = Object.create, u = Object.defineProperty, j = Object.getOwnPropertyDescriptor, b = (o, e) => (e = Symbol[o]) ? e : Symbol.for("Symbol." + o), w = (o) => {
4
+ throw TypeError(o);
5
+ }, C = (o, e, r) => e in o ? u(o, e, { enumerable: !0, configurable: !0, writable: !0, value: r }) : o[e] = r, T = (o, e) => u(o, "name", { value: e, configurable: !0 }), F = (o) => [, , , U(o?.[b("metadata")] ?? null)], L = ["class", "method", "getter", "setter", "accessor", "field", "value", "get", "set"], v = (o) => o !== void 0 && typeof o != "function" ? w("Function expected") : o, O = (o, e, r, n, t) => ({ kind: L[o], name: e, metadata: n, addInitializer: (a) => r._ ? w("Already initialized") : t.push(v(a || null)) }), D = (o, e) => C(e, b("metadata"), o[3]), N = (o, e, r, n) => {
6
+ for (var t = 0, a = o[e >> 1], i = a && a.length; t < i; t++) a[t].call(r);
7
+ return n;
8
+ }, B = (o, e, r, n, t, a) => {
9
+ var i, l, m, c = e & 7, y = !1, x = 0, P = o[x] || (o[x] = []), p = c && (t = t.prototype, c < 5 && (c > 3 || !y) && j(t, r));
10
+ T(t, r);
11
+ for (var f = n.length - 1; f >= 0; f--)
12
+ m = O(c, r, l = {}, o[3], P), i = (0, n[f])(t, m), l._ = 1, v(i) && (t = i);
13
+ return D(o, t), p && u(t, r, p), y ? c ^ 4 ? a : p : t;
14
+ }, S, h, _;
15
+ S = [k(["preferences", "wikiPage", "wikiTitle", "modal", "preferencesUI"])];
16
+ class g extends (_ = I) {
17
+ constructor(e) {
18
+ super(e, {}, "pref-sync"), this.ctx = e, e.set("prefSync", this);
19
+ }
20
+ start() {
21
+ const e = this.ctx;
22
+ e.preferences.defineCategory({
23
+ name: "pref-sync",
24
+ label: "Sync",
25
+ description: "Import and export preferences",
26
+ index: 98
27
+ }), e.preferences.registerCustomConfig(
28
+ "pref-sync-user-page",
29
+ d.object({
30
+ "pref-sync-user-page": d.const(
31
+ /* @__PURE__ */ s("section", { children: /* @__PURE__ */ s("div", { style: { display: "flex", flexDirection: "column", gap: "1rem" }, children: [
32
+ /* @__PURE__ */ s(
33
+ "button",
34
+ {
35
+ className: "btn primary",
36
+ onClick: (r) => {
37
+ r.preventDefault();
38
+ const n = e.preferencesUI.getExistingModal(), t = r.target;
39
+ t.disabled = !0, n?.setLoadingState(!0), this.importFromUserPage().then((a) => {
40
+ this.notifyImportSuccess(a), n?.close?.();
41
+ }).finally(() => {
42
+ t.disabled = !1, n?.setLoadingState(!1);
43
+ });
44
+ },
45
+ children: "Import"
46
+ }
47
+ ),
48
+ /* @__PURE__ */ s(
49
+ "button",
50
+ {
51
+ className: "btn primary",
52
+ onClick: (r) => {
53
+ r.preventDefault();
54
+ const n = r.target;
55
+ n.disabled = !0;
56
+ const t = e.preferencesUI.getExistingModal();
57
+ t?.setLoadingState(!0), this.exportToUserPage().then((a) => {
58
+ e.modal.notify("success", {
59
+ title: "Preferences Exported",
60
+ content: /* @__PURE__ */ s("p", { children: [
61
+ "Your preferences have been exported to",
62
+ " ",
63
+ /* @__PURE__ */ s("a", { href: a.getURL().toString(), target: "_blank", children: a.getPrefixedText() }),
64
+ "."
65
+ ] })
66
+ }), t?.close?.();
67
+ }).finally(() => {
68
+ n.disabled = !1, t?.setLoadingState(!1);
69
+ });
70
+ },
71
+ children: "Export"
72
+ }
73
+ )
74
+ ] }) })
75
+ ).role("raw-html")
76
+ }).description("Backup your preferences via user page"),
77
+ "pref-sync"
78
+ ), e.preferences.registerCustomConfig(
79
+ "pref-sync-manual",
80
+ d.object({
81
+ "pref-sync-manual": d.const(
82
+ /* @__PURE__ */ s("section", { children: /* @__PURE__ */ s("div", { style: { display: "flex", flexDirection: "column", gap: "1rem" }, children: [
83
+ /* @__PURE__ */ s(
84
+ "button",
85
+ {
86
+ className: "btn",
87
+ onClick: (r) => {
88
+ r.preventDefault();
89
+ const n = e.preferencesUI.getExistingModal();
90
+ n?.setLoadingState(!0);
91
+ const t = document.createElement("input");
92
+ t.type = "file", t.accept = "application/json", t.addEventListener("change", async (a) => {
93
+ try {
94
+ const i = a.target.files?.[0];
95
+ if (!i)
96
+ return;
97
+ const l = await this.importFromFile(i);
98
+ this.notifyImportSuccess(l), n?.close?.();
99
+ } catch (i) {
100
+ e.modal.notify("error", {
101
+ title: "Import failed",
102
+ content: i instanceof Error ? i.message : String(i)
103
+ });
104
+ } finally {
105
+ n?.setLoadingState(!1);
106
+ }
107
+ }), t.addEventListener("cancel", () => {
108
+ n?.setLoadingState(!1);
109
+ }), t.click();
110
+ },
111
+ children: "Import from file"
112
+ }
113
+ ),
114
+ /* @__PURE__ */ s(
115
+ "button",
116
+ {
117
+ className: "btn",
118
+ onClick: async (r) => {
119
+ r.preventDefault();
120
+ const n = await e.preferences.getExportableRecord(), t = JSON.stringify(n, null, 2);
121
+ e.modal.dialog(
122
+ {
123
+ title: "Save to file",
124
+ content: /* @__PURE__ */ s("div", { children: [
125
+ /* @__PURE__ */ s("label", { htmlFor: "data", children: "Your InPageEdit preferences:" }),
126
+ /* @__PURE__ */ s(
127
+ "textarea",
128
+ {
129
+ name: "data",
130
+ id: "data",
131
+ rows: 10,
132
+ value: t,
133
+ readOnly: !0,
134
+ style: { width: "100%" }
135
+ }
136
+ )
137
+ ] }),
138
+ buttons: [
139
+ {
140
+ label: "Copy",
141
+ method: () => {
142
+ navigator.clipboard.writeText(t), e.modal.notify("success", {
143
+ content: "Copied to clipboard"
144
+ });
145
+ }
146
+ },
147
+ {
148
+ label: "Download",
149
+ method: () => {
150
+ const a = document.createElement("a");
151
+ a.href = `data:text/json;charset=utf-8,${encodeURIComponent(t)}`, a.download = `ipe-prefs-${(/* @__PURE__ */ new Date()).toISOString()}.json`, a.click();
152
+ }
153
+ }
154
+ ]
155
+ },
156
+ () => {
157
+ }
158
+ );
159
+ },
160
+ children: "Save to file"
161
+ }
162
+ )
163
+ ] }) })
164
+ ).role("raw-html")
165
+ }).description("Backup your preferences to file"),
166
+ "pref-sync"
167
+ );
168
+ }
169
+ stop() {
170
+ }
171
+ /**
172
+ * 获取用户页配置文件的标题
173
+ */
174
+ getUserPrefsPageTitle() {
175
+ try {
176
+ const e = this.ctx.wiki?.userInfo?.name;
177
+ return e ? this.ctx.wikiTitle.newTitle(`User:${e}/ipe-prefs.json`, 2) : null;
178
+ } catch {
179
+ return null;
180
+ }
181
+ }
182
+ /**
183
+ * 从用户页加载配置
184
+ */
185
+ async importFromUserPage() {
186
+ const e = this.getUserPrefsPageTitle();
187
+ if (!e)
188
+ return this.logger.debug("Cannot get user page title, skipping load"), {};
189
+ try {
190
+ const r = e.getURL({ action: "raw", ctype: "application/json" });
191
+ let n;
192
+ try {
193
+ if (n = await fetch(r.toString()), !n.ok) {
194
+ if (n.status === 404)
195
+ return this.logger.debug("User preferences page does not exist"), {};
196
+ throw new Error(`HTTP ${n.status}: ${n.statusText}`);
197
+ }
198
+ } catch (i) {
199
+ if (i instanceof TypeError && i.message.includes("Failed to fetch"))
200
+ return this.logger.debug("User preferences page does not exist or network error"), {};
201
+ throw i;
202
+ }
203
+ const t = await n.blob(), a = await this.importFromFile(t);
204
+ return this.logger.info("Loaded preferences from user page:", e), a;
205
+ } catch (r) {
206
+ return this.logger.error("Failed to load preferences from user page:", r), {};
207
+ }
208
+ }
209
+ /**
210
+ * 导出配置到用户页
211
+ */
212
+ async exportToUserPage() {
213
+ const e = this.ctx, r = this.getUserPrefsPageTitle();
214
+ if (!r)
215
+ throw new Error("Cannot get user page title");
216
+ const n = await e.preferences.getExportableRecord(), t = JSON.stringify(n, null, 2);
217
+ try {
218
+ return await this.ctx.wikiPage.newBlankPage({
219
+ title: r.toString(),
220
+ ns: 2
221
+ // User namespace
222
+ }).edit({
223
+ text: t,
224
+ summary: "Update InPageEdit preferences",
225
+ watchlist: E.nochange
226
+ }), this.logger.info("Exported preferences to user page:", r), r;
227
+ } catch (a) {
228
+ throw this.logger.error("Failed to export preferences to user page:", a), a;
229
+ }
230
+ }
231
+ async importFromFile(e) {
232
+ const r = await e.text(), n = JSON.parse(r);
233
+ return await this.ctx.preferences.setMany(n);
234
+ }
235
+ notifyImportSuccess(e) {
236
+ const r = Object.keys(e ?? {}), n = r.length;
237
+ return this.ctx.modal.notify("success", {
238
+ title: "Preferences Imported",
239
+ content: /* @__PURE__ */ s("section", { children: [
240
+ /* @__PURE__ */ s("p", { children: [
241
+ "Successfully imported ",
242
+ n || "",
243
+ " ",
244
+ n !== 1 ? "settings" : "setting",
245
+ ":"
246
+ ] }),
247
+ /* @__PURE__ */ s("ol", { style: { listStyle: "auto", paddingLeft: "1em" }, children: r.map((t) => /* @__PURE__ */ s("li", { children: t }, t)) })
248
+ ] })
249
+ });
250
+ }
251
+ }
252
+ h = F(_);
253
+ g = B(h, 0, "PluginPrefSync", S, g);
254
+ N(h, 1, g);
255
+ export {
256
+ g as PluginPrefSync
257
+ };
258
+ //# sourceMappingURL=PluginPrefSync-COidewzp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PluginPrefSync-COidewzp.js","sources":["../src/plugins/preferences-ui/PluginPrefSync.tsx"],"sourcesContent":["import { Inject, InPageEdit, Schema } from '@/InPageEdit.js'\nimport { WatchlistAction } from '@/models/WikiPage/types/WatchlistAction.js'\nimport { IWikiTitle } from '@/models/WikiTitle/index.js'\n\ndeclare module '@/InPageEdit' {\n export interface InPageEdit {\n prefSync: PluginPrefSync\n }\n}\n\n@Inject(['preferences', 'wikiPage', 'wikiTitle', 'modal', 'preferencesUI'])\nexport class PluginPrefSync extends BasePlugin {\n constructor(public ctx: InPageEdit) {\n super(ctx, {}, 'pref-sync')\n ctx.set('prefSync', this)\n }\n\n protected start(): Promise<void> | void {\n const ctx = this.ctx\n ctx.preferences.defineCategory({\n name: 'pref-sync',\n label: 'Sync',\n description: 'Import and export preferences',\n index: 98,\n })\n ctx.preferences.registerCustomConfig(\n 'pref-sync-user-page',\n Schema.object({\n 'pref-sync-user-page': Schema.const(\n <section>\n <div style={{ display: 'flex', flexDirection: 'column', gap: '1rem' }}>\n <button\n className=\"btn primary\"\n onClick={(e) => {\n e.preventDefault()\n const modal = ctx.preferencesUI.getExistingModal()\n const btn = e.target as HTMLButtonElement\n btn.disabled = true\n modal?.setLoadingState(true)\n this.importFromUserPage()\n .then((record) => {\n this.notifyImportSuccess(record)\n modal?.close?.()\n })\n .finally(() => {\n btn.disabled = false\n modal?.setLoadingState(false)\n })\n }}\n >\n Import\n </button>\n <button\n className=\"btn primary\"\n onClick={(e) => {\n e.preventDefault()\n const btn = e.target as HTMLButtonElement\n btn.disabled = true\n const modal = ctx.preferencesUI.getExistingModal()\n modal?.setLoadingState(true)\n this.exportToUserPage()\n .then((title) => {\n ctx.modal.notify('success', {\n title: 'Preferences Exported',\n content: (\n <p>\n Your preferences have been exported to{' '}\n <a href={title.getURL().toString()} target=\"_blank\">\n {title.getPrefixedText()}\n </a>\n .\n </p>\n ),\n })\n modal?.close?.()\n })\n .finally(() => {\n btn.disabled = false\n modal?.setLoadingState(false)\n })\n }}\n >\n Export\n </button>\n </div>\n </section>\n ).role('raw-html'),\n }).description('Backup your preferences via user page'),\n 'pref-sync'\n )\n ctx.preferences.registerCustomConfig(\n 'pref-sync-manual',\n Schema.object({\n 'pref-sync-manual': Schema.const(\n <section>\n <div style={{ display: 'flex', flexDirection: 'column', gap: '1rem' }}>\n <button\n className=\"btn\"\n onClick={(e) => {\n e.preventDefault()\n const modal = ctx.preferencesUI.getExistingModal()\n modal?.setLoadingState(true)\n const input = document.createElement('input')\n input.type = 'file'\n input.accept = 'application/json'\n input.addEventListener('change', async (e) => {\n try {\n const file = (e.target as HTMLInputElement).files?.[0]\n if (!file) {\n return\n }\n const record = await this.importFromFile(file)\n this.notifyImportSuccess(record)\n modal?.close?.()\n } catch (e) {\n ctx.modal.notify('error', {\n title: 'Import failed',\n content: e instanceof Error ? e.message : String(e),\n })\n } finally {\n modal?.setLoadingState(false)\n }\n })\n input.addEventListener('cancel', () => {\n modal?.setLoadingState(false)\n })\n input.click()\n }}\n >\n Import from file\n </button>\n <button\n className=\"btn\"\n onClick={async (e) => {\n e.preventDefault()\n const data = await ctx.preferences.getExportableRecord()\n const json = JSON.stringify(data, null, 2)\n ctx.modal.dialog(\n {\n title: 'Save to file',\n content: (\n <div>\n <label htmlFor=\"data\">Your InPageEdit preferences:</label>\n <textarea\n name=\"data\"\n id=\"data\"\n rows={10}\n value={json}\n readOnly\n style={{ width: '100%' }}\n ></textarea>\n </div>\n ),\n buttons: [\n {\n label: 'Copy',\n method: () => {\n navigator.clipboard.writeText(json)\n ctx.modal.notify('success', {\n content: 'Copied to clipboard',\n })\n },\n },\n {\n label: 'Download',\n method: () => {\n const a = document.createElement('a')\n a.href = `data:text/json;charset=utf-8,${encodeURIComponent(json)}`\n a.download = `ipe-prefs-${new Date().toISOString()}.json`\n a.click()\n },\n },\n ],\n },\n () => {}\n )\n }}\n >\n Save to file\n </button>\n </div>\n </section>\n ).role('raw-html'),\n }).description('Backup your preferences to file'),\n 'pref-sync'\n )\n }\n\n protected stop(): Promise<void> | void {}\n\n /**\n * 获取用户页配置文件的标题\n */\n private getUserPrefsPageTitle(): IWikiTitle | null {\n try {\n const userName = this.ctx.wiki?.userInfo?.name\n if (!userName) {\n return null\n }\n // 使用 User: 命名空间\n return this.ctx.wikiTitle.newTitle(`User:${userName}/ipe-prefs.json`, 2)\n } catch {\n return null\n }\n }\n\n /**\n * 从用户页加载配置\n */\n async importFromUserPage(): Promise<Record<string, unknown>> {\n const title = this.getUserPrefsPageTitle()\n if (!title) {\n this.logger.debug('Cannot get user page title, skipping load')\n return {}\n }\n\n try {\n // 使用 raw action 获取 JSON 内容\n const rawUrl = title.getURL({ action: 'raw', ctype: 'application/json' })\n\n let response: Response\n try {\n response = await fetch(rawUrl.toString())\n if (!response.ok) {\n if (response.status === 404) {\n this.logger.debug('User preferences page does not exist')\n return {}\n }\n throw new Error(`HTTP ${response.status}: ${response.statusText}`)\n }\n } catch (error) {\n if (error instanceof TypeError && error.message.includes('Failed to fetch')) {\n this.logger.debug('User preferences page does not exist or network error')\n return {}\n }\n throw error\n }\n\n const blob = await response.blob()\n const changed = await this.importFromFile(blob)\n this.logger.info('Loaded preferences from user page:', title)\n return changed\n } catch (error) {\n this.logger.error('Failed to load preferences from user page:', error)\n return {}\n }\n }\n\n /**\n * 导出配置到用户页\n */\n async exportToUserPage(): Promise<IWikiTitle> {\n const ctx = this.ctx\n const title = this.getUserPrefsPageTitle()\n if (!title) {\n throw new Error('Cannot get user page title')\n }\n\n const json = await ctx.preferences.getExportableRecord()\n const text = JSON.stringify(json, null, 2)\n\n try {\n const page = this.ctx.wikiPage.newBlankPage({\n title: title.toString(),\n ns: 2, // User namespace\n })\n await page.edit({\n text,\n summary: 'Update InPageEdit preferences',\n watchlist: WatchlistAction.nochange,\n })\n\n this.logger.info('Exported preferences to user page:', title)\n return title\n } catch (error) {\n this.logger.error('Failed to export preferences to user page:', error)\n throw error\n }\n }\n\n async importFromFile(input: Blob): Promise<Record<string, unknown>> {\n const text = await input.text()\n const data = JSON.parse(text)\n const changed = await this.ctx.preferences.setMany(data)\n return changed\n }\n\n private notifyImportSuccess(configs?: Record<string, unknown>) {\n const keys = Object.keys(configs ?? {})\n const count = keys.length\n return this.ctx.modal.notify('success', {\n title: 'Preferences Imported',\n content: (\n <section>\n <p>\n Successfully imported {count || ''} {count !== 1 ? 'settings' : 'setting'}:\n </p>\n <ol style={{ listStyle: 'auto', paddingLeft: '1em' }}>\n {keys.map((key) => (\n <li key={key}>{key}</li>\n ))}\n </ol>\n </section>\n ),\n })\n }\n}\n"],"names":["_PluginPrefSync_decorators","_init","_a","Inject","PluginPrefSync","BasePlugin","ctx","Schema","jsx","jsxs","e","modal","btn","record","title","input","file","data","json","userName","rawUrl","response","error","blob","changed","text","WatchlistAction","configs","keys","count","key","__decoratorStart","__decorateElement","__runInitializers"],"mappings":"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"}
@@ -1,2 +1,3 @@
1
- import { WikiMetadata } from '../../types/WikiMetadata.js';
2
- export declare const MOCK_SITE_METADATA: WikiMetadata;
1
+ import { WikiSiteInfo, WikiUserInfo } from '../../types/WikiMetadata.js';
2
+ export declare const MOCK_SITE_INFO: WikiSiteInfo;
3
+ export declare const MOCK_USER_INFO: WikiUserInfo;
@@ -1,80 +1,98 @@
1
- import { M as x } from "../index-lZkYoUca.js";
2
- import { j as n } from "../index-CvhkVj_L.js";
3
- import { P as V } from "../index-CvhkVj_L.js";
4
- import { T as A } from "../index-Bh70Udzi.js";
5
- import { A as B } from "../ActionButton-BgbTKTg7.js";
6
- import { C as T } from "../CheckBox-D3rHnX7I.js";
7
- import { I as $ } from "../InputBox-BV4m05Xs.js";
8
- import { R as k } from "../RadioBox-nJqWsxW2.js";
9
- const r = "_tabview_zlbug_1", _ = "_labels_container_zlbug_4", b = "_label_zlbug_4", d = "_active_zlbug_32", m = "_contents_container_zlbug_35", i = {
10
- tabview: r,
11
- labels_container: _,
12
- label: b,
13
- active: d,
14
- contents_container: m
1
+ import { M as L } from "../index-lZkYoUca.js";
2
+ import { j as o, c as r } from "../index-CvhkVj_L.js";
3
+ import { P as A } from "../index-CvhkVj_L.js";
4
+ import { T } from "../index-Bh70Udzi.js";
5
+ import { C as z } from "../CheckBox-D3rHnX7I.js";
6
+ import { I as C } from "../InputBox-BV4m05Xs.js";
7
+ import { R as I } from "../RadioBox-nJqWsxW2.js";
8
+ const b = "_tabview_zlbug_1", d = "_labels_container_zlbug_4", _ = "_label_zlbug_4", m = "_active_zlbug_32", p = "_contents_container_zlbug_35", l = {
9
+ tabview: b,
10
+ labels_container: d,
11
+ label: _,
12
+ active: m,
13
+ contents_container: p
15
14
  };
16
- function h({
17
- tabs: t = [],
18
- defaultActiveIndex: l = 0
15
+ function w({
16
+ tabs: n = [],
17
+ defaultActiveIndex: e = 0
19
18
  }) {
20
- const c = /* @__PURE__ */ n("div", { className: `ipe-tabView ${i.tabview}`, children: [
21
- /* @__PURE__ */ n("ul", { className: `ipe-tabView__labels-container ${i.labels_container}`, children: t.map((a) => /* @__PURE__ */ n(f, { name: a.name, children: a.children }, a.name)) }),
22
- /* @__PURE__ */ n("div", { className: `ipe-tabView__contents ${i.contents_container}`, children: t.map((a) => /* @__PURE__ */ n(p, { name: a.name, children: a.content }, a.name)) })
23
- ] }), s = c.querySelector(
24
- `.ipe-tabView__labels-container > .ipe-tabView__label:nth-child(${l + 1})`
19
+ const i = /* @__PURE__ */ o("div", { className: `ipe-tabView ${l.tabview}`, children: [
20
+ /* @__PURE__ */ o("ul", { className: `ipe-tabView__labels-container ${l.labels_container}`, children: n.map((a) => /* @__PURE__ */ o(f, { name: a.name, children: a.children }, a.name)) }),
21
+ /* @__PURE__ */ o("div", { className: `ipe-tabView__contents ${l.contents_container}`, children: n.map((a) => /* @__PURE__ */ o(u, { name: a.name, children: a.content }, a.name)) })
22
+ ] }), s = i.querySelector(
23
+ `.ipe-tabView__labels-container > .ipe-tabView__label:nth-child(${e + 1})`
25
24
  );
26
- return s && s.click(), c;
25
+ return s && s.click(), i;
27
26
  }
28
- function f({ name: t, children: l }) {
29
- return /* @__PURE__ */ n(
27
+ function f({ name: n, children: e }) {
28
+ return /* @__PURE__ */ o(
30
29
  "li",
31
30
  {
32
- "data-tab-name": t,
33
- className: `ipe-tabView__label ${i.label}`,
34
- onClick: function(c) {
35
- c.preventDefault();
31
+ "data-tab-name": n,
32
+ className: `ipe-tabView__label ${l.label}`,
33
+ onClick: function(i) {
34
+ i.preventDefault();
36
35
  const s = this.closest(".ipe-tabView");
37
36
  if (!s) return;
38
37
  const a = Array.from(s.children).find(
39
- (e) => e.classList.contains("ipe-tabView__labels")
38
+ (t) => t.classList.contains("ipe-tabView__labels")
40
39
  )?.children;
41
- a && Array.from(a).forEach((e) => {
42
- e.classList.remove(i.active);
43
- }), this.classList.add(i.active);
44
- const o = Array.from(s.children).find(
45
- (e) => e.classList.contains("ipe-tabView__contents")
40
+ a && Array.from(a).forEach((t) => {
41
+ t.classList.remove(l.active);
42
+ }), this.classList.add(l.active);
43
+ const c = Array.from(s.children).find(
44
+ (t) => t.classList.contains("ipe-tabView__contents")
46
45
  )?.children;
47
- o && Array.from(o).forEach((e) => {
48
- e instanceof HTMLElement && (e.dataset.tabName === t ? (e.style.display = "", e.classList.add(i.active)) : (e.style.display = "none", e.classList.remove(i.active)));
46
+ c && Array.from(c).forEach((t) => {
47
+ t instanceof HTMLElement && (t.dataset.tabName === n ? (t.style.display = "", t.classList.add(l.active)) : (t.style.display = "none", t.classList.remove(l.active)));
49
48
  });
50
49
  },
51
- children: /* @__PURE__ */ n("a", { children: l || t })
50
+ children: /* @__PURE__ */ o("a", { children: e || n })
52
51
  }
53
52
  );
54
53
  }
55
- function p({ name: t, children: l }) {
56
- return /* @__PURE__ */ n(
54
+ function u({ name: n, children: e }) {
55
+ return /* @__PURE__ */ o(
57
56
  "div",
58
57
  {
59
- "data-tab-name": t,
58
+ "data-tab-name": n,
60
59
  className: "ipe-tabView__content-body",
61
60
  style: {
62
61
  display: "none"
63
62
  },
64
- children: l
63
+ children: e
65
64
  }
66
65
  );
67
66
  }
67
+ const v = window?.location?.origin, y = ({
68
+ type: n,
69
+ tag: e,
70
+ href: i,
71
+ target: s,
72
+ children: a,
73
+ ...c
74
+ }) => (e = e || (i ? "a" : "button"), typeof s > "u" && i && i.startsWith("http") && !i.startsWith(v) && (s = "_blank"), r(
75
+ e,
76
+ {
77
+ className: `theme-ipe ipe-action-button ipe-modal-btn is-${n || "default"}`,
78
+ // @ts-ignore
79
+ href: e === "a" ? i : void 0,
80
+ target: e === "a" ? s : void 0,
81
+ "data-href": e !== "a" ? i : void 0,
82
+ ...c
83
+ },
84
+ a
85
+ ));
68
86
  export {
69
- B as ActionButton,
70
- T as CheckBox,
71
- $ as InputBox,
72
- x as MBox,
73
- V as ProgressBar,
74
- k as RadioBox,
75
- p as TabContent,
87
+ y as ActionButton,
88
+ z as CheckBox,
89
+ C as InputBox,
90
+ L as MBox,
91
+ A as ProgressBar,
92
+ I as RadioBox,
93
+ u as TabContent,
76
94
  f as TabLabel,
77
- h as TabView,
78
- A as TwinSwapInput
95
+ w as TabView,
96
+ T as TwinSwapInput
79
97
  };
80
98
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../src/components/TabView/index.tsx"],"sourcesContent":["import { ReactNode } from 'jsx-dom'\nimport styles from './styles.module.sass'\n\nexport interface TabViewLabelOptions {\n name: string\n children: ReactNode\n}\n\nconsole.log(styles)\n\nexport function TabView({\n tabs = [],\n defaultActiveIndex = 0,\n}: {\n tabs: (TabViewLabelOptions & { content: ReactNode })[]\n defaultActiveIndex?: number\n}) {\n const el = (\n <div className={`ipe-tabView ${styles.tabview}`}>\n <ul className={`ipe-tabView__labels-container ${styles.labels_container}`}>\n {tabs.map((tab) => (\n <TabLabel key={tab.name} name={tab.name}>\n {tab.children}\n </TabLabel>\n ))}\n </ul>\n <div className={`ipe-tabView__contents ${styles.contents_container}`}>\n {tabs.map((tab) => (\n <TabContent key={tab.name} name={tab.name}>\n {tab.content}\n </TabContent>\n ))}\n </div>\n </div>\n )\n\n const defaultActiveLabel = el.querySelector<HTMLAnchorElement>(\n `.ipe-tabView__labels-container > .ipe-tabView__label:nth-child(${defaultActiveIndex + 1})`\n )\n if (defaultActiveLabel) {\n defaultActiveLabel.click()\n }\n\n return el\n}\n\nexport function TabLabel({ name, children }: { name: string; children: ReactNode }) {\n return (\n <li\n data-tab-name={name}\n className={`ipe-tabView__label ${styles.label}`}\n onClick={function (e) {\n e.preventDefault()\n const container = this.closest('.ipe-tabView')\n if (!container) return\n const labels = Array.from(container.children).find((el) =>\n el.classList.contains('ipe-tabView__labels')\n )?.children\n if (labels) {\n Array.from(labels).forEach((label) => {\n label.classList.remove(styles.active)\n })\n }\n this.classList.add(styles.active)\n const contents = Array.from(container.children).find((el) =>\n el.classList.contains('ipe-tabView__contents')\n )?.children\n if (contents) {\n Array.from(contents).forEach((content) => {\n if (content instanceof HTMLElement) {\n if (content.dataset.tabName === name) {\n content.style.display = ''\n content.classList.add(styles.active)\n } else {\n content.style.display = 'none'\n content.classList.remove(styles.active)\n }\n }\n })\n }\n }}\n >\n <a>{children || name}</a>\n </li>\n )\n}\n\nexport function TabContent({ name, children }: { name: string; children: ReactNode }) {\n return (\n <div\n data-tab-name={name}\n className=\"ipe-tabView__content-body\"\n style={{\n display: 'none',\n }}\n >\n {children}\n </div>\n )\n}\n"],"names":["TabView","tabs","defaultActiveIndex","el","jsxs","styles","jsx","tab","TabLabel","TabContent","defaultActiveLabel","name","children","e","container","labels","label","contents","content"],"mappings":";;;;;;;;;;;;;;;AAUO,SAASA,EAAQ;AAAA,EACtB,MAAAC,IAAO,CAAA;AAAA,EACP,oBAAAC,IAAqB;AACvB,GAGG;AACD,QAAMC,IACJC,gBAAAA,EAAC,OAAA,EAAI,WAAW,eAAeC,EAAO,OAAO,IAC3C,UAAA;AAAA,IAAA,gBAAAC,EAAC,MAAA,EAAG,WAAW,iCAAiCD,EAAO,gBAAgB,IACpE,UAAAJ,EAAK,IAAI,CAACM,wBACRC,GAAA,EAAwB,MAAMD,EAAI,MAChC,UAAAA,EAAI,YADQA,EAAI,IAEnB,CACD,EAAA,CACH;AAAA,IACA,gBAAAD,EAAC,SAAI,WAAW,yBAAyBD,EAAO,kBAAkB,IAC/D,YAAK,IAAI,CAACE,MACT,gBAAAD,EAACG,GAAA,EAA0B,MAAMF,EAAI,MAClC,YAAI,QAAA,GADUA,EAAI,IAErB,CACD,EAAA,CACH;AAAA,EAAA,GACF,GAGIG,IAAqBP,EAAG;AAAA,IAC5B,kEAAkED,IAAqB,CAAC;AAAA,EAAA;AAE1F,SAAIQ,KACFA,EAAmB,MAAA,GAGdP;AACT;AAEO,SAASK,EAAS,EAAE,MAAAG,GAAM,UAAAC,KAAmD;AAClF,SACE,gBAAAN;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,iBAAeK;AAAA,MACf,WAAW,sBAAsBN,EAAO,KAAK;AAAA,MAC7C,SAAS,SAAUQ,GAAG;AACpB,QAAAA,EAAE,eAAA;AACF,cAAMC,IAAY,KAAK,QAAQ,cAAc;AAC7C,YAAI,CAACA,EAAW;AAChB,cAAMC,IAAS,MAAM,KAAKD,EAAU,QAAQ,EAAE;AAAA,UAAK,CAACX,MAClDA,EAAG,UAAU,SAAS,qBAAqB;AAAA,QAAA,GAC1C;AACH,QAAIY,KACF,MAAM,KAAKA,CAAM,EAAE,QAAQ,CAACC,MAAU;AACpC,UAAAA,EAAM,UAAU,OAAOX,EAAO,MAAM;AAAA,QACtC,CAAC,GAEH,KAAK,UAAU,IAAIA,EAAO,MAAM;AAChC,cAAMY,IAAW,MAAM,KAAKH,EAAU,QAAQ,EAAE;AAAA,UAAK,CAACX,MACpDA,EAAG,UAAU,SAAS,uBAAuB;AAAA,QAAA,GAC5C;AACH,QAAIc,KACF,MAAM,KAAKA,CAAQ,EAAE,QAAQ,CAACC,MAAY;AACxC,UAAIA,aAAmB,gBACjBA,EAAQ,QAAQ,YAAYP,KAC9BO,EAAQ,MAAM,UAAU,IACxBA,EAAQ,UAAU,IAAIb,EAAO,MAAM,MAEnCa,EAAQ,MAAM,UAAU,QACxBA,EAAQ,UAAU,OAAOb,EAAO,MAAM;AAAA,QAG5C,CAAC;AAAA,MAEL;AAAA,MAEA,UAAA,gBAAAC,EAAC,KAAA,EAAG,UAAAM,KAAYD,EAAA,CAAK;AAAA,IAAA;AAAA,EAAA;AAG3B;AAEO,SAASF,EAAW,EAAE,MAAAE,GAAM,UAAAC,KAAmD;AACpF,SACE,gBAAAN;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,iBAAeK;AAAA,MACf,WAAU;AAAA,MACV,OAAO;AAAA,QACL,SAAS;AAAA,MAAA;AAAA,MAGV,UAAAC;AAAA,IAAA;AAAA,EAAA;AAGP;"}
1
+ {"version":3,"file":"index.js","sources":["../../src/components/TabView/index.tsx","../../src/components/ActionButton.tsx"],"sourcesContent":["import { ReactNode } from 'jsx-dom'\nimport styles from './styles.module.sass'\n\nexport interface TabViewLabelOptions {\n name: string\n children: ReactNode\n}\n\nconsole.log(styles)\n\nexport function TabView({\n tabs = [],\n defaultActiveIndex = 0,\n}: {\n tabs: (TabViewLabelOptions & { content: ReactNode })[]\n defaultActiveIndex?: number\n}) {\n const el = (\n <div className={`ipe-tabView ${styles.tabview}`}>\n <ul className={`ipe-tabView__labels-container ${styles.labels_container}`}>\n {tabs.map((tab) => (\n <TabLabel key={tab.name} name={tab.name}>\n {tab.children}\n </TabLabel>\n ))}\n </ul>\n <div className={`ipe-tabView__contents ${styles.contents_container}`}>\n {tabs.map((tab) => (\n <TabContent key={tab.name} name={tab.name}>\n {tab.content}\n </TabContent>\n ))}\n </div>\n </div>\n )\n\n const defaultActiveLabel = el.querySelector<HTMLAnchorElement>(\n `.ipe-tabView__labels-container > .ipe-tabView__label:nth-child(${defaultActiveIndex + 1})`\n )\n if (defaultActiveLabel) {\n defaultActiveLabel.click()\n }\n\n return el\n}\n\nexport function TabLabel({ name, children }: { name: string; children: ReactNode }) {\n return (\n <li\n data-tab-name={name}\n className={`ipe-tabView__label ${styles.label}`}\n onClick={function (e) {\n e.preventDefault()\n const container = this.closest('.ipe-tabView')\n if (!container) return\n const labels = Array.from(container.children).find((el) =>\n el.classList.contains('ipe-tabView__labels')\n )?.children\n if (labels) {\n Array.from(labels).forEach((label) => {\n label.classList.remove(styles.active)\n })\n }\n this.classList.add(styles.active)\n const contents = Array.from(container.children).find((el) =>\n el.classList.contains('ipe-tabView__contents')\n )?.children\n if (contents) {\n Array.from(contents).forEach((content) => {\n if (content instanceof HTMLElement) {\n if (content.dataset.tabName === name) {\n content.style.display = ''\n content.classList.add(styles.active)\n } else {\n content.style.display = 'none'\n content.classList.remove(styles.active)\n }\n }\n })\n }\n }}\n >\n <a>{children || name}</a>\n </li>\n )\n}\n\nexport function TabContent({ name, children }: { name: string; children: ReactNode }) {\n return (\n <div\n data-tab-name={name}\n className=\"ipe-tabView__content-body\"\n style={{\n display: 'none',\n }}\n >\n {children}\n </div>\n )\n}\n","import { h, JSX } from 'jsx-dom'\n\nexport interface ActionButtonProps {\n type?: 'primary' | 'secondary' | 'danger' | 'default'\n tag?: 'a' | 'button' | 'div'\n}\n\nconst origin = window?.location?.origin\n\nexport const ActionButton = ({\n type,\n tag,\n href,\n target,\n children,\n ...rest\n}: ActionButtonProps &\n Omit<JSX.IntrinsicElements['button'], 'type'> &\n JSX.IntrinsicElements['a']) => {\n tag = tag || (href ? 'a' : 'button')\n if (\n typeof target === 'undefined' &&\n href &&\n href.startsWith('http') &&\n !href.startsWith(origin)\n ) {\n target = '_blank'\n }\n return h(\n tag,\n {\n className: `theme-ipe ipe-action-button ipe-modal-btn is-${type || 'default'}`,\n // @ts-ignore\n href: tag === 'a' ? href : undefined,\n target: tag === 'a' ? target : undefined,\n 'data-href': tag !== 'a' ? href : undefined,\n ...rest,\n },\n children\n )\n}\n"],"names":["TabView","tabs","defaultActiveIndex","el","jsxs","styles","jsx","tab","TabLabel","TabContent","defaultActiveLabel","name","children","e","container","labels","label","contents","content","origin","ActionButton","type","tag","href","target","rest","h"],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  export declare enum Endpoints {
2
- ANALYTICS_API_BASE = "https://analytics.ipe.wiki/api",
2
+ ANALYTICS_API_BASE = "https://analytics.ipe.wiki/api/v6",
3
3
  ANALYTICS_DASH_URL = "https://analytics.ipe.wiki",
4
4
  GITHUB_URL = "https://github.com/inpageedit/inpageedit-next",
5
5
  HOME_URL = "https://www.ipe.wiki/",