@valbuild/shared 0.49.0 → 0.51.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,79 +1,25 @@
1
1
  import { VAL_EXTENSION, Internal, FILE_REF_PROP } from '@valbuild/core';
2
2
  import * as marked from 'marked';
3
+ import { z } from 'zod';
3
4
 
4
- function _arrayWithHoles(arr) {
5
- if (Array.isArray(arr)) return arr;
6
- }
7
-
8
- function _iterableToArrayLimit(r, l) {
9
- var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"];
10
- if (null != t) {
11
- var e,
12
- n,
13
- i,
14
- u,
15
- a = [],
16
- f = !0,
17
- o = !1;
18
- try {
19
- if (i = (t = t.call(r)).next, 0 === l) {
20
- if (Object(t) !== t) return;
21
- f = !1;
22
- } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0);
23
- } catch (r) {
24
- o = !0, n = r;
25
- } finally {
26
- try {
27
- if (!f && null != t.return && (u = t.return(), Object(u) !== u)) return;
28
- } finally {
29
- if (o) throw n;
30
- }
31
- }
32
- return a;
33
- }
34
- }
35
-
36
- function _arrayLikeToArray(arr, len) {
37
- if (len == null || len > arr.length) len = arr.length;
38
- for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i];
39
- return arr2;
40
- }
41
-
42
- function _unsupportedIterableToArray(o, minLen) {
43
- if (!o) return;
44
- if (typeof o === "string") return _arrayLikeToArray(o, minLen);
45
- var n = Object.prototype.toString.call(o).slice(8, -1);
46
- if (n === "Object" && o.constructor) n = o.constructor.name;
47
- if (n === "Map" || n === "Set") return Array.from(o);
48
- if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);
49
- }
50
-
51
- function _nonIterableRest() {
52
- throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
53
- }
54
-
55
- function _slicedToArray(arr, i) {
56
- return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest();
57
- }
58
-
59
- function _toPrimitive(input, hint) {
60
- if (typeof input !== "object" || input === null) return input;
61
- var prim = input[Symbol.toPrimitive];
62
- if (prim !== undefined) {
63
- var res = prim.call(input, hint || "default");
64
- if (typeof res !== "object") return res;
5
+ function toPrimitive(t, r) {
6
+ if ("object" != typeof t || !t) return t;
7
+ var e = t[Symbol.toPrimitive];
8
+ if (void 0 !== e) {
9
+ var i = e.call(t, r || "default");
10
+ if ("object" != typeof i) return i;
65
11
  throw new TypeError("@@toPrimitive must return a primitive value.");
66
12
  }
67
- return (hint === "string" ? String : Number)(input);
13
+ return ("string" === r ? String : Number)(t);
68
14
  }
69
15
 
70
- function _toPropertyKey(arg) {
71
- var key = _toPrimitive(arg, "string");
72
- return typeof key === "symbol" ? key : String(key);
16
+ function toPropertyKey(t) {
17
+ var i = toPrimitive(t, "string");
18
+ return "symbol" == typeof i ? i : String(i);
73
19
  }
74
20
 
75
21
  function _defineProperty(obj, key, value) {
76
- key = _toPropertyKey(key);
22
+ key = toPropertyKey(key);
77
23
  if (key in obj) {
78
24
  Object.defineProperty(obj, key, {
79
25
  value: value,
@@ -87,6 +33,21 @@ function _defineProperty(obj, key, value) {
87
33
  return obj;
88
34
  }
89
35
 
36
+ function _arrayLikeToArray(arr, len) {
37
+ if (len == null || len > arr.length) len = arr.length;
38
+ for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i];
39
+ return arr2;
40
+ }
41
+
42
+ function _unsupportedIterableToArray(o, minLen) {
43
+ if (!o) return;
44
+ if (typeof o === "string") return _arrayLikeToArray(o, minLen);
45
+ var n = Object.prototype.toString.call(o).slice(8, -1);
46
+ if (n === "Object" && o.constructor) n = o.constructor.name;
47
+ if (n === "Map" || n === "Set") return Array.from(o);
48
+ if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);
49
+ }
50
+
90
51
  function _createForOfIteratorHelper(o, allowArrayLike) {
91
52
  var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"];
92
53
  if (!it) {
@@ -155,6 +116,46 @@ function _toConsumableArray(arr) {
155
116
  return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread();
156
117
  }
157
118
 
119
+ function _arrayWithHoles(arr) {
120
+ if (Array.isArray(arr)) return arr;
121
+ }
122
+
123
+ function _iterableToArrayLimit(r, l) {
124
+ var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"];
125
+ if (null != t) {
126
+ var e,
127
+ n,
128
+ i,
129
+ u,
130
+ a = [],
131
+ f = !0,
132
+ o = !1;
133
+ try {
134
+ if (i = (t = t.call(r)).next, 0 === l) {
135
+ if (Object(t) !== t) return;
136
+ f = !1;
137
+ } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0);
138
+ } catch (r) {
139
+ o = !0, n = r;
140
+ } finally {
141
+ try {
142
+ if (!f && null != t.return && (u = t.return(), Object(u) !== u)) return;
143
+ } finally {
144
+ if (o) throw n;
145
+ }
146
+ }
147
+ return a;
148
+ }
149
+ }
150
+
151
+ function _nonIterableRest() {
152
+ throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
153
+ }
154
+
155
+ function _slicedToArray(arr, i) {
156
+ return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest();
157
+ }
158
+
158
159
  var EXT_TO_MIME_TYPES = {
159
160
  x3d: "application/vnd.hzn-3d-crossword",
160
161
  "3gp": "video/3gpp",
@@ -877,16 +878,18 @@ function filenameToMimeType(filename) {
877
878
  }
878
879
  }
879
880
 
880
- var HeaderRegEx = /^h([\d+])$/;
881
- function lexicalToRichTextSource(node) {
882
- var markdownIRBlocks = node.children.map(createBlock);
883
- return fromIRToRichTextSource(markdownIRBlocks);
881
+ function remirrorToRichTextSource(node) {
882
+ var files = {};
883
+ var markdownIRBlocks = node.content.map(function (child) {
884
+ return createBlock(child, files);
885
+ });
886
+ return fromIRToRichTextSource(markdownIRBlocks, files);
884
887
  }
885
- function createBlock(node) {
888
+ function createBlock(node, files) {
886
889
  if (node.type === "heading") {
887
- var _node$tag$match;
890
+ var _node$attrs, _node$content;
888
891
  var headingTag = "";
889
- var depth = Number((_node$tag$match = node.tag.match(HeaderRegEx)) === null || _node$tag$match === void 0 ? void 0 : _node$tag$match[1]);
892
+ var depth = ((_node$attrs = node.attrs) === null || _node$attrs === void 0 ? void 0 : _node$attrs.level) || 1;
890
893
  if (Number.isNaN(depth)) {
891
894
  throw new Error("Invalid header depth");
892
895
  }
@@ -896,10 +899,13 @@ function createBlock(node) {
896
899
  var headingText = ["".concat(headingTag, " ")];
897
900
  return {
898
901
  type: "block",
899
- children: headingText.concat.apply(headingText, _toConsumableArray(node.children.map(transformLeafNode)))
902
+ children: headingText.concat.apply(headingText, _toConsumableArray(((_node$content = node.content) === null || _node$content === void 0 ? void 0 : _node$content.map(function (child) {
903
+ return transformLeafNode(child, files);
904
+ })) || []))
900
905
  };
901
906
  } else if (node.type === "paragraph") {
902
- if (node.children.length === 0) {
907
+ var _node$content2;
908
+ if (!node.content || ((_node$content2 = node.content) === null || _node$content2 === void 0 ? void 0 : _node$content2.length) === 0) {
903
909
  return {
904
910
  type: "block",
905
911
  children: ["<br />"]
@@ -907,26 +913,26 @@ function createBlock(node) {
907
913
  }
908
914
  return {
909
915
  type: "block",
910
- children: node.children.map(function (child) {
911
- return transformLeafNode(child);
916
+ children: node.content.map(function (child) {
917
+ return transformLeafNode(child, files);
912
918
  })
913
919
  };
914
- } else if (node.type === "list") {
920
+ } else if (node.type === "bulletList" || node.type === "orderedList") {
921
+ var _node$content3;
915
922
  return {
916
923
  type: "block",
917
- children: node.children.flatMap(function (child, i) {
918
- return formatListItemNode(getListPrefix(node), child, 0, i === 0);
919
- })
924
+ children: ((_node$content3 = node.content) === null || _node$content3 === void 0 ? void 0 : _node$content3.flatMap(function (child, i) {
925
+ return formatListItemNode(getListPrefix(node), child, 0, files, i === 0);
926
+ })) || []
920
927
  };
921
928
  } else {
922
929
  var exhaustiveCheck = node;
923
930
  throw new Error("Unhandled node type: ".concat("type" in exhaustiveCheck ? "exhaustiveCheck.type" : "unknown"));
924
931
  }
925
932
  }
926
- function fromIRToRichTextSource(markdownIRBlocks) {
933
+ function fromIRToRichTextSource(markdownIRBlocks, files) {
927
934
  var templateStrings = ["\n"];
928
935
  var exprs = [];
929
- var files = {};
930
936
  for (var blockIdx = 0; blockIdx < markdownIRBlocks.length; blockIdx++) {
931
937
  var block = markdownIRBlocks[blockIdx];
932
938
  var _iterator = _createForOfIteratorHelper(block.children),
@@ -937,10 +943,10 @@ function fromIRToRichTextSource(markdownIRBlocks) {
937
943
  if (typeof child === "string") {
938
944
  templateStrings[templateStrings.length - 1] += child;
939
945
  } else {
940
- if (child.type === "image") {
941
- exprs.push(fromLexicalImageNode(child, files));
942
- } else if (child.type === "link") {
943
- exprs.push(fromLexicalLinkNode(child));
946
+ if (child._type === "file") {
947
+ exprs.push(child);
948
+ } else if (child._type === "link") {
949
+ exprs.push(child);
944
950
  } else {
945
951
  var exhaustiveCheck = child;
946
952
  throw new Error("Unexpected node type: ".concat(JSON.stringify(exhaustiveCheck, null, 2)));
@@ -962,7 +968,17 @@ function fromIRToRichTextSource(markdownIRBlocks) {
962
968
  return _defineProperty(_defineProperty(_defineProperty(_defineProperty({}, VAL_EXTENSION, "richtext"), "templateStrings", templateStrings), "exprs", exprs), "files", files);
963
969
  }
964
970
  function formatText(node) {
965
- var classes = typeof node.format === "number" ? fromLexicalFormat(node.format) : [];
971
+ var _node$marks;
972
+ var classes = ((_node$marks = node.marks) === null || _node$marks === void 0 ? void 0 : _node$marks.flatMap(function (mark) {
973
+ if (mark.type === "bold") {
974
+ return ["bold"];
975
+ } else if (mark.type === "italic") {
976
+ return ["italic"];
977
+ } else if (mark.type === "strike") {
978
+ return ["line-through"];
979
+ }
980
+ return [];
981
+ })) || [];
966
982
  var text = node.text.trimStart();
967
983
  var prefixWS = node.text.length - text.length;
968
984
  text = text.trimEnd();
@@ -981,87 +997,94 @@ function formatText(node) {
981
997
  // text = splitIntoChunks(text);
982
998
  return "".concat(" ".repeat(prefixWS)).concat(text).concat(" ".repeat(suffixWS));
983
999
  }
984
- function transformLeafNode(node) {
1000
+ function transformLeafNode(node, files) {
985
1001
  if (node.type === "text") {
1002
+ var _node$marks2;
1003
+ var linkMark = (_node$marks2 = node.marks) === null || _node$marks2 === void 0 ? void 0 : _node$marks2.find(function (mark) {
1004
+ return mark.type === "link";
1005
+ });
1006
+ if ((linkMark === null || linkMark === void 0 ? void 0 : linkMark.type) === "link") {
1007
+ return {
1008
+ _type: "link",
1009
+ href: linkMark.attrs.href,
1010
+ children: [formatText(node)]
1011
+ };
1012
+ }
986
1013
  return formatText(node);
987
- } else if (node.type === "linebreak") {
988
- return "\n";
1014
+ } else if (node.type === "hardBreak") {
1015
+ return "<br />";
1016
+ } else if (node.type === "image") {
1017
+ return fromRemirrorImageNode(node, files);
989
1018
  } else {
990
- return node;
1019
+ var exhaustiveCheck = node;
1020
+ throw new Error("Unexpected node type: ".concat(JSON.stringify(exhaustiveCheck)));
991
1021
  }
992
1022
  }
993
- function formatListItemNode(listPrefix, node, indent) {
994
- var _node$children;
995
- var isFirstTopLevelListItem = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;
1023
+ function formatListItemNode(listPrefix, node, indent, files) {
1024
+ var _node$content4, _node$content5;
1025
+ var isFirstTopLevelListItem = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false;
996
1026
  var newLine = isFirstTopLevelListItem ? "" : "\n";
997
1027
  var prefix = ["".concat(newLine).concat(" ".repeat(indent)).concat(listPrefix)];
998
- if (((_node$children = node.children) === null || _node$children === void 0 || (_node$children = _node$children[0]) === null || _node$children === void 0 ? void 0 : _node$children.type) !== "list") {
1028
+ if (!(((_node$content4 = node.content) === null || _node$content4 === void 0 || (_node$content4 = _node$content4[0]) === null || _node$content4 === void 0 ? void 0 : _node$content4.type) === "bulletList" || ((_node$content5 = node.content) === null || _node$content5 === void 0 || (_node$content5 = _node$content5[0]) === null || _node$content5 === void 0 ? void 0 : _node$content5.type) === "orderedList")) {
999
1029
  prefix.push(" ");
1000
1030
  }
1001
- return prefix.concat(node.children.flatMap(function (child) {
1002
- if (child.type === "list") {
1003
- return child.children.flatMap(function (subChild) {
1004
- return formatListItemNode(getListPrefix(child), subChild, indent + 4);
1031
+ return prefix.concat((node.content || []).flatMap(function (child, i) {
1032
+ if (child.type === "bulletList" || child.type === "orderedList") {
1033
+ return (child.content || []).flatMap(function (subChild) {
1034
+ return formatListItemNode(getListPrefix(child), subChild, indent + 4, files);
1005
1035
  });
1006
1036
  } else {
1007
- return [transformLeafNode(child)];
1037
+ return (child.content || []).flatMap(function (subChild) {
1038
+ var _child$content, _child$content2;
1039
+ var res = [];
1040
+ if ((_child$content = child.content) !== null && _child$content !== void 0 && _child$content.length && ((_child$content2 = child.content) === null || _child$content2 === void 0 ? void 0 : _child$content2.length) > 0 && i > 0) {
1041
+ res.push("<br />\n");
1042
+ }
1043
+ res.push(transformLeafNode(subChild, files));
1044
+ return res;
1045
+ });
1008
1046
  }
1009
1047
  }));
1010
1048
  }
1011
1049
  function getListPrefix(node) {
1012
- if (node.listType === "bullet") {
1050
+ if (node.type === "bulletList") {
1013
1051
  return "-";
1014
- } else if (node.listType === "number") {
1052
+ } else if (node.type === "orderedList") {
1015
1053
  return "1.";
1016
1054
  } else {
1017
- throw new Error("Unhandled list type: ".concat(node.listType));
1055
+ var exhaustiveCheck = node;
1056
+ throw new Error("Unhandled list node: ".concat(JSON.stringify(exhaustiveCheck)));
1018
1057
  }
1019
1058
  }
1020
- var FORMAT_MAPPING$1 = {
1021
- bold: 1,
1022
- // 0001
1023
- italic: 2,
1024
- // 0010
1025
- "line-through": 4 // 0100
1026
- // underline: 8, // 1000
1027
- };
1028
-
1029
- function fromLexicalFormat(format) {
1030
- return Object.entries(FORMAT_MAPPING$1).flatMap(function (_ref2) {
1031
- var _ref3 = _slicedToArray(_ref2, 2),
1032
- key = _ref3[0],
1033
- value = _ref3[1];
1034
- if ((value & /* bitwise and */format) === value) {
1035
- return [key];
1036
- }
1037
- return [];
1038
- });
1039
- }
1040
1059
  var textEncoder = new TextEncoder();
1041
- function fromLexicalImageNode(node, files) {
1042
- if (node.src.startsWith("data:")) {
1043
- var sha256 = Internal.getSHA256Hash(textEncoder.encode(node.src));
1044
- var mimeType = getMimeType(node.src);
1060
+ function fromRemirrorImageNode(node, files) {
1061
+ if (node.attrs && node.attrs.src.startsWith("data:")) {
1062
+ var sha256 = Internal.getSHA256Hash(textEncoder.encode(node.attrs.src));
1063
+ var mimeType = getMimeType(node.attrs.src);
1045
1064
  if (mimeType === undefined) {
1046
- throw new Error("Could not detect Mime Type for image: ".concat(node.src));
1065
+ throw new Error("Could not detect Mime Type for image: ".concat(node.attrs.src));
1047
1066
  }
1048
1067
  var fileExt = mimeTypeToFileExt(mimeType);
1049
- var filePath = "/public/".concat(sha256, ".").concat(fileExt);
1050
- files[filePath] = node.src;
1068
+ var fileName = node.attrs.fileName || "".concat(sha256, ".").concat(fileExt);
1069
+ var filePath = "/public/".concat(fileName);
1070
+ files[filePath] = node.attrs.src;
1051
1071
  return _defineProperty(_defineProperty(_defineProperty({}, VAL_EXTENSION, "file"), FILE_REF_PROP, filePath), "metadata", {
1052
- width: node.width || 0,
1053
- height: node.height || 0,
1072
+ width: typeof node.attrs.width === "number" ? node.attrs.width : 0,
1073
+ height: typeof node.attrs.height === "number" ? node.attrs.height : 0,
1054
1074
  sha256: sha256 || "",
1055
1075
  mimeType: mimeType
1056
1076
  });
1057
- } else {
1058
- var _sha = getParam("sha256", node.src);
1059
- return _defineProperty(_defineProperty(_defineProperty({}, VAL_EXTENSION, "file"), FILE_REF_PROP, "/public".concat(node.src.split("?")[0])), "metadata", {
1060
- width: node.width || 0,
1061
- height: node.height || 0,
1077
+ } else if (node.attrs) {
1078
+ var _sha = getParam("sha256", node.attrs.src);
1079
+ var noParamsSrc = node.attrs.src.split("?")[0];
1080
+ return _defineProperty(_defineProperty(_defineProperty({}, VAL_EXTENSION, "file"), FILE_REF_PROP, "/public".concat(node.attrs.src.split("?")[0])), "metadata", {
1081
+ width: typeof node.attrs.width === "number" ? node.attrs.width : 0,
1082
+ height: typeof node.attrs.height === "number" ? node.attrs.height : 0,
1062
1083
  sha256: _sha || "",
1063
- mimeType: node.mimeType || ""
1084
+ mimeType: noParamsSrc && filenameToMimeType(noParamsSrc) || ""
1064
1085
  });
1086
+ } else {
1087
+ throw new Error("Invalid image node (no attrs): " + JSON.stringify(node));
1065
1088
  }
1066
1089
  }
1067
1090
  function getParam(param, url) {
@@ -1076,196 +1099,6 @@ function getParam(param, url) {
1076
1099
  }
1077
1100
  return undefined;
1078
1101
  }
1079
- function fromLexicalLinkNode(node) {
1080
- return _defineProperty(_defineProperty(_defineProperty({}, VAL_EXTENSION, "link"), "href", node.url), "children", node.children.map(formatText));
1081
- }
1082
-
1083
- function ownKeys(e, r) {
1084
- var t = Object.keys(e);
1085
- if (Object.getOwnPropertySymbols) {
1086
- var o = Object.getOwnPropertySymbols(e);
1087
- r && (o = o.filter(function (r) {
1088
- return Object.getOwnPropertyDescriptor(e, r).enumerable;
1089
- })), t.push.apply(t, o);
1090
- }
1091
- return t;
1092
- }
1093
- function _objectSpread2(e) {
1094
- for (var r = 1; r < arguments.length; r++) {
1095
- var t = null != arguments[r] ? arguments[r] : {};
1096
- r % 2 ? ownKeys(Object(t), !0).forEach(function (r) {
1097
- _defineProperty(e, r, t[r]);
1098
- }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) {
1099
- Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r));
1100
- });
1101
- }
1102
- return e;
1103
- }
1104
-
1105
- /// Serialized Lexical Nodes:
1106
- // TODO: replace with Lexical libs types - not currently exported?
1107
- var COMMON_LEXICAL_PROPS = {
1108
- version: 1,
1109
- format: "",
1110
- indent: 0,
1111
- direction: null
1112
- };
1113
- function toLexicalNode(node) {
1114
- var useBreakNode = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
1115
- if (typeof node === "string") {
1116
- return _objectSpread2(_objectSpread2({}, COMMON_LEXICAL_PROPS), {}, {
1117
- type: "text",
1118
- format: "",
1119
- text: node
1120
- });
1121
- }
1122
- if ("tag" in node) {
1123
- switch (node.tag) {
1124
- case "h1":
1125
- return toLexicalHeadingNode(node);
1126
- case "h2":
1127
- return toLexicalHeadingNode(node);
1128
- case "h3":
1129
- return toLexicalHeadingNode(node);
1130
- case "h4":
1131
- return toLexicalHeadingNode(node);
1132
- case "h5":
1133
- return toLexicalHeadingNode(node);
1134
- case "h6":
1135
- return toLexicalHeadingNode(node);
1136
- case "li":
1137
- return toLexicalListItemNode(node);
1138
- case "p":
1139
- return toLexicalParagraphNode(node);
1140
- case "ul":
1141
- return toLexicalListNode(node);
1142
- case "ol":
1143
- return toLexicalListNode(node);
1144
- case "span":
1145
- return toLexicalTextNode(node);
1146
- case "a":
1147
- return toLexicalLinkNode(node);
1148
- case "img":
1149
- return toLexicalImageNode(node);
1150
- case "br":
1151
- if (useBreakNode) {
1152
- return _objectSpread2(_objectSpread2({}, COMMON_LEXICAL_PROPS), {}, {
1153
- type: "linebreak"
1154
- });
1155
- }
1156
- return toLexicalPseudoLineBreakNode();
1157
- default:
1158
- throw Error("Unexpected node tag: " + JSON.stringify(node, null, 2));
1159
- }
1160
- } else {
1161
- throw Error("Unexpected node: " + JSON.stringify(node, null, 2));
1162
- }
1163
- }
1164
- function toLexicalImageNode(node) {
1165
- var url = node.src;
1166
- return _objectSpread2(_objectSpread2({}, COMMON_LEXICAL_PROPS), {}, {
1167
- type: "image",
1168
- src: url,
1169
- width: node.width,
1170
- height: node.height,
1171
- mimeType: node.mimeType
1172
- // TODO: altText
1173
- });
1174
- }
1175
-
1176
- function toLexicalLinkNode(link) {
1177
- return _objectSpread2(_objectSpread2({}, COMMON_LEXICAL_PROPS), {}, {
1178
- type: "link",
1179
- url: link.href,
1180
- children: link.children.map(function (child) {
1181
- return toLexicalNode(child);
1182
- })
1183
- });
1184
- }
1185
- function richTextSourceToLexical(richtext) {
1186
- return _objectSpread2(_objectSpread2({}, COMMON_LEXICAL_PROPS), {}, {
1187
- format: "",
1188
- type: "root",
1189
- children: richtext.children.map(function (child) {
1190
- return toLexicalNode(child);
1191
- })
1192
- });
1193
- }
1194
- function toLexicalHeadingNode(heading) {
1195
- return _objectSpread2(_objectSpread2({}, COMMON_LEXICAL_PROPS), {}, {
1196
- type: "heading",
1197
- tag: heading.tag,
1198
- children: heading.children.map(function (child) {
1199
- return toLexicalNode(child);
1200
- })
1201
- });
1202
- }
1203
- function toLexicalParagraphNode(paragraph) {
1204
- return _objectSpread2(_objectSpread2({}, COMMON_LEXICAL_PROPS), {}, {
1205
- type: "paragraph",
1206
- children: paragraph.children.map(function (child) {
1207
- return toLexicalNode(child, true);
1208
- })
1209
- });
1210
- }
1211
-
1212
- // Lexical does not support line breaks, so we convert them to empty paragraphs
1213
- function toLexicalPseudoLineBreakNode() {
1214
- return _objectSpread2(_objectSpread2({}, COMMON_LEXICAL_PROPS), {}, {
1215
- type: "paragraph",
1216
- children: []
1217
- });
1218
- }
1219
- function toLexicalListItemNode(listItem) {
1220
- return _objectSpread2(_objectSpread2({}, COMMON_LEXICAL_PROPS), {}, {
1221
- type: "listitem",
1222
- children: listItem.children.map(function (child) {
1223
- return toLexicalNode(child, true);
1224
- })
1225
- });
1226
- }
1227
- function toLexicalListNode(list) {
1228
- return _objectSpread2(_objectSpread2({}, COMMON_LEXICAL_PROPS), {}, {
1229
- type: "list",
1230
- listType: list.tag === "ol" ? "number" : "bullet",
1231
- children: list.children.map(function (child) {
1232
- return toLexicalNode(child);
1233
- })
1234
- }, list.dir ? {
1235
- direction: list.dir
1236
- } : {
1237
- direction: null
1238
- });
1239
- }
1240
- var FORMAT_MAPPING = {
1241
- bold: 1,
1242
- // 0001
1243
- italic: 2,
1244
- // 0010
1245
- "line-through": 4 // 0100
1246
- // underline: 8, // 1000
1247
- };
1248
-
1249
- function toLexicalFormat(classes) {
1250
- return classes.reduce(function (prev, curr) {
1251
- return prev | /* bitwise or */FORMAT_MAPPING[curr];
1252
- }, 0);
1253
- }
1254
- function toLexicalTextNode(spanNode) {
1255
- var child = spanNode.children[0];
1256
- if (typeof child === "string") {
1257
- return _objectSpread2(_objectSpread2({}, COMMON_LEXICAL_PROPS), {}, {
1258
- type: "text",
1259
- text: child,
1260
- format: toLexicalFormat(spanNode.classes)
1261
- });
1262
- } else {
1263
- // recurse the spans and merge their classes
1264
- return toLexicalTextNode(_objectSpread2(_objectSpread2({}, child), {}, {
1265
- classes: spanNode.classes.concat(child.classes)
1266
- }));
1267
- }
1268
- }
1269
1102
 
1270
1103
  var VAL_START_TAG_PREFIX = '<val value="';
1271
1104
  var VAL_START_TAG_SUFFIX = '">';
@@ -1273,6 +1106,18 @@ var VAL_END_TAG = "</val>";
1273
1106
  function parseTokens(tokens, sourceNodes, cursor) {
1274
1107
  var insideList = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;
1275
1108
  var children = [];
1109
+ function merge(token, clazz) {
1110
+ var parsedTokens = parseTokens(token.tokens ? token.tokens : [], sourceNodes, 0);
1111
+ children.push({
1112
+ tag: "span",
1113
+ classes: [clazz].concat(parsedTokens.children.flatMap(function (child) {
1114
+ return typeof child === "string" ? [] : child.classes;
1115
+ })),
1116
+ children: parsedTokens.children.flatMap(function (child) {
1117
+ return typeof child === "string" ? child : child.children;
1118
+ })
1119
+ });
1120
+ }
1276
1121
  var _loop = function _loop() {
1277
1122
  var token = tokens[cursor];
1278
1123
  if (token.type === "heading") {
@@ -1286,23 +1131,11 @@ function parseTokens(tokens, sourceNodes, cursor) {
1286
1131
  children: parseTokens(token.tokens ? token.tokens : [], sourceNodes, 0).children
1287
1132
  });
1288
1133
  } else if (token.type === "strong") {
1289
- children.push({
1290
- tag: "span",
1291
- classes: ["bold"],
1292
- children: parseTokens(token.tokens ? token.tokens : [], sourceNodes, 0).children
1293
- });
1134
+ merge(token, "bold");
1294
1135
  } else if (token.type === "em") {
1295
- children.push({
1296
- tag: "span",
1297
- classes: ["italic"],
1298
- children: parseTokens(token.tokens ? token.tokens : [], sourceNodes, 0).children
1299
- });
1136
+ merge(token, "italic");
1300
1137
  } else if (token.type === "del") {
1301
- children.push({
1302
- tag: "span",
1303
- classes: ["line-through"],
1304
- children: parseTokens(token.tokens ? token.tokens : [], sourceNodes, 0).children
1305
- });
1138
+ merge(token, "line-through");
1306
1139
  } else if (token.type === "text") {
1307
1140
  if ("tokens" in token && Array.isArray(token.tokens)) {
1308
1141
  children.push.apply(children, _toConsumableArray(parseTokens(token.tokens, sourceNodes, cursor, insideList).children));
@@ -1311,6 +1144,11 @@ function parseTokens(tokens, sourceNodes, cursor) {
1311
1144
  var lines = token.raw.split("\n");
1312
1145
  var tags = lines.flatMap(function (line, i) {
1313
1146
  if (i === lines.length - 1) return [line];
1147
+ if (i === lines.length - 1 && line === "") return [];
1148
+ if (line === "") return {
1149
+ tag: "br",
1150
+ children: []
1151
+ };
1314
1152
  return [line, {
1315
1153
  tag: "br",
1316
1154
  children: []
@@ -1380,10 +1218,16 @@ function parseTokens(tokens, sourceNodes, cursor) {
1380
1218
  }
1381
1219
  var br_html_regex = /<br\s*\/?>/gi; // matches <br>, <br/>, <br />; case insensitive
1382
1220
  if (token.text.trim().match(br_html_regex)) {
1221
+ var _tokens;
1383
1222
  children.push({
1384
1223
  tag: "br",
1385
1224
  children: []
1386
1225
  });
1226
+ if (((_tokens = tokens[cursor + 1]) === null || _tokens === void 0 ? void 0 : _tokens.raw.trim()) === "") {
1227
+ // if next token is a new line or white-spaces, skip it
1228
+ // this typically means we have a <br> AND a new line, which, semantically, is just a <br>
1229
+ cursor++;
1230
+ }
1387
1231
  }
1388
1232
  } else if (token.type === "link") {
1389
1233
  if (token.raw === token.href) {
@@ -1443,8 +1287,338 @@ function parseRichTextSource(_ref) {
1443
1287
  return _defineProperty(_defineProperty({}, VAL_EXTENSION, "richtext"), "children", children);
1444
1288
  }
1445
1289
 
1290
+ var RemirrorTextMark = z.object({
1291
+ type: z.union([z.literal("bold"), z.literal("strike"), z.literal("italic")])
1292
+ });
1293
+ var RemirrorLinkMark = z.object({
1294
+ type: z.literal("link"),
1295
+ attrs: z.object({
1296
+ href: z.string(),
1297
+ target: z.union([z.literal("_blank"), z["null"]()]),
1298
+ auto: z["boolean"]()
1299
+ })
1300
+ });
1301
+ var RemirrorText = z.intersection(z.object({
1302
+ type: z.literal("text"),
1303
+ text: z.string()
1304
+ }), z.object({
1305
+ marks: z.array(z.union([RemirrorTextMark, RemirrorLinkMark]))
1306
+ }).partial());
1307
+ var RemirrorBr = z.intersection(z.object({
1308
+ type: z.literal("hardBreak")
1309
+ }), z.object({
1310
+ marks: z.array(RemirrorTextMark)
1311
+ }).partial());
1312
+ var RemirrorImage = z.intersection(z.object({
1313
+ type: z.literal("image")
1314
+ }), z.object({
1315
+ attrs: z.intersection(z.object({
1316
+ src: z.string()
1317
+ }), z.object({
1318
+ align: z.union([z.literal("center"), z.literal("end"), z.literal("justify"), z.literal("left"), z.literal("match-parent"), z.literal("right"), z.literal("start"), z["null"]()]),
1319
+ alt: z.union([z.string(), z["null"]()]),
1320
+ height: z.union([z.string(), z.number(), z["null"]()]),
1321
+ width: z.union([z.string(), z.number(), z["null"]()]),
1322
+ rotate: z.union([z.string(), z["null"]()]),
1323
+ title: z.union([z.string(), z["null"]()]),
1324
+ fileName: z.union([z.string(), z["null"]()])
1325
+ }).partial())
1326
+ }).partial());
1327
+ var RemirrorHeading = z.intersection(z.object({
1328
+ type: z.literal("heading")
1329
+ }), z.object({
1330
+ attrs: z.object({
1331
+ level: z.number()
1332
+ }),
1333
+ content: z.array(z.union([RemirrorText, RemirrorBr]))
1334
+ }).partial());
1335
+ var RemirrorBulletList = z.lazy(function () {
1336
+ return z.intersection(z.object({
1337
+ type: z.literal("bulletList")
1338
+ }), z.object({
1339
+ content: z.array(RemirrorListItem)
1340
+ }).partial());
1341
+ });
1342
+ var RemirrorOrderedList = z.lazy(function () {
1343
+ return z.intersection(z.object({
1344
+ type: z.literal("orderedList")
1345
+ }), z.object({
1346
+ content: z.array(RemirrorListItem)
1347
+ }).partial());
1348
+ });
1349
+ var RemirrorListItem = z.lazy(function () {
1350
+ return z.intersection(z.object({
1351
+ type: z.literal("listItem")
1352
+ }), z.object({
1353
+ content: z.array(z.union([RemirrorParagraph, RemirrorBulletList, RemirrorOrderedList]))
1354
+ }).partial());
1355
+ });
1356
+ var RemirrorParagraph = z.intersection(z.object({
1357
+ type: z.literal("paragraph")
1358
+ }), z.object({
1359
+ content: z.array(z.union([RemirrorText, RemirrorImage, RemirrorBr]))
1360
+ }).partial());
1361
+ var RemirrorJSON = z.object({
1362
+ type: z.literal("doc"),
1363
+ content: z.array(z.union([RemirrorParagraph, RemirrorHeading, RemirrorBulletList, RemirrorOrderedList]))
1364
+ });
1365
+
1366
+ function ownKeys(e, r) {
1367
+ var t = Object.keys(e);
1368
+ if (Object.getOwnPropertySymbols) {
1369
+ var o = Object.getOwnPropertySymbols(e);
1370
+ r && (o = o.filter(function (r) {
1371
+ return Object.getOwnPropertyDescriptor(e, r).enumerable;
1372
+ })), t.push.apply(t, o);
1373
+ }
1374
+ return t;
1375
+ }
1376
+ function _objectSpread2(e) {
1377
+ for (var r = 1; r < arguments.length; r++) {
1378
+ var t = null != arguments[r] ? arguments[r] : {};
1379
+ r % 2 ? ownKeys(Object(t), !0).forEach(function (r) {
1380
+ _defineProperty(e, r, t[r]);
1381
+ }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) {
1382
+ Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r));
1383
+ });
1384
+ }
1385
+ return e;
1386
+ }
1387
+
1388
+ function richTextToRemirror(richtext) {
1389
+ return {
1390
+ type: "doc",
1391
+ content: richtext.children.map(function (child) {
1392
+ return toRemirrorNode(child);
1393
+ })
1394
+ };
1395
+ }
1396
+ function toRemirrorNode(child) {
1397
+ switch (child.tag) {
1398
+ case "h1":
1399
+ return convertHeadingToRemirror(1, child.children);
1400
+ case "h2":
1401
+ return convertHeadingToRemirror(2, child.children);
1402
+ case "h3":
1403
+ return convertHeadingToRemirror(3, child.children);
1404
+ case "h4":
1405
+ return convertHeadingToRemirror(4, child.children);
1406
+ case "h5":
1407
+ return convertHeadingToRemirror(5, child.children);
1408
+ case "h6":
1409
+ return convertHeadingToRemirror(6, child.children);
1410
+ case "p":
1411
+ return convertParagraphToRemirror(child.children);
1412
+ case "ul":
1413
+ return convertUlToRemirror(child);
1414
+ case "ol":
1415
+ return convertOlToRemirror(child);
1416
+ case "br":
1417
+ return convertParagraphToRemirror([child]);
1418
+ default:
1419
+ {
1420
+ var _exhaustiveCheck = child;
1421
+ throw Error("Unexpected child node: " + JSON.stringify(_exhaustiveCheck));
1422
+ }
1423
+ }
1424
+ }
1425
+ function convertHeadingToRemirror(level, children) {
1426
+ return {
1427
+ type: "heading",
1428
+ attrs: {
1429
+ level: level
1430
+ },
1431
+ content: children.flatMap(convertStringOrSpanNodeToRemirror)
1432
+ };
1433
+ }
1434
+ function convertStringToRemirror(child) {
1435
+ return {
1436
+ type: "text",
1437
+ text: child
1438
+ };
1439
+ }
1440
+ function convertStringOrSpanNodeToRemirror(child) {
1441
+ if (typeof child === "string") {
1442
+ return [convertStringToRemirror(child)];
1443
+ }
1444
+ return convertSpanNodeToRemirror(child);
1445
+ }
1446
+ function convertSpanNodeToRemirror(spanNode) {
1447
+ if (spanNode.classes.length === 0 && spanNode.children.length === 1) {
1448
+ if (typeof spanNode.children[0] === "string") {
1449
+ return [convertStringToRemirror(spanNode.children[0])];
1450
+ } else {
1451
+ // TODO: replace with error logging and something more graceful?
1452
+ throw Error("Unexpected amount of children in span node: " + JSON.stringify(spanNode, null, 2));
1453
+ }
1454
+ }
1455
+ return spanNode.children.map(function (child) {
1456
+ return {
1457
+ type: "text",
1458
+ text: child,
1459
+ marks: spanNode.classes.map(function (className) {
1460
+ switch (className) {
1461
+ case "bold":
1462
+ return {
1463
+ type: "bold"
1464
+ };
1465
+ case "italic":
1466
+ return {
1467
+ type: "italic"
1468
+ };
1469
+ case "line-through":
1470
+ return {
1471
+ type: "strike"
1472
+ };
1473
+ default:
1474
+ {
1475
+ var _exhaustiveCheck = className;
1476
+ throw Error("Unexpected span class: " + _exhaustiveCheck);
1477
+ }
1478
+ }
1479
+ })
1480
+ };
1481
+ });
1482
+ }
1483
+ function convertParagraphToRemirror(children) {
1484
+ return {
1485
+ type: "paragraph",
1486
+ content: children.flatMap(function (child) {
1487
+ if (typeof child === "string") {
1488
+ return [convertStringToRemirror(child)];
1489
+ }
1490
+ switch (child.tag) {
1491
+ case "span":
1492
+ return convertSpanNodeToRemirror(child);
1493
+ case "a":
1494
+ return convertLinkNodeToRemirror(child);
1495
+ case "img":
1496
+ return [convertImageNodeToRemirror(child)];
1497
+ case "br":
1498
+ return [createRemirrorBr()];
1499
+ default:
1500
+ {
1501
+ var _exhaustiveCheck = child;
1502
+ throw Error("Unexpected paragraph child: " + JSON.stringify(_exhaustiveCheck));
1503
+ }
1504
+ }
1505
+ })
1506
+ };
1507
+ }
1508
+ function createRemirrorBr() {
1509
+ return {
1510
+ type: "hardBreak",
1511
+ marks: []
1512
+ };
1513
+ }
1514
+ function convertLinkNodeToRemirror(linkNode) {
1515
+ return linkNode.children.flatMap(convertStringOrSpanNodeToRemirror).map(function (remirrorText) {
1516
+ return _objectSpread2(_objectSpread2({}, remirrorText), {}, {
1517
+ marks: (remirrorText.marks || []).concat({
1518
+ type: "link",
1519
+ attrs: {
1520
+ href: linkNode.href,
1521
+ auto: false,
1522
+ target: null
1523
+ }
1524
+ })
1525
+ });
1526
+ });
1527
+ }
1528
+ function convertImageNodeToRemirror(imageNode) {
1529
+ return {
1530
+ type: "image",
1531
+ attrs: {
1532
+ height: imageNode.height,
1533
+ width: imageNode.width,
1534
+ src: imageNode.src // at time of writing we are not sure if src as href or data url works, also: how to keep mimeType etc?
1535
+ }
1536
+ };
1537
+ }
1538
+ function convertUlToRemirror(ulNode) {
1539
+ return {
1540
+ type: "bulletList",
1541
+ content: ulNode.children.map(convertListItemToRemirror)
1542
+ };
1543
+ }
1544
+ function convertOlToRemirror(olNode) {
1545
+ return {
1546
+ type: "orderedList",
1547
+ content: olNode.children.map(convertListItemToRemirror)
1548
+ };
1549
+ }
1550
+ function convertListItemToRemirror(liNode) {
1551
+ return {
1552
+ type: "listItem",
1553
+ content: convertListItemToRemirrorParagraph(liNode.children)
1554
+ };
1555
+ }
1556
+ function convertListItemToRemirrorParagraph(rtChildren) {
1557
+ var children = [];
1558
+ var _iterator = _createForOfIteratorHelper(rtChildren),
1559
+ _step;
1560
+ try {
1561
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
1562
+ var child = _step.value;
1563
+ var lastChild = children[children.length - 1];
1564
+ if (!lastChild) {
1565
+ lastChild = {
1566
+ type: "paragraph",
1567
+ content: []
1568
+ };
1569
+ children.push(lastChild);
1570
+ }
1571
+ var lastChildContent = lastChild.content;
1572
+ if (typeof child === "string") {
1573
+ lastChildContent.push(convertStringToRemirror(child));
1574
+ } else {
1575
+ switch (child.tag) {
1576
+ case "a":
1577
+ {
1578
+ lastChildContent.push.apply(lastChildContent, _toConsumableArray(convertLinkNodeToRemirror(child)));
1579
+ break;
1580
+ }
1581
+ case "br":
1582
+ {
1583
+ children.push({
1584
+ type: "paragraph",
1585
+ content: [] // create new paragraph
1586
+ });
1587
+ break;
1588
+ }
1589
+ case "span":
1590
+ {
1591
+ lastChildContent.push.apply(lastChildContent, _toConsumableArray(convertSpanNodeToRemirror(child)));
1592
+ break;
1593
+ }
1594
+ case "ol":
1595
+ {
1596
+ children.push(convertOlToRemirror(child));
1597
+ break;
1598
+ }
1599
+ case "ul":
1600
+ {
1601
+ children.push(convertUlToRemirror(child));
1602
+ break;
1603
+ }
1604
+ default:
1605
+ {
1606
+ var _exhaustiveCheck = child;
1607
+ throw Error("Unexpected list item child: " + JSON.stringify(_exhaustiveCheck));
1608
+ }
1609
+ }
1610
+ }
1611
+ }
1612
+ } catch (err) {
1613
+ _iterator.e(err);
1614
+ } finally {
1615
+ _iterator.f();
1616
+ }
1617
+ return children;
1618
+ }
1619
+
1446
1620
  var VAL_SESSION_COOKIE = Internal.VAL_SESSION_COOKIE;
1447
1621
  var VAL_STATE_COOKIE = Internal.VAL_STATE_COOKIE;
1448
1622
  var VAL_ENABLE_COOKIE_NAME = Internal.VAL_ENABLE_COOKIE_NAME;
1449
1623
 
1450
- export { COMMON_LEXICAL_PROPS, EXT_TO_MIME_TYPES, MIME_TYPES_TO_EXT, VAL_ENABLE_COOKIE_NAME, VAL_SESSION_COOKIE, VAL_STATE_COOKIE, filenameToMimeType, fromLexicalFormat, getMimeType, lexicalToRichTextSource, mimeTypeToFileExt, parseRichTextSource, richTextSourceToLexical, toLexicalFormat, toLexicalNode };
1624
+ export { EXT_TO_MIME_TYPES, MIME_TYPES_TO_EXT, RemirrorBr, RemirrorBulletList, RemirrorHeading, RemirrorImage, RemirrorJSON, RemirrorLinkMark, RemirrorListItem, RemirrorOrderedList, RemirrorParagraph, RemirrorText, RemirrorTextMark, VAL_ENABLE_COOKIE_NAME, VAL_SESSION_COOKIE, VAL_STATE_COOKIE, filenameToMimeType, getMimeType, mimeTypeToFileExt, parseRichTextSource, remirrorToRichTextSource, richTextToRemirror };