@mx-space/cli 0.14.1 → 0.15.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.
Files changed (56) hide show
  1. package/README.md +35 -11
  2. package/dist/{Lexical.dev-DTxuYHmG.mjs → Lexical.dev-Cck4n26y.mjs} +998 -584
  3. package/dist/{Lexical.node-BlCLnfA6.mjs → Lexical.node-D6wf2D5M.mjs} +15 -5
  4. package/dist/Lexical.prod-DCwS1oTq.mjs +7170 -0
  5. package/dist/{LexicalClipboard.dev-CdFkLR_D.mjs → LexicalClipboard.dev-CMkPHV7O.mjs} +6 -6
  6. package/dist/{LexicalClipboard.node-ktUajxsv.mjs → LexicalClipboard.node-m4nZ7IYw.mjs} +2 -2
  7. package/dist/{LexicalClipboard.prod-DliyLofW.mjs → LexicalClipboard.prod-B_rN1vE1.mjs} +10 -8
  8. package/dist/{LexicalCodeCore.dev-CL9tHWJX.mjs → LexicalCodeCore.dev-DyJw3i8V.mjs} +62 -72
  9. package/dist/{LexicalCodeCore.prod-BoMSJc29.mjs → LexicalCodeCore.prod-DPXLHQLF.mjs} +212 -213
  10. package/dist/{LexicalDragon.dev-CqW7Aq5H.mjs → LexicalDragon.dev-ZkNfMwrE.mjs} +3 -3
  11. package/dist/{LexicalDragon.node-DLXctJyy.mjs → LexicalDragon.node-Ds9oLUFh.mjs} +2 -2
  12. package/dist/{LexicalDragon.prod-DHI3T6n5.mjs → LexicalDragon.prod-B58ic2av.mjs} +5 -4
  13. package/dist/{LexicalExtension.dev-BP-18zns.mjs → LexicalExtension.dev-DvwHs1Xv.mjs} +79 -67
  14. package/dist/{LexicalExtension.node-BWH6xbzG.mjs → LexicalExtension.node-5OymZQfy.mjs} +4 -2
  15. package/dist/{LexicalExtension.prod-Cs6OgrDn.mjs → LexicalExtension.prod-Ce0T5smQ.mjs} +372 -358
  16. package/dist/{LexicalHeadless.dev-DJp__UcP.mjs → LexicalHeadless.dev-DA0WldSR.mjs} +2 -2
  17. package/dist/{LexicalHeadless.prod-o0v9cIu5.mjs → LexicalHeadless.prod-1kQgKB6c.mjs} +2 -2
  18. package/dist/{LexicalHtml.dev-DoymwFpG.mjs → LexicalHtml.dev-BDB7CUrx.mjs} +14 -12
  19. package/dist/{LexicalHtml.node-CVkbWtUA.mjs → LexicalHtml.node-DpVNt7It.mjs} +4 -4
  20. package/dist/{LexicalHtml.prod-C2b3z99k.mjs → LexicalHtml.prod-HkxM5scw.mjs} +331 -300
  21. package/dist/{LexicalLink.dev-7cgLOLIe.mjs → LexicalLink.dev-C5zNJlrm.mjs} +65 -59
  22. package/dist/{LexicalLink.prod-DWFgoXHR.mjs → LexicalLink.prod-Bkt9hQAt.mjs} +196 -201
  23. package/dist/{LexicalList.dev-Ci2iOxFx.mjs → LexicalList.dev-B7VgME-m.mjs} +55 -82
  24. package/dist/LexicalList.prod-B8c7TDjH.mjs +951 -0
  25. package/dist/{LexicalMarkdown.dev-C0ZYCyuR.mjs → LexicalMarkdown.dev-B5z9kLbV.mjs} +62 -42
  26. package/dist/{LexicalMarkdown.prod-0M-Nc-rh.mjs → LexicalMarkdown.prod-wKzw7FFH.mjs} +255 -202
  27. package/dist/{LexicalRichText.dev-Cnr1kDym.mjs → LexicalRichText.dev-CUd6Li5F.mjs} +399 -120
  28. package/dist/{LexicalRichText.node-BUJZAiap.mjs → LexicalRichText.node-BKfaQ-CH.mjs} +12 -8
  29. package/dist/LexicalRichText.prod-SBewjJHx.mjs +708 -0
  30. package/dist/{LexicalSelection.dev-C4L7l8OB.mjs → LexicalSelection.dev-D27JOCqj.mjs} +48 -17
  31. package/dist/{LexicalSelection.node-CLKroUMQ.mjs → LexicalSelection.node-DBEwPjBu.mjs} +5 -4
  32. package/dist/{LexicalSelection.prod-DzFqpTlw.mjs → LexicalSelection.prod-OaYhXHOL.mjs} +101 -92
  33. package/dist/{LexicalTable.dev-Cc9-zqKa.mjs → LexicalTable.dev-6IFFOAE0.mjs} +590 -259
  34. package/dist/LexicalTable.prod-2CaLZ7fH.mjs +2524 -0
  35. package/dist/{LexicalUtils.dev-BRgK0L6G.mjs → LexicalUtils.dev-DJA7J_7v.mjs} +15 -19
  36. package/dist/{LexicalUtils.node-BVAwOkL4.mjs → LexicalUtils.node-Df9oPTlA.mjs} +6 -6
  37. package/dist/{LexicalUtils.prod-C1gtvVDP.mjs → LexicalUtils.prod-Bb7V4Ewg.mjs} +155 -159
  38. package/dist/bin/mxs.mjs +1 -1
  39. package/dist/esm-CDcJmHkG.mjs +2 -0
  40. package/dist/{esm-BNu4sUWV.mjs → esm-DLzrv7gD.mjs} +1837 -6015
  41. package/dist/index.d.mts +57 -62
  42. package/dist/index.mjs +1 -1
  43. package/dist/{mxs-CMX2yklg.mjs → mxs-BIRW5Axj.mjs} +13579 -8682
  44. package/dist/rolldown-runtime-JspESFgx.mjs +35 -0
  45. package/dist/vendor/litexml/cli.mjs +7043 -6207
  46. package/dist/vendor/litexml/litexml-html-preview-client.css +80 -47
  47. package/dist/vendor/litexml/litexml-html-preview-client.js +14422 -10838
  48. package/dist/vendor/litexml/style.css +6 -2
  49. package/package.json +23 -23
  50. package/skills/commands-ai.md +45 -12
  51. package/skills/overview.md +1 -1
  52. package/dist/Lexical.prod-CeB9UQuo.mjs +0 -6816
  53. package/dist/LexicalList.prod-D0xX5d3G.mjs +0 -944
  54. package/dist/LexicalRichText.prod-BfbMQ9uM.mjs +0 -538
  55. package/dist/LexicalTable.prod-BgO4nCxy.mjs +0 -2336
  56. package/dist/esm-jbwcVZth.mjs +0 -2
@@ -1,8 +1,8 @@
1
- import { f as namedSignals, l as effect } from "./LexicalExtension.node-BWH6xbzG.mjs";
2
- import { $ as $insertNodeToNearestRootAtCaret, $n as PASTE_COMMAND, A as $getChildCaret, Ct as $normalizeCaret, Dt as $rewindSiblingCaret, Kr as isHTMLAnchorElement, Mt as $setSelection, R as $getNearestNodeFromDOMNode, Vr as isDOMNode, W as $getSelection, Yt as COMMAND_PRIORITY_LOW, _t as $isSiblingCaret, ai as safeCast, at as $isElementNode, b as $findMatchingParent, br as defineExtension, bt as $isTextNode, dn as ElementNode, dt as $isNodeSelection, fr as TextNode, gr as createCommand, hr as configExtension, i as $caretFromPoint, jr as getNearestEditorFromDOMNode, jt as $setPointFromCaret, l as $copyNode, li as shallowMergeConfig, n as $applyNodeReplacement, ni as mergeRegister, pr as addClassNamesToElement, pt as $isRangeSelection, qt as COMMAND_PRIORITY_EDITOR, ut as $isLineBreakNode, v as $createTextNode, wt as $normalizeSelection__EXPERIMENTAL } from "./Lexical.node-BlCLnfA6.mjs";
3
- import { c as DOMImportExtension, h as defineImportRule, s as CoreImportExtension, t as $distributeInlineWrapper, v as sel } from "./LexicalHtml.node-CVkbWtUA.mjs";
4
- import { h as objectKlassEquals } from "./LexicalUtils.node-BVAwOkL4.mjs";
5
- //#region ../../node_modules/.pnpm/@lexical+link@0.46.0_typescript@6.0.3/node_modules/@lexical/link/dist/LexicalLink.dev.mjs
1
+ import { f as namedSignals, l as effect } from "./LexicalExtension.node-5OymZQfy.mjs";
2
+ import { $t as COMMAND_PRIORITY_LOW, A as $getChildCaret, At as $rewindSiblingCaret, Dt as $normalizeSelection__EXPERIMENTAL, Et as $normalizeCaret, Ft as $setSelection, G as $getSelection, I as $getDocument, Lr as getNearestEditorFromDOMNode, Pt as $setPointFromCaret, Qr as isHTMLAnchorElement, St as $isTextNode, Tr as defineExtension, Zt as COMMAND_PRIORITY_EDITOR, _i as shallowMergeConfig, _r as TextNode, b as $findMatchingParent, br as configExtension, ci as mergeRegister, di as registerEventListeners, dt as $isLineBreakNode, et as $insertNodeToNearestRootAtCaret, ft as $isNodeSelection, hn as ElementNode, i as $caretFromPoint, l as $copyNode, mt as $isRangeSelection, n as $applyNodeReplacement, ot as $isElementNode, pi as safeCast, qr as isDOMNode, rr as PASTE_COMMAND, v as $createTextNode, vr as addClassNamesToElement, xr as createCommand, yt as $isSiblingCaret, z as $getNearestNodeFromDOMNode } from "./Lexical.node-D6wf2D5M.mjs";
3
+ import { c as CoreImportExtension, g as defineImportRule, l as DOMImportExtension, t as $distributeInlineWrapper, y as sel } from "./LexicalHtml.node-DpVNt7It.mjs";
4
+ import { m as objectKlassEquals } from "./LexicalUtils.node-Df9oPTlA.mjs";
5
+ //#region ../../node_modules/.pnpm/@lexical+link@0.49.0_typescript@6.0.3/node_modules/@lexical/link/dist/LexicalLink.dev.mjs
6
6
  /**
7
7
  * Copyright (c) Meta Platforms, Inc. and affiliates.
8
8
  *
@@ -28,7 +28,7 @@ const SUPPORTED_URL_PROTOCOLS = /* @__PURE__ */ new Set([
28
28
  "tel:"
29
29
  ]);
30
30
  /** @noInheritDoc */
31
- var LinkNode = class LinkNode extends ElementNode {
31
+ var LinkNode = class extends ElementNode {
32
32
  /** @internal */
33
33
  __url;
34
34
  /** @internal */
@@ -37,15 +37,14 @@ var LinkNode = class LinkNode extends ElementNode {
37
37
  __rel;
38
38
  /** @internal */
39
39
  __title;
40
- static getType() {
41
- return "link";
42
- }
43
- static clone(node) {
44
- return new LinkNode(node.__url, {
45
- rel: node.__rel,
46
- target: node.__target,
47
- title: node.__title
48
- }, node.__key);
40
+ $config() {
41
+ return this.config("link", {
42
+ extends: ElementNode,
43
+ importDOM: { a: () => ({
44
+ conversion: $convertAnchorElement,
45
+ priority: 1
46
+ }) }
47
+ });
49
48
  }
50
49
  constructor(url = "", attributes = {}, key) {
51
50
  super(key);
@@ -63,7 +62,7 @@ var LinkNode = class LinkNode extends ElementNode {
63
62
  this.__title = prevNode.__title;
64
63
  }
65
64
  createDOM(config) {
66
- const element = document.createElement("a");
65
+ const element = $getDocument().createElement("a");
67
66
  this.updateLinkDOM(null, element, config);
68
67
  addClassNamesToElement(element, config.theme.link);
69
68
  return element;
@@ -87,25 +86,18 @@ var LinkNode = class LinkNode extends ElementNode {
87
86
  this.updateLinkDOM(prevNode, anchor, config);
88
87
  return false;
89
88
  }
90
- static importDOM() {
91
- return { a: (node) => ({
92
- conversion: $convertAnchorElement,
93
- priority: 1
94
- }) };
95
- }
96
- static importJSON(serializedNode) {
97
- return $createLinkNode().updateFromJSON(serializedNode);
98
- }
99
89
  updateFromJSON(serializedNode) {
100
90
  return super.updateFromJSON(serializedNode).setURL(serializedNode.url).setRel(serializedNode.rel || null).setTarget(serializedNode.target || null).setTitle(serializedNode.title || null);
101
91
  }
102
92
  sanitizeUrl(url) {
93
+ const rawUrl = url;
103
94
  url = formatUrl(url);
104
95
  try {
105
96
  const parsedUrl = new URL(formatUrl(url));
106
97
  if (!SUPPORTED_URL_PROTOCOLS.has(parsedUrl.protocol)) return "about:blank";
107
98
  } catch (_unused) {
108
- return url;
99
+ const schemeMatch = rawUrl.replace(/[\u0000-\u001F\u007F\s]/g, "").match(/^([a-z][a-z0-9+.-]*):/i);
100
+ if (schemeMatch != null && !SUPPORTED_URL_PROTOCOLS.has(`${schemeMatch[1].toLowerCase()}:`)) return "about:blank";
109
101
  }
110
102
  return url;
111
103
  }
@@ -290,7 +282,7 @@ function $createLinkNode(url = "", attributes) {
290
282
  function $isLinkNode(node) {
291
283
  return node instanceof LinkNode;
292
284
  }
293
- var AutoLinkNode = class AutoLinkNode extends LinkNode {
285
+ var AutoLinkNode = class extends LinkNode {
294
286
  /** @internal */
295
287
  /** Indicates whether the autolink was ever unlinked. **/
296
288
  __isUnlinked;
@@ -302,16 +294,8 @@ var AutoLinkNode = class AutoLinkNode extends LinkNode {
302
294
  super.afterCloneFrom(prevNode);
303
295
  this.__isUnlinked = prevNode.__isUnlinked;
304
296
  }
305
- static getType() {
306
- return "autolink";
307
- }
308
- static clone(node) {
309
- return new AutoLinkNode(node.__url, {
310
- isUnlinked: node.__isUnlinked,
311
- rel: node.__rel,
312
- target: node.__target,
313
- title: node.__title
314
- }, node.__key);
297
+ $config() {
298
+ return this.config("autolink", { extends: LinkNode });
315
299
  }
316
300
  shouldMergeAdjacentLink(_otherLink) {
317
301
  return false;
@@ -325,21 +309,15 @@ var AutoLinkNode = class AutoLinkNode extends LinkNode {
325
309
  return self;
326
310
  }
327
311
  createDOM(config) {
328
- if (this.__isUnlinked) return document.createElement("span");
312
+ if (this.__isUnlinked) return $getDocument().createElement("span");
329
313
  else return super.createDOM(config);
330
314
  }
331
315
  updateDOM(prevNode, anchor, config) {
332
316
  return super.updateDOM(prevNode, anchor, config) || prevNode.__isUnlinked !== this.__isUnlinked;
333
317
  }
334
- static importJSON(serializedNode) {
335
- return $createAutoLinkNode().updateFromJSON(serializedNode);
336
- }
337
318
  updateFromJSON(serializedNode) {
338
319
  return super.updateFromJSON(serializedNode).setIsUnlinked(serializedNode.isUnlinked || false);
339
320
  }
340
- static importDOM() {
341
- return null;
342
- }
343
321
  exportJSON() {
344
322
  return {
345
323
  ...super.exportJSON(),
@@ -723,11 +701,13 @@ function registerClickableLink(editor, stores, eventOptions = {}) {
723
701
  if (nearestEditor === null) return;
724
702
  let url = null;
725
703
  let urlTarget = null;
704
+ let isUnlinkedAutolink = false;
726
705
  nearestEditor.update(() => {
727
706
  const clickedNode = $getNearestNodeFromDOMNode(target);
728
707
  if (clickedNode !== null) {
729
708
  const maybeLinkNode = $findMatchingParent(clickedNode, $isElementNode);
730
709
  if (!stores.disabled.peek()) if ($isLinkNode(maybeLinkNode)) {
710
+ isUnlinkedAutolink = $isAutoLinkNode(maybeLinkNode) && maybeLinkNode.getIsUnlinked();
731
711
  url = maybeLinkNode.sanitizeUrl(maybeLinkNode.getURL());
732
712
  urlTarget = maybeLinkNode.getTarget();
733
713
  } else {
@@ -739,7 +719,7 @@ function registerClickableLink(editor, stores, eventOptions = {}) {
739
719
  }
740
720
  }
741
721
  });
742
- if (url === null || url === "") return;
722
+ if (url === null || url === "" || isUnlinkedAutolink) return;
743
723
  const selection = editor.read("latest", $getSelection);
744
724
  if ($isRangeSelection(selection) && !selection.isCollapsed()) {
745
725
  event.preventDefault();
@@ -753,14 +733,10 @@ function registerClickableLink(editor, stores, eventOptions = {}) {
753
733
  if (event.button === 1) onClick(event);
754
734
  };
755
735
  return editor.registerRootListener((rootElement) => {
756
- if (rootElement) {
757
- rootElement.addEventListener("click", onClick, eventOptions);
758
- rootElement.addEventListener("mouseup", onMouseUp, eventOptions);
759
- return () => {
760
- rootElement.removeEventListener("click", onClick);
761
- rootElement.removeEventListener("mouseup", onMouseUp);
762
- };
763
- }
736
+ if (rootElement) return registerEventListeners(rootElement, {
737
+ click: onClick,
738
+ mouseup: onMouseUp
739
+ }, eventOptions);
764
740
  });
765
741
  }
766
742
  /**
@@ -818,6 +794,37 @@ function createLinkMatcherWithRegExp(regExp, urlTransformer = (text) => text) {
818
794
  };
819
795
  };
820
796
  }
797
+ const URL_REGEX = /((https?:\/\/(www\.)?)|(www\.))[-\p{L}\p{N}@:%._+~#=]{1,256}\.[\p{L}\p{N}]{1,6}(?:[-\p{L}\p{N}()@:%_+.~#?&//=]*[\p{L}\p{N}()@_~#?&//=])?/u;
798
+ const EMAIL_REGEX = /(([^<>()[\]\\.,;:\s@"]{1,64}(\.[^<>()[\]\\.,;:\s@"]{1,64}){0,63})|(".{1,255}"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]{1,63}\.){1,127}[a-zA-Z]{2,63}))/;
799
+ /**
800
+ * A ready-to-use {@link LinkMatcher} for URLs with full Unicode support
801
+ * (`\\p{L}`, `\\p{N}`). Handles parenthesis balancing so that Wikipedia-style
802
+ * URLs like `https://en.wikipedia.org/wiki/Fish_(disambiguation)` are matched
803
+ * correctly even when wrapped in prose parentheses.
804
+ */
805
+ const autoLinkUrlMatcher = (text) => {
806
+ const match = URL_REGEX.exec(text);
807
+ if (match === null) return null;
808
+ let matched = match[0];
809
+ let depth = 0;
810
+ for (const ch of matched) if (ch === "(") depth++;
811
+ else if (ch === ")") depth--;
812
+ while (depth < 0 && matched.endsWith(")")) {
813
+ matched = matched.slice(0, -1);
814
+ depth++;
815
+ }
816
+ return {
817
+ index: match.index,
818
+ length: matched.length,
819
+ text: matched,
820
+ url: matched.startsWith("http") ? matched : `https://${matched}`
821
+ };
822
+ };
823
+ /**
824
+ * A ready-to-use {@link LinkMatcher} for email addresses. Bounded quantifiers
825
+ * keep matching linear-time; the limits comfortably exceed RFC 5321 maximums.
826
+ */
827
+ const autoLinkEmailMatcher = createLinkMatcherWithRegExp(EMAIL_REGEX, (text) => `mailto:${text}`);
821
828
  function findFirstMatch(text, matchers) {
822
829
  for (let i = 0; i < matchers.length; i++) {
823
830
  const match = matchers[i](text);
@@ -1095,11 +1102,10 @@ function registerAutoLink(editor, config = defaultConfig) {
1095
1102
  }
1096
1103
  /**
1097
1104
  * An extension to automatically create AutoLinkNode from text
1098
- * that matches the configured matchers. No default implementation
1099
- * is provided for any matcher, see {@link createLinkMatcherWithRegExp}
1100
- * for a helper function to create a matcher from a RegExp, and the
1101
- * Playground's [AutoLinkPlugin](https://github.com/facebook/lexical/blob/main/packages/lexical-playground/src/plugins/AutoLinkPlugin/index.tsx)
1102
- * for some example RegExps that could be used.
1105
+ * that matches the configured matchers. For ready-to-use matchers see
1106
+ * {@link autoLinkUrlMatcher} (Unicode URL detection with parenthesis
1107
+ * balancing) and {@link autoLinkEmailMatcher} (email addresses). To build
1108
+ * a custom matcher from a RegExp, see {@link createLinkMatcherWithRegExp}.
1103
1109
  *
1104
1110
  * The given `matchers` and `changeHandlers` will be merged by
1105
1111
  * concatenating the configured arrays.
@@ -1124,4 +1130,4 @@ const AutoLinkExtension = /* @__PURE__ */ defineExtension({
1124
1130
  register: registerAutoLink
1125
1131
  });
1126
1132
  //#endregion
1127
- export { $createAutoLinkNode, $createLinkNode, $isAutoLinkNode, $isLinkNode, $toggleLink, AutoLinkExtension, AutoLinkNode, ClickableLinkExtension, LinkExtension, LinkImportExtension, LinkImportRules, LinkNode, TOGGLE_LINK_COMMAND, createLinkMatcherWithRegExp, formatUrl, registerAutoLink, registerClickableLink, registerLink };
1133
+ export { $createAutoLinkNode, $createLinkNode, $isAutoLinkNode, $isLinkNode, $toggleLink, AutoLinkExtension, AutoLinkNode, ClickableLinkExtension, LinkExtension, LinkImportExtension, LinkImportRules, LinkNode, TOGGLE_LINK_COMMAND, autoLinkEmailMatcher, autoLinkUrlMatcher, createLinkMatcherWithRegExp, formatUrl, registerAutoLink, registerClickableLink, registerLink };