@inpageedit/core 0.11.1 → 0.12.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 (95) hide show
  1. package/dist/ActionButton-CRjo_l3y.js +24 -0
  2. package/dist/ActionButton-CRjo_l3y.js.map +1 -0
  3. package/dist/{IconQuickEdit-CAL1HXIb.js → IconQuickEdit-CMCQncyj.js} +2 -2
  4. package/dist/{IconQuickEdit-CAL1HXIb.js.map → IconQuickEdit-CMCQncyj.js.map} +1 -1
  5. package/dist/InPageEdit.d.ts +5 -1
  6. package/dist/InputBox-nQKtiWtZ.js +30 -0
  7. package/dist/InputBox-nQKtiWtZ.js.map +1 -0
  8. package/dist/PluginPrefSync-Ziogy_o-.js +339 -0
  9. package/dist/PluginPrefSync-Ziogy_o-.js.map +1 -0
  10. package/dist/PluginStoreApp-Bnvyl-Oc.js +452 -0
  11. package/dist/PluginStoreApp-Bnvyl-Oc.js.map +1 -0
  12. package/dist/{RadioBox-nJqWsxW2.js → RadioBox-0UuxlcWZ.js} +2 -2
  13. package/dist/{RadioBox-nJqWsxW2.js.map → RadioBox-0UuxlcWZ.js.map} +1 -1
  14. package/dist/_plugin-vue_export-helper-CHgC5LLL.js +10 -0
  15. package/dist/_plugin-vue_export-helper-CHgC5LLL.js.map +1 -0
  16. package/dist/components/index.js +50 -69
  17. package/dist/components/index.js.map +1 -1
  18. package/dist/constants/endpoints.d.ts +2 -1
  19. package/dist/{index-CfgnJ51A.js → index-B3FUDhxl.js} +53 -43
  20. package/dist/index-B3FUDhxl.js.map +1 -0
  21. package/dist/index-B3YJdjxo.js +361 -0
  22. package/dist/index-B3YJdjxo.js.map +1 -0
  23. package/dist/{index-BNDyaWnI.js → index-BRjEc8b8.js} +10 -9
  24. package/dist/index-BRjEc8b8.js.map +1 -0
  25. package/dist/index-Bd70aDMT.js +172 -0
  26. package/dist/index-Bd70aDMT.js.map +1 -0
  27. package/dist/index-BvuaLEFc.js +179 -0
  28. package/dist/index-BvuaLEFc.js.map +1 -0
  29. package/dist/{index-lZkYoUca.js → index-CG38LlAh.js} +2 -2
  30. package/dist/{index-lZkYoUca.js.map → index-CG38LlAh.js.map} +1 -1
  31. package/dist/{index-CvhkVj_L.js → index-CM_6yF2v.js} +3 -3
  32. package/dist/{index-CvhkVj_L.js.map → index-CM_6yF2v.js.map} +1 -1
  33. package/dist/{index-etJXONAj.js → index-Ccr3YhkP.js} +6 -6
  34. package/dist/index-Ccr3YhkP.js.map +1 -0
  35. package/dist/{index-U2RPZk8N.js → index-D5zX93bn.js} +43 -44
  36. package/dist/index-D5zX93bn.js.map +1 -0
  37. package/dist/{index-Bh70Udzi.js → index-DD5CVCfD.js} +2 -2
  38. package/dist/{index-Bh70Udzi.js.map → index-DD5CVCfD.js.map} +1 -1
  39. package/dist/{index-BUI2IX49.js → index-DgQNTfPR.js} +2314 -2316
  40. package/dist/index-DgQNTfPR.js.map +1 -0
  41. package/dist/{index-BQzuJxBO.js → index-Dnmv-xDn.js} +4 -4
  42. package/dist/index-Dnmv-xDn.js.map +1 -0
  43. package/dist/index-eARjMi7f.js +1168 -0
  44. package/dist/index-eARjMi7f.js.map +1 -0
  45. package/dist/{index-D5J7RU5I.js → index-zHTGCjfF.js} +5 -7
  46. package/dist/index-zHTGCjfF.js.map +1 -0
  47. package/dist/index.js +1 -1
  48. package/dist/models/MemoryStorage.d.ts +10 -0
  49. package/dist/models/WikiPage/index.d.ts +19 -1
  50. package/dist/plugins/in-article-links/index.d.ts +5 -0
  51. package/dist/plugins/plugin-store/index.d.ts +56 -0
  52. package/dist/plugins/plugin-store/schema.d.ts +41 -0
  53. package/dist/plugins/preferences-ui/PluginPrefSync.d.ts +1 -0
  54. package/dist/plugins/preferences-ui/index.d.ts +34 -5
  55. package/dist/plugins/quick-diff/index.d.ts +3 -0
  56. package/dist/plugins/quick-edit/index.d.ts +8 -0
  57. package/dist/plugins/quick-move/index.d.ts +5 -3
  58. package/dist/plugins/quick-preview/index.d.ts +4 -0
  59. package/dist/plugins/quick-redirect/index.d.ts +11 -4
  60. package/dist/plugins/toolbox/index.d.ts +3 -0
  61. package/dist/services/PreferencesService.d.ts +53 -11
  62. package/dist/services/ResourceLoaderService.d.ts +3 -0
  63. package/dist/services/WikiMetadataService.d.ts +1 -1
  64. package/dist/services/storage/index.d.ts +18 -8
  65. package/dist/services/storage/{IPEStorageManager.d.ts → managers/IDBStorageManager.d.ts} +9 -6
  66. package/dist/services/storage/managers/LocalStorageManager.d.ts +27 -0
  67. package/dist/style.css +1 -1
  68. package/dist/vueHooks-l04s8cIl.js +4064 -0
  69. package/dist/vueHooks-l04s8cIl.js.map +1 -0
  70. package/lib/index.umd.js +12 -112
  71. package/lib/index.umd.js.map +1 -1
  72. package/lib/style.css +1 -1
  73. package/package.json +14 -14
  74. package/dist/CheckBox-D3rHnX7I.js +0 -13
  75. package/dist/CheckBox-D3rHnX7I.js.map +0 -1
  76. package/dist/InputBox-BV4m05Xs.js +0 -22
  77. package/dist/InputBox-BV4m05Xs.js.map +0 -1
  78. package/dist/PluginPrefSync-COidewzp.js +0 -258
  79. package/dist/PluginPrefSync-COidewzp.js.map +0 -1
  80. package/dist/index-BNDyaWnI.js.map +0 -1
  81. package/dist/index-BQzuJxBO.js.map +0 -1
  82. package/dist/index-BUI2IX49.js.map +0 -1
  83. package/dist/index-CBszdxJJ.js +0 -159
  84. package/dist/index-CBszdxJJ.js.map +0 -1
  85. package/dist/index-CfgnJ51A.js.map +0 -1
  86. package/dist/index-Cx4qgCJK.js +0 -4914
  87. package/dist/index-Cx4qgCJK.js.map +0 -1
  88. package/dist/index-D5J7RU5I.js.map +0 -1
  89. package/dist/index-MhNAv9Vf.js +0 -302
  90. package/dist/index-MhNAv9Vf.js.map +0 -1
  91. package/dist/index-U2RPZk8N.js.map +0 -1
  92. package/dist/index-VnRKIVau.js +0 -167
  93. package/dist/index-VnRKIVau.js.map +0 -1
  94. package/dist/index-etJXONAj.js.map +0 -1
  95. package/dist/plugins/quick-delete/index.d.ts +0 -52
@@ -1,98 +1,79 @@
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
1
+ import { M as y } from "../index-CG38LlAh.js";
2
+ import { j as n } from "../index-CM_6yF2v.js";
3
+ import { P as V } from "../index-CM_6yF2v.js";
4
+ import { T as A } from "../index-DD5CVCfD.js";
5
+ import { A as B } from "../ActionButton-CRjo_l3y.js";
6
+ import { C as T, I as z } from "../InputBox-nQKtiWtZ.js";
7
+ import { R as C } from "../RadioBox-0UuxlcWZ.js";
8
+ const r = "_tabview_zlbug_1", _ = "_labels_container_zlbug_4", b = "_label_zlbug_4", d = "_active_zlbug_32", m = "_contents_container_zlbug_35", i = {
9
+ tabview: r,
10
+ labels_container: _,
11
+ label: b,
12
+ active: d,
13
+ contents_container: m
14
14
  };
15
- function w({
16
- tabs: n = [],
17
- defaultActiveIndex: e = 0
15
+ function h({
16
+ tabs: t = [],
17
+ defaultActiveIndex: l = 0
18
18
  }) {
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})`
19
+ const c = /* @__PURE__ */ n("div", { className: `ipe-tabView ${i.tabview}`, children: [
20
+ /* @__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)) }),
21
+ /* @__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)) })
22
+ ] }), s = c.querySelector(
23
+ `.ipe-tabView__labels-container > .ipe-tabView__label:nth-child(${l + 1})`
24
24
  );
25
- return s && s.click(), i;
25
+ return s && s.click(), c;
26
26
  }
27
- function f({ name: n, children: e }) {
28
- return /* @__PURE__ */ o(
27
+ function f({ name: t, children: l }) {
28
+ return /* @__PURE__ */ n(
29
29
  "li",
30
30
  {
31
- "data-tab-name": n,
32
- className: `ipe-tabView__label ${l.label}`,
33
- onClick: function(i) {
34
- i.preventDefault();
31
+ "data-tab-name": t,
32
+ className: `ipe-tabView__label ${i.label}`,
33
+ onClick: function(c) {
34
+ c.preventDefault();
35
35
  const s = this.closest(".ipe-tabView");
36
36
  if (!s) return;
37
37
  const a = Array.from(s.children).find(
38
- (t) => t.classList.contains("ipe-tabView__labels")
38
+ (e) => e.classList.contains("ipe-tabView__labels")
39
39
  )?.children;
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")
40
+ a && Array.from(a).forEach((e) => {
41
+ e.classList.remove(i.active);
42
+ }), this.classList.add(i.active);
43
+ const o = Array.from(s.children).find(
44
+ (e) => e.classList.contains("ipe-tabView__contents")
45
45
  )?.children;
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)));
46
+ o && Array.from(o).forEach((e) => {
47
+ e instanceof HTMLElement && (e.dataset.tabName === t ? (e.style.display = "", e.classList.add(i.active)) : (e.style.display = "none", e.classList.remove(i.active)));
48
48
  });
49
49
  },
50
- children: /* @__PURE__ */ o("a", { children: e || n })
50
+ children: /* @__PURE__ */ n("a", { children: l || t })
51
51
  }
52
52
  );
53
53
  }
54
- function u({ name: n, children: e }) {
55
- return /* @__PURE__ */ o(
54
+ function p({ name: t, children: l }) {
55
+ return /* @__PURE__ */ n(
56
56
  "div",
57
57
  {
58
- "data-tab-name": n,
58
+ "data-tab-name": t,
59
59
  className: "ipe-tabView__content-body",
60
60
  style: {
61
61
  display: "none"
62
62
  },
63
- children: e
63
+ children: l
64
64
  }
65
65
  );
66
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
- ));
86
67
  export {
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,
68
+ B as ActionButton,
69
+ T as CheckBox,
70
+ z as InputBox,
71
+ y as MBox,
72
+ V as ProgressBar,
73
+ C as RadioBox,
74
+ p as TabContent,
94
75
  f as TabLabel,
95
- w as TabView,
96
- T as TwinSwapInput
76
+ h as TabView,
77
+ A as TwinSwapInput
97
78
  };
98
79
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
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
+ {"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;"}
@@ -3,5 +3,6 @@ export declare enum Endpoints {
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/",
6
- UPDATE_LOGS_URL = "https://www.ipe.wiki/changelogs/"
6
+ UPDATE_LOGS_URL = "https://www.ipe.wiki/changelogs/",
7
+ PLUGIN_REGISTRY_URL = "https://registry.ipe.wiki/registry.v1.json"
7
8
  }
@@ -1,19 +1,19 @@
1
- import { j as n } from "./index-CvhkVj_L.js";
2
- import { B as A, S as p, E as v, p as P, a as x, I as U } from "./index-BUI2IX49.js";
3
- var q = Object.create, f = Object.defineProperty, B = Object.getOwnPropertyDescriptor, b = (i, e) => (e = Symbol[i]) ? e : Symbol.for("Symbol." + i), w = (i) => {
1
+ import { j as n } from "./index-CM_6yF2v.js";
2
+ import { B as I, S as p, E as b, p as x, a as P, I as U } from "./index-DgQNTfPR.js";
3
+ var q = Object.create, _ = Object.defineProperty, B = Object.getOwnPropertyDescriptor, v = (i, e) => (e = Symbol[i]) ? e : Symbol.for("Symbol." + i), w = (i) => {
4
4
  throw TypeError(i);
5
- }, L = (i, e, t) => e in i ? f(i, e, { enumerable: !0, configurable: !0, writable: !0, value: t }) : i[e] = t, N = (i, e) => f(i, "name", { value: e, configurable: !0 }), T = (i) => [, , , q(i?.[b("metadata")] ?? null)], D = ["class", "method", "getter", "setter", "accessor", "field", "value", "get", "set"], k = (i) => i !== void 0 && typeof i != "function" ? w("Function expected") : i, O = (i, e, t, a, s) => ({ kind: D[i], name: e, metadata: a, addInitializer: (l) => t._ ? w("Already initialized") : s.push(k(l || null)) }), j = (i, e) => L(e, b("metadata"), i[3]), C = (i, e, t, a) => {
6
- for (var s = 0, l = i[e >> 1], c = l && l.length; s < c; s++) l[s].call(t);
5
+ }, L = (i, e, t) => e in i ? _(i, e, { enumerable: !0, configurable: !0, writable: !0, value: t }) : i[e] = t, N = (i, e) => _(i, "name", { value: e, configurable: !0 }), T = (i) => [, , , q(i?.[v("metadata")] ?? null)], D = ["class", "method", "getter", "setter", "accessor", "field", "value", "get", "set"], k = (i) => i !== void 0 && typeof i != "function" ? w("Function expected") : i, O = (i, e, t, a, s) => ({ kind: D[i], name: e, metadata: a, addInitializer: (r) => t._ ? w("Already initialized") : s.push(k(r || null)) }), j = (i, e) => L(e, v("metadata"), i[3]), C = (i, e, t, a) => {
6
+ for (var s = 0, r = i[e >> 1], c = r && r.length; s < c; s++) r[s].call(t);
7
7
  return a;
8
- }, M = (i, e, t, a, s, l) => {
9
- var c, d, h, o = e & 7, r = !1, y = 0, I = i[y] || (i[y] = []), u = o && (s = s.prototype, o < 5 && (o > 3 || !r) && B(s, t));
8
+ }, M = (i, e, t, a, s, r) => {
9
+ var c, d, h, o = e & 7, l = !1, y = 0, A = i[y] || (i[y] = []), u = o && (s = s.prototype, o < 5 && (o > 3 || !l) && B(s, t));
10
10
  N(s, t);
11
11
  for (var g = a.length - 1; g >= 0; g--)
12
- h = O(o, t, d = {}, i[3], I), c = (0, a[g])(s, h), d._ = 1, k(c) && (s = c);
13
- return j(i, s), u && f(s, t, u), r ? o ^ 4 ? l : u : s;
14
- }, E, _, S;
12
+ h = O(o, t, d = {}, i[3], A), c = (0, a[g])(s, h), d._ = 1, k(c) && (s = c);
13
+ return j(i, s), u && _(s, t, u), l ? o ^ 4 ? r : u : s;
14
+ }, E, f, S;
15
15
  E = [U(["wiki", "preferences"])];
16
- class m extends (S = A) {
16
+ class m extends (S = I) {
17
17
  // 1分钟
18
18
  constructor(e) {
19
19
  super(e, {}, "analytics"), this.ctx = e, this._usages = [], this._timer = null, this.MAX_QUEUE_SIZE = 50, this.INTERVAL_MS = 60 * 1e3, this._setupTimer(), this._registerUnloadHandler(), this._showConfirmNotify(), this._initPluginListeners(), e.set("analytics", this);
@@ -27,15 +27,24 @@ class m extends (S = A) {
27
27
  /* @__PURE__ */ n("h3", { children: "InPageEdit Analytics" }),
28
28
  /* @__PURE__ */ n("p", { children: "InPageEdit Analytics is the companion analytics platform for the InPageEdit NEXT project. By collecting and displaying usage data from around the world, it helps developers and the community better understand how the tool is used, optimize feature design, and enhance user experience." }),
29
29
  /* @__PURE__ */ n("h4", { children: "What data will be collected?" }),
30
- /* @__PURE__ */ n("ul", { style: { listStyle: "auto", paddingLeft: "1.5em" }, children: [
31
- /* @__PURE__ */ n("li", { children: "Usage data: What features you use, what pages you edit, etc." }),
32
- /* @__PURE__ */ n("li", { children: "User information: Your username, user ID." }),
33
- /* @__PURE__ */ n("li", { children: "Site information: The wiki you are editing." })
30
+ /* @__PURE__ */ n("ol", { style: { listStyle: "number", paddingLeft: "1em" }, children: [
31
+ /* @__PURE__ */ n("li", { children: [
32
+ /* @__PURE__ */ n("strong", { children: "Usage data" }),
33
+ ": When and which features you use, what pages you edit, etc."
34
+ ] }),
35
+ /* @__PURE__ */ n("li", { children: [
36
+ /* @__PURE__ */ n("strong", { children: "User information" }),
37
+ ": Your user name and user ID."
38
+ ] }),
39
+ /* @__PURE__ */ n("li", { children: [
40
+ /* @__PURE__ */ n("strong", { children: "Site information" }),
41
+ ": This wiki's url and site name."
42
+ ] })
34
43
  ] }),
35
44
  /* @__PURE__ */ n("p", { children: /* @__PURE__ */ n("strong", { children: "NO sensitive data will be collected." }) }),
36
- /* @__PURE__ */ n("ul", { style: { listStyle: "auto", paddingLeft: "1.5em" }, children: [
37
- /* @__PURE__ */ n("li", { children: /* @__PURE__ */ n("a", { href: this.analyticsDashUrl, target: "_blank", rel: "noopener noreferrer", children: "Analytics Platform" }) }),
38
- /* @__PURE__ */ n("li", { children: /* @__PURE__ */ n(
45
+ /* @__PURE__ */ n("div", { style: { display: "grid", gap: "0.5rem" }, children: [
46
+ /* @__PURE__ */ n("a", { href: this.analyticsDashUrl, target: "_blank", rel: "noopener noreferrer", children: /* @__PURE__ */ n("button", { className: "btn", style: { width: "100%" }, children: "Analytics Platform" }) }),
47
+ /* @__PURE__ */ n(
39
48
  "a",
40
49
  {
41
50
  href: `${this.analyticsDashUrl}/_redirect/user?${new URLSearchParams({
@@ -44,9 +53,9 @@ class m extends (S = A) {
44
53
  }).toString()}`,
45
54
  target: "_blank",
46
55
  rel: "noopener noreferrer",
47
- children: "My Data →"
56
+ children: /* @__PURE__ */ n("button", { className: "btn", style: { width: "100%" }, children: "View My Data" })
48
57
  }
49
- ) })
58
+ )
50
59
  ] })
51
60
  ] })
52
61
  ).role("raw-html"),
@@ -56,10 +65,10 @@ class m extends (S = A) {
56
65
  );
57
66
  }
58
67
  get analyticsDashUrl() {
59
- return v.ANALYTICS_DASH_URL;
68
+ return b.ANALYTICS_DASH_URL;
60
69
  }
61
70
  get analyticsApiBase() {
62
- return v.ANALYTICS_API_BASE;
71
+ return b.ANALYTICS_API_BASE;
63
72
  }
64
73
  _setupTimer() {
65
74
  this._timer = setInterval(() => {
@@ -74,9 +83,10 @@ class m extends (S = A) {
74
83
  document.visibilityState === "hidden" && e();
75
84
  }), window.addEventListener("pagehide", e), window.addEventListener("beforeunload", e);
76
85
  }
77
- _showConfirmNotify() {
78
- localStorage.getItem("IPE:analytics/confirm-shown") || this.ctx.inject(["modal"], (t) => {
79
- t.modal.notify(
86
+ async _showConfirmNotify() {
87
+ this.ctx.inject(["modal", "storage"], async (e) => {
88
+ const t = "analytics/confirm-shown", a = await e.storage.simpleKV.get(t), s = await e.preferences.get("analytics.enabled");
89
+ a || s || e.modal.notify(
80
90
  "confirm",
81
91
  {
82
92
  title: "Enable Analytics",
@@ -97,12 +107,12 @@ class m extends (S = A) {
97
107
  label: "Disable"
98
108
  },
99
109
  closeAfter: 0,
100
- onClose() {
101
- localStorage.setItem("IPE:analytics/confirm-shown", "1");
110
+ onClose: () => {
111
+ this.ctx.storage.simpleKV.set(t, 1);
102
112
  }
103
113
  },
104
- (a) => {
105
- t.preferences.set("analytics.enabled", a), a && this.addEvent("analytics", "enabled");
114
+ (r) => {
115
+ e.preferences.set("analytics.enabled", r), r && this.addEvent("analytics", "enabled");
106
116
  }
107
117
  );
108
118
  });
@@ -110,7 +120,7 @@ class m extends (S = A) {
110
120
  _initPluginListeners() {
111
121
  const e = this.ctx;
112
122
  e.on("in-article-links/anchor-clicked", (t) => {
113
- this.addEvent("in-article-links", P(t.action));
123
+ this.addEvent("in-article-links", x(t.action));
114
124
  }), e.on("quick-delete/submit", (t) => {
115
125
  this.addEvent("quick-delete", "submit", t.wikiPage.title);
116
126
  }), e.on("quick-diff/loaded", (t) => {
@@ -150,21 +160,21 @@ class m extends (S = A) {
150
160
  userName: this.ctx.wiki.userInfo.name,
151
161
  version: this.ctx.version.split("-")[0],
152
162
  usages: t
153
- }, s = JSON.stringify(a), l = `${this.analyticsApiBase}/submit`;
154
- if (navigator?.sendBeacon?.(l, s))
163
+ }, s = JSON.stringify(a), r = `${this.analyticsApiBase}/submit`;
164
+ if (navigator?.sendBeacon?.(r, s))
155
165
  return this.logger.debug("Beacon sent successfully", a), !0;
156
166
  {
157
167
  this.logger.debug("Beacon failed, sending via XMLHttpRequest");
158
- const { promise: d, resolve: h, reject: o } = x();
168
+ const { promise: d, resolve: h, reject: o } = P();
159
169
  try {
160
- const r = new XMLHttpRequest();
161
- r.open("POST", l, !0), r.setRequestHeader("Content-Type", "application/json"), r.send(s), r.onload = () => {
162
- this.logger.debug("Beacon sent successfully via XMLHttpRequest", a), h(r.status >= 200 && r.status < 300);
163
- }, r.onerror = () => {
170
+ const l = new XMLHttpRequest();
171
+ l.open("POST", r, !0), l.setRequestHeader("Content-Type", "application/json"), l.send(s), l.onload = () => {
172
+ this.logger.debug("Beacon sent successfully via XMLHttpRequest", a), h(l.status >= 200 && l.status < 300);
173
+ }, l.onerror = () => {
164
174
  o(new Error("Failed to send beacon"));
165
175
  };
166
- } catch (r) {
167
- o(r);
176
+ } catch (l) {
177
+ o(l);
168
178
  }
169
179
  return d;
170
180
  }
@@ -176,10 +186,10 @@ class m extends (S = A) {
176
186
  this._timer !== null && (clearInterval(this._timer), this._timer = null), this._usages.length > 0 && this.sendBeacon();
177
187
  }
178
188
  }
179
- _ = T(S);
180
- m = M(_, 0, "PluginAnalytics", E, m);
181
- C(_, 1, m);
189
+ f = T(S);
190
+ m = M(f, 0, "PluginAnalytics", E, m);
191
+ C(f, 1, m);
182
192
  export {
183
193
  m as PluginAnalytics
184
194
  };
185
- //# sourceMappingURL=index-CfgnJ51A.js.map
195
+ //# sourceMappingURL=index-B3FUDhxl.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-B3FUDhxl.js","sources":["../src/plugins/analytics/index.tsx"],"sourcesContent":["import { Endpoints } from '@/constants/endpoints.js'\nimport { Inject, InPageEdit, Schema } from '@/InPageEdit'\n\ndeclare module '@/InPageEdit' {\n interface InPageEdit {\n analytics: PluginAnalytics\n }\n}\n\nexport interface IPEBeaconPayload {\n siteApi: string\n siteName?: string\n userId: number\n userName: string\n version?: string\n usages: IPEBeaconUsage[]\n}\n\nexport interface IPEBeaconUsage {\n ts: number\n feature: string\n subtype?: string\n page?: string\n}\n\n@Inject(['wiki', 'preferences'])\nexport class PluginAnalytics extends BasePlugin {\n private _usages: IPEBeaconUsage[] = []\n private _timer: ReturnType<typeof setInterval> | null = null\n private readonly MAX_QUEUE_SIZE = 50\n private readonly INTERVAL_MS = 60 * 1000 // 1分钟\n\n constructor(public ctx: InPageEdit) {\n super(ctx, {}, 'analytics')\n this._setupTimer()\n this._registerUnloadHandler()\n this._showConfirmNotify()\n this._initPluginListeners()\n ctx.set('analytics', this)\n }\n\n protected start(): Promise<void> | void {\n const ctx = this.ctx\n ctx.preferences.registerCustomConfig(\n 'analytics',\n Schema.object({\n 'analytics._intro': Schema.const(\n <section>\n <h3>InPageEdit Analytics</h3>\n <p>\n InPageEdit Analytics is the companion analytics platform for the InPageEdit NEXT\n project. By collecting and displaying usage data from around the world, it helps\n developers and the community better understand how the tool is used, optimize feature\n design, and enhance user experience.\n </p>\n <h4>What data will be collected?</h4>\n <ol style={{ listStyle: 'number', paddingLeft: '1em' }}>\n <li>\n <strong>Usage data</strong>: When and which features you use, what pages you edit,\n etc.\n </li>\n <li>\n <strong>User information</strong>: Your user name and user ID.\n </li>\n <li>\n <strong>Site information</strong>: This wiki's url and site name.\n </li>\n </ol>\n <p>\n <strong>NO sensitive data will be collected.</strong>\n </p>\n <div style={{ display: 'grid', gap: '0.5rem' }}>\n <a href={this.analyticsDashUrl} target=\"_blank\" rel=\"noopener noreferrer\">\n <button className=\"btn\" style={{ width: '100%' }}>\n Analytics Platform\n </button>\n </a>\n <a\n href={`${this.analyticsDashUrl}/_redirect/user?${new URLSearchParams({\n siteApi: this.ctx.wiki.getSciprtUrl('api'),\n mwUserId: this.ctx.wiki.userInfo.id.toString(),\n }).toString()}`}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n <button className=\"btn\" style={{ width: '100%' }}>\n View My Data\n </button>\n </a>\n </div>\n </section>\n ).role('raw-html'),\n 'analytics.enabled': Schema.boolean()\n .description('Share my usage data with the community.')\n .default(false),\n }).description('Analytics settings'),\n 'general'\n )\n }\n\n private get analyticsDashUrl() {\n return import.meta.env.PROD ? Endpoints.ANALYTICS_DASH_URL : 'http://localhost:20105'\n }\n private get analyticsApiBase() {\n return import.meta.env.PROD ? Endpoints.ANALYTICS_API_BASE : 'http://localhost:20105/api/v6'\n }\n\n private _setupTimer() {\n this._timer = setInterval(() => {\n if (this._usages.length > 0) {\n this.sendBeacon()\n }\n }, this.INTERVAL_MS)\n }\n\n private _registerUnloadHandler() {\n const handleUnload = () => {\n if (this._usages.length > 0) {\n this.sendBeacon()\n }\n }\n\n window.addEventListener('visibilitychange', () => {\n if (document.visibilityState === 'hidden') {\n handleUnload()\n }\n })\n\n window.addEventListener('pagehide', handleUnload)\n window.addEventListener('beforeunload', handleUnload)\n }\n\n private async _showConfirmNotify() {\n this.ctx.inject(['modal', 'storage'], async (ctx) => {\n const key = 'analytics/confirm-shown'\n const shown = await ctx.storage.simpleKV.get(key)\n const enabled = await ctx.preferences.get('analytics.enabled')\n if (shown || enabled) {\n return\n }\n ctx.modal.notify(\n 'confirm',\n {\n title: 'Enable Analytics',\n content: (\n <div>\n <p>Help us improve InPageEdit by sharing your usage data with us.</p>\n <p>What data will be collected?</p>\n <ul style={{ listStyle: 'auto', paddingLeft: '1.5em' }}>\n <li>Usage data: What features you use, what pages you edit, etc.</li>\n <li>User information: Your username, user ID.</li>\n <li>Site information: The wiki you are editing.</li>\n </ul>\n <p>\n <strong>NO sensitive data will be collected.</strong>\n </p>\n </div>\n ),\n okBtn: {\n label: 'Enable',\n },\n cancelBtn: {\n label: 'Disable',\n },\n closeAfter: 0,\n onClose: () => {\n this.ctx.storage.simpleKV.set(key, 1)\n },\n },\n (result) => {\n ctx.preferences.set('analytics.enabled', result)\n if (result) {\n this.addEvent('analytics', 'enabled')\n }\n }\n )\n })\n }\n\n private _initPluginListeners() {\n const ctx = this.ctx\n ctx.on('in-article-links/anchor-clicked', (payload) => {\n this.addEvent('in-article-links', paramCase(payload.action))\n })\n ctx.on('quick-delete/submit', (payload) => {\n this.addEvent('quick-delete', 'submit', payload.wikiPage.title)\n })\n ctx.on('quick-diff/loaded', (payload) => {\n this.addEvent('quick-diff', 'loaded', payload.compare.fromtitle)\n })\n ctx.on('quick-redirect/submit', (payload) => {\n this.addEvent('quick-redirect', 'submit', payload.payload.to || undefined)\n })\n ctx.on('quick-preview/loaded', (payload) => {\n this.addEvent('quick-preview', 'loaded', payload.wikiPage.title)\n })\n ctx.on('quick-edit/wiki-page', (payload) => {\n this.addEvent('quick-edit', undefined, payload.wikiPage.title)\n })\n ctx.on('quick-edit/submit', (payload) => {\n this.addEvent('quick-edit', 'submit', payload.wikiPage.title)\n })\n ctx.on('quick-move/submit', (payload) => {\n this.addEvent('quick-move', 'submit')\n })\n ctx.on('toolbox/button-clicked', (payload) => {\n this.addEvent('toolbox', `button-clicked#${payload.id || 'unknown'}`)\n })\n }\n\n public addEvent(feature: string, subtype?: string, page?: string) {\n const usage: IPEBeaconUsage = {\n ts: Date.now(),\n feature,\n subtype,\n page,\n }\n this._usages.push(usage)\n\n // 如果usages数组超过50个,立即发送\n if (this._usages.length >= this.MAX_QUEUE_SIZE) {\n this.sendBeacon()\n }\n\n return this\n }\n\n private async sendBeacon() {\n if (this._usages.length === 0) {\n return true\n }\n\n const enabled = await this.ctx.preferences.get<boolean>('analytics.enabled', false)\n if (!enabled) {\n this.logger.debug('Analytics disabled, skipping')\n return true\n }\n\n const usages = this._usages.splice(0, this._usages.length)\n const payload: IPEBeaconPayload = {\n siteApi: this.ctx.wiki.getSciprtUrl('api'),\n siteName: this.ctx.wiki.siteInfo.general.sitename,\n userId: this.ctx.wiki.userInfo.id,\n userName: this.ctx.wiki.userInfo.name,\n version: this.ctx.version.split('-')[0],\n usages,\n }\n const body = JSON.stringify(payload)\n\n const endpoint = `${this.analyticsApiBase}/submit`\n\n const beaconOK = navigator?.sendBeacon?.(endpoint, body)\n if (beaconOK) {\n this.logger.debug('Beacon sent successfully', payload)\n return true\n } else {\n this.logger.debug('Beacon failed, sending via XMLHttpRequest')\n const { promise, resolve, reject } = promiseWithResolvers<boolean>()\n try {\n const xhr = new XMLHttpRequest()\n xhr.open('POST', endpoint, true)\n xhr.setRequestHeader('Content-Type', 'application/json')\n xhr.send(body)\n xhr.onload = () => {\n this.logger.debug('Beacon sent successfully via XMLHttpRequest', payload)\n resolve(xhr.status >= 200 && xhr.status < 300)\n }\n xhr.onerror = () => {\n reject(new Error('Failed to send beacon'))\n }\n } catch (error) {\n reject(error)\n }\n return promise\n }\n }\n\n /**\n * 清理资源\n */\n protected stop() {\n if (this._timer !== null) {\n clearInterval(this._timer)\n this._timer = null\n }\n // 在销毁前发送剩余的数据\n if (this._usages.length > 0) {\n this.sendBeacon()\n }\n }\n}\n"],"names":["_PluginAnalytics_decorators","_init","_a","Inject","PluginAnalytics","BasePlugin","ctx","Schema","jsx","jsxs","Endpoints","handleUnload","key","shown","enabled","result","payload","paramCase","feature","subtype","page","usage","usages","body","endpoint","promise","resolve","reject","promiseWithResolvers","xhr","error","__decoratorStart","__decorateElement","__runInitializers"],"mappings":"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"}