@hiai-gg/docsmint 0.5.7 → 0.5.8

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.
@@ -1,4 +1,4 @@
1
- import { i as e, r as t } from "./editorExtensions-BMHvUbdk.js";
1
+ import { i as e, r as t } from "./editorExtensions-BmINh76i.js";
2
2
  //#region src/lib/components/editor/markdown.ts
3
3
  var n = null;
4
4
  function r() {
@@ -810,9 +810,9 @@ function H(e, o) {
810
810
  Item: Fe,
811
811
  Trigger: Pe,
812
812
  Value: Ie
813
- }, je = M.prop(o, "extensionContext", 19, () => ({ pathname: "/search" })), We = ke(), N = De(), P = Te(), F = M.state(""), I = M.state(""), L = M.state(M.proxy([])), R = M.state(""), z = M.state(""), B = M.state(""), V = M.state(1), H = M.state(5), U = M.state("relevance"), W = M.state(!0), G = M.state(!0), Tt = M.state(M.proxy([])), K = M.state(M.proxy([])), Et = M.state(M.proxy([]));
813
+ }, je = M.prop(o, "extensionContext", 19, () => ({ pathname: "/search" })), We = ke(), N = De(), P = Te(), F = M.state(""), I = M.state(""), L = M.state(M.proxy([])), R = M.state(""), z = M.state(""), B = M.state(""), V = M.state(1), H = M.state(10), U = M.state("relevance"), W = M.state(!0), G = M.state(!0), Tt = M.state(M.proxy([])), K = M.state(M.proxy([])), Et = M.state(M.proxy([]));
814
814
  M.user_effect(() => {
815
- M.set(F, o.data.query ?? "", !0), M.set(I, o.data.filters?.folder ?? "", !0), M.set(L, o.data.filters?.tags ?? [], !0), M.set(R, o.data.filters?.category ?? "", !0), M.set(z, o.data.filters?.dateFrom ?? "", !0), M.set(B, o.data.filters?.dateTo ?? "", !0), M.set(V, o.data.page ?? 1, !0), M.set(H, o.data.limit ?? 5, !0);
815
+ M.set(F, o.data.query ?? "", !0), M.set(I, o.data.filters?.folder ?? "", !0), M.set(L, o.data.filters?.tags ?? [], !0), M.set(R, o.data.filters?.category ?? "", !0), M.set(z, o.data.filters?.dateFrom ?? "", !0), M.set(B, o.data.filters?.dateTo ?? "", !0), M.set(V, o.data.page ?? 1, !0), M.set(H, o.data.limit ?? 10, !0);
816
816
  });
817
817
  let q = M.state(null), J = M.state(!1), Y = 0, Dt = M.state(0), X = M.state(!1), Ot = M.state(M.proxy([])), kt = M.state(M.proxy([])), At = M.state(M.proxy([])), jt = M.derived(() => Ae(We.searchWidgets, je())), Z = M.derived(() => M.get(q) ? Math.ceil(M.get(q).total / M.get(H)) : 0), Mt = M.derived(() => M.get(I) !== "" || M.get(L).length > 0 || M.get(R) !== "" || M.get(z) !== "" || M.get(B) !== "");
818
818
  M.user_effect(() => {
@@ -855,7 +855,7 @@ function H(e, o) {
855
855
  });
856
856
  function $(e) {
857
857
  let t = new URLSearchParams(), n = "q" in e ? e.q : M.get(F), r = "folder" in e ? e.folder : M.get(I), i = "tags" in e ? e.tags : M.get(L).join(","), a = "category" in e ? e.category : M.get(R), o = "dateFrom" in e ? e.dateFrom : M.get(z), s = "dateTo" in e ? e.dateTo : M.get(B), c = "page" in e ? e.page : String(M.get(V)), l = "limit" in e ? e.limit : String(M.get(H));
858
- return n && t.set("q", n), r && t.set("folder", r), i && t.set("tags", i), a && t.set("category", a), o && t.set("dateFrom", o), s && t.set("dateTo", s), c && c !== "1" && t.set("page", c), l && l !== "5" && t.set("limit", l), `/search?${t.toString()}`;
858
+ return n && t.set("q", n), r && t.set("folder", r), i && t.set("tags", i), a && t.set("category", a), o && t.set("dateFrom", o), s && t.set("dateTo", s), c && c !== "1" && t.set("page", c), l && l !== "10" && t.set("limit", l), `/search?${t.toString()}`;
859
859
  }
860
860
  function Rt(e) {
861
861
  e.preventDefault();
@@ -9,8 +9,107 @@ import TextAlign from "@tiptap/extension-text-align";
9
9
  import { Markdown } from "@tiptap/markdown";
10
10
  import StarterKit from "@tiptap/starter-kit";
11
11
  import { common, createLowlight } from "lowlight";
12
+ //#region src/lib/components/editor/editor-content-sanitizer.ts
13
+ var ATTACHMENT_RAW_URL = /^\/api\/attachments\/[0-9a-f-]+\/raw$/i;
14
+ function isAttachmentImage(node) {
15
+ return node.type === "image" && typeof node.attrs?.src === "string" && ATTACHMENT_RAW_URL.test(node.attrs.src);
16
+ }
17
+ function isSafeEditorImageSource(value) {
18
+ if (typeof value !== "string") return false;
19
+ const src = value.trim();
20
+ return ATTACHMENT_RAW_URL.test(src) || /^https?:\/\//i.test(src) || /^blob:/i.test(src) || /^data:image\//i.test(src);
21
+ }
22
+ function isLoadableImage(node) {
23
+ if (node.type !== "image") return true;
24
+ return isSafeEditorImageSource(node.attrs?.src);
25
+ }
26
+ function sanitizeNode(node) {
27
+ if (!isLoadableImage(node)) return [];
28
+ if (!node.content) return [node];
29
+ const children = node.content.flatMap((child) => sanitizeNode(child));
30
+ if (node.type === "paragraph") {
31
+ const normalized = [];
32
+ let inline = [];
33
+ const flushInline = () => {
34
+ if (inline.length === 0) return;
35
+ normalized.push({
36
+ ...node,
37
+ content: inline
38
+ });
39
+ inline = [];
40
+ };
41
+ for (const child of children) if (child.type === "image") {
42
+ flushInline();
43
+ normalized.push(child);
44
+ } else inline.push(child);
45
+ flushInline();
46
+ return normalized.length > 0 ? normalized : [{
47
+ ...node,
48
+ content: []
49
+ }];
50
+ }
51
+ return [{
52
+ ...node,
53
+ content: children
54
+ }];
55
+ }
56
+ function sanitizeEditorContent(value) {
57
+ return sanitizeNode(value)[0] ?? {
58
+ type: "doc",
59
+ content: [{ type: "paragraph" }]
60
+ };
61
+ }
62
+ async function removeUnavailableAttachmentImages(value, fetchImpl = fetch) {
63
+ const root = sanitizeEditorContent(value);
64
+ const urls = /* @__PURE__ */ new Set();
65
+ const collect = (node) => {
66
+ if (isAttachmentImage(node)) urls.add(node.attrs?.src);
67
+ for (const child of node.content ?? []) collect(child);
68
+ };
69
+ collect(root);
70
+ const unavailable = /* @__PURE__ */ new Set();
71
+ await Promise.all(Array.from(urls, async (url) => {
72
+ try {
73
+ if (!(await fetchImpl(url, { credentials: "include" })).ok) unavailable.add(url);
74
+ } catch {
75
+ unavailable.add(url);
76
+ }
77
+ }));
78
+ let removed = 0;
79
+ const remove = (node) => {
80
+ if (isAttachmentImage(node) && unavailable.has(node.attrs?.src)) {
81
+ removed += 1;
82
+ return null;
83
+ }
84
+ if (!node.content) return node;
85
+ return {
86
+ ...node,
87
+ content: node.content.map(remove).filter((child) => child !== null)
88
+ };
89
+ };
90
+ return {
91
+ content: remove(root) ?? {
92
+ type: "doc",
93
+ content: []
94
+ },
95
+ removed
96
+ };
97
+ }
98
+ //#endregion
12
99
  //#region src/lib/components/editor/editorExtensions.ts
13
100
  var lowlight = createLowlight(common);
101
+ var SafeImage = Image.extend({ addAttributes() {
102
+ return {
103
+ src: {
104
+ default: null,
105
+ renderHTML: (attributes) => ({ src: isSafeEditorImageSource(attributes.src) ? attributes.src : null })
106
+ },
107
+ alt: { default: null },
108
+ title: { default: null },
109
+ width: { default: null },
110
+ height: { default: null }
111
+ };
112
+ } });
14
113
  var EMPTY_PARAGRAPH_MARKDOWN = " ";
15
114
  var NBSP_CHAR = "\xA0";
16
115
  var TEXT_ALIGNMENTS = [
@@ -158,7 +257,7 @@ var editorExtensions = [
158
257
  openOnClick: false,
159
258
  HTMLAttributes: { class: "doc-link" }
160
259
  }),
161
- Image.configure({
260
+ SafeImage.configure({
162
261
  inline: false,
163
262
  allowBase64: false,
164
263
  HTMLAttributes: { class: "doc-image" },
@@ -183,4 +282,4 @@ var editorExtensions = [
183
282
  TaskItem.configure({ nested: true })
184
283
  ];
185
284
  //#endregion
186
- export { TextAlignParagraph as n, editorExtensions as r, TextAlignHeading as t };
285
+ export { sanitizeEditorContent as a, removeUnavailableAttachmentImages as i, TextAlignParagraph as n, editorExtensions as r, TextAlignHeading as t };
@@ -1,4 +1,4 @@
1
- import { r as editorExtensions } from "./editorExtensions-DUzwndMy.js";
1
+ import { r as editorExtensions } from "./editorExtensions-BwGeSPuX.js";
2
2
  import { MarkdownManager } from "@tiptap/markdown";
3
3
  //#region src/lib/components/editor/markdown.ts
4
4
  var managerSingleton = null;
@@ -10,8 +10,8 @@ import { a as resolveOfflineIdentity } from "../../assets/identity-B3uHoDtf.js";
10
10
  import { n as getOfflineDB } from "../../assets/db-CnxeO66n.js";
11
11
  import { h as unregisterShortcut, u as registerShortcut } from "../../assets/keyboard.svelte-BgF47N3L.js";
12
12
  import { t as CreateSnapshotDialog } from "../../assets/CreateSnapshotDialog-CI8vXXcN.js";
13
- import { r as editorExtensions } from "../../assets/editorExtensions-DUzwndMy.js";
14
- import { t as markdownToJson } from "../../assets/markdown-CjqvGi5W.js";
13
+ import { a as sanitizeEditorContent, i as removeUnavailableAttachmentImages, r as editorExtensions } from "../../assets/editorExtensions-BwGeSPuX.js";
14
+ import { t as markdownToJson } from "../../assets/markdown-CB8DZ-LT.js";
15
15
  import * as $ from "svelte/internal/server";
16
16
  import { onDestroy, onMount, tick } from "svelte";
17
17
  import "svelte/reactivity";
@@ -2145,83 +2145,6 @@ function EditorToolbar($$renderer, $$props) {
2145
2145
  });
2146
2146
  }
2147
2147
  //#endregion
2148
- //#region src/lib/components/editor/editor-content-sanitizer.ts
2149
- var ATTACHMENT_RAW_URL = /^\/api\/attachments\/[0-9a-f-]+\/raw$/i;
2150
- function isAttachmentImage(node) {
2151
- return node.type === "image" && typeof node.attrs?.src === "string" && ATTACHMENT_RAW_URL.test(node.attrs.src);
2152
- }
2153
- function sanitizeNode(node) {
2154
- if (!node.content) return [node];
2155
- const children = node.content.flatMap((child) => sanitizeNode(child));
2156
- if (node.type === "paragraph") {
2157
- const normalized = [];
2158
- let inline = [];
2159
- const flushInline = () => {
2160
- if (inline.length === 0) return;
2161
- normalized.push({
2162
- ...node,
2163
- content: inline
2164
- });
2165
- inline = [];
2166
- };
2167
- for (const child of children) if (child.type === "image") {
2168
- flushInline();
2169
- normalized.push(child);
2170
- } else inline.push(child);
2171
- flushInline();
2172
- return normalized.length > 0 ? normalized : [{
2173
- ...node,
2174
- content: []
2175
- }];
2176
- }
2177
- return [{
2178
- ...node,
2179
- content: children
2180
- }];
2181
- }
2182
- function sanitizeEditorContent(value) {
2183
- return sanitizeNode(value)[0] ?? {
2184
- type: "doc",
2185
- content: [{ type: "paragraph" }]
2186
- };
2187
- }
2188
- async function removeUnavailableAttachmentImages(value, fetchImpl = fetch) {
2189
- const root = sanitizeEditorContent(value);
2190
- const urls = /* @__PURE__ */ new Set();
2191
- const collect = (node) => {
2192
- if (isAttachmentImage(node)) urls.add(node.attrs?.src);
2193
- for (const child of node.content ?? []) collect(child);
2194
- };
2195
- collect(root);
2196
- const unavailable = /* @__PURE__ */ new Set();
2197
- await Promise.all(Array.from(urls, async (url) => {
2198
- try {
2199
- if (!(await fetchImpl(url, { credentials: "include" })).ok) unavailable.add(url);
2200
- } catch {
2201
- unavailable.add(url);
2202
- }
2203
- }));
2204
- let removed = 0;
2205
- const remove = (node) => {
2206
- if (isAttachmentImage(node) && unavailable.has(node.attrs?.src)) {
2207
- removed += 1;
2208
- return null;
2209
- }
2210
- if (!node.content) return node;
2211
- return {
2212
- ...node,
2213
- content: node.content.map(remove).filter((child) => child !== null)
2214
- };
2215
- };
2216
- return {
2217
- content: remove(root) ?? {
2218
- type: "doc",
2219
- content: []
2220
- },
2221
- removed
2222
- };
2223
- }
2224
- //#endregion
2225
2148
  //#region src/lib/components/editor/large-markdown.ts
2226
2149
  var LARGE_MARKDOWN_THRESHOLD = 25e4;
2227
2150
  function shouldDeferMarkdownParsing(markdown) {
@@ -1,2 +1,2 @@
1
- import { n as TextAlignParagraph, r as editorExtensions, t as TextAlignHeading } from "../../assets/editorExtensions-DUzwndMy.js";
1
+ import { n as TextAlignParagraph, r as editorExtensions, t as TextAlignHeading } from "../../assets/editorExtensions-BwGeSPuX.js";
2
2
  export { TextAlignHeading, TextAlignParagraph, editorExtensions };
@@ -1,6 +1,6 @@
1
1
  import { Bt as editor_markdown_placeholder, zt as editor_markdown_label } from "../../assets/messages-BAQzILs4.js";
2
2
  import { t as Copy } from "../../assets/copy-DkkCPkBL.js";
3
- import "../../assets/markdown-CjqvGi5W.js";
3
+ import "../../assets/markdown-CB8DZ-LT.js";
4
4
  import * as $ from "svelte/internal/server";
5
5
  //#region src/lib/components/editor/MarkdownToggle.svelte
6
6
  function MarkdownToggle($$renderer, $$props) {
@@ -1,2 +1,2 @@
1
- import { t as markdownToJson } from "../../assets/markdown-CjqvGi5W.js";
1
+ import { t as markdownToJson } from "../../assets/markdown-CB8DZ-LT.js";
2
2
  export { markdownToJson };
@@ -127,7 +127,7 @@ function HiaiDocsSearchHost($$renderer, $$props) {
127
127
  let dateFrom = "";
128
128
  let dateTo = "";
129
129
  let currentPage = 1;
130
- let pageSize = 5;
130
+ let pageSize = 10;
131
131
  let allDocuments = [];
132
132
  let allFolders = [];
133
133
  let allCategories = [];
@@ -169,7 +169,7 @@ function HiaiDocsSearchHost($$renderer, $$props) {
169
169
  if (df) params.set("dateFrom", df);
170
170
  if (dt) params.set("dateTo", dt);
171
171
  if (p && p !== "1") params.set("page", p);
172
- if (l && l !== "5") params.set("limit", l);
172
+ if (l && l !== "10") params.set("limit", l);
173
173
  return `/search?${params.toString()}`;
174
174
  }
175
175
  function applyDateRange() {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hiai-gg/docsmint",
3
- "version": "0.5.7",
3
+ "version": "0.5.8",
4
4
  "type": "module",
5
5
  "browser": {
6
6
  "./dist/backend-launcher.js": false,
@@ -24,7 +24,7 @@ import { registerSearch } from "./commands/search.js";
24
24
  import { registerSnapshot } from "./commands/snapshot.js";
25
25
  import { registerUpdate } from "./commands/update.js";
26
26
 
27
- const VERSION = "0.5.7";
27
+ const VERSION = "0.5.8";
28
28
 
29
29
  const program = new Command();
30
30
  program
@@ -35,7 +35,7 @@ interface McpToolResult {
35
35
 
36
36
  const server = new McpServer({
37
37
  name: "hiai-docs",
38
- version: "0.5.7",
38
+ version: "0.5.8",
39
39
  });
40
40
 
41
41
  /**