@refinex-md/model 0.1.0-canary.1 → 0.1.0-canary.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -8,6 +8,12 @@
8
8
  pnpm add @refinex-md/model
9
9
  ```
10
10
 
11
+ 如需预发布版本,显式使用 `@next`:
12
+
13
+ ```bash
14
+ pnpm add @refinex-md/model@next
15
+ ```
16
+
11
17
  ## 最短示例
12
18
 
13
19
  ```ts
package/dist/index.js CHANGED
@@ -1,11 +1,31 @@
1
- import { Schema as z, Node as F, Fragment as M } from "prosemirror-model";
2
- import { PluginKey as U, Plugin as K } from "prosemirror-state";
3
- import { tableNodes as j } from "prosemirror-tables";
4
- const b = {
1
+ import { Schema as F, Node as U, Fragment as M } from "prosemirror-model";
2
+ import { PluginKey as K, Plugin as j } from "prosemirror-state";
3
+ import { tableNodes as H } from "prosemirror-tables";
4
+ const X = {
5
+ gray: "#7c7c78",
6
+ brown: "#9f6b53",
7
+ orange: "#d9730d",
8
+ yellow: "#cb912f",
9
+ green: "#448361",
10
+ blue: "#337ea9",
11
+ purple: "#9065b0",
12
+ pink: "#c14c8a",
13
+ red: "#d44c47"
14
+ }, G = {
15
+ gray: "#f1f1ef",
16
+ brown: "#f4eeee",
17
+ orange: "#faebdd",
18
+ yellow: "#fbf3db",
19
+ green: "#edf3ec",
20
+ blue: "#e7f3f8",
21
+ purple: "#f6f3f9",
22
+ pink: "#f9f2f5",
23
+ red: "#fdebec"
24
+ }, p = {
5
25
  blockId: { default: null },
6
26
  metadata: { default: null },
7
27
  permissions: { default: null }
8
- }, H = ["doc:read", "doc:write"];
28
+ }, J = ["doc:read", "doc:write"];
9
29
  function g(e, t, r = {}) {
10
30
  const a = r.blockId ?? "forbidden";
11
31
  return {
@@ -14,12 +34,12 @@ function g(e, t, r = {}) {
14
34
  version: "1.0.0",
15
35
  spec: { ...t, refinexBlockId: a },
16
36
  blockId: a,
17
- capabilities: H,
37
+ capabilities: J,
18
38
  fallback: r.fallback ?? "paragraph",
19
39
  markdown: r.markdown ? { format: r.markdown } : void 0
20
40
  };
21
41
  }
22
- const it = [
42
+ const ct = [
23
43
  "image_block",
24
44
  "callout",
25
45
  "task_list",
@@ -35,8 +55,8 @@ const it = [
35
55
  "math_inline",
36
56
  "math_block"
37
57
  ];
38
- function J() {
39
- const e = j({
58
+ function W() {
59
+ const e = H({
40
60
  tableGroup: "block",
41
61
  cellContent: "block+",
42
62
  cellAttributes: {
@@ -56,7 +76,16 @@ function J() {
56
76
  return t.getAttribute("data-background") ?? t.style.backgroundColor ?? null;
57
77
  },
58
78
  setDOMAttr(t, r) {
59
- t && (r["data-background"] = t, r.style = `${String(r.style ?? "")} background-color: ${String(t)};`.trim());
79
+ t && (r["data-background"] = t, r.style = `${String(r.style ?? "")} background-color: ${E(t, G)};`.trim());
80
+ }
81
+ },
82
+ textColor: {
83
+ default: null,
84
+ getFromDOM(t) {
85
+ return t.getAttribute("data-text-color") ?? t.style.color ?? null;
86
+ },
87
+ setDOMAttr(t, r) {
88
+ t && (r["data-text-color"] = t, r.style = `${String(r.style ?? "")} color: ${E(t, X)};`.trim());
60
89
  }
61
90
  },
62
91
  metadata: {
@@ -95,7 +124,7 @@ function J() {
95
124
  widthPercent: { default: 100 },
96
125
  aspectRatio: { default: null },
97
126
  status: { default: "ready" },
98
- ...b
127
+ ...p
99
128
  },
100
129
  selectable: !0,
101
130
  draggable: !0,
@@ -154,7 +183,7 @@ function J() {
154
183
  title: { default: null },
155
184
  icon: { default: null },
156
185
  collapsed: { default: !1 },
157
- ...b
186
+ ...p
158
187
  },
159
188
  selectable: !0,
160
189
  draggable: !0,
@@ -165,7 +194,7 @@ function J() {
165
194
  getAttrs(t) {
166
195
  const r = t;
167
196
  return {
168
- kind: D(r.getAttribute("data-kind")),
197
+ kind: O(r.getAttribute("data-kind")),
169
198
  title: r.getAttribute("data-title"),
170
199
  icon: r.getAttribute("data-icon"),
171
200
  collapsed: r.getAttribute("data-collapsed") === "true"
@@ -178,11 +207,11 @@ function J() {
178
207
  "aside",
179
208
  {
180
209
  "data-rmd-callout": "true",
181
- "data-kind": D(t.attrs.kind),
210
+ "data-kind": O(t.attrs.kind),
182
211
  "data-title": t.attrs.title,
183
212
  "data-icon": t.attrs.icon,
184
213
  "data-collapsed": String(!!t.attrs.collapsed),
185
- class: `rmd-callout rmd-callout-${D(t.attrs.kind)}`
214
+ class: `rmd-callout rmd-callout-${O(t.attrs.kind)}`
186
215
  },
187
216
  0
188
217
  ];
@@ -209,7 +238,7 @@ function J() {
209
238
  content: "paragraph block*",
210
239
  attrs: {
211
240
  checked: { default: !1 },
212
- ...b
241
+ ...p
213
242
  },
214
243
  defining: !0,
215
244
  parseDOM: [
@@ -253,7 +282,7 @@ function J() {
253
282
  content: "paragraph block*",
254
283
  attrs: {
255
284
  collapsed: { default: !1 },
256
- ...b
285
+ ...p
257
286
  },
258
287
  selectable: !0,
259
288
  draggable: !0,
@@ -304,7 +333,7 @@ function J() {
304
333
  aspectRatio: { default: null },
305
334
  status: { default: "unresolved" },
306
335
  error: { default: null },
307
- ...b
336
+ ...p
308
337
  },
309
338
  parseDOM: [
310
339
  {
@@ -344,7 +373,7 @@ function J() {
344
373
  group: "block",
345
374
  attrs: {
346
375
  variant: { default: "solid" },
347
- ...b
376
+ ...p
348
377
  },
349
378
  selectable: !0,
350
379
  draggable: !0,
@@ -353,7 +382,7 @@ function J() {
353
382
  tag: "hr[data-rmd-divider]",
354
383
  getAttrs(t) {
355
384
  return {
356
- variant: O(t.getAttribute("data-variant"))
385
+ variant: D(t.getAttribute("data-variant"))
357
386
  };
358
387
  }
359
388
  }
@@ -363,8 +392,8 @@ function J() {
363
392
  "hr",
364
393
  {
365
394
  "data-rmd-divider": "true",
366
- "data-variant": O(t.attrs.variant),
367
- class: `rmd-divider rmd-divider-${O(t.attrs.variant)}`
395
+ "data-variant": D(t.attrs.variant),
396
+ class: `rmd-divider rmd-divider-${D(t.attrs.variant)}`
368
397
  }
369
398
  ];
370
399
  }
@@ -380,7 +409,7 @@ function J() {
380
409
  columnWidths: { default: null },
381
410
  layout: { default: "auto" },
382
411
  caption: { default: null },
383
- ...b
412
+ ...p
384
413
  },
385
414
  isolating: !0,
386
415
  selectable: !0,
@@ -440,7 +469,7 @@ function J() {
440
469
  numbered: { default: !1 },
441
470
  label: { default: null },
442
471
  align: { default: "center" },
443
- ...b
472
+ ...p
444
473
  },
445
474
  parseDOM: [
446
475
  {
@@ -475,7 +504,7 @@ function J() {
475
504
  )
476
505
  ];
477
506
  }
478
- const ut = J();
507
+ const gt = W();
479
508
  function _(e) {
480
509
  return e === "left" || e === "right" ? e : "center";
481
510
  }
@@ -486,7 +515,7 @@ function N(e) {
486
515
  function x(e) {
487
516
  return e === "empty" || e === "uploading" || e === "error" ? e : "ready";
488
517
  }
489
- function D(e) {
518
+ function O(e) {
490
519
  return e === "tip" || e === "important" || e === "warning" || e === "caution" ? e : e === "error" ? "caution" : "note";
491
520
  }
492
521
  function S(e) {
@@ -495,24 +524,28 @@ function S(e) {
495
524
  function $(e) {
496
525
  return e === "loading" || e === "ready" || e === "error" ? e : "unresolved";
497
526
  }
498
- function O(e) {
527
+ function D(e) {
499
528
  return e === "dashed" || e === "dotted" ? e : "solid";
500
529
  }
501
530
  function v(e) {
502
531
  return e === !0 || e === "true";
503
532
  }
504
- const C = "1.0.0", W = "@refinex-md/base", B = "1.0.0", h = {
533
+ function E(e, t) {
534
+ const r = String(e);
535
+ return t[r] ?? r;
536
+ }
537
+ const B = "1.0.0", Z = "@refinex-md/base", T = "1.0.0", h = {
505
538
  blockId: { default: null },
506
539
  metadata: { default: null },
507
540
  permissions: { default: null }
508
- }, E = /* @__PURE__ */ new Set([
541
+ }, C = /* @__PURE__ */ new Set([
509
542
  "paragraph",
510
543
  "heading",
511
544
  "blockquote",
512
545
  "list_item",
513
546
  "code_block",
514
547
  "horizontal_rule"
515
- ]), X = {
548
+ ]), Q = {
516
549
  doc: { content: "block+" },
517
550
  paragraph: {
518
551
  attrs: h,
@@ -716,7 +749,7 @@ const C = "1.0.0", W = "@refinex-md/base", B = "1.0.0", h = {
716
749
  text: {
717
750
  group: "inline"
718
751
  }
719
- }, G = {
752
+ }, Y = {
720
753
  bold: {
721
754
  parseDOM: [{ tag: "strong" }, { tag: "b" }, { style: "font-weight=bold" }],
722
755
  toDOM() {
@@ -802,7 +835,7 @@ const C = "1.0.0", W = "@refinex-md/base", B = "1.0.0", h = {
802
835
  }
803
836
  }
804
837
  };
805
- function dt(e, t, r = {}) {
838
+ function ft(e, t, r = {}) {
806
839
  return {
807
840
  kind: "node",
808
841
  name: e,
@@ -816,7 +849,7 @@ function dt(e, t, r = {}) {
816
849
  migration: r.migration
817
850
  };
818
851
  }
819
- function ct(e, t, r = {}) {
852
+ function mt(e, t, r = {}) {
820
853
  return {
821
854
  kind: "mark",
822
855
  name: e,
@@ -830,72 +863,72 @@ function ct(e, t, r = {}) {
830
863
  };
831
864
  }
832
865
  function q(e = {}) {
833
- const t = { ...X }, r = { ...G }, a = /* @__PURE__ */ new Set([...Object.keys(t), ...Object.keys(r)]);
866
+ const t = { ...Q }, r = { ...Y }, a = /* @__PURE__ */ new Set([...Object.keys(t), ...Object.keys(r)]);
834
867
  for (const l of e.extensions ?? []) {
835
- if (tt(l.name), a.has(l.name))
868
+ if (at(l.name), a.has(l.name))
836
869
  throw new Error(`Extension name "${l.name}" is reserved or already registered.`);
837
- a.add(l.name), l.kind === "node" ? (et(l), t[l.name] = { ...l.spec, refinexBlockId: l.blockId }) : r[l.name] = l.spec;
870
+ a.add(l.name), l.kind === "node" ? (lt(l), t[l.name] = { ...l.spec, refinexBlockId: l.blockId }) : r[l.name] = l.spec;
838
871
  }
839
- return new z({ nodes: t, marks: r });
872
+ return new F({ nodes: t, marks: r });
840
873
  }
841
- const Z = q(), gt = Z;
842
- function T() {
874
+ const tt = q(), bt = tt;
875
+ function R() {
843
876
  var r;
844
877
  const e = new Uint8Array(12);
845
878
  return (r = globalThis.crypto) == null || r.getRandomValues(e), `blk_${Array.from(e, (a) => a.toString(36).padStart(2, "0")).join("").slice(0, 24)}`;
846
879
  }
847
- function R(e) {
848
- return "spec" in e ? e.spec.refinexBlockId === "required" || E.has(e.name) : E.has(e.type);
880
+ function L(e) {
881
+ return "spec" in e ? e.spec.refinexBlockId === "required" || C.has(e.name) : C.has(e.type);
849
882
  }
850
- function Q(e, t, r = {}) {
851
- const a = r.createId ?? T, l = /* @__PURE__ */ new Set(), i = [];
883
+ function et(e, t, r = {}) {
884
+ const a = r.createId ?? R, l = /* @__PURE__ */ new Set(), i = [];
852
885
  let o = !1;
853
- function c(n, m) {
886
+ function c(n, f) {
854
887
  if (n.isText) return n;
855
888
  let s = n.attrs;
856
- if (R(n.type)) {
857
- const u = s.blockId;
858
- typeof u != "string" || u.length === 0 ? (s = { ...s, blockId: a() }, o = !0, i.push(d("BLOCK_ID_MISSING", "warn", `${m}.attrs.blockId`, "Missing blockId was generated."))) : L(u) ? l.has(u) && (s = { ...s, blockId: a() }, o = !0, i.push(d("BLOCK_ID_DUPLICATE", "warn", `${m}.attrs.blockId`, "Duplicate blockId was replaced."))) : (s = { ...s, blockId: a() }, o = !0, i.push(d("BLOCK_ID_INVALID", "warn", `${m}.attrs.blockId`, "Invalid blockId was replaced."))), l.add(s.blockId);
889
+ if (L(n.type)) {
890
+ const d = s.blockId;
891
+ typeof d != "string" || d.length === 0 ? (s = { ...s, blockId: a() }, o = !0, i.push(u("BLOCK_ID_MISSING", "warn", `${f}.attrs.blockId`, "Missing blockId was generated."))) : V(d) ? l.has(d) && (s = { ...s, blockId: a() }, o = !0, i.push(u("BLOCK_ID_DUPLICATE", "warn", `${f}.attrs.blockId`, "Duplicate blockId was replaced."))) : (s = { ...s, blockId: a() }, o = !0, i.push(u("BLOCK_ID_INVALID", "warn", `${f}.attrs.blockId`, "Invalid blockId was replaced."))), l.add(s.blockId);
859
892
  } else if ("blockId" in s) {
860
- const { blockId: u, ...I } = s;
861
- s = I, o = !0, i.push(d("BLOCK_ID_FORBIDDEN", "warn", `${m}.attrs.blockId`, "Forbidden blockId was removed."));
893
+ const { blockId: d, ...I } = s;
894
+ s = I, o = !0, i.push(u("BLOCK_ID_FORBIDDEN", "warn", `${f}.attrs.blockId`, "Forbidden blockId was removed."));
862
895
  }
863
- const p = [];
864
- n.forEach((u, I, V) => {
865
- p.push(c(u, `${m}.content[${V}]`));
896
+ const b = [];
897
+ n.forEach((d, I, z) => {
898
+ b.push(c(d, `${f}.content[${z}]`));
866
899
  });
867
- const f = p.length > 0 ? M.fromArray(p) : M.empty, k = p.length === n.childCount && p.every((u, I) => u.eq(n.child(I)));
868
- return s === n.attrs && k ? n : n.type.create(s, f, n.marks);
900
+ const m = b.length > 0 ? M.fromArray(b) : M.empty, k = b.length === n.childCount && b.every((d, I) => d.eq(n.child(I)));
901
+ return s === n.attrs && k ? n : n.type.create(s, m, n.marks);
869
902
  }
870
903
  return { doc: c(e, "$"), changed: o, issues: i };
871
904
  }
872
- const A = new U("refinexBlockId");
873
- function mt(e = {}) {
874
- return new K({
875
- key: A,
905
+ const y = new K("refinexBlockId");
906
+ function pt(e = {}) {
907
+ return new j({
908
+ key: y,
876
909
  appendTransaction(t, r, a) {
877
- if (t.some((n) => n.getMeta(A)) || !t.some((n) => n.docChanged)) return null;
878
- const l = e.createId ?? T, i = /* @__PURE__ */ new Set(), o = [];
879
- if (a.doc.descendants((n, m) => {
880
- if (!R(n.type)) return !0;
910
+ if (t.some((n) => n.getMeta(y)) || !t.some((n) => n.docChanged)) return null;
911
+ const l = e.createId ?? R, i = /* @__PURE__ */ new Set(), o = [];
912
+ if (a.doc.descendants((n, f) => {
913
+ if (!L(n.type)) return !0;
881
914
  const s = n.attrs.blockId;
882
- return typeof s != "string" || !L(s) || i.has(s) ? (o.push({ pos: m, attrs: { ...n.attrs, blockId: l() } }), !0) : (i.add(s), !0);
915
+ return typeof s != "string" || !V(s) || i.has(s) ? (o.push({ pos: f, attrs: { ...n.attrs, blockId: l() } }), !0) : (i.add(s), !0);
883
916
  }), o.length === 0) return null;
884
917
  const c = a.tr;
885
918
  for (const n of o)
886
919
  c.setNodeMarkup(n.pos, void 0, n.attrs);
887
- return c.setMeta(A, !0), c;
920
+ return c.setMeta(y, !0), c;
888
921
  }
889
922
  });
890
923
  }
891
- function Y(e, t = {}) {
924
+ function rt(e, t = {}) {
892
925
  var a, l, i, o, c;
893
- const r = e instanceof F ? e.toJSON() : e;
926
+ const r = e instanceof U ? e.toJSON() : e;
894
927
  return {
895
- refinexDocVersion: C,
928
+ refinexDocVersion: B,
896
929
  schema: {
897
- id: W,
898
- version: ((a = t.schema) == null ? void 0 : a.version) ?? B,
930
+ id: Z,
931
+ version: ((a = t.schema) == null ? void 0 : a.version) ?? T,
899
932
  extensions: ((l = t.schema) == null ? void 0 : l.extensions) ?? []
900
933
  },
901
934
  metadata: t.metadata ?? {},
@@ -908,17 +941,17 @@ function Y(e, t = {}) {
908
941
  content: r
909
942
  };
910
943
  }
911
- function ft(e, t) {
944
+ function kt(e, t) {
912
945
  const r = [];
913
- if (!y(e))
946
+ if (!A(e))
914
947
  return {
915
948
  ok: !1,
916
- issues: [d("CONTENT_INVALID", "error", "$", "RefinexDoc must be an object.")]
949
+ issues: [u("CONTENT_INVALID", "error", "$", "RefinexDoc must be an object.")]
917
950
  };
918
951
  const a = e;
919
- if (a.refinexDocVersion !== C && r.push(d("DOC_VERSION_UNSUPPORTED", "error", "$.refinexDocVersion", "Unsupported RefinexDoc version.")), (!y(a.schema) || a.schema.version !== B) && r.push(d("SCHEMA_VERSION_UNSUPPORTED", "error", "$.schema.version", "Unsupported schema version.")), (!y(a.content) || a.content.type !== "doc") && r.push(d("CONTENT_INVALID", "error", "$.content", "Content must be a ProseMirror doc JSON object.")), r.some((s) => s.severity === "error"))
952
+ if (a.refinexDocVersion !== B && r.push(u("DOC_VERSION_UNSUPPORTED", "error", "$.refinexDocVersion", "Unsupported RefinexDoc version.")), (!A(a.schema) || a.schema.version !== T) && r.push(u("SCHEMA_VERSION_UNSUPPORTED", "error", "$.schema.version", "Unsupported schema version.")), (!A(a.content) || a.content.type !== "doc") && r.push(u("CONTENT_INVALID", "error", "$.content", "Content must be a ProseMirror doc JSON object.")), r.some((s) => s.severity === "error"))
920
953
  return { ok: !1, issues: r };
921
- const l = q({ extensions: t.extensions }), i = rt(a, t.extensions ?? []);
954
+ const l = q({ extensions: t.extensions }), i = nt(a, t.extensions ?? []);
922
955
  r.push(...i);
923
956
  const o = P(a.content, l, "$.content", t.mode);
924
957
  if (r.push(...o.issues), t.mode === "strict" && r.some((s) => s.severity === "error"))
@@ -931,25 +964,25 @@ function ft(e, t) {
931
964
  ok: !1,
932
965
  issues: [
933
966
  ...r,
934
- d("CONTENT_INVALID", "error", "$.content", s instanceof Error ? s.message : "Invalid content.")
967
+ u("CONTENT_INVALID", "error", "$.content", s instanceof Error ? s.message : "Invalid content.")
935
968
  ]
936
969
  };
937
970
  }
938
- const n = Q(c, l, { createId: t.createId });
971
+ const n = et(c, l, { createId: t.createId });
939
972
  if (r.push(...n.issues), t.mode === "strict" && n.issues.length > 0)
940
973
  return { ok: !1, issues: r };
941
- const m = Y(n.doc, {
974
+ const f = rt(n.doc, {
942
975
  schema: a.schema,
943
976
  metadata: a.metadata,
944
977
  permissions: a.permissions
945
978
  });
946
- return t.mode === "repair" && (o.changed || n.changed) ? { ok: !0, normalized: m, issues: r } : { ok: r.every((s) => s.severity !== "error"), doc: m, issues: r };
979
+ return t.mode === "repair" && (o.changed || n.changed) ? { ok: !0, normalized: f, issues: r } : { ok: r.every((s) => s.severity !== "error"), doc: f, issues: r };
947
980
  }
948
- function tt(e) {
981
+ function at(e) {
949
982
  if (!/^[a-z][a-z0-9_]*$/.test(e))
950
983
  throw new Error(`Extension name "${e}" must use snake_case.`);
951
984
  }
952
- function et(e) {
985
+ function lt(e) {
953
986
  var r, a;
954
987
  if ((e.spec.inline === !0 || e.spec.group === "inline") && e.blockId === "required")
955
988
  throw new Error(`Inline node "${e.name}" cannot require blockId.`);
@@ -958,18 +991,18 @@ function et(e) {
958
991
  if (e.blockId === "required" && !((a = e.spec.attrs) != null && a.blockId))
959
992
  throw new Error(`Node "${e.name}" requires a blockId attr.`);
960
993
  }
961
- function L(e) {
994
+ function V(e) {
962
995
  return /^blk_[A-Za-z0-9_-]{8,36}$/.test(e);
963
996
  }
964
- function d(e, t, r, a) {
997
+ function u(e, t, r, a) {
965
998
  return { code: e, severity: t, path: r, message: a };
966
999
  }
967
- function y(e) {
1000
+ function A(e) {
968
1001
  return typeof e == "object" && e !== null && !Array.isArray(e);
969
1002
  }
970
- function rt(e, t) {
1003
+ function nt(e, t) {
971
1004
  const r = new Set(t.map((a) => a.name));
972
- return e.schema.extensions.filter((a) => !r.has(a.name)).map((a, l) => d(
1005
+ return e.schema.extensions.filter((a) => !r.has(a.name)).map((a, l) => u(
973
1006
  "EXTENSION_MISSING",
974
1007
  "error",
975
1008
  `$.schema.extensions[${l}]`,
@@ -977,11 +1010,11 @@ function rt(e, t) {
977
1010
  ));
978
1011
  }
979
1012
  function P(e, t, r, a) {
980
- var s, p;
1013
+ var s, b;
981
1014
  const l = [];
982
1015
  let i = !1;
983
1016
  if (!t.nodes[e.type])
984
- return l.push(d("NODE_UNKNOWN", a === "repair" ? "warn" : "error", r, `Unknown node "${e.type}".`)), a === "repair" ? (l.push(d("FALLBACK_APPLIED", "info", r, `Unknown node "${e.type}" converted to paragraph.`)), {
1017
+ return l.push(u("NODE_UNKNOWN", a === "repair" ? "warn" : "error", r, `Unknown node "${e.type}".`)), a === "repair" ? (l.push(u("FALLBACK_APPLIED", "info", r, `Unknown node "${e.type}" converted to paragraph.`)), {
985
1018
  node: {
986
1019
  type: "paragraph",
987
1020
  attrs: { blockId: null },
@@ -991,13 +1024,13 @@ function P(e, t, r, a) {
991
1024
  changed: !0
992
1025
  }) : { node: e, issues: l, changed: !1 };
993
1026
  const o = { ...e.attrs ?? {} };
994
- e.type === "heading" && !at(o.level) && (l.push(d("ATTR_INVALID", a === "repair" ? "warn" : "error", `${r}.attrs.level`, "Heading level must be 1-6.")), a === "repair" && (o.level = 1, i = !0));
995
- const c = (s = e.content) == null ? void 0 : s.map((f, k) => {
996
- const u = P(f, t, `${r}.content[${k}]`, a);
997
- return l.push(...u.issues), u.changed && (i = !0), u.node;
998
- }), n = (p = e.marks) == null ? void 0 : p.flatMap((f, k) => {
999
- var u;
1000
- return !t.marks[f.type] && (l.push(d("MARK_UNKNOWN", a === "repair" ? "warn" : "error", `${r}.marks[${k}]`, `Unknown mark "${f.type}".`)), a === "repair") ? (l.push(d("FALLBACK_APPLIED", "info", `${r}.marks[${k}]`, `Unknown mark "${f.type}" dropped.`)), i = !0, []) : f.type === "link" && !lt((u = f.attrs) == null ? void 0 : u.href) && (l.push(d("ATTR_INVALID", a === "repair" ? "warn" : "error", `${r}.marks[${k}].attrs.href`, "Unsafe link href.")), a === "repair") ? (i = !0, []) : [f];
1027
+ e.type === "heading" && !st(o.level) && (l.push(u("ATTR_INVALID", a === "repair" ? "warn" : "error", `${r}.attrs.level`, "Heading level must be 1-6.")), a === "repair" && (o.level = 1, i = !0));
1028
+ const c = (s = e.content) == null ? void 0 : s.map((m, k) => {
1029
+ const d = P(m, t, `${r}.content[${k}]`, a);
1030
+ return l.push(...d.issues), d.changed && (i = !0), d.node;
1031
+ }), n = (b = e.marks) == null ? void 0 : b.flatMap((m, k) => {
1032
+ var d;
1033
+ return !t.marks[m.type] && (l.push(u("MARK_UNKNOWN", a === "repair" ? "warn" : "error", `${r}.marks[${k}]`, `Unknown mark "${m.type}".`)), a === "repair") ? (l.push(u("FALLBACK_APPLIED", "info", `${r}.marks[${k}]`, `Unknown mark "${m.type}" dropped.`)), i = !0, []) : m.type === "link" && !ot((d = m.attrs) == null ? void 0 : d.href) && (l.push(u("ATTR_INVALID", a === "repair" ? "warn" : "error", `${r}.marks[${k}].attrs.href`, "Unsafe link href.")), a === "repair") ? (i = !0, []) : [m];
1001
1034
  });
1002
1035
  return { node: {
1003
1036
  ...e,
@@ -1006,10 +1039,10 @@ function P(e, t, r, a) {
1006
1039
  marks: n && n.length > 0 ? n : void 0
1007
1040
  }, issues: l, changed: i };
1008
1041
  }
1009
- function at(e) {
1042
+ function st(e) {
1010
1043
  return Number.isInteger(e) && typeof e == "number" && e >= 1 && e <= 6;
1011
1044
  }
1012
- function lt(e) {
1045
+ function ot(e) {
1013
1046
  if (typeof e != "string") return !1;
1014
1047
  try {
1015
1048
  const t = new URL(e, "https://refinex.local");
@@ -1023,24 +1056,24 @@ function w(e) {
1023
1056
  return typeof e.text == "string" ? e.text : ((t = e.content) == null ? void 0 : t.map((r) => w(r)).join("")) ?? "";
1024
1057
  }
1025
1058
  export {
1026
- C as REFINEX_DOC_VERSION,
1027
- W as REFINEX_SCHEMA_ID,
1028
- B as REFINEX_SCHEMA_VERSION,
1029
- G as baseMarks,
1030
- X as baseNodes,
1031
- T as createBlockId,
1032
- mt as createBlockIdPlugin,
1033
- Y as createRefinexDoc,
1059
+ B as REFINEX_DOC_VERSION,
1060
+ Z as REFINEX_SCHEMA_ID,
1061
+ T as REFINEX_SCHEMA_VERSION,
1062
+ Y as baseMarks,
1063
+ Q as baseNodes,
1064
+ R as createBlockId,
1065
+ pt as createBlockIdPlugin,
1066
+ rt as createRefinexDoc,
1034
1067
  q as createRefinexSchema,
1035
- J as createRichBlockSchemaExtensions,
1036
- Z as defaultSchema,
1037
- R as isBlockIdNode,
1038
- Q as normalizeDocIds,
1039
- ct as registerMarkSpec,
1040
- dt as registerNodeSpec,
1041
- it as richBlockExtensionNames,
1042
- ut as richBlockSchemaExtensions,
1043
- gt as schema,
1044
- ft as validateDoc
1068
+ W as createRichBlockSchemaExtensions,
1069
+ tt as defaultSchema,
1070
+ L as isBlockIdNode,
1071
+ et as normalizeDocIds,
1072
+ mt as registerMarkSpec,
1073
+ ft as registerNodeSpec,
1074
+ ct as richBlockExtensionNames,
1075
+ gt as richBlockSchemaExtensions,
1076
+ bt as schema,
1077
+ kt as validateDoc
1045
1078
  };
1046
1079
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../src/rich-blocks.ts","../src/index.ts"],"sourcesContent":["import { tableNodes } from 'prosemirror-tables';\nimport type { NodeSpec } from 'prosemirror-model';\n\nimport type { RefinexNodeExtension, RefinexSchemaExtension } from './index';\n\nconst richBlockAttrs = {\n blockId: { default: null },\n metadata: { default: null },\n permissions: { default: null },\n};\n\nconst richCapabilities = ['doc:read', 'doc:write'];\n\nfunction defineNode(\n name: string,\n spec: NodeSpec,\n options: {\n readonly blockId?: 'required' | 'forbidden';\n readonly fallback?: RefinexNodeExtension['fallback'];\n readonly markdown?: string;\n } = {},\n): RefinexNodeExtension {\n const blockId = options.blockId ?? 'forbidden';\n return {\n kind: 'node',\n name,\n version: '1.0.0',\n spec: { ...spec, refinexBlockId: blockId },\n blockId,\n capabilities: richCapabilities,\n fallback: options.fallback ?? 'paragraph',\n markdown: options.markdown ? { format: options.markdown } : undefined,\n };\n}\n\nexport type ImageBlockAlign = 'left' | 'center' | 'right';\nexport type ImageBlockStatus = 'empty' | 'ready' | 'uploading' | 'error';\nexport type CalloutKind = 'note' | 'tip' | 'important' | 'warning' | 'caution';\nexport type EmbedType = 'bookmark' | 'iframe' | 'oembed';\nexport type EmbedStatus = 'unresolved' | 'loading' | 'ready' | 'error';\nexport type DividerVariant = 'solid' | 'dashed' | 'dotted';\nexport type TableLayout = 'auto' | 'fixed';\nexport type MathBlockAlign = 'center' | 'left';\nexport interface ToggleItemAttrs {\n readonly collapsed: boolean;\n readonly blockId: string | null;\n readonly metadata: Record<string, unknown> | null;\n readonly permissions: Record<string, unknown> | null;\n}\n\nexport const richBlockExtensionNames = [\n 'image_block',\n 'callout',\n 'task_list',\n 'task_item',\n 'toggle_list',\n 'toggle_item',\n 'embed_block',\n 'divider',\n 'table',\n 'table_row',\n 'table_cell',\n 'table_header',\n 'math_inline',\n 'math_block',\n] as const;\n\nexport type RichBlockExtensionName = (typeof richBlockExtensionNames)[number];\n\nexport function createRichBlockSchemaExtensions(): RefinexSchemaExtension[] {\n const specs = tableNodes({\n tableGroup: 'block',\n cellContent: 'block+',\n cellAttributes: {\n align: {\n default: null,\n getFromDOM(dom) {\n const align = dom.getAttribute('data-align') ?? dom.style.textAlign;\n return align === 'left' || align === 'center' || align === 'right' ? align : null;\n },\n setDOMAttr(value, attrs) {\n if (value) {\n attrs['data-align'] = value as string;\n attrs.style = `${String(attrs.style ?? '')} text-align: ${String(value)};`.trim();\n }\n },\n },\n background: {\n default: null,\n getFromDOM(dom) {\n return dom.getAttribute('data-background') ?? dom.style.backgroundColor ?? null;\n },\n setDOMAttr(value, attrs) {\n if (value) {\n attrs['data-background'] = value as string;\n attrs.style = `${String(attrs.style ?? '')} background-color: ${String(value)};`.trim();\n }\n },\n },\n metadata: {\n default: null,\n getFromDOM() {\n return null;\n },\n setDOMAttr() {\n return undefined;\n },\n },\n colwidth: {\n default: null,\n getFromDOM(dom) {\n const value = dom.getAttribute('data-colwidth');\n const width = value ? Number.parseInt(value, 10) : Number.NaN;\n return Number.isFinite(width) && width > 0 ? [width] : null;\n },\n setDOMAttr(value, attrs) {\n if (!Array.isArray(value)) return;\n const width = Number(value[0]);\n if (!Number.isFinite(width) || width <= 0) return;\n attrs['data-colwidth'] = String(width);\n attrs.style =\n `${String(attrs.style ?? '')} width: ${String(width)}px; min-width: ${String(width)}px;`.trim();\n },\n },\n },\n }) as Record<'table' | 'table_row' | 'table_cell' | 'table_header', NodeSpec>;\n\n return [\n defineNode(\n 'image_block',\n {\n group: 'block',\n content: 'inline*',\n attrs: {\n src: {},\n alt: { default: null },\n title: { default: null },\n align: { default: 'center' satisfies ImageBlockAlign },\n widthPercent: { default: 100 },\n aspectRatio: { default: null },\n status: { default: 'ready' satisfies ImageBlockStatus },\n ...richBlockAttrs,\n },\n selectable: true,\n draggable: true,\n defining: true,\n isolating: true,\n parseDOM: [\n {\n tag: 'figure[data-rmd-image-block]',\n getAttrs(dom) {\n const el = dom as HTMLElement;\n const image = el.querySelector('img');\n return {\n src: image?.getAttribute('src') ?? '',\n alt: image?.getAttribute('alt'),\n title: image?.getAttribute('title'),\n align: normalizeAlign(el.getAttribute('data-align')),\n widthPercent: normalizePercent(el.getAttribute('data-width')),\n aspectRatio: el.getAttribute('data-aspect-ratio'),\n status: normalizeImageStatus(el.getAttribute('data-status')),\n };\n },\n },\n ],\n toDOM(node) {\n const width = normalizePercent(node.attrs.widthPercent);\n return [\n 'figure',\n {\n 'data-rmd-image-block': 'true',\n 'data-align': normalizeAlign(node.attrs.align),\n 'data-width': String(width),\n 'data-status': normalizeImageStatus(node.attrs.status),\n class: 'rmd-image-block',\n },\n [\n 'img',\n {\n src: node.attrs.src as string,\n alt: (node.attrs.alt as string | null) ?? '',\n title: node.attrs.title as string | null,\n style: `width: ${String(width)}%;`,\n },\n ],\n ['figcaption', 0],\n ];\n },\n },\n { blockId: 'required', fallback: 'paragraph', markdown: 'rich-image-block' },\n ),\n\n defineNode(\n 'callout',\n {\n group: 'block',\n content: 'block+',\n attrs: {\n kind: { default: 'note' satisfies CalloutKind },\n title: { default: null },\n icon: { default: null },\n collapsed: { default: false },\n ...richBlockAttrs,\n },\n selectable: true,\n draggable: true,\n defining: true,\n parseDOM: [\n {\n tag: 'aside[data-rmd-callout]',\n getAttrs(dom) {\n const el = dom as HTMLElement;\n return {\n kind: normalizeCalloutKind(el.getAttribute('data-kind')),\n title: el.getAttribute('data-title'),\n icon: el.getAttribute('data-icon'),\n collapsed: el.getAttribute('data-collapsed') === 'true',\n };\n },\n },\n ],\n toDOM(node) {\n return [\n 'aside',\n {\n 'data-rmd-callout': 'true',\n 'data-kind': normalizeCalloutKind(node.attrs.kind),\n 'data-title': node.attrs.title as string | null,\n 'data-icon': node.attrs.icon as string | null,\n 'data-collapsed': String(Boolean(node.attrs.collapsed)),\n class: `rmd-callout rmd-callout-${normalizeCalloutKind(node.attrs.kind)}`,\n },\n 0,\n ];\n },\n },\n { blockId: 'required', fallback: 'paragraph', markdown: 'gfm-alert' },\n ),\n\n defineNode(\n 'task_list',\n {\n group: 'block',\n content: 'task_item+',\n attrs: { metadata: { default: null } },\n parseDOM: [{ tag: 'ul[data-rmd-task-list]' }],\n toDOM() {\n return ['ul', { 'data-rmd-task-list': 'true', class: 'rmd-task-list' }, 0];\n },\n },\n { fallback: 'paragraph', markdown: 'gfm-task-list' },\n ),\n\n defineNode(\n 'task_item',\n {\n content: 'paragraph block*',\n attrs: {\n checked: { default: false },\n ...richBlockAttrs,\n },\n defining: true,\n parseDOM: [\n {\n tag: 'li[data-rmd-task-item]',\n getAttrs(dom) {\n return { checked: (dom as HTMLElement).getAttribute('data-checked') === 'true' };\n },\n },\n ],\n toDOM(node) {\n return [\n 'li',\n {\n 'data-rmd-task-item': 'true',\n 'data-checked': String(Boolean(node.attrs.checked)),\n class: 'rmd-task-item',\n },\n 0,\n ];\n },\n },\n { blockId: 'required', fallback: 'paragraph', markdown: 'gfm-task-list' },\n ),\n\n defineNode(\n 'toggle_list',\n {\n group: 'block',\n content: 'toggle_item+',\n attrs: { metadata: { default: null } },\n parseDOM: [{ tag: 'ul[data-rmd-toggle-list]' }],\n toDOM() {\n return ['ul', { 'data-rmd-toggle-list': 'true', class: 'rmd-toggle-list' }, 0];\n },\n },\n { fallback: 'paragraph', markdown: 'refinex-toggle-list' },\n ),\n\n defineNode(\n 'toggle_item',\n {\n content: 'paragraph block*',\n attrs: {\n collapsed: { default: false },\n ...richBlockAttrs,\n },\n selectable: true,\n draggable: true,\n defining: true,\n parseDOM: [\n {\n tag: 'li[data-rmd-toggle-item]',\n getAttrs(dom) {\n return {\n collapsed: normalizeToggleCollapsed(\n (dom as HTMLElement).getAttribute('data-collapsed'),\n ),\n };\n },\n },\n ],\n toDOM(node) {\n const collapsed = normalizeToggleCollapsed(node.attrs.collapsed);\n return [\n 'li',\n {\n 'data-rmd-toggle-item': 'true',\n 'data-collapsed': String(collapsed),\n class: 'rmd-toggle-item',\n },\n 0,\n ];\n },\n },\n { blockId: 'required', fallback: 'paragraph', markdown: 'refinex-toggle-list' },\n ),\n\n defineNode(\n 'embed_block',\n {\n group: 'block',\n atom: true,\n isolating: true,\n selectable: true,\n draggable: true,\n attrs: {\n url: {},\n provider: { default: null },\n embedType: { default: 'bookmark' satisfies EmbedType },\n title: { default: null },\n description: { default: null },\n thumbnail: { default: null },\n html: { default: null },\n aspectRatio: { default: null },\n status: { default: 'unresolved' satisfies EmbedStatus },\n error: { default: null },\n ...richBlockAttrs,\n },\n parseDOM: [\n {\n tag: 'a[data-rmd-embed-block]',\n getAttrs(dom) {\n const el = dom as HTMLElement;\n return {\n url: el.getAttribute('href') ?? '',\n title: el.getAttribute('data-title') ?? el.textContent,\n provider: el.getAttribute('data-provider'),\n embedType: normalizeEmbedType(el.getAttribute('data-embed-type')),\n status: normalizeEmbedStatus(el.getAttribute('data-status')),\n };\n },\n },\n ],\n toDOM(node) {\n return [\n 'a',\n {\n 'data-rmd-embed-block': 'true',\n href: node.attrs.url as string,\n 'data-provider': node.attrs.provider as string | null,\n 'data-embed-type': normalizeEmbedType(node.attrs.embedType),\n 'data-status': normalizeEmbedStatus(node.attrs.status),\n class: 'rmd-embed-block',\n },\n (node.attrs.title as string | null) ?? (node.attrs.url as string),\n ];\n },\n },\n { blockId: 'required', fallback: 'paragraph', markdown: 'refinex-block' },\n ),\n\n defineNode(\n 'divider',\n {\n group: 'block',\n attrs: {\n variant: { default: 'solid' satisfies DividerVariant },\n ...richBlockAttrs,\n },\n selectable: true,\n draggable: true,\n parseDOM: [\n {\n tag: 'hr[data-rmd-divider]',\n getAttrs(dom) {\n return {\n variant: normalizeDividerVariant((dom as HTMLElement).getAttribute('data-variant')),\n };\n },\n },\n ],\n toDOM(node) {\n return [\n 'hr',\n {\n 'data-rmd-divider': 'true',\n 'data-variant': normalizeDividerVariant(node.attrs.variant),\n class: `rmd-divider rmd-divider-${normalizeDividerVariant(node.attrs.variant)}`,\n },\n ];\n },\n },\n { blockId: 'required', fallback: 'paragraph', markdown: 'thematic-break' },\n ),\n\n defineNode(\n 'table',\n {\n ...specs.table,\n attrs: {\n ...(specs.table.attrs ?? {}),\n columnWidths: { default: null },\n layout: { default: 'auto' satisfies TableLayout },\n caption: { default: null },\n ...richBlockAttrs,\n },\n isolating: true,\n selectable: true,\n draggable: true,\n },\n { blockId: 'required', fallback: 'code_block', markdown: 'gfm-table' },\n ),\n defineNode('table_row', specs.table_row, { fallback: 'drop', markdown: 'gfm-table' }),\n defineNode('table_cell', specs.table_cell, { fallback: 'paragraph', markdown: 'gfm-table' }),\n defineNode('table_header', specs.table_header, {\n fallback: 'paragraph',\n markdown: 'gfm-table',\n }),\n\n defineNode(\n 'math_inline',\n {\n inline: true,\n group: 'inline',\n atom: true,\n selectable: true,\n attrs: {\n tex: {},\n metadata: { default: null },\n },\n parseDOM: [\n {\n tag: 'span[data-rmd-math-inline]',\n getAttrs(dom) {\n return { tex: (dom as HTMLElement).getAttribute('data-tex') ?? '' };\n },\n },\n ],\n toDOM(node) {\n return [\n 'span',\n {\n 'data-rmd-math-inline': 'true',\n 'data-tex': node.attrs.tex as string,\n class: 'rmd-math-inline',\n },\n node.attrs.tex as string,\n ];\n },\n },\n { fallback: 'paragraph', markdown: 'remark-math' },\n ),\n\n defineNode(\n 'math_block',\n {\n group: 'block',\n atom: true,\n isolating: true,\n selectable: true,\n draggable: true,\n attrs: {\n tex: {},\n numbered: { default: false },\n label: { default: null },\n align: { default: 'center' satisfies MathBlockAlign },\n ...richBlockAttrs,\n },\n parseDOM: [\n {\n tag: 'div[data-rmd-math-block]',\n getAttrs(dom) {\n const el = dom as HTMLElement;\n return {\n tex: el.getAttribute('data-tex') ?? el.textContent ?? '',\n numbered: el.getAttribute('data-numbered') === 'true',\n label: el.getAttribute('data-label'),\n align: el.getAttribute('data-align') === 'left' ? 'left' : 'center',\n };\n },\n },\n ],\n toDOM(node) {\n return [\n 'div',\n {\n 'data-rmd-math-block': 'true',\n 'data-tex': node.attrs.tex as string,\n 'data-numbered': String(Boolean(node.attrs.numbered)),\n 'data-label': node.attrs.label as string | null,\n 'data-align': node.attrs.align === 'left' ? 'left' : 'center',\n class: 'rmd-math-block',\n },\n node.attrs.tex as string,\n ];\n },\n },\n { blockId: 'required', fallback: 'code_block', markdown: 'remark-math' },\n ),\n ];\n}\n\nexport const richBlockSchemaExtensions = createRichBlockSchemaExtensions();\n\nfunction normalizeAlign(value: unknown): ImageBlockAlign {\n return value === 'left' || value === 'right' ? value : 'center';\n}\n\nfunction normalizePercent(value: unknown): number {\n const numeric = Number(value ?? 100);\n if (!Number.isFinite(numeric)) return 100;\n return Math.max(10, Math.min(100, Math.round(numeric)));\n}\n\nfunction normalizeImageStatus(value: unknown): ImageBlockStatus {\n return value === 'empty' || value === 'uploading' || value === 'error' ? value : 'ready';\n}\n\nfunction normalizeCalloutKind(value: unknown): CalloutKind {\n if (value === 'tip' || value === 'important' || value === 'warning' || value === 'caution')\n return value;\n if (value === 'error') return 'caution';\n return 'note';\n}\n\nfunction normalizeEmbedType(value: unknown): EmbedType {\n return value === 'iframe' || value === 'oembed' ? value : 'bookmark';\n}\n\nfunction normalizeEmbedStatus(value: unknown): EmbedStatus {\n return value === 'loading' || value === 'ready' || value === 'error' ? value : 'unresolved';\n}\n\nfunction normalizeDividerVariant(value: unknown): DividerVariant {\n return value === 'dashed' || value === 'dotted' ? value : 'solid';\n}\n\nfunction normalizeToggleCollapsed(value: unknown): boolean {\n return value === true || value === 'true';\n}\n","import { Fragment, Node as ProseMirrorNode, Schema } from 'prosemirror-model'\nimport type { MarkSpec, NodeSpec, NodeType } from 'prosemirror-model'\nimport { Plugin, PluginKey } from 'prosemirror-state'\n\nexport const REFINEX_DOC_VERSION = '1.0.0'\nexport const REFINEX_SCHEMA_ID = '@refinex-md/base'\nexport const REFINEX_SCHEMA_VERSION = '1.0.0'\n\nexport type BlockIdMode = 'required' | 'forbidden' | 'optional'\nexport type RefinexCapabilityToken = 'doc:read' | 'doc:write' | 'network:none' | string\nexport type RefinexSchemaPlacement = 'append' | 'prepend'\nexport type RefinexNodeFallback = 'unwrap' | 'paragraph' | 'code_block' | 'drop'\nexport type RefinexMarkFallback = 'drop' | 'code' | 'link'\n\nexport interface RefinexMarkdownDeclaration {\n readonly format: string\n}\n\nexport interface RefinexMigrationDeclaration {\n readonly from: string\n readonly to: string\n}\n\ntype RefinexNodeSpec = NodeSpec & { refinexBlockId?: BlockIdMode }\n\nexport interface RefinexNodeExtension {\n readonly kind: 'node'\n readonly name: string\n readonly version: string\n readonly spec: RefinexNodeSpec\n readonly placement?: RefinexSchemaPlacement\n readonly blockId?: BlockIdMode\n readonly capabilities: RefinexCapabilityToken[]\n readonly fallback: RefinexNodeFallback\n readonly markdown?: RefinexMarkdownDeclaration\n readonly migration?: RefinexMigrationDeclaration\n}\n\nexport interface RefinexMarkExtension {\n readonly kind: 'mark'\n readonly name: string\n readonly version: string\n readonly spec: MarkSpec\n readonly placement?: RefinexSchemaPlacement\n readonly capabilities: RefinexCapabilityToken[]\n readonly fallback: RefinexMarkFallback\n readonly markdown?: RefinexMarkdownDeclaration\n readonly migration?: RefinexMigrationDeclaration\n}\n\nexport type RefinexSchemaExtension = RefinexNodeExtension | RefinexMarkExtension\n\nexport interface CreateRefinexSchemaOptions {\n readonly extensions?: readonly RefinexSchemaExtension[]\n}\n\nexport interface RegisterNodeSpecOptions {\n readonly version?: string\n readonly placement?: RefinexSchemaPlacement\n readonly blockId?: BlockIdMode\n readonly capabilities?: readonly RefinexCapabilityToken[]\n readonly fallback?: RefinexNodeFallback\n readonly markdown?: RefinexMarkdownDeclaration\n readonly migration?: RefinexMigrationDeclaration\n}\n\nexport interface RegisterMarkSpecOptions {\n readonly version?: string\n readonly placement?: RefinexSchemaPlacement\n readonly capabilities?: readonly RefinexCapabilityToken[]\n readonly fallback?: RefinexMarkFallback\n readonly markdown?: RefinexMarkdownDeclaration\n readonly migration?: RefinexMigrationDeclaration\n}\n\nexport interface ProseMirrorMarkJSON {\n readonly type: string\n readonly attrs?: Record<string, unknown>\n}\n\nexport interface ProseMirrorNodeJSON {\n readonly type: string\n readonly attrs?: Record<string, unknown>\n readonly content?: ProseMirrorNodeJSON[]\n readonly text?: string\n readonly marks?: ProseMirrorMarkJSON[]\n}\n\nexport type ProseMirrorDocJSON = ProseMirrorNodeJSON & { readonly type: 'doc' }\n\nexport interface RefinexExtensionRef {\n readonly name: string\n readonly version: string\n}\n\nexport interface RefinexSchemaRef {\n readonly id: typeof REFINEX_SCHEMA_ID\n readonly version: string\n readonly extensions: RefinexExtensionRef[]\n}\n\nexport interface RefinexBlockPermission {\n readonly access: 'read-write' | 'read-only' | 'comment-only' | 'locked'\n readonly reason?: string\n}\n\nexport interface RefinexDocMetadata {\n readonly docId?: string\n readonly title?: string\n readonly createdAt?: string\n readonly updatedAt?: string\n readonly createdBy?: string\n readonly updatedBy?: string\n readonly source?: 'api' | 'markdown-import' | 'html-import' | 'collab' | 'unknown'\n readonly custom?: Record<string, unknown>\n}\n\nexport interface RefinexDocPermissions {\n readonly policyVersion: '1.0'\n readonly defaultAccess: 'read-write' | 'read-only' | 'comment-only' | 'locked'\n readonly blockOverrides?: Record<string, RefinexBlockPermission>\n readonly custom?: Record<string, unknown>\n}\n\nexport interface RefinexDoc {\n readonly refinexDocVersion: string\n readonly schema: RefinexSchemaRef\n readonly metadata: RefinexDocMetadata\n readonly permissions: RefinexDocPermissions\n readonly content: ProseMirrorDocJSON\n}\n\nexport type RefinexIssueCode =\n | 'DOC_VERSION_UNSUPPORTED'\n | 'SCHEMA_VERSION_UNSUPPORTED'\n | 'EXTENSION_MISSING'\n | 'NODE_UNKNOWN'\n | 'MARK_UNKNOWN'\n | 'CONTENT_INVALID'\n | 'ATTR_INVALID'\n | 'BLOCK_ID_MISSING'\n | 'BLOCK_ID_INVALID'\n | 'BLOCK_ID_DUPLICATE'\n | 'BLOCK_ID_FORBIDDEN'\n | 'FALLBACK_APPLIED'\n\nexport type RefinexIssueSeverity = 'error' | 'warn' | 'info'\n\nexport interface RefinexDocIssue {\n readonly code: RefinexIssueCode\n readonly severity: RefinexIssueSeverity\n readonly path: string\n readonly message: string\n}\n\nexport interface NormalizeDocIdsOptions {\n readonly createId?: () => string\n}\n\nexport interface NormalizeDocIdsResult {\n readonly doc: ProseMirrorNode\n readonly changed: boolean\n readonly issues: RefinexDocIssue[]\n}\n\nexport interface CreateRefinexDocOptions {\n readonly schema?: Partial<RefinexSchemaRef>\n readonly metadata?: RefinexDocMetadata\n readonly permissions?: Partial<RefinexDocPermissions>\n}\n\nexport interface ValidateDocOptions extends NormalizeDocIdsOptions {\n readonly mode: 'strict' | 'repair'\n readonly extensions?: readonly RefinexSchemaExtension[]\n readonly allowUnknownExtensions?: boolean\n readonly preserveTrustedBlockIds?: boolean\n}\n\nexport interface ValidateDocResult {\n readonly ok: boolean\n readonly doc?: RefinexDoc\n readonly normalized?: RefinexDoc\n readonly issues: RefinexDocIssue[]\n}\n\nconst blockAttrs = {\n blockId: { default: null },\n metadata: { default: null },\n permissions: { default: null },\n}\n\nconst baseBlockIdNodeNames = new Set([\n 'paragraph',\n 'heading',\n 'blockquote',\n 'list_item',\n 'code_block',\n 'horizontal_rule',\n])\n\nexport const baseNodes: Record<string, RefinexNodeSpec> = {\n doc: { content: 'block+' },\n\n paragraph: {\n attrs: blockAttrs,\n content: 'inline*',\n group: 'block',\n refinexBlockId: 'required',\n parseDOM: [{ tag: 'p' }],\n toDOM() {\n return ['p', 0]\n },\n },\n\n heading: {\n attrs: { level: { default: 1 }, ...blockAttrs },\n content: 'inline*',\n group: 'block',\n defining: true,\n refinexBlockId: 'required',\n parseDOM: [\n { tag: 'h1', attrs: { level: 1 } },\n { tag: 'h2', attrs: { level: 2 } },\n { tag: 'h3', attrs: { level: 3 } },\n { tag: 'h4', attrs: { level: 4 } },\n { tag: 'h5', attrs: { level: 5 } },\n { tag: 'h6', attrs: { level: 6 } },\n ],\n toDOM(node) {\n return [`h${String(node.attrs.level)}`, 0]\n },\n },\n\n blockquote: {\n attrs: blockAttrs,\n content: 'block+',\n group: 'block',\n defining: true,\n refinexBlockId: 'required',\n parseDOM: [{ tag: 'blockquote' }],\n toDOM() {\n return ['blockquote', 0]\n },\n },\n\n bullet_list: {\n attrs: { metadata: { default: null } },\n content: 'list_item+',\n group: 'block',\n parseDOM: [{ tag: 'ul' }],\n toDOM() {\n return ['ul', 0]\n },\n },\n\n ordered_list: {\n attrs: { order: { default: 1 }, metadata: { default: null } },\n content: 'list_item+',\n group: 'block',\n parseDOM: [{\n tag: 'ol',\n getAttrs(dom) {\n const el = dom as HTMLElement\n return { order: el.hasAttribute('start') ? Number(el.getAttribute('start')) : 1 }\n },\n }],\n toDOM(node) {\n return node.attrs.order === 1 ? ['ol', 0] : ['ol', { start: node.attrs.order as number }, 0]\n },\n },\n\n list_item: {\n attrs: blockAttrs,\n content: 'paragraph block*',\n defining: true,\n refinexBlockId: 'required',\n parseDOM: [{ tag: 'li' }],\n toDOM() {\n return ['li', 0]\n },\n },\n\n code_block: {\n attrs: {\n language: { default: null },\n lineNumbers: { default: false },\n startLine: { default: 1 },\n highlightLines: { default: null },\n displayMode: { default: 'source' },\n wrap: { default: false },\n ...blockAttrs,\n },\n content: 'text*',\n marks: '',\n group: 'block',\n code: true,\n defining: true,\n refinexBlockId: 'required',\n parseDOM: [{ tag: 'pre', preserveWhitespace: 'full' }],\n toDOM() {\n return ['pre', ['code', 0]]\n },\n },\n\n horizontal_rule: {\n attrs: blockAttrs,\n group: 'block',\n refinexBlockId: 'required',\n parseDOM: [{ tag: 'hr' }],\n toDOM() {\n return ['hr']\n },\n },\n\n image: {\n attrs: {\n src: {},\n alt: { default: null },\n title: { default: null },\n metadata: { default: null },\n permissions: { default: null },\n },\n inline: true,\n group: 'inline',\n draggable: true,\n parseDOM: [{\n tag: 'img[src]',\n getAttrs(dom) {\n const el = dom as HTMLElement\n return {\n src: el.getAttribute('src'),\n alt: el.getAttribute('alt'),\n title: el.getAttribute('title'),\n }\n },\n }],\n toDOM(node) {\n return ['img', node.attrs]\n },\n },\n\n upload_placeholder: {\n attrs: {\n uploadId: {},\n fileName: { default: null },\n mimeType: { default: null },\n previewSrc: { default: null },\n progress: { default: 0 },\n status: { default: 'uploading' },\n error: { default: null },\n },\n inline: true,\n group: 'inline',\n atom: true,\n selectable: true,\n parseDOM: [{\n tag: 'span[data-rmd-upload-placeholder]',\n getAttrs(dom) {\n const el = dom as HTMLElement\n return {\n uploadId: el.getAttribute('data-upload-id'),\n fileName: el.getAttribute('data-file-name'),\n mimeType: el.getAttribute('data-mime-type'),\n previewSrc: el.getAttribute('data-preview-src'),\n progress: Number(el.getAttribute('data-progress') ?? '0'),\n status: el.getAttribute('data-status') ?? 'uploading',\n error: el.getAttribute('data-error'),\n }\n },\n }],\n toDOM(node) {\n const attrs = node.attrs\n const progress = Math.max(0, Math.min(100, Number(attrs.progress ?? 0)))\n const previewSrc = typeof attrs.previewSrc === 'string' && attrs.previewSrc ? attrs.previewSrc : null\n const fileName = typeof attrs.fileName === 'string' && attrs.fileName ? attrs.fileName : '文件'\n const status = typeof attrs.status === 'string' ? attrs.status : 'uploading'\n const error = typeof attrs.error === 'string' && attrs.error ? attrs.error : '上传失败'\n return [\n 'span',\n {\n 'data-rmd-upload-placeholder': 'true',\n 'data-upload-id': attrs.uploadId as string,\n 'data-file-name': fileName,\n 'data-mime-type': attrs.mimeType as string | null,\n 'data-preview-src': previewSrc,\n 'data-progress': String(progress),\n 'data-status': status,\n 'data-error': status === 'error' ? error : null,\n class: 'rmd-upload-placeholder',\n },\n ['span', { class: 'rmd-upload-preview' }, previewSrc ? ['img', { src: previewSrc, alt: fileName }] : ''],\n ['span', { class: 'rmd-upload-body' },\n ['span', { class: 'rmd-upload-name' }, fileName],\n ['span', { class: 'rmd-upload-progress', role: 'progressbar', 'aria-valuemin': '0', 'aria-valuemax': '100', 'aria-valuenow': String(progress) },\n ['span', { class: 'rmd-upload-progress-fill', style: `width: ${String(progress)}%;` }],\n ],\n ['span', { class: 'rmd-upload-error' }, error],\n ],\n ['button', { type: 'button', 'data-upload-action': 'retry', class: 'rmd-upload-action' }, '重试'],\n ['button', { type: 'button', 'data-upload-action': 'remove', class: 'rmd-upload-action' }, '移除'],\n ]\n },\n },\n\n hard_break: {\n inline: true,\n group: 'inline',\n selectable: false,\n parseDOM: [{ tag: 'br' }],\n toDOM() {\n return ['br']\n },\n },\n\n text: {\n group: 'inline',\n },\n}\n\nexport const baseMarks: Record<string, MarkSpec> = {\n bold: {\n parseDOM: [{ tag: 'strong' }, { tag: 'b' }, { style: 'font-weight=bold' }],\n toDOM() {\n return ['strong', 0]\n },\n },\n\n italic: {\n parseDOM: [{ tag: 'em' }, { tag: 'i' }, { style: 'font-style=italic' }],\n toDOM() {\n return ['em', 0]\n },\n },\n\n code: {\n parseDOM: [{ tag: 'code' }],\n toDOM() {\n return ['code', 0]\n },\n },\n\n link: {\n attrs: {\n href: {},\n title: { default: null },\n target: { default: null },\n rel: { default: 'noopener noreferrer' },\n },\n inclusive: false,\n parseDOM: [{\n tag: 'a[href]',\n getAttrs(dom) {\n const el = dom as HTMLElement\n return {\n href: el.getAttribute('href'),\n title: el.getAttribute('title'),\n target: el.getAttribute('target'),\n rel: el.getAttribute('rel') || 'noopener noreferrer',\n }\n },\n }],\n toDOM(mark) {\n return ['a', mark.attrs, 0]\n },\n },\n\n strikethrough: {\n parseDOM: [{ tag: 's' }, { tag: 'del' }],\n toDOM() {\n return ['s', 0]\n },\n },\n\n underline: {\n parseDOM: [{ tag: 'u' }, { style: 'text-decoration=underline' }],\n toDOM() {\n return ['u', 0]\n },\n },\n\n text_color: {\n attrs: {\n color: { default: null },\n },\n parseDOM: [{\n style: 'color',\n getAttrs(value) {\n if (typeof value !== 'string' || !value.trim()) return false\n return { color: value.trim() }\n },\n }],\n toDOM(mark) {\n const color = mark.attrs.color\n if (typeof color !== 'string' || !color.trim()) return ['span', 0]\n return ['span', { style: `color: ${color}` }, 0]\n },\n },\n\n text_background_color: {\n attrs: {\n backgroundColor: { default: null },\n },\n parseDOM: [{\n style: 'background-color',\n getAttrs(value) {\n if (typeof value !== 'string' || !value.trim()) return false\n return { backgroundColor: value.trim() }\n },\n }],\n toDOM(mark) {\n const backgroundColor = mark.attrs.backgroundColor\n if (typeof backgroundColor !== 'string' || !backgroundColor.trim()) return ['span', 0]\n return ['span', { style: `background-color: ${backgroundColor}` }, 0]\n },\n },\n}\n\nexport function registerNodeSpec(\n name: string,\n spec: NodeSpec,\n options: RegisterNodeSpecOptions = {},\n): RefinexNodeExtension {\n return {\n kind: 'node',\n name,\n version: options.version ?? '1.0.0',\n spec: { ...spec, refinexBlockId: options.blockId },\n placement: options.placement,\n blockId: options.blockId ?? 'forbidden',\n capabilities: [...(options.capabilities ?? [])],\n fallback: options.fallback ?? 'paragraph',\n markdown: options.markdown,\n migration: options.migration,\n }\n}\n\nexport function registerMarkSpec(\n name: string,\n spec: MarkSpec,\n options: RegisterMarkSpecOptions = {},\n): RefinexMarkExtension {\n return {\n kind: 'mark',\n name,\n version: options.version ?? '1.0.0',\n spec,\n placement: options.placement,\n capabilities: [...(options.capabilities ?? [])],\n fallback: options.fallback ?? 'drop',\n markdown: options.markdown,\n migration: options.migration,\n }\n}\n\nexport function createRefinexSchema(options: CreateRefinexSchemaOptions = {}): Schema {\n const nodes: Record<string, RefinexNodeSpec> = { ...baseNodes }\n const marks: Record<string, MarkSpec> = { ...baseMarks }\n const names = new Set([...Object.keys(nodes), ...Object.keys(marks)])\n\n for (const extension of options.extensions ?? []) {\n assertExtensionName(extension.name)\n if (names.has(extension.name)) {\n throw new Error(`Extension name \"${extension.name}\" is reserved or already registered.`)\n }\n names.add(extension.name)\n\n if (extension.kind === 'node') {\n validateNodeExtension(extension)\n nodes[extension.name] = { ...extension.spec, refinexBlockId: extension.blockId }\n } else {\n marks[extension.name] = extension.spec\n }\n }\n\n return new Schema({ nodes, marks })\n}\n\nexport const defaultSchema = createRefinexSchema()\nexport const schema = defaultSchema\n\nexport function createBlockId(): string {\n const bytes = new Uint8Array(12)\n globalThis.crypto?.getRandomValues(bytes)\n const suffix = Array.from(bytes, (byte) => byte.toString(36).padStart(2, '0')).join('').slice(0, 24)\n return `blk_${suffix}`\n}\n\nexport function isBlockIdNode(node: NodeType | ProseMirrorNodeJSON): boolean {\n if ('spec' in node) {\n return (node.spec as RefinexNodeSpec).refinexBlockId === 'required' || baseBlockIdNodeNames.has(node.name)\n }\n return baseBlockIdNodeNames.has(node.type)\n}\n\nexport function normalizeDocIds(\n doc: ProseMirrorNode,\n _schema: Schema,\n options: NormalizeDocIdsOptions = {},\n): NormalizeDocIdsResult {\n const createId = options.createId ?? createBlockId\n const seen = new Set<string>()\n const issues: RefinexDocIssue[] = []\n let changed = false\n\n function normalizeNode(node: ProseMirrorNode, path: string): ProseMirrorNode {\n if (node.isText) return node\n\n let attrs = node.attrs\n if (isBlockIdNode(node.type)) {\n const blockId = attrs.blockId\n if (typeof blockId !== 'string' || blockId.length === 0) {\n attrs = { ...attrs, blockId: createId() }\n changed = true\n issues.push(issue('BLOCK_ID_MISSING', 'warn', `${path}.attrs.blockId`, 'Missing blockId was generated.'))\n } else if (!isValidBlockId(blockId)) {\n attrs = { ...attrs, blockId: createId() }\n changed = true\n issues.push(issue('BLOCK_ID_INVALID', 'warn', `${path}.attrs.blockId`, 'Invalid blockId was replaced.'))\n } else if (seen.has(blockId)) {\n attrs = { ...attrs, blockId: createId() }\n changed = true\n issues.push(issue('BLOCK_ID_DUPLICATE', 'warn', `${path}.attrs.blockId`, 'Duplicate blockId was replaced.'))\n }\n seen.add(attrs.blockId as string)\n } else if ('blockId' in attrs) {\n const { blockId: _blockId, ...rest } = attrs\n attrs = rest\n changed = true\n issues.push(issue('BLOCK_ID_FORBIDDEN', 'warn', `${path}.attrs.blockId`, 'Forbidden blockId was removed.'))\n }\n\n const children: ProseMirrorNode[] = []\n node.forEach((child, _offset, index) => {\n children.push(normalizeNode(child, `${path}.content[${index}]`))\n })\n\n const content = children.length > 0 ? Fragment.fromArray(children) : Fragment.empty\n const sameContent = children.length === node.childCount && children.every((child, index) => child.eq(node.child(index)))\n return attrs === node.attrs && sameContent ? node : node.type.create(attrs, content, node.marks)\n }\n\n return { doc: normalizeNode(doc, '$'), changed, issues }\n}\n\nconst blockIdPluginKey = new PluginKey('refinexBlockId')\n\nexport function createBlockIdPlugin(options: NormalizeDocIdsOptions = {}): Plugin {\n return new Plugin({\n key: blockIdPluginKey,\n appendTransaction(transactions, _oldState, newState) {\n if (transactions.some((transaction) => transaction.getMeta(blockIdPluginKey))) return null\n if (!transactions.some((transaction) => transaction.docChanged)) return null\n\n const createId = options.createId ?? createBlockId\n const seen = new Set<string>()\n const updates: Array<{ pos: number; attrs: Record<string, unknown> }> = []\n\n newState.doc.descendants((node, pos) => {\n if (!isBlockIdNode(node.type)) return true\n const blockId = node.attrs.blockId\n if (typeof blockId !== 'string' || !isValidBlockId(blockId) || seen.has(blockId)) {\n updates.push({ pos, attrs: { ...node.attrs, blockId: createId() } })\n return true\n }\n seen.add(blockId)\n return true\n })\n\n if (updates.length === 0) return null\n const tr = newState.tr\n for (const update of updates) {\n tr.setNodeMarkup(update.pos, undefined, update.attrs)\n }\n tr.setMeta(blockIdPluginKey, true)\n return tr\n },\n })\n}\n\nexport function createRefinexDoc(\n content: ProseMirrorNode | ProseMirrorDocJSON,\n options: CreateRefinexDocOptions = {},\n): RefinexDoc {\n const contentJSON = content instanceof ProseMirrorNode ? content.toJSON() as ProseMirrorDocJSON : content\n return {\n refinexDocVersion: REFINEX_DOC_VERSION,\n schema: {\n id: REFINEX_SCHEMA_ID,\n version: options.schema?.version ?? REFINEX_SCHEMA_VERSION,\n extensions: options.schema?.extensions ?? [],\n },\n metadata: options.metadata ?? {},\n permissions: {\n policyVersion: '1.0',\n defaultAccess: options.permissions?.defaultAccess ?? 'read-write',\n blockOverrides: options.permissions?.blockOverrides,\n custom: options.permissions?.custom,\n },\n content: contentJSON,\n }\n}\n\nexport function validateDoc(input: unknown, options: ValidateDocOptions): ValidateDocResult {\n const issues: RefinexDocIssue[] = []\n if (!isRecord(input)) {\n return {\n ok: false,\n issues: [issue('CONTENT_INVALID', 'error', '$', 'RefinexDoc must be an object.')],\n }\n }\n\n const refinexDoc = input as unknown as RefinexDoc\n if (refinexDoc.refinexDocVersion !== REFINEX_DOC_VERSION) {\n issues.push(issue('DOC_VERSION_UNSUPPORTED', 'error', '$.refinexDocVersion', 'Unsupported RefinexDoc version.'))\n }\n if (!isRecord(refinexDoc.schema) || refinexDoc.schema.version !== REFINEX_SCHEMA_VERSION) {\n issues.push(issue('SCHEMA_VERSION_UNSUPPORTED', 'error', '$.schema.version', 'Unsupported schema version.'))\n }\n if (!isRecord(refinexDoc.content) || refinexDoc.content.type !== 'doc') {\n issues.push(issue('CONTENT_INVALID', 'error', '$.content', 'Content must be a ProseMirror doc JSON object.'))\n }\n if (issues.some((entry) => entry.severity === 'error')) {\n return { ok: false, issues }\n }\n\n const schema = createRefinexSchema({ extensions: options.extensions })\n const extensionIssues = findMissingExtensions(refinexDoc, options.extensions ?? [])\n issues.push(...extensionIssues)\n\n const preflight = preflightNode(refinexDoc.content, schema, '$.content', options.mode)\n issues.push(...preflight.issues)\n if (options.mode === 'strict' && issues.some((entry) => entry.severity === 'error')) {\n return { ok: false, issues }\n }\n\n let parsed: ProseMirrorNode\n try {\n parsed = schema.nodeFromJSON(preflight.node)\n parsed.check()\n } catch (error) {\n return {\n ok: false,\n issues: [\n ...issues,\n issue('CONTENT_INVALID', 'error', '$.content', error instanceof Error ? error.message : 'Invalid content.'),\n ],\n }\n }\n\n const normalized = normalizeDocIds(parsed, schema, { createId: options.createId })\n issues.push(...normalized.issues)\n\n if (options.mode === 'strict' && normalized.issues.length > 0) {\n return { ok: false, issues }\n }\n\n const nextDoc = createRefinexDoc(normalized.doc, {\n schema: refinexDoc.schema,\n metadata: refinexDoc.metadata,\n permissions: refinexDoc.permissions,\n })\n\n return options.mode === 'repair' && (preflight.changed || normalized.changed)\n ? { ok: true, normalized: nextDoc, issues }\n : { ok: issues.every((entry) => entry.severity !== 'error'), doc: nextDoc, issues }\n}\n\nfunction assertExtensionName(name: string): void {\n if (!/^[a-z][a-z0-9_]*$/.test(name)) {\n throw new Error(`Extension name \"${name}\" must use snake_case.`)\n }\n}\n\nfunction validateNodeExtension(extension: RefinexNodeExtension): void {\n const inline = extension.spec.inline === true || extension.spec.group === 'inline'\n if (inline && extension.blockId === 'required') {\n throw new Error(`Inline node \"${extension.name}\" cannot require blockId.`)\n }\n if (extension.blockId !== 'required' && extension.spec.attrs?.blockId) {\n throw new Error(`Node \"${extension.name}\" declares blockId attr but does not require blockId.`)\n }\n if (extension.blockId === 'required' && !extension.spec.attrs?.blockId) {\n throw new Error(`Node \"${extension.name}\" requires a blockId attr.`)\n }\n}\n\nfunction isValidBlockId(value: string): boolean {\n return /^blk_[A-Za-z0-9_-]{8,36}$/.test(value)\n}\n\nfunction issue(\n code: RefinexIssueCode,\n severity: RefinexIssueSeverity,\n path: string,\n message: string,\n): RefinexDocIssue {\n return { code, severity, path, message }\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n}\n\nfunction findMissingExtensions(\n refinexDoc: RefinexDoc,\n extensions: readonly RefinexSchemaExtension[],\n): RefinexDocIssue[] {\n const registered = new Set(extensions.map((extension) => extension.name))\n return refinexDoc.schema.extensions\n .filter((extension) => !registered.has(extension.name))\n .map((extension, index) => issue(\n 'EXTENSION_MISSING',\n 'error',\n `$.schema.extensions[${index}]`,\n `Missing schema extension \"${extension.name}\".`,\n ))\n}\n\ninterface PreflightResult {\n readonly node: ProseMirrorNodeJSON\n readonly issues: RefinexDocIssue[]\n readonly changed: boolean\n}\n\nfunction preflightNode(\n node: ProseMirrorNodeJSON,\n schema: Schema,\n path: string,\n mode: 'strict' | 'repair',\n): PreflightResult {\n const issues: RefinexDocIssue[] = []\n let changed = false\n\n if (!schema.nodes[node.type]) {\n issues.push(issue('NODE_UNKNOWN', mode === 'repair' ? 'warn' : 'error', path, `Unknown node \"${node.type}\".`))\n if (mode === 'repair') {\n issues.push(issue('FALLBACK_APPLIED', 'info', path, `Unknown node \"${node.type}\" converted to paragraph.`))\n return {\n node: {\n type: 'paragraph',\n attrs: { blockId: null },\n content: textContentOf(node).length > 0 ? [{ type: 'text', text: textContentOf(node) }] : undefined,\n },\n issues,\n changed: true,\n }\n }\n return { node, issues, changed: false }\n }\n\n const attrs = { ...(node.attrs ?? {}) }\n if (node.type === 'heading' && !isValidHeadingLevel(attrs.level)) {\n issues.push(issue('ATTR_INVALID', mode === 'repair' ? 'warn' : 'error', `${path}.attrs.level`, 'Heading level must be 1-6.'))\n if (mode === 'repair') {\n attrs.level = 1\n changed = true\n }\n }\n\n const content = node.content?.map((child, index) => {\n const result = preflightNode(child, schema, `${path}.content[${index}]`, mode)\n issues.push(...result.issues)\n if (result.changed) changed = true\n return result.node\n })\n\n const marks = node.marks?.flatMap((mark, index) => {\n if (!schema.marks[mark.type]) {\n issues.push(issue('MARK_UNKNOWN', mode === 'repair' ? 'warn' : 'error', `${path}.marks[${index}]`, `Unknown mark \"${mark.type}\".`))\n if (mode === 'repair') {\n issues.push(issue('FALLBACK_APPLIED', 'info', `${path}.marks[${index}]`, `Unknown mark \"${mark.type}\" dropped.`))\n changed = true\n return []\n }\n }\n if (mark.type === 'link' && !isSafeHref(mark.attrs?.href)) {\n issues.push(issue('ATTR_INVALID', mode === 'repair' ? 'warn' : 'error', `${path}.marks[${index}].attrs.href`, 'Unsafe link href.'))\n if (mode === 'repair') {\n changed = true\n return []\n }\n }\n return [mark]\n })\n\n const nextNode: ProseMirrorNodeJSON = {\n ...node,\n attrs: Object.keys(attrs).length > 0 ? attrs : undefined,\n content,\n marks: marks && marks.length > 0 ? marks : undefined,\n }\n return { node: nextNode, issues, changed }\n}\n\nfunction isValidHeadingLevel(value: unknown): boolean {\n return Number.isInteger(value) && typeof value === 'number' && value >= 1 && value <= 6\n}\n\nfunction isSafeHref(value: unknown): boolean {\n if (typeof value !== 'string') return false\n try {\n const url = new URL(value, 'https://refinex.local')\n return ['http:', 'https:', 'mailto:'].includes(url.protocol)\n } catch {\n return false\n }\n}\n\nfunction textContentOf(node: ProseMirrorNodeJSON): string {\n if (typeof node.text === 'string') return node.text\n return node.content?.map((child) => textContentOf(child)).join('') ?? ''\n}\n\nexport * from './rich-blocks'\n"],"names":["richBlockAttrs","richCapabilities","defineNode","name","spec","options","blockId","richBlockExtensionNames","createRichBlockSchemaExtensions","specs","tableNodes","dom","align","value","attrs","width","el","image","normalizeAlign","normalizePercent","normalizeImageStatus","node","normalizeCalloutKind","normalizeToggleCollapsed","collapsed","normalizeEmbedType","normalizeEmbedStatus","normalizeDividerVariant","richBlockSchemaExtensions","numeric","REFINEX_DOC_VERSION","REFINEX_SCHEMA_ID","REFINEX_SCHEMA_VERSION","blockAttrs","baseBlockIdNodeNames","baseNodes","progress","previewSrc","fileName","status","error","baseMarks","mark","color","backgroundColor","registerNodeSpec","registerMarkSpec","createRefinexSchema","nodes","marks","names","extension","assertExtensionName","validateNodeExtension","Schema","defaultSchema","schema","createBlockId","bytes","_a","byte","isBlockIdNode","normalizeDocIds","doc","_schema","createId","seen","issues","changed","normalizeNode","path","issue","isValidBlockId","_blockId","rest","children","child","_offset","index","content","Fragment","sameContent","blockIdPluginKey","PluginKey","createBlockIdPlugin","Plugin","transactions","_oldState","newState","transaction","updates","pos","tr","update","createRefinexDoc","contentJSON","ProseMirrorNode","_b","_c","_d","_e","validateDoc","input","isRecord","refinexDoc","entry","extensionIssues","findMissingExtensions","preflight","preflightNode","parsed","normalized","nextDoc","code","severity","message","extensions","registered","mode","textContentOf","isValidHeadingLevel","result","isSafeHref","url"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../src/rich-blocks.ts","../src/index.ts"],"sourcesContent":["import { tableNodes } from 'prosemirror-tables';\nimport type { NodeSpec } from 'prosemirror-model';\n\nimport type { RefinexNodeExtension, RefinexSchemaExtension } from './index';\n\nconst TABLE_TEXT_COLORS = {\n gray: '#7c7c78',\n brown: '#9f6b53',\n orange: '#d9730d',\n yellow: '#cb912f',\n green: '#448361',\n blue: '#337ea9',\n purple: '#9065b0',\n pink: '#c14c8a',\n red: '#d44c47',\n} as const;\n\nconst TABLE_BACKGROUND_COLORS = {\n gray: '#f1f1ef',\n brown: '#f4eeee',\n orange: '#faebdd',\n yellow: '#fbf3db',\n green: '#edf3ec',\n blue: '#e7f3f8',\n purple: '#f6f3f9',\n pink: '#f9f2f5',\n red: '#fdebec',\n} as const;\n\nconst richBlockAttrs = {\n blockId: { default: null },\n metadata: { default: null },\n permissions: { default: null },\n};\n\nconst richCapabilities = ['doc:read', 'doc:write'];\n\nfunction defineNode(\n name: string,\n spec: NodeSpec,\n options: {\n readonly blockId?: 'required' | 'forbidden';\n readonly fallback?: RefinexNodeExtension['fallback'];\n readonly markdown?: string;\n } = {},\n): RefinexNodeExtension {\n const blockId = options.blockId ?? 'forbidden';\n return {\n kind: 'node',\n name,\n version: '1.0.0',\n spec: { ...spec, refinexBlockId: blockId },\n blockId,\n capabilities: richCapabilities,\n fallback: options.fallback ?? 'paragraph',\n markdown: options.markdown ? { format: options.markdown } : undefined,\n };\n}\n\nexport type ImageBlockAlign = 'left' | 'center' | 'right';\nexport type ImageBlockStatus = 'empty' | 'ready' | 'uploading' | 'error';\nexport type CalloutKind = 'note' | 'tip' | 'important' | 'warning' | 'caution';\nexport type EmbedType = 'bookmark' | 'iframe' | 'oembed';\nexport type EmbedStatus = 'unresolved' | 'loading' | 'ready' | 'error';\nexport type DividerVariant = 'solid' | 'dashed' | 'dotted';\nexport type TableLayout = 'auto' | 'fixed';\nexport type MathBlockAlign = 'center' | 'left';\nexport interface ToggleItemAttrs {\n readonly collapsed: boolean;\n readonly blockId: string | null;\n readonly metadata: Record<string, unknown> | null;\n readonly permissions: Record<string, unknown> | null;\n}\n\nexport const richBlockExtensionNames = [\n 'image_block',\n 'callout',\n 'task_list',\n 'task_item',\n 'toggle_list',\n 'toggle_item',\n 'embed_block',\n 'divider',\n 'table',\n 'table_row',\n 'table_cell',\n 'table_header',\n 'math_inline',\n 'math_block',\n] as const;\n\nexport type RichBlockExtensionName = (typeof richBlockExtensionNames)[number];\n\nexport function createRichBlockSchemaExtensions(): RefinexSchemaExtension[] {\n const specs = tableNodes({\n tableGroup: 'block',\n cellContent: 'block+',\n cellAttributes: {\n align: {\n default: null,\n getFromDOM(dom) {\n const align = dom.getAttribute('data-align') ?? dom.style.textAlign;\n return align === 'left' || align === 'center' || align === 'right' ? align : null;\n },\n setDOMAttr(value, attrs) {\n if (value) {\n attrs['data-align'] = value as string;\n attrs.style = `${String(attrs.style ?? '')} text-align: ${String(value)};`.trim();\n }\n },\n },\n background: {\n default: null,\n getFromDOM(dom) {\n return dom.getAttribute('data-background') ?? dom.style.backgroundColor ?? null;\n },\n setDOMAttr(value, attrs) {\n if (value) {\n attrs['data-background'] = value as string;\n attrs.style =\n `${String(attrs.style ?? '')} background-color: ${tableColorValue(value, TABLE_BACKGROUND_COLORS)};`.trim();\n }\n },\n },\n textColor: {\n default: null,\n getFromDOM(dom) {\n return dom.getAttribute('data-text-color') ?? dom.style.color ?? null;\n },\n setDOMAttr(value, attrs) {\n if (value) {\n attrs['data-text-color'] = value as string;\n attrs.style =\n `${String(attrs.style ?? '')} color: ${tableColorValue(value, TABLE_TEXT_COLORS)};`.trim();\n }\n },\n },\n metadata: {\n default: null,\n getFromDOM() {\n return null;\n },\n setDOMAttr() {\n return undefined;\n },\n },\n colwidth: {\n default: null,\n getFromDOM(dom) {\n const value = dom.getAttribute('data-colwidth');\n const width = value ? Number.parseInt(value, 10) : Number.NaN;\n return Number.isFinite(width) && width > 0 ? [width] : null;\n },\n setDOMAttr(value, attrs) {\n if (!Array.isArray(value)) return;\n const width = Number(value[0]);\n if (!Number.isFinite(width) || width <= 0) return;\n attrs['data-colwidth'] = String(width);\n attrs.style =\n `${String(attrs.style ?? '')} width: ${String(width)}px; min-width: ${String(width)}px;`.trim();\n },\n },\n },\n }) as Record<'table' | 'table_row' | 'table_cell' | 'table_header', NodeSpec>;\n\n return [\n defineNode(\n 'image_block',\n {\n group: 'block',\n content: 'inline*',\n attrs: {\n src: {},\n alt: { default: null },\n title: { default: null },\n align: { default: 'center' satisfies ImageBlockAlign },\n widthPercent: { default: 100 },\n aspectRatio: { default: null },\n status: { default: 'ready' satisfies ImageBlockStatus },\n ...richBlockAttrs,\n },\n selectable: true,\n draggable: true,\n defining: true,\n isolating: true,\n parseDOM: [\n {\n tag: 'figure[data-rmd-image-block]',\n getAttrs(dom) {\n const el = dom as HTMLElement;\n const image = el.querySelector('img');\n return {\n src: image?.getAttribute('src') ?? '',\n alt: image?.getAttribute('alt'),\n title: image?.getAttribute('title'),\n align: normalizeAlign(el.getAttribute('data-align')),\n widthPercent: normalizePercent(el.getAttribute('data-width')),\n aspectRatio: el.getAttribute('data-aspect-ratio'),\n status: normalizeImageStatus(el.getAttribute('data-status')),\n };\n },\n },\n ],\n toDOM(node) {\n const width = normalizePercent(node.attrs.widthPercent);\n return [\n 'figure',\n {\n 'data-rmd-image-block': 'true',\n 'data-align': normalizeAlign(node.attrs.align),\n 'data-width': String(width),\n 'data-status': normalizeImageStatus(node.attrs.status),\n class: 'rmd-image-block',\n },\n [\n 'img',\n {\n src: node.attrs.src as string,\n alt: (node.attrs.alt as string | null) ?? '',\n title: node.attrs.title as string | null,\n style: `width: ${String(width)}%;`,\n },\n ],\n ['figcaption', 0],\n ];\n },\n },\n { blockId: 'required', fallback: 'paragraph', markdown: 'rich-image-block' },\n ),\n\n defineNode(\n 'callout',\n {\n group: 'block',\n content: 'block+',\n attrs: {\n kind: { default: 'note' satisfies CalloutKind },\n title: { default: null },\n icon: { default: null },\n collapsed: { default: false },\n ...richBlockAttrs,\n },\n selectable: true,\n draggable: true,\n defining: true,\n parseDOM: [\n {\n tag: 'aside[data-rmd-callout]',\n getAttrs(dom) {\n const el = dom as HTMLElement;\n return {\n kind: normalizeCalloutKind(el.getAttribute('data-kind')),\n title: el.getAttribute('data-title'),\n icon: el.getAttribute('data-icon'),\n collapsed: el.getAttribute('data-collapsed') === 'true',\n };\n },\n },\n ],\n toDOM(node) {\n return [\n 'aside',\n {\n 'data-rmd-callout': 'true',\n 'data-kind': normalizeCalloutKind(node.attrs.kind),\n 'data-title': node.attrs.title as string | null,\n 'data-icon': node.attrs.icon as string | null,\n 'data-collapsed': String(Boolean(node.attrs.collapsed)),\n class: `rmd-callout rmd-callout-${normalizeCalloutKind(node.attrs.kind)}`,\n },\n 0,\n ];\n },\n },\n { blockId: 'required', fallback: 'paragraph', markdown: 'gfm-alert' },\n ),\n\n defineNode(\n 'task_list',\n {\n group: 'block',\n content: 'task_item+',\n attrs: { metadata: { default: null } },\n parseDOM: [{ tag: 'ul[data-rmd-task-list]' }],\n toDOM() {\n return ['ul', { 'data-rmd-task-list': 'true', class: 'rmd-task-list' }, 0];\n },\n },\n { fallback: 'paragraph', markdown: 'gfm-task-list' },\n ),\n\n defineNode(\n 'task_item',\n {\n content: 'paragraph block*',\n attrs: {\n checked: { default: false },\n ...richBlockAttrs,\n },\n defining: true,\n parseDOM: [\n {\n tag: 'li[data-rmd-task-item]',\n getAttrs(dom) {\n return { checked: (dom as HTMLElement).getAttribute('data-checked') === 'true' };\n },\n },\n ],\n toDOM(node) {\n return [\n 'li',\n {\n 'data-rmd-task-item': 'true',\n 'data-checked': String(Boolean(node.attrs.checked)),\n class: 'rmd-task-item',\n },\n 0,\n ];\n },\n },\n { blockId: 'required', fallback: 'paragraph', markdown: 'gfm-task-list' },\n ),\n\n defineNode(\n 'toggle_list',\n {\n group: 'block',\n content: 'toggle_item+',\n attrs: { metadata: { default: null } },\n parseDOM: [{ tag: 'ul[data-rmd-toggle-list]' }],\n toDOM() {\n return ['ul', { 'data-rmd-toggle-list': 'true', class: 'rmd-toggle-list' }, 0];\n },\n },\n { fallback: 'paragraph', markdown: 'refinex-toggle-list' },\n ),\n\n defineNode(\n 'toggle_item',\n {\n content: 'paragraph block*',\n attrs: {\n collapsed: { default: false },\n ...richBlockAttrs,\n },\n selectable: true,\n draggable: true,\n defining: true,\n parseDOM: [\n {\n tag: 'li[data-rmd-toggle-item]',\n getAttrs(dom) {\n return {\n collapsed: normalizeToggleCollapsed(\n (dom as HTMLElement).getAttribute('data-collapsed'),\n ),\n };\n },\n },\n ],\n toDOM(node) {\n const collapsed = normalizeToggleCollapsed(node.attrs.collapsed);\n return [\n 'li',\n {\n 'data-rmd-toggle-item': 'true',\n 'data-collapsed': String(collapsed),\n class: 'rmd-toggle-item',\n },\n 0,\n ];\n },\n },\n { blockId: 'required', fallback: 'paragraph', markdown: 'refinex-toggle-list' },\n ),\n\n defineNode(\n 'embed_block',\n {\n group: 'block',\n atom: true,\n isolating: true,\n selectable: true,\n draggable: true,\n attrs: {\n url: {},\n provider: { default: null },\n embedType: { default: 'bookmark' satisfies EmbedType },\n title: { default: null },\n description: { default: null },\n thumbnail: { default: null },\n html: { default: null },\n aspectRatio: { default: null },\n status: { default: 'unresolved' satisfies EmbedStatus },\n error: { default: null },\n ...richBlockAttrs,\n },\n parseDOM: [\n {\n tag: 'a[data-rmd-embed-block]',\n getAttrs(dom) {\n const el = dom as HTMLElement;\n return {\n url: el.getAttribute('href') ?? '',\n title: el.getAttribute('data-title') ?? el.textContent,\n provider: el.getAttribute('data-provider'),\n embedType: normalizeEmbedType(el.getAttribute('data-embed-type')),\n status: normalizeEmbedStatus(el.getAttribute('data-status')),\n };\n },\n },\n ],\n toDOM(node) {\n return [\n 'a',\n {\n 'data-rmd-embed-block': 'true',\n href: node.attrs.url as string,\n 'data-provider': node.attrs.provider as string | null,\n 'data-embed-type': normalizeEmbedType(node.attrs.embedType),\n 'data-status': normalizeEmbedStatus(node.attrs.status),\n class: 'rmd-embed-block',\n },\n (node.attrs.title as string | null) ?? (node.attrs.url as string),\n ];\n },\n },\n { blockId: 'required', fallback: 'paragraph', markdown: 'refinex-block' },\n ),\n\n defineNode(\n 'divider',\n {\n group: 'block',\n attrs: {\n variant: { default: 'solid' satisfies DividerVariant },\n ...richBlockAttrs,\n },\n selectable: true,\n draggable: true,\n parseDOM: [\n {\n tag: 'hr[data-rmd-divider]',\n getAttrs(dom) {\n return {\n variant: normalizeDividerVariant((dom as HTMLElement).getAttribute('data-variant')),\n };\n },\n },\n ],\n toDOM(node) {\n return [\n 'hr',\n {\n 'data-rmd-divider': 'true',\n 'data-variant': normalizeDividerVariant(node.attrs.variant),\n class: `rmd-divider rmd-divider-${normalizeDividerVariant(node.attrs.variant)}`,\n },\n ];\n },\n },\n { blockId: 'required', fallback: 'paragraph', markdown: 'thematic-break' },\n ),\n\n defineNode(\n 'table',\n {\n ...specs.table,\n attrs: {\n ...(specs.table.attrs ?? {}),\n columnWidths: { default: null },\n layout: { default: 'auto' satisfies TableLayout },\n caption: { default: null },\n ...richBlockAttrs,\n },\n isolating: true,\n selectable: true,\n draggable: true,\n },\n { blockId: 'required', fallback: 'code_block', markdown: 'gfm-table' },\n ),\n defineNode('table_row', specs.table_row, { fallback: 'drop', markdown: 'gfm-table' }),\n defineNode('table_cell', specs.table_cell, { fallback: 'paragraph', markdown: 'gfm-table' }),\n defineNode('table_header', specs.table_header, {\n fallback: 'paragraph',\n markdown: 'gfm-table',\n }),\n\n defineNode(\n 'math_inline',\n {\n inline: true,\n group: 'inline',\n atom: true,\n selectable: true,\n attrs: {\n tex: {},\n metadata: { default: null },\n },\n parseDOM: [\n {\n tag: 'span[data-rmd-math-inline]',\n getAttrs(dom) {\n return { tex: (dom as HTMLElement).getAttribute('data-tex') ?? '' };\n },\n },\n ],\n toDOM(node) {\n return [\n 'span',\n {\n 'data-rmd-math-inline': 'true',\n 'data-tex': node.attrs.tex as string,\n class: 'rmd-math-inline',\n },\n node.attrs.tex as string,\n ];\n },\n },\n { fallback: 'paragraph', markdown: 'remark-math' },\n ),\n\n defineNode(\n 'math_block',\n {\n group: 'block',\n atom: true,\n isolating: true,\n selectable: true,\n draggable: true,\n attrs: {\n tex: {},\n numbered: { default: false },\n label: { default: null },\n align: { default: 'center' satisfies MathBlockAlign },\n ...richBlockAttrs,\n },\n parseDOM: [\n {\n tag: 'div[data-rmd-math-block]',\n getAttrs(dom) {\n const el = dom as HTMLElement;\n return {\n tex: el.getAttribute('data-tex') ?? el.textContent ?? '',\n numbered: el.getAttribute('data-numbered') === 'true',\n label: el.getAttribute('data-label'),\n align: el.getAttribute('data-align') === 'left' ? 'left' : 'center',\n };\n },\n },\n ],\n toDOM(node) {\n return [\n 'div',\n {\n 'data-rmd-math-block': 'true',\n 'data-tex': node.attrs.tex as string,\n 'data-numbered': String(Boolean(node.attrs.numbered)),\n 'data-label': node.attrs.label as string | null,\n 'data-align': node.attrs.align === 'left' ? 'left' : 'center',\n class: 'rmd-math-block',\n },\n node.attrs.tex as string,\n ];\n },\n },\n { blockId: 'required', fallback: 'code_block', markdown: 'remark-math' },\n ),\n ];\n}\n\nexport const richBlockSchemaExtensions = createRichBlockSchemaExtensions();\n\nfunction normalizeAlign(value: unknown): ImageBlockAlign {\n return value === 'left' || value === 'right' ? value : 'center';\n}\n\nfunction normalizePercent(value: unknown): number {\n const numeric = Number(value ?? 100);\n if (!Number.isFinite(numeric)) return 100;\n return Math.max(10, Math.min(100, Math.round(numeric)));\n}\n\nfunction normalizeImageStatus(value: unknown): ImageBlockStatus {\n return value === 'empty' || value === 'uploading' || value === 'error' ? value : 'ready';\n}\n\nfunction normalizeCalloutKind(value: unknown): CalloutKind {\n if (value === 'tip' || value === 'important' || value === 'warning' || value === 'caution')\n return value;\n if (value === 'error') return 'caution';\n return 'note';\n}\n\nfunction normalizeEmbedType(value: unknown): EmbedType {\n return value === 'iframe' || value === 'oembed' ? value : 'bookmark';\n}\n\nfunction normalizeEmbedStatus(value: unknown): EmbedStatus {\n return value === 'loading' || value === 'ready' || value === 'error' ? value : 'unresolved';\n}\n\nfunction normalizeDividerVariant(value: unknown): DividerVariant {\n return value === 'dashed' || value === 'dotted' ? value : 'solid';\n}\n\nfunction normalizeToggleCollapsed(value: unknown): boolean {\n return value === true || value === 'true';\n}\n\nfunction tableColorValue(\n value: unknown,\n palette: Readonly<Record<string, string>>,\n): string {\n const color = String(value);\n return palette[color] ?? color;\n}\n","import { Fragment, Node as ProseMirrorNode, Schema } from 'prosemirror-model'\nimport type { MarkSpec, NodeSpec, NodeType } from 'prosemirror-model'\nimport { Plugin, PluginKey } from 'prosemirror-state'\n\nexport const REFINEX_DOC_VERSION = '1.0.0'\nexport const REFINEX_SCHEMA_ID = '@refinex-md/base'\nexport const REFINEX_SCHEMA_VERSION = '1.0.0'\n\nexport type BlockIdMode = 'required' | 'forbidden' | 'optional'\nexport type RefinexCapabilityToken = 'doc:read' | 'doc:write' | 'network:none' | string\nexport type RefinexSchemaPlacement = 'append' | 'prepend'\nexport type RefinexNodeFallback = 'unwrap' | 'paragraph' | 'code_block' | 'drop'\nexport type RefinexMarkFallback = 'drop' | 'code' | 'link'\n\nexport interface RefinexMarkdownDeclaration {\n readonly format: string\n}\n\nexport interface RefinexMigrationDeclaration {\n readonly from: string\n readonly to: string\n}\n\ntype RefinexNodeSpec = NodeSpec & { refinexBlockId?: BlockIdMode }\n\nexport interface RefinexNodeExtension {\n readonly kind: 'node'\n readonly name: string\n readonly version: string\n readonly spec: RefinexNodeSpec\n readonly placement?: RefinexSchemaPlacement\n readonly blockId?: BlockIdMode\n readonly capabilities: RefinexCapabilityToken[]\n readonly fallback: RefinexNodeFallback\n readonly markdown?: RefinexMarkdownDeclaration\n readonly migration?: RefinexMigrationDeclaration\n}\n\nexport interface RefinexMarkExtension {\n readonly kind: 'mark'\n readonly name: string\n readonly version: string\n readonly spec: MarkSpec\n readonly placement?: RefinexSchemaPlacement\n readonly capabilities: RefinexCapabilityToken[]\n readonly fallback: RefinexMarkFallback\n readonly markdown?: RefinexMarkdownDeclaration\n readonly migration?: RefinexMigrationDeclaration\n}\n\nexport type RefinexSchemaExtension = RefinexNodeExtension | RefinexMarkExtension\n\nexport interface CreateRefinexSchemaOptions {\n readonly extensions?: readonly RefinexSchemaExtension[]\n}\n\nexport interface RegisterNodeSpecOptions {\n readonly version?: string\n readonly placement?: RefinexSchemaPlacement\n readonly blockId?: BlockIdMode\n readonly capabilities?: readonly RefinexCapabilityToken[]\n readonly fallback?: RefinexNodeFallback\n readonly markdown?: RefinexMarkdownDeclaration\n readonly migration?: RefinexMigrationDeclaration\n}\n\nexport interface RegisterMarkSpecOptions {\n readonly version?: string\n readonly placement?: RefinexSchemaPlacement\n readonly capabilities?: readonly RefinexCapabilityToken[]\n readonly fallback?: RefinexMarkFallback\n readonly markdown?: RefinexMarkdownDeclaration\n readonly migration?: RefinexMigrationDeclaration\n}\n\nexport interface ProseMirrorMarkJSON {\n readonly type: string\n readonly attrs?: Record<string, unknown>\n}\n\nexport interface ProseMirrorNodeJSON {\n readonly type: string\n readonly attrs?: Record<string, unknown>\n readonly content?: ProseMirrorNodeJSON[]\n readonly text?: string\n readonly marks?: ProseMirrorMarkJSON[]\n}\n\nexport type ProseMirrorDocJSON = ProseMirrorNodeJSON & { readonly type: 'doc' }\n\nexport interface RefinexExtensionRef {\n readonly name: string\n readonly version: string\n}\n\nexport interface RefinexSchemaRef {\n readonly id: typeof REFINEX_SCHEMA_ID\n readonly version: string\n readonly extensions: RefinexExtensionRef[]\n}\n\nexport interface RefinexBlockPermission {\n readonly access: 'read-write' | 'read-only' | 'comment-only' | 'locked'\n readonly reason?: string\n}\n\nexport interface RefinexDocMetadata {\n readonly docId?: string\n readonly title?: string\n readonly createdAt?: string\n readonly updatedAt?: string\n readonly createdBy?: string\n readonly updatedBy?: string\n readonly source?: 'api' | 'markdown-import' | 'html-import' | 'collab' | 'unknown'\n readonly custom?: Record<string, unknown>\n}\n\nexport interface RefinexDocPermissions {\n readonly policyVersion: '1.0'\n readonly defaultAccess: 'read-write' | 'read-only' | 'comment-only' | 'locked'\n readonly blockOverrides?: Record<string, RefinexBlockPermission>\n readonly custom?: Record<string, unknown>\n}\n\nexport interface RefinexDoc {\n readonly refinexDocVersion: string\n readonly schema: RefinexSchemaRef\n readonly metadata: RefinexDocMetadata\n readonly permissions: RefinexDocPermissions\n readonly content: ProseMirrorDocJSON\n}\n\nexport type RefinexIssueCode =\n | 'DOC_VERSION_UNSUPPORTED'\n | 'SCHEMA_VERSION_UNSUPPORTED'\n | 'EXTENSION_MISSING'\n | 'NODE_UNKNOWN'\n | 'MARK_UNKNOWN'\n | 'CONTENT_INVALID'\n | 'ATTR_INVALID'\n | 'BLOCK_ID_MISSING'\n | 'BLOCK_ID_INVALID'\n | 'BLOCK_ID_DUPLICATE'\n | 'BLOCK_ID_FORBIDDEN'\n | 'FALLBACK_APPLIED'\n\nexport type RefinexIssueSeverity = 'error' | 'warn' | 'info'\n\nexport interface RefinexDocIssue {\n readonly code: RefinexIssueCode\n readonly severity: RefinexIssueSeverity\n readonly path: string\n readonly message: string\n}\n\nexport interface NormalizeDocIdsOptions {\n readonly createId?: () => string\n}\n\nexport interface NormalizeDocIdsResult {\n readonly doc: ProseMirrorNode\n readonly changed: boolean\n readonly issues: RefinexDocIssue[]\n}\n\nexport interface CreateRefinexDocOptions {\n readonly schema?: Partial<RefinexSchemaRef>\n readonly metadata?: RefinexDocMetadata\n readonly permissions?: Partial<RefinexDocPermissions>\n}\n\nexport interface ValidateDocOptions extends NormalizeDocIdsOptions {\n readonly mode: 'strict' | 'repair'\n readonly extensions?: readonly RefinexSchemaExtension[]\n readonly allowUnknownExtensions?: boolean\n readonly preserveTrustedBlockIds?: boolean\n}\n\nexport interface ValidateDocResult {\n readonly ok: boolean\n readonly doc?: RefinexDoc\n readonly normalized?: RefinexDoc\n readonly issues: RefinexDocIssue[]\n}\n\nconst blockAttrs = {\n blockId: { default: null },\n metadata: { default: null },\n permissions: { default: null },\n}\n\nconst baseBlockIdNodeNames = new Set([\n 'paragraph',\n 'heading',\n 'blockquote',\n 'list_item',\n 'code_block',\n 'horizontal_rule',\n])\n\nexport const baseNodes: Record<string, RefinexNodeSpec> = {\n doc: { content: 'block+' },\n\n paragraph: {\n attrs: blockAttrs,\n content: 'inline*',\n group: 'block',\n refinexBlockId: 'required',\n parseDOM: [{ tag: 'p' }],\n toDOM() {\n return ['p', 0]\n },\n },\n\n heading: {\n attrs: { level: { default: 1 }, ...blockAttrs },\n content: 'inline*',\n group: 'block',\n defining: true,\n refinexBlockId: 'required',\n parseDOM: [\n { tag: 'h1', attrs: { level: 1 } },\n { tag: 'h2', attrs: { level: 2 } },\n { tag: 'h3', attrs: { level: 3 } },\n { tag: 'h4', attrs: { level: 4 } },\n { tag: 'h5', attrs: { level: 5 } },\n { tag: 'h6', attrs: { level: 6 } },\n ],\n toDOM(node) {\n return [`h${String(node.attrs.level)}`, 0]\n },\n },\n\n blockquote: {\n attrs: blockAttrs,\n content: 'block+',\n group: 'block',\n defining: true,\n refinexBlockId: 'required',\n parseDOM: [{ tag: 'blockquote' }],\n toDOM() {\n return ['blockquote', 0]\n },\n },\n\n bullet_list: {\n attrs: { metadata: { default: null } },\n content: 'list_item+',\n group: 'block',\n parseDOM: [{ tag: 'ul' }],\n toDOM() {\n return ['ul', 0]\n },\n },\n\n ordered_list: {\n attrs: { order: { default: 1 }, metadata: { default: null } },\n content: 'list_item+',\n group: 'block',\n parseDOM: [{\n tag: 'ol',\n getAttrs(dom) {\n const el = dom as HTMLElement\n return { order: el.hasAttribute('start') ? Number(el.getAttribute('start')) : 1 }\n },\n }],\n toDOM(node) {\n return node.attrs.order === 1 ? ['ol', 0] : ['ol', { start: node.attrs.order as number }, 0]\n },\n },\n\n list_item: {\n attrs: blockAttrs,\n content: 'paragraph block*',\n defining: true,\n refinexBlockId: 'required',\n parseDOM: [{ tag: 'li' }],\n toDOM() {\n return ['li', 0]\n },\n },\n\n code_block: {\n attrs: {\n language: { default: null },\n lineNumbers: { default: false },\n startLine: { default: 1 },\n highlightLines: { default: null },\n displayMode: { default: 'source' },\n wrap: { default: false },\n ...blockAttrs,\n },\n content: 'text*',\n marks: '',\n group: 'block',\n code: true,\n defining: true,\n refinexBlockId: 'required',\n parseDOM: [{ tag: 'pre', preserveWhitespace: 'full' }],\n toDOM() {\n return ['pre', ['code', 0]]\n },\n },\n\n horizontal_rule: {\n attrs: blockAttrs,\n group: 'block',\n refinexBlockId: 'required',\n parseDOM: [{ tag: 'hr' }],\n toDOM() {\n return ['hr']\n },\n },\n\n image: {\n attrs: {\n src: {},\n alt: { default: null },\n title: { default: null },\n metadata: { default: null },\n permissions: { default: null },\n },\n inline: true,\n group: 'inline',\n draggable: true,\n parseDOM: [{\n tag: 'img[src]',\n getAttrs(dom) {\n const el = dom as HTMLElement\n return {\n src: el.getAttribute('src'),\n alt: el.getAttribute('alt'),\n title: el.getAttribute('title'),\n }\n },\n }],\n toDOM(node) {\n return ['img', node.attrs]\n },\n },\n\n upload_placeholder: {\n attrs: {\n uploadId: {},\n fileName: { default: null },\n mimeType: { default: null },\n previewSrc: { default: null },\n progress: { default: 0 },\n status: { default: 'uploading' },\n error: { default: null },\n },\n inline: true,\n group: 'inline',\n atom: true,\n selectable: true,\n parseDOM: [{\n tag: 'span[data-rmd-upload-placeholder]',\n getAttrs(dom) {\n const el = dom as HTMLElement\n return {\n uploadId: el.getAttribute('data-upload-id'),\n fileName: el.getAttribute('data-file-name'),\n mimeType: el.getAttribute('data-mime-type'),\n previewSrc: el.getAttribute('data-preview-src'),\n progress: Number(el.getAttribute('data-progress') ?? '0'),\n status: el.getAttribute('data-status') ?? 'uploading',\n error: el.getAttribute('data-error'),\n }\n },\n }],\n toDOM(node) {\n const attrs = node.attrs\n const progress = Math.max(0, Math.min(100, Number(attrs.progress ?? 0)))\n const previewSrc = typeof attrs.previewSrc === 'string' && attrs.previewSrc ? attrs.previewSrc : null\n const fileName = typeof attrs.fileName === 'string' && attrs.fileName ? attrs.fileName : '文件'\n const status = typeof attrs.status === 'string' ? attrs.status : 'uploading'\n const error = typeof attrs.error === 'string' && attrs.error ? attrs.error : '上传失败'\n return [\n 'span',\n {\n 'data-rmd-upload-placeholder': 'true',\n 'data-upload-id': attrs.uploadId as string,\n 'data-file-name': fileName,\n 'data-mime-type': attrs.mimeType as string | null,\n 'data-preview-src': previewSrc,\n 'data-progress': String(progress),\n 'data-status': status,\n 'data-error': status === 'error' ? error : null,\n class: 'rmd-upload-placeholder',\n },\n ['span', { class: 'rmd-upload-preview' }, previewSrc ? ['img', { src: previewSrc, alt: fileName }] : ''],\n ['span', { class: 'rmd-upload-body' },\n ['span', { class: 'rmd-upload-name' }, fileName],\n ['span', { class: 'rmd-upload-progress', role: 'progressbar', 'aria-valuemin': '0', 'aria-valuemax': '100', 'aria-valuenow': String(progress) },\n ['span', { class: 'rmd-upload-progress-fill', style: `width: ${String(progress)}%;` }],\n ],\n ['span', { class: 'rmd-upload-error' }, error],\n ],\n ['button', { type: 'button', 'data-upload-action': 'retry', class: 'rmd-upload-action' }, '重试'],\n ['button', { type: 'button', 'data-upload-action': 'remove', class: 'rmd-upload-action' }, '移除'],\n ]\n },\n },\n\n hard_break: {\n inline: true,\n group: 'inline',\n selectable: false,\n parseDOM: [{ tag: 'br' }],\n toDOM() {\n return ['br']\n },\n },\n\n text: {\n group: 'inline',\n },\n}\n\nexport const baseMarks: Record<string, MarkSpec> = {\n bold: {\n parseDOM: [{ tag: 'strong' }, { tag: 'b' }, { style: 'font-weight=bold' }],\n toDOM() {\n return ['strong', 0]\n },\n },\n\n italic: {\n parseDOM: [{ tag: 'em' }, { tag: 'i' }, { style: 'font-style=italic' }],\n toDOM() {\n return ['em', 0]\n },\n },\n\n code: {\n parseDOM: [{ tag: 'code' }],\n toDOM() {\n return ['code', 0]\n },\n },\n\n link: {\n attrs: {\n href: {},\n title: { default: null },\n target: { default: null },\n rel: { default: 'noopener noreferrer' },\n },\n inclusive: false,\n parseDOM: [{\n tag: 'a[href]',\n getAttrs(dom) {\n const el = dom as HTMLElement\n return {\n href: el.getAttribute('href'),\n title: el.getAttribute('title'),\n target: el.getAttribute('target'),\n rel: el.getAttribute('rel') || 'noopener noreferrer',\n }\n },\n }],\n toDOM(mark) {\n return ['a', mark.attrs, 0]\n },\n },\n\n strikethrough: {\n parseDOM: [{ tag: 's' }, { tag: 'del' }],\n toDOM() {\n return ['s', 0]\n },\n },\n\n underline: {\n parseDOM: [{ tag: 'u' }, { style: 'text-decoration=underline' }],\n toDOM() {\n return ['u', 0]\n },\n },\n\n text_color: {\n attrs: {\n color: { default: null },\n },\n parseDOM: [{\n style: 'color',\n getAttrs(value) {\n if (typeof value !== 'string' || !value.trim()) return false\n return { color: value.trim() }\n },\n }],\n toDOM(mark) {\n const color = mark.attrs.color\n if (typeof color !== 'string' || !color.trim()) return ['span', 0]\n return ['span', { style: `color: ${color}` }, 0]\n },\n },\n\n text_background_color: {\n attrs: {\n backgroundColor: { default: null },\n },\n parseDOM: [{\n style: 'background-color',\n getAttrs(value) {\n if (typeof value !== 'string' || !value.trim()) return false\n return { backgroundColor: value.trim() }\n },\n }],\n toDOM(mark) {\n const backgroundColor = mark.attrs.backgroundColor\n if (typeof backgroundColor !== 'string' || !backgroundColor.trim()) return ['span', 0]\n return ['span', { style: `background-color: ${backgroundColor}` }, 0]\n },\n },\n}\n\nexport function registerNodeSpec(\n name: string,\n spec: NodeSpec,\n options: RegisterNodeSpecOptions = {},\n): RefinexNodeExtension {\n return {\n kind: 'node',\n name,\n version: options.version ?? '1.0.0',\n spec: { ...spec, refinexBlockId: options.blockId },\n placement: options.placement,\n blockId: options.blockId ?? 'forbidden',\n capabilities: [...(options.capabilities ?? [])],\n fallback: options.fallback ?? 'paragraph',\n markdown: options.markdown,\n migration: options.migration,\n }\n}\n\nexport function registerMarkSpec(\n name: string,\n spec: MarkSpec,\n options: RegisterMarkSpecOptions = {},\n): RefinexMarkExtension {\n return {\n kind: 'mark',\n name,\n version: options.version ?? '1.0.0',\n spec,\n placement: options.placement,\n capabilities: [...(options.capabilities ?? [])],\n fallback: options.fallback ?? 'drop',\n markdown: options.markdown,\n migration: options.migration,\n }\n}\n\nexport function createRefinexSchema(options: CreateRefinexSchemaOptions = {}): Schema {\n const nodes: Record<string, RefinexNodeSpec> = { ...baseNodes }\n const marks: Record<string, MarkSpec> = { ...baseMarks }\n const names = new Set([...Object.keys(nodes), ...Object.keys(marks)])\n\n for (const extension of options.extensions ?? []) {\n assertExtensionName(extension.name)\n if (names.has(extension.name)) {\n throw new Error(`Extension name \"${extension.name}\" is reserved or already registered.`)\n }\n names.add(extension.name)\n\n if (extension.kind === 'node') {\n validateNodeExtension(extension)\n nodes[extension.name] = { ...extension.spec, refinexBlockId: extension.blockId }\n } else {\n marks[extension.name] = extension.spec\n }\n }\n\n return new Schema({ nodes, marks })\n}\n\nexport const defaultSchema = createRefinexSchema()\nexport const schema = defaultSchema\n\nexport function createBlockId(): string {\n const bytes = new Uint8Array(12)\n globalThis.crypto?.getRandomValues(bytes)\n const suffix = Array.from(bytes, (byte) => byte.toString(36).padStart(2, '0')).join('').slice(0, 24)\n return `blk_${suffix}`\n}\n\nexport function isBlockIdNode(node: NodeType | ProseMirrorNodeJSON): boolean {\n if ('spec' in node) {\n return (node.spec as RefinexNodeSpec).refinexBlockId === 'required' || baseBlockIdNodeNames.has(node.name)\n }\n return baseBlockIdNodeNames.has(node.type)\n}\n\nexport function normalizeDocIds(\n doc: ProseMirrorNode,\n _schema: Schema,\n options: NormalizeDocIdsOptions = {},\n): NormalizeDocIdsResult {\n const createId = options.createId ?? createBlockId\n const seen = new Set<string>()\n const issues: RefinexDocIssue[] = []\n let changed = false\n\n function normalizeNode(node: ProseMirrorNode, path: string): ProseMirrorNode {\n if (node.isText) return node\n\n let attrs = node.attrs\n if (isBlockIdNode(node.type)) {\n const blockId = attrs.blockId\n if (typeof blockId !== 'string' || blockId.length === 0) {\n attrs = { ...attrs, blockId: createId() }\n changed = true\n issues.push(issue('BLOCK_ID_MISSING', 'warn', `${path}.attrs.blockId`, 'Missing blockId was generated.'))\n } else if (!isValidBlockId(blockId)) {\n attrs = { ...attrs, blockId: createId() }\n changed = true\n issues.push(issue('BLOCK_ID_INVALID', 'warn', `${path}.attrs.blockId`, 'Invalid blockId was replaced.'))\n } else if (seen.has(blockId)) {\n attrs = { ...attrs, blockId: createId() }\n changed = true\n issues.push(issue('BLOCK_ID_DUPLICATE', 'warn', `${path}.attrs.blockId`, 'Duplicate blockId was replaced.'))\n }\n seen.add(attrs.blockId as string)\n } else if ('blockId' in attrs) {\n const { blockId: _blockId, ...rest } = attrs\n attrs = rest\n changed = true\n issues.push(issue('BLOCK_ID_FORBIDDEN', 'warn', `${path}.attrs.blockId`, 'Forbidden blockId was removed.'))\n }\n\n const children: ProseMirrorNode[] = []\n node.forEach((child, _offset, index) => {\n children.push(normalizeNode(child, `${path}.content[${index}]`))\n })\n\n const content = children.length > 0 ? Fragment.fromArray(children) : Fragment.empty\n const sameContent = children.length === node.childCount && children.every((child, index) => child.eq(node.child(index)))\n return attrs === node.attrs && sameContent ? node : node.type.create(attrs, content, node.marks)\n }\n\n return { doc: normalizeNode(doc, '$'), changed, issues }\n}\n\nconst blockIdPluginKey = new PluginKey('refinexBlockId')\n\nexport function createBlockIdPlugin(options: NormalizeDocIdsOptions = {}): Plugin {\n return new Plugin({\n key: blockIdPluginKey,\n appendTransaction(transactions, _oldState, newState) {\n if (transactions.some((transaction) => transaction.getMeta(blockIdPluginKey))) return null\n if (!transactions.some((transaction) => transaction.docChanged)) return null\n\n const createId = options.createId ?? createBlockId\n const seen = new Set<string>()\n const updates: Array<{ pos: number; attrs: Record<string, unknown> }> = []\n\n newState.doc.descendants((node, pos) => {\n if (!isBlockIdNode(node.type)) return true\n const blockId = node.attrs.blockId\n if (typeof blockId !== 'string' || !isValidBlockId(blockId) || seen.has(blockId)) {\n updates.push({ pos, attrs: { ...node.attrs, blockId: createId() } })\n return true\n }\n seen.add(blockId)\n return true\n })\n\n if (updates.length === 0) return null\n const tr = newState.tr\n for (const update of updates) {\n tr.setNodeMarkup(update.pos, undefined, update.attrs)\n }\n tr.setMeta(blockIdPluginKey, true)\n return tr\n },\n })\n}\n\nexport function createRefinexDoc(\n content: ProseMirrorNode | ProseMirrorDocJSON,\n options: CreateRefinexDocOptions = {},\n): RefinexDoc {\n const contentJSON = content instanceof ProseMirrorNode ? content.toJSON() as ProseMirrorDocJSON : content\n return {\n refinexDocVersion: REFINEX_DOC_VERSION,\n schema: {\n id: REFINEX_SCHEMA_ID,\n version: options.schema?.version ?? REFINEX_SCHEMA_VERSION,\n extensions: options.schema?.extensions ?? [],\n },\n metadata: options.metadata ?? {},\n permissions: {\n policyVersion: '1.0',\n defaultAccess: options.permissions?.defaultAccess ?? 'read-write',\n blockOverrides: options.permissions?.blockOverrides,\n custom: options.permissions?.custom,\n },\n content: contentJSON,\n }\n}\n\nexport function validateDoc(input: unknown, options: ValidateDocOptions): ValidateDocResult {\n const issues: RefinexDocIssue[] = []\n if (!isRecord(input)) {\n return {\n ok: false,\n issues: [issue('CONTENT_INVALID', 'error', '$', 'RefinexDoc must be an object.')],\n }\n }\n\n const refinexDoc = input as unknown as RefinexDoc\n if (refinexDoc.refinexDocVersion !== REFINEX_DOC_VERSION) {\n issues.push(issue('DOC_VERSION_UNSUPPORTED', 'error', '$.refinexDocVersion', 'Unsupported RefinexDoc version.'))\n }\n if (!isRecord(refinexDoc.schema) || refinexDoc.schema.version !== REFINEX_SCHEMA_VERSION) {\n issues.push(issue('SCHEMA_VERSION_UNSUPPORTED', 'error', '$.schema.version', 'Unsupported schema version.'))\n }\n if (!isRecord(refinexDoc.content) || refinexDoc.content.type !== 'doc') {\n issues.push(issue('CONTENT_INVALID', 'error', '$.content', 'Content must be a ProseMirror doc JSON object.'))\n }\n if (issues.some((entry) => entry.severity === 'error')) {\n return { ok: false, issues }\n }\n\n const schema = createRefinexSchema({ extensions: options.extensions })\n const extensionIssues = findMissingExtensions(refinexDoc, options.extensions ?? [])\n issues.push(...extensionIssues)\n\n const preflight = preflightNode(refinexDoc.content, schema, '$.content', options.mode)\n issues.push(...preflight.issues)\n if (options.mode === 'strict' && issues.some((entry) => entry.severity === 'error')) {\n return { ok: false, issues }\n }\n\n let parsed: ProseMirrorNode\n try {\n parsed = schema.nodeFromJSON(preflight.node)\n parsed.check()\n } catch (error) {\n return {\n ok: false,\n issues: [\n ...issues,\n issue('CONTENT_INVALID', 'error', '$.content', error instanceof Error ? error.message : 'Invalid content.'),\n ],\n }\n }\n\n const normalized = normalizeDocIds(parsed, schema, { createId: options.createId })\n issues.push(...normalized.issues)\n\n if (options.mode === 'strict' && normalized.issues.length > 0) {\n return { ok: false, issues }\n }\n\n const nextDoc = createRefinexDoc(normalized.doc, {\n schema: refinexDoc.schema,\n metadata: refinexDoc.metadata,\n permissions: refinexDoc.permissions,\n })\n\n return options.mode === 'repair' && (preflight.changed || normalized.changed)\n ? { ok: true, normalized: nextDoc, issues }\n : { ok: issues.every((entry) => entry.severity !== 'error'), doc: nextDoc, issues }\n}\n\nfunction assertExtensionName(name: string): void {\n if (!/^[a-z][a-z0-9_]*$/.test(name)) {\n throw new Error(`Extension name \"${name}\" must use snake_case.`)\n }\n}\n\nfunction validateNodeExtension(extension: RefinexNodeExtension): void {\n const inline = extension.spec.inline === true || extension.spec.group === 'inline'\n if (inline && extension.blockId === 'required') {\n throw new Error(`Inline node \"${extension.name}\" cannot require blockId.`)\n }\n if (extension.blockId !== 'required' && extension.spec.attrs?.blockId) {\n throw new Error(`Node \"${extension.name}\" declares blockId attr but does not require blockId.`)\n }\n if (extension.blockId === 'required' && !extension.spec.attrs?.blockId) {\n throw new Error(`Node \"${extension.name}\" requires a blockId attr.`)\n }\n}\n\nfunction isValidBlockId(value: string): boolean {\n return /^blk_[A-Za-z0-9_-]{8,36}$/.test(value)\n}\n\nfunction issue(\n code: RefinexIssueCode,\n severity: RefinexIssueSeverity,\n path: string,\n message: string,\n): RefinexDocIssue {\n return { code, severity, path, message }\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n}\n\nfunction findMissingExtensions(\n refinexDoc: RefinexDoc,\n extensions: readonly RefinexSchemaExtension[],\n): RefinexDocIssue[] {\n const registered = new Set(extensions.map((extension) => extension.name))\n return refinexDoc.schema.extensions\n .filter((extension) => !registered.has(extension.name))\n .map((extension, index) => issue(\n 'EXTENSION_MISSING',\n 'error',\n `$.schema.extensions[${index}]`,\n `Missing schema extension \"${extension.name}\".`,\n ))\n}\n\ninterface PreflightResult {\n readonly node: ProseMirrorNodeJSON\n readonly issues: RefinexDocIssue[]\n readonly changed: boolean\n}\n\nfunction preflightNode(\n node: ProseMirrorNodeJSON,\n schema: Schema,\n path: string,\n mode: 'strict' | 'repair',\n): PreflightResult {\n const issues: RefinexDocIssue[] = []\n let changed = false\n\n if (!schema.nodes[node.type]) {\n issues.push(issue('NODE_UNKNOWN', mode === 'repair' ? 'warn' : 'error', path, `Unknown node \"${node.type}\".`))\n if (mode === 'repair') {\n issues.push(issue('FALLBACK_APPLIED', 'info', path, `Unknown node \"${node.type}\" converted to paragraph.`))\n return {\n node: {\n type: 'paragraph',\n attrs: { blockId: null },\n content: textContentOf(node).length > 0 ? [{ type: 'text', text: textContentOf(node) }] : undefined,\n },\n issues,\n changed: true,\n }\n }\n return { node, issues, changed: false }\n }\n\n const attrs = { ...(node.attrs ?? {}) }\n if (node.type === 'heading' && !isValidHeadingLevel(attrs.level)) {\n issues.push(issue('ATTR_INVALID', mode === 'repair' ? 'warn' : 'error', `${path}.attrs.level`, 'Heading level must be 1-6.'))\n if (mode === 'repair') {\n attrs.level = 1\n changed = true\n }\n }\n\n const content = node.content?.map((child, index) => {\n const result = preflightNode(child, schema, `${path}.content[${index}]`, mode)\n issues.push(...result.issues)\n if (result.changed) changed = true\n return result.node\n })\n\n const marks = node.marks?.flatMap((mark, index) => {\n if (!schema.marks[mark.type]) {\n issues.push(issue('MARK_UNKNOWN', mode === 'repair' ? 'warn' : 'error', `${path}.marks[${index}]`, `Unknown mark \"${mark.type}\".`))\n if (mode === 'repair') {\n issues.push(issue('FALLBACK_APPLIED', 'info', `${path}.marks[${index}]`, `Unknown mark \"${mark.type}\" dropped.`))\n changed = true\n return []\n }\n }\n if (mark.type === 'link' && !isSafeHref(mark.attrs?.href)) {\n issues.push(issue('ATTR_INVALID', mode === 'repair' ? 'warn' : 'error', `${path}.marks[${index}].attrs.href`, 'Unsafe link href.'))\n if (mode === 'repair') {\n changed = true\n return []\n }\n }\n return [mark]\n })\n\n const nextNode: ProseMirrorNodeJSON = {\n ...node,\n attrs: Object.keys(attrs).length > 0 ? attrs : undefined,\n content,\n marks: marks && marks.length > 0 ? marks : undefined,\n }\n return { node: nextNode, issues, changed }\n}\n\nfunction isValidHeadingLevel(value: unknown): boolean {\n return Number.isInteger(value) && typeof value === 'number' && value >= 1 && value <= 6\n}\n\nfunction isSafeHref(value: unknown): boolean {\n if (typeof value !== 'string') return false\n try {\n const url = new URL(value, 'https://refinex.local')\n return ['http:', 'https:', 'mailto:'].includes(url.protocol)\n } catch {\n return false\n }\n}\n\nfunction textContentOf(node: ProseMirrorNodeJSON): string {\n if (typeof node.text === 'string') return node.text\n return node.content?.map((child) => textContentOf(child)).join('') ?? ''\n}\n\nexport * from './rich-blocks'\n"],"names":["TABLE_TEXT_COLORS","TABLE_BACKGROUND_COLORS","richBlockAttrs","richCapabilities","defineNode","name","spec","options","blockId","richBlockExtensionNames","createRichBlockSchemaExtensions","specs","tableNodes","dom","align","value","attrs","tableColorValue","width","el","image","normalizeAlign","normalizePercent","normalizeImageStatus","node","normalizeCalloutKind","normalizeToggleCollapsed","collapsed","normalizeEmbedType","normalizeEmbedStatus","normalizeDividerVariant","richBlockSchemaExtensions","numeric","palette","color","REFINEX_DOC_VERSION","REFINEX_SCHEMA_ID","REFINEX_SCHEMA_VERSION","blockAttrs","baseBlockIdNodeNames","baseNodes","progress","previewSrc","fileName","status","error","baseMarks","mark","backgroundColor","registerNodeSpec","registerMarkSpec","createRefinexSchema","nodes","marks","names","extension","assertExtensionName","validateNodeExtension","Schema","defaultSchema","schema","createBlockId","bytes","_a","byte","isBlockIdNode","normalizeDocIds","doc","_schema","createId","seen","issues","changed","normalizeNode","path","issue","isValidBlockId","_blockId","rest","children","child","_offset","index","content","Fragment","sameContent","blockIdPluginKey","PluginKey","createBlockIdPlugin","Plugin","transactions","_oldState","newState","transaction","updates","pos","tr","update","createRefinexDoc","contentJSON","ProseMirrorNode","_b","_c","_d","_e","validateDoc","input","isRecord","refinexDoc","entry","extensionIssues","findMissingExtensions","preflight","preflightNode","parsed","normalized","nextDoc","code","severity","message","extensions","registered","mode","textContentOf","isValidHeadingLevel","result","isSafeHref","url"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"rich-blocks.d.ts","sourceRoot":"","sources":["../src/rich-blocks.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAwB,sBAAsB,EAAE,MAAM,SAAS,CAAC;AAgC5E,MAAM,MAAM,eAAe,GAAG,MAAM,GAAG,QAAQ,GAAG,OAAO,CAAC;AAC1D,MAAM,MAAM,gBAAgB,GAAG,OAAO,GAAG,OAAO,GAAG,WAAW,GAAG,OAAO,CAAC;AACzE,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,KAAK,GAAG,WAAW,GAAG,SAAS,GAAG,SAAS,CAAC;AAC/E,MAAM,MAAM,SAAS,GAAG,UAAU,GAAG,QAAQ,GAAG,QAAQ,CAAC;AACzD,MAAM,MAAM,WAAW,GAAG,YAAY,GAAG,SAAS,GAAG,OAAO,GAAG,OAAO,CAAC;AACvE,MAAM,MAAM,cAAc,GAAG,OAAO,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAC3D,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,OAAO,CAAC;AAC3C,MAAM,MAAM,cAAc,GAAG,QAAQ,GAAG,MAAM,CAAC;AAC/C,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IAClD,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;CACtD;AAED,eAAO,MAAM,uBAAuB,wMAe1B,CAAC;AAEX,MAAM,MAAM,sBAAsB,GAAG,CAAC,OAAO,uBAAuB,CAAC,CAAC,MAAM,CAAC,CAAC;AAE9E,wBAAgB,+BAA+B,IAAI,sBAAsB,EAAE,CA8c1E;AAED,eAAO,MAAM,yBAAyB,0BAAoC,CAAC"}
1
+ {"version":3,"file":"rich-blocks.d.ts","sourceRoot":"","sources":["../src/rich-blocks.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAwB,sBAAsB,EAAE,MAAM,SAAS,CAAC;AAwD5E,MAAM,MAAM,eAAe,GAAG,MAAM,GAAG,QAAQ,GAAG,OAAO,CAAC;AAC1D,MAAM,MAAM,gBAAgB,GAAG,OAAO,GAAG,OAAO,GAAG,WAAW,GAAG,OAAO,CAAC;AACzE,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,KAAK,GAAG,WAAW,GAAG,SAAS,GAAG,SAAS,CAAC;AAC/E,MAAM,MAAM,SAAS,GAAG,UAAU,GAAG,QAAQ,GAAG,QAAQ,CAAC;AACzD,MAAM,MAAM,WAAW,GAAG,YAAY,GAAG,SAAS,GAAG,OAAO,GAAG,OAAO,CAAC;AACvE,MAAM,MAAM,cAAc,GAAG,OAAO,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAC3D,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,OAAO,CAAC;AAC3C,MAAM,MAAM,cAAc,GAAG,QAAQ,GAAG,MAAM,CAAC;AAC/C,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IAClD,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;CACtD;AAED,eAAO,MAAM,uBAAuB,wMAe1B,CAAC;AAEX,MAAM,MAAM,sBAAsB,GAAG,CAAC,OAAO,uBAAuB,CAAC,CAAC,MAAM,CAAC,CAAC;AAE9E,wBAAgB,+BAA+B,IAAI,sBAAsB,EAAE,CA4d1E;AAED,eAAO,MAAM,yBAAyB,0BAAoC,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@refinex-md/model",
3
- "version": "0.1.0-canary.1",
3
+ "version": "0.1.0-canary.2",
4
4
  "description": "Structured RefinexDoc model, schema, block IDs, and validation.",
5
5
  "type": "module",
6
6
  "license": "MIT",