diff --git a/frontend/src/app/main/ui/workspace/sidebar/options/menus/typography.cljs b/frontend/src/app/main/ui/workspace/sidebar/options/menus/typography.cljs index 00a7ca455e..940682be89 100644 --- a/frontend/src/app/main/ui/workspace/sidebar/options/menus/typography.cljs +++ b/frontend/src/app/main/ui/workspace/sidebar/options/menus/typography.cljs @@ -346,17 +346,19 @@ {:value (:id variant) :key (pr-str variant) :label (:name variant)}))) - variant-options (if (= font-variant-id :multiple) + variant-options (if (or (= font-variant-id :multiple) (= font-variant-id "mixed")) (conj basic-variant-options {:value "" :key :multiple-variants :label "--"}) - basic-variant-options)] + basic-variant-options) + font-variant-value (attr->string font-variant-id) + font-variant-value (if (= font-variant-value "mixed") "" font-variant-value)] ;; TODO Add disabled mode [:& select {:class (stl/css :font-variant-select) - :default-value (attr->string font-variant-id) + :default-value font-variant-value :options variant-options :on-change on-font-variant-change :on-blur on-blur}])]]])) diff --git a/frontend/src/app/util/text/content/from_dom.cljs b/frontend/src/app/util/text/content/from_dom.cljs index 7cde9ea225..dbc318cc08 100644 --- a/frontend/src/app/util/text/content/from_dom.cljs +++ b/frontend/src/app/util/text/content/from_dom.cljs @@ -23,15 +23,15 @@ [node] (is-element node "br")) -(defn is-inline-child +(defn is-text-span-child [node] (or (is-line-break node) (is-text-node node))) -(defn get-inline-text +(defn get-text-span-text [element] - (when-not (is-inline-child (.-firstChild element)) - (throw (js/TypeError. "Invalid inline child"))) + (when-not (is-text-span-child (.-firstChild element)) + (throw (js/TypeError. "Invalid text span child"))) (if (is-line-break (.-firstChild element)) "" (.-textContent element))) @@ -54,7 +54,7 @@ (assoc acc key (if (value-empty? value) (get defaults key) value)))) {} attrs))) -(defn get-inline-styles +(defn get-text-span-styles [element] (get-attrs-from-styles element txt/text-node-attrs (txt/get-default-text-attrs))) @@ -66,18 +66,18 @@ [element] (get-attrs-from-styles element txt/root-attrs txt/default-root-attrs)) -(defn create-inline +(defn create-text-span [element] - (let [text (get-inline-text element)] + (let [text (get-text-span-text element)] (d/merge {:text text :key (.-id element)} - (get-inline-styles element)))) + (get-text-span-styles element)))) (defn create-paragraph [element] (d/merge {:type "paragraph" :key (.-id element) - :children (mapv create-inline (.-children element))} + :children (mapv create-text-span (.-children element))} (get-paragraph-styles element))) (defn create-root diff --git a/frontend/src/app/util/text/content/to_dom.cljs b/frontend/src/app/util/text/content/to_dom.cljs index a4c5c747bb..5d0597425c 100644 --- a/frontend/src/app/util/text/content/to_dom.cljs +++ b/frontend/src/app/util/text/content/to_dom.cljs @@ -92,7 +92,7 @@ [root] (get-styles-from-attrs root txt/root-attrs txt/default-text-attrs)) -(defn get-inline-styles +(defn get-text-span-styles [inline paragraph] (let [node (if (= "" (:text inline)) paragraph inline) styles (get-styles-from-attrs node txt/text-node-attrs txt/default-text-attrs)] @@ -104,7 +104,7 @@ (when text (.replace text (js/RegExp "/" "g") "/\u200B"))) -(defn get-inline-children +(defn get-text-span-children [inline paragraph] [(if (and (= "" (:text inline)) (= 1 (count (:children paragraph)))) @@ -119,14 +119,14 @@ [paragraph] (some #(not= "" (:text % "")) (:children paragraph))) -(defn create-inline +(defn create-text-span [inline paragraph] (create-element "span" {:id (or (:key inline) (create-random-key)) - :data {:itype "inline"} - :style (get-inline-styles inline paragraph)} - (get-inline-children inline paragraph))) + :data {:itype "span"} + :style (get-text-span-styles inline paragraph)} + (get-text-span-children inline paragraph))) (defn create-paragraph [paragraph] @@ -135,7 +135,7 @@ {:id (or (:key paragraph) (create-random-key)) :data {:itype "paragraph"} :style (get-paragraph-styles paragraph)} - (mapv #(create-inline % paragraph) (:children paragraph)))) + (mapv #(create-text-span % paragraph) (:children paragraph)))) (defn create-root [root] diff --git a/frontend/text-editor/package.json b/frontend/text-editor/package.json index 40ffaf6472..02584641d9 100644 --- a/frontend/text-editor/package.json +++ b/frontend/text-editor/package.json @@ -20,6 +20,7 @@ "@vitest/browser": "^1.6.0", "@vitest/coverage-v8": "^1.6.0", "@vitest/ui": "^1.6.0", + "canvas": "^3.2.1", "esbuild": "^0.24.0", "jsdom": "^25.0.0", "playwright": "^1.45.1", diff --git a/frontend/text-editor/src/editor/content/dom/Color.test.js b/frontend/text-editor/src/editor/content/dom/Color.test.js new file mode 100644 index 0000000000..a5d44addd1 --- /dev/null +++ b/frontend/text-editor/src/editor/content/dom/Color.test.js @@ -0,0 +1,11 @@ +import { describe, test, expect } from "vitest"; +import { getFills } from "./Color.js"; + +/* @vitest-environment jsdom */ +describe("Color", () => { + test("getFills", () => { + expect(getFills("#aa0000")).toBe( + '[["^ ","~:fill-color","#aa0000","~:fill-opacity",1]]', + ); + }); +}); diff --git a/frontend/text-editor/src/editor/content/dom/Editor.test.js b/frontend/text-editor/src/editor/content/dom/Editor.test.js new file mode 100644 index 0000000000..a9a66d1e75 --- /dev/null +++ b/frontend/text-editor/src/editor/content/dom/Editor.test.js @@ -0,0 +1,30 @@ +import { describe, test, expect } from "vitest"; +import { + isEditor, + TYPE, + TAG, +} from "./Editor.js"; + +/* @vitest-environment jsdom */ +describe("Editor", () => { + test("isEditor should return true", () => { + const element = document.createElement(TAG) + element.dataset.itype = TYPE; + expect(isEditor(element)).toBeTruthy(); + }); + + test("isEditor should return false when element is null", () => { + expect(isEditor(null)).toBeFalsy(); + }); + + test("isEditor should return false when the tag is not valid", () => { + const element = document.createElement("span"); + expect(isEditor(element)).toBeFalsy(); + }); + + test("isEditor should return false when the itype is not valid", () => { + const element = document.createElement(TAG); + element.dataset.itype = "whatever"; + expect(isEditor(element)).toBeFalsy(); + }); +}); diff --git a/frontend/text-editor/src/editor/content/dom/Paragraph.test.js b/frontend/text-editor/src/editor/content/dom/Paragraph.test.js index 57e5fb7f54..68c37db814 100644 --- a/frontend/text-editor/src/editor/content/dom/Paragraph.test.js +++ b/frontend/text-editor/src/editor/content/dom/Paragraph.test.js @@ -88,14 +88,23 @@ describe("Paragraph", () => { test("isParagraphEnd should return true on an empty paragraph", () => { const paragraph = createEmptyParagraph(); - expect(isParagraphEnd(paragraph.firstChild.firstChild, 0)).toBe(true); + expect(isParagraphEnd(paragraph.firstElementChild.firstChild, 0)).toBe(true); }); test("isParagraphEnd should return true on a paragraph", () => { const paragraph = createParagraph([ createTextSpan(new Text("Hello, World!")), ]); - expect(isParagraphEnd(paragraph.firstChild.firstChild, 13)).toBe(true); + expect(isParagraphEnd(paragraph.firstElementChild.firstChild, 13)).toBe(true); + }); + + test("isParagraphEnd should return false on a paragrah where the focus offset is inside", () => { + const paragraph = createParagraph([ + createTextSpan(new Text("Lorem ipsum sit")), + createTextSpan(new Text("amet")), + ]); + console.log(paragraph.innerHTML) + expect(isParagraphEnd(paragraph.firstElementChild.firstChild, 15)).toBe(false); }); test("splitParagraph should split a paragraph", () => { diff --git a/frontend/text-editor/src/editor/controllers/SelectionController.js b/frontend/text-editor/src/editor/controllers/SelectionController.js index 57666c6df1..e03468ca4c 100644 --- a/frontend/text-editor/src/editor/controllers/SelectionController.js +++ b/frontend/text-editor/src/editor/controllers/SelectionController.js @@ -274,36 +274,15 @@ export class SelectionController extends EventTarget { * @param {HTMLSpanElement} endNode */ #updateCurrentStyleFrom(startNode, endNode) { - console.log("A"); this.#applyDefaultStylesToCurrentStyle(); const root = startNode.parentElement.parentElement.parentElement; this.#applyStylesFromElementToCurrentStyle(root); -<<<<<<< Updated upstream - // FIXME: I don't like this approximation. Having to iterate nodes twice - // is bad for performance. I think we need another way of "computing" - // the cascade. - for (const textNode of this.#textNodeIterator.iterateFrom( - startNode, - endNode, - )) { - const paragraph = textNode.parentElement.parentElement; - this.#applyStylesFromElementToCurrentStyle(paragraph); - } - for (const textNode of this.#textNodeIterator.iterateFrom( - startNode, - endNode, - )) { - const textSpan = textNode.parentElement; - this.#mergeStylesFromElementToCurrentStyle(textSpan); -======= if (startNode === endNode) { - console.log("A1"); const paragraph = startNode.parentElement.parentElement; this.#applyStylesFromElementToCurrentStyle(paragraph); const textSpan = startNode.parentElement; this.#applyStylesFromElementToCurrentStyle(textSpan); } else { - console.log("A2"); // FIXME: I don't like this approximation. Having to iterate nodes twice // is bad for performance. I think we need another way of "computing" // the cascade. @@ -321,7 +300,6 @@ export class SelectionController extends EventTarget { const textSpan = textNode.parentElement; this.#mergeStylesFromElementToCurrentStyle(textSpan); } ->>>>>>> Stashed changes } return this; } @@ -333,7 +311,6 @@ export class SelectionController extends EventTarget { * @returns {SelectionController} */ #updateCurrentStyle(textSpan) { - console.log("B"); this.#applyDefaultStylesToCurrentStyle(); const root = textSpan.parentElement.parentElement; this.#applyStylesFromElementToCurrentStyle(root); @@ -1722,7 +1699,8 @@ export class SelectionController extends EventTarget { * @param {RemoveSelectedOptions} [options] */ removeSelected(options) { - if (this.isCollapsed) return; + if (this.isCollapsed) + return; const affectedTextSpans = new Set(); const affectedParagraphs = new Set(); @@ -1731,7 +1709,6 @@ export class SelectionController extends EventTarget { let nextNode = null; let { startNode, endNode, startOffset, endOffset } = this.getRanges(); - if (this.shouldHandleCompleteDeletion(startNode, endNode)) { return this.handleCompleteContentDeletion(); } @@ -1790,6 +1767,8 @@ export class SelectionController extends EventTarget { affectedParagraphs.add(paragraph); let shouldRemoveNodeCompletely = false; + const isEndNode = currentNode === endNode; + if (currentNode === startNode) { if (startOffset === 0) { // We should remove this node completely. @@ -1798,11 +1777,11 @@ export class SelectionController extends EventTarget { // We should remove this node partially. currentNode.nodeValue = currentNode.nodeValue.slice(0, startOffset); } - } else if (currentNode === endNode) { + } else if (isEndNode) { if ( isLineBreak(endNode) || (isTextNode(endNode) && - endOffset === (endNode.nodeValue?.length || 0)) + endOffset >= (endNode.nodeValue?.length || 0)) ) { // We should remove this node completely. shouldRemoveNodeCompletely = true; @@ -1815,8 +1794,7 @@ export class SelectionController extends EventTarget { shouldRemoveNodeCompletely = true; } - this.#textNodeIterator.nextNode(); - + console.log("shouldRemoveNodeCompletely", shouldRemoveNodeCompletely); // Realizamos el borrado del nodo actual. if (shouldRemoveNodeCompletely) { currentNode.remove(); @@ -1828,14 +1806,18 @@ export class SelectionController extends EventTarget { textSpan.remove(); } - if (paragraph !== startParagraph && paragraph.children.length === 0) { + if (paragraph !== startParagraph + && paragraph.children.length === 0) { paragraph.remove(); } } - if (currentNode === endNode) { + // Break immediately after processing endNode, before advancing iterator + if (isEndNode) { break; } + + this.#textNodeIterator.nextNode(); } while (this.#textNodeIterator.currentNode); if (startParagraph !== endParagraph) { @@ -1847,6 +1829,7 @@ export class SelectionController extends EventTarget { } } + console.log("textSpans", startTextSpan, endTextSpan); if ( startTextSpan.childNodes.length === 0 && endTextSpan.childNodes.length > 0 @@ -1884,16 +1867,28 @@ export class SelectionController extends EventTarget { return this.collapse(startNode, startOffset); } + /** + * Returns an object with ranges. + * + * @returns {} + */ getRanges() { let startNode = getClosestTextNode(this.#range.startContainer); let endNode = getClosestTextNode(this.#range.endContainer); let startOffset = this.#range.startOffset; - let endOffset = this.#range.startOffset + this.#range.toString().length; + let endOffset = this.#range.endOffset; return { startNode, endNode, startOffset, endOffset }; } + /** + * Returns true if we should remove the complete root. + * + * @param {*} startNode + * @param {*} endNode + * @returns {boolean} + */ shouldHandleCompleteDeletion(startNode, endNode) { const root = this.#textEditor.root; return ( diff --git a/frontend/text-editor/src/editor/controllers/SelectionController.test.js b/frontend/text-editor/src/editor/controllers/SelectionController.test.js index 7505c47c73..6ecc5d9b76 100644 --- a/frontend/text-editor/src/editor/controllers/SelectionController.test.js +++ b/frontend/text-editor/src/editor/controllers/SelectionController.test.js @@ -34,7 +34,17 @@ function focus( document.dispatchEvent(new Event("selectionchange")); } -describe.skip("SelectionController", () => { +describe("SelectionController", () => { + test("`options` should return the Options object kept by the SelectionController", () => { + const textEditorMock = TextEditorMock.createTextEditorMockWithText(""); + const selection = document.getSelection(); + const selectionController = new SelectionController( + textEditorMock, + selection + ); + expect(selectionController.options).toBe({}); + }); + test("`selection` should return the Selection object kept by the SelectionController", () => { const textEditorMock = TextEditorMock.createTextEditorMockWithText(""); const selection = document.getSelection(); @@ -1067,27 +1077,27 @@ describe.skip("SelectionController", () => { ); selectionController.removeSelected(); expect(textEditorMock.root).toBeInstanceOf(HTMLDivElement); - expect(textEditorMock.root.children).toHaveLength(2); + expect(textEditorMock.root.children).toHaveLength(1); expect(textEditorMock.root.dataset.itype).toBe("root"); expect(textEditorMock.root.firstChild).toBeInstanceOf(HTMLDivElement); - expect(textEditorMock.root.firstChild.children).toHaveLength(1); + expect(textEditorMock.root.firstChild.children).toHaveLength(2); expect(textEditorMock.root.firstChild.dataset.itype).toBe("paragraph"); expect(textEditorMock.root.firstChild.firstChild).toBeInstanceOf( HTMLSpanElement, ); expect(textEditorMock.root.firstChild.firstChild.dataset.itype).toBe("span"); - expect(textEditorMock.root.textContent).toBe("Lorem amet"); + expect(textEditorMock.root.textContent).toBe("Lorem amet"); expect(textEditorMock.root.firstChild.firstChild.firstChild).toBeInstanceOf( Text, ); expect(textEditorMock.root.firstChild.firstChild.firstChild.nodeValue).toBe( - "Hello, ", + "Lorem ", ); - expect(textEditorMock.root.lastChild.firstChild.firstChild).toBeInstanceOf( + expect(textEditorMock.root.firstChild.lastChild.firstChild).toBeInstanceOf( Text, ); - expect(textEditorMock.root.lastChild.firstChild.firstChild.nodeValue).toBe( - "World!", + expect(textEditorMock.root.firstChild.lastChild.firstChild.nodeValue).toBe( + " amet", ); }); diff --git a/frontend/text-editor/src/editor/controllers/StyleDeclaration.js b/frontend/text-editor/src/editor/controllers/StyleDeclaration.js index 1545fced16..c92437b2e3 100644 --- a/frontend/text-editor/src/editor/controllers/StyleDeclaration.js +++ b/frontend/text-editor/src/editor/controllers/StyleDeclaration.js @@ -48,7 +48,7 @@ export class StyleDeclaration { } item(index) { - return Array.from(this.#items).at(index).name; + return Array.from(this.#items.keys()).at(index); } removeProperty(name) { @@ -76,22 +76,17 @@ export class StyleDeclaration { mergeProperty(name, value) { const currentValue = this.getPropertyValue(name); if (this.#isQuotedValue(currentValue, value)) { - console.log("a"); return this.setProperty(name, value); } else if ( currentValue === "" && value === StyleDeclaration.Property.NULL ) { - console.log("b"); return this.setProperty(name, value); } else if (currentValue === "" && ["initial", "none"].includes(value)) { - console.log("c"); return this.setProperty(name, value); } else if (currentValue !== value && name === "--fills") { - console.log("d"); return this.setProperty(name, value); } else if (currentValue !== value) { - console.log("e"); return this.setProperty(name, "mixed"); } } diff --git a/frontend/text-editor/src/editor/controllers/StyleDeclaration.test.js b/frontend/text-editor/src/editor/controllers/StyleDeclaration.test.js index a9791190b6..1dd60d31e3 100644 --- a/frontend/text-editor/src/editor/controllers/StyleDeclaration.test.js +++ b/frontend/text-editor/src/editor/controllers/StyleDeclaration.test.js @@ -29,4 +29,23 @@ describe("StyleDeclaration", () => { expect(styleDeclaration.getPropertyValue("line-height")).toBe(""); expect(styleDeclaration.getPropertyPriority("line-height")).toBe(""); }); + + test("Iterate styles", () => { + const properties = [ + ["line-height", "1.2"], + ["--variable", "hola"], + ]; + + const styleDeclaration = new StyleDeclaration(); + for (const [name,value] of properties) { + styleDeclaration.setProperty(name, value); + } + for (let index = 0; index < styleDeclaration.length; index++) { + const name = styleDeclaration.item(index); + const value = styleDeclaration.getPropertyValue(name); + const [expectedName, expectedValue] = properties[index]; + expect(name).toBe(expectedName); + expect(value).toBe(expectedValue); + } + }); }); diff --git a/frontend/text-editor/src/playground.js b/frontend/text-editor/src/playground.js index b474c412f6..a25d983efb 100644 --- a/frontend/text-editor/src/playground.js +++ b/frontend/text-editor/src/playground.js @@ -462,8 +462,6 @@ class TextEditorPlayground { // Number of text leaves in the paragraph. view.setUint32(0, paragraph.leaves.length, true); - console.log("lineHeight", paragraph.lineHeight); - // Serialize paragraph attributes view.setUint8(4, paragraph.textAlign, true); // text-align: left view.setUint8(5, paragraph.textDirection, true); // text-direction: LTR diff --git a/frontend/text-editor/yarn.lock b/frontend/text-editor/yarn.lock index 0a63cb6cd1..09a2696aa9 100644 --- a/frontend/text-editor/yarn.lock +++ b/frontend/text-editor/yarn.lock @@ -515,6 +515,7 @@ __metadata: "@vitest/browser": "npm:^1.6.0" "@vitest/coverage-v8": "npm:^1.6.0" "@vitest/ui": "npm:^1.6.0" + canvas: "npm:^3.2.1" esbuild: "npm:^0.24.0" jsdom: "npm:^25.0.0" playwright: "npm:^1.45.1" @@ -902,6 +903,24 @@ __metadata: languageName: node linkType: hard +"base64-js@npm:^1.3.1": + version: 1.5.1 + resolution: "base64-js@npm:1.5.1" + checksum: 10c0/f23823513b63173a001030fae4f2dabe283b99a9d324ade3ad3d148e218134676f1ee8568c877cd79ec1c53158dcf2d2ba527a97c606618928ba99dd930102bf + languageName: node + linkType: hard + +"bl@npm:^4.0.3": + version: 4.1.0 + resolution: "bl@npm:4.1.0" + dependencies: + buffer: "npm:^5.5.0" + inherits: "npm:^2.0.4" + readable-stream: "npm:^3.4.0" + checksum: 10c0/02847e1d2cb089c9dc6958add42e3cdeaf07d13f575973963335ac0fdece563a50ac770ac4c8fa06492d2dd276f6cc3b7f08c7cd9c7a7ad0f8d388b2a28def5f + languageName: node + linkType: hard + "brace-expansion@npm:^1.1.7": version: 1.1.11 resolution: "brace-expansion@npm:1.1.11" @@ -930,6 +949,16 @@ __metadata: languageName: node linkType: hard +"buffer@npm:^5.5.0": + version: 5.7.1 + resolution: "buffer@npm:5.7.1" + dependencies: + base64-js: "npm:^1.3.1" + ieee754: "npm:^1.1.13" + checksum: 10c0/27cac81cff434ed2876058d72e7c4789d11ff1120ef32c9de48f59eab58179b66710c488987d295ae89a228f835fc66d088652dffeb8e3ba8659f80eb091d55e + languageName: node + linkType: hard + "cac@npm:^6.7.14": version: 6.7.14 resolution: "cac@npm:6.7.14" @@ -957,6 +986,17 @@ __metadata: languageName: node linkType: hard +"canvas@npm:^3.2.1": + version: 3.2.1 + resolution: "canvas@npm:3.2.1" + dependencies: + node-addon-api: "npm:^7.0.0" + node-gyp: "npm:latest" + prebuild-install: "npm:^7.1.3" + checksum: 10c0/c0fd572a8b28e075b40a42b523bdf05e985feaeb18b56085432bfb91a3b905af48f89ec73ed4e795de892cb13f7332ceb0c78cf84c64281c41c29995665b89c8 + languageName: node + linkType: hard + "chai@npm:^4.3.10": version: 4.4.1 resolution: "chai@npm:4.4.1" @@ -981,6 +1021,13 @@ __metadata: languageName: node linkType: hard +"chownr@npm:^1.1.1": + version: 1.1.4 + resolution: "chownr@npm:1.1.4" + checksum: 10c0/ed57952a84cc0c802af900cf7136de643d3aba2eecb59d29344bc2f3f9bf703a301b9d84cdc71f82c3ffc9ccde831b0d92f5b45f91727d6c9da62f23aef9d9db + languageName: node + linkType: hard + "chownr@npm:^2.0.0": version: 2.0.0 resolution: "chownr@npm:2.0.0" @@ -1083,6 +1130,15 @@ __metadata: languageName: node linkType: hard +"decompress-response@npm:^6.0.0": + version: 6.0.0 + resolution: "decompress-response@npm:6.0.0" + dependencies: + mimic-response: "npm:^3.1.0" + checksum: 10c0/bd89d23141b96d80577e70c54fb226b2f40e74a6817652b80a116d7befb8758261ad073a8895648a29cc0a5947021ab66705cb542fa9c143c82022b27c5b175e + languageName: node + linkType: hard + "deep-eql@npm:^4.1.3": version: 4.1.4 resolution: "deep-eql@npm:4.1.4" @@ -1092,6 +1148,13 @@ __metadata: languageName: node linkType: hard +"deep-extend@npm:^0.6.0": + version: 0.6.0 + resolution: "deep-extend@npm:0.6.0" + checksum: 10c0/1c6b0abcdb901e13a44c7d699116d3d4279fdb261983122a3783e7273844d5f2537dc2e1c454a23fcf645917f93fbf8d07101c1d03c015a87faa662755212566 + languageName: node + linkType: hard + "delayed-stream@npm:~1.0.0": version: 1.0.0 resolution: "delayed-stream@npm:1.0.0" @@ -1099,6 +1162,13 @@ __metadata: languageName: node linkType: hard +"detect-libc@npm:^2.0.0": + version: 2.1.2 + resolution: "detect-libc@npm:2.1.2" + checksum: 10c0/acc675c29a5649fa1fb6e255f993b8ee829e510b6b56b0910666949c80c364738833417d0edb5f90e4e46be17228b0f2b66a010513984e18b15deeeac49369c4 + languageName: node + linkType: hard + "diff-sequences@npm:^29.6.3": version: 29.6.3 resolution: "diff-sequences@npm:29.6.3" @@ -1136,6 +1206,15 @@ __metadata: languageName: node linkType: hard +"end-of-stream@npm:^1.1.0, end-of-stream@npm:^1.4.1": + version: 1.4.5 + resolution: "end-of-stream@npm:1.4.5" + dependencies: + once: "npm:^1.4.0" + checksum: 10c0/b0701c92a10b89afb1cb45bf54a5292c6f008d744eb4382fa559d54775ff31617d1d7bc3ef617575f552e24fad2c7c1a1835948c66b3f3a4be0a6c1f35c883d8 + languageName: node + linkType: hard + "entities@npm:^4.4.0": version: 4.5.0 resolution: "entities@npm:4.5.0" @@ -1346,6 +1425,13 @@ __metadata: languageName: node linkType: hard +"expand-template@npm:^2.0.3": + version: 2.0.3 + resolution: "expand-template@npm:2.0.3" + checksum: 10c0/1c9e7afe9acadf9d373301d27f6a47b34e89b3391b1ef38b7471d381812537ef2457e620ae7f819d2642ce9c43b189b3583813ec395e2938319abe356a9b2f51 + languageName: node + linkType: hard + "exponential-backoff@npm:^3.1.1": version: 3.1.1 resolution: "exponential-backoff@npm:3.1.1" @@ -1419,6 +1505,13 @@ __metadata: languageName: node linkType: hard +"fs-constants@npm:^1.0.0": + version: 1.0.0 + resolution: "fs-constants@npm:1.0.0" + checksum: 10c0/a0cde99085f0872f4d244e83e03a46aa387b74f5a5af750896c6b05e9077fac00e9932fdf5aef84f2f16634cd473c63037d7a512576da7d5c2b9163d1909f3a8 + languageName: node + linkType: hard + "fs-minipass@npm:^2.0.0": version: 2.1.0 resolution: "fs-minipass@npm:2.1.0" @@ -1496,6 +1589,13 @@ __metadata: languageName: node linkType: hard +"github-from-package@npm:0.0.0": + version: 0.0.0 + resolution: "github-from-package@npm:0.0.0" + checksum: 10c0/737ee3f52d0a27e26332cde85b533c21fcdc0b09fb716c3f8e522cfaa9c600d4a631dec9fcde179ec9d47cca89017b7848ed4d6ae6b6b78f936c06825b1fcc12 + languageName: node + linkType: hard + "glob-parent@npm:^5.1.2": version: 5.1.2 resolution: "glob-parent@npm:5.1.2" @@ -1608,6 +1708,13 @@ __metadata: languageName: node linkType: hard +"ieee754@npm:^1.1.13": + version: 1.2.1 + resolution: "ieee754@npm:1.2.1" + checksum: 10c0/b0782ef5e0935b9f12883a2e2aa37baa75da6e66ce6515c168697b42160807d9330de9a32ec1ed73149aea02e0d822e572bca6f1e22bdcbd2149e13b050b17bb + languageName: node + linkType: hard + "imurmurhash@npm:^0.1.4": version: 0.1.4 resolution: "imurmurhash@npm:0.1.4" @@ -1632,13 +1739,20 @@ __metadata: languageName: node linkType: hard -"inherits@npm:2": +"inherits@npm:2, inherits@npm:^2.0.3, inherits@npm:^2.0.4": version: 2.0.4 resolution: "inherits@npm:2.0.4" checksum: 10c0/4e531f648b29039fb7426fb94075e6545faa1eb9fe83c29f0b6d9e7263aceb4289d2d4557db0d428188eeb449cc7c5e77b0a0b2c4e248ff2a65933a0dee49ef2 languageName: node linkType: hard +"ini@npm:~1.3.0": + version: 1.3.8 + resolution: "ini@npm:1.3.8" + checksum: 10c0/ec93838d2328b619532e4f1ff05df7909760b6f66d9c9e2ded11e5c1897d6f2f9980c54dd638f88654b00919ce31e827040631eab0a3969e4d1abefa0719516a + languageName: node + linkType: hard + "ip-address@npm:^9.0.5": version: 9.0.5 resolution: "ip-address@npm:9.0.5" @@ -1936,6 +2050,13 @@ __metadata: languageName: node linkType: hard +"mimic-response@npm:^3.1.0": + version: 3.1.0 + resolution: "mimic-response@npm:3.1.0" + checksum: 10c0/0d6f07ce6e03e9e4445bee655202153bdb8a98d67ee8dc965ac140900d7a2688343e6b4c9a72cfc9ef2f7944dfd76eef4ab2482eb7b293a68b84916bac735362 + languageName: node + linkType: hard + "minimatch@npm:^3.0.4, minimatch@npm:^3.1.1": version: 3.1.2 resolution: "minimatch@npm:3.1.2" @@ -1954,6 +2075,13 @@ __metadata: languageName: node linkType: hard +"minimist@npm:^1.2.0, minimist@npm:^1.2.3": + version: 1.2.8 + resolution: "minimist@npm:1.2.8" + checksum: 10c0/19d3fcdca050087b84c2029841a093691a91259a47def2f18222f41e7645a0b7c44ef4b40e88a1e58a40c84d2ef0ee6047c55594d298146d0eb3f6b737c20ce6 + languageName: node + linkType: hard + "minipass-collect@npm:^2.0.1": version: 2.0.1 resolution: "minipass-collect@npm:2.0.1" @@ -2038,6 +2166,13 @@ __metadata: languageName: node linkType: hard +"mkdirp-classic@npm:^0.5.2, mkdirp-classic@npm:^0.5.3": + version: 0.5.3 + resolution: "mkdirp-classic@npm:0.5.3" + checksum: 10c0/95371d831d196960ddc3833cc6907e6b8f67ac5501a6582f47dfae5eb0f092e9f8ce88e0d83afcae95d6e2b61a01741ba03714eeafb6f7a6e9dcc158ac85b168 + languageName: node + linkType: hard + "mkdirp@npm:^1.0.3": version: 1.0.4 resolution: "mkdirp@npm:1.0.4" @@ -2082,6 +2217,13 @@ __metadata: languageName: node linkType: hard +"napi-build-utils@npm:^2.0.0": + version: 2.0.0 + resolution: "napi-build-utils@npm:2.0.0" + checksum: 10c0/5833aaeb5cc5c173da47a102efa4680a95842c13e0d9cc70428bd3ee8d96bb2172f8860d2811799b5daa5cbeda779933601492a2028a6a5351c6d0fcf6de83db + languageName: node + linkType: hard + "negotiator@npm:^0.6.3": version: 0.6.3 resolution: "negotiator@npm:0.6.3" @@ -2089,6 +2231,24 @@ __metadata: languageName: node linkType: hard +"node-abi@npm:^3.3.0": + version: 3.87.0 + resolution: "node-abi@npm:3.87.0" + dependencies: + semver: "npm:^7.3.5" + checksum: 10c0/41cfc361edd1b0711d412ca9e1a475180c5b897868bd5583df7ff73e30e6044cc7de307df36c2257203320f17fadf7e82dfdf5a9f6fd510a8578e3fe3ed67ebb + languageName: node + linkType: hard + +"node-addon-api@npm:^7.0.0": + version: 7.1.1 + resolution: "node-addon-api@npm:7.1.1" + dependencies: + node-gyp: "npm:latest" + checksum: 10c0/fb32a206276d608037fa1bcd7e9921e177fe992fc610d098aa3128baca3c0050fc1e014fa007e9b3874cf865ddb4f5bd9f43ccb7cbbbe4efaff6a83e920b17e9 + languageName: node + linkType: hard + "node-gyp@npm:latest": version: 10.1.0 resolution: "node-gyp@npm:10.1.0" @@ -2136,7 +2296,7 @@ __metadata: languageName: node linkType: hard -"once@npm:^1.3.0": +"once@npm:^1.3.0, once@npm:^1.3.1, once@npm:^1.4.0": version: 1.4.0 resolution: "once@npm:1.4.0" dependencies: @@ -2293,6 +2453,28 @@ __metadata: languageName: node linkType: hard +"prebuild-install@npm:^7.1.3": + version: 7.1.3 + resolution: "prebuild-install@npm:7.1.3" + dependencies: + detect-libc: "npm:^2.0.0" + expand-template: "npm:^2.0.3" + github-from-package: "npm:0.0.0" + minimist: "npm:^1.2.3" + mkdirp-classic: "npm:^0.5.3" + napi-build-utils: "npm:^2.0.0" + node-abi: "npm:^3.3.0" + pump: "npm:^3.0.0" + rc: "npm:^1.2.7" + simple-get: "npm:^4.0.0" + tar-fs: "npm:^2.0.0" + tunnel-agent: "npm:^0.6.0" + bin: + prebuild-install: bin.js + checksum: 10c0/25919a42b52734606a4036ab492d37cfe8b601273d8dfb1fa3c84e141a0a475e7bad3ab848c741d2f810cef892fcf6059b8c7fe5b29f98d30e0c29ad009bedff + languageName: node + linkType: hard + "prettier@npm:^3.3.3": version: 3.3.3 resolution: "prettier@npm:3.3.3" @@ -2344,6 +2526,16 @@ __metadata: languageName: node linkType: hard +"pump@npm:^3.0.0": + version: 3.0.3 + resolution: "pump@npm:3.0.3" + dependencies: + end-of-stream: "npm:^1.1.0" + once: "npm:^1.3.1" + checksum: 10c0/ada5cdf1d813065bbc99aa2c393b8f6beee73b5de2890a8754c9f488d7323ffd2ca5f5a0943b48934e3fcbd97637d0337369c3c631aeb9614915db629f1c75c9 + languageName: node + linkType: hard + "punycode@npm:^2.1.1, punycode@npm:^2.3.1": version: 2.3.1 resolution: "punycode@npm:2.3.1" @@ -2365,6 +2557,20 @@ __metadata: languageName: node linkType: hard +"rc@npm:^1.2.7": + version: 1.2.8 + resolution: "rc@npm:1.2.8" + dependencies: + deep-extend: "npm:^0.6.0" + ini: "npm:~1.3.0" + minimist: "npm:^1.2.0" + strip-json-comments: "npm:~2.0.1" + bin: + rc: ./cli.js + checksum: 10c0/24a07653150f0d9ac7168e52943cc3cb4b7a22c0e43c7dff3219977c2fdca5a2760a304a029c20811a0e79d351f57d46c9bde216193a0f73978496afc2b85b15 + languageName: node + linkType: hard + "react-is@npm:^18.0.0": version: 18.3.1 resolution: "react-is@npm:18.3.1" @@ -2372,6 +2578,17 @@ __metadata: languageName: node linkType: hard +"readable-stream@npm:^3.1.1, readable-stream@npm:^3.4.0": + version: 3.6.2 + resolution: "readable-stream@npm:3.6.2" + dependencies: + inherits: "npm:^2.0.3" + string_decoder: "npm:^1.1.1" + util-deprecate: "npm:^1.0.1" + checksum: 10c0/e37be5c79c376fdd088a45fa31ea2e423e5d48854be7a22a58869b4e84d25047b193f6acb54f1012331e1bcd667ffb569c01b99d36b0bd59658fb33f513511b7 + languageName: node + linkType: hard + "requires-port@npm:^1.0.0": version: 1.0.0 resolution: "requires-port@npm:1.0.0" @@ -2479,6 +2696,13 @@ __metadata: languageName: node linkType: hard +"safe-buffer@npm:^5.0.1, safe-buffer@npm:~5.2.0": + version: 5.2.1 + resolution: "safe-buffer@npm:5.2.1" + checksum: 10c0/6501914237c0a86e9675d4e51d89ca3c21ffd6a31642efeba25ad65720bce6921c9e7e974e5be91a786b25aa058b5303285d3c15dbabf983a919f5f630d349f3 + languageName: node + linkType: hard + "safer-buffer@npm:>= 2.1.2 < 3.0.0": version: 2.1.2 resolution: "safer-buffer@npm:2.1.2" @@ -2534,6 +2758,24 @@ __metadata: languageName: node linkType: hard +"simple-concat@npm:^1.0.0": + version: 1.0.1 + resolution: "simple-concat@npm:1.0.1" + checksum: 10c0/62f7508e674414008910b5397c1811941d457dfa0db4fd5aa7fa0409eb02c3609608dfcd7508cace75b3a0bf67a2a77990711e32cd213d2c76f4fd12ee86d776 + languageName: node + linkType: hard + +"simple-get@npm:^4.0.0": + version: 4.0.1 + resolution: "simple-get@npm:4.0.1" + dependencies: + decompress-response: "npm:^6.0.0" + once: "npm:^1.3.1" + simple-concat: "npm:^1.0.0" + checksum: 10c0/b0649a581dbca741babb960423248899203165769747142033479a7dc5e77d7b0fced0253c731cd57cf21e31e4d77c9157c3069f4448d558ebc96cf9e1eebcf0 + languageName: node + linkType: hard + "sirv@npm:^2.0.4": version: 2.0.4 resolution: "sirv@npm:2.0.4" @@ -2632,6 +2874,15 @@ __metadata: languageName: node linkType: hard +"string_decoder@npm:^1.1.1": + version: 1.3.0 + resolution: "string_decoder@npm:1.3.0" + dependencies: + safe-buffer: "npm:~5.2.0" + checksum: 10c0/810614ddb030e271cd591935dcd5956b2410dd079d64ff92a1844d6b7588bf992b3e1b69b0f4d34a3e06e0bd73046ac646b5264c1987b20d0601f81ef35d731d + languageName: node + linkType: hard + "strip-ansi-cjs@npm:strip-ansi@^6.0.1, strip-ansi@npm:^6.0.0, strip-ansi@npm:^6.0.1": version: 6.0.1 resolution: "strip-ansi@npm:6.0.1" @@ -2657,6 +2908,13 @@ __metadata: languageName: node linkType: hard +"strip-json-comments@npm:~2.0.1": + version: 2.0.1 + resolution: "strip-json-comments@npm:2.0.1" + checksum: 10c0/b509231cbdee45064ff4f9fd73609e2bcc4e84a4d508e9dd0f31f70356473fde18abfb5838c17d56fb236f5a06b102ef115438de0600b749e818a35fbbc48c43 + languageName: node + linkType: hard + "strip-literal@npm:^2.0.0": version: 2.1.0 resolution: "strip-literal@npm:2.1.0" @@ -2682,6 +2940,31 @@ __metadata: languageName: node linkType: hard +"tar-fs@npm:^2.0.0": + version: 2.1.4 + resolution: "tar-fs@npm:2.1.4" + dependencies: + chownr: "npm:^1.1.1" + mkdirp-classic: "npm:^0.5.2" + pump: "npm:^3.0.0" + tar-stream: "npm:^2.1.4" + checksum: 10c0/decb25acdc6839182c06ec83cba6136205bda1db984e120c8ffd0d80182bc5baa1d916f9b6c5c663ea3f9975b4dd49e3c6bb7b1707cbcdaba4e76042f43ec84c + languageName: node + linkType: hard + +"tar-stream@npm:^2.1.4": + version: 2.2.0 + resolution: "tar-stream@npm:2.2.0" + dependencies: + bl: "npm:^4.0.3" + end-of-stream: "npm:^1.4.1" + fs-constants: "npm:^1.0.0" + inherits: "npm:^2.0.3" + readable-stream: "npm:^3.1.1" + checksum: 10c0/2f4c910b3ee7196502e1ff015a7ba321ec6ea837667220d7bcb8d0852d51cb04b87f7ae471008a6fb8f5b1a1b5078f62f3a82d30c706f20ada1238ac797e7692 + languageName: node + linkType: hard + "tar@npm:^6.1.11, tar@npm:^6.1.2": version: 6.2.1 resolution: "tar@npm:6.2.1" @@ -2772,6 +3055,15 @@ __metadata: languageName: node linkType: hard +"tunnel-agent@npm:^0.6.0": + version: 0.6.0 + resolution: "tunnel-agent@npm:0.6.0" + dependencies: + safe-buffer: "npm:^5.0.1" + checksum: 10c0/4c7a1b813e7beae66fdbf567a65ec6d46313643753d0beefb3c7973d66fcec3a1e7f39759f0a0b4465883499c6dc8b0750ab8b287399af2e583823e40410a17a + languageName: node + linkType: hard + "type-detect@npm:^4.0.0, type-detect@npm:^4.0.8": version: 4.0.8 resolution: "type-detect@npm:4.0.8" @@ -2828,6 +3120,13 @@ __metadata: languageName: node linkType: hard +"util-deprecate@npm:^1.0.1": + version: 1.0.2 + resolution: "util-deprecate@npm:1.0.2" + checksum: 10c0/41a5bdd214df2f6c3ecf8622745e4a366c4adced864bc3c833739791aeeeb1838119af7daed4ba36428114b5c67dcda034a79c882e97e43c03e66a4dd7389942 + languageName: node + linkType: hard + "vite-node@npm:1.6.0": version: 1.6.0 resolution: "vite-node@npm:1.6.0"