From 648f7e541c24f857df10ccf323e0bee4701fd912 Mon Sep 17 00:00:00 2001 From: mobyw Date: Sun, 19 May 2024 21:33:30 +0800 Subject: [PATCH 01/19] :truck: Migrate the original repository code --- packages/app/index.html | 29 + packages/app/package.json | 33 +- packages/app/src/App.vue | 7 + packages/app/src/blocks/blocks.js | 4 + packages/app/src/blocks/nonebot_handle.js | 48 + packages/app/src/blocks/nonebot_logger.js | 6 + packages/app/src/blocks/nonebot_matcher.js | 47 + packages/app/src/blocks/nonebot_message.js | 371 ++ packages/app/src/blocks/python_dict.js | 254 ++ packages/app/src/components/BlocklyPage.vue | 47 + packages/app/src/components/ButtonPanel.vue | 122 + packages/app/src/components/CodeTab.vue | 31 + packages/app/src/components/ContentCard.vue | 53 + packages/app/src/components/ContentPage.vue | 23 + packages/app/src/components/TutorialTab.vue | 28 + packages/app/src/data/default.json | 99 + packages/app/src/data/toolbox.json | 366 ++ packages/app/src/index.css | 40 - packages/app/src/index.html | 16 - packages/app/src/index.ts | 64 - packages/app/src/main.ts | 16 + packages/app/src/plugins/index.ts | 15 + packages/app/src/plugins/vuetify.ts | 117 + packages/app/src/scss/style.scss | 9 + packages/app/src/stores/workspaces.ts | 128 + packages/app/src/theme/index.ts | 19 + packages/app/src/toolbox.ts | 716 ---- packages/app/src/workspaces/index.vue | 94 + packages/app/tsconfig.json | 15 +- packages/app/vite.config.mjs | 74 + packages/app/webpack.config.js | 67 - pnpm-lock.yaml | 4144 +++++-------------- 32 files changed, 2963 insertions(+), 4139 deletions(-) create mode 100644 packages/app/index.html create mode 100644 packages/app/src/App.vue create mode 100644 packages/app/src/blocks/blocks.js create mode 100644 packages/app/src/blocks/nonebot_handle.js create mode 100644 packages/app/src/blocks/nonebot_logger.js create mode 100644 packages/app/src/blocks/nonebot_matcher.js create mode 100644 packages/app/src/blocks/nonebot_message.js create mode 100644 packages/app/src/blocks/python_dict.js create mode 100644 packages/app/src/components/BlocklyPage.vue create mode 100644 packages/app/src/components/ButtonPanel.vue create mode 100644 packages/app/src/components/CodeTab.vue create mode 100644 packages/app/src/components/ContentCard.vue create mode 100644 packages/app/src/components/ContentPage.vue create mode 100644 packages/app/src/components/TutorialTab.vue create mode 100644 packages/app/src/data/default.json create mode 100644 packages/app/src/data/toolbox.json delete mode 100644 packages/app/src/index.css delete mode 100644 packages/app/src/index.html delete mode 100644 packages/app/src/index.ts create mode 100644 packages/app/src/main.ts create mode 100644 packages/app/src/plugins/index.ts create mode 100644 packages/app/src/plugins/vuetify.ts create mode 100644 packages/app/src/scss/style.scss create mode 100644 packages/app/src/stores/workspaces.ts create mode 100644 packages/app/src/theme/index.ts delete mode 100644 packages/app/src/toolbox.ts create mode 100644 packages/app/src/workspaces/index.vue create mode 100644 packages/app/vite.config.mjs delete mode 100644 packages/app/webpack.config.js diff --git a/packages/app/index.html b/packages/app/index.html new file mode 100644 index 0000000..08d4f4a --- /dev/null +++ b/packages/app/index.html @@ -0,0 +1,29 @@ + + + + + + + + NoneBlockly for NoneBot2 + + + +
+ + + + + diff --git a/packages/app/package.json b/packages/app/package.json index 8282a61..15af09e 100644 --- a/packages/app/package.json +++ b/packages/app/package.json @@ -1,30 +1,35 @@ { "name": "@noneblockly/app", "version": "0.0.0", - "main": "index.js", + "main": "main.ts", "private": true, "scripts": { - "test": "echo \"Error: no test specified\" && exit 1", - "build": "webpack --mode production", - "start": "webpack serve --open --mode development" + "dev": "vite", + "build": "vue-tsc --noEmit && vite build", + "preview": "vite preview", + "start": "vite preview" }, "keywords": [ "blockly" ], "author": "", - "license": "Apache-2.0", + "license": "MIT", "devDependencies": { - "css-loader": "^6.11.0", - "html-webpack-plugin": "^5.6.0", - "source-map-loader": "^4.0.2", - "style-loader": "^3.3.4", - "ts-loader": "^9.5.1", + "@blockly/theme-dark": "^6.0.6", + "@highlightjs/vue-plugin": "^2.1.0", + "@mdi/js": "^7.4.47", + "@vitejs/plugin-vue": "^5.0.4", "typescript": "^5.4.4", - "webpack": "^5.91.0", - "webpack-cli": "^4.10.0", - "webpack-dev-server": "^4.15.2" + "vite": "^5.2.9", + "vite-plugin-static-copy": "^1.0.2", + "vite-plugin-vuetify": "^2.0.3", + "vue-tsc": "^2.0.13" }, "dependencies": { - "blockly": "^10.4.3" + "blockly": "^10.4.3", + "highlight.js": "^11.9.0", + "sass": "^1.75.0", + "vue": "^3.4.22", + "vuetify": "^3.5.15" } } diff --git a/packages/app/src/App.vue b/packages/app/src/App.vue new file mode 100644 index 0000000..e906550 --- /dev/null +++ b/packages/app/src/App.vue @@ -0,0 +1,7 @@ + + + diff --git a/packages/app/src/blocks/blocks.js b/packages/app/src/blocks/blocks.js new file mode 100644 index 0000000..fa85219 --- /dev/null +++ b/packages/app/src/blocks/blocks.js @@ -0,0 +1,4 @@ +import "./python_dict.js"; +import "./nonebot_matcher.js"; +import "./nonebot_handle.js"; +import "./nonebot_message.js"; diff --git a/packages/app/src/blocks/nonebot_handle.js b/packages/app/src/blocks/nonebot_handle.js new file mode 100644 index 0000000..24c7201 --- /dev/null +++ b/packages/app/src/blocks/nonebot_handle.js @@ -0,0 +1,48 @@ +import Blockly from "blockly/core"; +import { pythonGenerator, Order } from "blockly/python"; + +Blockly.defineBlocksWithJsonArray([ + { + type: "nb_handle", + message0: "事件处理 %1 响应器 %2 %3", + args0: [ + { + type: "input_dummy", + }, + { + type: "input_value", + name: "MATCHER", + check: "Matcher", + }, + { + type: "input_statement", + name: "HANDLE", + }, + ], + inputsInline: true, + previousStatement: null, + nextStatement: null, + colour: 60, + tooltip: "", + helpUrl: "", + }, +]); + +// The following is for the Python generator + +pythonGenerator.forBlock["nb_handle"] = function (block, generator) { + const value_matcher = generator.valueToCode(block, "MATCHER", Order.ATOMIC); + const statements_handle = + generator.statementToCode(block, "HANDLE") || generator.PASS; + generator.definitions_["from_nonebot_adapters_import_Bot"] = + "from nonebot.adapters import Bot"; + generator.definitions_["from_nonebot_adapters_import_Event"] = + "from nonebot.adapters import Event"; + let code = ""; + if (value_matcher) { + code += `@${value_matcher}.handle()\n`; + code += `async def _(bot: Bot, event: Event):\n`; + code += statements_handle; + } + return code; +}; diff --git a/packages/app/src/blocks/nonebot_logger.js b/packages/app/src/blocks/nonebot_logger.js new file mode 100644 index 0000000..e53debc --- /dev/null +++ b/packages/app/src/blocks/nonebot_logger.js @@ -0,0 +1,6 @@ +import Blockly from "blockly/core"; +import { pythonGenerator, Order } from "blockly/python"; + +Blockly.defineBlocksWithJsonArray([]); + +// The following is for the Python generator diff --git a/packages/app/src/blocks/nonebot_matcher.js b/packages/app/src/blocks/nonebot_matcher.js new file mode 100644 index 0000000..69bce57 --- /dev/null +++ b/packages/app/src/blocks/nonebot_matcher.js @@ -0,0 +1,47 @@ +import Blockly from "blockly/core"; +import { pythonGenerator, Order } from "blockly/python"; + +Blockly.defineBlocksWithJsonArray([ + { + type: "nb_on_command", + message0: "创建指令响应器 %1 %2 与我相关 %3", + args0: [ + { + type: "field_input", + name: "CMD", + text: "指令", + }, + { + type: "input_dummy", + }, + { + type: "field_checkbox", + name: "TO_ME", + checked: false, + }, + ], + inputsInline: true, + output: "Matcher", + colour: 20, + tooltip: + "请在第一个格子中填写命令触发词;若勾选“与我相关”,只有在私聊、群聊中@或回复、消息以机器人名字开始或结束时会触发", + helpUrl: "https://nonebot.dev/docs/next/advanced/matcher#command", + }, +]); + +// The following is for the Python generator + +pythonGenerator.forBlock["nb_on_command"] = function (block, generator) { + const text_cmd = block.getFieldValue("CMD"); + const checkbox_to_me = block.getFieldValue("TO_ME") === "TRUE"; + let to_me_statement = ""; + generator.definitions_["from_nonebot_plugin_import_on_command"] = + "from nonebot.plugin import on_command"; + if (checkbox_to_me) { + generator.definitions_["from_nonebot_rule_import_on_command"] = + "from nonebot.rule import to_me"; + to_me_statement = ", rule=to_me()"; + } + let code = `on_command("${text_cmd}"${to_me_statement})`; + return [code, Order.NONE]; +}; diff --git a/packages/app/src/blocks/nonebot_message.js b/packages/app/src/blocks/nonebot_message.js new file mode 100644 index 0000000..5816400 --- /dev/null +++ b/packages/app/src/blocks/nonebot_message.js @@ -0,0 +1,371 @@ +import Blockly from "blockly/core"; +import { pythonGenerator, Order } from "blockly/python"; + +Blockly.defineBlocksWithJsonArray([ + { + type: "nb_message_text", + message0: "文本消息 %1", + args0: [ + { + type: "field_input", + name: "TEXT", + text: "消息内容", + }, + ], + inputsInline: true, + output: "Message", + colour: 100, + tooltip: "", + helpUrl: "", + }, + { + type: "nb_message_image", + message0: "图片消息 %1 %2", + args0: [ + { + type: "field_dropdown", + name: "TYPE", + options: [ + ["URL", "url"], + ["本地路径", "path"], + ], + }, + { + type: "field_input", + name: "IMAGE", + text: "图片信息", + }, + ], + inputsInline: true, + output: "Message", + colour: 100, + tooltip: + "支持通过URL发送网络图片和通过文件路径发送本地图片。如果选择文件路径,请填写绝对路径或相对于机器人运行目录的相对路径", + helpUrl: "", + }, + { + type: "nb_message_send", + message0: "发送消息 %1 回复原消息 %2 @发送者 %3", + args0: [ + { + type: "input_value", + name: "MESSAGE", + check: "Message", + }, + { + type: "field_checkbox", + name: "REPLY", + checked: false, + }, + { + type: "field_checkbox", + name: "AT", + checked: true, + }, + ], + inputsInline: true, + previousStatement: null, + nextStatement: null, + colour: 100, + tooltip: "填入文本消息或图片消息构造块,也可以填入对应的变量", + helpUrl: "", + }, + { + type: "nb_message_finish", + message0: "发送消息并结束事件处理 %1 回复消息 %2 @发送者 %3", + args0: [ + { + type: "input_value", + name: "MESSAGE", + check: "Message", + }, + { + type: "field_checkbox", + name: "REPLY", + checked: false, + }, + { + type: "field_checkbox", + name: "AT", + checked: true, + }, + ], + inputsInline: true, + previousStatement: null, + colour: 100, + tooltip: "填入文本消息或图片消息构造块,也可以填入对应的变量", + helpUrl: "", + }, + { + type: "nb_message_merge_container", + message0: "消息列表 %1 %2", + args0: [ + { + type: "input_dummy", + }, + { + type: "input_statement", + name: "STACK", + }, + ], + colour: 0, + tooltip: "", + helpUrl: "", + }, + { + type: "nb_message_merge_item", + message0: "消息", + args0: [], + colour: 0, + previousStatement: null, + nextStatement: null, + tooltip: "", + helpUrl: "", + }, + { + type: "nb_message_merge", + message0: "合并多条消息 %1 第 1 条消息 %2 第 2 条消息 %3", + args0: [ + { + type: "input_dummy", + }, + { + type: "input_value", + name: "MESSAGE0", + check: "Message", + align: "RIGHT", + }, + { + type: "input_value", + name: "MESSAGE1", + check: "Message", + align: "RIGHT", + }, + ], + inputsInline: false, + output: "Message", + colour: 100, + tooltip: "填入文本消息或图片消息构造块,也可以填入对应的变量", + helpUrl: "", + mutator: "nb_message_merge_mutator", + }, +]); + +const nbMessageMergeMutator = { + itemCount_: 2, + /** + * Create XML to represent list inputs. + * Backwards compatible serialization implementation. + */ + mutationToDom: function () { + const container = document.createElement("mutation"); + container.setAttribute("items", this.itemCount_); + return container; + }, + /** + * Parse XML to restore the list inputs. + * Backwards compatible serialization implementation. + * + * @param container XML storage element. + */ + domToMutation: function (container) { + const items = container.getAttribute("items"); + if (!items) throw new TypeError("element did not have items"); + this.itemCount_ = parseInt(container.getAttribute("items"), 10); + this.updateShape_(); + }, + /** + * Returns the state of this block as a JSON serializable object. + * + * @returns The state of this block, ie the item count. + */ + saveExtraState: function () { + return { + itemCount: this.itemCount_, + }; + }, + /** + * Applies the given state to this block. + * + * @param state The state to apply to this block, ie the item count. + */ + loadExtraState: function (state) { + this.itemCount_ = state["itemCount"]; + this.updateShape_(); + }, + /** + * Populate the mutator's dialog with this block's components. + * + * @param workspace Mutator's workspace. + * @returns Root block in mutator. + */ + decompose: function (workspace) { + const containerBlock = workspace.newBlock("nb_message_merge_container"); + containerBlock.initSvg(); + let connection = containerBlock.getInput("STACK").connection; + for (let i = 0; i < this.itemCount_; i++) { + const itemBlock = workspace.newBlock("nb_message_merge_item"); + itemBlock.initSvg(); + if (!itemBlock.previousConnection) { + throw new Error("itemBlock has no previousConnection"); + } + connection.connect(itemBlock.previousConnection); + connection = itemBlock.nextConnection; + } + return containerBlock; + }, + /** + * Reconfigure this block based on the mutator dialog's components. + * + * @param containerBlock Root block in mutator. + */ + compose: function (containerBlock) { + let itemBlock = containerBlock.getInputTargetBlock("STACK"); + // Count number of inputs. + const connections = []; + while (itemBlock) { + if (itemBlock.isInsertionMarker()) { + itemBlock = itemBlock.getNextBlock(); + continue; + } + connections.push(itemBlock.valueConnection_); + itemBlock = itemBlock.getNextBlock(); + } + // Disconnect any children that don't belong. + for (let i = 0; i < this.itemCount_; i++) { + const connection = this.getInput("MESSAGE" + i).connection + .targetConnection; + if (connection && connections.indexOf(connection) === -1) { + connection.disconnect(); + } + } + this.itemCount_ = connections.length; + this.updateShape_(); + // Reconnect any child blocks. + for (let i = 0; i < this.itemCount_; i++) { + connections[i]?.reconnect(this, "MESSAGE" + i); + } + }, + /** + * Store pointers to any connected child blocks. + * + * @param containerBlock Root block in mutator. + */ + saveConnections: function (containerBlock) { + let itemBlock = containerBlock.getInputTargetBlock("STACK"); + let i = 0; + while (itemBlock) { + if (itemBlock.isInsertionMarker()) { + itemBlock = itemBlock.getNextBlock(); + continue; + } + const input = this.getInput("MESSAGE" + i); + itemBlock.valueConnection_ = input?.connection.targetConnection; + itemBlock = itemBlock.getNextBlock(); + i++; + } + }, + /** + * Modify this block to have the correct number of inputs. + */ + updateShape_: function () { + if (this.itemCount_ && this.getInput("EMPTY")) { + this.removeInput("EMPTY"); + } else if (!this.itemCount_ && !this.getInput("EMPTY")) { + this.appendDummyInput("EMPTY").appendField("空消息列表"); + } + // Add new inputs. + for (let i = 0; i < this.itemCount_; i++) { + if (!this.getInput("MESSAGE" + i)) { + this.appendValueInput("MESSAGE" + i) + .setAlign(Blockly.inputs.Align.RIGHT) + .appendField(`第 ${i + 1} 条消息`); + } + } + // Remove deleted inputs. + for (let i = this.itemCount_; this.getInput("MESSAGE" + i); i++) { + this.removeInput("MESSAGE" + i); + } + }, +}; + +// Function signature. + +if (Blockly.Extensions.isRegistered("nb_message_merge_mutator")) { + Blockly.Extensions.unregister("nb_message_merge_mutator"); +} +Blockly.Extensions.registerMutator( + "nb_message_merge_mutator", + nbMessageMergeMutator, +); + +// The following is for the Python generator + +pythonGenerator.forBlock["nb_message_text"] = function (block, generator) { + const text_text = block.getFieldValue("TEXT"); + generator.definitions_["from_nonebot_plugin_saa_import_Text"] = + "from nonebot_plugin_saa import Text"; + const code = `Text("${text_text}")`; + return [code, Order.ATOMIC]; +}; + +pythonGenerator.forBlock["nb_message_image"] = function (block, generator) { + const dropdown_type = block.getFieldValue("TYPE"); + const text_image = block.getFieldValue("IMAGE"); + generator.definitions_["from_nonebot_plugin_saa_import_Image"] = + "from nonebot_plugin_saa import Image"; + let image_code = ""; + if (dropdown_type === "url") { + image_code = `"${text_image}"`; + } else if (dropdown_type === "path") { + generator.definitions_["from_pathlib_import_Path"] = + "from pathlib import Path"; + image_code = `Path("${text_image.replace(/\\/g, "\\\\")}")`; + } + const code = `Image(${image_code})`; + return [code, Order.ATOMIC]; +}; + +pythonGenerator.forBlock["nb_message_send"] = function (block, generator) { + const value_message = generator.valueToCode(block, "MESSAGE", Order.ATOMIC); + const checkbox_reply = block.getFieldValue("REPLY") === "TRUE"; + const checkbox_at = block.getFieldValue("AT") === "TRUE"; + let params = []; + if (checkbox_reply) { + params.push("reply=True"); + } + if (checkbox_at) { + params.push("at_sender=True"); + } + const code = `await ${value_message}.send(${params.join(", ")})\n`; + return code; +}; + +pythonGenerator.forBlock["nb_message_finish"] = function (block, generator) { + const value_message = generator.valueToCode(block, "MESSAGE", Order.ATOMIC); + const checkbox_reply = block.getFieldValue("REPLY") === "TRUE"; + const checkbox_at = block.getFieldValue("AT") === "TRUE"; + let params = []; + if (checkbox_reply) { + params.push("reply=True"); + } + if (checkbox_at) { + params.push("at_sender=True"); + } + const code = `await ${value_message}.finish(${params.join(", ")})\n`; + return code; +}; + +pythonGenerator.forBlock["nb_message_merge"] = function (block, generator) { + let code = new Array(block.itemCount_); + generator.definitions_["from_nonebot_plugin_saa_import_MessageFactory"] = + "from nonebot_plugin_saa import MessageFactory"; + for (let n = 0; n < block.itemCount_; n++) { + code[n] = generator.valueToCode(block, "MESSAGE" + n, Order.NONE) || "None"; + } + code = code.filter(function (element) { + return element !== "None"; + }); + code = `MessageFactory([${code.join(", ")}])`; + return [code, Order.ATOMIC]; +}; diff --git a/packages/app/src/blocks/python_dict.js b/packages/app/src/blocks/python_dict.js new file mode 100644 index 0000000..3fec423 --- /dev/null +++ b/packages/app/src/blocks/python_dict.js @@ -0,0 +1,254 @@ +import Blockly from "blockly/core"; +import { Order, pythonGenerator } from "blockly/python"; + +Blockly.defineBlocksWithJsonArray([ + { + type: "dicts_create_with_container", + message0: "字典 %1 %2", + args0: [ + { + type: "input_dummy", + }, + { + type: "input_statement", + name: "STACK", + }, + ], + colour: 0, + tooltip: "", + helpUrl: "", + }, + { + type: "dicts_create_with_item", + message0: "键值对", + args0: [], + colour: 0, + previousStatement: null, + nextStatement: null, + tooltip: "", + helpUrl: "", + }, + { + type: "dicts_create_with", + message0: "创建字典 %1 KEY-0 %2 VALUE-0 %3 KEY-1 %4 VALUE-1 %5", + args0: [ + { + type: "input_dummy", + }, + { + type: "input_value", + name: "KEY0", + align: "RIGHT", + }, + { + type: "input_value", + name: "VALUE0", + align: "RIGHT", + }, + { + type: "input_value", + name: "KEY1", + align: "RIGHT", + }, + { + type: "input_value", + name: "VALUE1", + align: "RIGHT", + }, + ], + colour: 0, + output: "dict", + tooltip: "", + helpUrl: "", + mutator: "dict_create_with_mutator", + }, + { + type: "dicts_get", + message0: "从字典 %1 中取 KEY %2 的值", + args0: [ + { + type: "input_value", + name: "DICT", + check: "dict", + }, + { + type: "input_value", + name: "ITEM", + }, + ], + colour: 0, + output: null, + inputsInline: true, + tooltip: "", + helpUrl: "", + }, +]); + +const dictCreateWithMutator = { + itemCount_: 2, + /** + * Create XML to represent list inputs. + * Backwards compatible serialization implementation. + */ + mutationToDom: function () { + const container = document.createElement("mutation"); + container.setAttribute("items", this.itemCount_); + return container; + }, + /** + * Parse XML to restore the list inputs. + * Backwards compatible serialization implementation. + * + * @param container XML storage element. + */ + domToMutation: function (container) { + for (let x = 0; x < this.itemCount_; x++) { + this.removeInput("KEY" + x); + this.removeInput("VALUE" + x); + } + this.itemCount_ = parseInt(container.getAttribute("items"), 10); + for (let x = 0; x < this.itemCount_; x++) { + this.appendValueInput("KEY" + x) + .appendField("KEY-" + x) + .setAlign(Blockly.inputs.Align.RIGHT); + this.appendValueInput("VALUE" + x) + .appendField("VALUE-" + x) + .setAlign(Blockly.inputs.Align.RIGHT); + } + }, + /** + * Populate the mutator's dialog with this block's components. + * + * @param workspace Mutator's workspace. + * @returns Root block in mutator. + */ + decompose: function (workspace) { + const containerBlock = workspace.newBlock("dicts_create_with_container"); + containerBlock.initSvg(); + let connection = containerBlock.getInput("STACK").connection; + for (let i = 0; i < this.itemCount_; i++) { + const itemBlock = workspace.newBlock("dicts_create_with_item"); + itemBlock.initSvg(); + if (!itemBlock.previousConnection) { + throw new Error("itemBlock has no previousConnection"); + } + connection.connect(itemBlock.previousConnection); + connection = itemBlock.nextConnection; + } + return containerBlock; + }, + /** + * Reconfigure this block based on the mutator dialog's components. + * + * @param containerBlock Root block in mutator. + */ + compose: function (containerBlock) { + let itemBlock = containerBlock.getInputTargetBlock("STACK"); + // Count number of inputs. + const connections = []; + while (itemBlock) { + if (itemBlock.isInsertionMarker()) { + itemBlock = itemBlock.getNextBlock(); + continue; + } + connections.push(itemBlock.valueConnection_?.key); + connections.push(itemBlock.valueConnection_?.value); + itemBlock = itemBlock.getNextBlock(); + } + // Disconnect any children that don't belong. + for (let i = 0; i < this.itemCount_; i++) { + const connection_key = this.getInput("KEY" + i).connection + .targetConnection; + if (connection_key && connections.indexOf(connection_key) === -1) { + connection_key.disconnect(); + } + const connection_value = this.getInput("KEY" + i).connection + .targetConnection; + if (connection_value && connections.indexOf(connection_value) === -1) { + connection_value.disconnect(); + } + } + this.itemCount_ = connections.length / 2; + this.updateShape_(); + // Reconnect any child blocks. + for (let i = 0; i < this.itemCount_; i++) { + connections[i]?.reconnect(this, "MESSAGE" + i); + } + }, + saveConnections: function (containerBlock) { + // Store a pointer to any connected child blocks. + let itemBlock = containerBlock.getInputTargetBlock("STACK"); + let x = 0; + while (itemBlock) { + let key_input = this.getInput("KEY" + x); + let value_input = this.getInput("VALUE" + x); + itemBlock.valueConnection_ = { + key: key_input?.connection.targetConnection, + value: value_input?.connection.targetConnection, + }; + x++; + itemBlock = + itemBlock.nextConnection && itemBlock.nextConnection.targetBlock(); + } + }, + /** + * Modify this block to have the correct number of inputs. + */ + updateShape_: function () { + if (this.itemCount_ && this.getInput("EMPTY")) { + this.removeInput("EMPTY"); + } else if (!this.itemCount_ && !this.getInput("EMPTY")) { + this.appendDummyInput("EMPTY").appendField("空字典"); + } + // Add new inputs. + for (let i = 0; i < this.itemCount_; i++) { + if (!this.getInput("KEY" + i)) { + this.appendValueInput("KEY" + i) + .setAlign(Blockly.inputs.Align.RIGHT) + .appendField("KEY-" + i); + } + if (!this.getInput("VALUE" + i)) { + this.appendValueInput("VALUE" + i) + .setAlign(Blockly.inputs.Align.RIGHT) + .appendField("VALUE-" + i); + } + } + // Remove deleted inputs. + for (let i = this.itemCount_; this.getInput("KEY" + i); i++) { + this.removeInput("KEY" + i); + } + for (let i = this.itemCount_; this.getInput("VALUE" + i); i++) { + this.removeInput("VALUE" + i); + } + }, +}; + +// Function signature. + +if (Blockly.Extensions.isRegistered("dict_create_with_mutator")) { + Blockly.Extensions.unregister("dict_create_with_mutator"); +} +Blockly.Extensions.registerMutator( + "dict_create_with_mutator", + dictCreateWithMutator, +); + +// The following is for the Python generator + +pythonGenerator.forBlock["dicts_get"] = function (block, generator) { + let dict = generator.valueToCode(block, "DICT", Order.MEMBER) || "{}"; + let value = generator.valueToCode(block, "ITEM", Order.NONE) || "None"; + let code = dict + "[" + value + "]"; + return [code, Order.ATOMIC]; +}; + +pythonGenerator.forBlock["dicts_create_with"] = function (block, generator) { + let code = new Array(block.itemCount_); + for (let n = 0; n < block.itemCount_; n++) { + let key = generator.valueToCode(block, "KEY" + n, Order.NONE) || "None"; + let value = generator.valueToCode(block, "VALUE" + n, Order.NONE) || "None"; + code[n] = key + ": " + value; + } + code = "{" + code.join(", ") + "}"; + return [code, Order.ATOMIC]; +}; diff --git a/packages/app/src/components/BlocklyPage.vue b/packages/app/src/components/BlocklyPage.vue new file mode 100644 index 0000000..18b9712 --- /dev/null +++ b/packages/app/src/components/BlocklyPage.vue @@ -0,0 +1,47 @@ + + + + + diff --git a/packages/app/src/components/ButtonPanel.vue b/packages/app/src/components/ButtonPanel.vue new file mode 100644 index 0000000..fd03cb6 --- /dev/null +++ b/packages/app/src/components/ButtonPanel.vue @@ -0,0 +1,122 @@ + + + + + + + diff --git a/packages/app/src/components/CodeTab.vue b/packages/app/src/components/CodeTab.vue new file mode 100644 index 0000000..e49baf8 --- /dev/null +++ b/packages/app/src/components/CodeTab.vue @@ -0,0 +1,31 @@ + + + + + + + diff --git a/packages/app/src/components/ContentCard.vue b/packages/app/src/components/ContentCard.vue new file mode 100644 index 0000000..1e474fb --- /dev/null +++ b/packages/app/src/components/ContentCard.vue @@ -0,0 +1,53 @@ + + + + + diff --git a/packages/app/src/components/ContentPage.vue b/packages/app/src/components/ContentPage.vue new file mode 100644 index 0000000..9965e9c --- /dev/null +++ b/packages/app/src/components/ContentPage.vue @@ -0,0 +1,23 @@ + + + diff --git a/packages/app/src/components/TutorialTab.vue b/packages/app/src/components/TutorialTab.vue new file mode 100644 index 0000000..4513061 --- /dev/null +++ b/packages/app/src/components/TutorialTab.vue @@ -0,0 +1,28 @@ + + + diff --git a/packages/app/src/data/default.json b/packages/app/src/data/default.json new file mode 100644 index 0000000..04bd3f1 --- /dev/null +++ b/packages/app/src/data/default.json @@ -0,0 +1,99 @@ +{ + "blocks": { + "languageVersion": 0, + "blocks": [ + { + "type": "nb_handle", + "id": "xqk)rwW.*|,ReCZ7GN34", + "x": 70, + "y": 170, + "inputs": { + "MATCHER": { + "block": { + "type": "nb_on_command", + "id": "5PM+dBPat=SWc/YmHpk9", + "fields": { "CMD": "hello", "TO_ME": true } + } + }, + "HANDLE": { + "block": { + "type": "nb_message_send", + "id": "D`1oS0TX)2cFc+=.~t6(", + "inline": false, + "fields": { "REPLY": false, "AT": true }, + "inputs": { + "MESSAGE": { + "block": { + "type": "nb_message_text", + "id": "[]0ZT%EDhXarR826.C*H", + "fields": { "TEXT": "world" } + } + } + }, + "next": { + "block": { + "type": "nb_message_send", + "id": "?Dzq2xds$frA|StTBDFb", + "inline": false, + "fields": { "REPLY": false, "AT": false }, + "inputs": { + "MESSAGE": { + "block": { + "type": "nb_message_image", + "id": "jhcN}f}wm;3~P?v|tgXs", + "fields": { + "TYPE": "url", + "IMAGE": "https://img.moehu.org/pic.php?id=acgbs" + } + } + } + }, + "next": { + "block": { + "type": "nb_message_finish", + "id": "]b`}K:z^KKzyMDq9uEQF", + "inline": false, + "fields": { "REPLY": true, "AT": false }, + "inputs": { + "MESSAGE": { + "block": { + "type": "nb_message_merge", + "id": "_%9=l/G=r#,Iv;U|LSRj", + "extraState": { "itemCount": 3 }, + "inputs": { + "MESSAGE0": { + "block": { + "type": "nb_message_text", + "id": "J2Q:AACuy/oR9q?Em~(B", + "fields": { "TEXT": "hello" } + } + }, + "MESSAGE1": { + "block": { + "type": "nb_message_text", + "id": "2cI-I-{p52RzJ5.P,nii", + "fields": { "TEXT": ", " } + } + }, + "MESSAGE2": { + "block": { + "type": "nb_message_text", + "id": "QtldsFC_-rC;mlebK[Ns", + "fields": { "TEXT": "world" } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + ] + } +} diff --git a/packages/app/src/data/toolbox.json b/packages/app/src/data/toolbox.json new file mode 100644 index 0000000..6f37628 --- /dev/null +++ b/packages/app/src/data/toolbox.json @@ -0,0 +1,366 @@ +{ + "contents": [ + { + "kind": "CATEGORY", + "contents": [ + { + "kind": "BLOCK", + "type": "controls_if" + }, + { + "kind": "BLOCK", + "type": "logic_compare" + }, + { + "kind": "BLOCK", + "type": "logic_operation" + }, + { + "kind": "BLOCK", + "type": "logic_negate" + }, + { + "kind": "BLOCK", + "type": "logic_boolean" + }, + { + "kind": "BLOCK", + "type": "logic_null", + "disabled": "true" + }, + { + "kind": "BLOCK", + "type": "logic_ternary" + } + ], + "name": "逻辑", + "categorystyle": "logic_category" + }, + { + "kind": "CATEGORY", + "contents": [ + { + "kind": "BLOCK", + "type": "controls_repeat_ext" + }, + { + "kind": "BLOCK", + "type": "controls_repeat" + }, + { + "kind": "BLOCK", + "type": "controls_whileUntil" + }, + { + "kind": "BLOCK", + "type": "controls_for" + }, + { + "kind": "BLOCK", + "type": "controls_forEach" + }, + { + "kind": "BLOCK", + "type": "controls_flow_statements" + } + ], + "name": "循环", + "categorystyle": "loop_category" + }, + { + "kind": "CATEGORY", + "contents": [ + { + "kind": "BLOCK", + "type": "math_number", + "gap": "32" + }, + { + "kind": "BLOCK", + "type": "math_arithmetic" + }, + { + "kind": "BLOCK", + "type": "math_single" + }, + { + "kind": "BLOCK", + "type": "math_trig" + }, + { + "kind": "BLOCK", + "type": "math_constant" + }, + { + "kind": "BLOCK", + "type": "math_number_property" + }, + { + "kind": "BLOCK", + "type": "math_round" + }, + { + "kind": "BLOCK", + "type": "math_on_list" + }, + { + "kind": "BLOCK", + "type": "math_modulo" + }, + { + "kind": "BLOCK", + "type": "math_constrain" + }, + { + "kind": "BLOCK", + "type": "math_random_int" + }, + { + "kind": "BLOCK", + "type": "math_random_float" + }, + { + "kind": "BLOCK", + "type": "math_atan2" + } + ], + "name": "数学", + "categorystyle": "math_category" + }, + { + "kind": "CATEGORY", + "contents": [ + { + "kind": "BLOCK", + "type": "text" + }, + { + "kind": "BLOCK", + "type": "text_multiline" + }, + { + "kind": "BLOCK", + "type": "text_join" + }, + { + "kind": "BLOCK", + "type": "text_append" + }, + { + "kind": "BLOCK", + "type": "text_length" + }, + { + "kind": "BLOCK", + "type": "text_isEmpty" + }, + { + "kind": "BLOCK", + "type": "text_indexOf" + }, + { + "kind": "BLOCK", + "type": "text_charAt" + }, + { + "kind": "BLOCK", + "type": "text_getSubstring" + }, + { + "kind": "BLOCK", + "type": "text_changeCase" + }, + { + "kind": "BLOCK", + "type": "text_trim" + }, + { + "kind": "BLOCK", + "type": "text_count" + }, + { + "kind": "BLOCK", + "type": "text_replace" + }, + { + "kind": "BLOCK", + "type": "text_reverse" + } + ], + "name": "文本", + "categorystyle": "text_category" + }, + { + "kind": "CATEGORY", + "contents": [ + { + "kind": "BLOCK", + "type": "lists_create_with" + }, + { + "kind": "BLOCK", + "type": "lists_repeat" + }, + { + "kind": "BLOCK", + "type": "lists_length" + }, + { + "kind": "BLOCK", + "type": "lists_isEmpty" + }, + { + "kind": "BLOCK", + "type": "lists_indexOf" + }, + { + "kind": "BLOCK", + "type": "lists_getIndex" + }, + { + "kind": "BLOCK", + "type": "lists_setIndex" + }, + { + "kind": "BLOCK", + "type": "lists_getSublist" + }, + { + "kind": "BLOCK", + "type": "lists_split" + }, + { + "kind": "BLOCK", + "type": "lists_sort" + }, + { + "kind": "BLOCK", + "type": "lists_reverse" + } + ], + "name": "列表", + "categorystyle": "list_category" + }, + { + "kind": "CATEGORY", + "contents": [ + { + "kind": "BLOCK", + "type": "dicts_create_with" + }, + { + "kind": "BLOCK", + "type": "dicts_get" + } + ], + "name": "字典", + "colour": "0" + }, + { + "kind": "SEP" + }, + { + "kind": "CATEGORY", + "contents": [ + { + "kind": "LABEL", + "text": "需要填入“事件处理”类模块的“响应器”中" + }, + { + "kind": "LABEL", + "text": "也可以创建一个变量赋值,使用变量传递" + }, + { + "kind": "BLOCK", + "type": "nb_on_command" + } + ], + "name": "事件响应器", + "colour": "20" + }, + { + "kind": "CATEGORY", + "contents": [ + { + "kind": "LABEL", + "text": "需要填入“事件响应器”模块或对应的变量" + }, + { + "kind": "BLOCK", + "type": "nb_handle" + } + ], + "name": "事件处理", + "colour": "60" + }, + { + "kind": "CATEGORY", + "contents": [ + { + "kind": "LABEL", + "text": "通过以下模块构造消息" + }, + { + "kind": "BLOCK", + "type": "nb_message_text" + }, + { + "kind": "BLOCK", + "type": "nb_message_image" + }, + { + "kind": "LABEL", + "text": "通过以下模块发送消息" + }, + { + "kind": "BLOCK", + "type": "nb_message_send" + }, + { + "kind": "BLOCK", + "type": "nb_message_finish" + }, + { + "kind": "LABEL", + "text": "通过以下模块处理消息" + }, + { + "kind": "BLOCK", + "type": "nb_message_merge" + } + ], + "name": "消息构造与发送", + "colour": "100" + }, + { + "kind": "CATEGORY", + "contents": [], + "name": "消息处理", + "colour": "140" + }, + { + "kind": "CATEGORY", + "contents": [], + "name": "调试信息", + "colour": "180" + }, + { + "kind": "SEP" + }, + { + "kind": "CATEGORY", + "name": "变量", + "categorystyle": "variable_category", + "custom": "VARIABLE" + }, + { + "kind": "CATEGORY", + "name": "函数", + "categorystyle": "procedure_category", + "custom": "PROCEDURE" + } + ], + "xmlns": "https://developers.google.com/blockly/xml", + "id": "toolbox-categories", + "style": "display: none" +} diff --git a/packages/app/src/index.css b/packages/app/src/index.css deleted file mode 100644 index f282700..0000000 --- a/packages/app/src/index.css +++ /dev/null @@ -1,40 +0,0 @@ -body { - margin: 0; - max-width: 100vw; -} - -pre, -code { - overflow: auto; -} - -#pageContainer { - display: flex; - width: 100%; - max-width: 100vw; - height: 100vh; -} - -#blocklyDiv { - flex-basis: 100%; - height: 100%; - min-width: 600px; -} - -#outputPane { - display: flex; - flex-direction: column; - width: 400px; - flex: 0 0 400px; - overflow: auto; - margin: 1rem; -} - -#generatedCode { - height: 50%; - background-color: rgb(247, 240, 228); -} - -#output { - height: 50%; -} diff --git a/packages/app/src/index.html b/packages/app/src/index.html deleted file mode 100644 index 36d8eea..0000000 --- a/packages/app/src/index.html +++ /dev/null @@ -1,16 +0,0 @@ - - - - - Blockly Sample App - - -
-
-
-
-
-
-
- - diff --git a/packages/app/src/index.ts b/packages/app/src/index.ts deleted file mode 100644 index 1d15558..0000000 --- a/packages/app/src/index.ts +++ /dev/null @@ -1,64 +0,0 @@ -/** - * @license - * Copyright 2023 Google LLC - * SPDX-License-Identifier: Apache-2.0 - */ - -import * as Blockly from "blockly"; -import { blocks } from "./blocks/text"; -import { forBlock } from "./generators/javascript"; -import { javascriptGenerator } from "blockly/javascript"; -import { save, load } from "./serialization"; -import { toolbox } from "./toolbox"; -import "./index.css"; - -// Register the blocks and generator with Blockly -Blockly.common.defineBlocks(blocks); -Object.assign(javascriptGenerator.forBlock, forBlock); - -// Set up UI elements and inject Blockly -const codeDiv = document.getElementById("generatedCode")?.firstChild; -const outputDiv = document.getElementById("output"); -const blocklyDiv = document.getElementById("blocklyDiv"); -const ws = blocklyDiv && Blockly.inject(blocklyDiv, { toolbox }); - -// This function resets the code and output divs, shows the -// generated code from the workspace, and evals the code. -// In a real application, you probably shouldn't use `eval`. -const runCode = () => { - const code = javascriptGenerator.workspaceToCode(ws); - if (codeDiv) codeDiv.textContent = code; - - if (outputDiv) outputDiv.innerHTML = ""; - - eval(code); -}; - -if (ws) { - // Load the initial state from storage and run the code. - load(ws); - runCode(); - - // Every time the workspace changes state, save the changes to storage. - ws.addChangeListener((e: Blockly.Events.Abstract) => { - // UI events are things like scrolling, zooming, etc. - // No need to save after one of these. - if (e.isUiEvent) return; - save(ws); - }); - - // Whenever the workspace changes meaningfully, run the code again. - ws.addChangeListener((e: Blockly.Events.Abstract) => { - // Don't run the code when the workspace finishes loading; we're - // already running it once when the application starts. - // Don't run the code during drags; we might have invalid state. - if ( - e.isUiEvent || - e.type == Blockly.Events.FINISHED_LOADING || - ws.isDragging() - ) { - return; - } - runCode(); - }); -} diff --git a/packages/app/src/main.ts b/packages/app/src/main.ts new file mode 100644 index 0000000..627ac0f --- /dev/null +++ b/packages/app/src/main.ts @@ -0,0 +1,16 @@ +/** + * main.ts + */ + +// Components +import App from "./App.vue"; +// Composables +import { createApp } from "vue"; +// Plugins +import { registerPlugins } from "@/plugins"; +// Styles +import "@/scss/style.scss"; + +const app = createApp(App); +registerPlugins(app); +app.mount("#app"); diff --git a/packages/app/src/plugins/index.ts b/packages/app/src/plugins/index.ts new file mode 100644 index 0000000..8458132 --- /dev/null +++ b/packages/app/src/plugins/index.ts @@ -0,0 +1,15 @@ +/** + * plugins/index.ts + * + * Automatically included in `./src/main.ts` + */ + +// Plugins +import vuetify from "./vuetify"; + +// Types +import type { App } from "vue"; + +export function registerPlugins(app: App) { + app.use(vuetify); +} diff --git a/packages/app/src/plugins/vuetify.ts b/packages/app/src/plugins/vuetify.ts new file mode 100644 index 0000000..df34ba5 --- /dev/null +++ b/packages/app/src/plugins/vuetify.ts @@ -0,0 +1,117 @@ +/** + * plugins/vuetify.ts + * + * Framework documentation: https://vuetifyjs.com` + */ + +// Styles +import "vuetify/styles"; +import { aliases, mdi } from "vuetify/iconsets/mdi-svg"; + +// Composables +import { createVuetify, ThemeDefinition } from "vuetify"; + +const LightTheme: ThemeDefinition = { + dark: false, + colors: { + primary: "#4459A9", + "primary-darken-1": "#2A4190", + "primary-darken-2": "#0D2878", + "primary-darken-3": "#001452", + "primary-lighten-1": "#5D72C4", + "primary-lighten-2": "#778CE0", + "primary-lighten-3": "#92A7FD", + "primary-lighten-4": "#B7C4FF", + "primary-container": "#DCE1FF", + "on-primary-container": "#001552", + "on-primary": "#FFFFFF", + secondary: "#5A5D72", + "secondary-darken-1": "#424659", + "secondary-darken-2": "#2B3042", + "secondary-darken-3": "#171B2C", + "secondary-lighten-1": "#72768B", + "secondary-lighten-2": "#8C90A6", + "secondary-lighten-3": "#A7AAC1", + "secondary-lighten-4": "#C2C5DD", + "secondary-container": "#DEE1F9", + "on-secondary-container": "#171B2C", + tertiary: "#75546F", + "tertiary-container": "#FFD7F5", + "on-tertiary-container": "#2C1229", + background: "#FEFBFF", + "on-background": "#1B1B1E", + surface: "#FEFBFF", + "surface-variant": "#E3E1E9", + "on-surface-variant": "#46464C", + error: "#BA1A1A", + "on-error": "#FFFFFF", + "error-container": "#FFDAD6", + "on-error-container": "#410002", + info: "#275EA7", + success: "#008770", + warning: "#FF897D", + }, +}; + +const DarkTheme: ThemeDefinition = { + dark: true, + colors: { + primary: "#B7C4FE", + "primary-darken-1": "#2A4190", + "primary-darken-2": "#0C2878", + "primary-darken-3": "#001552", + "primary-lighten-1": "#5D72C4", + "primary-lighten-2": "#778CE0", + "primary-lighten-3": "#92A7FD", + "primary-lighten-4": "#B7C4FF", + "primary-lighten-5": "#DCE1FF", + "primary-container": "#374476", + "on-primary-container": "#DCE1FF", + "on-primary": "#202D5E", + secondary: "#C4C5D5", + "secondary-darken-1": "#424659", + "secondary-darken-2": "#2B3042", + "secondary-darken-3": "#171B2C", + "secondary-lighten-1": "#72768B", + "secondary-lighten-2": "#8C90A6", + "secondary-lighten-3": "#A7AAC1", + "secondary-lighten-4": "#C2C5DD", + "secondary-container": "#444653", + "on-secondary-container": "#E1E1F2", + tertiary: "#DCBED3", + "tertiary-container": "#564051", + "on-tertiary-container": "#F9DAEF", + background: "#1B1B1E", + "on-background": "#E4E1E4", + surface: "#1B1B1E", + "surface-variant": "#46464C", + "on-surface-variant": "#C7C6CC", + error: "#FFB4AB", + "on-error": "#690005", + "error-container": "#93000A", + "on-error-container": "#FFB4AB", + info: "#275EA7", + success: "#008770", + warning: "#FF897D", + }, +}; + +// https://vuetifyjs.com/en/introduction/why-vuetify/#feature-guides +export default createVuetify({ + ssr: false, + // blueprint: md3, + icons: { + defaultSet: "mdi", + aliases, + sets: { + mdi, + }, + }, + theme: { + defaultTheme: "LightTheme", + themes: { + LightTheme, + DarkTheme, + }, + }, +}); diff --git a/packages/app/src/scss/style.scss b/packages/app/src/scss/style.scss new file mode 100644 index 0000000..33ce816 --- /dev/null +++ b/packages/app/src/scss/style.scss @@ -0,0 +1,9 @@ +@use "sass:meta"; + +html[hljs-theme-dark="true"] { + @include meta.load-css("highlight.js/scss/github-dark"); +} + +html:not([hljs-theme-dark="true"]) { + @include meta.load-css("highlight.js/scss/github"); +} diff --git a/packages/app/src/stores/workspaces.ts b/packages/app/src/stores/workspaces.ts new file mode 100644 index 0000000..324c40c --- /dev/null +++ b/packages/app/src/stores/workspaces.ts @@ -0,0 +1,128 @@ +// outputs.ts +import { reactive, ref } from "vue"; +import * as Blockly from "blockly"; +import { pythonGenerator } from "blockly/python"; +import { LightTheme, DarkTheme } from "@/theme/index"; + +export const workspaceStore = reactive({ + workspace: ref(), + startBlocks: ref(), +}); + +export const optionsStore = reactive({ + toolbox: ref(), + theme: ref(), + collapse: false, + comments: false, + disable: false, + maxBlocks: Infinity, + trashcan: true, + horizontalLayout: false, + toolboxPosition: "start", + css: true, + media: "https://blockly-demo.appspot.com/static/media/", + rtl: false, + scrollbars: true, + sounds: false, + oneBasedIndex: true, + grid: { + spacing: 20, + length: 1, + colour: "#888", + snap: true, + }, + zoom: { + controls: true, + wheel: false, + startScale: 1, + maxScale: 3, + minScale: 0.3, + scaleSpeed: 1.2, + }, + renderer: "geras", +}); + +export const outputsStore = reactive({ + code: "" as string, + activeTab: ref("tab-1"), + snackbar: false, + snackbarMsg: "" as string, + snackbarTimeout: 2500 as number, + snackbarColor: "green" as string, +}); + +export function setWorkspaceTheme(theme: string) { + let workspace = Blockly.getMainWorkspace(); + if (theme === "LightTheme") { + optionsStore.theme = ref(LightTheme); + // @ts-ignore + workspace.setTheme(LightTheme); + } else if (theme === "DarkTheme") { + optionsStore.theme = ref(DarkTheme); + // @ts-ignore + workspace.setTheme(DarkTheme); + } +} + +export function saveJSON() { + let workspace = Blockly.getMainWorkspace(); + let state = Blockly.serialization.workspaces.save(workspace); + let json = JSON.stringify(state); + localStorage.setItem("NoneBlockly", json); + outputsStore.snackbarColor = "green"; + outputsStore.snackbarMsg = "🤗 工作区已暂存"; + outputsStore.snackbar = true; + // console.log("工作区已暂存:"); + // console.log(json); +} + +export function loadJSON() { + let workspace = Blockly.getMainWorkspace(); + let json = localStorage.getItem("NoneBlockly"); + if (json) { + Blockly.serialization.workspaces.load(JSON.parse(json), workspace); + outputsStore.snackbarColor = "green"; + outputsStore.snackbarMsg = "🥰 已恢复暂存工作区"; + } else { + outputsStore.snackbarColor = "warning"; + outputsStore.snackbarMsg = "未找到暂存工作区,将导入默认工作区"; + initWorkspaceState(); + } + outputsStore.snackbar = true; +} + +export function initWorkspaceState() { + let startBlocks = workspaceStore.startBlocks; + let workspace = Blockly.getMainWorkspace(); + Blockly.serialization.workspaces.load(startBlocks, workspace); +} + +export function generateCode() { + let workspace = Blockly.getMainWorkspace(); + outputsStore.code = pythonGenerator.workspaceToCode(workspace); + // outputsStore.activeTab = "tab-2"; + // console.log("已生成代码:"); + // console.log(outputsStore.code); +} + +export function showCode() { + let workspace = Blockly.getMainWorkspace(); + let code = pythonGenerator.workspaceToCode(workspace); + alert(code); +} + +export function copyCode() { + let workspace = Blockly.getMainWorkspace(); + let code = pythonGenerator.workspaceToCode(workspace); + navigator.clipboard + .writeText(code) + .then(() => { + outputsStore.snackbarColor = "green"; + outputsStore.snackbarMsg = "😎 已复制 Python 代码"; + }) + .catch((err) => { + outputsStore.snackbarColor = "warning"; + outputsStore.snackbarMsg = "🥺 复制代码出错" + err; + }); + outputsStore.snackbar = true; +} diff --git a/packages/app/src/theme/index.ts b/packages/app/src/theme/index.ts new file mode 100644 index 0000000..33bb988 --- /dev/null +++ b/packages/app/src/theme/index.ts @@ -0,0 +1,19 @@ +/** + * @license + * Copyright 2022 ICILS + * SPDX-License-Identifier: Apache-2.0 + */ + +import * as Blockly from "blockly/core"; +// @ts-ignore +import ThemeDark from "@blockly/theme-dark"; + +export const LightTheme = Blockly.Theme.defineTheme("light", { + base: Blockly.Themes.Classic, + name: "Light", +}); + +export const DarkTheme = Blockly.Theme.defineTheme("dark", { + base: ThemeDark, + name: "Dark", +}); diff --git a/packages/app/src/toolbox.ts b/packages/app/src/toolbox.ts deleted file mode 100644 index 9ab50cb..0000000 --- a/packages/app/src/toolbox.ts +++ /dev/null @@ -1,716 +0,0 @@ -/** - * @license - * Copyright 2023 Google LLC - * SPDX-License-Identifier: Apache-2.0 - */ - -/* -This toolbox contains nearly every single built-in block that Blockly offers, -in addition to the custom block 'add_text' this sample app adds. -You probably don't need every single block, and should consider either rewriting -your toolbox from scratch, or carefully choosing whether you need each block -listed here. -*/ - -export const toolbox = { - kind: "categoryToolbox", - contents: [ - { - kind: "category", - name: "Logic", - categorystyle: "logic_category", - contents: [ - { - kind: "block", - type: "controls_if", - }, - { - kind: "block", - type: "logic_compare", - }, - { - kind: "block", - type: "logic_operation", - }, - { - kind: "block", - type: "logic_negate", - }, - { - kind: "block", - type: "logic_boolean", - }, - { - kind: "block", - type: "logic_null", - }, - { - kind: "block", - type: "logic_ternary", - }, - ], - }, - { - kind: "category", - name: "Loops", - categorystyle: "loop_category", - contents: [ - { - kind: "block", - type: "controls_repeat_ext", - inputs: { - TIMES: { - shadow: { - type: "math_number", - fields: { - NUM: 10, - }, - }, - }, - }, - }, - { - kind: "block", - type: "controls_whileUntil", - }, - { - kind: "block", - type: "controls_for", - inputs: { - FROM: { - shadow: { - type: "math_number", - fields: { - NUM: 1, - }, - }, - }, - TO: { - shadow: { - type: "math_number", - fields: { - NUM: 10, - }, - }, - }, - BY: { - shadow: { - type: "math_number", - fields: { - NUM: 1, - }, - }, - }, - }, - }, - { - kind: "block", - type: "controls_forEach", - }, - { - kind: "block", - type: "controls_flow_statements", - }, - ], - }, - { - kind: "category", - name: "Math", - categorystyle: "math_category", - contents: [ - { - kind: "block", - type: "math_number", - fields: { - NUM: 123, - }, - }, - { - kind: "block", - type: "math_arithmetic", - inputs: { - A: { - shadow: { - type: "math_number", - fields: { - NUM: 1, - }, - }, - }, - B: { - shadow: { - type: "math_number", - fields: { - NUM: 1, - }, - }, - }, - }, - }, - { - kind: "block", - type: "math_single", - inputs: { - NUM: { - shadow: { - type: "math_number", - fields: { - NUM: 9, - }, - }, - }, - }, - }, - { - kind: "block", - type: "math_trig", - inputs: { - NUM: { - shadow: { - type: "math_number", - fields: { - NUM: 45, - }, - }, - }, - }, - }, - { - kind: "block", - type: "math_constant", - }, - { - kind: "block", - type: "math_number_property", - inputs: { - NUMBER_TO_CHECK: { - shadow: { - type: "math_number", - fields: { - NUM: 0, - }, - }, - }, - }, - }, - { - kind: "block", - type: "math_round", - fields: { - OP: "ROUND", - }, - inputs: { - NUM: { - shadow: { - type: "math_number", - fields: { - NUM: 3.1, - }, - }, - }, - }, - }, - { - kind: "block", - type: "math_on_list", - fields: { - OP: "SUM", - }, - }, - { - kind: "block", - type: "math_modulo", - inputs: { - DIVIDEND: { - shadow: { - type: "math_number", - fields: { - NUM: 64, - }, - }, - }, - DIVISOR: { - shadow: { - type: "math_number", - fields: { - NUM: 10, - }, - }, - }, - }, - }, - { - kind: "block", - type: "math_constrain", - inputs: { - VALUE: { - shadow: { - type: "math_number", - fields: { - NUM: 50, - }, - }, - }, - LOW: { - shadow: { - type: "math_number", - fields: { - NUM: 1, - }, - }, - }, - HIGH: { - shadow: { - type: "math_number", - fields: { - NUM: 100, - }, - }, - }, - }, - }, - { - kind: "block", - type: "math_random_int", - inputs: { - FROM: { - shadow: { - type: "math_number", - fields: { - NUM: 1, - }, - }, - }, - TO: { - shadow: { - type: "math_number", - fields: { - NUM: 100, - }, - }, - }, - }, - }, - { - kind: "block", - type: "math_random_float", - }, - { - kind: "block", - type: "math_atan2", - inputs: { - X: { - shadow: { - type: "math_number", - fields: { - NUM: 1, - }, - }, - }, - Y: { - shadow: { - type: "math_number", - fields: { - NUM: 1, - }, - }, - }, - }, - }, - ], - }, - { - kind: "category", - name: "Text", - categorystyle: "text_category", - contents: [ - { - kind: "block", - type: "text", - }, - { - kind: "block", - type: "text_multiline", - }, - { - kind: "block", - type: "text_join", - }, - { - kind: "block", - type: "text_append", - inputs: { - TEXT: { - shadow: { - type: "text", - fields: { - TEXT: "", - }, - }, - }, - }, - }, - { - kind: "block", - type: "text_length", - inputs: { - VALUE: { - shadow: { - type: "text", - fields: { - TEXT: "abc", - }, - }, - }, - }, - }, - { - kind: "block", - type: "text_isEmpty", - inputs: { - VALUE: { - shadow: { - type: "text", - fields: { - TEXT: "", - }, - }, - }, - }, - }, - { - kind: "block", - type: "text_indexOf", - inputs: { - VALUE: { - block: { - type: "variables_get", - }, - }, - FIND: { - shadow: { - type: "text", - fields: { - TEXT: "abc", - }, - }, - }, - }, - }, - { - kind: "block", - type: "text_charAt", - inputs: { - VALUE: { - block: { - type: "variables_get", - }, - }, - }, - }, - { - kind: "block", - type: "text_getSubstring", - inputs: { - STRING: { - block: { - type: "variables_get", - }, - }, - }, - }, - { - kind: "block", - type: "text_changeCase", - inputs: { - TEXT: { - shadow: { - type: "text", - fields: { - TEXT: "abc", - }, - }, - }, - }, - }, - { - kind: "block", - type: "text_trim", - inputs: { - TEXT: { - shadow: { - type: "text", - fields: { - TEXT: "abc", - }, - }, - }, - }, - }, - { - kind: "block", - type: "text_count", - inputs: { - SUB: { - shadow: { - type: "text", - }, - }, - TEXT: { - shadow: { - type: "text", - }, - }, - }, - }, - { - kind: "block", - type: "text_replace", - inputs: { - FROM: { - shadow: { - type: "text", - }, - }, - TO: { - shadow: { - type: "text", - }, - }, - TEXT: { - shadow: { - type: "text", - }, - }, - }, - }, - { - kind: "block", - type: "text_reverse", - inputs: { - TEXT: { - shadow: { - type: "text", - }, - }, - }, - }, - { - kind: "block", - type: "add_text", - inputs: { - TEXT: { - shadow: { - type: "text", - fields: { - TEXT: "abc", - }, - }, - }, - COLOR: { - shadow: { - type: "colour_picker", - fields: { - COLOUR: "#aa00cc", - }, - }, - }, - }, - }, - ], - }, - { - kind: "category", - name: "Lists", - categorystyle: "list_category", - contents: [ - { - kind: "block", - type: "lists_create_with", - }, - { - kind: "block", - type: "lists_create_with", - }, - { - kind: "block", - type: "lists_repeat", - inputs: { - NUM: { - shadow: { - type: "math_number", - fields: { - NUM: 5, - }, - }, - }, - }, - }, - { - kind: "block", - type: "lists_length", - }, - { - kind: "block", - type: "lists_isEmpty", - }, - { - kind: "block", - type: "lists_indexOf", - inputs: { - VALUE: { - block: { - type: "variables_get", - }, - }, - }, - }, - { - kind: "block", - type: "lists_getIndex", - inputs: { - VALUE: { - block: { - type: "variables_get", - }, - }, - }, - }, - { - kind: "block", - type: "lists_setIndex", - inputs: { - LIST: { - block: { - type: "variables_get", - }, - }, - }, - }, - { - kind: "block", - type: "lists_getSublist", - inputs: { - LIST: { - block: { - type: "variables_get", - }, - }, - }, - }, - { - kind: "block", - type: "lists_split", - inputs: { - DELIM: { - shadow: { - type: "text", - fields: { - TEXT: ",", - }, - }, - }, - }, - }, - { - kind: "block", - type: "lists_sort", - }, - { - kind: "block", - type: "lists_reverse", - }, - ], - }, - { - kind: "category", - name: "Color", - categorystyle: "colour_category", - contents: [ - { - kind: "block", - type: "colour_picker", - }, - { - kind: "block", - type: "colour_random", - }, - { - kind: "block", - type: "colour_rgb", - inputs: { - RED: { - shadow: { - type: "math_number", - fields: { - NUM: 100, - }, - }, - }, - GREEN: { - shadow: { - type: "math_number", - fields: { - NUM: 50, - }, - }, - }, - BLUE: { - shadow: { - type: "math_number", - fields: { - NUM: 0, - }, - }, - }, - }, - }, - { - kind: "block", - type: "colour_blend", - inputs: { - COLOUR1: { - shadow: { - type: "colour_picker", - fields: { - COLOUR: "#ff0000", - }, - }, - }, - COLOUR2: { - shadow: { - type: "colour_picker", - fields: { - COLOUR: "#3333ff", - }, - }, - }, - RATIO: { - shadow: { - type: "math_number", - fields: { - NUM: 0.5, - }, - }, - }, - }, - }, - ], - }, - { - kind: "sep", - }, - { - kind: "category", - name: "Variables", - categorystyle: "variable_category", - custom: "VARIABLE", - }, - { - kind: "category", - name: "Functions", - categorystyle: "procedure_category", - custom: "PROCEDURE", - }, - ], -}; diff --git a/packages/app/src/workspaces/index.vue b/packages/app/src/workspaces/index.vue new file mode 100644 index 0000000..e1403fa --- /dev/null +++ b/packages/app/src/workspaces/index.vue @@ -0,0 +1,94 @@ + + + + + + + diff --git a/packages/app/tsconfig.json b/packages/app/tsconfig.json index 6a2ab6e..faf474c 100644 --- a/packages/app/tsconfig.json +++ b/packages/app/tsconfig.json @@ -7,6 +7,17 @@ "module": "ES2015", "moduleResolution": "node", "target": "ES2015", - "strict": true - } + "strict": true, + "paths": { + "@/*": ["./src/*"] + } + }, + "include": [ + "./src/**/*.ts", + "./src/**/*.d.ts", + "./src/**/*.tsx", + "./src/**/*.vue", + "./src/**/*.vue.ts", + "./src/**/*.json" + ] } diff --git a/packages/app/vite.config.mjs b/packages/app/vite.config.mjs new file mode 100644 index 0000000..c20ae3f --- /dev/null +++ b/packages/app/vite.config.mjs @@ -0,0 +1,74 @@ +// Plugins +import vue from "@vitejs/plugin-vue"; +import vuetify from "vite-plugin-vuetify"; + +// Utilities +import { defineConfig } from "vite"; +import { fileURLToPath, URL } from "node:url"; + +// Vite +import { viteStaticCopy } from "vite-plugin-static-copy"; + +// https://vitejs.dev/config/ +export default defineConfig({ + // base: "/", + // ssr: { + // noExternal: ["@blockly/blockly-component"], + // }, + build: { + chunkSizeWarningLimit: 550, + rollupOptions: { + output: { + manualChunks: { + "blockly/blockly": ["blockly/blockly"], + "vuetify/vuetify": ["vuetify"], + }, + }, + }, + }, + plugins: [ + vue({ + template: { + compilerOptions: { + isCustomElement: (tag) => + [ + "field", + "block", + "category", + "xml", + "mutation", + "value", + "sep", + "shadow", + ].includes(tag), + whitespace: "preserve", + }, + }, + }), + // https://github.com/vuetifyjs/vuetify-loader/tree/next/packages/vite-plugin + vuetify({ + autoImport: true, + }), + // Blockly vite plugin + viteStaticCopy({ + targets: [ + { + src: fileURLToPath( + new URL("./node_modules/blockly/media/*", import.meta.url), + ), + dest: "media", + }, + ], + }), + ], + define: { "process.env": {} }, + resolve: { + alias: { + "@": fileURLToPath(new URL("./src", import.meta.url)), + }, + extensions: [".js", ".json", ".jsx", ".mjs", ".ts", ".tsx", ".vue"], + }, + server: { + // port: process.env.PORT || 8080 + }, +}); diff --git a/packages/app/webpack.config.js b/packages/app/webpack.config.js deleted file mode 100644 index 5a7548f..0000000 --- a/packages/app/webpack.config.js +++ /dev/null @@ -1,67 +0,0 @@ -const path = require("path"); -const HtmlWebpackPlugin = require("html-webpack-plugin"); - -// Base config that applies to either development or production mode. -const config = { - entry: "./src/index.ts", - output: { - // Compile the source files into a bundle. - filename: "bundle.js", - path: path.resolve(__dirname, "dist"), - clean: true, - }, - // Enable webpack-dev-server to get hot refresh of the app. - devServer: { - static: "./build", - }, - module: { - rules: [ - { - test: /\.tsx?$/, - use: "ts-loader", - exclude: /node_modules/, - }, - { - // Load CSS files. They can be imported into JS files. - test: /\.css$/i, - use: ["style-loader", "css-loader"], - }, - ], - }, - resolve: { - extensions: [".tsx", ".ts", ".js"], - }, - plugins: [ - // Generate the HTML index page based on our template. - // This will output the same index page with the bundle we - // created above added in a script tag. - new HtmlWebpackPlugin({ - template: "src/index.html", - }), - ], -}; - -module.exports = (env, argv) => { - if (argv.mode === "development") { - // Set the output path to the `build` directory - // so we don't clobber production builds. - config.output.path = path.resolve(__dirname, "build"); - - // Generate source maps for our code for easier debugging. - // Not suitable for production builds. If you want source maps in - // production, choose a different one from https://webpack.js.org/configuration/devtool - config.devtool = "eval-cheap-module-source-map"; - - // Include the source maps for Blockly for easier debugging Blockly code. - config.module.rules.push({ - test: /(blockly\/.*\.js)$/, - use: [require.resolve("source-map-loader")], - enforce: "pre", - }); - - // Ignore spurious warnings from source-map-loader - // It can't find source maps for some Closure modules and that is expected - config.ignoreWarnings = [/Failed to parse source map/]; - } - return config; -}; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 1c642b6..2ec0fcd 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -16,671 +16,761 @@ importers: blockly: specifier: ^10.4.3 version: 10.4.3 + highlight.js: + specifier: ^11.9.0 + version: 11.9.0 + sass: + specifier: ^1.75.0 + version: 1.75.0 + vue: + specifier: ^3.4.22 + version: 3.4.22(typescript@5.4.4) + vuetify: + specifier: ^3.5.15 + version: 3.5.15(typescript@5.4.4)(vite-plugin-vuetify@2.0.3)(vue@3.4.22) devDependencies: - css-loader: - specifier: ^6.11.0 - version: 6.11.0(webpack@5.91.0) - html-webpack-plugin: - specifier: ^5.6.0 - version: 5.6.0(webpack@5.91.0) - source-map-loader: - specifier: ^4.0.2 - version: 4.0.2(webpack@5.91.0) - style-loader: - specifier: ^3.3.4 - version: 3.3.4(webpack@5.91.0) - ts-loader: - specifier: ^9.5.1 - version: 9.5.1(typescript@5.4.4)(webpack@5.91.0) + "@blockly/theme-dark": + specifier: ^6.0.6 + version: 6.0.6(blockly@10.4.3) + "@highlightjs/vue-plugin": + specifier: ^2.1.0 + version: 2.1.0(highlight.js@11.9.0)(vue@3.4.22) + "@mdi/js": + specifier: ^7.4.47 + version: 7.4.47 + "@vitejs/plugin-vue": + specifier: ^5.0.4 + version: 5.0.4(vite@5.2.9)(vue@3.4.22) typescript: specifier: ^5.4.4 version: 5.4.4 - webpack: - specifier: ^5.91.0 - version: 5.91.0(webpack-cli@4.10.0) - webpack-cli: - specifier: ^4.10.0 - version: 4.10.0(webpack-dev-server@4.15.2)(webpack@5.91.0) - webpack-dev-server: - specifier: ^4.15.2 - version: 4.15.2(webpack-cli@4.10.0)(webpack@5.91.0) + vite: + specifier: ^5.2.9 + version: 5.2.9(sass@1.75.0) + vite-plugin-static-copy: + specifier: ^1.0.2 + version: 1.0.2(vite@5.2.9) + vite-plugin-vuetify: + specifier: ^2.0.3 + version: 2.0.3(vite@5.2.9)(vue@3.4.22)(vuetify@3.5.15) + vue-tsc: + specifier: ^2.0.13 + version: 2.0.13(typescript@5.4.4) packages: - /@discoveryjs/json-ext@0.5.7: + /@babel/helper-string-parser@7.24.1: resolution: { - integrity: sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==, + integrity: sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ==, } - engines: { node: ">=10.0.0" } - dev: true + engines: { node: ">=6.9.0" } - /@jridgewell/gen-mapping@0.3.5: + /@babel/helper-validator-identifier@7.22.20: resolution: { - integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==, + integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==, } - engines: { node: ">=6.0.0" } - dependencies: - "@jridgewell/set-array": 1.2.1 - "@jridgewell/sourcemap-codec": 1.4.15 - "@jridgewell/trace-mapping": 0.3.25 - dev: true + engines: { node: ">=6.9.0" } - /@jridgewell/resolve-uri@3.1.2: + /@babel/parser@7.24.4: resolution: { - integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==, + integrity: sha512-zTvEBcghmeBma9QIGunWevvBAp4/Qu9Bdq+2k0Ot4fVMD6v3dsC9WOcRSKk7tRRyBM/53yKMJko9xOatGQAwSg==, } engines: { node: ">=6.0.0" } - dev: true + hasBin: true + dependencies: + "@babel/types": 7.24.0 - /@jridgewell/set-array@1.2.1: + /@babel/types@7.24.0: resolution: { - integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==, + integrity: sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==, } - engines: { node: ">=6.0.0" } - dev: true + engines: { node: ">=6.9.0" } + dependencies: + "@babel/helper-string-parser": 7.24.1 + "@babel/helper-validator-identifier": 7.22.20 + to-fast-properties: 2.0.0 - /@jridgewell/source-map@0.3.6: + /@blockly/theme-dark@6.0.6(blockly@10.4.3): resolution: { - integrity: sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==, + integrity: sha512-gpMGBve22WuE9ShLJIuZWSixYAHqf+OQfG9lfcNWOaxSEtd9aF6rdNvjEG1Z6VC9enwtoJmIBsUUYmxGjPlIlw==, } + engines: { node: ">=8.17.0" } + peerDependencies: + blockly: ^10.0.0 dependencies: - "@jridgewell/gen-mapping": 0.3.5 - "@jridgewell/trace-mapping": 0.3.25 + blockly: 10.4.3 dev: true - /@jridgewell/sourcemap-codec@1.4.15: + /@esbuild/aix-ppc64@0.20.2: resolution: { - integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==, + integrity: sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==, } - dev: true + engines: { node: ">=12" } + cpu: [ppc64] + os: [aix] + requiresBuild: true + optional: true - /@jridgewell/trace-mapping@0.3.25: + /@esbuild/android-arm64@0.20.2: resolution: { - integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==, + integrity: sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==, } - dependencies: - "@jridgewell/resolve-uri": 3.1.2 - "@jridgewell/sourcemap-codec": 1.4.15 - dev: true + engines: { node: ">=12" } + cpu: [arm64] + os: [android] + requiresBuild: true + optional: true - /@leichtgewicht/ip-codec@2.0.5: + /@esbuild/android-arm@0.20.2: resolution: { - integrity: sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==, + integrity: sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==, } - dev: true + engines: { node: ">=12" } + cpu: [arm] + os: [android] + requiresBuild: true + optional: true - /@tootallnate/once@2.0.0: + /@esbuild/android-x64@0.20.2: resolution: { - integrity: sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==, + integrity: sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==, } - engines: { node: ">= 10" } - dev: false + engines: { node: ">=12" } + cpu: [x64] + os: [android] + requiresBuild: true + optional: true - /@types/body-parser@1.19.5: + /@esbuild/darwin-arm64@0.20.2: resolution: { - integrity: sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==, + integrity: sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==, } - dependencies: - "@types/connect": 3.4.38 - "@types/node": 20.12.6 - dev: true + engines: { node: ">=12" } + cpu: [arm64] + os: [darwin] + requiresBuild: true + optional: true - /@types/bonjour@3.5.13: + /@esbuild/darwin-x64@0.20.2: resolution: { - integrity: sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ==, + integrity: sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==, } - dependencies: - "@types/node": 20.12.6 - dev: true + engines: { node: ">=12" } + cpu: [x64] + os: [darwin] + requiresBuild: true + optional: true - /@types/connect-history-api-fallback@1.5.4: + /@esbuild/freebsd-arm64@0.20.2: resolution: { - integrity: sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw==, + integrity: sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==, } - dependencies: - "@types/express-serve-static-core": 4.19.0 - "@types/node": 20.12.6 - dev: true + engines: { node: ">=12" } + cpu: [arm64] + os: [freebsd] + requiresBuild: true + optional: true - /@types/connect@3.4.38: + /@esbuild/freebsd-x64@0.20.2: resolution: { - integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==, + integrity: sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==, } - dependencies: - "@types/node": 20.12.6 - dev: true + engines: { node: ">=12" } + cpu: [x64] + os: [freebsd] + requiresBuild: true + optional: true - /@types/eslint-scope@3.7.7: + /@esbuild/linux-arm64@0.20.2: resolution: { - integrity: sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==, + integrity: sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==, } - dependencies: - "@types/eslint": 8.56.7 - "@types/estree": 1.0.5 - dev: true + engines: { node: ">=12" } + cpu: [arm64] + os: [linux] + requiresBuild: true + optional: true - /@types/eslint@8.56.7: + /@esbuild/linux-arm@0.20.2: resolution: { - integrity: sha512-SjDvI/x3zsZnOkYZ3lCt9lOZWZLB2jIlNKz+LBgCtDurK0JZcwucxYHn1w2BJkD34dgX9Tjnak0txtq4WTggEA==, + integrity: sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==, } - dependencies: - "@types/estree": 1.0.5 - "@types/json-schema": 7.0.15 - dev: true + engines: { node: ">=12" } + cpu: [arm] + os: [linux] + requiresBuild: true + optional: true - /@types/estree@1.0.5: + /@esbuild/linux-ia32@0.20.2: resolution: { - integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==, + integrity: sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==, } - dev: true + engines: { node: ">=12" } + cpu: [ia32] + os: [linux] + requiresBuild: true + optional: true - /@types/express-serve-static-core@4.19.0: + /@esbuild/linux-loong64@0.20.2: resolution: { - integrity: sha512-bGyep3JqPCRry1wq+O5n7oiBgGWmeIJXPjXXCo8EK0u8duZGSYar7cGqd3ML2JUsLGeB7fmc06KYo9fLGWqPvQ==, + integrity: sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==, } - dependencies: - "@types/node": 20.12.6 - "@types/qs": 6.9.14 - "@types/range-parser": 1.2.7 - "@types/send": 0.17.4 - dev: true + engines: { node: ">=12" } + cpu: [loong64] + os: [linux] + requiresBuild: true + optional: true - /@types/express@4.17.21: + /@esbuild/linux-mips64el@0.20.2: resolution: { - integrity: sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==, + integrity: sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==, } - dependencies: - "@types/body-parser": 1.19.5 - "@types/express-serve-static-core": 4.19.0 - "@types/qs": 6.9.14 - "@types/serve-static": 1.15.7 - dev: true + engines: { node: ">=12" } + cpu: [mips64el] + os: [linux] + requiresBuild: true + optional: true - /@types/html-minifier-terser@6.1.0: + /@esbuild/linux-ppc64@0.20.2: resolution: { - integrity: sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==, + integrity: sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==, } - dev: true + engines: { node: ">=12" } + cpu: [ppc64] + os: [linux] + requiresBuild: true + optional: true - /@types/http-errors@2.0.4: + /@esbuild/linux-riscv64@0.20.2: resolution: { - integrity: sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==, + integrity: sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==, } - dev: true + engines: { node: ">=12" } + cpu: [riscv64] + os: [linux] + requiresBuild: true + optional: true - /@types/http-proxy@1.17.14: + /@esbuild/linux-s390x@0.20.2: resolution: { - integrity: sha512-SSrD0c1OQzlFX7pGu1eXxSEjemej64aaNPRhhVYUGqXh0BtldAAx37MG8btcumvpgKyZp1F5Gn3JkktdxiFv6w==, + integrity: sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==, } - dependencies: - "@types/node": 20.12.6 - dev: true + engines: { node: ">=12" } + cpu: [s390x] + os: [linux] + requiresBuild: true + optional: true - /@types/json-schema@7.0.15: + /@esbuild/linux-x64@0.20.2: resolution: { - integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==, + integrity: sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==, } - dev: true + engines: { node: ">=12" } + cpu: [x64] + os: [linux] + requiresBuild: true + optional: true - /@types/mime@1.3.5: + /@esbuild/netbsd-x64@0.20.2: resolution: { - integrity: sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==, + integrity: sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==, } - dev: true + engines: { node: ">=12" } + cpu: [x64] + os: [netbsd] + requiresBuild: true + optional: true - /@types/node-forge@1.3.11: + /@esbuild/openbsd-x64@0.20.2: resolution: { - integrity: sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==, + integrity: sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==, } - dependencies: - "@types/node": 20.12.6 - dev: true + engines: { node: ">=12" } + cpu: [x64] + os: [openbsd] + requiresBuild: true + optional: true - /@types/node@20.12.6: + /@esbuild/sunos-x64@0.20.2: resolution: { - integrity: sha512-3KurE8taB8GCvZBPngVbp0lk5CKi8M9f9k1rsADh0Evdz5SzJ+Q+Hx9uHoFGsLnLnd1xmkDQr2hVhlA0Mn0lKQ==, + integrity: sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==, } - dependencies: - undici-types: 5.26.5 - dev: true + engines: { node: ">=12" } + cpu: [x64] + os: [sunos] + requiresBuild: true + optional: true - /@types/qs@6.9.14: + /@esbuild/win32-arm64@0.20.2: resolution: { - integrity: sha512-5khscbd3SwWMhFqylJBLQ0zIu7c1K6Vz0uBIt915BI3zV0q1nfjRQD3RqSBcPaO6PHEF4ov/t9y89fSiyThlPA==, + integrity: sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==, } - dev: true + engines: { node: ">=12" } + cpu: [arm64] + os: [win32] + requiresBuild: true + optional: true - /@types/range-parser@1.2.7: + /@esbuild/win32-ia32@0.20.2: resolution: { - integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==, + integrity: sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==, } - dev: true + engines: { node: ">=12" } + cpu: [ia32] + os: [win32] + requiresBuild: true + optional: true - /@types/retry@0.12.0: + /@esbuild/win32-x64@0.20.2: resolution: { - integrity: sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==, + integrity: sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==, } - dev: true + engines: { node: ">=12" } + cpu: [x64] + os: [win32] + requiresBuild: true + optional: true - /@types/send@0.17.4: + /@highlightjs/vue-plugin@2.1.0(highlight.js@11.9.0)(vue@3.4.22): resolution: { - integrity: sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==, + integrity: sha512-E+bmk4ncca+hBEYRV2a+1aIzIV0VSY/e5ArjpuSN9IO7wBJrzUE2u4ESCwrbQD7sAy+jWQjkV5qCCWgc+pu7CQ==, } + peerDependencies: + highlight.js: ^11.0.1 + vue: ^3 dependencies: - "@types/mime": 1.3.5 - "@types/node": 20.12.6 + highlight.js: 11.9.0 + vue: 3.4.22(typescript@5.4.4) dev: true - /@types/serve-index@1.9.4: + /@jridgewell/sourcemap-codec@1.4.15: resolution: { - integrity: sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug==, + integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==, } - dependencies: - "@types/express": 4.17.21 - dev: true - /@types/serve-static@1.15.7: + /@mdi/js@7.4.47: resolution: { - integrity: sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==, + integrity: sha512-KPnNOtm5i2pMabqZxpUz7iQf+mfrYZyKCZ8QNz85czgEt7cuHcGorWfdzUMWYA0SD+a6Hn4FmJ+YhzzzjkTZrQ==, } - dependencies: - "@types/http-errors": 2.0.4 - "@types/node": 20.12.6 - "@types/send": 0.17.4 dev: true - /@types/sockjs@0.3.36: + /@nodelib/fs.scandir@2.1.5: resolution: { - integrity: sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q==, + integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==, } + engines: { node: ">= 8" } dependencies: - "@types/node": 20.12.6 + "@nodelib/fs.stat": 2.0.5 + run-parallel: 1.2.0 dev: true - /@types/ws@8.5.10: + /@nodelib/fs.stat@2.0.5: resolution: { - integrity: sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==, + integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==, } - dependencies: - "@types/node": 20.12.6 + engines: { node: ">= 8" } dev: true - /@webassemblyjs/ast@1.12.1: + /@nodelib/fs.walk@1.2.8: resolution: { - integrity: sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==, + integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==, } + engines: { node: ">= 8" } dependencies: - "@webassemblyjs/helper-numbers": 1.11.6 - "@webassemblyjs/helper-wasm-bytecode": 1.11.6 + "@nodelib/fs.scandir": 2.1.5 + fastq: 1.17.1 dev: true - /@webassemblyjs/floating-point-hex-parser@1.11.6: + /@rollup/rollup-android-arm-eabi@4.14.3: resolution: { - integrity: sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==, + integrity: sha512-X9alQ3XM6I9IlSlmC8ddAvMSyG1WuHk5oUnXGw+yUBs3BFoTizmG1La/Gr8fVJvDWAq+zlYTZ9DBgrlKRVY06g==, } - dev: true + cpu: [arm] + os: [android] + requiresBuild: true + optional: true - /@webassemblyjs/helper-api-error@1.11.6: + /@rollup/rollup-android-arm64@4.14.3: resolution: { - integrity: sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==, + integrity: sha512-eQK5JIi+POhFpzk+LnjKIy4Ks+pwJ+NXmPxOCSvOKSNRPONzKuUvWE+P9JxGZVxrtzm6BAYMaL50FFuPe0oWMQ==, } - dev: true + cpu: [arm64] + os: [android] + requiresBuild: true + optional: true - /@webassemblyjs/helper-buffer@1.12.1: + /@rollup/rollup-darwin-arm64@4.14.3: resolution: { - integrity: sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw==, + integrity: sha512-Od4vE6f6CTT53yM1jgcLqNfItTsLt5zE46fdPaEmeFHvPs5SjZYlLpHrSiHEKR1+HdRfxuzXHjDOIxQyC3ptBA==, } - dev: true + cpu: [arm64] + os: [darwin] + requiresBuild: true + optional: true - /@webassemblyjs/helper-numbers@1.11.6: + /@rollup/rollup-darwin-x64@4.14.3: resolution: { - integrity: sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==, + integrity: sha512-0IMAO21axJeNIrvS9lSe/PGthc8ZUS+zC53O0VhF5gMxfmcKAP4ESkKOCwEi6u2asUrt4mQv2rjY8QseIEb1aw==, } - dependencies: - "@webassemblyjs/floating-point-hex-parser": 1.11.6 - "@webassemblyjs/helper-api-error": 1.11.6 - "@xtuc/long": 4.2.2 - dev: true + cpu: [x64] + os: [darwin] + requiresBuild: true + optional: true - /@webassemblyjs/helper-wasm-bytecode@1.11.6: + /@rollup/rollup-linux-arm-gnueabihf@4.14.3: resolution: { - integrity: sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==, + integrity: sha512-ge2DC7tHRHa3caVEoSbPRJpq7azhG+xYsd6u2MEnJ6XzPSzQsTKyXvh6iWjXRf7Rt9ykIUWHtl0Uz3T6yXPpKw==, } - dev: true + cpu: [arm] + os: [linux] + requiresBuild: true + optional: true - /@webassemblyjs/helper-wasm-section@1.12.1: + /@rollup/rollup-linux-arm-musleabihf@4.14.3: resolution: { - integrity: sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g==, + integrity: sha512-ljcuiDI4V3ySuc7eSk4lQ9wU8J8r8KrOUvB2U+TtK0TiW6OFDmJ+DdIjjwZHIw9CNxzbmXY39wwpzYuFDwNXuw==, } - dependencies: - "@webassemblyjs/ast": 1.12.1 - "@webassemblyjs/helper-buffer": 1.12.1 - "@webassemblyjs/helper-wasm-bytecode": 1.11.6 - "@webassemblyjs/wasm-gen": 1.12.1 - dev: true + cpu: [arm] + os: [linux] + requiresBuild: true + optional: true - /@webassemblyjs/ieee754@1.11.6: + /@rollup/rollup-linux-arm64-gnu@4.14.3: resolution: { - integrity: sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==, + integrity: sha512-Eci2us9VTHm1eSyn5/eEpaC7eP/mp5n46gTRB3Aar3BgSvDQGJZuicyq6TsH4HngNBgVqC5sDYxOzTExSU+NjA==, } - dependencies: - "@xtuc/ieee754": 1.2.0 - dev: true + cpu: [arm64] + os: [linux] + requiresBuild: true + optional: true - /@webassemblyjs/leb128@1.11.6: + /@rollup/rollup-linux-arm64-musl@4.14.3: resolution: { - integrity: sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==, + integrity: sha512-UrBoMLCq4E92/LCqlh+blpqMz5h1tJttPIniwUgOFJyjWI1qrtrDhhpHPuFxULlUmjFHfloWdixtDhSxJt5iKw==, } - dependencies: - "@xtuc/long": 4.2.2 - dev: true + cpu: [arm64] + os: [linux] + requiresBuild: true + optional: true - /@webassemblyjs/utf8@1.11.6: + /@rollup/rollup-linux-powerpc64le-gnu@4.14.3: resolution: { - integrity: sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==, + integrity: sha512-5aRjvsS8q1nWN8AoRfrq5+9IflC3P1leMoy4r2WjXyFqf3qcqsxRCfxtZIV58tCxd+Yv7WELPcO9mY9aeQyAmw==, } - dev: true + cpu: [ppc64] + os: [linux] + requiresBuild: true + optional: true - /@webassemblyjs/wasm-edit@1.12.1: + /@rollup/rollup-linux-riscv64-gnu@4.14.3: resolution: { - integrity: sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g==, + integrity: sha512-sk/Qh1j2/RJSX7FhEpJn8n0ndxy/uf0kI/9Zc4b1ELhqULVdTfN6HL31CDaTChiBAOgLcsJ1sgVZjWv8XNEsAQ==, } - dependencies: - "@webassemblyjs/ast": 1.12.1 - "@webassemblyjs/helper-buffer": 1.12.1 - "@webassemblyjs/helper-wasm-bytecode": 1.11.6 - "@webassemblyjs/helper-wasm-section": 1.12.1 - "@webassemblyjs/wasm-gen": 1.12.1 - "@webassemblyjs/wasm-opt": 1.12.1 - "@webassemblyjs/wasm-parser": 1.12.1 - "@webassemblyjs/wast-printer": 1.12.1 - dev: true + cpu: [riscv64] + os: [linux] + requiresBuild: true + optional: true - /@webassemblyjs/wasm-gen@1.12.1: + /@rollup/rollup-linux-s390x-gnu@4.14.3: resolution: { - integrity: sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w==, + integrity: sha512-jOO/PEaDitOmY9TgkxF/TQIjXySQe5KVYB57H/8LRP/ux0ZoO8cSHCX17asMSv3ruwslXW/TLBcxyaUzGRHcqg==, } - dependencies: - "@webassemblyjs/ast": 1.12.1 - "@webassemblyjs/helper-wasm-bytecode": 1.11.6 - "@webassemblyjs/ieee754": 1.11.6 - "@webassemblyjs/leb128": 1.11.6 - "@webassemblyjs/utf8": 1.11.6 - dev: true + cpu: [s390x] + os: [linux] + requiresBuild: true + optional: true - /@webassemblyjs/wasm-opt@1.12.1: + /@rollup/rollup-linux-x64-gnu@4.14.3: resolution: { - integrity: sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg==, + integrity: sha512-8ybV4Xjy59xLMyWo3GCfEGqtKV5M5gCSrZlxkPGvEPCGDLNla7v48S662HSGwRd6/2cSneMQWiv+QzcttLrrOA==, } - dependencies: - "@webassemblyjs/ast": 1.12.1 - "@webassemblyjs/helper-buffer": 1.12.1 - "@webassemblyjs/wasm-gen": 1.12.1 - "@webassemblyjs/wasm-parser": 1.12.1 - dev: true + cpu: [x64] + os: [linux] + requiresBuild: true + optional: true - /@webassemblyjs/wasm-parser@1.12.1: + /@rollup/rollup-linux-x64-musl@4.14.3: resolution: { - integrity: sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ==, + integrity: sha512-s+xf1I46trOY10OqAtZ5Rm6lzHre/UiLA1J2uOhCFXWkbZrJRkYBPO6FhvGfHmdtQ3Bx793MNa7LvoWFAm93bg==, } - dependencies: - "@webassemblyjs/ast": 1.12.1 - "@webassemblyjs/helper-api-error": 1.11.6 - "@webassemblyjs/helper-wasm-bytecode": 1.11.6 - "@webassemblyjs/ieee754": 1.11.6 - "@webassemblyjs/leb128": 1.11.6 - "@webassemblyjs/utf8": 1.11.6 - dev: true + cpu: [x64] + os: [linux] + requiresBuild: true + optional: true - /@webassemblyjs/wast-printer@1.12.1: + /@rollup/rollup-win32-arm64-msvc@4.14.3: resolution: { - integrity: sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA==, + integrity: sha512-+4h2WrGOYsOumDQ5S2sYNyhVfrue+9tc9XcLWLh+Kw3UOxAvrfOrSMFon60KspcDdytkNDh7K2Vs6eMaYImAZg==, } - dependencies: - "@webassemblyjs/ast": 1.12.1 - "@xtuc/long": 4.2.2 - dev: true + cpu: [arm64] + os: [win32] + requiresBuild: true + optional: true - /@webpack-cli/configtest@1.2.0(webpack-cli@4.10.0)(webpack@5.91.0): + /@rollup/rollup-win32-ia32-msvc@4.14.3: resolution: { - integrity: sha512-4FB8Tj6xyVkyqjj1OaTqCjXYULB9FMkqQ8yGrZjRDrYh0nOE+7Lhs45WioWQQMV+ceFlE368Ukhe6xdvJM9Egg==, + integrity: sha512-T1l7y/bCeL/kUwh9OD4PQT4aM7Bq43vX05htPJJ46RTI4r5KNt6qJRzAfNfM+OYMNEVBWQzR2Gyk+FXLZfogGw==, } - peerDependencies: - webpack: 4.x.x || 5.x.x - webpack-cli: 4.x.x - dependencies: - webpack: 5.91.0(webpack-cli@4.10.0) - webpack-cli: 4.10.0(webpack-dev-server@4.15.2)(webpack@5.91.0) - dev: true + cpu: [ia32] + os: [win32] + requiresBuild: true + optional: true - /@webpack-cli/info@1.5.0(webpack-cli@4.10.0): + /@rollup/rollup-win32-x64-msvc@4.14.3: resolution: { - integrity: sha512-e8tSXZpw2hPl2uMJY6fsMswaok5FdlGNRTktvFk2sD8RjH0hE2+XistawJx1vmKteh4NmGmNUrp+Tb2w+udPcQ==, + integrity: sha512-/BypzV0H1y1HzgYpxqRaXGBRqfodgoBBCcsrujT6QRcakDQdfU+Lq9PENPh5jB4I44YWq+0C2eHsHya+nZY1sA==, } - peerDependencies: - webpack-cli: 4.x.x - dependencies: - envinfo: 7.12.0 - webpack-cli: 4.10.0(webpack-dev-server@4.15.2)(webpack@5.91.0) - dev: true + cpu: [x64] + os: [win32] + requiresBuild: true + optional: true - /@webpack-cli/serve@1.7.0(webpack-cli@4.10.0)(webpack-dev-server@4.15.2): + /@tootallnate/once@2.0.0: resolution: { - integrity: sha512-oxnCNGj88fL+xzV+dacXs44HcDwf1ovs3AuEzvP7mqXw7fQntqIhQ1BRmynh4qEKQSSSRSWVyXRjmTbZIX9V2Q==, + integrity: sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==, } - peerDependencies: - webpack-cli: 4.x.x - webpack-dev-server: "*" - peerDependenciesMeta: - webpack-dev-server: - optional: true - dependencies: - webpack-cli: 4.10.0(webpack-dev-server@4.15.2)(webpack@5.91.0) - webpack-dev-server: 4.15.2(webpack-cli@4.10.0)(webpack@5.91.0) - dev: true + engines: { node: ">= 10" } - /@xtuc/ieee754@1.2.0: + /@types/estree@1.0.5: resolution: { - integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==, + integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==, } - dev: true - /@xtuc/long@4.2.2: + /@vitejs/plugin-vue@5.0.4(vite@5.2.9)(vue@3.4.22): resolution: { - integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==, + integrity: sha512-WS3hevEszI6CEVEx28F8RjTX97k3KsrcY6kvTg7+Whm5y3oYvcqzVeGCU3hxSAn4uY2CLCkeokkGKpoctccilQ==, } + engines: { node: ^18.0.0 || >=20.0.0 } + peerDependencies: + vite: ^5.0.0 + vue: ^3.2.25 + dependencies: + vite: 5.2.9(sass@1.75.0) + vue: 3.4.22(typescript@5.4.4) dev: true - /abab@2.0.6: + /@volar/language-core@2.2.0-alpha.8: resolution: { - integrity: sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==, + integrity: sha512-Ew1Iw7/RIRNuDLn60fWJdOLApAlfTVPxbPiSLzc434PReC9kleYtaa//Wo2WlN1oiRqneW0pWQQV0CwYqaimLQ==, } - deprecated: Use your platform's native atob() and btoa() methods instead - dev: false + dependencies: + "@volar/source-map": 2.2.0-alpha.8 + dev: true - /accepts@1.3.8: + /@volar/source-map@2.2.0-alpha.8: resolution: { - integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==, + integrity: sha512-E1ZVmXFJ5DU4fWDcWHzi8OLqqReqIDwhXvIMhVdk6+VipfMVv4SkryXu7/rs4GA/GsebcRyJdaSkKBB3OAkIcA==, } - engines: { node: ">= 0.6" } dependencies: - mime-types: 2.1.35 - negotiator: 0.6.3 + muggle-string: 0.4.1 dev: true - /acorn-import-assertions@1.9.0(acorn@8.11.3): + /@volar/typescript@2.2.0-alpha.8: resolution: { - integrity: sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==, + integrity: sha512-RLbRDI+17CiayHZs9HhSzlH0FhLl/+XK6o2qoiw2o2GGKcyD1aDoY6AcMd44acYncTOrqoTNoY6LuCiRyiJiGg==, } - peerDependencies: - acorn: ^8 dependencies: - acorn: 8.11.3 + "@volar/language-core": 2.2.0-alpha.8 + path-browserify: 1.0.1 dev: true - /acorn@8.11.3: + /@vue/compiler-core@3.4.22: resolution: { - integrity: sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==, + integrity: sha512-FBDRCBE/rFPA8OfTUrARx2c49N7zoImlGT7hsFikv0pZxQlFhffQwewpEXaLynZW0/DspVXmNA+QQ9dXINpWmg==, } - engines: { node: ">=0.4.0" } - hasBin: true - dev: true + dependencies: + "@babel/parser": 7.24.4 + "@vue/shared": 3.4.22 + entities: 4.5.0 + estree-walker: 2.0.2 + source-map-js: 1.2.0 - /agent-base@6.0.2: + /@vue/compiler-dom@3.4.22: resolution: { - integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==, + integrity: sha512-YkAS+jZc6Ip360kT3lZbMQZteiYBbHDSVKr94Jdd8Zjr7VjSkkXKAFFR/FW+2tNtBYXOps6xrWlOquy3GeYB0w==, } - engines: { node: ">= 6.0.0" } dependencies: - debug: 4.3.4 - transitivePeerDependencies: - - supports-color - dev: false + "@vue/compiler-core": 3.4.22 + "@vue/shared": 3.4.22 - /ajv-formats@2.1.1(ajv@8.12.0): + /@vue/compiler-sfc@3.4.22: resolution: { - integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==, + integrity: sha512-Pncp5Vc8E2Ef1o5uveO8WA1IqM7rt0R1jN8D4qitQYOUxC97iITGYA8oMInQ3UcDS7ip+SegyA2HbAEB4V6NMQ==, } - peerDependencies: - ajv: ^8.0.0 - peerDependenciesMeta: - ajv: - optional: true dependencies: - ajv: 8.12.0 - dev: true + "@babel/parser": 7.24.4 + "@vue/compiler-core": 3.4.22 + "@vue/compiler-dom": 3.4.22 + "@vue/compiler-ssr": 3.4.22 + "@vue/shared": 3.4.22 + estree-walker: 2.0.2 + magic-string: 0.30.9 + postcss: 8.4.38 + source-map-js: 1.2.0 - /ajv-keywords@3.5.2(ajv@6.12.6): + /@vue/compiler-ssr@3.4.22: resolution: { - integrity: sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==, + integrity: sha512-ycb2sL0SW6AkgVMrvaU/TIAEk7FQWyv/oYya44E/V9xURM+ij9Oev5bVobSS7GLJzkUieWW3SrYcK/PZpb5i4A==, } - peerDependencies: - ajv: ^6.9.1 dependencies: - ajv: 6.12.6 - dev: true + "@vue/compiler-dom": 3.4.22 + "@vue/shared": 3.4.22 - /ajv-keywords@5.1.0(ajv@8.12.0): + /@vue/language-core@2.0.13(typescript@5.4.4): resolution: { - integrity: sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==, + integrity: sha512-oQgM+BM66SU5GKtUMLQSQN0bxHFkFpLSSAiY87wVziPaiNQZuKVDt/3yA7GB9PiQw0y/bTNL0bOc0jM/siYjKg==, } peerDependencies: - ajv: ^8.8.2 + typescript: "*" + peerDependenciesMeta: + typescript: + optional: true dependencies: - ajv: 8.12.0 - fast-deep-equal: 3.1.3 + "@volar/language-core": 2.2.0-alpha.8 + "@vue/compiler-dom": 3.4.22 + "@vue/shared": 3.4.22 + computeds: 0.0.1 + minimatch: 9.0.4 + path-browserify: 1.0.1 + typescript: 5.4.4 + vue-template-compiler: 2.7.16 dev: true - /ajv@6.12.6: + /@vue/reactivity@3.4.22: resolution: { - integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==, + integrity: sha512-+golHRRfcGoahBrhoTauFNIIAhxntRV3BI8HHqVvCdsuWivxW1MI0E9AOXVsz4H/ZlWM1ahudWTX6PhUrNR2yQ==, } dependencies: - fast-deep-equal: 3.1.3 - fast-json-stable-stringify: 2.1.0 - json-schema-traverse: 0.4.1 - uri-js: 4.4.1 - dev: true + "@vue/shared": 3.4.22 - /ajv@8.12.0: + /@vue/runtime-core@3.4.22: resolution: { - integrity: sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==, + integrity: sha512-cbA8lcL4g1907EdY1a1KmP5IRWfbqjgBRcgJPkF//yn96XSC1/VAJBZiAGLiyw0P77Rw2Ao7d9U51vU1GC6yUQ==, } dependencies: - fast-deep-equal: 3.1.3 - json-schema-traverse: 1.0.0 - require-from-string: 2.0.2 - uri-js: 4.4.1 - dev: true + "@vue/reactivity": 3.4.22 + "@vue/shared": 3.4.22 - /ansi-html-community@0.0.8: + /@vue/runtime-dom@3.4.22: resolution: { - integrity: sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==, + integrity: sha512-AXxRHrFkLX1y2+70CO2wDKRxW0WZcQKTOXS31AK+jZ1RLPtI6sEHVpYNfyE9WgbgXOqPtX4gfIfuoFYi8iCu2w==, } - engines: { "0": node >= 0.8.0 } - hasBin: true - dev: true + dependencies: + "@vue/runtime-core": 3.4.22 + "@vue/shared": 3.4.22 + csstype: 3.1.3 - /ansi-regex@5.0.1: + /@vue/server-renderer@3.4.22(vue@3.4.22): resolution: { - integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==, + integrity: sha512-okiNxiCOhJlx6IOrTZvhIVwf2UYKay0hnIPqWu4h19bkNv1gmG4Ic6U3zXY287AWF26lQuFMa515Qzc+R0aAYg==, } - engines: { node: ">=8" } - dev: true + peerDependencies: + vue: 3.4.22 + dependencies: + "@vue/compiler-ssr": 3.4.22 + "@vue/shared": 3.4.22 + vue: 3.4.22(typescript@5.4.4) - /ansi-styles@4.3.0: + /@vue/shared@3.4.22: resolution: { - integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==, + integrity: sha512-cg7R9XNk4ovV3bKka/1a464O2oY0l5Fyt0rwGR4hSJRPjUJ0WVjrPdsr4W0JbUriwiM8EKcCcCjeKN5pRMs2Zg==, } - engines: { node: ">=8" } + + /@vuetify/loader-shared@2.0.3(vue@3.4.22)(vuetify@3.5.15): + resolution: + { + integrity: sha512-Ss3GC7eJYkp2SF6xVzsT7FAruEmdihmn4OCk2+UocREerlXKWgOKKzTN5PN3ZVN5q05jHHrsNhTuWbhN61Bpdg==, + } + peerDependencies: + vue: ^3.0.0 + vuetify: ^3.0.0 dependencies: - color-convert: 2.0.1 - dev: true + upath: 2.0.1 + vue: 3.4.22(typescript@5.4.4) + vuetify: 3.5.15(typescript@5.4.4)(vite-plugin-vuetify@2.0.3)(vue@3.4.22) + + /abab@2.0.6: + resolution: + { + integrity: sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==, + } + deprecated: Use your platform's native atob() and btoa() methods instead + + /agent-base@6.0.2: + resolution: + { + integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==, + } + engines: { node: ">= 6.0.0" } + dependencies: + debug: 4.3.4 + transitivePeerDependencies: + - supports-color /anymatch@3.1.3: resolution: @@ -691,21 +781,12 @@ packages: dependencies: normalize-path: 3.0.0 picomatch: 2.3.1 - dev: true - - /array-flatten@1.1.1: - resolution: - { - integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==, - } - dev: true /asynckit@0.4.0: resolution: { integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==, } - dev: false /balanced-match@1.0.2: resolution: @@ -714,20 +795,12 @@ packages: } dev: true - /batch@0.6.1: - resolution: - { - integrity: sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==, - } - dev: true - /binary-extensions@2.3.0: resolution: { integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==, } engines: { node: ">=8" } - dev: true /blockly@10.4.3: resolution: @@ -741,56 +814,14 @@ packages: - canvas - supports-color - utf-8-validate - dev: false - - /body-parser@1.20.2: - resolution: - { - integrity: sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==, - } - engines: { node: ">= 0.8", npm: 1.2.8000 || >= 1.4.16 } - dependencies: - bytes: 3.1.2 - content-type: 1.0.5 - debug: 2.6.9 - depd: 2.0.0 - destroy: 1.2.0 - http-errors: 2.0.0 - iconv-lite: 0.4.24 - on-finished: 2.4.1 - qs: 6.11.0 - raw-body: 2.5.2 - type-is: 1.6.18 - unpipe: 1.0.0 - transitivePeerDependencies: - - supports-color - dev: true - - /bonjour-service@1.2.1: - resolution: - { - integrity: sha512-oSzCS2zV14bh2kji6vNe7vrpJYCHGvcZnlffFQ1MEoX/WOeQ/teD8SYWKR942OI3INjq8OMNJlbPK5LLLUxFDw==, - } - dependencies: - fast-deep-equal: 3.1.3 - multicast-dns: 7.2.5 - dev: true - - /boolbase@1.0.0: - resolution: - { - integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==, - } - dev: true - /brace-expansion@1.1.11: + /brace-expansion@2.0.1: resolution: { - integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==, + integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==, } dependencies: balanced-match: 1.0.2 - concat-map: 0.0.1 dev: true /braces@3.0.2: @@ -801,86 +832,6 @@ packages: engines: { node: ">=8" } dependencies: fill-range: 7.0.1 - dev: true - - /browserslist@4.23.0: - resolution: - { - integrity: sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==, - } - engines: { node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7 } - hasBin: true - dependencies: - caniuse-lite: 1.0.30001607 - electron-to-chromium: 1.4.730 - node-releases: 2.0.14 - update-browserslist-db: 1.0.13(browserslist@4.23.0) - dev: true - - /buffer-from@1.1.2: - resolution: - { - integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==, - } - dev: true - - /bytes@3.0.0: - resolution: - { - integrity: sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==, - } - engines: { node: ">= 0.8" } - dev: true - - /bytes@3.1.2: - resolution: - { - integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==, - } - engines: { node: ">= 0.8" } - dev: true - - /call-bind@1.0.7: - resolution: - { - integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==, - } - engines: { node: ">= 0.4" } - dependencies: - es-define-property: 1.0.0 - es-errors: 1.3.0 - function-bind: 1.1.2 - get-intrinsic: 1.2.4 - set-function-length: 1.2.2 - dev: true - - /camel-case@4.1.2: - resolution: - { - integrity: sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==, - } - dependencies: - pascal-case: 3.1.2 - tslib: 2.6.2 - dev: true - - /caniuse-lite@1.0.30001607: - resolution: - { - integrity: sha512-WcvhVRjXLKFB/kmOFVwELtMxyhq3iM/MvmXcyCe2PNf166c39mptscOc/45TTS96n2gpNV2z7+NakArTWZCQ3w==, - } - dev: true - - /chalk@4.1.2: - resolution: - { - integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==, - } - engines: { node: ">=10" } - dependencies: - ansi-styles: 4.3.0 - supports-color: 7.2.0 - dev: true /chokidar@3.6.0: resolution: @@ -898,61 +849,6 @@ packages: readdirp: 3.6.0 optionalDependencies: fsevents: 2.3.3 - dev: true - - /chrome-trace-event@1.0.3: - resolution: - { - integrity: sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==, - } - engines: { node: ">=6.0" } - dev: true - - /clean-css@5.3.3: - resolution: - { - integrity: sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg==, - } - engines: { node: ">= 10.0" } - dependencies: - source-map: 0.6.1 - dev: true - - /clone-deep@4.0.1: - resolution: - { - integrity: sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==, - } - engines: { node: ">=6" } - dependencies: - is-plain-object: 2.0.4 - kind-of: 6.0.3 - shallow-clone: 3.0.1 - dev: true - - /color-convert@2.0.1: - resolution: - { - integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==, - } - engines: { node: ">=7.0.0" } - dependencies: - color-name: 1.1.4 - dev: true - - /color-name@1.1.4: - resolution: - { - integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==, - } - dev: true - - /colorette@2.0.20: - resolution: - { - integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==, - } - dev: true /combined-stream@1.0.8: resolution: @@ -962,180 +858,12 @@ packages: engines: { node: ">= 0.8" } dependencies: delayed-stream: 1.0.0 - dev: false - - /commander@2.20.3: - resolution: - { - integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==, - } - dev: true - - /commander@7.2.0: - resolution: - { - integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==, - } - engines: { node: ">= 10" } - dev: true - - /commander@8.3.0: - resolution: - { - integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==, - } - engines: { node: ">= 12" } - dev: true - - /compressible@2.0.18: - resolution: - { - integrity: sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==, - } - engines: { node: ">= 0.6" } - dependencies: - mime-db: 1.52.0 - dev: true - - /compression@1.7.4: - resolution: - { - integrity: sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==, - } - engines: { node: ">= 0.8.0" } - dependencies: - accepts: 1.3.8 - bytes: 3.0.0 - compressible: 2.0.18 - debug: 2.6.9 - on-headers: 1.0.2 - safe-buffer: 5.1.2 - vary: 1.1.2 - transitivePeerDependencies: - - supports-color - dev: true - - /concat-map@0.0.1: - resolution: - { - integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==, - } - dev: true - - /connect-history-api-fallback@2.0.0: - resolution: - { - integrity: sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==, - } - engines: { node: ">=0.8" } - dev: true - - /content-disposition@0.5.4: - resolution: - { - integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==, - } - engines: { node: ">= 0.6" } - dependencies: - safe-buffer: 5.2.1 - dev: true - - /content-type@1.0.5: - resolution: - { - integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==, - } - engines: { node: ">= 0.6" } - dev: true - - /cookie-signature@1.0.6: - resolution: - { - integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==, - } - dev: true - - /cookie@0.6.0: - resolution: - { - integrity: sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==, - } - engines: { node: ">= 0.6" } - dev: true - - /core-util-is@1.0.3: - resolution: - { - integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==, - } - dev: true - - /cross-spawn@7.0.3: - resolution: - { - integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==, - } - engines: { node: ">= 8" } - dependencies: - path-key: 3.1.1 - shebang-command: 2.0.0 - which: 2.0.2 - dev: true - - /css-loader@6.11.0(webpack@5.91.0): - resolution: - { - integrity: sha512-CTJ+AEQJjq5NzLga5pE39qdiSV56F8ywCIsqNIRF0r7BDgWsN25aazToqAFg7ZrtA/U016xudB3ffgweORxX7g==, - } - engines: { node: ">= 12.13.0" } - peerDependencies: - "@rspack/core": 0.x || 1.x - webpack: ^5.0.0 - peerDependenciesMeta: - "@rspack/core": - optional: true - webpack: - optional: true - dependencies: - icss-utils: 5.1.0(postcss@8.4.38) - postcss: 8.4.38 - postcss-modules-extract-imports: 3.1.0(postcss@8.4.38) - postcss-modules-local-by-default: 4.0.5(postcss@8.4.38) - postcss-modules-scope: 3.2.0(postcss@8.4.38) - postcss-modules-values: 4.0.0(postcss@8.4.38) - postcss-value-parser: 4.2.0 - semver: 7.6.0 - webpack: 5.91.0(webpack-cli@4.10.0) - dev: true - - /css-select@4.3.0: - resolution: - { - integrity: sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==, - } - dependencies: - boolbase: 1.0.0 - css-what: 6.1.0 - domhandler: 4.3.1 - domutils: 2.8.0 - nth-check: 2.1.1 - dev: true - - /css-what@6.1.0: - resolution: - { - integrity: sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==, - } - engines: { node: ">= 6" } - dev: true - /cssesc@3.0.0: + /computeds@0.0.1: resolution: { - integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==, + integrity: sha512-7CEBgcMjVmitjYo5q8JTJVra6X5mQ20uTThdK+0kR7UEaDrAWEQcRiBtWJzga4eRpP6afNwwLsX2SET2JhVB1Q==, } - engines: { node: ">=4" } - hasBin: true dev: true /cssstyle@3.0.0: @@ -1146,2865 +874,871 @@ packages: engines: { node: ">=14" } dependencies: rrweb-cssom: 0.6.0 - dev: false - - /data-urls@4.0.0: - resolution: - { - integrity: sha512-/mMTei/JXPqvFqQtfyTowxmJVwr2PVAeCcDxyFf6LhoOu/09TX2OX3kb2wzi4DMXcfj4OItwDOnhl5oziPnT6g==, - } - engines: { node: ">=14" } - dependencies: - abab: 2.0.6 - whatwg-mimetype: 3.0.0 - whatwg-url: 12.0.1 - dev: false - - /debug@2.6.9: - resolution: - { - integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==, - } - peerDependencies: - supports-color: "*" - peerDependenciesMeta: - supports-color: - optional: true - dependencies: - ms: 2.0.0 - dev: true - - /debug@4.3.4: - resolution: - { - integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==, - } - engines: { node: ">=6.0" } - peerDependencies: - supports-color: "*" - peerDependenciesMeta: - supports-color: - optional: true - dependencies: - ms: 2.1.2 - - /decimal.js@10.4.3: - resolution: - { - integrity: sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==, - } - dev: false - - /default-gateway@6.0.3: - resolution: - { - integrity: sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==, - } - engines: { node: ">= 10" } - dependencies: - execa: 5.1.1 - dev: true - - /define-data-property@1.1.4: - resolution: - { - integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==, - } - engines: { node: ">= 0.4" } - dependencies: - es-define-property: 1.0.0 - es-errors: 1.3.0 - gopd: 1.0.1 - dev: true - - /define-lazy-prop@2.0.0: - resolution: - { - integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==, - } - engines: { node: ">=8" } - dev: true - - /delayed-stream@1.0.0: - resolution: - { - integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==, - } - engines: { node: ">=0.4.0" } - dev: false - - /depd@1.1.2: - resolution: - { - integrity: sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==, - } - engines: { node: ">= 0.6" } - dev: true - - /depd@2.0.0: - resolution: - { - integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==, - } - engines: { node: ">= 0.8" } - dev: true - - /destroy@1.2.0: - resolution: - { - integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==, - } - engines: { node: ">= 0.8", npm: 1.2.8000 || >= 1.4.16 } - dev: true - - /detect-node@2.1.0: - resolution: - { - integrity: sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==, - } - dev: true - - /dns-packet@5.6.1: - resolution: - { - integrity: sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==, - } - engines: { node: ">=6" } - dependencies: - "@leichtgewicht/ip-codec": 2.0.5 - dev: true - - /dom-converter@0.2.0: - resolution: - { - integrity: sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==, - } - dependencies: - utila: 0.4.0 - dev: true - - /dom-serializer@1.4.1: - resolution: - { - integrity: sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==, - } - dependencies: - domelementtype: 2.3.0 - domhandler: 4.3.1 - entities: 2.2.0 - dev: true - - /domelementtype@2.3.0: - resolution: - { - integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==, - } - dev: true - - /domexception@4.0.0: - resolution: - { - integrity: sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw==, - } - engines: { node: ">=12" } - deprecated: Use your platform's native DOMException instead - dependencies: - webidl-conversions: 7.0.0 - dev: false - - /domhandler@4.3.1: - resolution: - { - integrity: sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==, - } - engines: { node: ">= 4" } - dependencies: - domelementtype: 2.3.0 - dev: true - - /domutils@2.8.0: - resolution: - { - integrity: sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==, - } - dependencies: - dom-serializer: 1.4.1 - domelementtype: 2.3.0 - domhandler: 4.3.1 - dev: true - - /dot-case@3.0.4: - resolution: - { - integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==, - } - dependencies: - no-case: 3.0.4 - tslib: 2.6.2 - dev: true - - /ee-first@1.1.1: - resolution: - { - integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==, - } - dev: true - - /electron-to-chromium@1.4.730: - resolution: - { - integrity: sha512-oJRPo82XEqtQAobHpJIR3zW5YO3sSRRkPz2an4yxi1UvqhsGm54vR/wzTFV74a3soDOJ8CKW7ajOOX5ESzddwg==, - } - dev: true - - /encodeurl@1.0.2: - resolution: - { - integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==, - } - engines: { node: ">= 0.8" } - dev: true - - /enhanced-resolve@5.16.0: - resolution: - { - integrity: sha512-O+QWCviPNSSLAD9Ucn8Awv+poAkqn3T1XY5/N7kR7rQO9yfSGWkYZDwpJ+iKF7B8rxaQKWngSqACpgzeapSyoA==, - } - engines: { node: ">=10.13.0" } - dependencies: - graceful-fs: 4.2.11 - tapable: 2.2.1 - dev: true - - /entities@2.2.0: - resolution: - { - integrity: sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==, - } - dev: true - - /entities@4.5.0: - resolution: - { - integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==, - } - engines: { node: ">=0.12" } - dev: false - - /envinfo@7.12.0: - resolution: - { - integrity: sha512-Iw9rQJBGpJRd3rwXm9ft/JiGoAZmLxxJZELYDQoPRZ4USVhkKtIcNBPw6U+/K2mBpaqM25JSV6Yl4Az9vO2wJg==, - } - engines: { node: ">=4" } - hasBin: true - dev: true - - /es-define-property@1.0.0: - resolution: - { - integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==, - } - engines: { node: ">= 0.4" } - dependencies: - get-intrinsic: 1.2.4 - dev: true - - /es-errors@1.3.0: - resolution: - { - integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==, - } - engines: { node: ">= 0.4" } - dev: true - - /es-module-lexer@1.5.0: - resolution: - { - integrity: sha512-pqrTKmwEIgafsYZAGw9kszYzmagcE/n4dbgwGWLEXg7J4QFJVQRBld8j3Q3GNez79jzxZshq0bcT962QHOghjw==, - } - dev: true - - /escalade@3.1.2: - resolution: - { - integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==, - } - engines: { node: ">=6" } - dev: true - - /escape-html@1.0.3: - resolution: - { - integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==, - } - dev: true - - /eslint-scope@5.1.1: - resolution: - { - integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==, - } - engines: { node: ">=8.0.0" } - dependencies: - esrecurse: 4.3.0 - estraverse: 4.3.0 - dev: true - - /esrecurse@4.3.0: - resolution: - { - integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==, - } - engines: { node: ">=4.0" } - dependencies: - estraverse: 5.3.0 - dev: true - - /estraverse@4.3.0: - resolution: - { - integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==, - } - engines: { node: ">=4.0" } - dev: true - - /estraverse@5.3.0: - resolution: - { - integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==, - } - engines: { node: ">=4.0" } - dev: true - - /etag@1.8.1: - resolution: - { - integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==, - } - engines: { node: ">= 0.6" } - dev: true - - /eventemitter3@4.0.7: - resolution: - { - integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==, - } - dev: true - - /events@3.3.0: - resolution: - { - integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==, - } - engines: { node: ">=0.8.x" } - dev: true - - /execa@5.1.1: - resolution: - { - integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==, - } - engines: { node: ">=10" } - dependencies: - cross-spawn: 7.0.3 - get-stream: 6.0.1 - human-signals: 2.1.0 - is-stream: 2.0.1 - merge-stream: 2.0.0 - npm-run-path: 4.0.1 - onetime: 5.1.2 - signal-exit: 3.0.7 - strip-final-newline: 2.0.0 - dev: true - - /express@4.19.2: - resolution: - { - integrity: sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==, - } - engines: { node: ">= 0.10.0" } - dependencies: - accepts: 1.3.8 - array-flatten: 1.1.1 - body-parser: 1.20.2 - content-disposition: 0.5.4 - content-type: 1.0.5 - cookie: 0.6.0 - cookie-signature: 1.0.6 - debug: 2.6.9 - depd: 2.0.0 - encodeurl: 1.0.2 - escape-html: 1.0.3 - etag: 1.8.1 - finalhandler: 1.2.0 - fresh: 0.5.2 - http-errors: 2.0.0 - merge-descriptors: 1.0.1 - methods: 1.1.2 - on-finished: 2.4.1 - parseurl: 1.3.3 - path-to-regexp: 0.1.7 - proxy-addr: 2.0.7 - qs: 6.11.0 - range-parser: 1.2.1 - safe-buffer: 5.2.1 - send: 0.18.0 - serve-static: 1.15.0 - setprototypeof: 1.2.0 - statuses: 2.0.1 - type-is: 1.6.18 - utils-merge: 1.0.1 - vary: 1.1.2 - transitivePeerDependencies: - - supports-color - dev: true - - /fast-deep-equal@3.1.3: - resolution: - { - integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==, - } - dev: true - - /fast-json-stable-stringify@2.1.0: - resolution: - { - integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==, - } - dev: true - - /fastest-levenshtein@1.0.16: - resolution: - { - integrity: sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==, - } - engines: { node: ">= 4.9.1" } - dev: true - - /faye-websocket@0.11.4: - resolution: - { - integrity: sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==, - } - engines: { node: ">=0.8.0" } - dependencies: - websocket-driver: 0.7.4 - dev: true - - /fill-range@7.0.1: - resolution: - { - integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==, - } - engines: { node: ">=8" } - dependencies: - to-regex-range: 5.0.1 - dev: true - - /finalhandler@1.2.0: - resolution: - { - integrity: sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==, - } - engines: { node: ">= 0.8" } - dependencies: - debug: 2.6.9 - encodeurl: 1.0.2 - escape-html: 1.0.3 - on-finished: 2.4.1 - parseurl: 1.3.3 - statuses: 2.0.1 - unpipe: 1.0.0 - transitivePeerDependencies: - - supports-color - dev: true - - /find-up@4.1.0: - resolution: - { - integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==, - } - engines: { node: ">=8" } - dependencies: - locate-path: 5.0.0 - path-exists: 4.0.0 - dev: true - - /flat@5.0.2: - resolution: - { - integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==, - } - hasBin: true - dev: true - - /follow-redirects@1.15.6: - resolution: - { - integrity: sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==, - } - engines: { node: ">=4.0" } - peerDependencies: - debug: "*" - peerDependenciesMeta: - debug: - optional: true - dev: true - - /form-data@4.0.0: - resolution: - { - integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==, - } - engines: { node: ">= 6" } - dependencies: - asynckit: 0.4.0 - combined-stream: 1.0.8 - mime-types: 2.1.35 - dev: false - - /forwarded@0.2.0: - resolution: - { - integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==, - } - engines: { node: ">= 0.6" } - dev: true - - /fresh@0.5.2: - resolution: - { - integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==, - } - engines: { node: ">= 0.6" } - dev: true - - /fs-monkey@1.0.5: - resolution: - { - integrity: sha512-8uMbBjrhzW76TYgEV27Y5E//W2f/lTFmx78P2w19FZSxarhI/798APGQyuGCwmkNxgwGRhrLfvWyLBvNtuOmew==, - } - dev: true - - /fs.realpath@1.0.0: - resolution: - { - integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==, - } - dev: true - - /fsevents@2.3.3: - resolution: - { - integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==, - } - engines: { node: ^8.16.0 || ^10.6.0 || >=11.0.0 } - os: [darwin] - requiresBuild: true - dev: true - optional: true - - /function-bind@1.1.2: - resolution: - { - integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==, - } - dev: true - - /get-intrinsic@1.2.4: - resolution: - { - integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==, - } - engines: { node: ">= 0.4" } - dependencies: - es-errors: 1.3.0 - function-bind: 1.1.2 - has-proto: 1.0.3 - has-symbols: 1.0.3 - hasown: 2.0.2 - dev: true - - /get-stream@6.0.1: - resolution: - { - integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==, - } - engines: { node: ">=10" } - dev: true - - /glob-parent@5.1.2: - resolution: - { - integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==, - } - engines: { node: ">= 6" } - dependencies: - is-glob: 4.0.3 - dev: true - - /glob-to-regexp@0.4.1: - resolution: - { - integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==, - } - dev: true - - /glob@7.2.3: - resolution: - { - integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==, - } - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.1.2 - once: 1.4.0 - path-is-absolute: 1.0.1 - dev: true - - /gopd@1.0.1: - resolution: - { - integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==, - } - dependencies: - get-intrinsic: 1.2.4 - dev: true - - /graceful-fs@4.2.11: - resolution: - { - integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==, - } - dev: true - - /handle-thing@2.0.1: - resolution: - { - integrity: sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==, - } - dev: true - - /has-flag@4.0.0: - resolution: - { - integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==, - } - engines: { node: ">=8" } - dev: true - - /has-property-descriptors@1.0.2: - resolution: - { - integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==, - } - dependencies: - es-define-property: 1.0.0 - dev: true - - /has-proto@1.0.3: - resolution: - { - integrity: sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==, - } - engines: { node: ">= 0.4" } - dev: true - - /has-symbols@1.0.3: - resolution: - { - integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==, - } - engines: { node: ">= 0.4" } - dev: true - - /hasown@2.0.2: - resolution: - { - integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==, - } - engines: { node: ">= 0.4" } - dependencies: - function-bind: 1.1.2 - dev: true - - /he@1.2.0: - resolution: - { - integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==, - } - hasBin: true - dev: true - - /hpack.js@2.1.6: - resolution: - { - integrity: sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==, - } - dependencies: - inherits: 2.0.4 - obuf: 1.1.2 - readable-stream: 2.3.8 - wbuf: 1.7.3 - dev: true - - /html-encoding-sniffer@3.0.0: - resolution: - { - integrity: sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==, - } - engines: { node: ">=12" } - dependencies: - whatwg-encoding: 2.0.0 - dev: false - - /html-entities@2.5.2: - resolution: - { - integrity: sha512-K//PSRMQk4FZ78Kyau+mZurHn3FH0Vwr+H36eE0rPbeYkRRi9YxceYPhuN60UwWorxyKHhqoAJl2OFKa4BVtaA==, - } - dev: true - - /html-minifier-terser@6.1.0: - resolution: - { - integrity: sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==, - } - engines: { node: ">=12" } - hasBin: true - dependencies: - camel-case: 4.1.2 - clean-css: 5.3.3 - commander: 8.3.0 - he: 1.2.0 - param-case: 3.0.4 - relateurl: 0.2.7 - terser: 5.30.3 - dev: true - - /html-webpack-plugin@5.6.0(webpack@5.91.0): - resolution: - { - integrity: sha512-iwaY4wzbe48AfKLZ/Cc8k0L+FKG6oSNRaZ8x5A/T/IVDGyXcbHncM9TdDa93wn0FsSm82FhTKW7f3vS61thXAw==, - } - engines: { node: ">=10.13.0" } - peerDependencies: - "@rspack/core": 0.x || 1.x - webpack: ^5.20.0 - peerDependenciesMeta: - "@rspack/core": - optional: true - webpack: - optional: true - dependencies: - "@types/html-minifier-terser": 6.1.0 - html-minifier-terser: 6.1.0 - lodash: 4.17.21 - pretty-error: 4.0.0 - tapable: 2.2.1 - webpack: 5.91.0(webpack-cli@4.10.0) - dev: true - - /htmlparser2@6.1.0: - resolution: - { - integrity: sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==, - } - dependencies: - domelementtype: 2.3.0 - domhandler: 4.3.1 - domutils: 2.8.0 - entities: 2.2.0 - dev: true - - /http-deceiver@1.2.7: - resolution: - { - integrity: sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==, - } - dev: true - - /http-errors@1.6.3: - resolution: - { - integrity: sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==, - } - engines: { node: ">= 0.6" } - dependencies: - depd: 1.1.2 - inherits: 2.0.3 - setprototypeof: 1.1.0 - statuses: 1.5.0 - dev: true - - /http-errors@2.0.0: - resolution: - { - integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==, - } - engines: { node: ">= 0.8" } - dependencies: - depd: 2.0.0 - inherits: 2.0.4 - setprototypeof: 1.2.0 - statuses: 2.0.1 - toidentifier: 1.0.1 - dev: true - - /http-parser-js@0.5.8: - resolution: - { - integrity: sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==, - } - dev: true - - /http-proxy-agent@5.0.0: - resolution: - { - integrity: sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==, - } - engines: { node: ">= 6" } - dependencies: - "@tootallnate/once": 2.0.0 - agent-base: 6.0.2 - debug: 4.3.4 - transitivePeerDependencies: - - supports-color - dev: false - - /http-proxy-middleware@2.0.6(@types/express@4.17.21): - resolution: - { - integrity: sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==, - } - engines: { node: ">=12.0.0" } - peerDependencies: - "@types/express": ^4.17.13 - peerDependenciesMeta: - "@types/express": - optional: true - dependencies: - "@types/express": 4.17.21 - "@types/http-proxy": 1.17.14 - http-proxy: 1.18.1 - is-glob: 4.0.3 - is-plain-obj: 3.0.0 - micromatch: 4.0.5 - transitivePeerDependencies: - - debug - dev: true - - /http-proxy@1.18.1: - resolution: - { - integrity: sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==, - } - engines: { node: ">=8.0.0" } - dependencies: - eventemitter3: 4.0.7 - follow-redirects: 1.15.6 - requires-port: 1.0.0 - transitivePeerDependencies: - - debug - dev: true - - /https-proxy-agent@5.0.1: - resolution: - { - integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==, - } - engines: { node: ">= 6" } - dependencies: - agent-base: 6.0.2 - debug: 4.3.4 - transitivePeerDependencies: - - supports-color - dev: false - - /human-signals@2.1.0: - resolution: - { - integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==, - } - engines: { node: ">=10.17.0" } - dev: true - - /iconv-lite@0.4.24: - resolution: - { - integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==, - } - engines: { node: ">=0.10.0" } - dependencies: - safer-buffer: 2.1.2 - dev: true - - /iconv-lite@0.6.3: - resolution: - { - integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==, - } - engines: { node: ">=0.10.0" } - dependencies: - safer-buffer: 2.1.2 - - /icss-utils@5.1.0(postcss@8.4.38): - resolution: - { - integrity: sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==, - } - engines: { node: ^10 || ^12 || >= 14 } - peerDependencies: - postcss: ^8.1.0 - dependencies: - postcss: 8.4.38 - dev: true - - /import-local@3.1.0: - resolution: - { - integrity: sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==, - } - engines: { node: ">=8" } - hasBin: true - dependencies: - pkg-dir: 4.2.0 - resolve-cwd: 3.0.0 - dev: true - - /inflight@1.0.6: - resolution: - { - integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==, - } - dependencies: - once: 1.4.0 - wrappy: 1.0.2 - dev: true - - /inherits@2.0.3: - resolution: - { - integrity: sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==, - } - dev: true - - /inherits@2.0.4: - resolution: - { - integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==, - } - dev: true - - /interpret@2.2.0: - resolution: - { - integrity: sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==, - } - engines: { node: ">= 0.10" } - dev: true - - /ipaddr.js@1.9.1: - resolution: - { - integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==, - } - engines: { node: ">= 0.10" } - dev: true - - /ipaddr.js@2.1.0: - resolution: - { - integrity: sha512-LlbxQ7xKzfBusov6UMi4MFpEg0m+mAm9xyNGEduwXMEDuf4WfzB/RZwMVYEd7IKGvh4IUkEXYxtAVu9T3OelJQ==, - } - engines: { node: ">= 10" } - dev: true - - /is-binary-path@2.1.0: - resolution: - { - integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==, - } - engines: { node: ">=8" } - dependencies: - binary-extensions: 2.3.0 - dev: true - - /is-core-module@2.13.1: - resolution: - { - integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==, - } - dependencies: - hasown: 2.0.2 - dev: true - - /is-docker@2.2.1: - resolution: - { - integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==, - } - engines: { node: ">=8" } - hasBin: true - dev: true - - /is-extglob@2.1.1: - resolution: - { - integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==, - } - engines: { node: ">=0.10.0" } - dev: true - - /is-glob@4.0.3: - resolution: - { - integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==, - } - engines: { node: ">=0.10.0" } - dependencies: - is-extglob: 2.1.1 - dev: true - - /is-number@7.0.0: - resolution: - { - integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==, - } - engines: { node: ">=0.12.0" } - dev: true - - /is-plain-obj@3.0.0: - resolution: - { - integrity: sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==, - } - engines: { node: ">=10" } - dev: true - - /is-plain-object@2.0.4: - resolution: - { - integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==, - } - engines: { node: ">=0.10.0" } - dependencies: - isobject: 3.0.1 - dev: true - - /is-potential-custom-element-name@1.0.1: - resolution: - { - integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==, - } - dev: false - - /is-stream@2.0.1: - resolution: - { - integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==, - } - engines: { node: ">=8" } - dev: true - - /is-wsl@2.2.0: - resolution: - { - integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==, - } - engines: { node: ">=8" } - dependencies: - is-docker: 2.2.1 - dev: true - - /isarray@1.0.0: - resolution: - { - integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==, - } - dev: true - - /isexe@2.0.0: - resolution: - { - integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==, - } - dev: true - - /isobject@3.0.1: - resolution: - { - integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==, - } - engines: { node: ">=0.10.0" } - dev: true - - /jest-worker@27.5.1: - resolution: - { - integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==, - } - engines: { node: ">= 10.13.0" } - dependencies: - "@types/node": 20.12.6 - merge-stream: 2.0.0 - supports-color: 8.1.1 - dev: true - - /jsdom@22.1.0: - resolution: - { - integrity: sha512-/9AVW7xNbsBv6GfWho4TTNjEo9fe6Zhf9O7s0Fhhr3u+awPwAJMKwAMXnkk5vBxflqLW9hTHX/0cs+P3gW+cQw==, - } - engines: { node: ">=16" } - peerDependencies: - canvas: ^2.5.0 - peerDependenciesMeta: - canvas: - optional: true - dependencies: - abab: 2.0.6 - cssstyle: 3.0.0 - data-urls: 4.0.0 - decimal.js: 10.4.3 - domexception: 4.0.0 - form-data: 4.0.0 - html-encoding-sniffer: 3.0.0 - http-proxy-agent: 5.0.0 - https-proxy-agent: 5.0.1 - is-potential-custom-element-name: 1.0.1 - nwsapi: 2.2.7 - parse5: 7.1.2 - rrweb-cssom: 0.6.0 - saxes: 6.0.0 - symbol-tree: 3.2.4 - tough-cookie: 4.1.3 - w3c-xmlserializer: 4.0.0 - webidl-conversions: 7.0.0 - whatwg-encoding: 2.0.0 - whatwg-mimetype: 3.0.0 - whatwg-url: 12.0.1 - ws: 8.16.0 - xml-name-validator: 4.0.0 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - dev: false - - /json-parse-even-better-errors@2.3.1: - resolution: - { - integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==, - } - dev: true - - /json-schema-traverse@0.4.1: - resolution: - { - integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==, - } - dev: true - - /json-schema-traverse@1.0.0: - resolution: - { - integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==, - } - dev: true - - /kind-of@6.0.3: - resolution: - { - integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==, - } - engines: { node: ">=0.10.0" } - dev: true - - /launch-editor@2.6.1: - resolution: - { - integrity: sha512-eB/uXmFVpY4zezmGp5XtU21kwo7GBbKB+EQ+UZeWtGb9yAM5xt/Evk+lYH3eRNAtId+ej4u7TYPFZ07w4s7rRw==, - } - dependencies: - picocolors: 1.0.0 - shell-quote: 1.8.1 - dev: true - - /loader-runner@4.3.0: - resolution: - { - integrity: sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==, - } - engines: { node: ">=6.11.5" } - dev: true - - /locate-path@5.0.0: - resolution: - { - integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==, - } - engines: { node: ">=8" } - dependencies: - p-locate: 4.1.0 - dev: true - - /lodash@4.17.21: - resolution: - { - integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==, - } - dev: true - - /lower-case@2.0.2: - resolution: - { - integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==, - } - dependencies: - tslib: 2.6.2 - dev: true - - /lru-cache@6.0.0: - resolution: - { - integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==, - } - engines: { node: ">=10" } - dependencies: - yallist: 4.0.0 - dev: true - - /media-typer@0.3.0: - resolution: - { - integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==, - } - engines: { node: ">= 0.6" } - dev: true - - /memfs@3.5.3: - resolution: - { - integrity: sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==, - } - engines: { node: ">= 4.0.0" } - dependencies: - fs-monkey: 1.0.5 - dev: true - - /merge-descriptors@1.0.1: - resolution: - { - integrity: sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==, - } - dev: true - - /merge-stream@2.0.0: - resolution: - { - integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==, - } - dev: true - - /methods@1.1.2: - resolution: - { - integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==, - } - engines: { node: ">= 0.6" } - dev: true - - /micromatch@4.0.5: - resolution: - { - integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==, - } - engines: { node: ">=8.6" } - dependencies: - braces: 3.0.2 - picomatch: 2.3.1 - dev: true - - /mime-db@1.52.0: - resolution: - { - integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==, - } - engines: { node: ">= 0.6" } - - /mime-types@2.1.35: - resolution: - { - integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==, - } - engines: { node: ">= 0.6" } - dependencies: - mime-db: 1.52.0 - - /mime@1.6.0: - resolution: - { - integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==, - } - engines: { node: ">=4" } - hasBin: true - dev: true - - /mimic-fn@2.1.0: - resolution: - { - integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==, - } - engines: { node: ">=6" } - dev: true - - /minimalistic-assert@1.0.1: - resolution: - { - integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==, - } - dev: true - - /minimatch@3.1.2: - resolution: - { - integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==, - } - dependencies: - brace-expansion: 1.1.11 - dev: true - - /ms@2.0.0: - resolution: - { - integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==, - } - dev: true - - /ms@2.1.2: - resolution: - { - integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==, - } - - /ms@2.1.3: - resolution: - { - integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==, - } - dev: true - - /multicast-dns@7.2.5: - resolution: - { - integrity: sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==, - } - hasBin: true - dependencies: - dns-packet: 5.6.1 - thunky: 1.1.0 - dev: true - - /nanoid@3.3.7: - resolution: - { - integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==, - } - engines: { node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1 } - hasBin: true - dev: true - - /negotiator@0.6.3: - resolution: - { - integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==, - } - engines: { node: ">= 0.6" } - dev: true - - /neo-async@2.6.2: - resolution: - { - integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==, - } - dev: true - - /no-case@3.0.4: - resolution: - { - integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==, - } - dependencies: - lower-case: 2.0.2 - tslib: 2.6.2 - dev: true - - /node-forge@1.3.1: - resolution: - { - integrity: sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==, - } - engines: { node: ">= 6.13.0" } - dev: true - - /node-releases@2.0.14: - resolution: - { - integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==, - } - dev: true - - /normalize-path@3.0.0: - resolution: - { - integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==, - } - engines: { node: ">=0.10.0" } - dev: true - - /npm-run-path@4.0.1: - resolution: - { - integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==, - } - engines: { node: ">=8" } - dependencies: - path-key: 3.1.1 - dev: true - - /nth-check@2.1.1: - resolution: - { - integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==, - } - dependencies: - boolbase: 1.0.0 - dev: true - - /nwsapi@2.2.7: - resolution: - { - integrity: sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ==, - } - dev: false - - /object-inspect@1.13.1: - resolution: - { - integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==, - } - dev: true - - /obuf@1.1.2: - resolution: - { - integrity: sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==, - } - dev: true - - /on-finished@2.4.1: - resolution: - { - integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==, - } - engines: { node: ">= 0.8" } - dependencies: - ee-first: 1.1.1 - dev: true - - /on-headers@1.0.2: - resolution: - { - integrity: sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==, - } - engines: { node: ">= 0.8" } - dev: true - - /once@1.4.0: - resolution: - { - integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==, - } - dependencies: - wrappy: 1.0.2 - dev: true - - /onetime@5.1.2: - resolution: - { - integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==, - } - engines: { node: ">=6" } - dependencies: - mimic-fn: 2.1.0 - dev: true - - /open@8.4.2: - resolution: - { - integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==, - } - engines: { node: ">=12" } - dependencies: - define-lazy-prop: 2.0.0 - is-docker: 2.2.1 - is-wsl: 2.2.0 - dev: true - - /p-limit@2.3.0: - resolution: - { - integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==, - } - engines: { node: ">=6" } - dependencies: - p-try: 2.2.0 - dev: true - - /p-locate@4.1.0: - resolution: - { - integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==, - } - engines: { node: ">=8" } - dependencies: - p-limit: 2.3.0 - dev: true - - /p-retry@4.6.2: - resolution: - { - integrity: sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==, - } - engines: { node: ">=8" } - dependencies: - "@types/retry": 0.12.0 - retry: 0.13.1 - dev: true - - /p-try@2.2.0: - resolution: - { - integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==, - } - engines: { node: ">=6" } - dev: true - - /param-case@3.0.4: - resolution: - { - integrity: sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==, - } - dependencies: - dot-case: 3.0.4 - tslib: 2.6.2 - dev: true - - /parse5@7.1.2: - resolution: - { - integrity: sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==, - } - dependencies: - entities: 4.5.0 - dev: false - - /parseurl@1.3.3: - resolution: - { - integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==, - } - engines: { node: ">= 0.8" } - dev: true - - /pascal-case@3.1.2: - resolution: - { - integrity: sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==, - } - dependencies: - no-case: 3.0.4 - tslib: 2.6.2 - dev: true - - /path-exists@4.0.0: - resolution: - { - integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==, - } - engines: { node: ">=8" } - dev: true - - /path-is-absolute@1.0.1: - resolution: - { - integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==, - } - engines: { node: ">=0.10.0" } - dev: true - - /path-key@3.1.1: - resolution: - { - integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==, - } - engines: { node: ">=8" } - dev: true - - /path-parse@1.0.7: - resolution: - { - integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==, - } - dev: true - - /path-to-regexp@0.1.7: - resolution: - { - integrity: sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==, - } - dev: true - - /picocolors@1.0.0: - resolution: - { - integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==, - } - dev: true - - /picomatch@2.3.1: - resolution: - { - integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==, - } - engines: { node: ">=8.6" } - dev: true - - /pkg-dir@4.2.0: - resolution: - { - integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==, - } - engines: { node: ">=8" } - dependencies: - find-up: 4.1.0 - dev: true - - /postcss-modules-extract-imports@3.1.0(postcss@8.4.38): - resolution: - { - integrity: sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==, - } - engines: { node: ^10 || ^12 || >= 14 } - peerDependencies: - postcss: ^8.1.0 - dependencies: - postcss: 8.4.38 - dev: true - - /postcss-modules-local-by-default@4.0.5(postcss@8.4.38): - resolution: - { - integrity: sha512-6MieY7sIfTK0hYfafw1OMEG+2bg8Q1ocHCpoWLqOKj3JXlKu4G7btkmM/B7lFubYkYWmRSPLZi5chid63ZaZYw==, - } - engines: { node: ^10 || ^12 || >= 14 } - peerDependencies: - postcss: ^8.1.0 - dependencies: - icss-utils: 5.1.0(postcss@8.4.38) - postcss: 8.4.38 - postcss-selector-parser: 6.0.16 - postcss-value-parser: 4.2.0 - dev: true - - /postcss-modules-scope@3.2.0(postcss@8.4.38): - resolution: - { - integrity: sha512-oq+g1ssrsZOsx9M96c5w8laRmvEu9C3adDSjI8oTcbfkrTE8hx/zfyobUoWIxaKPO8bt6S62kxpw5GqypEw1QQ==, - } - engines: { node: ^10 || ^12 || >= 14 } - peerDependencies: - postcss: ^8.1.0 - dependencies: - postcss: 8.4.38 - postcss-selector-parser: 6.0.16 - dev: true - - /postcss-modules-values@4.0.0(postcss@8.4.38): - resolution: - { - integrity: sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==, - } - engines: { node: ^10 || ^12 || >= 14 } - peerDependencies: - postcss: ^8.1.0 - dependencies: - icss-utils: 5.1.0(postcss@8.4.38) - postcss: 8.4.38 - dev: true - - /postcss-selector-parser@6.0.16: - resolution: - { - integrity: sha512-A0RVJrX+IUkVZbW3ClroRWurercFhieevHB38sr2+l9eUClMqome3LmEmnhlNy+5Mr2EYN6B2Kaw9wYdd+VHiw==, - } - engines: { node: ">=4" } - dependencies: - cssesc: 3.0.0 - util-deprecate: 1.0.2 - dev: true - - /postcss-value-parser@4.2.0: - resolution: - { - integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==, - } - dev: true - - /postcss@8.4.38: - resolution: - { - integrity: sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==, - } - engines: { node: ^10 || ^12 || >=14 } - dependencies: - nanoid: 3.3.7 - picocolors: 1.0.0 - source-map-js: 1.2.0 - dev: true - - /prettier@3.2.5: - resolution: - { - integrity: sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==, - } - engines: { node: ">=14" } - hasBin: true - dev: true - - /pretty-error@4.0.0: - resolution: - { - integrity: sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==, - } - dependencies: - lodash: 4.17.21 - renderkid: 3.0.0 - dev: true - - /process-nextick-args@2.0.1: - resolution: - { - integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==, - } - dev: true - - /proxy-addr@2.0.7: - resolution: - { - integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==, - } - engines: { node: ">= 0.10" } - dependencies: - forwarded: 0.2.0 - ipaddr.js: 1.9.1 - dev: true - - /psl@1.9.0: - resolution: - { - integrity: sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==, - } - dev: false - - /punycode@2.3.1: - resolution: - { - integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==, - } - engines: { node: ">=6" } - - /qs@6.11.0: - resolution: - { - integrity: sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==, - } - engines: { node: ">=0.6" } - dependencies: - side-channel: 1.0.6 - dev: true - - /querystringify@2.2.0: - resolution: - { - integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==, - } - dev: false - - /randombytes@2.1.0: - resolution: - { - integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==, - } - dependencies: - safe-buffer: 5.2.1 - dev: true - - /range-parser@1.2.1: - resolution: - { - integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==, - } - engines: { node: ">= 0.6" } - dev: true - - /raw-body@2.5.2: - resolution: - { - integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==, - } - engines: { node: ">= 0.8" } - dependencies: - bytes: 3.1.2 - http-errors: 2.0.0 - iconv-lite: 0.4.24 - unpipe: 1.0.0 - dev: true - - /readable-stream@2.3.8: - resolution: - { - integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==, - } - dependencies: - core-util-is: 1.0.3 - inherits: 2.0.4 - isarray: 1.0.0 - process-nextick-args: 2.0.1 - safe-buffer: 5.1.2 - string_decoder: 1.1.1 - util-deprecate: 1.0.2 - dev: true - - /readable-stream@3.6.2: - resolution: - { - integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==, - } - engines: { node: ">= 6" } - dependencies: - inherits: 2.0.4 - string_decoder: 1.3.0 - util-deprecate: 1.0.2 - dev: true - - /readdirp@3.6.0: - resolution: - { - integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==, - } - engines: { node: ">=8.10.0" } - dependencies: - picomatch: 2.3.1 - dev: true - - /rechoir@0.7.1: - resolution: - { - integrity: sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg==, - } - engines: { node: ">= 0.10" } - dependencies: - resolve: 1.22.8 - dev: true - /relateurl@0.2.7: + /csstype@3.1.3: resolution: { - integrity: sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==, + integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==, } - engines: { node: ">= 0.10" } - dev: true - /renderkid@3.0.0: + /data-urls@4.0.0: resolution: { - integrity: sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==, + integrity: sha512-/mMTei/JXPqvFqQtfyTowxmJVwr2PVAeCcDxyFf6LhoOu/09TX2OX3kb2wzi4DMXcfj4OItwDOnhl5oziPnT6g==, } + engines: { node: ">=14" } dependencies: - css-select: 4.3.0 - dom-converter: 0.2.0 - htmlparser2: 6.1.0 - lodash: 4.17.21 - strip-ansi: 6.0.1 - dev: true + abab: 2.0.6 + whatwg-mimetype: 3.0.0 + whatwg-url: 12.0.1 - /require-from-string@2.0.2: + /de-indent@1.0.2: resolution: { - integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==, + integrity: sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==, } - engines: { node: ">=0.10.0" } dev: true - /requires-port@1.0.0: + /debug@4.3.4: resolution: { - integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==, + integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==, } + engines: { node: ">=6.0" } + peerDependencies: + supports-color: "*" + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.2 - /resolve-cwd@3.0.0: + /decimal.js@10.4.3: resolution: { - integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==, + integrity: sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==, } - engines: { node: ">=8" } - dependencies: - resolve-from: 5.0.0 - dev: true - /resolve-from@5.0.0: + /delayed-stream@1.0.0: resolution: { - integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==, + integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==, } - engines: { node: ">=8" } - dev: true + engines: { node: ">=0.4.0" } - /resolve@1.22.8: + /domexception@4.0.0: resolution: { - integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==, + integrity: sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw==, } - hasBin: true + engines: { node: ">=12" } + deprecated: Use your platform's native DOMException instead dependencies: - is-core-module: 2.13.1 - path-parse: 1.0.7 - supports-preserve-symlinks-flag: 1.0.0 - dev: true + webidl-conversions: 7.0.0 - /retry@0.13.1: + /entities@4.5.0: resolution: { - integrity: sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==, + integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==, } - engines: { node: ">= 4" } - dev: true + engines: { node: ">=0.12" } - /rimraf@3.0.2: + /esbuild@0.20.2: resolution: { - integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==, + integrity: sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==, } + engines: { node: ">=12" } hasBin: true - dependencies: - glob: 7.2.3 - dev: true + requiresBuild: true + optionalDependencies: + "@esbuild/aix-ppc64": 0.20.2 + "@esbuild/android-arm": 0.20.2 + "@esbuild/android-arm64": 0.20.2 + "@esbuild/android-x64": 0.20.2 + "@esbuild/darwin-arm64": 0.20.2 + "@esbuild/darwin-x64": 0.20.2 + "@esbuild/freebsd-arm64": 0.20.2 + "@esbuild/freebsd-x64": 0.20.2 + "@esbuild/linux-arm": 0.20.2 + "@esbuild/linux-arm64": 0.20.2 + "@esbuild/linux-ia32": 0.20.2 + "@esbuild/linux-loong64": 0.20.2 + "@esbuild/linux-mips64el": 0.20.2 + "@esbuild/linux-ppc64": 0.20.2 + "@esbuild/linux-riscv64": 0.20.2 + "@esbuild/linux-s390x": 0.20.2 + "@esbuild/linux-x64": 0.20.2 + "@esbuild/netbsd-x64": 0.20.2 + "@esbuild/openbsd-x64": 0.20.2 + "@esbuild/sunos-x64": 0.20.2 + "@esbuild/win32-arm64": 0.20.2 + "@esbuild/win32-ia32": 0.20.2 + "@esbuild/win32-x64": 0.20.2 - /rrweb-cssom@0.6.0: + /estree-walker@2.0.2: resolution: { - integrity: sha512-APM0Gt1KoXBz0iIkkdB/kfvGOwC4UuJFeG/c+yV7wSc7q96cG/kJ0HiYCnzivD9SB53cLV1MlHFNfOuPaadYSw==, + integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==, } - dev: false - /safe-buffer@5.1.2: + /fast-glob@3.3.2: resolution: { - integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==, + integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==, } + engines: { node: ">=8.6.0" } + dependencies: + "@nodelib/fs.stat": 2.0.5 + "@nodelib/fs.walk": 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.5 dev: true - /safe-buffer@5.2.1: + /fastq@1.17.1: resolution: { - integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==, + integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==, } + dependencies: + reusify: 1.0.4 dev: true - /safer-buffer@2.1.2: + /fill-range@7.0.1: resolution: { - integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==, + integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==, } + engines: { node: ">=8" } + dependencies: + to-regex-range: 5.0.1 - /saxes@6.0.0: + /form-data@4.0.0: resolution: { - integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==, + integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==, } - engines: { node: ">=v12.22.7" } + engines: { node: ">= 6" } dependencies: - xmlchars: 2.2.0 - dev: false + asynckit: 0.4.0 + combined-stream: 1.0.8 + mime-types: 2.1.35 - /schema-utils@3.3.0: + /fs-extra@11.2.0: resolution: { - integrity: sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==, + integrity: sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==, } - engines: { node: ">= 10.13.0" } + engines: { node: ">=14.14" } dependencies: - "@types/json-schema": 7.0.15 - ajv: 6.12.6 - ajv-keywords: 3.5.2(ajv@6.12.6) + graceful-fs: 4.2.11 + jsonfile: 6.1.0 + universalify: 2.0.1 dev: true - /schema-utils@4.2.0: + /fsevents@2.3.3: resolution: { - integrity: sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==, + integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==, } - engines: { node: ">= 12.13.0" } - dependencies: - "@types/json-schema": 7.0.15 - ajv: 8.12.0 - ajv-formats: 2.1.1(ajv@8.12.0) - ajv-keywords: 5.1.0(ajv@8.12.0) - dev: true + engines: { node: ^8.16.0 || ^10.6.0 || >=11.0.0 } + os: [darwin] + requiresBuild: true + optional: true - /select-hose@2.0.0: + /glob-parent@5.1.2: resolution: { - integrity: sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==, + integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==, } - dev: true + engines: { node: ">= 6" } + dependencies: + is-glob: 4.0.3 - /selfsigned@2.4.1: + /graceful-fs@4.2.11: resolution: { - integrity: sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==, + integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==, } - engines: { node: ">=10" } - dependencies: - "@types/node-forge": 1.3.11 - node-forge: 1.3.1 dev: true - /semver@7.6.0: + /he@1.2.0: resolution: { - integrity: sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==, + integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==, } - engines: { node: ">=10" } hasBin: true - dependencies: - lru-cache: 6.0.0 dev: true - /send@0.18.0: + /highlight.js@11.9.0: resolution: { - integrity: sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==, + integrity: sha512-fJ7cW7fQGCYAkgv4CPfwFHrfd/cLS4Hau96JuJ+ZTOWhjnhoeN1ub1tFmALm/+lW5z4WCAuAV9bm05AP0mS6Gw==, } - engines: { node: ">= 0.8.0" } - dependencies: - debug: 2.6.9 - depd: 2.0.0 - destroy: 1.2.0 - encodeurl: 1.0.2 - escape-html: 1.0.3 - etag: 1.8.1 - fresh: 0.5.2 - http-errors: 2.0.0 - mime: 1.6.0 - ms: 2.1.3 - on-finished: 2.4.1 - range-parser: 1.2.1 - statuses: 2.0.1 - transitivePeerDependencies: - - supports-color - dev: true + engines: { node: ">=12.0.0" } - /serialize-javascript@6.0.2: + /html-encoding-sniffer@3.0.0: resolution: { - integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==, + integrity: sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==, } + engines: { node: ">=12" } dependencies: - randombytes: 2.1.0 - dev: true + whatwg-encoding: 2.0.0 - /serve-index@1.9.1: + /http-proxy-agent@5.0.0: resolution: { - integrity: sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==, + integrity: sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==, } - engines: { node: ">= 0.8.0" } + engines: { node: ">= 6" } dependencies: - accepts: 1.3.8 - batch: 0.6.1 - debug: 2.6.9 - escape-html: 1.0.3 - http-errors: 1.6.3 - mime-types: 2.1.35 - parseurl: 1.3.3 + "@tootallnate/once": 2.0.0 + agent-base: 6.0.2 + debug: 4.3.4 transitivePeerDependencies: - supports-color - dev: true - /serve-static@1.15.0: + /https-proxy-agent@5.0.1: resolution: { - integrity: sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==, + integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==, } - engines: { node: ">= 0.8.0" } + engines: { node: ">= 6" } dependencies: - encodeurl: 1.0.2 - escape-html: 1.0.3 - parseurl: 1.3.3 - send: 0.18.0 + agent-base: 6.0.2 + debug: 4.3.4 transitivePeerDependencies: - supports-color - dev: true - /set-function-length@1.2.2: + /iconv-lite@0.6.3: resolution: { - integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==, + integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==, } - engines: { node: ">= 0.4" } + engines: { node: ">=0.10.0" } dependencies: - define-data-property: 1.1.4 - es-errors: 1.3.0 - function-bind: 1.1.2 - get-intrinsic: 1.2.4 - gopd: 1.0.1 - has-property-descriptors: 1.0.2 - dev: true + safer-buffer: 2.1.2 - /setprototypeof@1.1.0: + /immutable@4.3.5: resolution: { - integrity: sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==, + integrity: sha512-8eabxkth9gZatlwl5TBuJnCsoTADlL6ftEr7A4qgdaTsPyreilDSnUk57SO+jfKcNtxPa22U5KK6DSeAYhpBJw==, } - dev: true - /setprototypeof@1.2.0: + /is-binary-path@2.1.0: resolution: { - integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==, + integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==, } - dev: true + engines: { node: ">=8" } + dependencies: + binary-extensions: 2.3.0 - /shallow-clone@3.0.1: + /is-extglob@2.1.1: resolution: { - integrity: sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==, + integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==, } - engines: { node: ">=8" } - dependencies: - kind-of: 6.0.3 - dev: true + engines: { node: ">=0.10.0" } - /shebang-command@2.0.0: + /is-glob@4.0.3: resolution: { - integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==, + integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==, } - engines: { node: ">=8" } + engines: { node: ">=0.10.0" } dependencies: - shebang-regex: 3.0.0 - dev: true + is-extglob: 2.1.1 - /shebang-regex@3.0.0: + /is-number@7.0.0: resolution: { - integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==, + integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==, } - engines: { node: ">=8" } - dev: true + engines: { node: ">=0.12.0" } - /shell-quote@1.8.1: + /is-potential-custom-element-name@1.0.1: resolution: { - integrity: sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==, + integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==, } - dev: true - /side-channel@1.0.6: + /jsdom@22.1.0: resolution: { - integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==, + integrity: sha512-/9AVW7xNbsBv6GfWho4TTNjEo9fe6Zhf9O7s0Fhhr3u+awPwAJMKwAMXnkk5vBxflqLW9hTHX/0cs+P3gW+cQw==, } - engines: { node: ">= 0.4" } + engines: { node: ">=16" } + peerDependencies: + canvas: ^2.5.0 + peerDependenciesMeta: + canvas: + optional: true dependencies: - call-bind: 1.0.7 - es-errors: 1.3.0 - get-intrinsic: 1.2.4 - object-inspect: 1.13.1 - dev: true + abab: 2.0.6 + cssstyle: 3.0.0 + data-urls: 4.0.0 + decimal.js: 10.4.3 + domexception: 4.0.0 + form-data: 4.0.0 + html-encoding-sniffer: 3.0.0 + http-proxy-agent: 5.0.0 + https-proxy-agent: 5.0.1 + is-potential-custom-element-name: 1.0.1 + nwsapi: 2.2.7 + parse5: 7.1.2 + rrweb-cssom: 0.6.0 + saxes: 6.0.0 + symbol-tree: 3.2.4 + tough-cookie: 4.1.3 + w3c-xmlserializer: 4.0.0 + webidl-conversions: 7.0.0 + whatwg-encoding: 2.0.0 + whatwg-mimetype: 3.0.0 + whatwg-url: 12.0.1 + ws: 8.16.0 + xml-name-validator: 4.0.0 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate - /signal-exit@3.0.7: + /jsonfile@6.1.0: resolution: { - integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==, + integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==, } + dependencies: + universalify: 2.0.1 + optionalDependencies: + graceful-fs: 4.2.11 dev: true - /sockjs@0.3.24: + /lru-cache@6.0.0: resolution: { - integrity: sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==, + integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==, } + engines: { node: ">=10" } dependencies: - faye-websocket: 0.11.4 - uuid: 8.3.2 - websocket-driver: 0.7.4 + yallist: 4.0.0 dev: true - /source-map-js@1.2.0: + /magic-string@0.30.9: resolution: { - integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==, + integrity: sha512-S1+hd+dIrC8EZqKyT9DstTH/0Z+f76kmmvZnkfQVmOpDEF9iVgdYif3Q/pIWHmCoo59bQVGW0kVL3e2nl+9+Sw==, } - engines: { node: ">=0.10.0" } - dev: true + engines: { node: ">=12" } + dependencies: + "@jridgewell/sourcemap-codec": 1.4.15 - /source-map-loader@4.0.2(webpack@5.91.0): + /merge2@1.4.1: resolution: { - integrity: sha512-oYwAqCuL0OZhBoSgmdrLa7mv9MjommVMiQIWgcztf+eS4+8BfcUee6nenFnDhKOhzAVnk5gpZdfnz1iiBv+5sg==, + integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==, } - engines: { node: ">= 14.15.0" } - peerDependencies: - webpack: ^5.72.1 - dependencies: - iconv-lite: 0.6.3 - source-map-js: 1.2.0 - webpack: 5.91.0(webpack-cli@4.10.0) + engines: { node: ">= 8" } dev: true - /source-map-support@0.5.21: + /micromatch@4.0.5: resolution: { - integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==, + integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==, } + engines: { node: ">=8.6" } dependencies: - buffer-from: 1.1.2 - source-map: 0.6.1 + braces: 3.0.2 + picomatch: 2.3.1 dev: true - /source-map@0.6.1: + /mime-db@1.52.0: resolution: { - integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==, + integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==, } - engines: { node: ">=0.10.0" } - dev: true + engines: { node: ">= 0.6" } - /source-map@0.7.4: + /mime-types@2.1.35: resolution: { - integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==, + integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==, } - engines: { node: ">= 8" } - dev: true + engines: { node: ">= 0.6" } + dependencies: + mime-db: 1.52.0 - /spdy-transport@3.0.0: + /minimatch@9.0.4: resolution: { - integrity: sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==, + integrity: sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==, } + engines: { node: ">=16 || 14 >=14.17" } dependencies: - debug: 4.3.4 - detect-node: 2.1.0 - hpack.js: 2.1.6 - obuf: 1.1.2 - readable-stream: 3.6.2 - wbuf: 1.7.3 - transitivePeerDependencies: - - supports-color + brace-expansion: 2.0.1 dev: true - /spdy@4.0.2: + /ms@2.1.2: resolution: { - integrity: sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==, + integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==, } - engines: { node: ">=6.0.0" } - dependencies: - debug: 4.3.4 - handle-thing: 2.0.1 - http-deceiver: 1.2.7 - select-hose: 2.0.0 - spdy-transport: 3.0.0 - transitivePeerDependencies: - - supports-color - dev: true - /statuses@1.5.0: + /muggle-string@0.4.1: resolution: { - integrity: sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==, + integrity: sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==, } - engines: { node: ">= 0.6" } dev: true - /statuses@2.0.1: + /nanoid@3.3.7: resolution: { - integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==, + integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==, } - engines: { node: ">= 0.8" } - dev: true + engines: { node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1 } + hasBin: true - /string_decoder@1.1.1: + /normalize-path@3.0.0: resolution: { - integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==, + integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==, } - dependencies: - safe-buffer: 5.1.2 - dev: true + engines: { node: ">=0.10.0" } - /string_decoder@1.3.0: + /nwsapi@2.2.7: resolution: { - integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==, + integrity: sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ==, } - dependencies: - safe-buffer: 5.2.1 - dev: true - /strip-ansi@6.0.1: + /parse5@7.1.2: resolution: { - integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==, + integrity: sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==, } - engines: { node: ">=8" } dependencies: - ansi-regex: 5.0.1 - dev: true + entities: 4.5.0 - /strip-final-newline@2.0.0: + /path-browserify@1.0.1: resolution: { - integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==, + integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==, } - engines: { node: ">=6" } dev: true - /style-loader@3.3.4(webpack@5.91.0): + /picocolors@1.0.0: resolution: { - integrity: sha512-0WqXzrsMTyb8yjZJHDqwmnwRJvhALK9LfRtRc6B4UTWe8AijYLZYZ9thuJTZc2VfQWINADW/j+LiJnfy2RoC1w==, + integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==, } - engines: { node: ">= 12.13.0" } - peerDependencies: - webpack: ^5.0.0 - dependencies: - webpack: 5.91.0(webpack-cli@4.10.0) - dev: true - /supports-color@7.2.0: + /picomatch@2.3.1: resolution: { - integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==, + integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==, } - engines: { node: ">=8" } - dependencies: - has-flag: 4.0.0 - dev: true + engines: { node: ">=8.6" } - /supports-color@8.1.1: + /postcss@8.4.38: resolution: { - integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==, + integrity: sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==, } - engines: { node: ">=10" } + engines: { node: ^10 || ^12 || >=14 } dependencies: - has-flag: 4.0.0 - dev: true + nanoid: 3.3.7 + picocolors: 1.0.0 + source-map-js: 1.2.0 - /supports-preserve-symlinks-flag@1.0.0: + /prettier@3.2.5: resolution: { - integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==, + integrity: sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==, } - engines: { node: ">= 0.4" } + engines: { node: ">=14" } + hasBin: true dev: true - /symbol-tree@3.2.4: + /psl@1.9.0: resolution: { - integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==, + integrity: sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==, } - dev: false - /tapable@2.2.1: + /punycode@2.3.1: resolution: { - integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==, + integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==, } engines: { node: ">=6" } - dev: true - /terser-webpack-plugin@5.3.10(webpack@5.91.0): + /querystringify@2.2.0: resolution: { - integrity: sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==, + integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==, } - engines: { node: ">= 10.13.0" } - peerDependencies: - "@swc/core": "*" - esbuild: "*" - uglify-js: "*" - webpack: ^5.1.0 - peerDependenciesMeta: - "@swc/core": - optional: true - esbuild: - optional: true - uglify-js: - optional: true - dependencies: - "@jridgewell/trace-mapping": 0.3.25 - jest-worker: 27.5.1 - schema-utils: 3.3.0 - serialize-javascript: 6.0.2 - terser: 5.30.3 - webpack: 5.91.0(webpack-cli@4.10.0) - dev: true - /terser@5.30.3: + /queue-microtask@1.2.3: resolution: { - integrity: sha512-STdUgOUx8rLbMGO9IOwHLpCqolkDITFFQSMYYwKE1N2lY6MVSaeoi10z/EhWxRc6ybqoVmKSkhKYH/XUpl7vSA==, + integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==, } - engines: { node: ">=10" } - hasBin: true - dependencies: - "@jridgewell/source-map": 0.3.6 - acorn: 8.11.3 - commander: 2.20.3 - source-map-support: 0.5.21 dev: true - /thunky@1.1.0: + /readdirp@3.6.0: resolution: { - integrity: sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==, + integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==, } - dev: true + engines: { node: ">=8.10.0" } + dependencies: + picomatch: 2.3.1 - /to-regex-range@5.0.1: + /requires-port@1.0.0: resolution: { - integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==, + integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==, } - engines: { node: ">=8.0" } - dependencies: - is-number: 7.0.0 - dev: true - /toidentifier@1.0.1: + /reusify@1.0.4: resolution: { - integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==, + integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==, } - engines: { node: ">=0.6" } + engines: { iojs: ">=1.0.0", node: ">=0.10.0" } dev: true - /tough-cookie@4.1.3: + /rollup@4.14.3: resolution: { - integrity: sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==, + integrity: sha512-ag5tTQKYsj1bhrFC9+OEWqb5O6VYgtQDO9hPDBMmIbePwhfSr+ExlcU741t8Dhw5DkPCQf6noz0jb36D6W9/hw==, } - engines: { node: ">=6" } + engines: { node: ">=18.0.0", npm: ">=8.0.0" } + hasBin: true dependencies: - psl: 1.9.0 - punycode: 2.3.1 - universalify: 0.2.0 - url-parse: 1.5.10 - dev: false + "@types/estree": 1.0.5 + optionalDependencies: + "@rollup/rollup-android-arm-eabi": 4.14.3 + "@rollup/rollup-android-arm64": 4.14.3 + "@rollup/rollup-darwin-arm64": 4.14.3 + "@rollup/rollup-darwin-x64": 4.14.3 + "@rollup/rollup-linux-arm-gnueabihf": 4.14.3 + "@rollup/rollup-linux-arm-musleabihf": 4.14.3 + "@rollup/rollup-linux-arm64-gnu": 4.14.3 + "@rollup/rollup-linux-arm64-musl": 4.14.3 + "@rollup/rollup-linux-powerpc64le-gnu": 4.14.3 + "@rollup/rollup-linux-riscv64-gnu": 4.14.3 + "@rollup/rollup-linux-s390x-gnu": 4.14.3 + "@rollup/rollup-linux-x64-gnu": 4.14.3 + "@rollup/rollup-linux-x64-musl": 4.14.3 + "@rollup/rollup-win32-arm64-msvc": 4.14.3 + "@rollup/rollup-win32-ia32-msvc": 4.14.3 + "@rollup/rollup-win32-x64-msvc": 4.14.3 + fsevents: 2.3.3 - /tr46@4.1.1: + /rrweb-cssom@0.6.0: resolution: { - integrity: sha512-2lv/66T7e5yNyhAAC4NaKe5nVavzuGJQVVtRYLyQ2OI8tsJ61PMLlelehb0wi2Hx6+hT/OJUWZcw8MjlSRnxvw==, + integrity: sha512-APM0Gt1KoXBz0iIkkdB/kfvGOwC4UuJFeG/c+yV7wSc7q96cG/kJ0HiYCnzivD9SB53cLV1MlHFNfOuPaadYSw==, } - engines: { node: ">=14" } - dependencies: - punycode: 2.3.1 - dev: false - /ts-loader@9.5.1(typescript@5.4.4)(webpack@5.91.0): + /run-parallel@1.2.0: resolution: { - integrity: sha512-rNH3sK9kGZcH9dYzC7CewQm4NtxJTjSEVRJ2DyBZR7f8/wcta+iV44UPCXc5+nzDzivKtlzV6c9P4e+oFhDLYg==, + integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==, } - engines: { node: ">=12.0.0" } - peerDependencies: - typescript: "*" - webpack: ^5.0.0 dependencies: - chalk: 4.1.2 - enhanced-resolve: 5.16.0 - micromatch: 4.0.5 - semver: 7.6.0 - source-map: 0.7.4 - typescript: 5.4.4 - webpack: 5.91.0(webpack-cli@4.10.0) + queue-microtask: 1.2.3 dev: true - /tslib@2.6.2: + /safer-buffer@2.1.2: resolution: { - integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==, + integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==, } - dev: true - /type-is@1.6.18: + /sass@1.75.0: resolution: { - integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==, + integrity: sha512-ShMYi3WkrDWxExyxSZPst4/okE9ts46xZmJDSawJQrnte7M1V9fScVB+uNXOVKRBt0PggHOwoZcn8mYX4trnBw==, } - engines: { node: ">= 0.6" } + engines: { node: ">=14.0.0" } + hasBin: true dependencies: - media-typer: 0.3.0 - mime-types: 2.1.35 - dev: true + chokidar: 3.6.0 + immutable: 4.3.5 + source-map-js: 1.2.0 - /typescript@5.4.4: + /saxes@6.0.0: resolution: { - integrity: sha512-dGE2Vv8cpVvw28v8HCPqyb08EzbBURxDpuhJvTrusShUfGnhHBafDsLdS1EhhxyL6BJQE+2cT3dDPAv+MQ6oLw==, + integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==, } - engines: { node: ">=14.17" } - hasBin: true - dev: true + engines: { node: ">=v12.22.7" } + dependencies: + xmlchars: 2.2.0 - /undici-types@5.26.5: + /semver@7.6.0: resolution: { - integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==, + integrity: sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==, } + engines: { node: ">=10" } + hasBin: true + dependencies: + lru-cache: 6.0.0 dev: true - /universalify@0.2.0: + /source-map-js@1.2.0: resolution: { - integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==, + integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==, } - engines: { node: ">= 4.0.0" } - dev: false + engines: { node: ">=0.10.0" } - /unpipe@1.0.0: + /symbol-tree@3.2.4: resolution: { - integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==, + integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==, } - engines: { node: ">= 0.8" } - dev: true - /update-browserslist-db@1.0.13(browserslist@4.23.0): + /to-fast-properties@2.0.0: resolution: { - integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==, + integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==, } - hasBin: true - peerDependencies: - browserslist: ">= 4.21.0" - dependencies: - browserslist: 4.23.0 - escalade: 3.1.2 - picocolors: 1.0.0 - dev: true + engines: { node: ">=4" } - /uri-js@4.4.1: + /to-regex-range@5.0.1: resolution: { - integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==, + integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==, } + engines: { node: ">=8.0" } dependencies: - punycode: 2.3.1 - dev: true + is-number: 7.0.0 - /url-parse@1.5.10: + /tough-cookie@4.1.3: resolution: { - integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==, + integrity: sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==, } + engines: { node: ">=6" } dependencies: - querystringify: 2.2.0 - requires-port: 1.0.0 - dev: false + psl: 1.9.0 + punycode: 2.3.1 + universalify: 0.2.0 + url-parse: 1.5.10 - /util-deprecate@1.0.2: + /tr46@4.1.1: resolution: { - integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==, + integrity: sha512-2lv/66T7e5yNyhAAC4NaKe5nVavzuGJQVVtRYLyQ2OI8tsJ61PMLlelehb0wi2Hx6+hT/OJUWZcw8MjlSRnxvw==, } - dev: true + engines: { node: ">=14" } + dependencies: + punycode: 2.3.1 - /utila@0.4.0: + /typescript@5.4.4: resolution: { - integrity: sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==, + integrity: sha512-dGE2Vv8cpVvw28v8HCPqyb08EzbBURxDpuhJvTrusShUfGnhHBafDsLdS1EhhxyL6BJQE+2cT3dDPAv+MQ6oLw==, } - dev: true + engines: { node: ">=14.17" } + hasBin: true - /utils-merge@1.0.1: + /universalify@0.2.0: resolution: { - integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==, + integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==, } - engines: { node: ">= 0.4.0" } - dev: true + engines: { node: ">= 4.0.0" } - /uuid@8.3.2: + /universalify@2.0.1: resolution: { - integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==, + integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==, } - hasBin: true + engines: { node: ">= 10.0.0" } dev: true - /vary@1.1.2: + /upath@2.0.1: resolution: { - integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==, + integrity: sha512-1uEe95xksV1O0CYKXo8vQvN1JEbtJp7lb7C5U9HMsIp6IVwntkH/oNUzyVNQSd4S1sYk2FpSSW44FqMc8qee5w==, } - engines: { node: ">= 0.8" } - dev: true + engines: { node: ">=4" } - /w3c-xmlserializer@4.0.0: + /url-parse@1.5.10: resolution: { - integrity: sha512-d+BFHzbiCx6zGfz0HyQ6Rg69w9k19nviJspaj4yNscGjrHu94sVP+aRm75yEbCh+r2/yR+7q6hux9LVtbuTGBw==, + integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==, } - engines: { node: ">=14" } dependencies: - xml-name-validator: 4.0.0 - dev: false + querystringify: 2.2.0 + requires-port: 1.0.0 - /watchpack@2.4.1: + /vite-plugin-static-copy@1.0.2(vite@5.2.9): resolution: { - integrity: sha512-8wrBCMtVhqcXP2Sup1ctSkga6uc2Bx0IIvKyT7yTFier5AXHooSI+QyQQAtTb7+E0IUCCKyTFmXqdqgum2XWGg==, + integrity: sha512-AfmEF+a/mfjsUsrgjbCkhzUCeIUF4EKQXXt3Ie1cour9MBpy6f6GphbdW2td28oYfOrwCyRzFCksgLkpk58q6Q==, } - engines: { node: ">=10.13.0" } + engines: { node: ^18.0.0 || >=20.0.0 } + peerDependencies: + vite: ^5.0.0 dependencies: - glob-to-regexp: 0.4.1 - graceful-fs: 4.2.11 + chokidar: 3.6.0 + fast-glob: 3.3.2 + fs-extra: 11.2.0 + picocolors: 1.0.0 + vite: 5.2.9(sass@1.75.0) dev: true - /wbuf@1.7.3: + /vite-plugin-vuetify@2.0.3(vite@5.2.9)(vue@3.4.22)(vuetify@3.5.15): resolution: { - integrity: sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==, + integrity: sha512-HbYajgGgb/noaVKNRhnnXIiQZrNXfNIeanUGAwXgOxL6h/KULS40Uf51Kyz8hNmdegF+DwjgXXI/8J1PNS83xw==, } + engines: { node: ^18.0.0 || >=20.0.0 } + peerDependencies: + vite: ">=5" + vue: ^3.0.0 + vuetify: ^3.0.0 dependencies: - minimalistic-assert: 1.0.1 - dev: true - - /webidl-conversions@7.0.0: - resolution: - { - integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==, - } - engines: { node: ">=12" } - dev: false + "@vuetify/loader-shared": 2.0.3(vue@3.4.22)(vuetify@3.5.15) + debug: 4.3.4 + upath: 2.0.1 + vite: 5.2.9(sass@1.75.0) + vue: 3.4.22(typescript@5.4.4) + vuetify: 3.5.15(typescript@5.4.4)(vite-plugin-vuetify@2.0.3)(vue@3.4.22) + transitivePeerDependencies: + - supports-color - /webpack-cli@4.10.0(webpack-dev-server@4.15.2)(webpack@5.91.0): + /vite@5.2.9(sass@1.75.0): resolution: { - integrity: sha512-NLhDfH/h4O6UOy+0LSso42xvYypClINuMNBVVzX4vX98TmTaTUxwRbXdhucbFMd2qLaCTcLq/PdYrvi8onw90w==, + integrity: sha512-uOQWfuZBlc6Y3W/DTuQ1Sr+oIXWvqljLvS881SVmAj00d5RdgShLcuXWxseWPd4HXwiYBFW/vXHfKFeqj9uQnw==, } - engines: { node: ">=10.13.0" } + engines: { node: ^18.0.0 || >=20.0.0 } hasBin: true peerDependencies: - "@webpack-cli/generators": "*" - "@webpack-cli/migrate": "*" - webpack: 4.x.x || 5.x.x - webpack-bundle-analyzer: "*" - webpack-dev-server: "*" + "@types/node": ^18.0.0 || >=20.0.0 + less: "*" + lightningcss: ^1.21.0 + sass: "*" + stylus: "*" + sugarss: "*" + terser: ^5.4.0 peerDependenciesMeta: - "@webpack-cli/generators": + "@types/node": + optional: true + less: + optional: true + lightningcss: optional: true - "@webpack-cli/migrate": + sass: optional: true - webpack-bundle-analyzer: + stylus: optional: true - webpack-dev-server: + sugarss: + optional: true + terser: optional: true dependencies: - "@discoveryjs/json-ext": 0.5.7 - "@webpack-cli/configtest": 1.2.0(webpack-cli@4.10.0)(webpack@5.91.0) - "@webpack-cli/info": 1.5.0(webpack-cli@4.10.0) - "@webpack-cli/serve": 1.7.0(webpack-cli@4.10.0)(webpack-dev-server@4.15.2) - colorette: 2.0.20 - commander: 7.2.0 - cross-spawn: 7.0.3 - fastest-levenshtein: 1.0.16 - import-local: 3.1.0 - interpret: 2.2.0 - rechoir: 0.7.1 - webpack: 5.91.0(webpack-cli@4.10.0) - webpack-dev-server: 4.15.2(webpack-cli@4.10.0)(webpack@5.91.0) - webpack-merge: 5.10.0 - dev: true + esbuild: 0.20.2 + postcss: 8.4.38 + rollup: 4.14.3 + sass: 1.75.0 + optionalDependencies: + fsevents: 2.3.3 - /webpack-dev-middleware@5.3.4(webpack@5.91.0): + /vue-template-compiler@2.7.16: resolution: { - integrity: sha512-BVdTqhhs+0IfoeAf7EoH5WE+exCmqGerHfDM0IL096Px60Tq2Mn9MAbnaGUe6HiMa41KMCYF19gyzZmBcq/o4Q==, + integrity: sha512-AYbUWAJHLGGQM7+cNTELw+KsOG9nl2CnSv467WobS5Cv9uk3wFcnr1Etsz2sEIHEZvw1U+o9mRlEO6QbZvUPGQ==, } - engines: { node: ">= 12.13.0" } - peerDependencies: - webpack: ^4.0.0 || ^5.0.0 dependencies: - colorette: 2.0.20 - memfs: 3.5.3 - mime-types: 2.1.35 - range-parser: 1.2.1 - schema-utils: 4.2.0 - webpack: 5.91.0(webpack-cli@4.10.0) + de-indent: 1.0.2 + he: 1.2.0 dev: true - /webpack-dev-server@4.15.2(webpack-cli@4.10.0)(webpack@5.91.0): + /vue-tsc@2.0.13(typescript@5.4.4): resolution: { - integrity: sha512-0XavAZbNJ5sDrCbkpWL8mia0o5WPOd2YGtxrEiZkBK9FjLppIUK2TgxK6qGD2P3hUXTJNNPVibrerKcx5WkR1g==, + integrity: sha512-a3nL3FvguCWVJUQW/jFrUxdeUtiEkbZoQjidqvMeBK//tuE2w6NWQAbdrEpY2+6nSa4kZoKZp8TZUMtHpjt4mQ==, } - engines: { node: ">= 12.13.0" } hasBin: true peerDependencies: - webpack: ^4.37.0 || ^5.0.0 - webpack-cli: "*" - peerDependenciesMeta: - webpack: - optional: true - webpack-cli: - optional: true + typescript: "*" dependencies: - "@types/bonjour": 3.5.13 - "@types/connect-history-api-fallback": 1.5.4 - "@types/express": 4.17.21 - "@types/serve-index": 1.9.4 - "@types/serve-static": 1.15.7 - "@types/sockjs": 0.3.36 - "@types/ws": 8.5.10 - ansi-html-community: 0.0.8 - bonjour-service: 1.2.1 - chokidar: 3.6.0 - colorette: 2.0.20 - compression: 1.7.4 - connect-history-api-fallback: 2.0.0 - default-gateway: 6.0.3 - express: 4.19.2 - graceful-fs: 4.2.11 - html-entities: 2.5.2 - http-proxy-middleware: 2.0.6(@types/express@4.17.21) - ipaddr.js: 2.1.0 - launch-editor: 2.6.1 - open: 8.4.2 - p-retry: 4.6.2 - rimraf: 3.0.2 - schema-utils: 4.2.0 - selfsigned: 2.4.1 - serve-index: 1.9.1 - sockjs: 0.3.24 - spdy: 4.0.2 - webpack: 5.91.0(webpack-cli@4.10.0) - webpack-cli: 4.10.0(webpack-dev-server@4.15.2)(webpack@5.91.0) - webpack-dev-middleware: 5.3.4(webpack@5.91.0) - ws: 8.16.0 - transitivePeerDependencies: - - bufferutil - - debug - - supports-color - - utf-8-validate + "@volar/typescript": 2.2.0-alpha.8 + "@vue/language-core": 2.0.13(typescript@5.4.4) + semver: 7.6.0 + typescript: 5.4.4 dev: true - /webpack-merge@5.10.0: + /vue@3.4.22(typescript@5.4.4): resolution: { - integrity: sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==, + integrity: sha512-CIx7NiP+n5WHBCG/fDNaUPP4qbQ5CIa8XIHZE3HpfS/rb2vmSIsp74BxsZyrrGKF0vHW3GoToqP3l0hzrMTecw==, } - engines: { node: ">=10.0.0" } + peerDependencies: + typescript: "*" + peerDependenciesMeta: + typescript: + optional: true dependencies: - clone-deep: 4.0.1 - flat: 5.0.2 - wildcard: 2.0.1 - dev: true - - /webpack-sources@3.2.3: - resolution: - { - integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==, - } - engines: { node: ">=10.13.0" } - dev: true + "@vue/compiler-dom": 3.4.22 + "@vue/compiler-sfc": 3.4.22 + "@vue/runtime-dom": 3.4.22 + "@vue/server-renderer": 3.4.22(vue@3.4.22) + "@vue/shared": 3.4.22 + typescript: 5.4.4 - /webpack@5.91.0(webpack-cli@4.10.0): + /vuetify@3.5.15(typescript@5.4.4)(vite-plugin-vuetify@2.0.3)(vue@3.4.22): resolution: { - integrity: sha512-rzVwlLeBWHJbmgTC/8TvAcu5vpJNII+MelQpylD4jNERPwpBJOE2lEcko1zJX3QJeLjTTAnQxn/OJ8bjDzVQaw==, + integrity: sha512-4v+t3yjgZ5M4+YKRK2eOxymWU34/Sg8YP6Dqi4ZMYFjchiwijOns1WW4ywYlYXih0TSPVeAeQpCzztDu89nTyg==, } - engines: { node: ">=10.13.0" } - hasBin: true + engines: { node: ^12.20 || >=14.13 } peerDependencies: - webpack-cli: "*" + typescript: ">=4.7" + vite-plugin-vuetify: ">=1.0.0" + vue: ^3.3.0 + vue-i18n: ^9.0.0 + webpack-plugin-vuetify: ">=2.0.0" peerDependenciesMeta: - webpack-cli: + typescript: + optional: true + vite-plugin-vuetify: + optional: true + vue-i18n: + optional: true + webpack-plugin-vuetify: optional: true dependencies: - "@types/eslint-scope": 3.7.7 - "@types/estree": 1.0.5 - "@webassemblyjs/ast": 1.12.1 - "@webassemblyjs/wasm-edit": 1.12.1 - "@webassemblyjs/wasm-parser": 1.12.1 - acorn: 8.11.3 - acorn-import-assertions: 1.9.0(acorn@8.11.3) - browserslist: 4.23.0 - chrome-trace-event: 1.0.3 - enhanced-resolve: 5.16.0 - es-module-lexer: 1.5.0 - eslint-scope: 5.1.1 - events: 3.3.0 - glob-to-regexp: 0.4.1 - graceful-fs: 4.2.11 - json-parse-even-better-errors: 2.3.1 - loader-runner: 4.3.0 - mime-types: 2.1.35 - neo-async: 2.6.2 - schema-utils: 3.3.0 - tapable: 2.2.1 - terser-webpack-plugin: 5.3.10(webpack@5.91.0) - watchpack: 2.4.1 - webpack-cli: 4.10.0(webpack-dev-server@4.15.2)(webpack@5.91.0) - webpack-sources: 3.2.3 - transitivePeerDependencies: - - "@swc/core" - - esbuild - - uglify-js - dev: true + typescript: 5.4.4 + vite-plugin-vuetify: 2.0.3(vite@5.2.9)(vue@3.4.22)(vuetify@3.5.15) + vue: 3.4.22(typescript@5.4.4) - /websocket-driver@0.7.4: + /w3c-xmlserializer@4.0.0: resolution: { - integrity: sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==, + integrity: sha512-d+BFHzbiCx6zGfz0HyQ6Rg69w9k19nviJspaj4yNscGjrHu94sVP+aRm75yEbCh+r2/yR+7q6hux9LVtbuTGBw==, } - engines: { node: ">=0.8.0" } + engines: { node: ">=14" } dependencies: - http-parser-js: 0.5.8 - safe-buffer: 5.2.1 - websocket-extensions: 0.1.4 - dev: true + xml-name-validator: 4.0.0 - /websocket-extensions@0.1.4: + /webidl-conversions@7.0.0: resolution: { - integrity: sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==, + integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==, } - engines: { node: ">=0.8.0" } - dev: true + engines: { node: ">=12" } /whatwg-encoding@2.0.0: resolution: @@ -4014,7 +1748,6 @@ packages: engines: { node: ">=12" } dependencies: iconv-lite: 0.6.3 - dev: false /whatwg-mimetype@3.0.0: resolution: @@ -4022,7 +1755,6 @@ packages: integrity: sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==, } engines: { node: ">=12" } - dev: false /whatwg-url@12.0.1: resolution: @@ -4033,32 +1765,6 @@ packages: dependencies: tr46: 4.1.1 webidl-conversions: 7.0.0 - dev: false - - /which@2.0.2: - resolution: - { - integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==, - } - engines: { node: ">= 8" } - hasBin: true - dependencies: - isexe: 2.0.0 - dev: true - - /wildcard@2.0.1: - resolution: - { - integrity: sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==, - } - dev: true - - /wrappy@1.0.2: - resolution: - { - integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==, - } - dev: true /ws@8.16.0: resolution: @@ -4081,14 +1787,12 @@ packages: integrity: sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==, } engines: { node: ">=12" } - dev: false /xmlchars@2.2.0: resolution: { integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==, } - dev: false /yallist@4.0.0: resolution: From 47c0cf5872c452f378b8b615cf730c4ff5b2d04f Mon Sep 17 00:00:00 2001 From: mobyw Date: Sat, 6 Jul 2024 22:48:31 +0800 Subject: [PATCH 02/19] :arrow_up: Update blockly and others versions --- package.json | 4 +- packages/app/index.html | 3 +- packages/app/package.json | 20 +- packages/app/src/blocks/nonebot_handle.js | 2 +- packages/app/src/blocks/nonebot_logger.js | 2 +- packages/app/src/blocks/nonebot_matcher.js | 2 +- packages/app/src/blocks/nonebot_message.js | 2 +- packages/app/src/blocks/python_dict.js | 2 +- packages/app/src/components/BlocklyPage.vue | 2 +- pnpm-lock.yaml | 1765 +++++++++++-------- 10 files changed, 1013 insertions(+), 791 deletions(-) diff --git a/package.json b/package.json index 498eb2f..585fb3e 100644 --- a/package.json +++ b/package.json @@ -11,8 +11,8 @@ "engines": { "node": ">=18.0.0" }, - "packageManager": "pnpm@8.15.0+", + "packageManager": "pnpm@9.4.0", "devDependencies": { - "prettier": "^3.2.5" + "prettier": "^3.3.2" } } diff --git a/packages/app/index.html b/packages/app/index.html index 08d4f4a..769d452 100644 --- a/packages/app/index.html +++ b/packages/app/index.html @@ -2,7 +2,6 @@ - NoneBlockly for NoneBot2 @@ -10,7 +9,7 @@
- + diff --git a/packages/app/package.json b/packages/app/package.json index 15af09e..41da720 100644 --- a/packages/app/package.json +++ b/packages/app/package.json @@ -15,21 +15,21 @@ "author": "", "license": "MIT", "devDependencies": { - "@blockly/theme-dark": "^6.0.6", + "@blockly/theme-dark": "^7.0.1", "@highlightjs/vue-plugin": "^2.1.0", "@mdi/js": "^7.4.47", - "@vitejs/plugin-vue": "^5.0.4", - "typescript": "^5.4.4", - "vite": "^5.2.9", - "vite-plugin-static-copy": "^1.0.2", + "@vitejs/plugin-vue": "^5.0.5", + "typescript": "^5.5.2", + "vite": "^5.3.1", + "vite-plugin-static-copy": "^1.0.5", "vite-plugin-vuetify": "^2.0.3", - "vue-tsc": "^2.0.13" + "vue-tsc": "^2.0.21" }, "dependencies": { - "blockly": "^10.4.3", + "blockly": "^11.1.1", "highlight.js": "^11.9.0", - "sass": "^1.75.0", - "vue": "^3.4.22", - "vuetify": "^3.5.15" + "sass": "^1.77.6", + "vue": "^3.4.29", + "vuetify": "^3.6.10" } } diff --git a/packages/app/src/blocks/nonebot_handle.js b/packages/app/src/blocks/nonebot_handle.js index 24c7201..c468934 100644 --- a/packages/app/src/blocks/nonebot_handle.js +++ b/packages/app/src/blocks/nonebot_handle.js @@ -1,4 +1,4 @@ -import Blockly from "blockly/core"; +import * as Blockly from "blockly/core"; import { pythonGenerator, Order } from "blockly/python"; Blockly.defineBlocksWithJsonArray([ diff --git a/packages/app/src/blocks/nonebot_logger.js b/packages/app/src/blocks/nonebot_logger.js index e53debc..0875cf6 100644 --- a/packages/app/src/blocks/nonebot_logger.js +++ b/packages/app/src/blocks/nonebot_logger.js @@ -1,4 +1,4 @@ -import Blockly from "blockly/core"; +import * as Blockly from "blockly/core"; import { pythonGenerator, Order } from "blockly/python"; Blockly.defineBlocksWithJsonArray([]); diff --git a/packages/app/src/blocks/nonebot_matcher.js b/packages/app/src/blocks/nonebot_matcher.js index 69bce57..084d435 100644 --- a/packages/app/src/blocks/nonebot_matcher.js +++ b/packages/app/src/blocks/nonebot_matcher.js @@ -1,4 +1,4 @@ -import Blockly from "blockly/core"; +import * as Blockly from "blockly/core"; import { pythonGenerator, Order } from "blockly/python"; Blockly.defineBlocksWithJsonArray([ diff --git a/packages/app/src/blocks/nonebot_message.js b/packages/app/src/blocks/nonebot_message.js index 5816400..fbc5db1 100644 --- a/packages/app/src/blocks/nonebot_message.js +++ b/packages/app/src/blocks/nonebot_message.js @@ -1,4 +1,4 @@ -import Blockly from "blockly/core"; +import * as Blockly from "blockly/core"; import { pythonGenerator, Order } from "blockly/python"; Blockly.defineBlocksWithJsonArray([ diff --git a/packages/app/src/blocks/python_dict.js b/packages/app/src/blocks/python_dict.js index 3fec423..85f9031 100644 --- a/packages/app/src/blocks/python_dict.js +++ b/packages/app/src/blocks/python_dict.js @@ -1,4 +1,4 @@ -import Blockly from "blockly/core"; +import * as Blockly from "blockly/core"; import { Order, pythonGenerator } from "blockly/python"; Blockly.defineBlocksWithJsonArray([ diff --git a/packages/app/src/components/BlocklyPage.vue b/packages/app/src/components/BlocklyPage.vue index 18b9712..da60217 100644 --- a/packages/app/src/components/BlocklyPage.vue +++ b/packages/app/src/components/BlocklyPage.vue @@ -11,7 +11,7 @@ */ import { onMounted, ref, shallowRef } from "vue"; -import Blockly from "blockly"; +import * as Blockly from "blockly/core"; const props = defineProps(["options"]); const blocklyToolbox = ref(); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 2ec0fcd..f2a39d5 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1,4 +1,4 @@ -lockfileVersion: "6.0" +lockfileVersion: "9.0" settings: autoInstallPeers: true @@ -8,357 +8,302 @@ importers: .: devDependencies: prettier: - specifier: ^3.2.5 - version: 3.2.5 + specifier: ^3.3.2 + version: 3.3.2 packages/app: dependencies: blockly: - specifier: ^10.4.3 - version: 10.4.3 + specifier: ^11.1.1 + version: 11.1.1 highlight.js: specifier: ^11.9.0 version: 11.9.0 sass: - specifier: ^1.75.0 - version: 1.75.0 + specifier: ^1.77.6 + version: 1.77.6 vue: - specifier: ^3.4.22 - version: 3.4.22(typescript@5.4.4) + specifier: ^3.4.29 + version: 3.4.29(typescript@5.5.2) vuetify: - specifier: ^3.5.15 - version: 3.5.15(typescript@5.4.4)(vite-plugin-vuetify@2.0.3)(vue@3.4.22) + specifier: ^3.6.10 + version: 3.6.10(typescript@5.5.2)(vite-plugin-vuetify@2.0.3)(vue@3.4.29(typescript@5.5.2)) devDependencies: "@blockly/theme-dark": - specifier: ^6.0.6 - version: 6.0.6(blockly@10.4.3) + specifier: ^7.0.1 + version: 7.0.1(blockly@11.1.1) "@highlightjs/vue-plugin": specifier: ^2.1.0 - version: 2.1.0(highlight.js@11.9.0)(vue@3.4.22) + version: 2.1.0(highlight.js@11.9.0)(vue@3.4.29(typescript@5.5.2)) "@mdi/js": specifier: ^7.4.47 version: 7.4.47 "@vitejs/plugin-vue": - specifier: ^5.0.4 - version: 5.0.4(vite@5.2.9)(vue@3.4.22) + specifier: ^5.0.5 + version: 5.0.5(vite@5.3.1(sass@1.77.6))(vue@3.4.29(typescript@5.5.2)) typescript: - specifier: ^5.4.4 - version: 5.4.4 + specifier: ^5.5.2 + version: 5.5.2 vite: - specifier: ^5.2.9 - version: 5.2.9(sass@1.75.0) + specifier: ^5.3.1 + version: 5.3.1(sass@1.77.6) vite-plugin-static-copy: - specifier: ^1.0.2 - version: 1.0.2(vite@5.2.9) + specifier: ^1.0.5 + version: 1.0.5(vite@5.3.1(sass@1.77.6)) vite-plugin-vuetify: specifier: ^2.0.3 - version: 2.0.3(vite@5.2.9)(vue@3.4.22)(vuetify@3.5.15) + version: 2.0.3(vite@5.3.1(sass@1.77.6))(vue@3.4.29(typescript@5.5.2))(vuetify@3.6.10) vue-tsc: - specifier: ^2.0.13 - version: 2.0.13(typescript@5.4.4) + specifier: ^2.0.21 + version: 2.0.21(typescript@5.5.2) packages: - /@babel/helper-string-parser@7.24.1: + "@babel/helper-string-parser@7.24.7": resolution: { - integrity: sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ==, + integrity: sha512-7MbVt6xrwFQbunH2DNQsAP5sTGxfqQtErvBIvIMi6EQnbgUOuVYanvREcmFrOPhoXBrTtjhhP+lW+o5UfK+tDg==, } engines: { node: ">=6.9.0" } - /@babel/helper-validator-identifier@7.22.20: + "@babel/helper-validator-identifier@7.24.7": resolution: { - integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==, + integrity: sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==, } engines: { node: ">=6.9.0" } - /@babel/parser@7.24.4: + "@babel/parser@7.24.7": resolution: { - integrity: sha512-zTvEBcghmeBma9QIGunWevvBAp4/Qu9Bdq+2k0Ot4fVMD6v3dsC9WOcRSKk7tRRyBM/53yKMJko9xOatGQAwSg==, + integrity: sha512-9uUYRm6OqQrCqQdG1iCBwBPZgN8ciDBro2nIOFaiRz1/BCxaI7CNvQbDHvsArAC7Tw9Hda/B3U+6ui9u4HWXPw==, } engines: { node: ">=6.0.0" } hasBin: true - dependencies: - "@babel/types": 7.24.0 - /@babel/types@7.24.0: + "@babel/types@7.24.7": resolution: { - integrity: sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==, + integrity: sha512-XEFXSlxiG5td2EJRe8vOmRbaXVgfcBlszKujvVmWIK/UpywWljQCfzAv3RQCGujWQ1RD4YYWEAqDXfuJiy8f5Q==, } engines: { node: ">=6.9.0" } - dependencies: - "@babel/helper-string-parser": 7.24.1 - "@babel/helper-validator-identifier": 7.22.20 - to-fast-properties: 2.0.0 - /@blockly/theme-dark@6.0.6(blockly@10.4.3): + "@blockly/theme-dark@7.0.1": resolution: { - integrity: sha512-gpMGBve22WuE9ShLJIuZWSixYAHqf+OQfG9lfcNWOaxSEtd9aF6rdNvjEG1Z6VC9enwtoJmIBsUUYmxGjPlIlw==, + integrity: sha512-yJZmdV/8ZZQ/NvL1QncTwuxDay/XwyCPr8qYHpfqYii2zOBCtSTxpK5KaF/RHHVwBti0j2c8qEp/AdJ1J3nuSg==, } engines: { node: ">=8.17.0" } peerDependencies: - blockly: ^10.0.0 - dependencies: - blockly: 10.4.3 - dev: true + blockly: ^11.0.0 - /@esbuild/aix-ppc64@0.20.2: + "@esbuild/aix-ppc64@0.21.5": resolution: { - integrity: sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==, + integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==, } engines: { node: ">=12" } cpu: [ppc64] os: [aix] - requiresBuild: true - optional: true - /@esbuild/android-arm64@0.20.2: + "@esbuild/android-arm64@0.21.5": resolution: { - integrity: sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==, + integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==, } engines: { node: ">=12" } cpu: [arm64] os: [android] - requiresBuild: true - optional: true - /@esbuild/android-arm@0.20.2: + "@esbuild/android-arm@0.21.5": resolution: { - integrity: sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==, + integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==, } engines: { node: ">=12" } cpu: [arm] os: [android] - requiresBuild: true - optional: true - /@esbuild/android-x64@0.20.2: + "@esbuild/android-x64@0.21.5": resolution: { - integrity: sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==, + integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==, } engines: { node: ">=12" } cpu: [x64] os: [android] - requiresBuild: true - optional: true - /@esbuild/darwin-arm64@0.20.2: + "@esbuild/darwin-arm64@0.21.5": resolution: { - integrity: sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==, + integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==, } engines: { node: ">=12" } cpu: [arm64] os: [darwin] - requiresBuild: true - optional: true - /@esbuild/darwin-x64@0.20.2: + "@esbuild/darwin-x64@0.21.5": resolution: { - integrity: sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==, + integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==, } engines: { node: ">=12" } cpu: [x64] os: [darwin] - requiresBuild: true - optional: true - /@esbuild/freebsd-arm64@0.20.2: + "@esbuild/freebsd-arm64@0.21.5": resolution: { - integrity: sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==, + integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==, } engines: { node: ">=12" } cpu: [arm64] os: [freebsd] - requiresBuild: true - optional: true - /@esbuild/freebsd-x64@0.20.2: + "@esbuild/freebsd-x64@0.21.5": resolution: { - integrity: sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==, + integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==, } engines: { node: ">=12" } cpu: [x64] os: [freebsd] - requiresBuild: true - optional: true - /@esbuild/linux-arm64@0.20.2: + "@esbuild/linux-arm64@0.21.5": resolution: { - integrity: sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==, + integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==, } engines: { node: ">=12" } cpu: [arm64] os: [linux] - requiresBuild: true - optional: true - /@esbuild/linux-arm@0.20.2: + "@esbuild/linux-arm@0.21.5": resolution: { - integrity: sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==, + integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==, } engines: { node: ">=12" } cpu: [arm] os: [linux] - requiresBuild: true - optional: true - /@esbuild/linux-ia32@0.20.2: + "@esbuild/linux-ia32@0.21.5": resolution: { - integrity: sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==, + integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==, } engines: { node: ">=12" } cpu: [ia32] os: [linux] - requiresBuild: true - optional: true - /@esbuild/linux-loong64@0.20.2: + "@esbuild/linux-loong64@0.21.5": resolution: { - integrity: sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==, + integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==, } engines: { node: ">=12" } cpu: [loong64] os: [linux] - requiresBuild: true - optional: true - /@esbuild/linux-mips64el@0.20.2: + "@esbuild/linux-mips64el@0.21.5": resolution: { - integrity: sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==, + integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==, } engines: { node: ">=12" } cpu: [mips64el] os: [linux] - requiresBuild: true - optional: true - /@esbuild/linux-ppc64@0.20.2: + "@esbuild/linux-ppc64@0.21.5": resolution: { - integrity: sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==, + integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==, } engines: { node: ">=12" } cpu: [ppc64] os: [linux] - requiresBuild: true - optional: true - /@esbuild/linux-riscv64@0.20.2: + "@esbuild/linux-riscv64@0.21.5": resolution: { - integrity: sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==, + integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==, } engines: { node: ">=12" } cpu: [riscv64] os: [linux] - requiresBuild: true - optional: true - /@esbuild/linux-s390x@0.20.2: + "@esbuild/linux-s390x@0.21.5": resolution: { - integrity: sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==, + integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==, } engines: { node: ">=12" } cpu: [s390x] os: [linux] - requiresBuild: true - optional: true - /@esbuild/linux-x64@0.20.2: + "@esbuild/linux-x64@0.21.5": resolution: { - integrity: sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==, + integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==, } engines: { node: ">=12" } cpu: [x64] os: [linux] - requiresBuild: true - optional: true - /@esbuild/netbsd-x64@0.20.2: + "@esbuild/netbsd-x64@0.21.5": resolution: { - integrity: sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==, + integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==, } engines: { node: ">=12" } cpu: [x64] os: [netbsd] - requiresBuild: true - optional: true - /@esbuild/openbsd-x64@0.20.2: + "@esbuild/openbsd-x64@0.21.5": resolution: { - integrity: sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==, + integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==, } engines: { node: ">=12" } cpu: [x64] os: [openbsd] - requiresBuild: true - optional: true - /@esbuild/sunos-x64@0.20.2: + "@esbuild/sunos-x64@0.21.5": resolution: { - integrity: sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==, + integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==, } engines: { node: ">=12" } cpu: [x64] os: [sunos] - requiresBuild: true - optional: true - /@esbuild/win32-arm64@0.20.2: + "@esbuild/win32-arm64@0.21.5": resolution: { - integrity: sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==, + integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==, } engines: { node: ">=12" } cpu: [arm64] os: [win32] - requiresBuild: true - optional: true - /@esbuild/win32-ia32@0.20.2: + "@esbuild/win32-ia32@0.21.5": resolution: { - integrity: sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==, + integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==, } engines: { node: ">=12" } cpu: [ia32] os: [win32] - requiresBuild: true - optional: true - /@esbuild/win32-x64@0.20.2: + "@esbuild/win32-x64@0.21.5": resolution: { - integrity: sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==, + integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==, } engines: { node: ">=12" } cpu: [x64] os: [win32] - requiresBuild: true - optional: true - /@highlightjs/vue-plugin@2.1.0(highlight.js@11.9.0)(vue@3.4.22): + "@highlightjs/vue-plugin@2.1.0": resolution: { integrity: sha512-E+bmk4ncca+hBEYRV2a+1aIzIV0VSY/e5ArjpuSN9IO7wBJrzUE2u4ESCwrbQD7sAy+jWQjkV5qCCWgc+pu7CQ==, @@ -366,382 +311,270 @@ packages: peerDependencies: highlight.js: ^11.0.1 vue: ^3 - dependencies: - highlight.js: 11.9.0 - vue: 3.4.22(typescript@5.4.4) - dev: true - /@jridgewell/sourcemap-codec@1.4.15: + "@jridgewell/sourcemap-codec@1.4.15": resolution: { integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==, } - /@mdi/js@7.4.47: + "@mdi/js@7.4.47": resolution: { integrity: sha512-KPnNOtm5i2pMabqZxpUz7iQf+mfrYZyKCZ8QNz85czgEt7cuHcGorWfdzUMWYA0SD+a6Hn4FmJ+YhzzzjkTZrQ==, } - dev: true - /@nodelib/fs.scandir@2.1.5: + "@nodelib/fs.scandir@2.1.5": resolution: { integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==, } engines: { node: ">= 8" } - dependencies: - "@nodelib/fs.stat": 2.0.5 - run-parallel: 1.2.0 - dev: true - /@nodelib/fs.stat@2.0.5: + "@nodelib/fs.stat@2.0.5": resolution: { integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==, } engines: { node: ">= 8" } - dev: true - /@nodelib/fs.walk@1.2.8: + "@nodelib/fs.walk@1.2.8": resolution: { integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==, } engines: { node: ">= 8" } - dependencies: - "@nodelib/fs.scandir": 2.1.5 - fastq: 1.17.1 - dev: true - /@rollup/rollup-android-arm-eabi@4.14.3: + "@rollup/rollup-android-arm-eabi@4.18.0": resolution: { - integrity: sha512-X9alQ3XM6I9IlSlmC8ddAvMSyG1WuHk5oUnXGw+yUBs3BFoTizmG1La/Gr8fVJvDWAq+zlYTZ9DBgrlKRVY06g==, + integrity: sha512-Tya6xypR10giZV1XzxmH5wr25VcZSncG0pZIjfePT0OVBvqNEurzValetGNarVrGiq66EBVAFn15iYX4w6FKgQ==, } cpu: [arm] os: [android] - requiresBuild: true - optional: true - /@rollup/rollup-android-arm64@4.14.3: + "@rollup/rollup-android-arm64@4.18.0": resolution: { - integrity: sha512-eQK5JIi+POhFpzk+LnjKIy4Ks+pwJ+NXmPxOCSvOKSNRPONzKuUvWE+P9JxGZVxrtzm6BAYMaL50FFuPe0oWMQ==, + integrity: sha512-avCea0RAP03lTsDhEyfy+hpfr85KfyTctMADqHVhLAF3MlIkq83CP8UfAHUssgXTYd+6er6PaAhx/QGv4L1EiA==, } cpu: [arm64] os: [android] - requiresBuild: true - optional: true - /@rollup/rollup-darwin-arm64@4.14.3: + "@rollup/rollup-darwin-arm64@4.18.0": resolution: { - integrity: sha512-Od4vE6f6CTT53yM1jgcLqNfItTsLt5zE46fdPaEmeFHvPs5SjZYlLpHrSiHEKR1+HdRfxuzXHjDOIxQyC3ptBA==, + integrity: sha512-IWfdwU7KDSm07Ty0PuA/W2JYoZ4iTj3TUQjkVsO/6U+4I1jN5lcR71ZEvRh52sDOERdnNhhHU57UITXz5jC1/w==, } cpu: [arm64] os: [darwin] - requiresBuild: true - optional: true - /@rollup/rollup-darwin-x64@4.14.3: + "@rollup/rollup-darwin-x64@4.18.0": resolution: { - integrity: sha512-0IMAO21axJeNIrvS9lSe/PGthc8ZUS+zC53O0VhF5gMxfmcKAP4ESkKOCwEi6u2asUrt4mQv2rjY8QseIEb1aw==, + integrity: sha512-n2LMsUz7Ynu7DoQrSQkBf8iNrjOGyPLrdSg802vk6XT3FtsgX6JbE8IHRvposskFm9SNxzkLYGSq9QdpLYpRNA==, } cpu: [x64] os: [darwin] - requiresBuild: true - optional: true - /@rollup/rollup-linux-arm-gnueabihf@4.14.3: + "@rollup/rollup-linux-arm-gnueabihf@4.18.0": resolution: { - integrity: sha512-ge2DC7tHRHa3caVEoSbPRJpq7azhG+xYsd6u2MEnJ6XzPSzQsTKyXvh6iWjXRf7Rt9ykIUWHtl0Uz3T6yXPpKw==, + integrity: sha512-C/zbRYRXFjWvz9Z4haRxcTdnkPt1BtCkz+7RtBSuNmKzMzp3ZxdM28Mpccn6pt28/UWUCTXa+b0Mx1k3g6NOMA==, } cpu: [arm] os: [linux] - requiresBuild: true - optional: true - /@rollup/rollup-linux-arm-musleabihf@4.14.3: + "@rollup/rollup-linux-arm-musleabihf@4.18.0": resolution: { - integrity: sha512-ljcuiDI4V3ySuc7eSk4lQ9wU8J8r8KrOUvB2U+TtK0TiW6OFDmJ+DdIjjwZHIw9CNxzbmXY39wwpzYuFDwNXuw==, + integrity: sha512-l3m9ewPgjQSXrUMHg93vt0hYCGnrMOcUpTz6FLtbwljo2HluS4zTXFy2571YQbisTnfTKPZ01u/ukJdQTLGh9A==, } cpu: [arm] os: [linux] - requiresBuild: true - optional: true - /@rollup/rollup-linux-arm64-gnu@4.14.3: + "@rollup/rollup-linux-arm64-gnu@4.18.0": resolution: { - integrity: sha512-Eci2us9VTHm1eSyn5/eEpaC7eP/mp5n46gTRB3Aar3BgSvDQGJZuicyq6TsH4HngNBgVqC5sDYxOzTExSU+NjA==, + integrity: sha512-rJ5D47d8WD7J+7STKdCUAgmQk49xuFrRi9pZkWoRD1UeSMakbcepWXPF8ycChBoAqs1pb2wzvbY6Q33WmN2ftw==, } cpu: [arm64] os: [linux] - requiresBuild: true - optional: true - /@rollup/rollup-linux-arm64-musl@4.14.3: + "@rollup/rollup-linux-arm64-musl@4.18.0": resolution: { - integrity: sha512-UrBoMLCq4E92/LCqlh+blpqMz5h1tJttPIniwUgOFJyjWI1qrtrDhhpHPuFxULlUmjFHfloWdixtDhSxJt5iKw==, + integrity: sha512-be6Yx37b24ZwxQ+wOQXXLZqpq4jTckJhtGlWGZs68TgdKXJgw54lUUoFYrg6Zs/kjzAQwEwYbp8JxZVzZLRepQ==, } cpu: [arm64] os: [linux] - requiresBuild: true - optional: true - /@rollup/rollup-linux-powerpc64le-gnu@4.14.3: + "@rollup/rollup-linux-powerpc64le-gnu@4.18.0": resolution: { - integrity: sha512-5aRjvsS8q1nWN8AoRfrq5+9IflC3P1leMoy4r2WjXyFqf3qcqsxRCfxtZIV58tCxd+Yv7WELPcO9mY9aeQyAmw==, + integrity: sha512-hNVMQK+qrA9Todu9+wqrXOHxFiD5YmdEi3paj6vP02Kx1hjd2LLYR2eaN7DsEshg09+9uzWi2W18MJDlG0cxJA==, } cpu: [ppc64] os: [linux] - requiresBuild: true - optional: true - /@rollup/rollup-linux-riscv64-gnu@4.14.3: + "@rollup/rollup-linux-riscv64-gnu@4.18.0": resolution: { - integrity: sha512-sk/Qh1j2/RJSX7FhEpJn8n0ndxy/uf0kI/9Zc4b1ELhqULVdTfN6HL31CDaTChiBAOgLcsJ1sgVZjWv8XNEsAQ==, + integrity: sha512-ROCM7i+m1NfdrsmvwSzoxp9HFtmKGHEqu5NNDiZWQtXLA8S5HBCkVvKAxJ8U+CVctHwV2Gb5VUaK7UAkzhDjlg==, } cpu: [riscv64] os: [linux] - requiresBuild: true - optional: true - /@rollup/rollup-linux-s390x-gnu@4.14.3: + "@rollup/rollup-linux-s390x-gnu@4.18.0": resolution: { - integrity: sha512-jOO/PEaDitOmY9TgkxF/TQIjXySQe5KVYB57H/8LRP/ux0ZoO8cSHCX17asMSv3ruwslXW/TLBcxyaUzGRHcqg==, + integrity: sha512-0UyyRHyDN42QL+NbqevXIIUnKA47A+45WyasO+y2bGJ1mhQrfrtXUpTxCOrfxCR4esV3/RLYyucGVPiUsO8xjg==, } cpu: [s390x] os: [linux] - requiresBuild: true - optional: true - /@rollup/rollup-linux-x64-gnu@4.14.3: + "@rollup/rollup-linux-x64-gnu@4.18.0": resolution: { - integrity: sha512-8ybV4Xjy59xLMyWo3GCfEGqtKV5M5gCSrZlxkPGvEPCGDLNla7v48S662HSGwRd6/2cSneMQWiv+QzcttLrrOA==, + integrity: sha512-xuglR2rBVHA5UsI8h8UbX4VJ470PtGCf5Vpswh7p2ukaqBGFTnsfzxUBetoWBWymHMxbIG0Cmx7Y9qDZzr648w==, } cpu: [x64] os: [linux] - requiresBuild: true - optional: true - /@rollup/rollup-linux-x64-musl@4.14.3: + "@rollup/rollup-linux-x64-musl@4.18.0": resolution: { - integrity: sha512-s+xf1I46trOY10OqAtZ5Rm6lzHre/UiLA1J2uOhCFXWkbZrJRkYBPO6FhvGfHmdtQ3Bx793MNa7LvoWFAm93bg==, + integrity: sha512-LKaqQL9osY/ir2geuLVvRRs+utWUNilzdE90TpyoX0eNqPzWjRm14oMEE+YLve4k/NAqCdPkGYDaDF5Sw+xBfg==, } cpu: [x64] os: [linux] - requiresBuild: true - optional: true - /@rollup/rollup-win32-arm64-msvc@4.14.3: + "@rollup/rollup-win32-arm64-msvc@4.18.0": resolution: { - integrity: sha512-+4h2WrGOYsOumDQ5S2sYNyhVfrue+9tc9XcLWLh+Kw3UOxAvrfOrSMFon60KspcDdytkNDh7K2Vs6eMaYImAZg==, + integrity: sha512-7J6TkZQFGo9qBKH0pk2cEVSRhJbL6MtfWxth7Y5YmZs57Pi+4x6c2dStAUvaQkHQLnEQv1jzBUW43GvZW8OFqA==, } cpu: [arm64] os: [win32] - requiresBuild: true - optional: true - /@rollup/rollup-win32-ia32-msvc@4.14.3: + "@rollup/rollup-win32-ia32-msvc@4.18.0": resolution: { - integrity: sha512-T1l7y/bCeL/kUwh9OD4PQT4aM7Bq43vX05htPJJ46RTI4r5KNt6qJRzAfNfM+OYMNEVBWQzR2Gyk+FXLZfogGw==, + integrity: sha512-Txjh+IxBPbkUB9+SXZMpv+b/vnTEtFyfWZgJ6iyCmt2tdx0OF5WhFowLmnh8ENGNpfUlUZkdI//4IEmhwPieNg==, } cpu: [ia32] os: [win32] - requiresBuild: true - optional: true - /@rollup/rollup-win32-x64-msvc@4.14.3: + "@rollup/rollup-win32-x64-msvc@4.18.0": resolution: { - integrity: sha512-/BypzV0H1y1HzgYpxqRaXGBRqfodgoBBCcsrujT6QRcakDQdfU+Lq9PENPh5jB4I44YWq+0C2eHsHya+nZY1sA==, + integrity: sha512-UOo5FdvOL0+eIVTgS4tIdbW+TtnBLWg1YBCcU2KWM7nuNwRz9bksDX1bekJJCpu25N1DVWaCwnT39dVQxzqS8g==, } cpu: [x64] os: [win32] - requiresBuild: true - optional: true - - /@tootallnate/once@2.0.0: - resolution: - { - integrity: sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==, - } - engines: { node: ">= 10" } - /@types/estree@1.0.5: + "@types/estree@1.0.5": resolution: { integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==, } - /@vitejs/plugin-vue@5.0.4(vite@5.2.9)(vue@3.4.22): + "@vitejs/plugin-vue@5.0.5": resolution: { - integrity: sha512-WS3hevEszI6CEVEx28F8RjTX97k3KsrcY6kvTg7+Whm5y3oYvcqzVeGCU3hxSAn4uY2CLCkeokkGKpoctccilQ==, + integrity: sha512-LOjm7XeIimLBZyzinBQ6OSm3UBCNVCpLkxGC0oWmm2YPzVZoxMsdvNVimLTBzpAnR9hl/yn1SHGuRfe6/Td9rQ==, } engines: { node: ^18.0.0 || >=20.0.0 } peerDependencies: vite: ^5.0.0 vue: ^3.2.25 - dependencies: - vite: 5.2.9(sass@1.75.0) - vue: 3.4.22(typescript@5.4.4) - dev: true - /@volar/language-core@2.2.0-alpha.8: + "@volar/language-core@2.3.0": resolution: { - integrity: sha512-Ew1Iw7/RIRNuDLn60fWJdOLApAlfTVPxbPiSLzc434PReC9kleYtaa//Wo2WlN1oiRqneW0pWQQV0CwYqaimLQ==, + integrity: sha512-pvhL24WUh3VDnv7Yw5N1sjhPtdx7q9g+Wl3tggmnkMcyK8GcCNElF2zHiKznryn0DiUGk+eez/p2qQhz+puuHw==, } - dependencies: - "@volar/source-map": 2.2.0-alpha.8 - dev: true - /@volar/source-map@2.2.0-alpha.8: + "@volar/source-map@2.3.0": resolution: { - integrity: sha512-E1ZVmXFJ5DU4fWDcWHzi8OLqqReqIDwhXvIMhVdk6+VipfMVv4SkryXu7/rs4GA/GsebcRyJdaSkKBB3OAkIcA==, + integrity: sha512-G/228aZjAOGhDjhlyZ++nDbKrS9uk+5DMaEstjvzglaAw7nqtDyhnQAsYzUg6BMP9BtwZ59RIw5HGePrutn00Q==, } - dependencies: - muggle-string: 0.4.1 - dev: true - /@volar/typescript@2.2.0-alpha.8: + "@volar/typescript@2.3.0": resolution: { - integrity: sha512-RLbRDI+17CiayHZs9HhSzlH0FhLl/+XK6o2qoiw2o2GGKcyD1aDoY6AcMd44acYncTOrqoTNoY6LuCiRyiJiGg==, + integrity: sha512-PtUwMM87WsKVeLJN33GSTUjBexlKfKgouWlOUIv7pjrOnTwhXHZNSmpc312xgXdTjQPpToK6KXSIcKu9sBQ5LQ==, } - dependencies: - "@volar/language-core": 2.2.0-alpha.8 - path-browserify: 1.0.1 - dev: true - /@vue/compiler-core@3.4.22: + "@vue/compiler-core@3.4.29": resolution: { - integrity: sha512-FBDRCBE/rFPA8OfTUrARx2c49N7zoImlGT7hsFikv0pZxQlFhffQwewpEXaLynZW0/DspVXmNA+QQ9dXINpWmg==, + integrity: sha512-TFKiRkKKsRCKvg/jTSSKK7mYLJEQdUiUfykbG49rubC9SfDyvT2JrzTReopWlz2MxqeLyxh9UZhvxEIBgAhtrg==, } - dependencies: - "@babel/parser": 7.24.4 - "@vue/shared": 3.4.22 - entities: 4.5.0 - estree-walker: 2.0.2 - source-map-js: 1.2.0 - /@vue/compiler-dom@3.4.22: + "@vue/compiler-dom@3.4.29": resolution: { - integrity: sha512-YkAS+jZc6Ip360kT3lZbMQZteiYBbHDSVKr94Jdd8Zjr7VjSkkXKAFFR/FW+2tNtBYXOps6xrWlOquy3GeYB0w==, + integrity: sha512-A6+iZ2fKIEGnfPJejdB7b1FlJzgiD+Y/sxxKwJWg1EbJu6ZPgzaPQQ51ESGNv0CP6jm6Z7/pO6Ia8Ze6IKrX7w==, } - dependencies: - "@vue/compiler-core": 3.4.22 - "@vue/shared": 3.4.22 - /@vue/compiler-sfc@3.4.22: + "@vue/compiler-sfc@3.4.29": resolution: { - integrity: sha512-Pncp5Vc8E2Ef1o5uveO8WA1IqM7rt0R1jN8D4qitQYOUxC97iITGYA8oMInQ3UcDS7ip+SegyA2HbAEB4V6NMQ==, + integrity: sha512-zygDcEtn8ZimDlrEQyLUovoWgKQic6aEQqRXce2WXBvSeHbEbcAsXyCk9oG33ZkyWH4sl9D3tkYc1idoOkdqZQ==, } - dependencies: - "@babel/parser": 7.24.4 - "@vue/compiler-core": 3.4.22 - "@vue/compiler-dom": 3.4.22 - "@vue/compiler-ssr": 3.4.22 - "@vue/shared": 3.4.22 - estree-walker: 2.0.2 - magic-string: 0.30.9 - postcss: 8.4.38 - source-map-js: 1.2.0 - /@vue/compiler-ssr@3.4.22: + "@vue/compiler-ssr@3.4.29": resolution: { - integrity: sha512-ycb2sL0SW6AkgVMrvaU/TIAEk7FQWyv/oYya44E/V9xURM+ij9Oev5bVobSS7GLJzkUieWW3SrYcK/PZpb5i4A==, + integrity: sha512-rFbwCmxJ16tDp3N8XCx5xSQzjhidYjXllvEcqX/lopkoznlNPz3jyy0WGJCyhAaVQK677WWFt3YO/WUEkMMUFQ==, } - dependencies: - "@vue/compiler-dom": 3.4.22 - "@vue/shared": 3.4.22 - /@vue/language-core@2.0.13(typescript@5.4.4): + "@vue/language-core@2.0.21": resolution: { - integrity: sha512-oQgM+BM66SU5GKtUMLQSQN0bxHFkFpLSSAiY87wVziPaiNQZuKVDt/3yA7GB9PiQw0y/bTNL0bOc0jM/siYjKg==, + integrity: sha512-vjs6KwnCK++kIXT+eI63BGpJHfHNVJcUCr3RnvJsccT3vbJnZV5IhHR2puEkoOkIbDdp0Gqi1wEnv3hEd3WsxQ==, } peerDependencies: typescript: "*" peerDependenciesMeta: typescript: optional: true - dependencies: - "@volar/language-core": 2.2.0-alpha.8 - "@vue/compiler-dom": 3.4.22 - "@vue/shared": 3.4.22 - computeds: 0.0.1 - minimatch: 9.0.4 - path-browserify: 1.0.1 - typescript: 5.4.4 - vue-template-compiler: 2.7.16 - dev: true - /@vue/reactivity@3.4.22: + "@vue/reactivity@3.4.29": resolution: { - integrity: sha512-+golHRRfcGoahBrhoTauFNIIAhxntRV3BI8HHqVvCdsuWivxW1MI0E9AOXVsz4H/ZlWM1ahudWTX6PhUrNR2yQ==, + integrity: sha512-w8+KV+mb1a8ornnGQitnMdLfE0kXmteaxLdccm2XwdFxXst4q/Z7SEboCV5SqJNpZbKFeaRBBJBhW24aJyGINg==, } - dependencies: - "@vue/shared": 3.4.22 - /@vue/runtime-core@3.4.22: + "@vue/runtime-core@3.4.29": resolution: { - integrity: sha512-cbA8lcL4g1907EdY1a1KmP5IRWfbqjgBRcgJPkF//yn96XSC1/VAJBZiAGLiyw0P77Rw2Ao7d9U51vU1GC6yUQ==, + integrity: sha512-s8fmX3YVR/Rk5ig0ic0NuzTNjK2M7iLuVSZyMmCzN/+Mjuqqif1JasCtEtmtoJWF32pAtUjyuT2ljNKNLeOmnQ==, } - dependencies: - "@vue/reactivity": 3.4.22 - "@vue/shared": 3.4.22 - /@vue/runtime-dom@3.4.22: + "@vue/runtime-dom@3.4.29": resolution: { - integrity: sha512-AXxRHrFkLX1y2+70CO2wDKRxW0WZcQKTOXS31AK+jZ1RLPtI6sEHVpYNfyE9WgbgXOqPtX4gfIfuoFYi8iCu2w==, + integrity: sha512-gI10atCrtOLf/2MPPMM+dpz3NGulo9ZZR9d1dWo4fYvm+xkfvRrw1ZmJ7mkWtiJVXSsdmPbcK1p5dZzOCKDN0g==, } - dependencies: - "@vue/runtime-core": 3.4.22 - "@vue/shared": 3.4.22 - csstype: 3.1.3 - /@vue/server-renderer@3.4.22(vue@3.4.22): + "@vue/server-renderer@3.4.29": resolution: { - integrity: sha512-okiNxiCOhJlx6IOrTZvhIVwf2UYKay0hnIPqWu4h19bkNv1gmG4Ic6U3zXY287AWF26lQuFMa515Qzc+R0aAYg==, + integrity: sha512-HMLCmPI2j/k8PVkSBysrA2RxcxC5DgBiCdj7n7H2QtR8bQQPqKAe8qoaxLcInzouBmzwJ+J0x20ygN/B5mYBng==, } peerDependencies: - vue: 3.4.22 - dependencies: - "@vue/compiler-ssr": 3.4.22 - "@vue/shared": 3.4.22 - vue: 3.4.22(typescript@5.4.4) + vue: 3.4.29 - /@vue/shared@3.4.22: + "@vue/shared@3.4.29": resolution: { - integrity: sha512-cg7R9XNk4ovV3bKka/1a464O2oY0l5Fyt0rwGR4hSJRPjUJ0WVjrPdsr4W0JbUriwiM8EKcCcCjeKN5pRMs2Zg==, + integrity: sha512-hQ2gAQcBO/CDpC82DCrinJNgOHI2v+FA7BDW4lMSPeBpQ7sRe2OLHWe5cph1s7D8DUQAwRt18dBDfJJ220APEA==, } - /@vuetify/loader-shared@2.0.3(vue@3.4.22)(vuetify@3.5.15): + "@vuetify/loader-shared@2.0.3": resolution: { integrity: sha512-Ss3GC7eJYkp2SF6xVzsT7FAruEmdihmn4OCk2+UocREerlXKWgOKKzTN5PN3ZVN5q05jHHrsNhTuWbhN61Bpdg==, @@ -749,160 +582,110 @@ packages: peerDependencies: vue: ^3.0.0 vuetify: ^3.0.0 - dependencies: - upath: 2.0.1 - vue: 3.4.22(typescript@5.4.4) - vuetify: 3.5.15(typescript@5.4.4)(vite-plugin-vuetify@2.0.3)(vue@3.4.22) - - /abab@2.0.6: - resolution: - { - integrity: sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==, - } - deprecated: Use your platform's native atob() and btoa() methods instead - /agent-base@6.0.2: + agent-base@7.1.1: resolution: { - integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==, + integrity: sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==, } - engines: { node: ">= 6.0.0" } - dependencies: - debug: 4.3.4 - transitivePeerDependencies: - - supports-color + engines: { node: ">= 14" } - /anymatch@3.1.3: + anymatch@3.1.3: resolution: { integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==, } engines: { node: ">= 8" } - dependencies: - normalize-path: 3.0.0 - picomatch: 2.3.1 - /asynckit@0.4.0: + asynckit@0.4.0: resolution: { integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==, } - /balanced-match@1.0.2: + balanced-match@1.0.2: resolution: { integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==, } - dev: true - /binary-extensions@2.3.0: + binary-extensions@2.3.0: resolution: { integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==, } engines: { node: ">=8" } - /blockly@10.4.3: + blockly@11.1.1: resolution: { - integrity: sha512-+opfBmQnSiv7vTiY/TkDEBOslxUyfj8luS3S+qs1NnQKjInC+Waf2l9cNsMh9J8BMkmiCIT+Ed/3mmjIaL9wug==, + integrity: sha512-PmInYM9zH1HcYMffqnfmeu2O3g0intsowy08S0KDu3q8/95TfGo1tcDYpeWNQDkPOEzN1yy3oocsRO4NPDHtKA==, } - dependencies: - jsdom: 22.1.0 - transitivePeerDependencies: - - bufferutil - - canvas - - supports-color - - utf-8-validate + engines: { node: ">=18" } - /brace-expansion@2.0.1: + brace-expansion@2.0.1: resolution: { integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==, } - dependencies: - balanced-match: 1.0.2 - dev: true - /braces@3.0.2: + braces@3.0.3: resolution: { - integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==, + integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==, } engines: { node: ">=8" } - dependencies: - fill-range: 7.0.1 - /chokidar@3.6.0: + chokidar@3.6.0: resolution: { integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==, } engines: { node: ">= 8.10.0" } - dependencies: - anymatch: 3.1.3 - braces: 3.0.2 - glob-parent: 5.1.2 - is-binary-path: 2.1.0 - is-glob: 4.0.3 - normalize-path: 3.0.0 - readdirp: 3.6.0 - optionalDependencies: - fsevents: 2.3.3 - /combined-stream@1.0.8: + combined-stream@1.0.8: resolution: { integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==, } engines: { node: ">= 0.8" } - dependencies: - delayed-stream: 1.0.0 - /computeds@0.0.1: + computeds@0.0.1: resolution: { integrity: sha512-7CEBgcMjVmitjYo5q8JTJVra6X5mQ20uTThdK+0kR7UEaDrAWEQcRiBtWJzga4eRpP6afNwwLsX2SET2JhVB1Q==, } - dev: true - /cssstyle@3.0.0: + cssstyle@3.0.0: resolution: { integrity: sha512-N4u2ABATi3Qplzf0hWbVCdjenim8F3ojEXpBDF5hBpjzW182MjNGLqfmQ0SkSPeQ+V86ZXgeH8aXj6kayd4jgg==, } engines: { node: ">=14" } - dependencies: - rrweb-cssom: 0.6.0 - /csstype@3.1.3: + csstype@3.1.3: resolution: { integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==, } - /data-urls@4.0.0: + data-urls@5.0.0: resolution: { - integrity: sha512-/mMTei/JXPqvFqQtfyTowxmJVwr2PVAeCcDxyFf6LhoOu/09TX2OX3kb2wzi4DMXcfj4OItwDOnhl5oziPnT6g==, + integrity: sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==, } - engines: { node: ">=14" } - dependencies: - abab: 2.0.6 - whatwg-mimetype: 3.0.0 - whatwg-url: 12.0.1 + engines: { node: ">=18" } - /de-indent@1.0.2: + de-indent@1.0.2: resolution: { integrity: sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==, } - dev: true - /debug@4.3.4: + debug@4.3.5: resolution: { - integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==, + integrity: sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==, } engines: { node: ">=6.0" } peerDependencies: @@ -910,390 +693,250 @@ packages: peerDependenciesMeta: supports-color: optional: true - dependencies: - ms: 2.1.2 - /decimal.js@10.4.3: + decimal.js@10.4.3: resolution: { integrity: sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==, } - /delayed-stream@1.0.0: + delayed-stream@1.0.0: resolution: { integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==, } engines: { node: ">=0.4.0" } - /domexception@4.0.0: - resolution: - { - integrity: sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw==, - } - engines: { node: ">=12" } - deprecated: Use your platform's native DOMException instead - dependencies: - webidl-conversions: 7.0.0 - - /entities@4.5.0: + entities@4.5.0: resolution: { integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==, } engines: { node: ">=0.12" } - /esbuild@0.20.2: + esbuild@0.21.5: resolution: { - integrity: sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==, + integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==, } engines: { node: ">=12" } hasBin: true - requiresBuild: true - optionalDependencies: - "@esbuild/aix-ppc64": 0.20.2 - "@esbuild/android-arm": 0.20.2 - "@esbuild/android-arm64": 0.20.2 - "@esbuild/android-x64": 0.20.2 - "@esbuild/darwin-arm64": 0.20.2 - "@esbuild/darwin-x64": 0.20.2 - "@esbuild/freebsd-arm64": 0.20.2 - "@esbuild/freebsd-x64": 0.20.2 - "@esbuild/linux-arm": 0.20.2 - "@esbuild/linux-arm64": 0.20.2 - "@esbuild/linux-ia32": 0.20.2 - "@esbuild/linux-loong64": 0.20.2 - "@esbuild/linux-mips64el": 0.20.2 - "@esbuild/linux-ppc64": 0.20.2 - "@esbuild/linux-riscv64": 0.20.2 - "@esbuild/linux-s390x": 0.20.2 - "@esbuild/linux-x64": 0.20.2 - "@esbuild/netbsd-x64": 0.20.2 - "@esbuild/openbsd-x64": 0.20.2 - "@esbuild/sunos-x64": 0.20.2 - "@esbuild/win32-arm64": 0.20.2 - "@esbuild/win32-ia32": 0.20.2 - "@esbuild/win32-x64": 0.20.2 - - /estree-walker@2.0.2: + + estree-walker@2.0.2: resolution: { integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==, } - /fast-glob@3.3.2: + fast-glob@3.3.2: resolution: { integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==, } engines: { node: ">=8.6.0" } - dependencies: - "@nodelib/fs.stat": 2.0.5 - "@nodelib/fs.walk": 1.2.8 - glob-parent: 5.1.2 - merge2: 1.4.1 - micromatch: 4.0.5 - dev: true - /fastq@1.17.1: + fastq@1.17.1: resolution: { integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==, } - dependencies: - reusify: 1.0.4 - dev: true - /fill-range@7.0.1: + fill-range@7.1.1: resolution: { - integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==, + integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==, } engines: { node: ">=8" } - dependencies: - to-regex-range: 5.0.1 - /form-data@4.0.0: + form-data@4.0.0: resolution: { integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==, } engines: { node: ">= 6" } - dependencies: - asynckit: 0.4.0 - combined-stream: 1.0.8 - mime-types: 2.1.35 - /fs-extra@11.2.0: + fs-extra@11.2.0: resolution: { integrity: sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==, } engines: { node: ">=14.14" } - dependencies: - graceful-fs: 4.2.11 - jsonfile: 6.1.0 - universalify: 2.0.1 - dev: true - /fsevents@2.3.3: + fsevents@2.3.3: resolution: { integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==, } engines: { node: ^8.16.0 || ^10.6.0 || >=11.0.0 } os: [darwin] - requiresBuild: true - optional: true - /glob-parent@5.1.2: + glob-parent@5.1.2: resolution: { integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==, } engines: { node: ">= 6" } - dependencies: - is-glob: 4.0.3 - /graceful-fs@4.2.11: + graceful-fs@4.2.11: resolution: { integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==, } - dev: true - /he@1.2.0: + he@1.2.0: resolution: { integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==, } hasBin: true - dev: true - /highlight.js@11.9.0: + highlight.js@11.9.0: resolution: { integrity: sha512-fJ7cW7fQGCYAkgv4CPfwFHrfd/cLS4Hau96JuJ+ZTOWhjnhoeN1ub1tFmALm/+lW5z4WCAuAV9bm05AP0mS6Gw==, } engines: { node: ">=12.0.0" } - /html-encoding-sniffer@3.0.0: + html-encoding-sniffer@4.0.0: resolution: { - integrity: sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==, + integrity: sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==, } - engines: { node: ">=12" } - dependencies: - whatwg-encoding: 2.0.0 + engines: { node: ">=18" } - /http-proxy-agent@5.0.0: + http-proxy-agent@7.0.2: resolution: { - integrity: sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==, + integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==, } - engines: { node: ">= 6" } - dependencies: - "@tootallnate/once": 2.0.0 - agent-base: 6.0.2 - debug: 4.3.4 - transitivePeerDependencies: - - supports-color + engines: { node: ">= 14" } - /https-proxy-agent@5.0.1: + https-proxy-agent@7.0.4: resolution: { - integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==, + integrity: sha512-wlwpilI7YdjSkWaQ/7omYBMTliDcmCN8OLihO6I9B86g06lMyAoqgoDpV0XqoaPOKj+0DIdAvnsWfyAAhmimcg==, } - engines: { node: ">= 6" } - dependencies: - agent-base: 6.0.2 - debug: 4.3.4 - transitivePeerDependencies: - - supports-color + engines: { node: ">= 14" } - /iconv-lite@0.6.3: + iconv-lite@0.6.3: resolution: { integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==, } engines: { node: ">=0.10.0" } - dependencies: - safer-buffer: 2.1.2 - /immutable@4.3.5: + immutable@4.3.6: resolution: { - integrity: sha512-8eabxkth9gZatlwl5TBuJnCsoTADlL6ftEr7A4qgdaTsPyreilDSnUk57SO+jfKcNtxPa22U5KK6DSeAYhpBJw==, + integrity: sha512-Ju0+lEMyzMVZarkTn/gqRpdqd5dOPaz1mCZ0SH3JV6iFw81PldE/PEB1hWVEA288HPt4WXW8O7AWxB10M+03QQ==, } - /is-binary-path@2.1.0: + is-binary-path@2.1.0: resolution: { integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==, } engines: { node: ">=8" } - dependencies: - binary-extensions: 2.3.0 - /is-extglob@2.1.1: + is-extglob@2.1.1: resolution: { integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==, } engines: { node: ">=0.10.0" } - /is-glob@4.0.3: + is-glob@4.0.3: resolution: { integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==, } engines: { node: ">=0.10.0" } - dependencies: - is-extglob: 2.1.1 - /is-number@7.0.0: + is-number@7.0.0: resolution: { integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==, } engines: { node: ">=0.12.0" } - /is-potential-custom-element-name@1.0.1: + is-potential-custom-element-name@1.0.1: resolution: { integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==, } - /jsdom@22.1.0: + jsdom@23.0.0: resolution: { - integrity: sha512-/9AVW7xNbsBv6GfWho4TTNjEo9fe6Zhf9O7s0Fhhr3u+awPwAJMKwAMXnkk5vBxflqLW9hTHX/0cs+P3gW+cQw==, + integrity: sha512-cbL/UCtohJguhFC7c2/hgW6BeZCNvP7URQGnx9tSJRYKCdnfbfWOrtuLTMfiB2VxKsx5wPHVsh/J0aBy9lIIhQ==, } - engines: { node: ">=16" } + engines: { node: ">=18" } peerDependencies: - canvas: ^2.5.0 + canvas: ^3.0.0 peerDependenciesMeta: canvas: optional: true - dependencies: - abab: 2.0.6 - cssstyle: 3.0.0 - data-urls: 4.0.0 - decimal.js: 10.4.3 - domexception: 4.0.0 - form-data: 4.0.0 - html-encoding-sniffer: 3.0.0 - http-proxy-agent: 5.0.0 - https-proxy-agent: 5.0.1 - is-potential-custom-element-name: 1.0.1 - nwsapi: 2.2.7 - parse5: 7.1.2 - rrweb-cssom: 0.6.0 - saxes: 6.0.0 - symbol-tree: 3.2.4 - tough-cookie: 4.1.3 - w3c-xmlserializer: 4.0.0 - webidl-conversions: 7.0.0 - whatwg-encoding: 2.0.0 - whatwg-mimetype: 3.0.0 - whatwg-url: 12.0.1 - ws: 8.16.0 - xml-name-validator: 4.0.0 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - /jsonfile@6.1.0: + jsonfile@6.1.0: resolution: { integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==, } - dependencies: - universalify: 2.0.1 - optionalDependencies: - graceful-fs: 4.2.11 - dev: true - - /lru-cache@6.0.0: - resolution: - { - integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==, - } - engines: { node: ">=10" } - dependencies: - yallist: 4.0.0 - dev: true - /magic-string@0.30.9: + magic-string@0.30.10: resolution: { - integrity: sha512-S1+hd+dIrC8EZqKyT9DstTH/0Z+f76kmmvZnkfQVmOpDEF9iVgdYif3Q/pIWHmCoo59bQVGW0kVL3e2nl+9+Sw==, + integrity: sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ==, } - engines: { node: ">=12" } - dependencies: - "@jridgewell/sourcemap-codec": 1.4.15 - /merge2@1.4.1: + merge2@1.4.1: resolution: { integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==, } engines: { node: ">= 8" } - dev: true - /micromatch@4.0.5: + micromatch@4.0.7: resolution: { - integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==, + integrity: sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==, } engines: { node: ">=8.6" } - dependencies: - braces: 3.0.2 - picomatch: 2.3.1 - dev: true - /mime-db@1.52.0: + mime-db@1.52.0: resolution: { integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==, } engines: { node: ">= 0.6" } - /mime-types@2.1.35: + mime-types@2.1.35: resolution: { integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==, } engines: { node: ">= 0.6" } - dependencies: - mime-db: 1.52.0 - /minimatch@9.0.4: + minimatch@9.0.4: resolution: { integrity: sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==, } engines: { node: ">=16 || 14 >=14.17" } - dependencies: - brace-expansion: 2.0.1 - dev: true - /ms@2.1.2: + ms@2.1.2: resolution: { integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==, } - /muggle-string@0.4.1: + muggle-string@0.4.1: resolution: { integrity: sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==, } - dev: true - /nanoid@3.3.7: + nanoid@3.3.7: resolution: { integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==, @@ -1301,303 +944,239 @@ packages: engines: { node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1 } hasBin: true - /normalize-path@3.0.0: + normalize-path@3.0.0: resolution: { integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==, } engines: { node: ">=0.10.0" } - /nwsapi@2.2.7: + nwsapi@2.2.10: resolution: { - integrity: sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ==, + integrity: sha512-QK0sRs7MKv0tKe1+5uZIQk/C8XGza4DAnztJG8iD+TpJIORARrCxczA738awHrZoHeTjSSoHqao2teO0dC/gFQ==, } - /parse5@7.1.2: + parse5@7.1.2: resolution: { integrity: sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==, } - dependencies: - entities: 4.5.0 - /path-browserify@1.0.1: + path-browserify@1.0.1: resolution: { integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==, } - dev: true - /picocolors@1.0.0: + picocolors@1.0.1: resolution: { - integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==, + integrity: sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==, } - /picomatch@2.3.1: + picomatch@2.3.1: resolution: { integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==, } engines: { node: ">=8.6" } - /postcss@8.4.38: + postcss@8.4.38: resolution: { integrity: sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==, } engines: { node: ^10 || ^12 || >=14 } - dependencies: - nanoid: 3.3.7 - picocolors: 1.0.0 - source-map-js: 1.2.0 - /prettier@3.2.5: + prettier@3.3.2: resolution: { - integrity: sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==, + integrity: sha512-rAVeHYMcv8ATV5d508CFdn+8/pHPpXeIid1DdrPwXnaAdH7cqjVbpJaT5eq4yRAFU/lsbwYwSF/n5iNrdJHPQA==, } engines: { node: ">=14" } hasBin: true - dev: true - /psl@1.9.0: + psl@1.9.0: resolution: { integrity: sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==, } - /punycode@2.3.1: + punycode@2.3.1: resolution: { integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==, } engines: { node: ">=6" } - /querystringify@2.2.0: + querystringify@2.2.0: resolution: { integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==, } - /queue-microtask@1.2.3: + queue-microtask@1.2.3: resolution: { integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==, } - dev: true - /readdirp@3.6.0: + readdirp@3.6.0: resolution: { integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==, } engines: { node: ">=8.10.0" } - dependencies: - picomatch: 2.3.1 - /requires-port@1.0.0: + requires-port@1.0.0: resolution: { integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==, } - /reusify@1.0.4: + reusify@1.0.4: resolution: { integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==, } engines: { iojs: ">=1.0.0", node: ">=0.10.0" } - dev: true - /rollup@4.14.3: + rollup@4.18.0: resolution: { - integrity: sha512-ag5tTQKYsj1bhrFC9+OEWqb5O6VYgtQDO9hPDBMmIbePwhfSr+ExlcU741t8Dhw5DkPCQf6noz0jb36D6W9/hw==, + integrity: sha512-QmJz14PX3rzbJCN1SG4Xe/bAAX2a6NpCP8ab2vfu2GiUr8AQcr2nCV/oEO3yneFarB67zk8ShlIyWb2LGTb3Sg==, } engines: { node: ">=18.0.0", npm: ">=8.0.0" } hasBin: true - dependencies: - "@types/estree": 1.0.5 - optionalDependencies: - "@rollup/rollup-android-arm-eabi": 4.14.3 - "@rollup/rollup-android-arm64": 4.14.3 - "@rollup/rollup-darwin-arm64": 4.14.3 - "@rollup/rollup-darwin-x64": 4.14.3 - "@rollup/rollup-linux-arm-gnueabihf": 4.14.3 - "@rollup/rollup-linux-arm-musleabihf": 4.14.3 - "@rollup/rollup-linux-arm64-gnu": 4.14.3 - "@rollup/rollup-linux-arm64-musl": 4.14.3 - "@rollup/rollup-linux-powerpc64le-gnu": 4.14.3 - "@rollup/rollup-linux-riscv64-gnu": 4.14.3 - "@rollup/rollup-linux-s390x-gnu": 4.14.3 - "@rollup/rollup-linux-x64-gnu": 4.14.3 - "@rollup/rollup-linux-x64-musl": 4.14.3 - "@rollup/rollup-win32-arm64-msvc": 4.14.3 - "@rollup/rollup-win32-ia32-msvc": 4.14.3 - "@rollup/rollup-win32-x64-msvc": 4.14.3 - fsevents: 2.3.3 - /rrweb-cssom@0.6.0: + rrweb-cssom@0.6.0: resolution: { integrity: sha512-APM0Gt1KoXBz0iIkkdB/kfvGOwC4UuJFeG/c+yV7wSc7q96cG/kJ0HiYCnzivD9SB53cLV1MlHFNfOuPaadYSw==, } - /run-parallel@1.2.0: + run-parallel@1.2.0: resolution: { integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==, } - dependencies: - queue-microtask: 1.2.3 - dev: true - /safer-buffer@2.1.2: + safer-buffer@2.1.2: resolution: { integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==, } - /sass@1.75.0: + sass@1.77.6: resolution: { - integrity: sha512-ShMYi3WkrDWxExyxSZPst4/okE9ts46xZmJDSawJQrnte7M1V9fScVB+uNXOVKRBt0PggHOwoZcn8mYX4trnBw==, + integrity: sha512-ByXE1oLD79GVq9Ht1PeHWCPMPB8XHpBuz1r85oByKHjZY6qV6rWnQovQzXJXuQ/XyE1Oj3iPk3lo28uzaRA2/Q==, } engines: { node: ">=14.0.0" } hasBin: true - dependencies: - chokidar: 3.6.0 - immutable: 4.3.5 - source-map-js: 1.2.0 - /saxes@6.0.0: + saxes@6.0.0: resolution: { integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==, } engines: { node: ">=v12.22.7" } - dependencies: - xmlchars: 2.2.0 - /semver@7.6.0: + semver@7.6.2: resolution: { - integrity: sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==, + integrity: sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==, } engines: { node: ">=10" } hasBin: true - dependencies: - lru-cache: 6.0.0 - dev: true - /source-map-js@1.2.0: + source-map-js@1.2.0: resolution: { integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==, } engines: { node: ">=0.10.0" } - /symbol-tree@3.2.4: + symbol-tree@3.2.4: resolution: { integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==, } - /to-fast-properties@2.0.0: + to-fast-properties@2.0.0: resolution: { integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==, } engines: { node: ">=4" } - /to-regex-range@5.0.1: + to-regex-range@5.0.1: resolution: { integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==, } engines: { node: ">=8.0" } - dependencies: - is-number: 7.0.0 - /tough-cookie@4.1.3: + tough-cookie@4.1.4: resolution: { - integrity: sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==, + integrity: sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==, } engines: { node: ">=6" } - dependencies: - psl: 1.9.0 - punycode: 2.3.1 - universalify: 0.2.0 - url-parse: 1.5.10 - /tr46@4.1.1: + tr46@5.0.0: resolution: { - integrity: sha512-2lv/66T7e5yNyhAAC4NaKe5nVavzuGJQVVtRYLyQ2OI8tsJ61PMLlelehb0wi2Hx6+hT/OJUWZcw8MjlSRnxvw==, + integrity: sha512-tk2G5R2KRwBd+ZN0zaEXpmzdKyOYksXwywulIX95MBODjSzMIuQnQ3m8JxgbhnL1LeVo7lqQKsYa1O3Htl7K5g==, } - engines: { node: ">=14" } - dependencies: - punycode: 2.3.1 + engines: { node: ">=18" } - /typescript@5.4.4: + typescript@5.5.2: resolution: { - integrity: sha512-dGE2Vv8cpVvw28v8HCPqyb08EzbBURxDpuhJvTrusShUfGnhHBafDsLdS1EhhxyL6BJQE+2cT3dDPAv+MQ6oLw==, + integrity: sha512-NcRtPEOsPFFWjobJEtfihkLCZCXZt/os3zf8nTxjVH3RvTSxjrCamJpbExGvYOF+tFHc3pA65qpdwPbzjohhew==, } engines: { node: ">=14.17" } hasBin: true - /universalify@0.2.0: + universalify@0.2.0: resolution: { integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==, } engines: { node: ">= 4.0.0" } - /universalify@2.0.1: + universalify@2.0.1: resolution: { integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==, } engines: { node: ">= 10.0.0" } - dev: true - /upath@2.0.1: + upath@2.0.1: resolution: { integrity: sha512-1uEe95xksV1O0CYKXo8vQvN1JEbtJp7lb7C5U9HMsIp6IVwntkH/oNUzyVNQSd4S1sYk2FpSSW44FqMc8qee5w==, } engines: { node: ">=4" } - /url-parse@1.5.10: + url-parse@1.5.10: resolution: { integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==, } - dependencies: - querystringify: 2.2.0 - requires-port: 1.0.0 - /vite-plugin-static-copy@1.0.2(vite@5.2.9): + vite-plugin-static-copy@1.0.5: resolution: { - integrity: sha512-AfmEF+a/mfjsUsrgjbCkhzUCeIUF4EKQXXt3Ie1cour9MBpy6f6GphbdW2td28oYfOrwCyRzFCksgLkpk58q6Q==, + integrity: sha512-02k0Rox+buYdEOfeilKZSgs1gXfPf9RjVztZEIYZgVIxjsVZi6AXssjzdi+qW6zYt00d3bq+tpP2voVXN2fKLw==, } engines: { node: ^18.0.0 || >=20.0.0 } peerDependencies: vite: ^5.0.0 - dependencies: - chokidar: 3.6.0 - fast-glob: 3.3.2 - fs-extra: 11.2.0 - picocolors: 1.0.0 - vite: 5.2.9(sass@1.75.0) - dev: true - /vite-plugin-vuetify@2.0.3(vite@5.2.9)(vue@3.4.22)(vuetify@3.5.15): + vite-plugin-vuetify@2.0.3: resolution: { integrity: sha512-HbYajgGgb/noaVKNRhnnXIiQZrNXfNIeanUGAwXgOxL6h/KULS40Uf51Kyz8hNmdegF+DwjgXXI/8J1PNS83xw==, @@ -1607,20 +1186,11 @@ packages: vite: ">=5" vue: ^3.0.0 vuetify: ^3.0.0 - dependencies: - "@vuetify/loader-shared": 2.0.3(vue@3.4.22)(vuetify@3.5.15) - debug: 4.3.4 - upath: 2.0.1 - vite: 5.2.9(sass@1.75.0) - vue: 3.4.22(typescript@5.4.4) - vuetify: 3.5.15(typescript@5.4.4)(vite-plugin-vuetify@2.0.3)(vue@3.4.22) - transitivePeerDependencies: - - supports-color - /vite@5.2.9(sass@1.75.0): + vite@5.3.1: resolution: { - integrity: sha512-uOQWfuZBlc6Y3W/DTuQ1Sr+oIXWvqljLvS881SVmAj00d5RdgShLcuXWxseWPd4HXwiYBFW/vXHfKFeqj9uQnw==, + integrity: sha512-XBmSKRLXLxiaPYamLv3/hnP/KXDai1NDexN0FpkTaZXTfycHvkRHoenpgl/fvuK/kPbB6xAgoyiryAhQNxYmAQ==, } engines: { node: ^18.0.0 || >=20.0.0 } hasBin: true @@ -1647,61 +1217,43 @@ packages: optional: true terser: optional: true - dependencies: - esbuild: 0.20.2 - postcss: 8.4.38 - rollup: 4.14.3 - sass: 1.75.0 - optionalDependencies: - fsevents: 2.3.3 - /vue-template-compiler@2.7.16: + vscode-uri@3.0.8: + resolution: + { + integrity: sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==, + } + + vue-template-compiler@2.7.16: resolution: { integrity: sha512-AYbUWAJHLGGQM7+cNTELw+KsOG9nl2CnSv467WobS5Cv9uk3wFcnr1Etsz2sEIHEZvw1U+o9mRlEO6QbZvUPGQ==, } - dependencies: - de-indent: 1.0.2 - he: 1.2.0 - dev: true - /vue-tsc@2.0.13(typescript@5.4.4): + vue-tsc@2.0.21: resolution: { - integrity: sha512-a3nL3FvguCWVJUQW/jFrUxdeUtiEkbZoQjidqvMeBK//tuE2w6NWQAbdrEpY2+6nSa4kZoKZp8TZUMtHpjt4mQ==, + integrity: sha512-E6x1p1HaHES6Doy8pqtm7kQern79zRtIewkf9fiv7Y43Zo4AFDS5hKi+iHi2RwEhqRmuiwliB1LCEFEGwvxQnw==, } hasBin: true peerDependencies: typescript: "*" - dependencies: - "@volar/typescript": 2.2.0-alpha.8 - "@vue/language-core": 2.0.13(typescript@5.4.4) - semver: 7.6.0 - typescript: 5.4.4 - dev: true - /vue@3.4.22(typescript@5.4.4): + vue@3.4.29: resolution: { - integrity: sha512-CIx7NiP+n5WHBCG/fDNaUPP4qbQ5CIa8XIHZE3HpfS/rb2vmSIsp74BxsZyrrGKF0vHW3GoToqP3l0hzrMTecw==, + integrity: sha512-8QUYfRcYzNlYuzKPfge1UWC6nF9ym0lx7mpGVPJYNhddxEf3DD0+kU07NTL0sXuiT2HuJuKr/iEO8WvXvT0RSQ==, } peerDependencies: typescript: "*" peerDependenciesMeta: typescript: optional: true - dependencies: - "@vue/compiler-dom": 3.4.22 - "@vue/compiler-sfc": 3.4.22 - "@vue/runtime-dom": 3.4.22 - "@vue/server-renderer": 3.4.22(vue@3.4.22) - "@vue/shared": 3.4.22 - typescript: 5.4.4 - /vuetify@3.5.15(typescript@5.4.4)(vite-plugin-vuetify@2.0.3)(vue@3.4.22): + vuetify@3.6.10: resolution: { - integrity: sha512-4v+t3yjgZ5M4+YKRK2eOxymWU34/Sg8YP6Dqi4ZMYFjchiwijOns1WW4ywYlYXih0TSPVeAeQpCzztDu89nTyg==, + integrity: sha512-Myd9+EFq4Gmu61yKPNVS0QdGQkcZ9cHom27wuvRw7jgDxM+X4MT9BwQRk/Dt1q3G3JlK8oh+ZYyq5Ps/Z73cMg==, } engines: { node: ^12.20 || >=14.13 } peerDependencies: @@ -1719,57 +1271,46 @@ packages: optional: true webpack-plugin-vuetify: optional: true - dependencies: - typescript: 5.4.4 - vite-plugin-vuetify: 2.0.3(vite@5.2.9)(vue@3.4.22)(vuetify@3.5.15) - vue: 3.4.22(typescript@5.4.4) - /w3c-xmlserializer@4.0.0: + w3c-xmlserializer@5.0.0: resolution: { - integrity: sha512-d+BFHzbiCx6zGfz0HyQ6Rg69w9k19nviJspaj4yNscGjrHu94sVP+aRm75yEbCh+r2/yR+7q6hux9LVtbuTGBw==, + integrity: sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==, } - engines: { node: ">=14" } - dependencies: - xml-name-validator: 4.0.0 + engines: { node: ">=18" } - /webidl-conversions@7.0.0: + webidl-conversions@7.0.0: resolution: { integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==, } engines: { node: ">=12" } - /whatwg-encoding@2.0.0: + whatwg-encoding@3.1.1: resolution: { - integrity: sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==, + integrity: sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==, } - engines: { node: ">=12" } - dependencies: - iconv-lite: 0.6.3 + engines: { node: ">=18" } - /whatwg-mimetype@3.0.0: + whatwg-mimetype@4.0.0: resolution: { - integrity: sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==, + integrity: sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==, } - engines: { node: ">=12" } + engines: { node: ">=18" } - /whatwg-url@12.0.1: + whatwg-url@14.0.0: resolution: { - integrity: sha512-Ed/LrqB8EPlGxjS+TrsXcpUond1mhccS3pchLhzSgPCnTimUCKj3IZE75pAs5m6heB2U2TMerKFUXheyHY+VDQ==, + integrity: sha512-1lfMEm2IEr7RIV+f4lUNPOqfFL+pO+Xw3fJSqmjX9AbXcXcYOkCe1P6+9VBZB6n94af16NfZf+sSk0JCBZC9aw==, } - engines: { node: ">=14" } - dependencies: - tr46: 4.1.1 - webidl-conversions: 7.0.0 + engines: { node: ">=18" } - /ws@8.16.0: + ws@8.17.1: resolution: { - integrity: sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==, + integrity: sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==, } engines: { node: ">=10.0.0" } peerDependencies: @@ -1781,22 +1322,704 @@ packages: utf-8-validate: optional: true - /xml-name-validator@4.0.0: + xml-name-validator@5.0.0: resolution: { - integrity: sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==, + integrity: sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==, } - engines: { node: ">=12" } + engines: { node: ">=18" } - /xmlchars@2.2.0: + xmlchars@2.2.0: resolution: { integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==, } - /yallist@4.0.0: - resolution: - { - integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==, - } - dev: true +snapshots: + "@babel/helper-string-parser@7.24.7": {} + + "@babel/helper-validator-identifier@7.24.7": {} + + "@babel/parser@7.24.7": + dependencies: + "@babel/types": 7.24.7 + + "@babel/types@7.24.7": + dependencies: + "@babel/helper-string-parser": 7.24.7 + "@babel/helper-validator-identifier": 7.24.7 + to-fast-properties: 2.0.0 + + "@blockly/theme-dark@7.0.1(blockly@11.1.1)": + dependencies: + blockly: 11.1.1 + + "@esbuild/aix-ppc64@0.21.5": + optional: true + + "@esbuild/android-arm64@0.21.5": + optional: true + + "@esbuild/android-arm@0.21.5": + optional: true + + "@esbuild/android-x64@0.21.5": + optional: true + + "@esbuild/darwin-arm64@0.21.5": + optional: true + + "@esbuild/darwin-x64@0.21.5": + optional: true + + "@esbuild/freebsd-arm64@0.21.5": + optional: true + + "@esbuild/freebsd-x64@0.21.5": + optional: true + + "@esbuild/linux-arm64@0.21.5": + optional: true + + "@esbuild/linux-arm@0.21.5": + optional: true + + "@esbuild/linux-ia32@0.21.5": + optional: true + + "@esbuild/linux-loong64@0.21.5": + optional: true + + "@esbuild/linux-mips64el@0.21.5": + optional: true + + "@esbuild/linux-ppc64@0.21.5": + optional: true + + "@esbuild/linux-riscv64@0.21.5": + optional: true + + "@esbuild/linux-s390x@0.21.5": + optional: true + + "@esbuild/linux-x64@0.21.5": + optional: true + + "@esbuild/netbsd-x64@0.21.5": + optional: true + + "@esbuild/openbsd-x64@0.21.5": + optional: true + + "@esbuild/sunos-x64@0.21.5": + optional: true + + "@esbuild/win32-arm64@0.21.5": + optional: true + + "@esbuild/win32-ia32@0.21.5": + optional: true + + "@esbuild/win32-x64@0.21.5": + optional: true + + "@highlightjs/vue-plugin@2.1.0(highlight.js@11.9.0)(vue@3.4.29(typescript@5.5.2))": + dependencies: + highlight.js: 11.9.0 + vue: 3.4.29(typescript@5.5.2) + + "@jridgewell/sourcemap-codec@1.4.15": {} + + "@mdi/js@7.4.47": {} + + "@nodelib/fs.scandir@2.1.5": + dependencies: + "@nodelib/fs.stat": 2.0.5 + run-parallel: 1.2.0 + + "@nodelib/fs.stat@2.0.5": {} + + "@nodelib/fs.walk@1.2.8": + dependencies: + "@nodelib/fs.scandir": 2.1.5 + fastq: 1.17.1 + + "@rollup/rollup-android-arm-eabi@4.18.0": + optional: true + + "@rollup/rollup-android-arm64@4.18.0": + optional: true + + "@rollup/rollup-darwin-arm64@4.18.0": + optional: true + + "@rollup/rollup-darwin-x64@4.18.0": + optional: true + + "@rollup/rollup-linux-arm-gnueabihf@4.18.0": + optional: true + + "@rollup/rollup-linux-arm-musleabihf@4.18.0": + optional: true + + "@rollup/rollup-linux-arm64-gnu@4.18.0": + optional: true + + "@rollup/rollup-linux-arm64-musl@4.18.0": + optional: true + + "@rollup/rollup-linux-powerpc64le-gnu@4.18.0": + optional: true + + "@rollup/rollup-linux-riscv64-gnu@4.18.0": + optional: true + + "@rollup/rollup-linux-s390x-gnu@4.18.0": + optional: true + + "@rollup/rollup-linux-x64-gnu@4.18.0": + optional: true + + "@rollup/rollup-linux-x64-musl@4.18.0": + optional: true + + "@rollup/rollup-win32-arm64-msvc@4.18.0": + optional: true + + "@rollup/rollup-win32-ia32-msvc@4.18.0": + optional: true + + "@rollup/rollup-win32-x64-msvc@4.18.0": + optional: true + + "@types/estree@1.0.5": {} + + "@vitejs/plugin-vue@5.0.5(vite@5.3.1(sass@1.77.6))(vue@3.4.29(typescript@5.5.2))": + dependencies: + vite: 5.3.1(sass@1.77.6) + vue: 3.4.29(typescript@5.5.2) + + "@volar/language-core@2.3.0": + dependencies: + "@volar/source-map": 2.3.0 + + "@volar/source-map@2.3.0": + dependencies: + muggle-string: 0.4.1 + + "@volar/typescript@2.3.0": + dependencies: + "@volar/language-core": 2.3.0 + path-browserify: 1.0.1 + vscode-uri: 3.0.8 + + "@vue/compiler-core@3.4.29": + dependencies: + "@babel/parser": 7.24.7 + "@vue/shared": 3.4.29 + entities: 4.5.0 + estree-walker: 2.0.2 + source-map-js: 1.2.0 + + "@vue/compiler-dom@3.4.29": + dependencies: + "@vue/compiler-core": 3.4.29 + "@vue/shared": 3.4.29 + + "@vue/compiler-sfc@3.4.29": + dependencies: + "@babel/parser": 7.24.7 + "@vue/compiler-core": 3.4.29 + "@vue/compiler-dom": 3.4.29 + "@vue/compiler-ssr": 3.4.29 + "@vue/shared": 3.4.29 + estree-walker: 2.0.2 + magic-string: 0.30.10 + postcss: 8.4.38 + source-map-js: 1.2.0 + + "@vue/compiler-ssr@3.4.29": + dependencies: + "@vue/compiler-dom": 3.4.29 + "@vue/shared": 3.4.29 + + "@vue/language-core@2.0.21(typescript@5.5.2)": + dependencies: + "@volar/language-core": 2.3.0 + "@vue/compiler-dom": 3.4.29 + "@vue/shared": 3.4.29 + computeds: 0.0.1 + minimatch: 9.0.4 + path-browserify: 1.0.1 + vue-template-compiler: 2.7.16 + optionalDependencies: + typescript: 5.5.2 + + "@vue/reactivity@3.4.29": + dependencies: + "@vue/shared": 3.4.29 + + "@vue/runtime-core@3.4.29": + dependencies: + "@vue/reactivity": 3.4.29 + "@vue/shared": 3.4.29 + + "@vue/runtime-dom@3.4.29": + dependencies: + "@vue/reactivity": 3.4.29 + "@vue/runtime-core": 3.4.29 + "@vue/shared": 3.4.29 + csstype: 3.1.3 + + "@vue/server-renderer@3.4.29(vue@3.4.29(typescript@5.5.2))": + dependencies: + "@vue/compiler-ssr": 3.4.29 + "@vue/shared": 3.4.29 + vue: 3.4.29(typescript@5.5.2) + + "@vue/shared@3.4.29": {} + + "@vuetify/loader-shared@2.0.3(vue@3.4.29(typescript@5.5.2))(vuetify@3.6.10(typescript@5.5.2)(vite-plugin-vuetify@2.0.3)(vue@3.4.29(typescript@5.5.2)))": + dependencies: + upath: 2.0.1 + vue: 3.4.29(typescript@5.5.2) + vuetify: 3.6.10(typescript@5.5.2)(vite-plugin-vuetify@2.0.3)(vue@3.4.29(typescript@5.5.2)) + + agent-base@7.1.1: + dependencies: + debug: 4.3.5 + transitivePeerDependencies: + - supports-color + + anymatch@3.1.3: + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + + asynckit@0.4.0: {} + + balanced-match@1.0.2: {} + + binary-extensions@2.3.0: {} + + blockly@11.1.1: + dependencies: + jsdom: 23.0.0 + transitivePeerDependencies: + - bufferutil + - canvas + - supports-color + - utf-8-validate + + brace-expansion@2.0.1: + dependencies: + balanced-match: 1.0.2 + + braces@3.0.3: + dependencies: + fill-range: 7.1.1 + + chokidar@3.6.0: + dependencies: + anymatch: 3.1.3 + braces: 3.0.3 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.3 + + combined-stream@1.0.8: + dependencies: + delayed-stream: 1.0.0 + + computeds@0.0.1: {} + + cssstyle@3.0.0: + dependencies: + rrweb-cssom: 0.6.0 + + csstype@3.1.3: {} + + data-urls@5.0.0: + dependencies: + whatwg-mimetype: 4.0.0 + whatwg-url: 14.0.0 + + de-indent@1.0.2: {} + + debug@4.3.5: + dependencies: + ms: 2.1.2 + + decimal.js@10.4.3: {} + + delayed-stream@1.0.0: {} + + entities@4.5.0: {} + + esbuild@0.21.5: + optionalDependencies: + "@esbuild/aix-ppc64": 0.21.5 + "@esbuild/android-arm": 0.21.5 + "@esbuild/android-arm64": 0.21.5 + "@esbuild/android-x64": 0.21.5 + "@esbuild/darwin-arm64": 0.21.5 + "@esbuild/darwin-x64": 0.21.5 + "@esbuild/freebsd-arm64": 0.21.5 + "@esbuild/freebsd-x64": 0.21.5 + "@esbuild/linux-arm": 0.21.5 + "@esbuild/linux-arm64": 0.21.5 + "@esbuild/linux-ia32": 0.21.5 + "@esbuild/linux-loong64": 0.21.5 + "@esbuild/linux-mips64el": 0.21.5 + "@esbuild/linux-ppc64": 0.21.5 + "@esbuild/linux-riscv64": 0.21.5 + "@esbuild/linux-s390x": 0.21.5 + "@esbuild/linux-x64": 0.21.5 + "@esbuild/netbsd-x64": 0.21.5 + "@esbuild/openbsd-x64": 0.21.5 + "@esbuild/sunos-x64": 0.21.5 + "@esbuild/win32-arm64": 0.21.5 + "@esbuild/win32-ia32": 0.21.5 + "@esbuild/win32-x64": 0.21.5 + + estree-walker@2.0.2: {} + + fast-glob@3.3.2: + dependencies: + "@nodelib/fs.stat": 2.0.5 + "@nodelib/fs.walk": 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.7 + + fastq@1.17.1: + dependencies: + reusify: 1.0.4 + + fill-range@7.1.1: + dependencies: + to-regex-range: 5.0.1 + + form-data@4.0.0: + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + mime-types: 2.1.35 + + fs-extra@11.2.0: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 6.1.0 + universalify: 2.0.1 + + fsevents@2.3.3: + optional: true + + glob-parent@5.1.2: + dependencies: + is-glob: 4.0.3 + + graceful-fs@4.2.11: {} + + he@1.2.0: {} + + highlight.js@11.9.0: {} + + html-encoding-sniffer@4.0.0: + dependencies: + whatwg-encoding: 3.1.1 + + http-proxy-agent@7.0.2: + dependencies: + agent-base: 7.1.1 + debug: 4.3.5 + transitivePeerDependencies: + - supports-color + + https-proxy-agent@7.0.4: + dependencies: + agent-base: 7.1.1 + debug: 4.3.5 + transitivePeerDependencies: + - supports-color + + iconv-lite@0.6.3: + dependencies: + safer-buffer: 2.1.2 + + immutable@4.3.6: {} + + is-binary-path@2.1.0: + dependencies: + binary-extensions: 2.3.0 + + is-extglob@2.1.1: {} + + is-glob@4.0.3: + dependencies: + is-extglob: 2.1.1 + + is-number@7.0.0: {} + + is-potential-custom-element-name@1.0.1: {} + + jsdom@23.0.0: + dependencies: + cssstyle: 3.0.0 + data-urls: 5.0.0 + decimal.js: 10.4.3 + form-data: 4.0.0 + html-encoding-sniffer: 4.0.0 + http-proxy-agent: 7.0.2 + https-proxy-agent: 7.0.4 + is-potential-custom-element-name: 1.0.1 + nwsapi: 2.2.10 + parse5: 7.1.2 + rrweb-cssom: 0.6.0 + saxes: 6.0.0 + symbol-tree: 3.2.4 + tough-cookie: 4.1.4 + w3c-xmlserializer: 5.0.0 + webidl-conversions: 7.0.0 + whatwg-encoding: 3.1.1 + whatwg-mimetype: 4.0.0 + whatwg-url: 14.0.0 + ws: 8.17.1 + xml-name-validator: 5.0.0 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + jsonfile@6.1.0: + dependencies: + universalify: 2.0.1 + optionalDependencies: + graceful-fs: 4.2.11 + + magic-string@0.30.10: + dependencies: + "@jridgewell/sourcemap-codec": 1.4.15 + + merge2@1.4.1: {} + + micromatch@4.0.7: + dependencies: + braces: 3.0.3 + picomatch: 2.3.1 + + mime-db@1.52.0: {} + + mime-types@2.1.35: + dependencies: + mime-db: 1.52.0 + + minimatch@9.0.4: + dependencies: + brace-expansion: 2.0.1 + + ms@2.1.2: {} + + muggle-string@0.4.1: {} + + nanoid@3.3.7: {} + + normalize-path@3.0.0: {} + + nwsapi@2.2.10: {} + + parse5@7.1.2: + dependencies: + entities: 4.5.0 + + path-browserify@1.0.1: {} + + picocolors@1.0.1: {} + + picomatch@2.3.1: {} + + postcss@8.4.38: + dependencies: + nanoid: 3.3.7 + picocolors: 1.0.1 + source-map-js: 1.2.0 + + prettier@3.3.2: {} + + psl@1.9.0: {} + + punycode@2.3.1: {} + + querystringify@2.2.0: {} + + queue-microtask@1.2.3: {} + + readdirp@3.6.0: + dependencies: + picomatch: 2.3.1 + + requires-port@1.0.0: {} + + reusify@1.0.4: {} + + rollup@4.18.0: + dependencies: + "@types/estree": 1.0.5 + optionalDependencies: + "@rollup/rollup-android-arm-eabi": 4.18.0 + "@rollup/rollup-android-arm64": 4.18.0 + "@rollup/rollup-darwin-arm64": 4.18.0 + "@rollup/rollup-darwin-x64": 4.18.0 + "@rollup/rollup-linux-arm-gnueabihf": 4.18.0 + "@rollup/rollup-linux-arm-musleabihf": 4.18.0 + "@rollup/rollup-linux-arm64-gnu": 4.18.0 + "@rollup/rollup-linux-arm64-musl": 4.18.0 + "@rollup/rollup-linux-powerpc64le-gnu": 4.18.0 + "@rollup/rollup-linux-riscv64-gnu": 4.18.0 + "@rollup/rollup-linux-s390x-gnu": 4.18.0 + "@rollup/rollup-linux-x64-gnu": 4.18.0 + "@rollup/rollup-linux-x64-musl": 4.18.0 + "@rollup/rollup-win32-arm64-msvc": 4.18.0 + "@rollup/rollup-win32-ia32-msvc": 4.18.0 + "@rollup/rollup-win32-x64-msvc": 4.18.0 + fsevents: 2.3.3 + + rrweb-cssom@0.6.0: {} + + run-parallel@1.2.0: + dependencies: + queue-microtask: 1.2.3 + + safer-buffer@2.1.2: {} + + sass@1.77.6: + dependencies: + chokidar: 3.6.0 + immutable: 4.3.6 + source-map-js: 1.2.0 + + saxes@6.0.0: + dependencies: + xmlchars: 2.2.0 + + semver@7.6.2: {} + + source-map-js@1.2.0: {} + + symbol-tree@3.2.4: {} + + to-fast-properties@2.0.0: {} + + to-regex-range@5.0.1: + dependencies: + is-number: 7.0.0 + + tough-cookie@4.1.4: + dependencies: + psl: 1.9.0 + punycode: 2.3.1 + universalify: 0.2.0 + url-parse: 1.5.10 + + tr46@5.0.0: + dependencies: + punycode: 2.3.1 + + typescript@5.5.2: {} + + universalify@0.2.0: {} + + universalify@2.0.1: {} + + upath@2.0.1: {} + + url-parse@1.5.10: + dependencies: + querystringify: 2.2.0 + requires-port: 1.0.0 + + vite-plugin-static-copy@1.0.5(vite@5.3.1(sass@1.77.6)): + dependencies: + chokidar: 3.6.0 + fast-glob: 3.3.2 + fs-extra: 11.2.0 + picocolors: 1.0.1 + vite: 5.3.1(sass@1.77.6) + + vite-plugin-vuetify@2.0.3(vite@5.3.1(sass@1.77.6))(vue@3.4.29(typescript@5.5.2))(vuetify@3.6.10): + dependencies: + "@vuetify/loader-shared": 2.0.3(vue@3.4.29(typescript@5.5.2))(vuetify@3.6.10(typescript@5.5.2)(vite-plugin-vuetify@2.0.3)(vue@3.4.29(typescript@5.5.2))) + debug: 4.3.5 + upath: 2.0.1 + vite: 5.3.1(sass@1.77.6) + vue: 3.4.29(typescript@5.5.2) + vuetify: 3.6.10(typescript@5.5.2)(vite-plugin-vuetify@2.0.3)(vue@3.4.29(typescript@5.5.2)) + transitivePeerDependencies: + - supports-color + + vite@5.3.1(sass@1.77.6): + dependencies: + esbuild: 0.21.5 + postcss: 8.4.38 + rollup: 4.18.0 + optionalDependencies: + fsevents: 2.3.3 + sass: 1.77.6 + + vscode-uri@3.0.8: {} + + vue-template-compiler@2.7.16: + dependencies: + de-indent: 1.0.2 + he: 1.2.0 + + vue-tsc@2.0.21(typescript@5.5.2): + dependencies: + "@volar/typescript": 2.3.0 + "@vue/language-core": 2.0.21(typescript@5.5.2) + semver: 7.6.2 + typescript: 5.5.2 + + vue@3.4.29(typescript@5.5.2): + dependencies: + "@vue/compiler-dom": 3.4.29 + "@vue/compiler-sfc": 3.4.29 + "@vue/runtime-dom": 3.4.29 + "@vue/server-renderer": 3.4.29(vue@3.4.29(typescript@5.5.2)) + "@vue/shared": 3.4.29 + optionalDependencies: + typescript: 5.5.2 + + vuetify@3.6.10(typescript@5.5.2)(vite-plugin-vuetify@2.0.3)(vue@3.4.29(typescript@5.5.2)): + dependencies: + vue: 3.4.29(typescript@5.5.2) + optionalDependencies: + typescript: 5.5.2 + vite-plugin-vuetify: 2.0.3(vite@5.3.1(sass@1.77.6))(vue@3.4.29(typescript@5.5.2))(vuetify@3.6.10) + + w3c-xmlserializer@5.0.0: + dependencies: + xml-name-validator: 5.0.0 + + webidl-conversions@7.0.0: {} + + whatwg-encoding@3.1.1: + dependencies: + iconv-lite: 0.6.3 + + whatwg-mimetype@4.0.0: {} + + whatwg-url@14.0.0: + dependencies: + tr46: 5.0.0 + webidl-conversions: 7.0.0 + + ws@8.17.1: {} + + xml-name-validator@5.0.0: {} + + xmlchars@2.2.0: {} From 304f3fee80db5929d76bd3b5bc1139537de4e82b Mon Sep 17 00:00:00 2001 From: mobyw Date: Thu, 8 Aug 2024 22:46:13 +0800 Subject: [PATCH 03/19] :label: Migrate to TypeScript --- packages/app/src/blocks/blocks.js | 4 - packages/app/src/blocks/index.ts | 10 + packages/app/src/blocks/nonebot_matcher.js | 47 --- packages/app/src/blocks/nonebot_matcher.ts | 25 ++ packages/app/src/components/ContentCard.vue | 34 +- packages/app/src/components/ContentPage.vue | 1 - packages/app/src/data/default.json | 95 +---- packages/app/src/data/toolbox.json | 366 ------------------ packages/app/src/generators/index.ts | 3 + packages/app/src/generators/javascript.ts | 38 -- .../app/src/generators/nonebot_matcher.ts | 22 ++ packages/app/src/toolbox.ts | 283 ++++++++++++++ packages/app/src/workspaces/index.vue | 11 +- 13 files changed, 373 insertions(+), 566 deletions(-) delete mode 100644 packages/app/src/blocks/blocks.js create mode 100644 packages/app/src/blocks/index.ts delete mode 100644 packages/app/src/blocks/nonebot_matcher.js create mode 100644 packages/app/src/blocks/nonebot_matcher.ts delete mode 100644 packages/app/src/data/toolbox.json create mode 100644 packages/app/src/generators/index.ts delete mode 100644 packages/app/src/generators/javascript.ts create mode 100644 packages/app/src/generators/nonebot_matcher.ts create mode 100644 packages/app/src/toolbox.ts diff --git a/packages/app/src/blocks/blocks.js b/packages/app/src/blocks/blocks.js deleted file mode 100644 index fa85219..0000000 --- a/packages/app/src/blocks/blocks.js +++ /dev/null @@ -1,4 +0,0 @@ -import "./python_dict.js"; -import "./nonebot_matcher.js"; -import "./nonebot_handle.js"; -import "./nonebot_message.js"; diff --git a/packages/app/src/blocks/index.ts b/packages/app/src/blocks/index.ts new file mode 100644 index 0000000..f96c5f5 --- /dev/null +++ b/packages/app/src/blocks/index.ts @@ -0,0 +1,10 @@ +import * as Blockly from "blockly/core"; + +// import "./python_dict.js"; +import { nonebotOnCommand } from "./nonebot_matcher"; +// import "./nonebot_handle.js"; +// import "./nonebot_message.js"; + +export const blocks = Blockly.common.createBlockDefinitionsFromJsonArray([ + nonebotOnCommand, +]); diff --git a/packages/app/src/blocks/nonebot_matcher.js b/packages/app/src/blocks/nonebot_matcher.js deleted file mode 100644 index 084d435..0000000 --- a/packages/app/src/blocks/nonebot_matcher.js +++ /dev/null @@ -1,47 +0,0 @@ -import * as Blockly from "blockly/core"; -import { pythonGenerator, Order } from "blockly/python"; - -Blockly.defineBlocksWithJsonArray([ - { - type: "nb_on_command", - message0: "创建指令响应器 %1 %2 与我相关 %3", - args0: [ - { - type: "field_input", - name: "CMD", - text: "指令", - }, - { - type: "input_dummy", - }, - { - type: "field_checkbox", - name: "TO_ME", - checked: false, - }, - ], - inputsInline: true, - output: "Matcher", - colour: 20, - tooltip: - "请在第一个格子中填写命令触发词;若勾选“与我相关”,只有在私聊、群聊中@或回复、消息以机器人名字开始或结束时会触发", - helpUrl: "https://nonebot.dev/docs/next/advanced/matcher#command", - }, -]); - -// The following is for the Python generator - -pythonGenerator.forBlock["nb_on_command"] = function (block, generator) { - const text_cmd = block.getFieldValue("CMD"); - const checkbox_to_me = block.getFieldValue("TO_ME") === "TRUE"; - let to_me_statement = ""; - generator.definitions_["from_nonebot_plugin_import_on_command"] = - "from nonebot.plugin import on_command"; - if (checkbox_to_me) { - generator.definitions_["from_nonebot_rule_import_on_command"] = - "from nonebot.rule import to_me"; - to_me_statement = ", rule=to_me()"; - } - let code = `on_command("${text_cmd}"${to_me_statement})`; - return [code, Order.NONE]; -}; diff --git a/packages/app/src/blocks/nonebot_matcher.ts b/packages/app/src/blocks/nonebot_matcher.ts new file mode 100644 index 0000000..35106ea --- /dev/null +++ b/packages/app/src/blocks/nonebot_matcher.ts @@ -0,0 +1,25 @@ +export const nonebotOnCommand = { + type: "nonebot_on_command", + message0: "创建指令响应器 %1 %2 与我相关 %3", + args0: [ + { + type: "field_input", + name: "CMD", + text: "指令", + }, + { + type: "input_dummy", + }, + { + type: "field_checkbox", + name: "TO_ME", + checked: false, + }, + ], + inputsInline: true, + output: "Matcher", + colour: 20, + tooltip: + "请在第一个格子中填写命令触发词;若勾选“与我相关”,只有在私聊、群聊中@或回复、消息以机器人名字开始或结束时会触发", + helpUrl: "https://nonebot.dev/docs/next/advanced/matcher#command", +}; diff --git a/packages/app/src/components/ContentCard.vue b/packages/app/src/components/ContentCard.vue index 1e474fb..bfb903c 100644 --- a/packages/app/src/components/ContentCard.vue +++ b/packages/app/src/components/ContentCard.vue @@ -12,24 +12,22 @@ - - - - - - - - - + + + + + + + + - - - - - - - - + + + + + + + @@ -41,7 +39,7 @@ overflow: hidden; } -.ps-content-card { +.content-card { padding-bottom: 1.4rem; width: 100%; overflow: hidden; diff --git a/packages/app/src/components/ContentPage.vue b/packages/app/src/components/ContentPage.vue index 9965e9c..029a5b8 100644 --- a/packages/app/src/components/ContentPage.vue +++ b/packages/app/src/components/ContentPage.vue @@ -15,7 +15,6 @@ import ButtonPanel from "@/components/ButtonPanel.vue"; - diff --git a/packages/app/src/data/default.json b/packages/app/src/data/default.json index 04bd3f1..79c4d86 100644 --- a/packages/app/src/data/default.json +++ b/packages/app/src/data/default.json @@ -3,96 +3,11 @@ "languageVersion": 0, "blocks": [ { - "type": "nb_handle", - "id": "xqk)rwW.*|,ReCZ7GN34", - "x": 70, - "y": 170, - "inputs": { - "MATCHER": { - "block": { - "type": "nb_on_command", - "id": "5PM+dBPat=SWc/YmHpk9", - "fields": { "CMD": "hello", "TO_ME": true } - } - }, - "HANDLE": { - "block": { - "type": "nb_message_send", - "id": "D`1oS0TX)2cFc+=.~t6(", - "inline": false, - "fields": { "REPLY": false, "AT": true }, - "inputs": { - "MESSAGE": { - "block": { - "type": "nb_message_text", - "id": "[]0ZT%EDhXarR826.C*H", - "fields": { "TEXT": "world" } - } - } - }, - "next": { - "block": { - "type": "nb_message_send", - "id": "?Dzq2xds$frA|StTBDFb", - "inline": false, - "fields": { "REPLY": false, "AT": false }, - "inputs": { - "MESSAGE": { - "block": { - "type": "nb_message_image", - "id": "jhcN}f}wm;3~P?v|tgXs", - "fields": { - "TYPE": "url", - "IMAGE": "https://img.moehu.org/pic.php?id=acgbs" - } - } - } - }, - "next": { - "block": { - "type": "nb_message_finish", - "id": "]b`}K:z^KKzyMDq9uEQF", - "inline": false, - "fields": { "REPLY": true, "AT": false }, - "inputs": { - "MESSAGE": { - "block": { - "type": "nb_message_merge", - "id": "_%9=l/G=r#,Iv;U|LSRj", - "extraState": { "itemCount": 3 }, - "inputs": { - "MESSAGE0": { - "block": { - "type": "nb_message_text", - "id": "J2Q:AACuy/oR9q?Em~(B", - "fields": { "TEXT": "hello" } - } - }, - "MESSAGE1": { - "block": { - "type": "nb_message_text", - "id": "2cI-I-{p52RzJ5.P,nii", - "fields": { "TEXT": ", " } - } - }, - "MESSAGE2": { - "block": { - "type": "nb_message_text", - "id": "QtldsFC_-rC;mlebK[Ns", - "fields": { "TEXT": "world" } - } - } - } - } - } - } - } - } - } - } - } - } - } + "type": "nonebot_on_command", + "id": "y$HwnY`3dr4Lk=5D7D18", + "x": 330, + "y": 250, + "fields": { "CMD": "指令", "TO_ME": false } } ] } diff --git a/packages/app/src/data/toolbox.json b/packages/app/src/data/toolbox.json deleted file mode 100644 index 6f37628..0000000 --- a/packages/app/src/data/toolbox.json +++ /dev/null @@ -1,366 +0,0 @@ -{ - "contents": [ - { - "kind": "CATEGORY", - "contents": [ - { - "kind": "BLOCK", - "type": "controls_if" - }, - { - "kind": "BLOCK", - "type": "logic_compare" - }, - { - "kind": "BLOCK", - "type": "logic_operation" - }, - { - "kind": "BLOCK", - "type": "logic_negate" - }, - { - "kind": "BLOCK", - "type": "logic_boolean" - }, - { - "kind": "BLOCK", - "type": "logic_null", - "disabled": "true" - }, - { - "kind": "BLOCK", - "type": "logic_ternary" - } - ], - "name": "逻辑", - "categorystyle": "logic_category" - }, - { - "kind": "CATEGORY", - "contents": [ - { - "kind": "BLOCK", - "type": "controls_repeat_ext" - }, - { - "kind": "BLOCK", - "type": "controls_repeat" - }, - { - "kind": "BLOCK", - "type": "controls_whileUntil" - }, - { - "kind": "BLOCK", - "type": "controls_for" - }, - { - "kind": "BLOCK", - "type": "controls_forEach" - }, - { - "kind": "BLOCK", - "type": "controls_flow_statements" - } - ], - "name": "循环", - "categorystyle": "loop_category" - }, - { - "kind": "CATEGORY", - "contents": [ - { - "kind": "BLOCK", - "type": "math_number", - "gap": "32" - }, - { - "kind": "BLOCK", - "type": "math_arithmetic" - }, - { - "kind": "BLOCK", - "type": "math_single" - }, - { - "kind": "BLOCK", - "type": "math_trig" - }, - { - "kind": "BLOCK", - "type": "math_constant" - }, - { - "kind": "BLOCK", - "type": "math_number_property" - }, - { - "kind": "BLOCK", - "type": "math_round" - }, - { - "kind": "BLOCK", - "type": "math_on_list" - }, - { - "kind": "BLOCK", - "type": "math_modulo" - }, - { - "kind": "BLOCK", - "type": "math_constrain" - }, - { - "kind": "BLOCK", - "type": "math_random_int" - }, - { - "kind": "BLOCK", - "type": "math_random_float" - }, - { - "kind": "BLOCK", - "type": "math_atan2" - } - ], - "name": "数学", - "categorystyle": "math_category" - }, - { - "kind": "CATEGORY", - "contents": [ - { - "kind": "BLOCK", - "type": "text" - }, - { - "kind": "BLOCK", - "type": "text_multiline" - }, - { - "kind": "BLOCK", - "type": "text_join" - }, - { - "kind": "BLOCK", - "type": "text_append" - }, - { - "kind": "BLOCK", - "type": "text_length" - }, - { - "kind": "BLOCK", - "type": "text_isEmpty" - }, - { - "kind": "BLOCK", - "type": "text_indexOf" - }, - { - "kind": "BLOCK", - "type": "text_charAt" - }, - { - "kind": "BLOCK", - "type": "text_getSubstring" - }, - { - "kind": "BLOCK", - "type": "text_changeCase" - }, - { - "kind": "BLOCK", - "type": "text_trim" - }, - { - "kind": "BLOCK", - "type": "text_count" - }, - { - "kind": "BLOCK", - "type": "text_replace" - }, - { - "kind": "BLOCK", - "type": "text_reverse" - } - ], - "name": "文本", - "categorystyle": "text_category" - }, - { - "kind": "CATEGORY", - "contents": [ - { - "kind": "BLOCK", - "type": "lists_create_with" - }, - { - "kind": "BLOCK", - "type": "lists_repeat" - }, - { - "kind": "BLOCK", - "type": "lists_length" - }, - { - "kind": "BLOCK", - "type": "lists_isEmpty" - }, - { - "kind": "BLOCK", - "type": "lists_indexOf" - }, - { - "kind": "BLOCK", - "type": "lists_getIndex" - }, - { - "kind": "BLOCK", - "type": "lists_setIndex" - }, - { - "kind": "BLOCK", - "type": "lists_getSublist" - }, - { - "kind": "BLOCK", - "type": "lists_split" - }, - { - "kind": "BLOCK", - "type": "lists_sort" - }, - { - "kind": "BLOCK", - "type": "lists_reverse" - } - ], - "name": "列表", - "categorystyle": "list_category" - }, - { - "kind": "CATEGORY", - "contents": [ - { - "kind": "BLOCK", - "type": "dicts_create_with" - }, - { - "kind": "BLOCK", - "type": "dicts_get" - } - ], - "name": "字典", - "colour": "0" - }, - { - "kind": "SEP" - }, - { - "kind": "CATEGORY", - "contents": [ - { - "kind": "LABEL", - "text": "需要填入“事件处理”类模块的“响应器”中" - }, - { - "kind": "LABEL", - "text": "也可以创建一个变量赋值,使用变量传递" - }, - { - "kind": "BLOCK", - "type": "nb_on_command" - } - ], - "name": "事件响应器", - "colour": "20" - }, - { - "kind": "CATEGORY", - "contents": [ - { - "kind": "LABEL", - "text": "需要填入“事件响应器”模块或对应的变量" - }, - { - "kind": "BLOCK", - "type": "nb_handle" - } - ], - "name": "事件处理", - "colour": "60" - }, - { - "kind": "CATEGORY", - "contents": [ - { - "kind": "LABEL", - "text": "通过以下模块构造消息" - }, - { - "kind": "BLOCK", - "type": "nb_message_text" - }, - { - "kind": "BLOCK", - "type": "nb_message_image" - }, - { - "kind": "LABEL", - "text": "通过以下模块发送消息" - }, - { - "kind": "BLOCK", - "type": "nb_message_send" - }, - { - "kind": "BLOCK", - "type": "nb_message_finish" - }, - { - "kind": "LABEL", - "text": "通过以下模块处理消息" - }, - { - "kind": "BLOCK", - "type": "nb_message_merge" - } - ], - "name": "消息构造与发送", - "colour": "100" - }, - { - "kind": "CATEGORY", - "contents": [], - "name": "消息处理", - "colour": "140" - }, - { - "kind": "CATEGORY", - "contents": [], - "name": "调试信息", - "colour": "180" - }, - { - "kind": "SEP" - }, - { - "kind": "CATEGORY", - "name": "变量", - "categorystyle": "variable_category", - "custom": "VARIABLE" - }, - { - "kind": "CATEGORY", - "name": "函数", - "categorystyle": "procedure_category", - "custom": "PROCEDURE" - } - ], - "xmlns": "https://developers.google.com/blockly/xml", - "id": "toolbox-categories", - "style": "display: none" -} diff --git a/packages/app/src/generators/index.ts b/packages/app/src/generators/index.ts new file mode 100644 index 0000000..d7549b3 --- /dev/null +++ b/packages/app/src/generators/index.ts @@ -0,0 +1,3 @@ +import { forBlock as nonebotMatcherBlock } from "./nonebot_matcher"; + +export const generators = [nonebotMatcherBlock]; diff --git a/packages/app/src/generators/javascript.ts b/packages/app/src/generators/javascript.ts deleted file mode 100644 index c9ad55c..0000000 --- a/packages/app/src/generators/javascript.ts +++ /dev/null @@ -1,38 +0,0 @@ -/** - * @license - * Copyright 2023 Google LLC - * SPDX-License-Identifier: Apache-2.0 - */ - -import { Order } from "blockly/javascript"; -import * as Blockly from "blockly/core"; - -// Export all the code generators for our custom blocks, -// but don't register them with Blockly yet. -// This file has no side effects! -export const forBlock = Object.create(null); - -forBlock["add_text"] = function ( - block: Blockly.Block, - generator: Blockly.CodeGenerator, -) { - const text = generator.valueToCode(block, "TEXT", Order.NONE) || "''"; - const color = - generator.valueToCode(block, "COLOR", Order.ATOMIC) || "'#ffffff'"; - - const addText = generator.provideFunction_( - "addText", - `function ${generator.FUNCTION_NAME_PLACEHOLDER_}(text, color) { - - // Add text to the output area. - const outputDiv = document.getElementById('output'); - const textEl = document.createElement('p'); - textEl.innerText = text; - textEl.style.color = color; - outputDiv.appendChild(textEl); -}`, - ); - // Generate the function call for this block. - const code = `${addText}(${text}, ${color});\n`; - return code; -}; diff --git a/packages/app/src/generators/nonebot_matcher.ts b/packages/app/src/generators/nonebot_matcher.ts new file mode 100644 index 0000000..96fc24c --- /dev/null +++ b/packages/app/src/generators/nonebot_matcher.ts @@ -0,0 +1,22 @@ +import { Order } from "blockly/python"; +import * as Blockly from "blockly/core"; + +export const forBlock = Object.create(null); + +forBlock["nonebot_on_command"] = function ( + block: Blockly.Block, + generator: Blockly.CodeGenerator, +) { + const text_cmd = block.getFieldValue("CMD"); + const checkbox_to_me = block.getFieldValue("TO_ME") === "TRUE"; + let to_me_statement = ""; + generator["definitions_"]["from nonebot.plugin import on_command"] = + "from nonebot.plugin import on_command"; + if (checkbox_to_me) { + generator["definitions_"]["from nonebot.rule import to_me"] = + "from nonebot.rule import to_me"; + to_me_statement = ", rule=to_me()"; + } + let code = `on_command("${text_cmd}"${to_me_statement})`; + return [code, Order.NONE]; +}; diff --git a/packages/app/src/toolbox.ts b/packages/app/src/toolbox.ts new file mode 100644 index 0000000..852722c --- /dev/null +++ b/packages/app/src/toolbox.ts @@ -0,0 +1,283 @@ +export const toolbox = { + kind: "categoryToolbox", + contents: [ + { + kind: "CATEGORY", + contents: [ + { + kind: "BLOCK", + type: "controls_if", + }, + { + kind: "BLOCK", + type: "logic_compare", + }, + { + kind: "BLOCK", + type: "logic_operation", + }, + { + kind: "BLOCK", + type: "logic_negate", + }, + { + kind: "BLOCK", + type: "logic_boolean", + }, + { + kind: "BLOCK", + type: "logic_null", + disabled: "true", + }, + { + kind: "BLOCK", + type: "logic_ternary", + }, + ], + name: "逻辑", + categorystyle: "logic_category", + }, + { + kind: "CATEGORY", + contents: [ + { + kind: "BLOCK", + type: "controls_repeat_ext", + }, + { + kind: "BLOCK", + type: "controls_repeat", + }, + { + kind: "BLOCK", + type: "controls_whileUntil", + }, + { + kind: "BLOCK", + type: "controls_for", + }, + { + kind: "BLOCK", + type: "controls_forEach", + }, + { + kind: "BLOCK", + type: "controls_flow_statements", + }, + ], + name: "循环", + categorystyle: "loop_category", + }, + { + kind: "CATEGORY", + contents: [ + { + kind: "BLOCK", + type: "math_number", + gap: "32", + }, + { + kind: "BLOCK", + type: "math_arithmetic", + }, + { + kind: "BLOCK", + type: "math_single", + }, + { + kind: "BLOCK", + type: "math_trig", + }, + { + kind: "BLOCK", + type: "math_constant", + }, + { + kind: "BLOCK", + type: "math_number_property", + }, + { + kind: "BLOCK", + type: "math_round", + }, + { + kind: "BLOCK", + type: "math_on_list", + }, + { + kind: "BLOCK", + type: "math_modulo", + }, + { + kind: "BLOCK", + type: "math_constrain", + }, + { + kind: "BLOCK", + type: "math_random_int", + }, + { + kind: "BLOCK", + type: "math_random_float", + }, + { + kind: "BLOCK", + type: "math_atan2", + }, + ], + name: "数学", + categorystyle: "math_category", + }, + { + kind: "CATEGORY", + contents: [ + { + kind: "BLOCK", + type: "text", + }, + { + kind: "BLOCK", + type: "text_multiline", + }, + { + kind: "BLOCK", + type: "text_join", + }, + { + kind: "BLOCK", + type: "text_append", + }, + { + kind: "BLOCK", + type: "text_length", + }, + { + kind: "BLOCK", + type: "text_isEmpty", + }, + { + kind: "BLOCK", + type: "text_indexOf", + }, + { + kind: "BLOCK", + type: "text_charAt", + }, + { + kind: "BLOCK", + type: "text_getSubstring", + }, + { + kind: "BLOCK", + type: "text_changeCase", + }, + { + kind: "BLOCK", + type: "text_trim", + }, + { + kind: "BLOCK", + type: "text_count", + }, + { + kind: "BLOCK", + type: "text_replace", + }, + { + kind: "BLOCK", + type: "text_reverse", + }, + ], + name: "文本", + categorystyle: "text_category", + }, + { + kind: "CATEGORY", + contents: [ + { + kind: "BLOCK", + type: "lists_create_with", + }, + { + kind: "BLOCK", + type: "lists_repeat", + }, + { + kind: "BLOCK", + type: "lists_length", + }, + { + kind: "BLOCK", + type: "lists_isEmpty", + }, + { + kind: "BLOCK", + type: "lists_indexOf", + }, + { + kind: "BLOCK", + type: "lists_getIndex", + }, + { + kind: "BLOCK", + type: "lists_setIndex", + }, + { + kind: "BLOCK", + type: "lists_getSublist", + }, + { + kind: "BLOCK", + type: "lists_split", + }, + { + kind: "BLOCK", + type: "lists_sort", + }, + { + kind: "BLOCK", + type: "lists_reverse", + }, + ], + name: "列表", + categorystyle: "list_category", + }, + { + kind: "SEP", + }, + { + kind: "CATEGORY", + contents: [ + { + kind: "LABEL", + text: "需要填入“事件处理”类模块的“响应器”中", + }, + { + kind: "LABEL", + text: "也可以创建一个变量赋值,使用变量传递", + }, + { + kind: "BLOCK", + type: "nonebot_on_command", + }, + ], + name: "事件响应器", + colour: "20", + }, + { + kind: "SEP", + }, + { + kind: "CATEGORY", + name: "变量", + categorystyle: "variable_category", + custom: "VARIABLE", + }, + { + kind: "CATEGORY", + name: "函数", + categorystyle: "procedure_category", + custom: "PROCEDURE", + }, + ], +}; diff --git a/packages/app/src/workspaces/index.vue b/packages/app/src/workspaces/index.vue index e1403fa..84f4637 100644 --- a/packages/app/src/workspaces/index.vue +++ b/packages/app/src/workspaces/index.vue @@ -8,12 +8,19 @@ import ContentPage from "@/components/ContentPage.vue"; import { optionsStore, workspaceStore } from "@/stores/workspaces"; import { loadJSON, generateCode } from "@/stores/workspaces"; // Workspace data -import toolbox from "@/data/toolbox.json"; import startBlocks from "@/data/default.json"; // Blockly config -import "@/blocks/blocks.js"; +import { blocks } from "@/blocks"; +import { toolbox } from "@/toolbox"; +import { generators } from "@/generators"; +import { pythonGenerator } from "blockly/python"; import * as ZhHans from "blockly/msg/zh-hans"; +Blockly.common.defineBlocks(blocks); +generators.forEach((generator) => { + Object.assign(pythonGenerator.forBlock, generator); +}); + Blockly.setLocale(ZhHans); // Set store data From 37af0ad2eefe51b19ae267c5ced376bbfa3b4f18 Mon Sep 17 00:00:00 2001 From: mobyw Date: Sun, 11 Aug 2024 20:11:33 +0800 Subject: [PATCH 04/19] :sparkles: Implementing python dict mutation --- packages/app/src/blocks/index.ts | 14 +- packages/app/src/blocks/nonebot_matcher.ts | 54 ++-- packages/app/src/blocks/python_dict.js | 254 ---------------- packages/app/src/blocks/python_dict.ts | 320 +++++++++++++++++++++ packages/app/src/generators/index.ts | 3 +- packages/app/src/generators/python_dict.ts | 31 ++ packages/app/src/toolbox.ts | 134 ++++++++- 7 files changed, 521 insertions(+), 289 deletions(-) delete mode 100644 packages/app/src/blocks/python_dict.js create mode 100644 packages/app/src/blocks/python_dict.ts create mode 100644 packages/app/src/generators/python_dict.ts diff --git a/packages/app/src/blocks/index.ts b/packages/app/src/blocks/index.ts index f96c5f5..a90372d 100644 --- a/packages/app/src/blocks/index.ts +++ b/packages/app/src/blocks/index.ts @@ -1,10 +1,14 @@ import * as Blockly from "blockly/core"; +import { BlockDefinition } from "blockly/core/blocks"; -// import "./python_dict.js"; -import { nonebotOnCommand } from "./nonebot_matcher"; +import { pythonDict } from "./python_dict"; +import { nonebotMatcher } from "./nonebot_matcher"; // import "./nonebot_handle.js"; // import "./nonebot_message.js"; -export const blocks = Blockly.common.createBlockDefinitionsFromJsonArray([ - nonebotOnCommand, -]); +// Array of all block definitions +let blockDefinitions: BlockDefinition[] = []; +blockDefinitions = blockDefinitions.concat(pythonDict).concat(nonebotMatcher); + +export const blocks = + Blockly.common.createBlockDefinitionsFromJsonArray(blockDefinitions); diff --git a/packages/app/src/blocks/nonebot_matcher.ts b/packages/app/src/blocks/nonebot_matcher.ts index 35106ea..b189662 100644 --- a/packages/app/src/blocks/nonebot_matcher.ts +++ b/packages/app/src/blocks/nonebot_matcher.ts @@ -1,25 +1,29 @@ -export const nonebotOnCommand = { - type: "nonebot_on_command", - message0: "创建指令响应器 %1 %2 与我相关 %3", - args0: [ - { - type: "field_input", - name: "CMD", - text: "指令", - }, - { - type: "input_dummy", - }, - { - type: "field_checkbox", - name: "TO_ME", - checked: false, - }, - ], - inputsInline: true, - output: "Matcher", - colour: 20, - tooltip: - "请在第一个格子中填写命令触发词;若勾选“与我相关”,只有在私聊、群聊中@或回复、消息以机器人名字开始或结束时会触发", - helpUrl: "https://nonebot.dev/docs/next/advanced/matcher#command", -}; +import { BlockDefinition } from "blockly/core/blocks"; + +export const nonebotMatcher: BlockDefinition[] = [ + { + type: "nonebot_on_command", + message0: "创建指令响应器 %1 %2 与我相关 %3", + args0: [ + { + type: "field_input", + name: "CMD", + text: "指令", + }, + { + type: "input_dummy", + }, + { + type: "field_checkbox", + name: "TO_ME", + checked: false, + }, + ], + inputsInline: true, + output: "Matcher", + colour: 20, + tooltip: + "请填写命令触发词,如“帮助”;若勾选“与我相关”,只有在私聊、群聊中@或回复、消息以机器人名字开始或结束时会触发", + helpUrl: "https://nonebot.dev/docs/next/advanced/matcher#command", + }, +]; diff --git a/packages/app/src/blocks/python_dict.js b/packages/app/src/blocks/python_dict.js deleted file mode 100644 index 85f9031..0000000 --- a/packages/app/src/blocks/python_dict.js +++ /dev/null @@ -1,254 +0,0 @@ -import * as Blockly from "blockly/core"; -import { Order, pythonGenerator } from "blockly/python"; - -Blockly.defineBlocksWithJsonArray([ - { - type: "dicts_create_with_container", - message0: "字典 %1 %2", - args0: [ - { - type: "input_dummy", - }, - { - type: "input_statement", - name: "STACK", - }, - ], - colour: 0, - tooltip: "", - helpUrl: "", - }, - { - type: "dicts_create_with_item", - message0: "键值对", - args0: [], - colour: 0, - previousStatement: null, - nextStatement: null, - tooltip: "", - helpUrl: "", - }, - { - type: "dicts_create_with", - message0: "创建字典 %1 KEY-0 %2 VALUE-0 %3 KEY-1 %4 VALUE-1 %5", - args0: [ - { - type: "input_dummy", - }, - { - type: "input_value", - name: "KEY0", - align: "RIGHT", - }, - { - type: "input_value", - name: "VALUE0", - align: "RIGHT", - }, - { - type: "input_value", - name: "KEY1", - align: "RIGHT", - }, - { - type: "input_value", - name: "VALUE1", - align: "RIGHT", - }, - ], - colour: 0, - output: "dict", - tooltip: "", - helpUrl: "", - mutator: "dict_create_with_mutator", - }, - { - type: "dicts_get", - message0: "从字典 %1 中取 KEY %2 的值", - args0: [ - { - type: "input_value", - name: "DICT", - check: "dict", - }, - { - type: "input_value", - name: "ITEM", - }, - ], - colour: 0, - output: null, - inputsInline: true, - tooltip: "", - helpUrl: "", - }, -]); - -const dictCreateWithMutator = { - itemCount_: 2, - /** - * Create XML to represent list inputs. - * Backwards compatible serialization implementation. - */ - mutationToDom: function () { - const container = document.createElement("mutation"); - container.setAttribute("items", this.itemCount_); - return container; - }, - /** - * Parse XML to restore the list inputs. - * Backwards compatible serialization implementation. - * - * @param container XML storage element. - */ - domToMutation: function (container) { - for (let x = 0; x < this.itemCount_; x++) { - this.removeInput("KEY" + x); - this.removeInput("VALUE" + x); - } - this.itemCount_ = parseInt(container.getAttribute("items"), 10); - for (let x = 0; x < this.itemCount_; x++) { - this.appendValueInput("KEY" + x) - .appendField("KEY-" + x) - .setAlign(Blockly.inputs.Align.RIGHT); - this.appendValueInput("VALUE" + x) - .appendField("VALUE-" + x) - .setAlign(Blockly.inputs.Align.RIGHT); - } - }, - /** - * Populate the mutator's dialog with this block's components. - * - * @param workspace Mutator's workspace. - * @returns Root block in mutator. - */ - decompose: function (workspace) { - const containerBlock = workspace.newBlock("dicts_create_with_container"); - containerBlock.initSvg(); - let connection = containerBlock.getInput("STACK").connection; - for (let i = 0; i < this.itemCount_; i++) { - const itemBlock = workspace.newBlock("dicts_create_with_item"); - itemBlock.initSvg(); - if (!itemBlock.previousConnection) { - throw new Error("itemBlock has no previousConnection"); - } - connection.connect(itemBlock.previousConnection); - connection = itemBlock.nextConnection; - } - return containerBlock; - }, - /** - * Reconfigure this block based on the mutator dialog's components. - * - * @param containerBlock Root block in mutator. - */ - compose: function (containerBlock) { - let itemBlock = containerBlock.getInputTargetBlock("STACK"); - // Count number of inputs. - const connections = []; - while (itemBlock) { - if (itemBlock.isInsertionMarker()) { - itemBlock = itemBlock.getNextBlock(); - continue; - } - connections.push(itemBlock.valueConnection_?.key); - connections.push(itemBlock.valueConnection_?.value); - itemBlock = itemBlock.getNextBlock(); - } - // Disconnect any children that don't belong. - for (let i = 0; i < this.itemCount_; i++) { - const connection_key = this.getInput("KEY" + i).connection - .targetConnection; - if (connection_key && connections.indexOf(connection_key) === -1) { - connection_key.disconnect(); - } - const connection_value = this.getInput("KEY" + i).connection - .targetConnection; - if (connection_value && connections.indexOf(connection_value) === -1) { - connection_value.disconnect(); - } - } - this.itemCount_ = connections.length / 2; - this.updateShape_(); - // Reconnect any child blocks. - for (let i = 0; i < this.itemCount_; i++) { - connections[i]?.reconnect(this, "MESSAGE" + i); - } - }, - saveConnections: function (containerBlock) { - // Store a pointer to any connected child blocks. - let itemBlock = containerBlock.getInputTargetBlock("STACK"); - let x = 0; - while (itemBlock) { - let key_input = this.getInput("KEY" + x); - let value_input = this.getInput("VALUE" + x); - itemBlock.valueConnection_ = { - key: key_input?.connection.targetConnection, - value: value_input?.connection.targetConnection, - }; - x++; - itemBlock = - itemBlock.nextConnection && itemBlock.nextConnection.targetBlock(); - } - }, - /** - * Modify this block to have the correct number of inputs. - */ - updateShape_: function () { - if (this.itemCount_ && this.getInput("EMPTY")) { - this.removeInput("EMPTY"); - } else if (!this.itemCount_ && !this.getInput("EMPTY")) { - this.appendDummyInput("EMPTY").appendField("空字典"); - } - // Add new inputs. - for (let i = 0; i < this.itemCount_; i++) { - if (!this.getInput("KEY" + i)) { - this.appendValueInput("KEY" + i) - .setAlign(Blockly.inputs.Align.RIGHT) - .appendField("KEY-" + i); - } - if (!this.getInput("VALUE" + i)) { - this.appendValueInput("VALUE" + i) - .setAlign(Blockly.inputs.Align.RIGHT) - .appendField("VALUE-" + i); - } - } - // Remove deleted inputs. - for (let i = this.itemCount_; this.getInput("KEY" + i); i++) { - this.removeInput("KEY" + i); - } - for (let i = this.itemCount_; this.getInput("VALUE" + i); i++) { - this.removeInput("VALUE" + i); - } - }, -}; - -// Function signature. - -if (Blockly.Extensions.isRegistered("dict_create_with_mutator")) { - Blockly.Extensions.unregister("dict_create_with_mutator"); -} -Blockly.Extensions.registerMutator( - "dict_create_with_mutator", - dictCreateWithMutator, -); - -// The following is for the Python generator - -pythonGenerator.forBlock["dicts_get"] = function (block, generator) { - let dict = generator.valueToCode(block, "DICT", Order.MEMBER) || "{}"; - let value = generator.valueToCode(block, "ITEM", Order.NONE) || "None"; - let code = dict + "[" + value + "]"; - return [code, Order.ATOMIC]; -}; - -pythonGenerator.forBlock["dicts_create_with"] = function (block, generator) { - let code = new Array(block.itemCount_); - for (let n = 0; n < block.itemCount_; n++) { - let key = generator.valueToCode(block, "KEY" + n, Order.NONE) || "None"; - let value = generator.valueToCode(block, "VALUE" + n, Order.NONE) || "None"; - code[n] = key + ": " + value; - } - code = "{" + code.join(", ") + "}"; - return [code, Order.ATOMIC]; -}; diff --git a/packages/app/src/blocks/python_dict.ts b/packages/app/src/blocks/python_dict.ts new file mode 100644 index 0000000..2d26d0f --- /dev/null +++ b/packages/app/src/blocks/python_dict.ts @@ -0,0 +1,320 @@ +import * as Blockly from "blockly/core"; +import type { Block } from "blockly/core/block"; +import type { BlockDefinition } from "blockly/core/blocks"; +import type { Connection } from "blockly/core/connection"; +import type { BlockSvg } from "blockly/core/block_svg"; +import type { Workspace } from "blockly/core/workspace"; + +export const pythonDict: BlockDefinition[] = [ + { + type: "dicts_create_with_container", + message0: "字典 %1 %2", + args0: [ + { + type: "input_dummy", + }, + { + type: "input_statement", + name: "STACK", + }, + ], + tooltip: "", + helpUrl: "", + colour: 0, + // style: "dict_blocks", + }, + { + type: "dicts_create_with_item", + message0: "键值对", + previousStatement: null, + nextStatement: null, + tooltip: "", + helpUrl: "", + enableContextMenu: false, + colour: 0, + // style: "dict_blocks", + }, + { + type: "dicts_create_with", + message0: "创建字典 %1 KEY-0 %2 VALUE-0 %3 KEY-1 %4 VALUE-1 %5", + args0: [ + { + type: "input_dummy", + }, + { + type: "input_value", + name: "KEY0", + align: "RIGHT", + }, + { + type: "input_value", + name: "VALUE0", + align: "RIGHT", + }, + { + type: "input_value", + name: "KEY1", + align: "RIGHT", + }, + { + type: "input_value", + name: "VALUE1", + align: "RIGHT", + }, + ], + output: "dict", + tooltip: "", + helpUrl: "", + mutator: "dict_create_with_mutator", + colour: 0, + // style: "dict_blocks", + }, + { + type: "dicts_get", + message0: "从字典 %1 中取 KEY %2 的值", + args0: [ + { + type: "input_value", + name: "DICT", + check: "dict", + }, + { + type: "input_value", + name: "ITEM", + }, + ], + output: null, + inputsInline: true, + tooltip: "", + helpUrl: "", + colour: 0, + // style: "dict_blocks", + }, +]; + +/** + * Type of a 'dicts_create_with' block. + * + * @internal + */ +export type DictCreateWithBlock = BlockSvg & DictCreateWithMixin; +interface DictCreateWithMixin extends DictCreateWithMixinType { + itemCount_: number; +} +type DictCreateWithMixinType = typeof DICTS_CREATE_WITH; + +const DICTS_CREATE_WITH = { + itemCount_: 2, + /** + * Block for creating a dict with any number of key-value of any type. + */ + /** + * Create XML to represent list inputs. + * Backwards compatible serialization implementation. + */ + mutationToDom: function (this: DictCreateWithBlock): Element { + const container = Blockly.utils.xml.createElement("mutation"); + container.setAttribute("items", `${this.itemCount_}`); + return container; + }, + /** + * Parse XML to restore the list inputs. + * Backwards compatible serialization implementation. + * + * @param container XML storage element. + */ + domToMutation: function (this: DictCreateWithBlock, xmlElement: Element) { + const items = xmlElement.getAttribute("items"); + if (!items) throw new TypeError("element did not have items"); + this.itemCount_ = parseInt(items, 10); + this.updateShape_(); + }, + /** + * Returns the state of this block as a JSON serializable object. + * + * @returns The state of this block, ie the item count. + */ + saveExtraState: function (this: DictCreateWithBlock): { itemCount: number } { + return { + itemCount: this.itemCount_, + }; + }, + /** + * Applies the given state to this block. + * + * @param state The state to apply to this block, ie the item count. + */ + loadExtraState: function (this: DictCreateWithBlock, state: any) { + this.itemCount_ = state["itemCount"]; + this.updateShape_(); + }, + /** + * Populate the mutator's dialog with this block's components. + * + * @param workspace Mutator's workspace. + * @returns Root block in mutator. + */ + decompose: function (this: DictCreateWithBlock, workspace: Workspace): any { + const containerBlock = workspace.newBlock("dicts_create_with_container"); + (containerBlock as BlockSvg).initSvg(); + let connection = containerBlock.getInput("STACK")!.connection; + for (let i = 0; i < this.itemCount_; i++) { + const itemBlock = workspace.newBlock("dicts_create_with_item"); + (itemBlock as BlockSvg).initSvg(); + if (!itemBlock.previousConnection) { + throw new Error("itemBlock has no previousConnection"); + } + connection!.connect(itemBlock.previousConnection); + connection = itemBlock.nextConnection; + } + return containerBlock; + }, + /** + * Reconfigure this block based on the mutator dialog's components. + * + * @param containerBlock Root block in mutator. + */ + compose: function (this: DictCreateWithBlock, containerBlock: Block) { + let itemBlock: ItemBlock | null = containerBlock.getInputTargetBlock( + "STACK", + ) as ItemBlock; + // Count number of inputs. + const connections: Connection[] = []; + while (itemBlock) { + if (itemBlock.isInsertionMarker()) { + itemBlock = itemBlock.getNextBlock() as ItemBlock | null; + continue; + } + connections.push(itemBlock.valueConnection_?.key as Connection); + connections.push(itemBlock.valueConnection_?.value as Connection); + itemBlock = itemBlock.getNextBlock() as ItemBlock | null; + } + // Disconnect any children that don't belong. + for (let i = 0; i < this.itemCount_; i++) { + const connection_key = this.getInput("KEY" + i)!.connection! + .targetConnection; + if (connection_key && connections.indexOf(connection_key) === -1) { + connection_key.disconnect(); + } + const connection_value = this.getInput("VALUE" + i)!.connection! + .targetConnection; + if (connection_value && connections.indexOf(connection_value) === -1) { + connection_value.disconnect(); + } + } + this.itemCount_ = connections.length / 2; + this.updateShape_(); + // Reconnect any child blocks. + for (let i = 0; i < this.itemCount_; i++) { + connections[i]?.reconnect(this, "KEY" + i); + connections[i]?.reconnect(this, "VALUE" + i); + } + }, + saveConnections: function (this: DictCreateWithBlock, containerBlock: Block) { + // Store a pointer to any connected child blocks. + let itemBlock: ItemBlock | null = containerBlock.getInputTargetBlock( + "STACK", + ) as ItemBlock; + let i = 0; + while (itemBlock) { + if (itemBlock.isInsertionMarker()) { + itemBlock = itemBlock.getNextBlock() as ItemBlock | null; + continue; + } + const key_input = this.getInput("KEY" + i); + const value_input = this.getInput("VALUE" + i); + itemBlock.valueConnection_ = { + key: key_input?.connection!.targetConnection as Connection, + value: value_input?.connection!.targetConnection as Connection, + }; + itemBlock = itemBlock.getNextBlock() as ItemBlock | null; + i++; + } + }, + /** + * Modify this block to have the correct number of inputs. + */ + updateShape_: function (this: DictCreateWithBlock) { + if (this.itemCount_ && this.getInput("EMPTY")) { + this.removeInput("EMPTY"); + } else if (!this.itemCount_ && !this.getInput("EMPTY")) { + this.appendDummyInput("EMPTY").appendField("空字典"); + } + // Add new inputs. + for (let i = 0; i < this.itemCount_; i++) { + if (!this.getInput("KEY" + i)) { + this.appendValueInput("KEY" + i) + .setAlign(Blockly.inputs.Align.RIGHT) + .appendField("KEY-" + i); + } + if (!this.getInput("VALUE" + i)) { + this.appendValueInput("VALUE" + i) + .setAlign(Blockly.inputs.Align.RIGHT) + .appendField("VALUE-" + i); + } + } + // Remove deleted inputs. + for (let i = this.itemCount_; this.getInput("KEY" + i); i++) { + this.removeInput("KEY" + i); + } + for (let i = this.itemCount_; this.getInput("VALUE" + i); i++) { + this.removeInput("VALUE" + i); + } + }, +}; + +/** Type for a 'dicts_create_with_container' block. */ +type ContainerBlock = Block & ContainerMutator; +interface ContainerMutator extends ContainerMutatorType {} +type ContainerMutatorType = typeof DICTS_CREATE_WITH_CONTAINER; + +const DICTS_CREATE_WITH_CONTAINER = { + /** + * Mutator block for dict container. + */ + init: function (this: ContainerBlock) { + this.setStyle("dict_blocks"); + this.appendStatementInput("STACK"); + this.contextMenu = false; + }, +}; + +/** Type for a 'dicts_create_with_item' block. */ +type ItemBlock = Block & ItemMutator; +interface ItemConnection { + key: Connection; + value: Connection; +} +interface ItemMutator extends ItemMutatorType { + valueConnection_?: ItemConnection; +} +type ItemMutatorType = typeof DICTS_CREATE_WITH_ITEM; + +const DICTS_CREATE_WITH_ITEM = { + /** + * Mutator block for adding items. + */ + init: function (this: ItemBlock) {}, +}; + +/** + * Performs final setup of a dicts_create_with block. + */ +const DICTS_CREATE_WITH_EXTENSION = function (this: DictCreateWithBlock) { + // Initialize the mutator values. + this.itemCount_ = 2; + this.updateShape_(); + // Configure the mutator UI. + this.setMutator( + new Blockly.icons.MutatorIcon(["dicts_create_with_item"], this), + ); +}; + +if (Blockly.Extensions.isRegistered("dict_create_with_mutator")) { + Blockly.Extensions.unregister("dict_create_with_mutator"); +} +Blockly.Extensions.registerMutator( + "dict_create_with_mutator", + DICTS_CREATE_WITH, + DICTS_CREATE_WITH_EXTENSION, +); diff --git a/packages/app/src/generators/index.ts b/packages/app/src/generators/index.ts index d7549b3..828f7ed 100644 --- a/packages/app/src/generators/index.ts +++ b/packages/app/src/generators/index.ts @@ -1,3 +1,4 @@ +import { forBlock as pythonDictBlock } from "./python_dict"; import { forBlock as nonebotMatcherBlock } from "./nonebot_matcher"; -export const generators = [nonebotMatcherBlock]; +export const generators = [pythonDictBlock, nonebotMatcherBlock]; diff --git a/packages/app/src/generators/python_dict.ts b/packages/app/src/generators/python_dict.ts new file mode 100644 index 0000000..8a9970d --- /dev/null +++ b/packages/app/src/generators/python_dict.ts @@ -0,0 +1,31 @@ +import { Order } from "blockly/python"; +import * as Blockly from "blockly/core"; + +import { DictCreateWithBlock } from "@/blocks/python_dict"; + +export const forBlock = Object.create(null); +// The following is for the Python generator + +forBlock["dicts_get"] = function ( + block: Blockly.Block, + generator: Blockly.CodeGenerator, +) { + const dict = generator.valueToCode(block, "DICT", Order.MEMBER) || "{}"; + const value = generator.valueToCode(block, "ITEM", Order.NONE) || "None"; + const code = dict + "[" + value + "]"; + return [code, Order.ATOMIC]; +}; + +forBlock["dicts_create_with"] = function ( + block: DictCreateWithBlock, + generator: Blockly.CodeGenerator, +) { + let items = new Array(block.itemCount_); + for (let n = 0; n < block.itemCount_; n++) { + let key = generator.valueToCode(block, "KEY" + n, Order.NONE) || "None"; + let value = generator.valueToCode(block, "VALUE" + n, Order.NONE) || "None"; + items[n] = key + ": " + value; + } + const code = "{" + items.join(", ") + "}"; + return [code, Order.ATOMIC]; +}; diff --git a/packages/app/src/toolbox.ts b/packages/app/src/toolbox.ts index 852722c..8e5500f 100644 --- a/packages/app/src/toolbox.ts +++ b/packages/app/src/toolbox.ts @@ -135,10 +135,6 @@ export const toolbox = { kind: "BLOCK", type: "text", }, - { - kind: "BLOCK", - type: "text_multiline", - }, { kind: "BLOCK", type: "text_join", @@ -146,46 +142,161 @@ export const toolbox = { { kind: "BLOCK", type: "text_append", + inputs: { + TEXT: { + shadow: { + type: "text", + fields: { + TEXT: "", + }, + }, + }, + }, }, { kind: "BLOCK", type: "text_length", + inputs: { + VALUE: { + shadow: { + type: "text", + fields: { + TEXT: "abc", + }, + }, + }, + }, }, { kind: "BLOCK", type: "text_isEmpty", + inputs: { + VALUE: { + shadow: { + type: "text", + fields: { + TEXT: "", + }, + }, + }, + }, }, { kind: "BLOCK", type: "text_indexOf", + inputs: { + VALUE: { + BLOCK: { + type: "variables_get", + }, + }, + FIND: { + shadow: { + type: "text", + fields: { + TEXT: "abc", + }, + }, + }, + }, }, { kind: "BLOCK", type: "text_charAt", + inputs: { + VALUE: { + BLOCK: { + type: "variables_get", + }, + }, + }, }, { kind: "BLOCK", type: "text_getSubstring", + inputs: { + STRING: { + BLOCK: { + type: "variables_get", + }, + }, + }, }, { kind: "BLOCK", type: "text_changeCase", + inputs: { + TEXT: { + shadow: { + type: "text", + fields: { + TEXT: "abc", + }, + }, + }, + }, }, { kind: "BLOCK", type: "text_trim", + inputs: { + TEXT: { + shadow: { + type: "text", + fields: { + TEXT: "abc", + }, + }, + }, + }, }, { kind: "BLOCK", type: "text_count", + inputs: { + SUB: { + shadow: { + type: "text", + }, + }, + TEXT: { + shadow: { + type: "text", + }, + }, + }, }, { kind: "BLOCK", type: "text_replace", + inputs: { + FROM: { + shadow: { + type: "text", + }, + }, + TO: { + shadow: { + type: "text", + }, + }, + TEXT: { + shadow: { + type: "text", + }, + }, + }, }, { kind: "BLOCK", type: "text_reverse", + inputs: { + TEXT: { + shadow: { + type: "text", + }, + }, + }, }, ], name: "文本", @@ -242,6 +353,21 @@ export const toolbox = { name: "列表", categorystyle: "list_category", }, + { + kind: "CATEGORY", + contents: [ + { + kind: "BLOCK", + type: "dicts_create_with", + }, + { + kind: "BLOCK", + type: "dicts_get", + }, + ], + name: "字典", + colour: "0", + }, { kind: "SEP", }, From b073a359eaa3813afbf1ca74aa215916fc472c0d Mon Sep 17 00:00:00 2001 From: mobyw Date: Tue, 10 Sep 2024 22:40:22 +0800 Subject: [PATCH 05/19] :sparkles: Separate blocks and generate code --- .../app/src/blocks/components/field_minus.ts | 59 +++ .../app/src/blocks/components/field_plus.ts | 61 +++ .../blocks/components/serialization_helper.ts | 27 ++ packages/app/src/blocks/index.ts | 11 +- packages/app/src/blocks/nonebot_alconna.ts | 267 +++++++++++++ packages/app/src/blocks/nonebot_basic.ts | 104 +++++ packages/app/src/blocks/nonebot_handle.js | 48 --- packages/app/src/blocks/nonebot_logger.js | 6 - packages/app/src/blocks/nonebot_message.js | 371 ------------------ packages/app/src/blocks/nonebot_store.ts | 55 +++ packages/app/src/blocks/python_dict.ts | 63 ++- packages/app/src/data/default.json | 162 +++++++- packages/app/src/generators/index.ts | 8 +- .../app/src/generators/nonebot_alconna.ts | 59 +++ packages/app/src/generators/nonebot_basic.ts | 66 ++++ packages/app/src/generators/nonebot_store.ts | 22 ++ packages/app/src/generators/python_dict.ts | 29 +- packages/app/src/toolbox.ts | 85 +++- 18 files changed, 1027 insertions(+), 476 deletions(-) create mode 100644 packages/app/src/blocks/components/field_minus.ts create mode 100644 packages/app/src/blocks/components/field_plus.ts create mode 100644 packages/app/src/blocks/components/serialization_helper.ts create mode 100644 packages/app/src/blocks/nonebot_alconna.ts create mode 100644 packages/app/src/blocks/nonebot_basic.ts delete mode 100644 packages/app/src/blocks/nonebot_handle.js delete mode 100644 packages/app/src/blocks/nonebot_logger.js delete mode 100644 packages/app/src/blocks/nonebot_message.js create mode 100644 packages/app/src/blocks/nonebot_store.ts create mode 100644 packages/app/src/generators/nonebot_alconna.ts create mode 100644 packages/app/src/generators/nonebot_basic.ts create mode 100644 packages/app/src/generators/nonebot_store.ts diff --git a/packages/app/src/blocks/components/field_minus.ts b/packages/app/src/blocks/components/field_minus.ts new file mode 100644 index 0000000..987f380 --- /dev/null +++ b/packages/app/src/blocks/components/field_minus.ts @@ -0,0 +1,59 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview A function that creates a minus button used for mutation. + */ + +import * as Blockly from "blockly/core"; +import { getExtraBlockState } from "./serialization_helper"; + +/** + * Creates a minus image field used for mutation. + * @param {Object=} args Untyped args passed to block.minus when the field + * is clicked. + * @returns {Blockly.FieldImage} The minus field. + */ +export function createMinusField(args?: Object): Blockly.FieldImage { + const minus = new Blockly.FieldImage(minusImage, 15, 15, undefined, onClick_); + /** + * Untyped args passed to block.minus when the field is clicked. + * @type {?(Object|undefined)} + * @private + */ + (minus as any).args_ = args; + return minus; +} + +/** + * Calls block.minus(args) when the minus field is clicked. + * @param {Blockly.FieldImage} minusField The field being clicked. + * @private + */ +function onClick_(minusField: Blockly.FieldImage) { + // TODO: This is a dupe of the mutator code, anyway to unify? + const block = minusField.getSourceBlock() as Blockly.BlockSvg; + + if (block.isInFlyout) { + return; + } + + Blockly.Events.setGroup(true); + const oldExtraState = getExtraBlockState(block); + (block as any).minus((minusField as any).args_); + const newExtraState = getExtraBlockState(block); + + if (oldExtraState != newExtraState) { + Blockly.Events.fire(new Blockly.Events.BlockChange(block, "mutation", null, oldExtraState, newExtraState)); + } + Blockly.Events.setGroup(false); +} + +const minusImage = + "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAw" + + "MC9zdmciIHZlcnNpb249IjEuMSIgd2lkdGg9IjI0IiBoZWlnaHQ9IjI0Ij48cGF0aCBkPS" + + "JNMTggMTFoLTEyYy0xLjEwNCAwLTIgLjg5Ni0yIDJzLjg5NiAyIDIgMmgxMmMxLjEwNCAw" + + "IDItLjg5NiAyLTJzLS44OTYtMi0yLTJ6IiBmaWxsPSJ3aGl0ZSIgLz48L3N2Zz4K"; diff --git a/packages/app/src/blocks/components/field_plus.ts b/packages/app/src/blocks/components/field_plus.ts new file mode 100644 index 0000000..2bc6b94 --- /dev/null +++ b/packages/app/src/blocks/components/field_plus.ts @@ -0,0 +1,61 @@ +/** + * @license + * Copyright 2020 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview A field for a plus button used for mutation. + */ + +import * as Blockly from "blockly/core"; +import { getExtraBlockState } from "./serialization_helper"; + +/** + * Creates a plus image field used for mutation. + * @param {Object=} args Untyped args passed to block.minus when the field + * is clicked. + * @returns {Blockly.FieldImage} The Plus field. + */ +export function createPlusField(args?: Object): Blockly.FieldImage { + const plus = new Blockly.FieldImage(plusImage, 15, 15, undefined, onClick_); + /** + * Untyped args passed to block.plus when the field is clicked. + * @type {?(Object|undefined)} + * @private + */ + (plus as any).args_ = args; + return plus; +} + +/** + * Calls block.plus(args) when the plus field is clicked. + * @param {!Blockly.FieldImage} plusField The field being clicked. + * @private + */ +function onClick_(plusField: Blockly.FieldImage) { + // TODO: This is a dupe of the mutator code, anyway to unify? + const block = plusField.getSourceBlock() as Blockly.BlockSvg; + + if (block.isInFlyout) { + return; + } + + Blockly.Events.setGroup(true); + const oldExtraState = getExtraBlockState(block); + (block as any).plus((plusField as any).args_); + const newExtraState = getExtraBlockState(block); + + if (oldExtraState != newExtraState) { + Blockly.Events.fire(new Blockly.Events.BlockChange(block, "mutation", null, oldExtraState, newExtraState)); + } + Blockly.Events.setGroup(false); +} + +const plusImage = + "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC" + + "9zdmciIHZlcnNpb249IjEuMSIgd2lkdGg9IjI0IiBoZWlnaHQ9IjI0Ij48cGF0aCBkPSJNMT" + + "ggMTBoLTR2LTRjMC0xLjEwNC0uODk2LTItMi0ycy0yIC44OTYtMiAybC4wNzEgNGgtNC4wNz" + + "FjLTEuMTA0IDAtMiAuODk2LTIgMnMuODk2IDIgMiAybDQuMDcxLS4wNzEtLjA3MSA0LjA3MW" + + "MwIDEuMTA0Ljg5NiAyIDIgMnMyLS44OTYgMi0ydi00LjA3MWw0IC4wNzFjMS4xMDQgMCAyLS" + + "44OTYgMi0ycy0uODk2LTItMi0yeiIgZmlsbD0id2hpdGUiIC8+PC9zdmc+Cg=="; diff --git a/packages/app/src/blocks/components/serialization_helper.ts b/packages/app/src/blocks/components/serialization_helper.ts new file mode 100644 index 0000000..8c99b0f --- /dev/null +++ b/packages/app/src/blocks/components/serialization_helper.ts @@ -0,0 +1,27 @@ +/** + * @license + * Copyright 2022 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +import * as Blockly from "blockly/core"; + +/** + * Returns the extra state of the given block (either as XML or a JSO, depending + * on the block's definition). + * @param {!Blockly.BlockSvg} block The block to get the extra state of. + * @returns {string} A stringified version of the extra state of the given + * block. + */ +export function getExtraBlockState(block: Blockly.BlockSvg): string { + // TODO: This is a dupe of the BlockChange.getExtraBlockState code, do we + // want to make that public? + if (block.saveExtraState) { + const state = block.saveExtraState(); + return state ? JSON.stringify(state) : ""; + } else if (block.mutationToDom) { + const state = block.mutationToDom(); + return state ? Blockly.Xml.domToText(state) : ""; + } + return ""; +} diff --git a/packages/app/src/blocks/index.ts b/packages/app/src/blocks/index.ts index a90372d..f80bfef 100644 --- a/packages/app/src/blocks/index.ts +++ b/packages/app/src/blocks/index.ts @@ -2,13 +2,12 @@ import * as Blockly from "blockly/core"; import { BlockDefinition } from "blockly/core/blocks"; import { pythonDict } from "./python_dict"; -import { nonebotMatcher } from "./nonebot_matcher"; -// import "./nonebot_handle.js"; -// import "./nonebot_message.js"; +import { definitions as nonebotBasic } from "./nonebot_basic"; +import { definitions as nonebotAlconna } from "./nonebot_alconna"; +import { definitions as nonebotStore } from "./nonebot_store"; // Array of all block definitions let blockDefinitions: BlockDefinition[] = []; -blockDefinitions = blockDefinitions.concat(pythonDict).concat(nonebotMatcher); +blockDefinitions = blockDefinitions.concat(pythonDict).concat(nonebotBasic).concat(nonebotAlconna).concat(nonebotStore); -export const blocks = - Blockly.common.createBlockDefinitionsFromJsonArray(blockDefinitions); +export const blocks = Blockly.common.createBlockDefinitionsFromJsonArray(blockDefinitions); diff --git a/packages/app/src/blocks/nonebot_alconna.ts b/packages/app/src/blocks/nonebot_alconna.ts new file mode 100644 index 0000000..e4d6742 --- /dev/null +++ b/packages/app/src/blocks/nonebot_alconna.ts @@ -0,0 +1,267 @@ +import * as Blockly from "blockly/core"; +import type { BlockDefinition } from "blockly/core/blocks"; +import type { BlockSvg } from "blockly/core/block_svg"; +import { createPlusField } from "./components/field_plus"; +import { createMinusField } from "./components/field_minus"; + +export const definitions: BlockDefinition[] = [ + { + type: "nonebot_on_alconna", + tooltip: "", + helpUrl: "", + message0: "跨平台命令解析与处理 %1 命令字符串 %2 仅与我相关 %3 %4 无其他命令参数 %5 %6", + args0: [ + { + type: "input_dummy", + name: "NAME", + }, + { + type: "field_input", + name: "COMMAND", + text: "hello", + }, + { + type: "field_checkbox", + name: "TOME", + checked: "FALSE", + }, + { + type: "input_dummy", + name: "PARAMS", + }, + { + type: "input_dummy", + name: "EMPTY", + align: "RIGHT", + }, + { + type: "input_statement", + name: "HANDLE", + }, + ], + colour: 90, + mutator: "alconna_mutator", + }, + { + type: "alconna_const", + tooltip: "", + helpUrl: "", + message0: "固定字符串 %1 %2", + args0: [ + { + type: "field_input", + name: "TEXT", + text: "help", + }, + { + type: "input_dummy", + name: "PARAMS", + }, + ], + output: "arg", + colour: 120, + }, + { + type: "alconna_arg", + tooltip: "", + helpUrl: "", + message0: "参数名 %1 数据类型 %2 %3", + args0: [ + { + type: "field_input", + name: "NAME", + text: "arg1", + }, + { + type: "field_dropdown", + name: "TYPE", + options: [ + ["字符串", "str"], + ["整数", "int"], + ["浮点数", "float"], + ["布尔值", "bool"], + ], + }, + { + type: "input_dummy", + name: "PARAMS", + }, + ], + output: "arg", + colour: 120, + }, +]; + +/** + * Type of a 'nonebot_on_alconna' block. + * + * @internal + */ +export type AlconnaBlock = BlockSvg & AlconnaMixin; +interface AlconnaMixin extends AlconnaMixinType { + itemCount_: number; + topInput_: Blockly.Input | undefined; +} +type AlconnaMixinType = typeof ALCONNA; + +const ALCONNA = { + /** + * Number of item inputs the block has. + * @type {number} + */ + itemCount_: 0, + + /** + * Creates XML to represent number of text inputs. + * @returns {!Element} XML storage element. + * @this {Blockly.Block} + */ + mutationToDom: function (this: AlconnaBlock): Element { + const container = Blockly.utils.xml.createElement("mutation"); + container.setAttribute("items", String(this.itemCount_)); + return container; + }, + /** + * Parses XML to restore the text inputs. + * @param {!Element} xmlElement XML storage element. + * @this {Blockly.Block} + */ + domToMutation: function (this: AlconnaBlock, xmlElement: Element) { + const items = xmlElement.getAttribute("items"); + if (!items) throw new TypeError("element did not have items"); + this.itemCount_ = parseInt(items, 10); + this.updateShape_(); + }, + + /** + * Returns the state of this block as a JSON serializable object. + * @returns {{itemCount: number}} The state of this block, ie the item count. + */ + saveExtraState: function (this: AlconnaBlock): { itemCount: number } { + return { + itemCount: this.itemCount_, + }; + }, + + /** + * Applies the given state to this block. + * @param {*} state The state to apply to this block, ie the item count. + */ + loadExtraState: function (this: AlconnaBlock, state: any) { + const count = state["itemCount"]; + while (this.itemCount_ < count) { + this.addPart_(); + } + this.updateShape_(); + }, + + /** + * Adds inputs to the block until it reaches the target number of inputs. + * @this {Blockly.Block} + * @private + */ + updateShape_: function (this: AlconnaBlock) { + this.updateMinus_(); + }, + + /** + * Callback for the plus image. Adds an input to the end of the block and + * updates the state of the minus. + */ + plus: function (this: AlconnaBlock) { + this.addPart_(); + this.updateMinus_(); + }, + + /** + * Callback for the minus image. Removes an input from the end of the block + * and updates the state of the minus. + */ + minus: function (this: AlconnaBlock) { + if (this.itemCount_ == 0) { + return; + } + this.removePart_(); + this.updateMinus_(); + }, + + // To properly keep track of indices we have to increment before/after adding + // the inputs, and decrement the opposite. + // Because we want our first input to be ARG0 (not ARG1) we increment after. + + /** + * Adds an input to the end of the block. If the block currently has no + * inputs it updates the top 'EMPTY' input to receive a block. + * @this {Blockly.Block} + * @private + */ + addPart_: function (this: AlconnaBlock) { + const connection = (this.getInput("HANDLE") as Blockly.Input).connection?.targetConnection; + this.removeInput("HANDLE"); + if (this.itemCount_ == 0) { + this.removeInput("EMPTY"); + this.topInput_ = this.appendValueInput("ARG" + String(this.itemCount_)) + .setAlign(Blockly.inputs.Align.RIGHT) + .setCheck("arg") + .appendField(createPlusField(), "PLUS") + .appendField(`参数 ${this.itemCount_}`); + } else { + this.appendValueInput("ARG" + this.itemCount_) + .setAlign(Blockly.inputs.Align.RIGHT) + .setCheck("arg") + .appendField(`参数 ${this.itemCount_}`); + } + this.itemCount_++; + this.appendStatementInput("HANDLE"); + connection?.reconnect(this, "HANDLE"); + }, + + /** + * Removes an input from the end of the block. If we are removing the last + * input this updates the block to have an 'EMPTY' top input. + * @this {Blockly.Block} + * @private + */ + removePart_: function (this: AlconnaBlock) { + this.itemCount_--; + this.removeInput("ARG" + String(this.itemCount_)); + if (this.itemCount_ == 0) { + (this.topInput_ as Blockly.Input) = this.appendDummyInput("EMPTY") + .appendField(createPlusField(), "PLUS") + .setAlign(Blockly.inputs.Align.RIGHT) + .appendField("无其他命令参数"); + const connection = (this.getInput("HANDLE") as Blockly.Input).connection?.targetConnection; + this.removeInput("HANDLE"); + this.appendStatementInput("HANDLE"); + connection?.reconnect(this, "HANDLE"); + } + }, + + /** + * Makes it so the minus is visible iff there is an input available to remove. + * @private + */ + updateMinus_: function (this: AlconnaBlock) { + const minusField = this.getField("MINUS"); + if (!minusField && this.itemCount_ > 0) { + this.topInput_?.insertFieldAt(1, createMinusField(), "MINUS"); + } else if (minusField && this.itemCount_ < 1) { + this.topInput_?.removeField("MINUS"); + } + }, +}; + +/** + * Updates the shape of the block to have 0 inputs if no mutation is provided. + * @this {Blockly.Block} + */ +const ALCONNA_EXTENSION = function (this: AlconnaBlock) { + this.itemCount_ = 0; + this.updateShape_(); + this.getInput("EMPTY")?.insertFieldAt(0, createPlusField(), "PLUS"); +}; + +if (Blockly.Extensions.isRegistered("alconna_mutator")) { + Blockly.Extensions.unregister("alconna_mutator"); +} +Blockly.Extensions.registerMutator("alconna_mutator", ALCONNA, ALCONNA_EXTENSION); diff --git a/packages/app/src/blocks/nonebot_basic.ts b/packages/app/src/blocks/nonebot_basic.ts new file mode 100644 index 0000000..965376e --- /dev/null +++ b/packages/app/src/blocks/nonebot_basic.ts @@ -0,0 +1,104 @@ +import { BlockDefinition } from "blockly/core/blocks"; + +export const definitions: BlockDefinition[] = [ + { + type: "nonebot_on_message", + tooltip: "", + helpUrl: "", + message0: "消息处理 %1 仅与我相关 %2 %3 %4", + args0: [ + { + type: "input_dummy", + name: "NAME", + }, + { + type: "field_checkbox", + name: "TOME", + checked: "FALSE", + }, + { + type: "input_dummy", + name: "PARAMS", + }, + { + type: "input_statement", + name: "HANDLE", + }, + ], + colour: 0, + }, + { + type: "nonebot_on_command", + tooltip: "处理指定前缀(默认为'/')与命令字符串起始的消息,处理块内的消息文本为命令参数", + helpUrl: "", + message0: "命令处理 %1 命令字符串 %2 仅与我相关 %3 %4 %5", + args0: [ + { + type: "input_dummy", + name: "NAME", + }, + { + type: "field_input", + name: "COMMAND", + text: "hello", + }, + { + type: "field_checkbox", + name: "TOME", + checked: "FALSE", + }, + { + type: "input_dummy", + name: "PARAMS", + }, + { + type: "input_statement", + name: "HANDLE", + }, + ], + colour: 0, + }, + { + type: "nonebot_param_text", + tooltip: "", + helpUrl: "", + message0: "消息文本 %1", + args0: [ + { + type: "input_dummy", + name: "NAME", + }, + ], + output: null, + colour: 30, + }, + { + type: "nonebot_send", + tooltip: "", + helpUrl: "", + message0: "发送消息 %1 %2 结束处理流程 %3 %4", + args0: [ + { + type: "input_dummy", + name: "NAME", + }, + { + type: "input_value", + name: "MESSAGE", + }, + { + type: "field_checkbox", + name: "FINISH", + checked: "FALSE", + }, + { + type: "input_dummy", + name: "FINISH", + }, + ], + previousStatement: null, + nextStatement: null, + colour: 60, + inputsInline: true, + }, +]; diff --git a/packages/app/src/blocks/nonebot_handle.js b/packages/app/src/blocks/nonebot_handle.js deleted file mode 100644 index c468934..0000000 --- a/packages/app/src/blocks/nonebot_handle.js +++ /dev/null @@ -1,48 +0,0 @@ -import * as Blockly from "blockly/core"; -import { pythonGenerator, Order } from "blockly/python"; - -Blockly.defineBlocksWithJsonArray([ - { - type: "nb_handle", - message0: "事件处理 %1 响应器 %2 %3", - args0: [ - { - type: "input_dummy", - }, - { - type: "input_value", - name: "MATCHER", - check: "Matcher", - }, - { - type: "input_statement", - name: "HANDLE", - }, - ], - inputsInline: true, - previousStatement: null, - nextStatement: null, - colour: 60, - tooltip: "", - helpUrl: "", - }, -]); - -// The following is for the Python generator - -pythonGenerator.forBlock["nb_handle"] = function (block, generator) { - const value_matcher = generator.valueToCode(block, "MATCHER", Order.ATOMIC); - const statements_handle = - generator.statementToCode(block, "HANDLE") || generator.PASS; - generator.definitions_["from_nonebot_adapters_import_Bot"] = - "from nonebot.adapters import Bot"; - generator.definitions_["from_nonebot_adapters_import_Event"] = - "from nonebot.adapters import Event"; - let code = ""; - if (value_matcher) { - code += `@${value_matcher}.handle()\n`; - code += `async def _(bot: Bot, event: Event):\n`; - code += statements_handle; - } - return code; -}; diff --git a/packages/app/src/blocks/nonebot_logger.js b/packages/app/src/blocks/nonebot_logger.js deleted file mode 100644 index 0875cf6..0000000 --- a/packages/app/src/blocks/nonebot_logger.js +++ /dev/null @@ -1,6 +0,0 @@ -import * as Blockly from "blockly/core"; -import { pythonGenerator, Order } from "blockly/python"; - -Blockly.defineBlocksWithJsonArray([]); - -// The following is for the Python generator diff --git a/packages/app/src/blocks/nonebot_message.js b/packages/app/src/blocks/nonebot_message.js deleted file mode 100644 index fbc5db1..0000000 --- a/packages/app/src/blocks/nonebot_message.js +++ /dev/null @@ -1,371 +0,0 @@ -import * as Blockly from "blockly/core"; -import { pythonGenerator, Order } from "blockly/python"; - -Blockly.defineBlocksWithJsonArray([ - { - type: "nb_message_text", - message0: "文本消息 %1", - args0: [ - { - type: "field_input", - name: "TEXT", - text: "消息内容", - }, - ], - inputsInline: true, - output: "Message", - colour: 100, - tooltip: "", - helpUrl: "", - }, - { - type: "nb_message_image", - message0: "图片消息 %1 %2", - args0: [ - { - type: "field_dropdown", - name: "TYPE", - options: [ - ["URL", "url"], - ["本地路径", "path"], - ], - }, - { - type: "field_input", - name: "IMAGE", - text: "图片信息", - }, - ], - inputsInline: true, - output: "Message", - colour: 100, - tooltip: - "支持通过URL发送网络图片和通过文件路径发送本地图片。如果选择文件路径,请填写绝对路径或相对于机器人运行目录的相对路径", - helpUrl: "", - }, - { - type: "nb_message_send", - message0: "发送消息 %1 回复原消息 %2 @发送者 %3", - args0: [ - { - type: "input_value", - name: "MESSAGE", - check: "Message", - }, - { - type: "field_checkbox", - name: "REPLY", - checked: false, - }, - { - type: "field_checkbox", - name: "AT", - checked: true, - }, - ], - inputsInline: true, - previousStatement: null, - nextStatement: null, - colour: 100, - tooltip: "填入文本消息或图片消息构造块,也可以填入对应的变量", - helpUrl: "", - }, - { - type: "nb_message_finish", - message0: "发送消息并结束事件处理 %1 回复消息 %2 @发送者 %3", - args0: [ - { - type: "input_value", - name: "MESSAGE", - check: "Message", - }, - { - type: "field_checkbox", - name: "REPLY", - checked: false, - }, - { - type: "field_checkbox", - name: "AT", - checked: true, - }, - ], - inputsInline: true, - previousStatement: null, - colour: 100, - tooltip: "填入文本消息或图片消息构造块,也可以填入对应的变量", - helpUrl: "", - }, - { - type: "nb_message_merge_container", - message0: "消息列表 %1 %2", - args0: [ - { - type: "input_dummy", - }, - { - type: "input_statement", - name: "STACK", - }, - ], - colour: 0, - tooltip: "", - helpUrl: "", - }, - { - type: "nb_message_merge_item", - message0: "消息", - args0: [], - colour: 0, - previousStatement: null, - nextStatement: null, - tooltip: "", - helpUrl: "", - }, - { - type: "nb_message_merge", - message0: "合并多条消息 %1 第 1 条消息 %2 第 2 条消息 %3", - args0: [ - { - type: "input_dummy", - }, - { - type: "input_value", - name: "MESSAGE0", - check: "Message", - align: "RIGHT", - }, - { - type: "input_value", - name: "MESSAGE1", - check: "Message", - align: "RIGHT", - }, - ], - inputsInline: false, - output: "Message", - colour: 100, - tooltip: "填入文本消息或图片消息构造块,也可以填入对应的变量", - helpUrl: "", - mutator: "nb_message_merge_mutator", - }, -]); - -const nbMessageMergeMutator = { - itemCount_: 2, - /** - * Create XML to represent list inputs. - * Backwards compatible serialization implementation. - */ - mutationToDom: function () { - const container = document.createElement("mutation"); - container.setAttribute("items", this.itemCount_); - return container; - }, - /** - * Parse XML to restore the list inputs. - * Backwards compatible serialization implementation. - * - * @param container XML storage element. - */ - domToMutation: function (container) { - const items = container.getAttribute("items"); - if (!items) throw new TypeError("element did not have items"); - this.itemCount_ = parseInt(container.getAttribute("items"), 10); - this.updateShape_(); - }, - /** - * Returns the state of this block as a JSON serializable object. - * - * @returns The state of this block, ie the item count. - */ - saveExtraState: function () { - return { - itemCount: this.itemCount_, - }; - }, - /** - * Applies the given state to this block. - * - * @param state The state to apply to this block, ie the item count. - */ - loadExtraState: function (state) { - this.itemCount_ = state["itemCount"]; - this.updateShape_(); - }, - /** - * Populate the mutator's dialog with this block's components. - * - * @param workspace Mutator's workspace. - * @returns Root block in mutator. - */ - decompose: function (workspace) { - const containerBlock = workspace.newBlock("nb_message_merge_container"); - containerBlock.initSvg(); - let connection = containerBlock.getInput("STACK").connection; - for (let i = 0; i < this.itemCount_; i++) { - const itemBlock = workspace.newBlock("nb_message_merge_item"); - itemBlock.initSvg(); - if (!itemBlock.previousConnection) { - throw new Error("itemBlock has no previousConnection"); - } - connection.connect(itemBlock.previousConnection); - connection = itemBlock.nextConnection; - } - return containerBlock; - }, - /** - * Reconfigure this block based on the mutator dialog's components. - * - * @param containerBlock Root block in mutator. - */ - compose: function (containerBlock) { - let itemBlock = containerBlock.getInputTargetBlock("STACK"); - // Count number of inputs. - const connections = []; - while (itemBlock) { - if (itemBlock.isInsertionMarker()) { - itemBlock = itemBlock.getNextBlock(); - continue; - } - connections.push(itemBlock.valueConnection_); - itemBlock = itemBlock.getNextBlock(); - } - // Disconnect any children that don't belong. - for (let i = 0; i < this.itemCount_; i++) { - const connection = this.getInput("MESSAGE" + i).connection - .targetConnection; - if (connection && connections.indexOf(connection) === -1) { - connection.disconnect(); - } - } - this.itemCount_ = connections.length; - this.updateShape_(); - // Reconnect any child blocks. - for (let i = 0; i < this.itemCount_; i++) { - connections[i]?.reconnect(this, "MESSAGE" + i); - } - }, - /** - * Store pointers to any connected child blocks. - * - * @param containerBlock Root block in mutator. - */ - saveConnections: function (containerBlock) { - let itemBlock = containerBlock.getInputTargetBlock("STACK"); - let i = 0; - while (itemBlock) { - if (itemBlock.isInsertionMarker()) { - itemBlock = itemBlock.getNextBlock(); - continue; - } - const input = this.getInput("MESSAGE" + i); - itemBlock.valueConnection_ = input?.connection.targetConnection; - itemBlock = itemBlock.getNextBlock(); - i++; - } - }, - /** - * Modify this block to have the correct number of inputs. - */ - updateShape_: function () { - if (this.itemCount_ && this.getInput("EMPTY")) { - this.removeInput("EMPTY"); - } else if (!this.itemCount_ && !this.getInput("EMPTY")) { - this.appendDummyInput("EMPTY").appendField("空消息列表"); - } - // Add new inputs. - for (let i = 0; i < this.itemCount_; i++) { - if (!this.getInput("MESSAGE" + i)) { - this.appendValueInput("MESSAGE" + i) - .setAlign(Blockly.inputs.Align.RIGHT) - .appendField(`第 ${i + 1} 条消息`); - } - } - // Remove deleted inputs. - for (let i = this.itemCount_; this.getInput("MESSAGE" + i); i++) { - this.removeInput("MESSAGE" + i); - } - }, -}; - -// Function signature. - -if (Blockly.Extensions.isRegistered("nb_message_merge_mutator")) { - Blockly.Extensions.unregister("nb_message_merge_mutator"); -} -Blockly.Extensions.registerMutator( - "nb_message_merge_mutator", - nbMessageMergeMutator, -); - -// The following is for the Python generator - -pythonGenerator.forBlock["nb_message_text"] = function (block, generator) { - const text_text = block.getFieldValue("TEXT"); - generator.definitions_["from_nonebot_plugin_saa_import_Text"] = - "from nonebot_plugin_saa import Text"; - const code = `Text("${text_text}")`; - return [code, Order.ATOMIC]; -}; - -pythonGenerator.forBlock["nb_message_image"] = function (block, generator) { - const dropdown_type = block.getFieldValue("TYPE"); - const text_image = block.getFieldValue("IMAGE"); - generator.definitions_["from_nonebot_plugin_saa_import_Image"] = - "from nonebot_plugin_saa import Image"; - let image_code = ""; - if (dropdown_type === "url") { - image_code = `"${text_image}"`; - } else if (dropdown_type === "path") { - generator.definitions_["from_pathlib_import_Path"] = - "from pathlib import Path"; - image_code = `Path("${text_image.replace(/\\/g, "\\\\")}")`; - } - const code = `Image(${image_code})`; - return [code, Order.ATOMIC]; -}; - -pythonGenerator.forBlock["nb_message_send"] = function (block, generator) { - const value_message = generator.valueToCode(block, "MESSAGE", Order.ATOMIC); - const checkbox_reply = block.getFieldValue("REPLY") === "TRUE"; - const checkbox_at = block.getFieldValue("AT") === "TRUE"; - let params = []; - if (checkbox_reply) { - params.push("reply=True"); - } - if (checkbox_at) { - params.push("at_sender=True"); - } - const code = `await ${value_message}.send(${params.join(", ")})\n`; - return code; -}; - -pythonGenerator.forBlock["nb_message_finish"] = function (block, generator) { - const value_message = generator.valueToCode(block, "MESSAGE", Order.ATOMIC); - const checkbox_reply = block.getFieldValue("REPLY") === "TRUE"; - const checkbox_at = block.getFieldValue("AT") === "TRUE"; - let params = []; - if (checkbox_reply) { - params.push("reply=True"); - } - if (checkbox_at) { - params.push("at_sender=True"); - } - const code = `await ${value_message}.finish(${params.join(", ")})\n`; - return code; -}; - -pythonGenerator.forBlock["nb_message_merge"] = function (block, generator) { - let code = new Array(block.itemCount_); - generator.definitions_["from_nonebot_plugin_saa_import_MessageFactory"] = - "from nonebot_plugin_saa import MessageFactory"; - for (let n = 0; n < block.itemCount_; n++) { - code[n] = generator.valueToCode(block, "MESSAGE" + n, Order.NONE) || "None"; - } - code = code.filter(function (element) { - return element !== "None"; - }); - code = `MessageFactory([${code.join(", ")}])`; - return [code, Order.ATOMIC]; -}; diff --git a/packages/app/src/blocks/nonebot_store.ts b/packages/app/src/blocks/nonebot_store.ts new file mode 100644 index 0000000..09fefcc --- /dev/null +++ b/packages/app/src/blocks/nonebot_store.ts @@ -0,0 +1,55 @@ +import { BlockDefinition } from "blockly/core/blocks"; + +export const definitions: BlockDefinition[] = [ + { + type: "store_save_json", + tooltip: "", + helpUrl: "", + message0: "保存字典 %1 到文件 %2 %3", + args0: [ + { + type: "input_value", + name: "DICT", + check: "dict", + }, + { + type: "field_input", + name: "FILE", + text: "save.json", + }, + { + type: "input_dummy", + name: "PARAMS", + }, + ], + previousStatement: null, + nextStatement: null, + colour: 150, + inputsInline: true, + }, + { + type: "store_load_json", + tooltip: "", + helpUrl: "", + message0: "读取文件 %1 %2 到字典 %3", + args0: [ + { + type: "field_input", + name: "FILE", + text: "save.json", + }, + { + type: "input_dummy", + name: "PARAMS", + }, + { + type: "input_value", + name: "DICT", + }, + ], + previousStatement: null, + nextStatement: null, + colour: 150, + inputsInline: true, + }, +]; diff --git a/packages/app/src/blocks/python_dict.ts b/packages/app/src/blocks/python_dict.ts index 2d26d0f..2f7e8f4 100644 --- a/packages/app/src/blocks/python_dict.ts +++ b/packages/app/src/blocks/python_dict.ts @@ -79,8 +79,9 @@ export const pythonDict: BlockDefinition[] = [ check: "dict", }, { - type: "input_value", - name: "ITEM", + type: "field_input", + name: "KEY", + text: "key", }, ], output: null, @@ -90,6 +91,33 @@ export const pythonDict: BlockDefinition[] = [ colour: 0, // style: "dict_blocks", }, + { + type: "dicts_set", + message0: "设置字典 %1 中 KEY %2 的值为 %3", + args0: [ + { + type: "input_value", + name: "DICT", + check: "dict", + }, + { + type: "field_input", + name: "KEY", + text: "key", + }, + { + type: "input_value", + name: "VALUE", + }, + ], + inputsInline: true, + tooltip: "", + helpUrl: "", + previousStatement: null, + nextStatement: null, + colour: 0, + // style: "dict_blocks", + }, ]; /** @@ -104,7 +132,12 @@ interface DictCreateWithMixin extends DictCreateWithMixinType { type DictCreateWithMixinType = typeof DICTS_CREATE_WITH; const DICTS_CREATE_WITH = { + /** + * Number of item inputs the block has. + * @type {number} + */ itemCount_: 2, + /** * Block for creating a dict with any number of key-value of any type. */ @@ -114,7 +147,7 @@ const DICTS_CREATE_WITH = { */ mutationToDom: function (this: DictCreateWithBlock): Element { const container = Blockly.utils.xml.createElement("mutation"); - container.setAttribute("items", `${this.itemCount_}`); + container.setAttribute("items", String(this.itemCount_)); return container; }, /** @@ -175,9 +208,7 @@ const DICTS_CREATE_WITH = { * @param containerBlock Root block in mutator. */ compose: function (this: DictCreateWithBlock, containerBlock: Block) { - let itemBlock: ItemBlock | null = containerBlock.getInputTargetBlock( - "STACK", - ) as ItemBlock; + let itemBlock: ItemBlock | null = containerBlock.getInputTargetBlock("STACK") as ItemBlock; // Count number of inputs. const connections: Connection[] = []; while (itemBlock) { @@ -191,13 +222,11 @@ const DICTS_CREATE_WITH = { } // Disconnect any children that don't belong. for (let i = 0; i < this.itemCount_; i++) { - const connection_key = this.getInput("KEY" + i)!.connection! - .targetConnection; + const connection_key = this.getInput("KEY" + i)!.connection!.targetConnection; if (connection_key && connections.indexOf(connection_key) === -1) { connection_key.disconnect(); } - const connection_value = this.getInput("VALUE" + i)!.connection! - .targetConnection; + const connection_value = this.getInput("VALUE" + i)!.connection!.targetConnection; if (connection_value && connections.indexOf(connection_value) === -1) { connection_value.disconnect(); } @@ -212,9 +241,7 @@ const DICTS_CREATE_WITH = { }, saveConnections: function (this: DictCreateWithBlock, containerBlock: Block) { // Store a pointer to any connected child blocks. - let itemBlock: ItemBlock | null = containerBlock.getInputTargetBlock( - "STACK", - ) as ItemBlock; + let itemBlock: ItemBlock | null = containerBlock.getInputTargetBlock("STACK") as ItemBlock; let i = 0; while (itemBlock) { if (itemBlock.isInsertionMarker()) { @@ -305,16 +332,10 @@ const DICTS_CREATE_WITH_EXTENSION = function (this: DictCreateWithBlock) { this.itemCount_ = 2; this.updateShape_(); // Configure the mutator UI. - this.setMutator( - new Blockly.icons.MutatorIcon(["dicts_create_with_item"], this), - ); + this.setMutator(new Blockly.icons.MutatorIcon(["dicts_create_with_item"], this)); }; if (Blockly.Extensions.isRegistered("dict_create_with_mutator")) { Blockly.Extensions.unregister("dict_create_with_mutator"); } -Blockly.Extensions.registerMutator( - "dict_create_with_mutator", - DICTS_CREATE_WITH, - DICTS_CREATE_WITH_EXTENSION, -); +Blockly.Extensions.registerMutator("dict_create_with_mutator", DICTS_CREATE_WITH, DICTS_CREATE_WITH_EXTENSION); diff --git a/packages/app/src/data/default.json b/packages/app/src/data/default.json index 79c4d86..37167db 100644 --- a/packages/app/src/data/default.json +++ b/packages/app/src/data/default.json @@ -4,11 +4,163 @@ "blocks": [ { "type": "nonebot_on_command", - "id": "y$HwnY`3dr4Lk=5D7D18", - "x": 330, - "y": 250, - "fields": { "CMD": "指令", "TO_ME": false } + "id": "!WdCO9=B,k2IY0/Su4|I", + "x": 150, + "y": 210, + "fields": { "COMMAND": "save", "TOME": true }, + "inputs": { + "HANDLE": { + "block": { + "type": "store_load_json", + "id": "d.$llW7Lq)~KG{Z|h1+B", + "fields": { "FILE": "save.json" }, + "inputs": { + "DICT": { + "block": { + "type": "variables_get", + "id": "E,j@$a(@v[(]u_R${B+Z", + "fields": { "VAR": { "id": "VSvr3AeHEP),5NB5v$+;" } } + } + } + }, + "next": { + "block": { + "type": "variables_set", + "id": "gc.{0S@R!yzBky.dRf/T", + "fields": { "VAR": { "id": "dS|cq^n0{Ep#B]f*RtAH" } }, + "inputs": { + "VALUE": { + "block": { + "type": "dicts_get", + "id": "R5``m]FzB+yBPW1W2`]$", + "fields": { "KEY": "last" }, + "inputs": { + "DICT": { + "block": { + "type": "variables_get", + "id": "[Ws*B$JWgLY]BeT`^_=]", + "fields": { "VAR": { "id": "VSvr3AeHEP),5NB5v$+;" } } + } + } + } + } + } + }, + "next": { + "block": { + "type": "nonebot_send", + "id": "2VEO#b:zwo|#8!@y%P}q", + "fields": { "FINISH": false }, + "inputs": { + "MESSAGE": { + "block": { + "type": "text_join", + "id": "~Va]uDcID[2P5@n3z{pe", + "extraState": { "itemCount": 2 }, + "inputs": { + "ADD0": { + "block": { + "type": "text", + "id": "3Aw,]xK/YxeE+S`=:}vc", + "fields": { "TEXT": "last: " } + } + }, + "ADD1": { + "block": { + "type": "variables_get", + "id": "hF5`vj~{OC2uF+^}Q8yk", + "fields": { "VAR": { "id": "dS|cq^n0{Ep#B]f*RtAH" } } + } + } + } + } + } + }, + "next": { + "block": { + "type": "dicts_set", + "id": "B3Wx%a7x=Pp95taY%.*K", + "fields": { "KEY": "last" }, + "inputs": { + "DICT": { + "block": { + "type": "variables_get", + "id": "7iF8)`YtA.s.-@v_dYNo", + "fields": { "VAR": { "id": "VSvr3AeHEP),5NB5v$+;" } } + } + }, + "VALUE": { "block": { "type": "nonebot_param_text", "id": "{eYrM|C4so41hXY4~MtD" } } + }, + "next": { + "block": { + "type": "store_save_json", + "id": "sOck!o^D;xHPwNdX0v;s", + "fields": { "FILE": "save.json" }, + "inputs": { + "DICT": { + "block": { + "type": "variables_get", + "id": "Z8a4Wo4ae#)plFG}S:6B", + "fields": { "VAR": { "id": "VSvr3AeHEP),5NB5v$+;" } } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + }, + { + "type": "nonebot_on_message", + "id": "rJ[.=4k)POkDVT?Wz%zD", + "x": 150, + "y": 30, + "fields": { "TOME": false }, + "inputs": { + "HANDLE": { + "block": { + "type": "controls_if", + "id": "SBBb-4DL]Ofg,o5,lix9", + "inputs": { + "IF0": { + "block": { + "type": "logic_compare", + "id": "3KiI-ePNeWs/tZ.xUQd*", + "fields": { "OP": "EQ" }, + "inputs": { + "A": { "block": { "type": "nonebot_param_text", "id": "}:vuF-QZzN6NL{}`jW87" } }, + "B": { "block": { "type": "text", "id": ":R-~fjy%Xs,HExpeH$jd", "fields": { "TEXT": "ping" } } } + } + } + }, + "DO0": { + "block": { + "type": "nonebot_send", + "id": "zyjiCMiE87Wm_gt~i6dj", + "fields": { "FINISH": true }, + "inputs": { + "MESSAGE": { + "block": { "type": "text", "id": "NpK-srq00|eB:+v#I5t?", "fields": { "TEXT": "pong" } } + } + } + } + } + } + } + } + } } ] - } + }, + "variables": [ + { "name": "data_dict", "id": "VSvr3AeHEP),5NB5v$+;" }, + { "name": "last_param", "id": "dS|cq^n0{Ep#B]f*RtAH" } + ] } diff --git a/packages/app/src/generators/index.ts b/packages/app/src/generators/index.ts index 828f7ed..a46e593 100644 --- a/packages/app/src/generators/index.ts +++ b/packages/app/src/generators/index.ts @@ -1,4 +1,6 @@ -import { forBlock as pythonDictBlock } from "./python_dict"; -import { forBlock as nonebotMatcherBlock } from "./nonebot_matcher"; +import { forBlock as pythonDict } from "./python_dict"; +import { forBlock as nonebotBasic } from "./nonebot_basic"; +import { forBlock as nonebotAlconna } from "./nonebot_alconna"; +import { forBlock as nonebotStore } from "./nonebot_store"; -export const generators = [pythonDictBlock, nonebotMatcherBlock]; +export const generators = [pythonDict, nonebotBasic, nonebotAlconna, nonebotStore]; diff --git a/packages/app/src/generators/nonebot_alconna.ts b/packages/app/src/generators/nonebot_alconna.ts new file mode 100644 index 0000000..e3ecb44 --- /dev/null +++ b/packages/app/src/generators/nonebot_alconna.ts @@ -0,0 +1,59 @@ +import { PythonGenerator, Order } from "blockly/python"; +import * as Blockly from "blockly/core"; + +import { AlconnaBlock } from "@/blocks/nonebot_alconna"; + +export const forBlock = Object.create(null); + +forBlock["nonebot_on_alconna"] = function (block: AlconnaBlock, generator: PythonGenerator) { + const command = block.getFieldValue("COMMAND"); + const checkbox_tome = block.getFieldValue("TOME") === "TRUE"; + const statements_handle = generator.statementToCode(block, "HANDLE") || generator.PASS; + // generator["definitions_"]["from nonebot.adapters import Bot"] = "from nonebot.adapters import Bot"; + // generator["definitions_"]["from nonebot.adapters import Event"] = "from nonebot.adapters import Event"; + generator["definitions_"]["from nonebot.matcher import Matcher"] = "from nonebot.matcher import Matcher"; + generator["definitions_"]["from nonebot_plugin_alconna import on_alconna"] = + "from nonebot_plugin_alconna import on_alconna"; + let tome_statement = ""; + if (checkbox_tome) { + generator["definitions_"]["from nonebot.rule import to_me"] = "from nonebot.rule import to_me"; + tome_statement = ", rule=to_me()"; + } + let args: String[] = []; + let args_matcher = ""; + let args_function = ""; + if (block.itemCount_ != 0) { + for (let n = 0; n < block.itemCount_; n++) { + const block_type = block.getInput("ARG" + String(n))?.connection?.targetConnection?.getSourceBlock().type; + const arg_code = generator.valueToCode(block, "ARG" + String(n), Order.NONE); + if (block_type === "alconna_const") { + args_matcher += ` ${arg_code}`; + } else if (block_type === "alconna_arg") { + args_matcher += ` {${arg_code}}`; + args_function += `, ${arg_code}`; + // get name before `: type` + args.push(arg_code.split(":")[0]); + } + } + } + let code = `@on_alconna("${command}${args_matcher}"${tome_statement}).handle()\n`; + // code += `async def _(matcher: Matcher, bot: Bot, event: Event, message: Annotated[Message, CommandArg()]):\n`; + code += `async def _(matcher: Matcher${args_function}):\n`; + code += statements_handle; + code += "\n"; + return code; +}; + +forBlock["alconna_const"] = function (block: Blockly.Block, generator: PythonGenerator) { + const text = block.getFieldValue("TEXT"); + return [text, Order.ATOMIC]; +}; + +forBlock["alconna_arg"] = function (block: Blockly.Block, generator: PythonGenerator) { + const arg_name = block.getFieldValue("NAME"); + const arg_type = block.getFieldValue("TYPE"); + if (arg_name) { + return [`${generator.getVariableName("arg_" + arg_name)}: ${arg_type}`, Order.NONE]; + } + return ["", Order.ATOMIC]; +}; diff --git a/packages/app/src/generators/nonebot_basic.ts b/packages/app/src/generators/nonebot_basic.ts new file mode 100644 index 0000000..79070ec --- /dev/null +++ b/packages/app/src/generators/nonebot_basic.ts @@ -0,0 +1,66 @@ +import { PythonGenerator, Order } from "blockly/python"; +import * as Blockly from "blockly/core"; + +export const forBlock = Object.create(null); + +forBlock["nonebot_on_message"] = function (block: Blockly.Block, generator: PythonGenerator) { + const checkbox_tome = block.getFieldValue("TOME") === "TRUE"; + const statements_handle = generator.statementToCode(block, "HANDLE") || generator.PASS; + generator["definitions_"]["from typing import Annotated"] = "from typing import Annotated"; + // generator["definitions_"]["from nonebot.adapters import Bot"] = "from nonebot.adapters import Bot"; + // generator["definitions_"]["from nonebot.adapters import Event"] = "from nonebot.adapters import Event"; + generator["definitions_"]["from nonebot.matcher import Matcher"] = "from nonebot.matcher import Matcher"; + generator["definitions_"]["from nonebot.adapters import Message"] = "from nonebot.adapters import Message"; + generator["definitions_"]["from nonebot.params import EventMessage"] = "from nonebot.params import EventMessage"; + generator["definitions_"]["from nonebot.plugin import on_message"] = "from nonebot.plugin import on_message"; + let tome_statement = ""; + if (checkbox_tome) { + generator["definitions_"]["from nonebot.rule import to_me"] = "from nonebot.rule import to_me"; + tome_statement = "rule=to_me()"; + } + let code = `@on_message(${tome_statement}).handle()\n`; + // code += `async def _(matcher: Matcher, bot: Bot, event: Event, message: Annotated[Message, EventMessage()]):\n`; + code += `async def _(matcher: Matcher, message: Annotated[Message, EventMessage()]):\n`; + code += statements_handle; + code += "\n"; + return code; +}; + +forBlock["nonebot_on_command"] = function (block: Blockly.Block, generator: PythonGenerator) { + const text_command = block.getFieldValue("COMMAND"); + const checkbox_tome = block.getFieldValue("TOME") === "TRUE"; + const statements_handle = generator.statementToCode(block, "HANDLE") || generator.PASS; + generator["definitions_"]["from typing import Annotated"] = "from typing import Annotated"; + // generator["definitions_"]["from nonebot.adapters import Bot"] = "from nonebot.adapters import Bot"; + // generator["definitions_"]["from nonebot.adapters import Event"] = "from nonebot.adapters import Event"; + generator["definitions_"]["from nonebot.matcher import Matcher"] = "from nonebot.matcher import Matcher"; + generator["definitions_"]["from nonebot.adapters import Message"] = "from nonebot.adapters import Message"; + generator["definitions_"]["from nonebot.params import CommandArg"] = "from nonebot.params import CommandArg"; + generator["definitions_"]["from nonebot.plugin import on_command"] = "from nonebot.plugin import on_command"; + let tome_statement = ""; + if (checkbox_tome) { + generator["definitions_"]["from nonebot.rule import to_me"] = "from nonebot.rule import to_me"; + tome_statement = ", rule=to_me()"; + } + let code = `@on_command("${text_command}"${tome_statement}).handle()\n`; + // code += `async def _(matcher: Matcher, bot: Bot, event: Event, message: Annotated[Message, CommandArg()]):\n`; + code += `async def _(matcher: Matcher, message: Annotated[Message, CommandArg()]):\n`; + code += statements_handle; + code += "\n"; + return code; +}; + +forBlock["nonebot_param_text"] = function () { + const code = "message.extract_plain_text()"; + return [code, Order.NONE]; +}; + +forBlock["nonebot_send"] = function (block: Blockly.Block, generator: PythonGenerator) { + const message = generator.valueToCode(block, "MESSAGE", Order.ATOMIC); + const checkbox_tome = block.getFieldValue("FINISH") === "TRUE"; + if (checkbox_tome) { + return `await matcher.finish(${message})\n`; + } else { + return `await matcher.send(${message})\n`; + } +}; diff --git a/packages/app/src/generators/nonebot_store.ts b/packages/app/src/generators/nonebot_store.ts new file mode 100644 index 0000000..532e400 --- /dev/null +++ b/packages/app/src/generators/nonebot_store.ts @@ -0,0 +1,22 @@ +import { PythonGenerator, Order } from "blockly/python"; +import * as Blockly from "blockly/core"; + +export const forBlock = Object.create(null); + +forBlock["store_save_json"] = function (block: Blockly.Block, generator: PythonGenerator) { + const dict = generator.valueToCode(block, "DICT", Order.ATOMIC); + const file = block.getFieldValue("FILE"); + generator["definitions_"]["import json"] = "import json"; + generator["definitions_"]["import nonebot_plugin_localstore as store"] = "import nonebot_plugin_localstore as store"; + const code = `store.get_plugin_data_file("${file}").write_text(json.dumps(${dict}))\n`; + return code; +}; + +forBlock["store_load_json"] = function (block: Blockly.Block, generator: PythonGenerator) { + const dict = generator.valueToCode(block, "DICT", Order.ATOMIC); + const file = block.getFieldValue("FILE"); + generator["definitions_"]["import json"] = "import json"; + generator["definitions_"]["import nonebot_plugin_localstore as store"] = "import nonebot_plugin_localstore as store"; + const code = `${dict} = json.loads(store.get_plugin_data_file("${file}").read_text() if store.get_plugin_data_file("${file}").exists() else "{}")\n`; + return code; +}; diff --git a/packages/app/src/generators/python_dict.ts b/packages/app/src/generators/python_dict.ts index 8a9970d..0856329 100644 --- a/packages/app/src/generators/python_dict.ts +++ b/packages/app/src/generators/python_dict.ts @@ -4,22 +4,29 @@ import * as Blockly from "blockly/core"; import { DictCreateWithBlock } from "@/blocks/python_dict"; export const forBlock = Object.create(null); -// The following is for the Python generator -forBlock["dicts_get"] = function ( - block: Blockly.Block, - generator: Blockly.CodeGenerator, -) { +forBlock["dicts_get"] = function (block: Blockly.Block, generator: Blockly.CodeGenerator) { const dict = generator.valueToCode(block, "DICT", Order.MEMBER) || "{}"; - const value = generator.valueToCode(block, "ITEM", Order.NONE) || "None"; - const code = dict + "[" + value + "]"; + const key = block.getFieldValue("KEY"); + if (!key) { + return ["None", Order.ATOMIC]; + } + const code = `${dict}.get("${key}")`; return [code, Order.ATOMIC]; }; -forBlock["dicts_create_with"] = function ( - block: DictCreateWithBlock, - generator: Blockly.CodeGenerator, -) { +forBlock["dicts_set"] = function (block: Blockly.Block, generator: Blockly.CodeGenerator) { + const dict = generator.valueToCode(block, "DICT", Order.MEMBER) || "{}"; + const key = block.getFieldValue("KEY"); + if (!key) { + return ["None", Order.ATOMIC]; + } + const value = generator.valueToCode(block, "VALUE", Order.NONE) || "None"; + const code = `${dict}["${key}"] = ${value}\n`; + return code; +}; + +forBlock["dicts_create_with"] = function (block: DictCreateWithBlock, generator: Blockly.CodeGenerator) { let items = new Array(block.itemCount_); for (let n = 0; n < block.itemCount_; n++) { let key = generator.valueToCode(block, "KEY" + n, Order.NONE) || "None"; diff --git a/packages/app/src/toolbox.ts b/packages/app/src/toolbox.ts index 8e5500f..245732e 100644 --- a/packages/app/src/toolbox.ts +++ b/packages/app/src/toolbox.ts @@ -27,7 +27,6 @@ export const toolbox = { { kind: "BLOCK", type: "logic_null", - disabled: "true", }, { kind: "BLOCK", @@ -364,6 +363,10 @@ export const toolbox = { kind: "BLOCK", type: "dicts_get", }, + { + kind: "BLOCK", + type: "dicts_set", + }, ], name: "字典", colour: "0", @@ -376,19 +379,91 @@ export const toolbox = { contents: [ { kind: "LABEL", - text: "需要填入“事件处理”类模块的“响应器”中", + text: "“消息处理”块会处理所有收到的消息", + }, + { + kind: "BLOCK", + type: "nonebot_on_message", }, { kind: "LABEL", - text: "也可以创建一个变量赋值,使用变量传递", + text: "“命令处理”块只处理以指定前缀和命令起始的消息", }, { kind: "BLOCK", type: "nonebot_on_command", }, + { + kind: "LABEL", + text: "以下参数或方法仅能在“消息处理”或“命令处理”语句中使用", + }, + { + kind: "BLOCK", + type: "nonebot_param_text", + }, + { + kind: "BLOCK", + type: "nonebot_send", + }, + ], + name: "通用消息处理", + colour: "0", + }, + { + kind: "CATEGORY", + contents: [ + { + kind: "LABEL", + text: "“跨平台命令解析与处理”块提供更加灵活的跨平台命令解析支持", + }, + { + kind: "BLOCK", + type: "nonebot_on_alconna", + }, + { + kind: "LABEL", + text: "以下命令参数只能填充到“跨平台命令解析与处理”中对应位置", + }, + { + kind: "BLOCK", + type: "alconna_const", + }, + { + kind: "BLOCK", + type: "alconna_arg", + }, + { + kind: "LABEL", + text: "以下参数或方法仅能在“跨平台命令解析与处理”语句中使用", + }, + ], + name: "跨平台命令处理", + colour: "90", + }, + { + kind: "CATEGORY", + contents: [ + { + kind: "BLOCK", + type: "store_save_json", + }, + { + kind: "BLOCK", + type: "store_load_json", + }, ], - name: "事件响应器", - colour: "20", + name: "文件存储", + colour: "150", + }, + { + kind: "CATEGORY", + name: "定时任务", + colour: "210", + }, + { + kind: "CATEGORY", + name: "网络请求", + colour: "270", }, { kind: "SEP", From 7485d5de9b9e9b164d9de32cedecbb28f87e04b1 Mon Sep 17 00:00:00 2001 From: mobyw Date: Thu, 12 Sep 2024 14:05:43 +0800 Subject: [PATCH 06/19] :sparkles: More function blocks --- .../app/src/blocks/fields/alconna_helper.ts | 30 +++++ .../{components => fields}/field_minus.ts | 10 +- .../{components => fields}/field_plus.ts | 10 +- .../serialization_helper.ts | 0 packages/app/src/blocks/index.ts | 11 +- packages/app/src/blocks/nonebot_alconna.ts | 39 +++++- packages/app/src/blocks/nonebot_basic.ts | 3 +- packages/app/src/blocks/nonebot_request.ts | 127 ++++++++++++++++++ packages/app/src/blocks/nonebot_util.ts | 3 + packages/app/src/blocks/python_dict.ts | 24 +++- packages/app/src/data/default.json | 44 ++++-- packages/app/src/generators/index.ts | 9 +- .../app/src/generators/nonebot_alconna.ts | 98 +++++++++++--- packages/app/src/generators/nonebot_basic.ts | 57 +++++--- .../app/src/generators/nonebot_request.ts | 47 +++++++ packages/app/src/generators/nonebot_store.ts | 16 ++- packages/app/src/generators/python_dict.ts | 23 +++- packages/app/src/toolbox.ts | 14 ++ 18 files changed, 490 insertions(+), 75 deletions(-) create mode 100644 packages/app/src/blocks/fields/alconna_helper.ts rename packages/app/src/blocks/{components => fields}/field_minus.ts (91%) rename packages/app/src/blocks/{components => fields}/field_plus.ts (91%) rename packages/app/src/blocks/{components => fields}/serialization_helper.ts (100%) create mode 100644 packages/app/src/blocks/nonebot_request.ts create mode 100644 packages/app/src/blocks/nonebot_util.ts create mode 100644 packages/app/src/generators/nonebot_request.ts diff --git a/packages/app/src/blocks/fields/alconna_helper.ts b/packages/app/src/blocks/fields/alconna_helper.ts new file mode 100644 index 0000000..4a1001f --- /dev/null +++ b/packages/app/src/blocks/fields/alconna_helper.ts @@ -0,0 +1,30 @@ +import * as Blockly from "blockly/core"; + +export function getAlconnaArg(block: Blockly.Block): string[] { + let args: string[] = []; + // get top block + let parent = block.getParent(); + if (parent == null) { + return []; + } + while (parent.type != "nonebot_on_alconna") { + parent = parent.getParent(); + if (parent == null) { + return []; + } + } + // get all arg blocks of alconna top block + for (let n = 0; n < (parent as any).itemCount_; n++) { + const arg_block = parent + .getInput("ARG" + String(n)) + ?.connection?.targetConnection?.getSourceBlock(); + const arg_type = arg_block?.type; + if (arg_type === "alconna_arg") { + const arg_name = arg_block?.getFieldValue("NAME"); + if (arg_name) { + args.push(arg_name); + } + } + } + return args; +} diff --git a/packages/app/src/blocks/components/field_minus.ts b/packages/app/src/blocks/fields/field_minus.ts similarity index 91% rename from packages/app/src/blocks/components/field_minus.ts rename to packages/app/src/blocks/fields/field_minus.ts index 987f380..ed564e1 100644 --- a/packages/app/src/blocks/components/field_minus.ts +++ b/packages/app/src/blocks/fields/field_minus.ts @@ -47,7 +47,15 @@ function onClick_(minusField: Blockly.FieldImage) { const newExtraState = getExtraBlockState(block); if (oldExtraState != newExtraState) { - Blockly.Events.fire(new Blockly.Events.BlockChange(block, "mutation", null, oldExtraState, newExtraState)); + Blockly.Events.fire( + new Blockly.Events.BlockChange( + block, + "mutation", + null, + oldExtraState, + newExtraState, + ), + ); } Blockly.Events.setGroup(false); } diff --git a/packages/app/src/blocks/components/field_plus.ts b/packages/app/src/blocks/fields/field_plus.ts similarity index 91% rename from packages/app/src/blocks/components/field_plus.ts rename to packages/app/src/blocks/fields/field_plus.ts index 2bc6b94..f72d286 100644 --- a/packages/app/src/blocks/components/field_plus.ts +++ b/packages/app/src/blocks/fields/field_plus.ts @@ -47,7 +47,15 @@ function onClick_(plusField: Blockly.FieldImage) { const newExtraState = getExtraBlockState(block); if (oldExtraState != newExtraState) { - Blockly.Events.fire(new Blockly.Events.BlockChange(block, "mutation", null, oldExtraState, newExtraState)); + Blockly.Events.fire( + new Blockly.Events.BlockChange( + block, + "mutation", + null, + oldExtraState, + newExtraState, + ), + ); } Blockly.Events.setGroup(false); } diff --git a/packages/app/src/blocks/components/serialization_helper.ts b/packages/app/src/blocks/fields/serialization_helper.ts similarity index 100% rename from packages/app/src/blocks/components/serialization_helper.ts rename to packages/app/src/blocks/fields/serialization_helper.ts diff --git a/packages/app/src/blocks/index.ts b/packages/app/src/blocks/index.ts index f80bfef..63a7f2c 100644 --- a/packages/app/src/blocks/index.ts +++ b/packages/app/src/blocks/index.ts @@ -5,9 +5,16 @@ import { pythonDict } from "./python_dict"; import { definitions as nonebotBasic } from "./nonebot_basic"; import { definitions as nonebotAlconna } from "./nonebot_alconna"; import { definitions as nonebotStore } from "./nonebot_store"; +import { definitions as nonebotRequest } from "./nonebot_request"; // Array of all block definitions let blockDefinitions: BlockDefinition[] = []; -blockDefinitions = blockDefinitions.concat(pythonDict).concat(nonebotBasic).concat(nonebotAlconna).concat(nonebotStore); +blockDefinitions = blockDefinitions + .concat(pythonDict) + .concat(nonebotBasic) + .concat(nonebotAlconna) + .concat(nonebotStore) + .concat(nonebotRequest); -export const blocks = Blockly.common.createBlockDefinitionsFromJsonArray(blockDefinitions); +export const blocks = + Blockly.common.createBlockDefinitionsFromJsonArray(blockDefinitions); diff --git a/packages/app/src/blocks/nonebot_alconna.ts b/packages/app/src/blocks/nonebot_alconna.ts index e4d6742..fb03d12 100644 --- a/packages/app/src/blocks/nonebot_alconna.ts +++ b/packages/app/src/blocks/nonebot_alconna.ts @@ -1,15 +1,17 @@ import * as Blockly from "blockly/core"; import type { BlockDefinition } from "blockly/core/blocks"; import type { BlockSvg } from "blockly/core/block_svg"; -import { createPlusField } from "./components/field_plus"; -import { createMinusField } from "./components/field_minus"; + +import { createPlusField } from "./fields/field_plus"; +import { createMinusField } from "./fields/field_minus"; export const definitions: BlockDefinition[] = [ { type: "nonebot_on_alconna", tooltip: "", helpUrl: "", - message0: "跨平台命令解析与处理 %1 命令字符串 %2 仅与我相关 %3 %4 无其他命令参数 %5 %6", + message0: + "跨平台命令解析与处理 %1 命令字符串 %2 仅与我相关 %3 %4 无其他命令参数 %5 %6", args0: [ { type: "input_dummy", @@ -90,6 +92,25 @@ export const definitions: BlockDefinition[] = [ output: "arg", colour: 120, }, + { + type: "alconna_arg_get", + tooltip: "", + helpUrl: "", + message0: "获取参数 %1 %2", + args0: [ + { + type: "field_dropdown", + name: "NAME", + options: [["-", ""]], + }, + { + type: "input_dummy", + name: "PARAMS", + }, + ], + output: null, + colour: 120, + }, ]; /** @@ -196,7 +217,8 @@ const ALCONNA = { * @private */ addPart_: function (this: AlconnaBlock) { - const connection = (this.getInput("HANDLE") as Blockly.Input).connection?.targetConnection; + const connection = (this.getInput("HANDLE") as Blockly.Input).connection + ?.targetConnection; this.removeInput("HANDLE"); if (this.itemCount_ == 0) { this.removeInput("EMPTY"); @@ -230,7 +252,8 @@ const ALCONNA = { .appendField(createPlusField(), "PLUS") .setAlign(Blockly.inputs.Align.RIGHT) .appendField("无其他命令参数"); - const connection = (this.getInput("HANDLE") as Blockly.Input).connection?.targetConnection; + const connection = (this.getInput("HANDLE") as Blockly.Input).connection + ?.targetConnection; this.removeInput("HANDLE"); this.appendStatementInput("HANDLE"); connection?.reconnect(this, "HANDLE"); @@ -264,4 +287,8 @@ const ALCONNA_EXTENSION = function (this: AlconnaBlock) { if (Blockly.Extensions.isRegistered("alconna_mutator")) { Blockly.Extensions.unregister("alconna_mutator"); } -Blockly.Extensions.registerMutator("alconna_mutator", ALCONNA, ALCONNA_EXTENSION); +Blockly.Extensions.registerMutator( + "alconna_mutator", + ALCONNA, + ALCONNA_EXTENSION, +); diff --git a/packages/app/src/blocks/nonebot_basic.ts b/packages/app/src/blocks/nonebot_basic.ts index 965376e..cf7653c 100644 --- a/packages/app/src/blocks/nonebot_basic.ts +++ b/packages/app/src/blocks/nonebot_basic.ts @@ -29,7 +29,8 @@ export const definitions: BlockDefinition[] = [ }, { type: "nonebot_on_command", - tooltip: "处理指定前缀(默认为'/')与命令字符串起始的消息,处理块内的消息文本为命令参数", + tooltip: + "处理指定前缀(默认为'/')与命令字符串起始的消息,处理块内的消息文本为命令参数", helpUrl: "", message0: "命令处理 %1 命令字符串 %2 仅与我相关 %3 %4 %5", args0: [ diff --git a/packages/app/src/blocks/nonebot_request.ts b/packages/app/src/blocks/nonebot_request.ts new file mode 100644 index 0000000..5e17b65 --- /dev/null +++ b/packages/app/src/blocks/nonebot_request.ts @@ -0,0 +1,127 @@ +import { BlockDefinition } from "blockly/core/blocks"; + +export const definitions: BlockDefinition[] = [ + { + type: "request_get", + tooltip: "", + helpUrl: "", + message0: + "网络请求 GET %1 链接 %2 (可选)参数字典 %3 (可选)标头字典 %4 返回 %5 %6 %7 秒超时 %8", + args0: [ + { + type: "input_dummy", + name: "NAME", + }, + { + type: "input_value", + name: "URL", + align: "RIGHT", + check: "String", + }, + { + type: "input_value", + name: "PARAMS", + align: "RIGHT", + check: "dict", + }, + { + type: "input_value", + name: "HEADERS", + check: "dict", + }, + { + type: "field_dropdown", + name: "TYPE", + options: [ + ["字典", "dict"], + ["文本", "string"], + ["二进制", "binary"], + ], + }, + { + type: "input_dummy", + name: "TYPE", + align: "RIGHT", + }, + { + type: "field_number", + name: "TIMEOUT", + value: 60, + min: 0, + }, + { + type: "input_dummy", + name: "TIMEOUT", + align: "RIGHT", + }, + ], + output: null, + colour: 270, + inputsInline: false, + }, + { + type: "request_post", + tooltip: "", + helpUrl: "", + message0: + "网络请求 POST %1 链接 %2 数据字典 %3 (可选)参数字典 %4 (可选)标头字典 %5 返回 %6 %7 %8 秒超时 %9", + args0: [ + { + type: "input_dummy", + name: "NAME", + }, + { + type: "input_value", + name: "URL", + align: "RIGHT", + check: "String", + }, + { + type: "input_value", + name: "JSON", + align: "RIGHT", + check: "dict", + }, + { + type: "input_value", + name: "PARAMS", + align: "RIGHT", + check: "dict", + }, + { + type: "input_value", + name: "HEADER", + align: "RIGHT", + check: "dict", + }, + { + type: "field_dropdown", + name: "TYPE", + options: [ + ["字典", "dict"], + ["文本", "string"], + ["二进制", "binary"], + ], + }, + { + type: "input_dummy", + name: "TYPE", + align: "RIGHT", + }, + { + type: "field_number", + name: "TIMEOUT", + value: 60, + min: 0, + }, + { + type: "input_dummy", + name: "TIMEOUT", + align: "RIGHT", + }, + ], + output: null, + colour: 270, + inputsInline: false, + }, +]; diff --git a/packages/app/src/blocks/nonebot_util.ts b/packages/app/src/blocks/nonebot_util.ts new file mode 100644 index 0000000..67d9648 --- /dev/null +++ b/packages/app/src/blocks/nonebot_util.ts @@ -0,0 +1,3 @@ +import { BlockDefinition } from "blockly/core/blocks"; + +export const definitions: BlockDefinition[] = []; diff --git a/packages/app/src/blocks/python_dict.ts b/packages/app/src/blocks/python_dict.ts index 2f7e8f4..3575900 100644 --- a/packages/app/src/blocks/python_dict.ts +++ b/packages/app/src/blocks/python_dict.ts @@ -208,7 +208,9 @@ const DICTS_CREATE_WITH = { * @param containerBlock Root block in mutator. */ compose: function (this: DictCreateWithBlock, containerBlock: Block) { - let itemBlock: ItemBlock | null = containerBlock.getInputTargetBlock("STACK") as ItemBlock; + let itemBlock: ItemBlock | null = containerBlock.getInputTargetBlock( + "STACK", + ) as ItemBlock; // Count number of inputs. const connections: Connection[] = []; while (itemBlock) { @@ -222,11 +224,13 @@ const DICTS_CREATE_WITH = { } // Disconnect any children that don't belong. for (let i = 0; i < this.itemCount_; i++) { - const connection_key = this.getInput("KEY" + i)!.connection!.targetConnection; + const connection_key = this.getInput("KEY" + i)!.connection! + .targetConnection; if (connection_key && connections.indexOf(connection_key) === -1) { connection_key.disconnect(); } - const connection_value = this.getInput("VALUE" + i)!.connection!.targetConnection; + const connection_value = this.getInput("VALUE" + i)!.connection! + .targetConnection; if (connection_value && connections.indexOf(connection_value) === -1) { connection_value.disconnect(); } @@ -241,7 +245,9 @@ const DICTS_CREATE_WITH = { }, saveConnections: function (this: DictCreateWithBlock, containerBlock: Block) { // Store a pointer to any connected child blocks. - let itemBlock: ItemBlock | null = containerBlock.getInputTargetBlock("STACK") as ItemBlock; + let itemBlock: ItemBlock | null = containerBlock.getInputTargetBlock( + "STACK", + ) as ItemBlock; let i = 0; while (itemBlock) { if (itemBlock.isInsertionMarker()) { @@ -332,10 +338,16 @@ const DICTS_CREATE_WITH_EXTENSION = function (this: DictCreateWithBlock) { this.itemCount_ = 2; this.updateShape_(); // Configure the mutator UI. - this.setMutator(new Blockly.icons.MutatorIcon(["dicts_create_with_item"], this)); + this.setMutator( + new Blockly.icons.MutatorIcon(["dicts_create_with_item"], this), + ); }; if (Blockly.Extensions.isRegistered("dict_create_with_mutator")) { Blockly.Extensions.unregister("dict_create_with_mutator"); } -Blockly.Extensions.registerMutator("dict_create_with_mutator", DICTS_CREATE_WITH, DICTS_CREATE_WITH_EXTENSION); +Blockly.Extensions.registerMutator( + "dict_create_with_mutator", + DICTS_CREATE_WITH, + DICTS_CREATE_WITH_EXTENSION, +); diff --git a/packages/app/src/data/default.json b/packages/app/src/data/default.json index 37167db..7d06984 100644 --- a/packages/app/src/data/default.json +++ b/packages/app/src/data/default.json @@ -39,7 +39,9 @@ "block": { "type": "variables_get", "id": "[Ws*B$JWgLY]BeT`^_=]", - "fields": { "VAR": { "id": "VSvr3AeHEP),5NB5v$+;" } } + "fields": { + "VAR": { "id": "VSvr3AeHEP),5NB5v$+;" } + } } } } @@ -69,7 +71,9 @@ "block": { "type": "variables_get", "id": "hF5`vj~{OC2uF+^}Q8yk", - "fields": { "VAR": { "id": "dS|cq^n0{Ep#B]f*RtAH" } } + "fields": { + "VAR": { "id": "dS|cq^n0{Ep#B]f*RtAH" } + } } } } @@ -86,10 +90,17 @@ "block": { "type": "variables_get", "id": "7iF8)`YtA.s.-@v_dYNo", - "fields": { "VAR": { "id": "VSvr3AeHEP),5NB5v$+;" } } + "fields": { + "VAR": { "id": "VSvr3AeHEP),5NB5v$+;" } + } } }, - "VALUE": { "block": { "type": "nonebot_param_text", "id": "{eYrM|C4so41hXY4~MtD" } } + "VALUE": { + "block": { + "type": "nonebot_param_text", + "id": "{eYrM|C4so41hXY4~MtD" + } + } }, "next": { "block": { @@ -101,7 +112,9 @@ "block": { "type": "variables_get", "id": "Z8a4Wo4ae#)plFG}S:6B", - "fields": { "VAR": { "id": "VSvr3AeHEP),5NB5v$+;" } } + "fields": { + "VAR": { "id": "VSvr3AeHEP),5NB5v$+;" } + } } } } @@ -135,8 +148,19 @@ "id": "3KiI-ePNeWs/tZ.xUQd*", "fields": { "OP": "EQ" }, "inputs": { - "A": { "block": { "type": "nonebot_param_text", "id": "}:vuF-QZzN6NL{}`jW87" } }, - "B": { "block": { "type": "text", "id": ":R-~fjy%Xs,HExpeH$jd", "fields": { "TEXT": "ping" } } } + "A": { + "block": { + "type": "nonebot_param_text", + "id": "}:vuF-QZzN6NL{}`jW87" + } + }, + "B": { + "block": { + "type": "text", + "id": ":R-~fjy%Xs,HExpeH$jd", + "fields": { "TEXT": "ping" } + } + } } } }, @@ -147,7 +171,11 @@ "fields": { "FINISH": true }, "inputs": { "MESSAGE": { - "block": { "type": "text", "id": "NpK-srq00|eB:+v#I5t?", "fields": { "TEXT": "pong" } } + "block": { + "type": "text", + "id": "NpK-srq00|eB:+v#I5t?", + "fields": { "TEXT": "pong" } + } } } } diff --git a/packages/app/src/generators/index.ts b/packages/app/src/generators/index.ts index a46e593..3e42dc7 100644 --- a/packages/app/src/generators/index.ts +++ b/packages/app/src/generators/index.ts @@ -2,5 +2,12 @@ import { forBlock as pythonDict } from "./python_dict"; import { forBlock as nonebotBasic } from "./nonebot_basic"; import { forBlock as nonebotAlconna } from "./nonebot_alconna"; import { forBlock as nonebotStore } from "./nonebot_store"; +import { forBlock as nonebotRequest } from "./nonebot_request"; -export const generators = [pythonDict, nonebotBasic, nonebotAlconna, nonebotStore]; +export const generators = [ + pythonDict, + nonebotBasic, + nonebotAlconna, + nonebotStore, + nonebotRequest, +]; diff --git a/packages/app/src/generators/nonebot_alconna.ts b/packages/app/src/generators/nonebot_alconna.ts index e3ecb44..8358320 100644 --- a/packages/app/src/generators/nonebot_alconna.ts +++ b/packages/app/src/generators/nonebot_alconna.ts @@ -2,38 +2,49 @@ import { PythonGenerator, Order } from "blockly/python"; import * as Blockly from "blockly/core"; import { AlconnaBlock } from "@/blocks/nonebot_alconna"; +import { getAlconnaArg } from "@/blocks/fields/alconna_helper"; export const forBlock = Object.create(null); -forBlock["nonebot_on_alconna"] = function (block: AlconnaBlock, generator: PythonGenerator) { +forBlock["nonebot_on_alconna"] = function ( + block: AlconnaBlock, + generator: PythonGenerator, +) { const command = block.getFieldValue("COMMAND"); const checkbox_tome = block.getFieldValue("TOME") === "TRUE"; - const statements_handle = generator.statementToCode(block, "HANDLE") || generator.PASS; + const statements_handle = + generator.statementToCode(block, "HANDLE") || generator.PASS; // generator["definitions_"]["from nonebot.adapters import Bot"] = "from nonebot.adapters import Bot"; // generator["definitions_"]["from nonebot.adapters import Event"] = "from nonebot.adapters import Event"; - generator["definitions_"]["from nonebot.matcher import Matcher"] = "from nonebot.matcher import Matcher"; + generator["definitions_"]["from nonebot.matcher import Matcher"] = + "from nonebot.matcher import Matcher"; generator["definitions_"]["from nonebot_plugin_alconna import on_alconna"] = "from nonebot_plugin_alconna import on_alconna"; let tome_statement = ""; if (checkbox_tome) { - generator["definitions_"]["from nonebot.rule import to_me"] = "from nonebot.rule import to_me"; + generator["definitions_"]["from nonebot.rule import to_me"] = + "from nonebot.rule import to_me"; tome_statement = ", rule=to_me()"; } let args: String[] = []; let args_matcher = ""; let args_function = ""; - if (block.itemCount_ != 0) { - for (let n = 0; n < block.itemCount_; n++) { - const block_type = block.getInput("ARG" + String(n))?.connection?.targetConnection?.getSourceBlock().type; - const arg_code = generator.valueToCode(block, "ARG" + String(n), Order.NONE); - if (block_type === "alconna_const") { - args_matcher += ` ${arg_code}`; - } else if (block_type === "alconna_arg") { - args_matcher += ` {${arg_code}}`; - args_function += `, ${arg_code}`; - // get name before `: type` - args.push(arg_code.split(":")[0]); - } + for (let n = 0; n < block.itemCount_; n++) { + const block_type = block + .getInput("ARG" + String(n)) + ?.connection?.targetConnection?.getSourceBlock().type; + const arg_code = generator.valueToCode( + block, + "ARG" + String(n), + Order.NONE, + ); + if (block_type === "alconna_const") { + args_matcher += ` ${arg_code}`; + } else if (block_type === "alconna_arg") { + args_matcher += ` {${arg_code}}`; + args_function += `, ${arg_code}`; + // get name before `: type` + args.push(arg_code.split(":")[0]); } } let code = `@on_alconna("${command}${args_matcher}"${tome_statement}).handle()\n`; @@ -44,16 +55,59 @@ forBlock["nonebot_on_alconna"] = function (block: AlconnaBlock, generator: Pytho return code; }; -forBlock["alconna_const"] = function (block: Blockly.Block, generator: PythonGenerator) { +forBlock["alconna_const"] = function ( + block: Blockly.Block, + generator: PythonGenerator, +) { const text = block.getFieldValue("TEXT"); return [text, Order.ATOMIC]; }; -forBlock["alconna_arg"] = function (block: Blockly.Block, generator: PythonGenerator) { - const arg_name = block.getFieldValue("NAME"); - const arg_type = block.getFieldValue("TYPE"); - if (arg_name) { - return [`${generator.getVariableName("arg_" + arg_name)}: ${arg_type}`, Order.NONE]; +forBlock["alconna_arg"] = function ( + block: Blockly.Block, + generator: PythonGenerator, +) { + const name = block.getFieldValue("NAME"); + const type = block.getFieldValue("TYPE"); + if (name) { + return [`${generator.getVariableName("arg_" + name)}: ${type}`, Order.NONE]; + } + return ["", Order.ATOMIC]; +}; + +forBlock["alconna_arg_get"] = function ( + block: Blockly.Block, + generator: PythonGenerator, +) { + // This generator will also update the dropdown list + const name = block.getFieldValue("NAME"); + const args = getAlconnaArg(block); + if (args.length === 0) { + this.removeInput("PARAMS"); + this.setWarningText("请放置在“跨平台命令处理”中使用"); + this.appendDummyInput("PARAMS") + .appendField("获取参数") + .appendField(new Blockly.FieldDropdown([["-", ""]]), "NAME"); + return ["", Order.ATOMIC]; + } + if (!args.find((arg) => arg === name)) { + this.removeInput("PARAMS"); + this.setWarningText(); + this.appendDummyInput("PARAMS") + ?.appendField("获取参数") + .appendField( + new Blockly.FieldDropdown(function () { + let options: [string, string][] = []; + args.forEach((arg) => { + options.push([arg, arg]); + }); + return options; + }), + "NAME", + ); + } + if (name) { + return [generator.getVariableName("arg_" + name), Order.NONE]; } return ["", Order.ATOMIC]; }; diff --git a/packages/app/src/generators/nonebot_basic.ts b/packages/app/src/generators/nonebot_basic.ts index 79070ec..846aa65 100644 --- a/packages/app/src/generators/nonebot_basic.ts +++ b/packages/app/src/generators/nonebot_basic.ts @@ -3,19 +3,29 @@ import * as Blockly from "blockly/core"; export const forBlock = Object.create(null); -forBlock["nonebot_on_message"] = function (block: Blockly.Block, generator: PythonGenerator) { +forBlock["nonebot_on_message"] = function ( + block: Blockly.Block, + generator: PythonGenerator, +) { const checkbox_tome = block.getFieldValue("TOME") === "TRUE"; - const statements_handle = generator.statementToCode(block, "HANDLE") || generator.PASS; - generator["definitions_"]["from typing import Annotated"] = "from typing import Annotated"; + const statements_handle = + generator.statementToCode(block, "HANDLE") || generator.PASS; + generator["definitions_"]["from typing import Annotated"] = + "from typing import Annotated"; // generator["definitions_"]["from nonebot.adapters import Bot"] = "from nonebot.adapters import Bot"; // generator["definitions_"]["from nonebot.adapters import Event"] = "from nonebot.adapters import Event"; - generator["definitions_"]["from nonebot.matcher import Matcher"] = "from nonebot.matcher import Matcher"; - generator["definitions_"]["from nonebot.adapters import Message"] = "from nonebot.adapters import Message"; - generator["definitions_"]["from nonebot.params import EventMessage"] = "from nonebot.params import EventMessage"; - generator["definitions_"]["from nonebot.plugin import on_message"] = "from nonebot.plugin import on_message"; + generator["definitions_"]["from nonebot.matcher import Matcher"] = + "from nonebot.matcher import Matcher"; + generator["definitions_"]["from nonebot.adapters import Message"] = + "from nonebot.adapters import Message"; + generator["definitions_"]["from nonebot.params import EventMessage"] = + "from nonebot.params import EventMessage"; + generator["definitions_"]["from nonebot.plugin import on_message"] = + "from nonebot.plugin import on_message"; let tome_statement = ""; if (checkbox_tome) { - generator["definitions_"]["from nonebot.rule import to_me"] = "from nonebot.rule import to_me"; + generator["definitions_"]["from nonebot.rule import to_me"] = + "from nonebot.rule import to_me"; tome_statement = "rule=to_me()"; } let code = `@on_message(${tome_statement}).handle()\n`; @@ -26,20 +36,30 @@ forBlock["nonebot_on_message"] = function (block: Blockly.Block, generator: Pyth return code; }; -forBlock["nonebot_on_command"] = function (block: Blockly.Block, generator: PythonGenerator) { +forBlock["nonebot_on_command"] = function ( + block: Blockly.Block, + generator: PythonGenerator, +) { const text_command = block.getFieldValue("COMMAND"); const checkbox_tome = block.getFieldValue("TOME") === "TRUE"; - const statements_handle = generator.statementToCode(block, "HANDLE") || generator.PASS; - generator["definitions_"]["from typing import Annotated"] = "from typing import Annotated"; + const statements_handle = + generator.statementToCode(block, "HANDLE") || generator.PASS; + generator["definitions_"]["from typing import Annotated"] = + "from typing import Annotated"; // generator["definitions_"]["from nonebot.adapters import Bot"] = "from nonebot.adapters import Bot"; // generator["definitions_"]["from nonebot.adapters import Event"] = "from nonebot.adapters import Event"; - generator["definitions_"]["from nonebot.matcher import Matcher"] = "from nonebot.matcher import Matcher"; - generator["definitions_"]["from nonebot.adapters import Message"] = "from nonebot.adapters import Message"; - generator["definitions_"]["from nonebot.params import CommandArg"] = "from nonebot.params import CommandArg"; - generator["definitions_"]["from nonebot.plugin import on_command"] = "from nonebot.plugin import on_command"; + generator["definitions_"]["from nonebot.matcher import Matcher"] = + "from nonebot.matcher import Matcher"; + generator["definitions_"]["from nonebot.adapters import Message"] = + "from nonebot.adapters import Message"; + generator["definitions_"]["from nonebot.params import CommandArg"] = + "from nonebot.params import CommandArg"; + generator["definitions_"]["from nonebot.plugin import on_command"] = + "from nonebot.plugin import on_command"; let tome_statement = ""; if (checkbox_tome) { - generator["definitions_"]["from nonebot.rule import to_me"] = "from nonebot.rule import to_me"; + generator["definitions_"]["from nonebot.rule import to_me"] = + "from nonebot.rule import to_me"; tome_statement = ", rule=to_me()"; } let code = `@on_command("${text_command}"${tome_statement}).handle()\n`; @@ -55,7 +75,10 @@ forBlock["nonebot_param_text"] = function () { return [code, Order.NONE]; }; -forBlock["nonebot_send"] = function (block: Blockly.Block, generator: PythonGenerator) { +forBlock["nonebot_send"] = function ( + block: Blockly.Block, + generator: PythonGenerator, +) { const message = generator.valueToCode(block, "MESSAGE", Order.ATOMIC); const checkbox_tome = block.getFieldValue("FINISH") === "TRUE"; if (checkbox_tome) { diff --git a/packages/app/src/generators/nonebot_request.ts b/packages/app/src/generators/nonebot_request.ts new file mode 100644 index 0000000..3db0bb6 --- /dev/null +++ b/packages/app/src/generators/nonebot_request.ts @@ -0,0 +1,47 @@ +import { PythonGenerator, Order } from "blockly/python"; +import * as Blockly from "blockly/core"; + +export const forBlock = Object.create(null); + +forBlock["request_get"] = function ( + block: Blockly.Block, + generator: PythonGenerator, +) { + const url = generator.valueToCode(block, "URL", Order.ATOMIC); + const params = generator.valueToCode(block, "PARAMS", Order.ATOMIC) || "None"; + const headers = + generator.valueToCode(block, "HEADERS", Order.ATOMIC) || "None"; + const type = block.getFieldValue("TYPE"); + const timeout = block.getFieldValue("TIMEOUT"); + if (url === "" || url === "None") { + return ["None", Order.ATOMIC]; + } + generator["definitions_"]["from nonebot import get_driver"] = + "from nonebot import get_driver"; + generator["definitions_"]["from nonebot.drivers import Request"] = + "from nonebot.drivers import Request"; + generator["definitions_"]["from nonebot.drivers import HTTPClientMixin"] = + "from nonebot.drivers import HTTPClientMixin"; + generator["definitions_"]["nonebot_request_driver"] = + 'driver = get_driver() \n\ +if not isinstance(driver, HTTPClientMixin): \n\ + raise RuntimeError( \n\ + f"Current driver {driver} does not support http client requests!" \n\ +)'; + const request = `Request("GET", ${url}, params=${params}, headers=${headers}, timeout=${timeout})`; + const content = `(await driver.request(${request})).content`; + let code = content; + if (type === "dict") { + generator["definitions_"]["import json"] = "import json"; + code = `json.loads(${content} or "{}")`; + } + return [code, Order.ATOMIC]; +}; + +forBlock["request_post"] = function ( + block: Blockly.Block, + generator: PythonGenerator, +) { + const code = `\n`; + return [code, Order.ATOMIC]; +}; diff --git a/packages/app/src/generators/nonebot_store.ts b/packages/app/src/generators/nonebot_store.ts index 532e400..e465d06 100644 --- a/packages/app/src/generators/nonebot_store.ts +++ b/packages/app/src/generators/nonebot_store.ts @@ -3,20 +3,28 @@ import * as Blockly from "blockly/core"; export const forBlock = Object.create(null); -forBlock["store_save_json"] = function (block: Blockly.Block, generator: PythonGenerator) { +forBlock["store_save_json"] = function ( + block: Blockly.Block, + generator: PythonGenerator, +) { const dict = generator.valueToCode(block, "DICT", Order.ATOMIC); const file = block.getFieldValue("FILE"); generator["definitions_"]["import json"] = "import json"; - generator["definitions_"]["import nonebot_plugin_localstore as store"] = "import nonebot_plugin_localstore as store"; + generator["definitions_"]["import nonebot_plugin_localstore as store"] = + "import nonebot_plugin_localstore as store"; const code = `store.get_plugin_data_file("${file}").write_text(json.dumps(${dict}))\n`; return code; }; -forBlock["store_load_json"] = function (block: Blockly.Block, generator: PythonGenerator) { +forBlock["store_load_json"] = function ( + block: Blockly.Block, + generator: PythonGenerator, +) { const dict = generator.valueToCode(block, "DICT", Order.ATOMIC); const file = block.getFieldValue("FILE"); generator["definitions_"]["import json"] = "import json"; - generator["definitions_"]["import nonebot_plugin_localstore as store"] = "import nonebot_plugin_localstore as store"; + generator["definitions_"]["import nonebot_plugin_localstore as store"] = + "import nonebot_plugin_localstore as store"; const code = `${dict} = json.loads(store.get_plugin_data_file("${file}").read_text() if store.get_plugin_data_file("${file}").exists() else "{}")\n`; return code; }; diff --git a/packages/app/src/generators/python_dict.ts b/packages/app/src/generators/python_dict.ts index 0856329..bd37b69 100644 --- a/packages/app/src/generators/python_dict.ts +++ b/packages/app/src/generators/python_dict.ts @@ -5,7 +5,10 @@ import { DictCreateWithBlock } from "@/blocks/python_dict"; export const forBlock = Object.create(null); -forBlock["dicts_get"] = function (block: Blockly.Block, generator: Blockly.CodeGenerator) { +forBlock["dicts_get"] = function ( + block: Blockly.Block, + generator: Blockly.CodeGenerator, +) { const dict = generator.valueToCode(block, "DICT", Order.MEMBER) || "{}"; const key = block.getFieldValue("KEY"); if (!key) { @@ -15,7 +18,10 @@ forBlock["dicts_get"] = function (block: Blockly.Block, generator: Blockly.CodeG return [code, Order.ATOMIC]; }; -forBlock["dicts_set"] = function (block: Blockly.Block, generator: Blockly.CodeGenerator) { +forBlock["dicts_set"] = function ( + block: Blockly.Block, + generator: Blockly.CodeGenerator, +) { const dict = generator.valueToCode(block, "DICT", Order.MEMBER) || "{}"; const key = block.getFieldValue("KEY"); if (!key) { @@ -26,12 +32,17 @@ forBlock["dicts_set"] = function (block: Blockly.Block, generator: Blockly.CodeG return code; }; -forBlock["dicts_create_with"] = function (block: DictCreateWithBlock, generator: Blockly.CodeGenerator) { - let items = new Array(block.itemCount_); +forBlock["dicts_create_with"] = function ( + block: DictCreateWithBlock, + generator: Blockly.CodeGenerator, +) { + let items = new Array(); for (let n = 0; n < block.itemCount_; n++) { - let key = generator.valueToCode(block, "KEY" + n, Order.NONE) || "None"; + let key = generator.valueToCode(block, "KEY" + n, Order.NONE); let value = generator.valueToCode(block, "VALUE" + n, Order.NONE) || "None"; - items[n] = key + ": " + value; + if (key) { + items.push(`${key}: ${value}`); + } } const code = "{" + items.join(", ") + "}"; return [code, Order.ATOMIC]; diff --git a/packages/app/src/toolbox.ts b/packages/app/src/toolbox.ts index 245732e..6bcbfc3 100644 --- a/packages/app/src/toolbox.ts +++ b/packages/app/src/toolbox.ts @@ -436,6 +436,10 @@ export const toolbox = { kind: "LABEL", text: "以下参数或方法仅能在“跨平台命令解析与处理”语句中使用", }, + { + kind: "BLOCK", + type: "alconna_arg_get", + }, ], name: "跨平台命令处理", colour: "90", @@ -462,6 +466,16 @@ export const toolbox = { }, { kind: "CATEGORY", + contents: [ + { + kind: "BLOCK", + type: "request_get", + }, + { + kind: "BLOCK", + type: "request_post", + }, + ], name: "网络请求", colour: "270", }, From 072224b640ccfd19d318d4b2df0cbdb7814c0135 Mon Sep 17 00:00:00 2001 From: mobyw Date: Thu, 12 Sep 2024 15:10:09 +0800 Subject: [PATCH 07/19] :art: Improve structure --- packages/app/src/App.vue | 98 ++++++++- packages/app/src/components/ButtonPanel.vue | 20 +- packages/app/src/components/CodeTab.vue | 4 +- packages/app/src/components/ContentCard.vue | 6 +- packages/app/src/components/TutorialTab.vue | 2 +- packages/app/src/data/default.json | 194 ------------------ packages/app/src/default.ts | 194 ++++++++++++++++++ packages/app/src/serialization.ts | 32 --- packages/app/src/{theme/index.ts => theme.ts} | 0 .../{stores/workspaces.ts => workspace.ts} | 46 ++--- packages/app/src/workspaces/index.vue | 101 --------- packages/app/tsconfig.json | 1 + 12 files changed, 330 insertions(+), 368 deletions(-) delete mode 100644 packages/app/src/data/default.json create mode 100644 packages/app/src/default.ts delete mode 100644 packages/app/src/serialization.ts rename packages/app/src/{theme/index.ts => theme.ts} (100%) rename packages/app/src/{stores/workspaces.ts => workspace.ts} (70%) delete mode 100644 packages/app/src/workspaces/index.vue diff --git a/packages/app/src/App.vue b/packages/app/src/App.vue index e906550..945134e 100644 --- a/packages/app/src/App.vue +++ b/packages/app/src/App.vue @@ -1,7 +1,101 @@ + + + + diff --git a/packages/app/src/components/ButtonPanel.vue b/packages/app/src/components/ButtonPanel.vue index fd03cb6..7d2be56 100644 --- a/packages/app/src/components/ButtonPanel.vue +++ b/packages/app/src/components/ButtonPanel.vue @@ -2,11 +2,11 @@ import { useTheme } from "vuetify"; import { copyCode, - loadJSON, - saveJSON, - outputsStore, + loadJson, + saveJson, + OutputsStore, setWorkspaceTheme, -} from "@/stores/workspaces"; +} from "@/workspace"; const theme = useTheme(); @@ -38,25 +38,25 @@ function toggleTheme() { - {{ outputsStore.snackbarMsg }} + {{ OutputsStore.snackbarMsg }} - + 暂存 暂存工作区 - + 恢复 diff --git a/packages/app/src/components/CodeTab.vue b/packages/app/src/components/CodeTab.vue index e49baf8..e5dcb37 100644 --- a/packages/app/src/components/CodeTab.vue +++ b/packages/app/src/components/CodeTab.vue @@ -1,12 +1,12 @@