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 new file mode 100644 index 0000000..5cf6e28 --- /dev/null +++ b/packages/app/index.html @@ -0,0 +1,28 @@ + + + + + + + NoneBlockly for NoneBot2 + + + +
+ + + + + diff --git a/packages/app/package.json b/packages/app/package.json index 8282a61..5c354a6 100644 --- a/packages/app/package.json +++ b/packages/app/package.json @@ -1,30 +1,37 @@ { "name": "@noneblockly/app", - "version": "0.0.0", - "main": "index.js", + "version": "0.1.0", + "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": "vite build", + "preview": "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", - "typescript": "^5.4.4", - "webpack": "^5.91.0", - "webpack-cli": "^4.10.0", - "webpack-dev-server": "^4.15.2" + "@blockly/theme-dark": "^7.0.1", + "@highlightjs/vue-plugin": "^2.1.0", + "@mdi/js": "^7.4.47", + "@types/file-saver": "^2.0.7", + "@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.21" }, "dependencies": { - "blockly": "^10.4.3" + "blockly": "^11.1.1", + "file-saver": "^2.0.5", + "highlight.js": "^11.9.0", + "jszip": "^3.10.1", + "sass": "^1.77.6", + "vue": "^3.4.29", + "vuetify": "^3.6.10" } } diff --git a/packages/app/src/App.vue b/packages/app/src/App.vue new file mode 100644 index 0000000..8625df4 --- /dev/null +++ b/packages/app/src/App.vue @@ -0,0 +1,85 @@ + + + + + + + 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/fields/field_minus.ts b/packages/app/src/blocks/fields/field_minus.ts new file mode 100644 index 0000000..ed564e1 --- /dev/null +++ b/packages/app/src/blocks/fields/field_minus.ts @@ -0,0 +1,67 @@ +/** + * @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/fields/field_plus.ts b/packages/app/src/blocks/fields/field_plus.ts new file mode 100644 index 0000000..f72d286 --- /dev/null +++ b/packages/app/src/blocks/fields/field_plus.ts @@ -0,0 +1,69 @@ +/** + * @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/fields/serialization_helper.ts b/packages/app/src/blocks/fields/serialization_helper.ts new file mode 100644 index 0000000..8c99b0f --- /dev/null +++ b/packages/app/src/blocks/fields/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 new file mode 100644 index 0000000..8940226 --- /dev/null +++ b/packages/app/src/blocks/index.ts @@ -0,0 +1,22 @@ +import * as Blockly from "blockly/core"; +import { BlockDefinition } from "blockly/core/blocks"; + +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 nonebotScheduler } from "./nonebot_scheduler"; +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) + .concat(nonebotScheduler) + .concat(nonebotRequest); + +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..09cd656 --- /dev/null +++ b/packages/app/src/blocks/nonebot_alconna.ts @@ -0,0 +1,333 @@ +import * as Blockly from "blockly/core"; +import type { BlockDefinition } from "blockly/core/blocks"; +import type { BlockSvg } from "blockly/core/block_svg"; + +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", + 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: "alconna_arg_get", + tooltip: "", + helpUrl: "", + message0: "获取参数 %1 %2", + args0: [ + { + type: "field_dropdown", + name: "NAME", + options: [["-", ""]], + }, + { + type: "input_dummy", + name: "PARAMS", + }, + ], + output: null, + colour: 120, + mutator: "alconna_arg_get_mutator", + }, +]; + +/** + * 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"); + } + }, +}; + +/** + * Type of a 'nonebot_on_alconna' block. + * + * @internal + */ +export type AlconnaArgGetBlock = BlockSvg & AlconnaArgGetMixin; +interface AlconnaArgGetMixin extends AlconnaArgGetMixinType { + name_: string; + isInitialized_: boolean; +} +type AlconnaArgGetMixinType = typeof ALCONNA_ARG_GET; + +const ALCONNA_ARG_GET = { + name_: "", + isInitialized_: false, + + /** + * Returns the state of this block as a JSON serializable object. + */ + saveExtraState: function (this: AlconnaArgGetBlock): { name: string } { + return { name: this.name_ }; + }, + + /** + * Applies the given state to this block. + * @param {*} state The state to apply to this block, ie the item count. + */ + loadExtraState: function (this: AlconnaArgGetBlock, state: any) { + const name = state["name"]; + this.name_ = name; + }, +}; + +/** + * 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, +); + +if (Blockly.Extensions.isRegistered("alconna_arg_get_mutator")) { + Blockly.Extensions.unregister("alconna_arg_get_mutator"); +} +Blockly.Extensions.registerMutator("alconna_arg_get_mutator", ALCONNA_ARG_GET); diff --git a/packages/app/src/blocks/nonebot_basic.ts b/packages/app/src/blocks/nonebot_basic.ts new file mode 100644 index 0000000..cf7653c --- /dev/null +++ b/packages/app/src/blocks/nonebot_basic.ts @@ -0,0 +1,105 @@ +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_matcher.ts b/packages/app/src/blocks/nonebot_matcher.ts new file mode 100644 index 0000000..b189662 --- /dev/null +++ b/packages/app/src/blocks/nonebot_matcher.ts @@ -0,0 +1,29 @@ +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/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_scheduler.ts b/packages/app/src/blocks/nonebot_scheduler.ts new file mode 100644 index 0000000..f41c897 --- /dev/null +++ b/packages/app/src/blocks/nonebot_scheduler.ts @@ -0,0 +1,167 @@ +import { BlockDefinition } from "blockly/core/blocks"; + +export const definitions: BlockDefinition[] = [ + { + type: "scheduler_add", + tooltip: "", + helpUrl: "", + message0: "添加定时任务 %1 定时时间 %2 ID %3 %4", + args0: [ + { + type: "input_dummy", + name: "NAME", + }, + { + type: "input_value", + name: "TIME", + align: "RIGHT", + check: "time", + }, + { + type: "input_value", + name: "ID", + align: "RIGHT", + check: "String", + }, + { + type: "input_statement", + name: "HANDLE", + }, + ], + previousStatement: null, + nextStatement: null, + colour: 210, + }, + { + type: "scheduler_remove", + tooltip: "", + helpUrl: "", + message0: "移除定时任务 %1 ID %2", + args0: [ + { + type: "input_dummy", + name: "NAME", + }, + { + type: "input_value", + name: "ID", + check: "String", + }, + ], + previousStatement: null, + nextStatement: null, + colour: 210, + inputsInline: true, + }, + { + type: "scheduler_time_interval", + tooltip: "", + helpUrl: "", + message0: "每 %1 %2 %3", + args0: [ + { + type: "field_number", + name: "NUMBER", + value: 30, + min: 0, + }, + { + type: "field_dropdown", + name: "UNIT", + options: [ + ["秒", "seconds"], + ["分", "minutes"], + ["时", "hours"], + ["天", "days"], + ["周", "weeks"], + ], + }, + { + type: "input_dummy", + name: "NAME", + }, + ], + output: "time", + colour: 240, + }, + { + type: "scheduler_time_cron_daily", + tooltip: "", + helpUrl: "", + message0: "每天 %1 时 %2 分 %3 秒 %4", + args0: [ + { + type: "field_dropdown", + name: "HOUR", + options: [["任意", '"*"']].concat( + Array.from({ length: 24 }, (_, i) => [String(i), String(i)]), + ), + }, + { + type: "field_dropdown", + name: "MINUTE", + options: [["任意", '"*"']].concat( + Array.from({ length: 60 }, (_, i) => [String(i), String(i)]), + ), + }, + { + type: "field_dropdown", + name: "SECOND", + options: Array.from({ length: 60 }, (_, i) => [String(i), String(i)]), + }, + { + type: "input_dummy", + name: "NAME", + }, + ], + output: "time", + colour: 240, + }, + { + type: "scheduler_time_cron", + tooltip: "", + helpUrl: "", + message0: "在 %1 月 %2 日 %3 时 %4 分 %5 秒 %6", + args0: [ + { + type: "field_dropdown", + name: "MONTH", + options: [["任意", '"*"']].concat( + Array.from({ length: 12 }, (_, i) => [String(i + 1), String(i + 1)]), + ), + }, + { + type: "field_dropdown", + name: "DAY", + options: [["任意", '"*"']].concat( + Array.from({ length: 31 }, (_, i) => [String(i + 1), String(i + 1)]), + ), + }, + { + type: "field_dropdown", + name: "HOUR", + options: [["任意", '"*"']].concat( + Array.from({ length: 24 }, (_, i) => [String(i), String(i)]), + ), + }, + { + type: "field_dropdown", + name: "MINUTE", + options: [["任意", '"*"']].concat( + Array.from({ length: 60 }, (_, i) => [String(i), String(i)]), + ), + }, + { + type: "field_dropdown", + name: "SECOND", + options: Array.from({ length: 60 }, (_, i) => [String(i), String(i)]), + }, + { + type: "input_dummy", + name: "NAME", + }, + ], + output: "time", + colour: 240, + }, +]; diff --git a/packages/app/src/blocks/nonebot_store.ts b/packages/app/src/blocks/nonebot_store.ts new file mode 100644 index 0000000..cdea815 --- /dev/null +++ b/packages/app/src/blocks/nonebot_store.ts @@ -0,0 +1,96 @@ +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 的字典", + args0: [ + { + type: "field_input", + name: "FILE", + text: "save.json", + }, + { + type: "input_dummy", + name: "PARAMS", + }, + ], + output: "DICT", + colour: 150, + inputsInline: true, + }, + { + type: "store_save_text", + tooltip: "", + helpUrl: "", + message0: "保存文本 %1 到文件 %2 %3", + args0: [ + { + type: "input_value", + name: "TEXT", + check: "String", + }, + { + type: "field_input", + name: "FILE", + text: "save.txt", + }, + { + type: "input_dummy", + name: "PARAMS", + }, + ], + previousStatement: null, + nextStatement: null, + colour: 180, + inputsInline: true, + }, + { + type: "store_load_text", + tooltip: "", + helpUrl: "", + message0: "读取文件 %1 %2 的文本", + args0: [ + { + type: "field_input", + name: "FILE", + text: "save.txt", + }, + { + type: "input_dummy", + name: "PARAMS", + }, + ], + output: "String", + colour: 180, + inputsInline: true, + }, +]; 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 new file mode 100644 index 0000000..0402b49 --- /dev/null +++ b/packages/app/src/blocks/python_dict.ts @@ -0,0 +1,431 @@ +import * as Blockly from "blockly/core"; +import type { BlockDefinition } from "blockly/core/blocks"; +import type { BlockSvg } from "blockly/core/block_svg"; + +import { createPlusField } from "./fields/field_plus"; +import { createMinusField } from "./fields/field_minus"; + +export const pythonDict: BlockDefinition[] = [ + { + type: "dicts_create_with", + message0: "创建字典 %1 空字典 %2", + args0: [ + { + type: "input_dummy", + }, + { + type: "input_dummy", + name: "EMPTY", + align: "RIGHT", + }, + ], + output: "dict", + tooltip: "", + helpUrl: "", + mutator: "dict_create_with_mutator", + colour: 0, + // style: "dict_blocks", + }, + { + type: "dicts_get", + message0: "从字典 %1 中取键 %2 的值", + args0: [ + { + type: "input_value", + name: "DICT", + check: "dict", + }, + { + type: "field_input", + name: "KEY", + text: "key", + }, + ], + output: null, + inputsInline: true, + tooltip: "", + helpUrl: "", + colour: 0, + // style: "dict_blocks", + }, + { + type: "dicts_get_multi", + message0: "从字典 %1 连续取值 %2 %3", + args0: [ + { + type: "input_value", + name: "DICT", + check: "dict", + }, + { + type: "input_dummy", + name: "TOOLS", + }, + { + type: "input_dummy", + name: "KEYS", + }, + ], + output: null, + inputsInline: true, + tooltip: "", + helpUrl: "", + mutator: "dict_get_multi_mutator", + colour: 0, + // style: "dict_blocks", + }, + { + type: "dicts_set", + message0: "设置字典 %1 键 %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", + }, +]; + +/** + * Type of a 'dicts_create_with' block. + * + * @internal + */ +export type DictCreateWithBlock = BlockSvg & DictCreateWithMixin; +interface DictCreateWithMixin extends DictCreateWithMixinType { + itemCount_: number; + topInput_: Blockly.Input | undefined; +} +type DictCreateWithMixinType = typeof DICTS_CREATE_WITH; + +const DICTS_CREATE_WITH = { + /** + * Number of item inputs the block has. + * @type {number} + */ + itemCount_: 0, + + /** + * 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", String(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) { + const count = state["itemCount"]; + while (this.itemCount_ < count) { + this.addPart_(); + } + this.updateShape_(); + }, + + /** + * Modify this block to have the correct number of inputs. + */ + updateShape_: function (this: DictCreateWithBlock) { + 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: DictCreateWithBlock) { + 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: DictCreateWithBlock) { + 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: DictCreateWithBlock) { + if (this.itemCount_ == 0) { + this.removeInput("EMPTY"); + this.topInput_ = this.appendValueInput("KEY" + String(this.itemCount_)) + .setAlign(Blockly.inputs.Align.RIGHT) + .appendField(createPlusField(), "PLUS") + .appendField(`键 ${this.itemCount_}`); + this.appendValueInput("VALUE" + String(this.itemCount_)) + .setAlign(Blockly.inputs.Align.RIGHT) + .appendField(`值 ${this.itemCount_}`); + } else { + this.appendValueInput("KEY" + String(this.itemCount_)) + .setAlign(Blockly.inputs.Align.RIGHT) + .appendField(`键 ${this.itemCount_}`); + this.appendValueInput("VALUE" + String(this.itemCount_)) + .setAlign(Blockly.inputs.Align.RIGHT) + .appendField(`值 ${this.itemCount_}`); + } + this.itemCount_++; + }, + + /** + * 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: DictCreateWithBlock) { + this.itemCount_--; + this.removeInput("KEY" + String(this.itemCount_)); + this.removeInput("VALUE" + String(this.itemCount_)); + if (this.itemCount_ == 0) { + (this.topInput_ as Blockly.Input) = this.appendDummyInput("EMPTY") + .appendField(createPlusField(), "PLUS") + .setAlign(Blockly.inputs.Align.RIGHT) + .appendField("空字典"); + } + }, + + /** + * Makes it so the minus is visible iff there is an input available to remove. + * @private + */ + updateMinus_: function (this: DictCreateWithBlock) { + 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"); + } + }, +}; + +const DICTS_CREATE_WITH_EXTENSION = function (this: DictCreateWithBlock) { + this.itemCount_ = 0; + this.updateShape_(); + this.getInput("EMPTY")?.insertFieldAt(0, createPlusField(), "PLUS"); +}; + +/** + * Type of a 'dicts_get_multi' block. + * + * @internal + */ +export type DictGetMultiBlock = BlockSvg & DictGetMultiMixin; +interface DictGetMultiMixin extends DictGetMultiMixinType { + itemCount_: number; +} +type DictGetMultiMixinType = typeof DICTS_GET_MULTI; + +const DICTS_GET_MULTI = { + /** + * Number of item inputs the block has. + * @type {number} + */ + itemCount_: 1, + + /** + * Create XML to represent list inputs. + * Backwards compatible serialization implementation. + */ + mutationToDom: function (this: DictGetMultiBlock): Element { + const container = Blockly.utils.xml.createElement("mutation"); + container.setAttribute("items", String(this.itemCount_)); + return container; + }, + + /** + * Parse XML to restore the list inputs. + * Backwards compatible serialization implementation. + * + * @param container XML storage element. + */ + domToMutation: function (this: DictGetMultiBlock, 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: DictGetMultiBlock): { 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: DictGetMultiBlock, state: any) { + const count = state["itemCount"]; + while (this.itemCount_ < count) { + this.addPart_(); + } + this.updateShape_(); + }, + + /** + * Modify this block to have the correct number of inputs. + */ + updateShape_: function (this: DictGetMultiBlock) { + 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: DictGetMultiBlock) { + 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: DictGetMultiBlock) { + if (this.itemCount_ == 1) { + 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: DictGetMultiBlock) { + this.getInput("KEYS")?.appendField( + new Blockly.FieldTextInput("key" + String(this.itemCount_)), + "KEY" + String(this.itemCount_), + ); + this.itemCount_++; + }, + + /** + * 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: DictGetMultiBlock) { + this.itemCount_--; + this.getInput("KEYS")?.removeField("KEY" + String(this.itemCount_)); + }, + + /** + * Makes it so the minus is visible iff there is an input available to remove. + * @private + */ + updateMinus_: function (this: DictGetMultiBlock) { + const minusField = this.getField("MINUS"); + if (!minusField && this.itemCount_ > 1) { + this.getInput("TOOLS")?.insertFieldAt(1, createMinusField(), "MINUS"); + } else if (minusField && this.itemCount_ < 2) { + this.getInput("TOOLS")?.removeField("MINUS"); + } + }, +}; + +const DICTS_GET_MULTI_EXTENSION = function (this: DictGetMultiBlock) { + this.itemCount_ = 1; + this.updateShape_(); + this.getInput("KEYS")?.appendField( + new Blockly.FieldTextInput("key0"), + "KEY0", + ); + this.getInput("TOOLS")?.insertFieldAt(0, createPlusField(), "PLUS"); +}; + +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, +); + +if (Blockly.Extensions.isRegistered("dict_get_multi_mutator")) { + Blockly.Extensions.unregister("dict_get_multi_mutator"); +} +Blockly.Extensions.registerMutator( + "dict_get_multi_mutator", + DICTS_GET_MULTI, + DICTS_GET_MULTI_EXTENSION, +); diff --git a/packages/app/src/components/BlocklyTab.vue b/packages/app/src/components/BlocklyTab.vue new file mode 100644 index 0000000..07e5f2f --- /dev/null +++ b/packages/app/src/components/BlocklyTab.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..1a6e104 --- /dev/null +++ b/packages/app/src/components/ButtonPanel.vue @@ -0,0 +1,97 @@ + + + + + + + diff --git a/packages/app/src/components/CodeTab.vue b/packages/app/src/components/CodeTab.vue new file mode 100644 index 0000000..e64a95b --- /dev/null +++ b/packages/app/src/components/CodeTab.vue @@ -0,0 +1,31 @@ + + + + + + + diff --git a/packages/app/src/components/ConfigTab.vue b/packages/app/src/components/ConfigTab.vue new file mode 100644 index 0000000..e24a879 --- /dev/null +++ b/packages/app/src/components/ConfigTab.vue @@ -0,0 +1,102 @@ + + + diff --git a/packages/app/src/components/ContentCard.vue b/packages/app/src/components/ContentCard.vue new file mode 100644 index 0000000..74e1fd7 --- /dev/null +++ b/packages/app/src/components/ContentCard.vue @@ -0,0 +1,64 @@ + + + + + diff --git a/packages/app/src/components/TutorialTab.vue b/packages/app/src/components/TutorialTab.vue new file mode 100644 index 0000000..789243c --- /dev/null +++ b/packages/app/src/components/TutorialTab.vue @@ -0,0 +1,28 @@ + + + diff --git a/packages/app/src/default.ts b/packages/app/src/default.ts new file mode 100644 index 0000000..f1658a7 --- /dev/null +++ b/packages/app/src/default.ts @@ -0,0 +1,190 @@ +export const startBlocks = { + blocks: { + languageVersion: 0, + blocks: [ + { + type: "nonebot_on_command", + id: "!WdCO9=B,k2IY0/Su4|I", + x: 150, + y: 210, + fields: { COMMAND: "save", TOME: true }, + inputs: { + HANDLE: { + block: { + type: "variables_set", + id: "9_AQ_@)mWU$=2GkYbT-d", + fields: { VAR: { id: "VSvr3AeHEP),5NB5v$+;" } }, + inputs: { + VALUE: { + block: { + type: "store_load_json", + id: "3~H`IY?A(%(Bb+8/wL3c", + fields: { FILE: "save.json" }, + }, + }, + }, + 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 new file mode 100644 index 0000000..c38c2c7 --- /dev/null +++ b/packages/app/src/generators/index.ts @@ -0,0 +1,15 @@ +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 nonebotScheduler } from "./nonebot_scheduler"; +import { forBlock as nonebotRequest } from "./nonebot_request"; + +export const generators = [ + pythonDict, + nonebotBasic, + nonebotAlconna, + nonebotStore, + nonebotScheduler, + nonebotRequest, +]; 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_alconna.ts b/packages/app/src/generators/nonebot_alconna.ts new file mode 100644 index 0000000..2845928 --- /dev/null +++ b/packages/app/src/generators/nonebot_alconna.ts @@ -0,0 +1,127 @@ +import { PythonGenerator, Order } from "blockly/python"; +import * as Blockly from "blockly/core"; + +import { AlconnaBlock, AlconnaArgGetBlock } 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, +) { + const command = block.getFieldValue("COMMAND"); + const checkbox_tome = block.getFieldValue("TOME") === "TRUE"; + const statement_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 = ""; + 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 += statement_handle; + code += "\n"; + return code; +}; + +forBlock["alconna_const"] = function ( + block: Blockly.Block, + _: PythonGenerator, +) { + const text = block.getFieldValue("TEXT"); + return [text, Order.ATOMIC]; +}; + +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: AlconnaArgGetBlock, + generator: PythonGenerator, +) { + // This generator will also update the dropdown list + let name_real = block.getFieldValue("NAME"); + const args = getAlconnaArg(block); + let options = new Array(); + if (!block.isInitialized_ && block.name_ !== "") { + // Read from saved + name_real = block.name_; + block.isInitialized_ = true; + if (args.indexOf(name_real) !== -1) { + options.push([name_real, name_real]); + } + args.forEach((arg) => { + if (arg !== name_real) { + options.push([arg, arg]); + } + }); + this.removeInput("PARAMS"); + this.setWarningText(""); + this.appendDummyInput("PARAMS") + ?.appendField("获取参数") + .appendField(new Blockly.FieldDropdown(options), "NAME"); + } else { + args.forEach((arg) => { + options.push([arg, arg]); + }); + } + 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_real)) { + this.removeInput("PARAMS"); + this.setWarningText(""); + this.appendDummyInput("PARAMS") + ?.appendField("获取参数") + .appendField(new Blockly.FieldDropdown(options), "NAME"); + } + if (name_real) { + return [generator.getVariableName("arg_" + name_real), 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..846aa65 --- /dev/null +++ b/packages/app/src/generators/nonebot_basic.ts @@ -0,0 +1,89 @@ +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_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/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_scheduler.ts b/packages/app/src/generators/nonebot_scheduler.ts new file mode 100644 index 0000000..b25cee9 --- /dev/null +++ b/packages/app/src/generators/nonebot_scheduler.ts @@ -0,0 +1,73 @@ +import { PythonGenerator, Order } from "blockly/python"; +import * as Blockly from "blockly/core"; + +export const forBlock = Object.create(null); + +forBlock["scheduler_add"] = function ( + block: Blockly.Block, + generator: PythonGenerator, +) { + const value_time = generator.valueToCode(block, "TIME", Order.ATOMIC); + const value_id = generator.valueToCode(block, "ID", Order.ATOMIC); + if ( + value_time === "" || + value_time === "None" || + value_id === "" || + value_id === "None" + ) { + return ""; + } + generator["definitions_"][ + "from nonebot_plugin_apscheduler import scheduler" + ] = "from nonebot_plugin_apscheduler import scheduler"; + const statement_handle = + generator.statementToCode(block, "HANDLE") || generator.PASS; + const code = `@scheduler.scheduled_job(${value_time}, id=${value_id})\nasync def _():\n${statement_handle}\n`; + return code; +}; + +forBlock["scheduler_remove"] = function ( + block: Blockly.Block, + generator: PythonGenerator, +) { + const value_id = generator.valueToCode(block, "ID", Order.ATOMIC); + generator["definitions_"][ + "from nonebot_plugin_apscheduler import scheduler" + ] = "from nonebot_plugin_apscheduler import scheduler"; + const code = `scheduler.remove_job(${value_id})\n`; + return code; +}; + +forBlock["scheduler_time_interval"] = function ( + block: Blockly.Block, + _: PythonGenerator, +) { + const number = block.getFieldValue("NUMBER"); + const unit = block.getFieldValue("UNIT"); + const code = `"interval", ${unit}=${number}`; + return [code, Order.ATOMIC]; +}; + +forBlock["scheduler_time_cron_daily"] = function ( + block: Blockly.Block, + _: PythonGenerator, +) { + const hour = block.getFieldValue("HOUR"); + const minute = block.getFieldValue("MINUTE"); + const second = block.getFieldValue("SECOND"); + const code = `"cron", hour=${hour}, minute=${minute}, second=${second}`; + return [code, Order.ATOMIC]; +}; + +forBlock["scheduler_time_cron"] = function ( + block: Blockly.Block, + _: PythonGenerator, +) { + const month = block.getFieldValue("MONTH"); + const day = block.getFieldValue("DAY"); + const hour = block.getFieldValue("HOUR"); + const minute = block.getFieldValue("MINUTE"); + const second = block.getFieldValue("SECOND"); + const code = `"cron", month=${month}, day=${day}, hour=${hour}, minute=${minute}, second=${second}`; + return [code, Order.ATOMIC]; +}; diff --git a/packages/app/src/generators/nonebot_store.ts b/packages/app/src/generators/nonebot_store.ts new file mode 100644 index 0000000..0fcfd03 --- /dev/null +++ b/packages/app/src/generators/nonebot_store.ts @@ -0,0 +1,53 @@ +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 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 = `json.loads(store.get_plugin_data_file("${file}").read_text() if store.get_plugin_data_file("${file}").exists() else "{}")`; + return [code, Order.ATOMIC]; +}; + +forBlock["store_save_text"] = function ( + block: Blockly.Block, + generator: PythonGenerator, +) { + const text = generator.valueToCode(block, "TEXT", Order.ATOMIC); + const file = block.getFieldValue("FILE"); + generator["definitions_"]["import nonebot_plugin_localstore as store"] = + "import nonebot_plugin_localstore as store"; + const code = `store.get_plugin_data_file("${file}").write_text(${text})\n`; + return code; +}; + +forBlock["store_load_text"] = function ( + block: Blockly.Block, + generator: PythonGenerator, +) { + 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}").read_text() if store.get_plugin_data_file("${file}").exists() else ""`; + return [code, Order.ATOMIC]; +}; diff --git a/packages/app/src/generators/python_dict.ts b/packages/app/src/generators/python_dict.ts new file mode 100644 index 0000000..5d853ed --- /dev/null +++ b/packages/app/src/generators/python_dict.ts @@ -0,0 +1,69 @@ +import { Order } from "blockly/python"; +import * as Blockly from "blockly/core"; + +import { DictCreateWithBlock, DictGetMultiBlock } from "@/blocks/python_dict"; + +export const forBlock = Object.create(null); + +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) { + return ["None", Order.ATOMIC]; + } + const code = `${dict}.get("${key}")`; + return [code, Order.ATOMIC]; +}; + +forBlock["dicts_get_multi"] = function ( + block: DictGetMultiBlock, + generator: Blockly.CodeGenerator, +) { + const dict = generator.valueToCode(block, "DICT", Order.MEMBER) || "{}"; + let code = ""; + let key = block.getFieldValue("KEY0"); + if (!key) { + return ["None", Order.ATOMIC]; + } + code = `${dict}.get("${key}")`; + for (let n = 1; n < block.itemCount_; n++) { + key = block.getFieldValue("KEY" + n); + if (key) { + code = `(${code} or {}).get(${key})`; + } + } + return [code, Order.ATOMIC]; +}; + +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(); + for (let n = 0; n < block.itemCount_; n++) { + let key = generator.valueToCode(block, "KEY" + n, Order.NONE); + let value = generator.valueToCode(block, "VALUE" + n, Order.NONE) || "None"; + if (key) { + items.push(`${key}: ${value}`); + } + } + const code = "{" + items.join(", ") + "}"; + return [code, Order.ATOMIC]; +}; 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/serialization.ts b/packages/app/src/serialization.ts deleted file mode 100644 index 5c6fa9a..0000000 --- a/packages/app/src/serialization.ts +++ /dev/null @@ -1,32 +0,0 @@ -/** - * @license - * Copyright 2023 Google LLC - * SPDX-License-Identifier: Apache-2.0 - */ - -import * as Blockly from "blockly/core"; - -const storageKey = "mainWorkspace"; - -/** - * Saves the state of the workspace to browser's local storage. - * @param workspace Blockly workspace to save. - */ -export const save = function (workspace: Blockly.Workspace) { - const data = Blockly.serialization.workspaces.save(workspace); - window.localStorage?.setItem(storageKey, JSON.stringify(data)); -}; - -/** - * Loads saved state from local storage into the given workspace. - * @param workspace Blockly workspace to load into. - */ -export const load = function (workspace: Blockly.Workspace) { - const data = window.localStorage?.getItem(storageKey); - if (!data) return; - - // Don't emit events during loading. - Blockly.Events.disable(); - Blockly.serialization.workspaces.load(JSON.parse(data), workspace, undefined); - Blockly.Events.enable(); -}; diff --git a/packages/app/src/theme.ts b/packages/app/src/theme.ts new file mode 100644 index 0000000..9bc362e --- /dev/null +++ b/packages/app/src/theme.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 themeLight = Blockly.Theme.defineTheme("light", { + base: Blockly.Themes.Classic, + name: "Light", +}); + +export const themeDark = Blockly.Theme.defineTheme("dark", { + base: ThemeDark, + name: "Dark", +}); diff --git a/packages/app/src/toolbox.ts b/packages/app/src/toolbox.ts index 9ab50cb..6536a5f 100644 --- a/packages/app/src/toolbox.ts +++ b/packages/app/src/toolbox.ts @@ -1,343 +1,145 @@ -/** - * @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", + kind: "CATEGORY", contents: [ { - kind: "block", + kind: "BLOCK", type: "controls_if", }, { - kind: "block", + kind: "BLOCK", type: "logic_compare", }, { - kind: "block", + kind: "BLOCK", type: "logic_operation", }, { - kind: "block", + kind: "BLOCK", type: "logic_negate", }, { - kind: "block", + kind: "BLOCK", type: "logic_boolean", }, { - kind: "block", + kind: "BLOCK", type: "logic_null", }, { - kind: "block", + kind: "BLOCK", type: "logic_ternary", }, ], + name: "逻辑", + categorystyle: "logic_category", }, { - kind: "category", - name: "Loops", - categorystyle: "loop_category", + kind: "CATEGORY", contents: [ { - kind: "block", + kind: "BLOCK", type: "controls_repeat_ext", - inputs: { - TIMES: { - shadow: { - type: "math_number", - fields: { - NUM: 10, - }, - }, - }, - }, }, { - kind: "block", + kind: "BLOCK", + type: "controls_repeat", + }, + { + kind: "BLOCK", type: "controls_whileUntil", }, { - kind: "block", + 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", + kind: "BLOCK", type: "controls_forEach", }, { - kind: "block", + kind: "BLOCK", type: "controls_flow_statements", }, ], + name: "循环", + categorystyle: "loop_category", }, { - kind: "category", - name: "Math", - categorystyle: "math_category", + kind: "CATEGORY", contents: [ { - kind: "block", + kind: "BLOCK", type: "math_number", - fields: { - NUM: 123, - }, + gap: "32", }, { - kind: "block", + kind: "BLOCK", type: "math_arithmetic", - inputs: { - A: { - shadow: { - type: "math_number", - fields: { - NUM: 1, - }, - }, - }, - B: { - shadow: { - type: "math_number", - fields: { - NUM: 1, - }, - }, - }, - }, }, { - kind: "block", + kind: "BLOCK", type: "math_single", - inputs: { - NUM: { - shadow: { - type: "math_number", - fields: { - NUM: 9, - }, - }, - }, - }, }, { - kind: "block", + kind: "BLOCK", type: "math_trig", - inputs: { - NUM: { - shadow: { - type: "math_number", - fields: { - NUM: 45, - }, - }, - }, - }, }, { - kind: "block", + kind: "BLOCK", type: "math_constant", }, { - kind: "block", + kind: "BLOCK", type: "math_number_property", - inputs: { - NUMBER_TO_CHECK: { - shadow: { - type: "math_number", - fields: { - NUM: 0, - }, - }, - }, - }, }, { - kind: "block", + kind: "BLOCK", type: "math_round", - fields: { - OP: "ROUND", - }, - inputs: { - NUM: { - shadow: { - type: "math_number", - fields: { - NUM: 3.1, - }, - }, - }, - }, }, { - kind: "block", + kind: "BLOCK", type: "math_on_list", - fields: { - OP: "SUM", - }, }, { - kind: "block", + kind: "BLOCK", type: "math_modulo", - inputs: { - DIVIDEND: { - shadow: { - type: "math_number", - fields: { - NUM: 64, - }, - }, - }, - DIVISOR: { - shadow: { - type: "math_number", - fields: { - NUM: 10, - }, - }, - }, - }, }, { - kind: "block", + 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", + 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", + kind: "BLOCK", type: "math_random_float", }, { - kind: "block", + kind: "BLOCK", type: "math_atan2", - inputs: { - X: { - shadow: { - type: "math_number", - fields: { - NUM: 1, - }, - }, - }, - Y: { - shadow: { - type: "math_number", - fields: { - NUM: 1, - }, - }, - }, - }, }, ], + name: "数学", + categorystyle: "math_category", }, { - kind: "category", - name: "Text", - categorystyle: "text_category", + kind: "CATEGORY", contents: [ { - kind: "block", + kind: "BLOCK", type: "text", }, { - kind: "block", - type: "text_multiline", - }, - { - kind: "block", + kind: "BLOCK", type: "text_join", }, { - kind: "block", + kind: "BLOCK", type: "text_append", inputs: { TEXT: { @@ -351,7 +153,7 @@ export const toolbox = { }, }, { - kind: "block", + kind: "BLOCK", type: "text_length", inputs: { VALUE: { @@ -365,7 +167,7 @@ export const toolbox = { }, }, { - kind: "block", + kind: "BLOCK", type: "text_isEmpty", inputs: { VALUE: { @@ -379,11 +181,11 @@ export const toolbox = { }, }, { - kind: "block", + kind: "BLOCK", type: "text_indexOf", inputs: { VALUE: { - block: { + BLOCK: { type: "variables_get", }, }, @@ -398,29 +200,29 @@ export const toolbox = { }, }, { - kind: "block", + kind: "BLOCK", type: "text_charAt", inputs: { VALUE: { - block: { + BLOCK: { type: "variables_get", }, }, }, }, { - kind: "block", + kind: "BLOCK", type: "text_getSubstring", inputs: { STRING: { - block: { + BLOCK: { type: "variables_get", }, }, }, }, { - kind: "block", + kind: "BLOCK", type: "text_changeCase", inputs: { TEXT: { @@ -434,7 +236,7 @@ export const toolbox = { }, }, { - kind: "block", + kind: "BLOCK", type: "text_trim", inputs: { TEXT: { @@ -448,7 +250,7 @@ export const toolbox = { }, }, { - kind: "block", + kind: "BLOCK", type: "text_count", inputs: { SUB: { @@ -464,7 +266,7 @@ export const toolbox = { }, }, { - kind: "block", + kind: "BLOCK", type: "text_replace", inputs: { FROM: { @@ -485,7 +287,7 @@ export const toolbox = { }, }, { - kind: "block", + kind: "BLOCK", type: "text_reverse", inputs: { TEXT: { @@ -495,222 +297,244 @@ export const toolbox = { }, }, }, - { - kind: "block", - type: "add_text", - inputs: { - TEXT: { - shadow: { - type: "text", - fields: { - TEXT: "abc", - }, - }, - }, - COLOR: { - shadow: { - type: "colour_picker", - fields: { - COLOUR: "#aa00cc", - }, - }, - }, - }, - }, ], + name: "文本", + categorystyle: "text_category", }, { - kind: "category", - name: "Lists", - categorystyle: "list_category", + kind: "CATEGORY", contents: [ { - kind: "block", + kind: "BLOCK", type: "lists_create_with", }, { - kind: "block", - type: "lists_create_with", - }, - { - kind: "block", + kind: "BLOCK", type: "lists_repeat", - inputs: { - NUM: { - shadow: { - type: "math_number", - fields: { - NUM: 5, - }, - }, - }, - }, }, { - kind: "block", + kind: "BLOCK", type: "lists_length", }, { - kind: "block", + kind: "BLOCK", type: "lists_isEmpty", }, { - kind: "block", + kind: "BLOCK", type: "lists_indexOf", - inputs: { - VALUE: { - block: { - type: "variables_get", - }, - }, - }, }, { - kind: "block", + kind: "BLOCK", type: "lists_getIndex", - inputs: { - VALUE: { - block: { - type: "variables_get", - }, - }, - }, }, { - kind: "block", + kind: "BLOCK", type: "lists_setIndex", - inputs: { - LIST: { - block: { - type: "variables_get", - }, - }, - }, }, { - kind: "block", + kind: "BLOCK", type: "lists_getSublist", - inputs: { - LIST: { - block: { - type: "variables_get", - }, - }, - }, }, { - kind: "block", + kind: "BLOCK", type: "lists_split", - inputs: { - DELIM: { - shadow: { - type: "text", - fields: { - TEXT: ",", - }, - }, - }, - }, }, { - kind: "block", + kind: "BLOCK", type: "lists_sort", }, { - kind: "block", + kind: "BLOCK", type: "lists_reverse", }, ], + name: "列表", + categorystyle: "list_category", }, { - kind: "category", - name: "Color", - categorystyle: "colour_category", + kind: "CATEGORY", contents: [ { - kind: "block", - type: "colour_picker", + kind: "BLOCK", + type: "dicts_create_with", }, { - kind: "block", - type: "colour_random", + kind: "BLOCK", + type: "dicts_get", }, { - 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: "dicts_get_multi", }, { - 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: "BLOCK", + type: "dicts_set", }, ], + name: "字典", + colour: "0", }, { - kind: "sep", + kind: "SEP", }, { - kind: "category", - name: "Variables", - categorystyle: "variable_category", - custom: "VARIABLE", + kind: "CATEGORY", + contents: [ + { + kind: "LABEL", + text: "“消息处理”块会处理所有收到的消息", + }, + { + kind: "BLOCK", + type: "nonebot_on_message", + }, + { + kind: "LABEL", + 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", - name: "Functions", - categorystyle: "procedure_category", - custom: "PROCEDURE", + 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: "以下参数或方法仅能在“跨平台命令解析与处理”语句中使用", + }, + { + kind: "BLOCK", + type: "alconna_arg_get", + }, + { + kind: "BLOCK", + type: "nonebot_send", + }, + ], + name: "跨平台命令处理", + colour: "90", + }, + { + kind: "CATEGORY", + contents: [ + { + kind: "BLOCK", + type: "store_save_json", + }, + { + kind: "BLOCK", + type: "store_load_json", + }, + { + kind: "BLOCK", + type: "store_save_text", + }, + { + kind: "BLOCK", + type: "store_load_text", + }, + ], + name: "文件存储", + colour: "150", + }, + { + kind: "CATEGORY", + contents: [ + { + kind: "BLOCK", + type: "scheduler_add", + }, + { + kind: "BLOCK", + type: "scheduler_remove", + }, + { + kind: "LABEL", + text: "请将以下时间配置块填入定时任务创建语句中使用", + }, + { + kind: "BLOCK", + type: "scheduler_time_interval", + }, + { + kind: "BLOCK", + type: "scheduler_time_cron_daily", + }, + { + kind: "BLOCK", + type: "scheduler_time_cron", + }, + ], + name: "定时任务", + colour: "210", + }, + { + kind: "CATEGORY", + contents: [ + { + kind: "BLOCK", + type: "request_get", + }, + { + kind: "BLOCK", + type: "request_post", + }, + ], + name: "网络请求", + colour: "270", + }, + { + kind: "SEP", + }, + { + kind: "CATEGORY", + name: "变量", + categorystyle: "variable_category", + custom: "VARIABLE", }, + // { + // kind: "CATEGORY", + // name: "函数", + // categorystyle: "procedure_category", + // custom: "PROCEDURE", + // }, ], }; diff --git a/packages/app/src/workspace.ts b/packages/app/src/workspace.ts new file mode 100644 index 0000000..3e76b32 --- /dev/null +++ b/packages/app/src/workspace.ts @@ -0,0 +1,292 @@ +// outputs.ts +import { reactive, ref } from "vue"; +import * as Blockly from "blockly"; +import { pythonGenerator } from "blockly/python"; +import { themeLight, themeDark } from "@/theme"; + +import JSZip from "jszip"; +import { saveAs } from "file-saver"; + +const version = "v1"; + +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-0"), + snackbar: false, + snackbarMsg: "" as string, + snackbarTimeout: 2500 as number, + snackbarColor: "green" as string, + export: { + name: "app" as string, + preset: { name: "console", description: "控制台机器人" }, + port: 8080 as number, + platform: ["windows", "linux"] as string[], + }, +}); + +export function setWorkspaceTheme(theme: string) { + let workspace = Blockly.getMainWorkspace(); + if (theme === "LightTheme") { + optionsStore.theme = ref(themeLight); + // @ts-ignore + workspace.setTheme(themeLight); + } else if (theme === "DarkTheme") { + optionsStore.theme = ref(themeDark); + // @ts-ignore + workspace.setTheme(themeDark); + } +} + +export function saveJson() { + const workspace = Blockly.getMainWorkspace(); + const data = Blockly.serialization.workspaces.save(workspace); + const json = JSON.stringify({ version: version, data: data }); + localStorage.setItem("NoneBlockly", json); + outputsStore.snackbarColor = "green"; + outputsStore.snackbarMsg = "🤗 工作区已暂存"; + outputsStore.snackbar = true; +} + +export function loadJson() { + const workspace = Blockly.getMainWorkspace(); + const savedData = localStorage.getItem("NoneBlockly"); + if (savedData) { + const json = JSON.parse(savedData); + if (json.version === version) { + Blockly.serialization.workspaces.load(json.data, workspace); + outputsStore.snackbarColor = "green"; + outputsStore.snackbarMsg = "🥰 已恢复暂存工作区"; + outputsStore.snackbar = true; + } else { + initWorkspaceState(); + } + } else { + outputsStore.snackbarColor = "warning"; + outputsStore.snackbarMsg = "未找到暂存工作区,将导入默认工作区"; + outputsStore.snackbar = true; + initWorkspaceState(); + } +} + +export function initWorkspaceState() { + let startBlocks = workspaceStore.startBlocks; + let workspace = Blockly.getMainWorkspace(); + Blockly.serialization.workspaces.load(startBlocks, workspace); + outputsStore.activeTab = "tab-0"; +} + +export function generateCode() { + let workspace = Blockly.getMainWorkspace(); + outputsStore.code = pythonGenerator.workspaceToCode(workspace); +} + +export function exportPress() { + outputsStore.activeTab = "tab-3"; +} + +function generatePyproject(code: string, preset: string) { + const dependencies = new Set([ + "nonebot2[fastapi,httpx,websockets]>=2.3.3", + "nb-cli>=1.4.2", + ]); + const importLines = code.split("\n\n")[0].split("\n"); + importLines.forEach((line) => { + if (line.startsWith("from nonebot_plugin_alconna")) { + dependencies.add("nonebot-plugin-alconna>=0.52.3"); + } else if (line.startsWith("from nonebot_plugin_apscheduler")) { + dependencies.add("nonebot-plugin-apscheduler>=0.5.0"); + } else if (line.startsWith("import nonebot_plugin_localstore")) { + dependencies.add("nonebot-plugin-localstore>=0.7.1"); + } + }); + let adapters = ""; + if (preset === "console") { + adapters = '{ name = "Console", module_name = "nonebot.adapters.console" }'; + dependencies.add("nonebot-adapter-console>=0.6.0"); + } else if (preset === "onebot") { + adapters = + '{ name = "OneBot V11", module_name = "nonebot.adapters.onebot.v11" }'; + adapters += + ', { name = "OneBot V12", module_name = "nonebot.adapters.onebot.v12" }'; + dependencies.add("nonebot-adapter-onebot>=2.4.5"); + } + return `\ + [project] + name = "noneblockly-app" + version = "0.1.0" + description = "NoneBot project generated by NoneBlockly" + authors = [{name = "name", email = "name@example.com"}] + dependencies = [ + ${Array.from(dependencies) + .map((dep) => `"${dep}"`) + .join(", \n")} + ] + requires-python = ">=3.9" + license = {text = "MIT"} + + [tool.nonebot] + adapters = [ + { name = "Console", module_name = "nonebot.adapters.console" } + ] + plugin_dirs = ["plugins"]`; +} + +function generateEnv(port: number) { + return `\ + DRIVER=~fastapi+~httpx+~websockets + PORT=${port}`; +} + +const windowsScripts = { + install: `\ + # Step 1: Check if 'uv' is installed + $uvVersion = try { + uv --version + } catch { + $null + } + + if ($uvVersion) { + Write-Host "UV is installed. Version: " + Write-Host $uvVersion + } else { + # Step 2: If 'uv' is not installed, ask user for confirmation to install + Write-Host "UV is not installed on this system." + $confirmation = Read-Host "Do you want to install UV? (Press Enter to confirm or type 'n' to cancel)" + + if ($confirmation -eq '') { + Write-Host "Installing UV..." + Invoke-RestMethod https://astral.sh/uv/install.ps1 | Invoke-Expression + Write-Host "UV has been installed successfully." + } else { + Write-Host "Installation canceled." + exit + } + } + + # Step 3: Create a Python virtual environment + Write-Host "Creating a Python virtual environment with Python 3.12..." + uv venv --python 3.12 + + Write-Host "Python virtual environment created successfully." + + # Step 4: Install dependencies + uv pip install -r pyproject.toml`, + run: `\ + $uvVersion = try { + uv --version + } catch { + $null + } + + if ($null -eq $uvVersion) { + Write-Host "Please run 'install.ps1' first." + exit + } + + uv run nb run`, +}; + +const linuxScripts = { + install: `\ + #!/bin/bash + + # Step 1: Check if 'uv' is installed + if command -v uv &> /dev/null + then + echo "UV is installed. Version info:" + uv --version + else + # Step 2: If 'uv' is not installed, ask user for confirmation to install + echo "UV is not installed on this system." + read -p "Do you want to install UV? (Press Enter to confirm or type 'n' to cancel): " confirmation + + if [ "$confirmation" == "" ]; then + echo "Installing UV..." + curl -LsSf https://astral.sh/uv/install.sh | sh + echo "UV has been installed successfully." + else + echo "Installation canceled." + exit 1 + fi + fi + + # Step 3: Create a Python virtual environment + echo "Creating a Python virtual environment with Python 3.12..." + uv venv --python 3.12 + + echo "Python virtual environment created successfully."`, + run: `\ + if ! command -v uv &> /dev/null + then + echo "Please run 'install.sh' first" + exit + fi + + uv run nb run`, +}; + +export function exportZip() { + let zip = new JSZip(); + let workspace = Blockly.getMainWorkspace(); + let code = pythonGenerator.workspaceToCode(workspace); + zip.file("plugins/plugin_exported.py", code); + zip.file( + "pyproject.toml", + generatePyproject(code, outputsStore.export.preset.name), + ); + zip.file(".env.prod", generateEnv(outputsStore.export.port)); + outputsStore.export.platform.forEach((platform) => { + if (platform === "windows") { + zip.file("install.ps1", windowsScripts.install); + zip.file("run.ps1", windowsScripts.run); + } else if (platform === "linux") { + zip.file("install.sh", linuxScripts.install); + zip.file("run.sh", linuxScripts.run); + } + }); + outputsStore.snackbarColor = "green"; + outputsStore.snackbarMsg = "😎 已导出 Python 项目"; + outputsStore.snackbar = true; + zip.generateAsync({ type: "blob" }).then(function (content) { + saveAs(content, `${outputsStore.export.name}.zip`); + }); +} diff --git a/packages/app/tsconfig.json b/packages/app/tsconfig.json index 6a2ab6e..e81ce89 100644 --- a/packages/app/tsconfig.json +++ b/packages/app/tsconfig.json @@ -6,7 +6,21 @@ "declarationMap": true, "module": "ES2015", "moduleResolution": "node", + "resolveJsonModule": true, "target": "ES2015", - "strict": true - } + "strict": true, + // avoid jszip error + "allowSyntheticDefaultImports": 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..5059d75 --- /dev/null +++ b/packages/app/vite.config.mjs @@ -0,0 +1,73 @@ +// 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: 700, + rollupOptions: { + output: { + manualChunks: { + "blockly/blockly": ["blockly"], + "vuetify/vuetify": ["vuetify"], + }, + }, + }, + }, + plugins: [ + vue({ + template: { + compilerOptions: { + isCustomElement: (tag) => + [ + "field", + "block", + "category", + "xml", + "mutation", + "value", + "sep", + "shadow", + ].includes(tag), + }, + }, + }), + // 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..3505d92 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1,4 +1,4 @@ -lockfileVersion: "6.0" +lockfileVersion: "9.0" settings: autoInstallPeers: true @@ -8,4091 +8,2164 @@ 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 + file-saver: + specifier: ^2.0.5 + version: 2.0.5 + highlight.js: + specifier: ^11.9.0 + version: 11.9.0 + jszip: + specifier: ^3.10.1 + version: 3.10.1 + sass: + specifier: ^1.77.6 + version: 1.77.6 + vue: + specifier: ^3.4.29 + version: 3.4.29(typescript@5.5.2) + vuetify: + 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: - 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: ^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.29(typescript@5.5.2)) + "@mdi/js": + specifier: ^7.4.47 + version: 7.4.47 + "@types/file-saver": + specifier: ^2.0.7 + version: 2.0.7 + "@vitejs/plugin-vue": + 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 - 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) + specifier: ^5.5.2 + version: 5.5.2 + vite: + specifier: ^5.3.1 + version: 5.3.1(sass@1.77.6) + vite-plugin-static-copy: + 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.3.1(sass@1.77.6))(vue@3.4.29(typescript@5.5.2))(vuetify@3.6.10) + vue-tsc: + specifier: ^2.0.21 + version: 2.0.21(typescript@5.5.2) packages: - /@discoveryjs/json-ext@0.5.7: + "@babel/helper-string-parser@7.24.7": resolution: { - integrity: sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==, + integrity: sha512-7MbVt6xrwFQbunH2DNQsAP5sTGxfqQtErvBIvIMi6EQnbgUOuVYanvREcmFrOPhoXBrTtjhhP+lW+o5UfK+tDg==, } - engines: { node: ">=10.0.0" } - dev: true + engines: { node: ">=6.9.0" } - /@jridgewell/gen-mapping@0.3.5: + "@babel/helper-validator-identifier@7.24.7": resolution: { - integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==, + integrity: sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==, } - 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.7": resolution: { - integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==, + integrity: sha512-9uUYRm6OqQrCqQdG1iCBwBPZgN8ciDBro2nIOFaiRz1/BCxaI7CNvQbDHvsArAC7Tw9Hda/B3U+6ui9u4HWXPw==, } engines: { node: ">=6.0.0" } - dev: true + hasBin: true - /@jridgewell/set-array@1.2.1: + "@babel/types@7.24.7": resolution: { - integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==, + integrity: sha512-XEFXSlxiG5td2EJRe8vOmRbaXVgfcBlszKujvVmWIK/UpywWljQCfzAv3RQCGujWQ1RD4YYWEAqDXfuJiy8f5Q==, } - engines: { node: ">=6.0.0" } - dev: true + engines: { node: ">=6.9.0" } - /@jridgewell/source-map@0.3.6: + "@blockly/theme-dark@7.0.1": resolution: { - integrity: sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==, + integrity: sha512-yJZmdV/8ZZQ/NvL1QncTwuxDay/XwyCPr8qYHpfqYii2zOBCtSTxpK5KaF/RHHVwBti0j2c8qEp/AdJ1J3nuSg==, } - dependencies: - "@jridgewell/gen-mapping": 0.3.5 - "@jridgewell/trace-mapping": 0.3.25 - dev: true + engines: { node: ">=8.17.0" } + peerDependencies: + blockly: ^11.0.0 - /@jridgewell/sourcemap-codec@1.4.15: + "@esbuild/aix-ppc64@0.21.5": resolution: { - integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==, + integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==, } - dev: true + engines: { node: ">=12" } + cpu: [ppc64] + os: [aix] - /@jridgewell/trace-mapping@0.3.25: + "@esbuild/android-arm64@0.21.5": resolution: { - integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==, + integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==, } - dependencies: - "@jridgewell/resolve-uri": 3.1.2 - "@jridgewell/sourcemap-codec": 1.4.15 - dev: true + engines: { node: ">=12" } + cpu: [arm64] + os: [android] - /@leichtgewicht/ip-codec@2.0.5: + "@esbuild/android-arm@0.21.5": resolution: { - integrity: sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==, + integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==, } - dev: true + engines: { node: ">=12" } + cpu: [arm] + os: [android] - /@tootallnate/once@2.0.0: + "@esbuild/android-x64@0.21.5": resolution: { - integrity: sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==, + integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==, } - engines: { node: ">= 10" } - dev: false + engines: { node: ">=12" } + cpu: [x64] + os: [android] - /@types/body-parser@1.19.5: + "@esbuild/darwin-arm64@0.21.5": resolution: { - integrity: sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==, + integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==, } - dependencies: - "@types/connect": 3.4.38 - "@types/node": 20.12.6 - dev: true + engines: { node: ">=12" } + cpu: [arm64] + os: [darwin] - /@types/bonjour@3.5.13: + "@esbuild/darwin-x64@0.21.5": resolution: { - integrity: sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ==, + integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==, } - dependencies: - "@types/node": 20.12.6 - dev: true + engines: { node: ">=12" } + cpu: [x64] + os: [darwin] - /@types/connect-history-api-fallback@1.5.4: + "@esbuild/freebsd-arm64@0.21.5": resolution: { - integrity: sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw==, + integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==, } - dependencies: - "@types/express-serve-static-core": 4.19.0 - "@types/node": 20.12.6 - dev: true + engines: { node: ">=12" } + cpu: [arm64] + os: [freebsd] - /@types/connect@3.4.38: + "@esbuild/freebsd-x64@0.21.5": resolution: { - integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==, + integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==, } - dependencies: - "@types/node": 20.12.6 - dev: true + engines: { node: ">=12" } + cpu: [x64] + os: [freebsd] - /@types/eslint-scope@3.7.7: + "@esbuild/linux-arm64@0.21.5": resolution: { - integrity: sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==, + integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==, } - dependencies: - "@types/eslint": 8.56.7 - "@types/estree": 1.0.5 - dev: true + engines: { node: ">=12" } + cpu: [arm64] + os: [linux] - /@types/eslint@8.56.7: + "@esbuild/linux-arm@0.21.5": resolution: { - integrity: sha512-SjDvI/x3zsZnOkYZ3lCt9lOZWZLB2jIlNKz+LBgCtDurK0JZcwucxYHn1w2BJkD34dgX9Tjnak0txtq4WTggEA==, + integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==, } - dependencies: - "@types/estree": 1.0.5 - "@types/json-schema": 7.0.15 - dev: true + engines: { node: ">=12" } + cpu: [arm] + os: [linux] - /@types/estree@1.0.5: + "@esbuild/linux-ia32@0.21.5": resolution: { - integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==, + integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==, } - dev: true + engines: { node: ">=12" } + cpu: [ia32] + os: [linux] - /@types/express-serve-static-core@4.19.0: + "@esbuild/linux-loong64@0.21.5": resolution: { - integrity: sha512-bGyep3JqPCRry1wq+O5n7oiBgGWmeIJXPjXXCo8EK0u8duZGSYar7cGqd3ML2JUsLGeB7fmc06KYo9fLGWqPvQ==, + integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==, } - 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] - /@types/express@4.17.21: + "@esbuild/linux-mips64el@0.21.5": resolution: { - integrity: sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==, + integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==, } - 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] - /@types/html-minifier-terser@6.1.0: + "@esbuild/linux-ppc64@0.21.5": resolution: { - integrity: sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==, + integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==, } - dev: true + engines: { node: ">=12" } + cpu: [ppc64] + os: [linux] - /@types/http-errors@2.0.4: + "@esbuild/linux-riscv64@0.21.5": resolution: { - integrity: sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==, + integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==, } - dev: true + engines: { node: ">=12" } + cpu: [riscv64] + os: [linux] - /@types/http-proxy@1.17.14: + "@esbuild/linux-s390x@0.21.5": resolution: { - integrity: sha512-SSrD0c1OQzlFX7pGu1eXxSEjemej64aaNPRhhVYUGqXh0BtldAAx37MG8btcumvpgKyZp1F5Gn3JkktdxiFv6w==, + integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==, } - dependencies: - "@types/node": 20.12.6 - dev: true + engines: { node: ">=12" } + cpu: [s390x] + os: [linux] - /@types/json-schema@7.0.15: + "@esbuild/linux-x64@0.21.5": resolution: { - integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==, + integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==, } - dev: true + engines: { node: ">=12" } + cpu: [x64] + os: [linux] - /@types/mime@1.3.5: + "@esbuild/netbsd-x64@0.21.5": resolution: { - integrity: sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==, + integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==, } - dev: true + engines: { node: ">=12" } + cpu: [x64] + os: [netbsd] - /@types/node-forge@1.3.11: + "@esbuild/openbsd-x64@0.21.5": resolution: { - integrity: sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==, + integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==, } - dependencies: - "@types/node": 20.12.6 - dev: true + engines: { node: ">=12" } + cpu: [x64] + os: [openbsd] - /@types/node@20.12.6: + "@esbuild/sunos-x64@0.21.5": resolution: { - integrity: sha512-3KurE8taB8GCvZBPngVbp0lk5CKi8M9f9k1rsADh0Evdz5SzJ+Q+Hx9uHoFGsLnLnd1xmkDQr2hVhlA0Mn0lKQ==, + integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==, } - dependencies: - undici-types: 5.26.5 - dev: true + engines: { node: ">=12" } + cpu: [x64] + os: [sunos] - /@types/qs@6.9.14: + "@esbuild/win32-arm64@0.21.5": resolution: { - integrity: sha512-5khscbd3SwWMhFqylJBLQ0zIu7c1K6Vz0uBIt915BI3zV0q1nfjRQD3RqSBcPaO6PHEF4ov/t9y89fSiyThlPA==, + integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==, } - dev: true + engines: { node: ">=12" } + cpu: [arm64] + os: [win32] - /@types/range-parser@1.2.7: + "@esbuild/win32-ia32@0.21.5": resolution: { - integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==, + integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==, } - dev: true + engines: { node: ">=12" } + cpu: [ia32] + os: [win32] - /@types/retry@0.12.0: + "@esbuild/win32-x64@0.21.5": resolution: { - integrity: sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==, + integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==, } - dev: true + engines: { node: ">=12" } + cpu: [x64] + os: [win32] - /@types/send@0.17.4: + "@highlightjs/vue-plugin@2.1.0": resolution: { - integrity: sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==, + integrity: sha512-E+bmk4ncca+hBEYRV2a+1aIzIV0VSY/e5ArjpuSN9IO7wBJrzUE2u4ESCwrbQD7sAy+jWQjkV5qCCWgc+pu7CQ==, } - dependencies: - "@types/mime": 1.3.5 - "@types/node": 20.12.6 - dev: true + peerDependencies: + highlight.js: ^11.0.1 + vue: ^3 - /@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==, } - dependencies: - "@types/node": 20.12.6 - dev: true + engines: { node: ">= 8" } - /@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 - dev: true + engines: { node: ">= 8" } - /@webassemblyjs/ast@1.12.1: + "@nodelib/fs.walk@1.2.8": resolution: { - integrity: sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==, + integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==, } - dependencies: - "@webassemblyjs/helper-numbers": 1.11.6 - "@webassemblyjs/helper-wasm-bytecode": 1.11.6 - dev: true + engines: { node: ">= 8" } - /@webassemblyjs/floating-point-hex-parser@1.11.6: + "@rollup/rollup-android-arm-eabi@4.18.0": resolution: { - integrity: sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==, + integrity: sha512-Tya6xypR10giZV1XzxmH5wr25VcZSncG0pZIjfePT0OVBvqNEurzValetGNarVrGiq66EBVAFn15iYX4w6FKgQ==, } - dev: true + cpu: [arm] + os: [android] - /@webassemblyjs/helper-api-error@1.11.6: + "@rollup/rollup-android-arm64@4.18.0": resolution: { - integrity: sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==, + integrity: sha512-avCea0RAP03lTsDhEyfy+hpfr85KfyTctMADqHVhLAF3MlIkq83CP8UfAHUssgXTYd+6er6PaAhx/QGv4L1EiA==, } - dev: true + cpu: [arm64] + os: [android] - /@webassemblyjs/helper-buffer@1.12.1: + "@rollup/rollup-darwin-arm64@4.18.0": resolution: { - integrity: sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw==, + integrity: sha512-IWfdwU7KDSm07Ty0PuA/W2JYoZ4iTj3TUQjkVsO/6U+4I1jN5lcR71ZEvRh52sDOERdnNhhHU57UITXz5jC1/w==, } - dev: true + cpu: [arm64] + os: [darwin] - /@webassemblyjs/helper-numbers@1.11.6: + "@rollup/rollup-darwin-x64@4.18.0": resolution: { - integrity: sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==, + integrity: sha512-n2LMsUz7Ynu7DoQrSQkBf8iNrjOGyPLrdSg802vk6XT3FtsgX6JbE8IHRvposskFm9SNxzkLYGSq9QdpLYpRNA==, } - 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] - /@webassemblyjs/helper-wasm-bytecode@1.11.6: + "@rollup/rollup-linux-arm-gnueabihf@4.18.0": resolution: { - integrity: sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==, + integrity: sha512-C/zbRYRXFjWvz9Z4haRxcTdnkPt1BtCkz+7RtBSuNmKzMzp3ZxdM28Mpccn6pt28/UWUCTXa+b0Mx1k3g6NOMA==, } - dev: true + cpu: [arm] + os: [linux] - /@webassemblyjs/helper-wasm-section@1.12.1: + "@rollup/rollup-linux-arm-musleabihf@4.18.0": resolution: { - integrity: sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g==, + integrity: sha512-l3m9ewPgjQSXrUMHg93vt0hYCGnrMOcUpTz6FLtbwljo2HluS4zTXFy2571YQbisTnfTKPZ01u/ukJdQTLGh9A==, } - 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] - /@webassemblyjs/ieee754@1.11.6: + "@rollup/rollup-linux-arm64-gnu@4.18.0": resolution: { - integrity: sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==, + integrity: sha512-rJ5D47d8WD7J+7STKdCUAgmQk49xuFrRi9pZkWoRD1UeSMakbcepWXPF8ycChBoAqs1pb2wzvbY6Q33WmN2ftw==, } - dependencies: - "@xtuc/ieee754": 1.2.0 - dev: true + cpu: [arm64] + os: [linux] - /@webassemblyjs/leb128@1.11.6: + "@rollup/rollup-linux-arm64-musl@4.18.0": resolution: { - integrity: sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==, + integrity: sha512-be6Yx37b24ZwxQ+wOQXXLZqpq4jTckJhtGlWGZs68TgdKXJgw54lUUoFYrg6Zs/kjzAQwEwYbp8JxZVzZLRepQ==, } - dependencies: - "@xtuc/long": 4.2.2 - dev: true + cpu: [arm64] + os: [linux] - /@webassemblyjs/utf8@1.11.6: + "@rollup/rollup-linux-powerpc64le-gnu@4.18.0": resolution: { - integrity: sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==, + integrity: sha512-hNVMQK+qrA9Todu9+wqrXOHxFiD5YmdEi3paj6vP02Kx1hjd2LLYR2eaN7DsEshg09+9uzWi2W18MJDlG0cxJA==, } - dev: true + cpu: [ppc64] + os: [linux] - /@webassemblyjs/wasm-edit@1.12.1: + "@rollup/rollup-linux-riscv64-gnu@4.18.0": resolution: { - integrity: sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g==, + integrity: sha512-ROCM7i+m1NfdrsmvwSzoxp9HFtmKGHEqu5NNDiZWQtXLA8S5HBCkVvKAxJ8U+CVctHwV2Gb5VUaK7UAkzhDjlg==, } - 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] - /@webassemblyjs/wasm-gen@1.12.1: + "@rollup/rollup-linux-s390x-gnu@4.18.0": resolution: { - integrity: sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w==, + integrity: sha512-0UyyRHyDN42QL+NbqevXIIUnKA47A+45WyasO+y2bGJ1mhQrfrtXUpTxCOrfxCR4esV3/RLYyucGVPiUsO8xjg==, } - 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] - /@webassemblyjs/wasm-opt@1.12.1: + "@rollup/rollup-linux-x64-gnu@4.18.0": resolution: { - integrity: sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg==, + integrity: sha512-xuglR2rBVHA5UsI8h8UbX4VJ470PtGCf5Vpswh7p2ukaqBGFTnsfzxUBetoWBWymHMxbIG0Cmx7Y9qDZzr648w==, } - 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] - /@webassemblyjs/wasm-parser@1.12.1: + "@rollup/rollup-linux-x64-musl@4.18.0": resolution: { - integrity: sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ==, + integrity: sha512-LKaqQL9osY/ir2geuLVvRRs+utWUNilzdE90TpyoX0eNqPzWjRm14oMEE+YLve4k/NAqCdPkGYDaDF5Sw+xBfg==, } - 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] - /@webassemblyjs/wast-printer@1.12.1: + "@rollup/rollup-win32-arm64-msvc@4.18.0": resolution: { - integrity: sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA==, + integrity: sha512-7J6TkZQFGo9qBKH0pk2cEVSRhJbL6MtfWxth7Y5YmZs57Pi+4x6c2dStAUvaQkHQLnEQv1jzBUW43GvZW8OFqA==, } - dependencies: - "@webassemblyjs/ast": 1.12.1 - "@xtuc/long": 4.2.2 - dev: true + cpu: [arm64] + os: [win32] - /@webpack-cli/configtest@1.2.0(webpack-cli@4.10.0)(webpack@5.91.0): + "@rollup/rollup-win32-ia32-msvc@4.18.0": resolution: { - integrity: sha512-4FB8Tj6xyVkyqjj1OaTqCjXYULB9FMkqQ8yGrZjRDrYh0nOE+7Lhs45WioWQQMV+ceFlE368Ukhe6xdvJM9Egg==, + integrity: sha512-Txjh+IxBPbkUB9+SXZMpv+b/vnTEtFyfWZgJ6iyCmt2tdx0OF5WhFowLmnh8ENGNpfUlUZkdI//4IEmhwPieNg==, } - 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] - /@webpack-cli/info@1.5.0(webpack-cli@4.10.0): + "@rollup/rollup-win32-x64-msvc@4.18.0": resolution: { - integrity: sha512-e8tSXZpw2hPl2uMJY6fsMswaok5FdlGNRTktvFk2sD8RjH0hE2+XistawJx1vmKteh4NmGmNUrp+Tb2w+udPcQ==, + integrity: sha512-UOo5FdvOL0+eIVTgS4tIdbW+TtnBLWg1YBCcU2KWM7nuNwRz9bksDX1bekJJCpu25N1DVWaCwnT39dVQxzqS8g==, } - 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] - /@webpack-cli/serve@1.7.0(webpack-cli@4.10.0)(webpack-dev-server@4.15.2): + "@types/estree@1.0.5": resolution: { - integrity: sha512-oxnCNGj88fL+xzV+dacXs44HcDwf1ovs3AuEzvP7mqXw7fQntqIhQ1BRmynh4qEKQSSSRSWVyXRjmTbZIX9V2Q==, + integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==, } - 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 - /@xtuc/ieee754@1.2.0: + "@types/file-saver@2.0.7": resolution: { - integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==, + integrity: sha512-dNKVfHd/jk0SkR/exKGj2ggkB45MAkzvWCaqLUUgkyjITkGNzH8H+yUwr+BLJUBjZOe9w8X3wgmXhZDRg1ED6A==, } - dev: true - /@xtuc/long@4.2.2: + "@vitejs/plugin-vue@5.0.5": resolution: { - integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==, + integrity: sha512-LOjm7XeIimLBZyzinBQ6OSm3UBCNVCpLkxGC0oWmm2YPzVZoxMsdvNVimLTBzpAnR9hl/yn1SHGuRfe6/Td9rQ==, } - dev: true + engines: { node: ^18.0.0 || >=20.0.0 } + peerDependencies: + vite: ^5.0.0 + vue: ^3.2.25 - /abab@2.0.6: + "@volar/language-core@2.3.0": resolution: { - integrity: sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==, + integrity: sha512-pvhL24WUh3VDnv7Yw5N1sjhPtdx7q9g+Wl3tggmnkMcyK8GcCNElF2zHiKznryn0DiUGk+eez/p2qQhz+puuHw==, } - deprecated: Use your platform's native atob() and btoa() methods instead - dev: false - /accepts@1.3.8: + "@volar/source-map@2.3.0": resolution: { - integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==, + integrity: sha512-G/228aZjAOGhDjhlyZ++nDbKrS9uk+5DMaEstjvzglaAw7nqtDyhnQAsYzUg6BMP9BtwZ59RIw5HGePrutn00Q==, } - engines: { node: ">= 0.6" } - dependencies: - mime-types: 2.1.35 - negotiator: 0.6.3 - dev: true - /acorn-import-assertions@1.9.0(acorn@8.11.3): + "@volar/typescript@2.3.0": resolution: { - integrity: sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==, + integrity: sha512-PtUwMM87WsKVeLJN33GSTUjBexlKfKgouWlOUIv7pjrOnTwhXHZNSmpc312xgXdTjQPpToK6KXSIcKu9sBQ5LQ==, } - peerDependencies: - acorn: ^8 - dependencies: - acorn: 8.11.3 - dev: true - /acorn@8.11.3: + "@vue/compiler-core@3.4.29": resolution: { - integrity: sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==, + integrity: sha512-TFKiRkKKsRCKvg/jTSSKK7mYLJEQdUiUfykbG49rubC9SfDyvT2JrzTReopWlz2MxqeLyxh9UZhvxEIBgAhtrg==, } - engines: { node: ">=0.4.0" } - hasBin: true - dev: true - /agent-base@6.0.2: + "@vue/compiler-dom@3.4.29": resolution: { - integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==, + integrity: sha512-A6+iZ2fKIEGnfPJejdB7b1FlJzgiD+Y/sxxKwJWg1EbJu6ZPgzaPQQ51ESGNv0CP6jm6Z7/pO6Ia8Ze6IKrX7w==, } - engines: { node: ">= 6.0.0" } - dependencies: - debug: 4.3.4 - transitivePeerDependencies: - - supports-color - dev: false - /ajv-formats@2.1.1(ajv@8.12.0): + "@vue/compiler-sfc@3.4.29": resolution: { - integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==, + integrity: sha512-zygDcEtn8ZimDlrEQyLUovoWgKQic6aEQqRXce2WXBvSeHbEbcAsXyCk9oG33ZkyWH4sl9D3tkYc1idoOkdqZQ==, } - peerDependencies: - ajv: ^8.0.0 - peerDependenciesMeta: - ajv: - optional: true - dependencies: - ajv: 8.12.0 - dev: true - /ajv-keywords@3.5.2(ajv@6.12.6): + "@vue/compiler-ssr@3.4.29": resolution: { - integrity: sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==, + integrity: sha512-rFbwCmxJ16tDp3N8XCx5xSQzjhidYjXllvEcqX/lopkoznlNPz3jyy0WGJCyhAaVQK677WWFt3YO/WUEkMMUFQ==, } - peerDependencies: - ajv: ^6.9.1 - dependencies: - ajv: 6.12.6 - dev: true - /ajv-keywords@5.1.0(ajv@8.12.0): + "@vue/language-core@2.0.21": resolution: { - integrity: sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==, + integrity: sha512-vjs6KwnCK++kIXT+eI63BGpJHfHNVJcUCr3RnvJsccT3vbJnZV5IhHR2puEkoOkIbDdp0Gqi1wEnv3hEd3WsxQ==, } peerDependencies: - ajv: ^8.8.2 - dependencies: - ajv: 8.12.0 - fast-deep-equal: 3.1.3 - dev: true + typescript: "*" + peerDependenciesMeta: + typescript: + optional: true - /ajv@6.12.6: + "@vue/reactivity@3.4.29": resolution: { - integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==, + integrity: sha512-w8+KV+mb1a8ornnGQitnMdLfE0kXmteaxLdccm2XwdFxXst4q/Z7SEboCV5SqJNpZbKFeaRBBJBhW24aJyGINg==, } - 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 - /ajv@8.12.0: + "@vue/runtime-core@3.4.29": resolution: { - integrity: sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==, + integrity: sha512-s8fmX3YVR/Rk5ig0ic0NuzTNjK2M7iLuVSZyMmCzN/+Mjuqqif1JasCtEtmtoJWF32pAtUjyuT2ljNKNLeOmnQ==, } - 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 - /ansi-html-community@0.0.8: + "@vue/runtime-dom@3.4.29": resolution: { - integrity: sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==, + integrity: sha512-gI10atCrtOLf/2MPPMM+dpz3NGulo9ZZR9d1dWo4fYvm+xkfvRrw1ZmJ7mkWtiJVXSsdmPbcK1p5dZzOCKDN0g==, } - engines: { "0": node >= 0.8.0 } - hasBin: true - dev: true - /ansi-regex@5.0.1: + "@vue/server-renderer@3.4.29": resolution: { - integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==, + integrity: sha512-HMLCmPI2j/k8PVkSBysrA2RxcxC5DgBiCdj7n7H2QtR8bQQPqKAe8qoaxLcInzouBmzwJ+J0x20ygN/B5mYBng==, } - engines: { node: ">=8" } - dev: true + peerDependencies: + vue: 3.4.29 - /ansi-styles@4.3.0: + "@vue/shared@3.4.29": resolution: { - integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==, + integrity: sha512-hQ2gAQcBO/CDpC82DCrinJNgOHI2v+FA7BDW4lMSPeBpQ7sRe2OLHWe5cph1s7D8DUQAwRt18dBDfJJ220APEA==, } - engines: { node: ">=8" } - dependencies: - color-convert: 2.0.1 - dev: true - /anymatch@3.1.3: + "@vuetify/loader-shared@2.0.3": resolution: { - integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==, + integrity: sha512-Ss3GC7eJYkp2SF6xVzsT7FAruEmdihmn4OCk2+UocREerlXKWgOKKzTN5PN3ZVN5q05jHHrsNhTuWbhN61Bpdg==, } - engines: { node: ">= 8" } - dependencies: - normalize-path: 3.0.0 - picomatch: 2.3.1 - dev: true + peerDependencies: + vue: ^3.0.0 + vuetify: ^3.0.0 - /array-flatten@1.1.1: + agent-base@7.1.1: resolution: { - integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==, + integrity: sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==, } - dev: true + engines: { node: ">= 14" } - /asynckit@0.4.0: + anymatch@3.1.3: resolution: { - integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==, + integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==, } - dev: false + engines: { node: ">= 8" } - /balanced-match@1.0.2: + asynckit@0.4.0: resolution: { - integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==, + integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==, } - dev: true - /batch@0.6.1: + balanced-match@1.0.2: resolution: { - integrity: sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==, + 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" } - dev: true - /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 - dev: false + engines: { node: ">=18" } - /body-parser@1.20.2: + brace-expansion@2.0.1: resolution: { - integrity: sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==, + integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==, } - 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: + braces@3.0.3: resolution: { - integrity: sha512-oSzCS2zV14bh2kji6vNe7vrpJYCHGvcZnlffFQ1MEoX/WOeQ/teD8SYWKR942OI3INjq8OMNJlbPK5LLLUxFDw==, + integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==, } - dependencies: - fast-deep-equal: 3.1.3 - multicast-dns: 7.2.5 - dev: true + engines: { node: ">=8" } - /boolbase@1.0.0: + chokidar@3.6.0: resolution: { - integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==, + integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==, } - dev: true + engines: { node: ">= 8.10.0" } - /brace-expansion@1.1.11: + combined-stream@1.0.8: resolution: { - integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==, + integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==, } - dependencies: - balanced-match: 1.0.2 - concat-map: 0.0.1 - dev: true + engines: { node: ">= 0.8" } - /braces@3.0.2: + computeds@0.0.1: resolution: { - integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==, + integrity: sha512-7CEBgcMjVmitjYo5q8JTJVra6X5mQ20uTThdK+0kR7UEaDrAWEQcRiBtWJzga4eRpP6afNwwLsX2SET2JhVB1Q==, } - engines: { node: ">=8" } - dependencies: - fill-range: 7.0.1 - dev: true - /browserslist@4.23.0: + core-util-is@1.0.3: resolution: { - integrity: sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==, + integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==, } - 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: + cssstyle@3.0.0: resolution: { - integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==, + integrity: sha512-N4u2ABATi3Qplzf0hWbVCdjenim8F3ojEXpBDF5hBpjzW182MjNGLqfmQ0SkSPeQ+V86ZXgeH8aXj6kayd4jgg==, } - dev: true + engines: { node: ">=14" } - /bytes@3.0.0: + csstype@3.1.3: resolution: { - integrity: sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==, + integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==, } - engines: { node: ">= 0.8" } - dev: true - /bytes@3.1.2: + data-urls@5.0.0: resolution: { - integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==, + integrity: sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==, } - engines: { node: ">= 0.8" } - dev: true + engines: { node: ">=18" } - /call-bind@1.0.7: + de-indent@1.0.2: resolution: { - integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==, + integrity: sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==, } - 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: + debug@4.3.5: resolution: { - integrity: sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==, + integrity: sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==, } - dependencies: - pascal-case: 3.1.2 - tslib: 2.6.2 - dev: true + engines: { node: ">=6.0" } + peerDependencies: + supports-color: "*" + peerDependenciesMeta: + supports-color: + optional: true - /caniuse-lite@1.0.30001607: + decimal.js@10.4.3: resolution: { - integrity: sha512-WcvhVRjXLKFB/kmOFVwELtMxyhq3iM/MvmXcyCe2PNf166c39mptscOc/45TTS96n2gpNV2z7+NakArTWZCQ3w==, + integrity: sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==, } - dev: true - /chalk@4.1.2: + delayed-stream@1.0.0: resolution: { - integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==, + integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==, } - engines: { node: ">=10" } - dependencies: - ansi-styles: 4.3.0 - supports-color: 7.2.0 - dev: true + engines: { node: ">=0.4.0" } - /chokidar@3.6.0: + entities@4.5.0: resolution: { - integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==, + integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==, } - 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 - dev: true + engines: { node: ">=0.12" } - /chrome-trace-event@1.0.3: + esbuild@0.21.5: resolution: { - integrity: sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==, + integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==, } - engines: { node: ">=6.0" } - dev: true + engines: { node: ">=12" } + hasBin: true - /clean-css@5.3.3: + estree-walker@2.0.2: resolution: { - integrity: sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg==, + integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==, } - engines: { node: ">= 10.0" } - dependencies: - source-map: 0.6.1 - dev: true - /clone-deep@4.0.1: + fast-glob@3.3.2: resolution: { - integrity: sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==, + integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==, } - engines: { node: ">=6" } - dependencies: - is-plain-object: 2.0.4 - kind-of: 6.0.3 - shallow-clone: 3.0.1 - dev: true + engines: { node: ">=8.6.0" } - /color-convert@2.0.1: + fastq@1.17.1: resolution: { - integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==, + integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==, } - engines: { node: ">=7.0.0" } - dependencies: - color-name: 1.1.4 - dev: true - /color-name@1.1.4: + file-saver@2.0.5: resolution: { - integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==, + integrity: sha512-P9bmyZ3h/PRG+Nzga+rbdI4OEpNDzAVyy74uVO9ATgzLK6VtAsYybF/+TOCvrc0MO793d6+42lLyZTw7/ArVzA==, } - dev: true - /colorette@2.0.20: + fill-range@7.1.1: resolution: { - integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==, + integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==, } - dev: true + engines: { node: ">=8" } - /combined-stream@1.0.8: + form-data@4.0.0: resolution: { - integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==, + integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==, } - engines: { node: ">= 0.8" } - dependencies: - delayed-stream: 1.0.0 - dev: false + engines: { node: ">= 6" } - /commander@2.20.3: + fs-extra@11.2.0: resolution: { - integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==, + integrity: sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==, } - dev: true + engines: { node: ">=14.14" } - /commander@7.2.0: + fsevents@2.3.3: resolution: { - integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==, + integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==, } - engines: { node: ">= 10" } - dev: true + engines: { node: ^8.16.0 || ^10.6.0 || >=11.0.0 } + os: [darwin] - /commander@8.3.0: + glob-parent@5.1.2: resolution: { - integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==, + integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==, } - engines: { node: ">= 12" } - dev: true + engines: { node: ">= 6" } - /compressible@2.0.18: + graceful-fs@4.2.11: resolution: { - integrity: sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==, + integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==, } - engines: { node: ">= 0.6" } - dependencies: - mime-db: 1.52.0 - dev: true - /compression@1.7.4: + he@1.2.0: resolution: { - integrity: sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==, + integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==, } - 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 + hasBin: true - /concat-map@0.0.1: + highlight.js@11.9.0: resolution: { - integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==, + integrity: sha512-fJ7cW7fQGCYAkgv4CPfwFHrfd/cLS4Hau96JuJ+ZTOWhjnhoeN1ub1tFmALm/+lW5z4WCAuAV9bm05AP0mS6Gw==, } - dev: true + engines: { node: ">=12.0.0" } - /connect-history-api-fallback@2.0.0: + html-encoding-sniffer@4.0.0: resolution: { - integrity: sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==, + integrity: sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==, } - engines: { node: ">=0.8" } - dev: true + engines: { node: ">=18" } - /content-disposition@0.5.4: + http-proxy-agent@7.0.2: resolution: { - integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==, + integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==, } - engines: { node: ">= 0.6" } - dependencies: - safe-buffer: 5.2.1 - dev: true + engines: { node: ">= 14" } - /content-type@1.0.5: + https-proxy-agent@7.0.4: resolution: { - integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==, + integrity: sha512-wlwpilI7YdjSkWaQ/7omYBMTliDcmCN8OLihO6I9B86g06lMyAoqgoDpV0XqoaPOKj+0DIdAvnsWfyAAhmimcg==, } - engines: { node: ">= 0.6" } - dev: true + engines: { node: ">= 14" } - /cookie-signature@1.0.6: + iconv-lite@0.6.3: resolution: { - integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==, + integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==, } - dev: true + engines: { node: ">=0.10.0" } - /cookie@0.6.0: + immediate@3.0.6: resolution: { - integrity: sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==, + integrity: sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==, } - engines: { node: ">= 0.6" } - dev: true - /core-util-is@1.0.3: + immutable@4.3.6: resolution: { - integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==, + integrity: sha512-Ju0+lEMyzMVZarkTn/gqRpdqd5dOPaz1mCZ0SH3JV6iFw81PldE/PEB1hWVEA288HPt4WXW8O7AWxB10M+03QQ==, } - dev: true - /cross-spawn@7.0.3: + inherits@2.0.4: resolution: { - integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==, + integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==, } - 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): + is-binary-path@2.1.0: resolution: { - integrity: sha512-CTJ+AEQJjq5NzLga5pE39qdiSV56F8ywCIsqNIRF0r7BDgWsN25aazToqAFg7ZrtA/U016xudB3ffgweORxX7g==, + integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==, } - 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 + engines: { node: ">=8" } - /css-select@4.3.0: + is-extglob@2.1.1: resolution: { - integrity: sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==, + integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==, } - 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 + engines: { node: ">=0.10.0" } - /css-what@6.1.0: + is-glob@4.0.3: resolution: { - integrity: sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==, + integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==, } - engines: { node: ">= 6" } - dev: true + engines: { node: ">=0.10.0" } - /cssesc@3.0.0: + is-number@7.0.0: resolution: { - integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==, + integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==, } - engines: { node: ">=4" } - hasBin: true - dev: true + engines: { node: ">=0.12.0" } - /cssstyle@3.0.0: + is-potential-custom-element-name@1.0.1: resolution: { - integrity: sha512-N4u2ABATi3Qplzf0hWbVCdjenim8F3ojEXpBDF5hBpjzW182MjNGLqfmQ0SkSPeQ+V86ZXgeH8aXj6kayd4jgg==, + integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==, } - engines: { node: ">=14" } - dependencies: - rrweb-cssom: 0.6.0 - dev: false - /data-urls@4.0.0: + isarray@1.0.0: resolution: { - integrity: sha512-/mMTei/JXPqvFqQtfyTowxmJVwr2PVAeCcDxyFf6LhoOu/09TX2OX3kb2wzi4DMXcfj4OItwDOnhl5oziPnT6g==, + integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==, } - engines: { node: ">=14" } - dependencies: - abab: 2.0.6 - whatwg-mimetype: 3.0.0 - whatwg-url: 12.0.1 - dev: false - /debug@2.6.9: + jsdom@23.0.0: resolution: { - integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==, + integrity: sha512-cbL/UCtohJguhFC7c2/hgW6BeZCNvP7URQGnx9tSJRYKCdnfbfWOrtuLTMfiB2VxKsx5wPHVsh/J0aBy9lIIhQ==, } + engines: { node: ">=18" } peerDependencies: - supports-color: "*" + canvas: ^3.0.0 peerDependenciesMeta: - supports-color: + canvas: optional: true - dependencies: - ms: 2.0.0 - dev: true - /debug@4.3.4: + jsonfile@6.1.0: resolution: { - integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==, + integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==, } - engines: { node: ">=6.0" } - peerDependencies: - supports-color: "*" - peerDependenciesMeta: - supports-color: - optional: true - dependencies: - ms: 2.1.2 - /decimal.js@10.4.3: + jszip@3.10.1: resolution: { - integrity: sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==, + integrity: sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==, } - dev: false - /default-gateway@6.0.3: + lie@3.3.0: resolution: { - integrity: sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==, + integrity: sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==, } - engines: { node: ">= 10" } - dependencies: - execa: 5.1.1 - dev: true - /define-data-property@1.1.4: + magic-string@0.30.10: resolution: { - integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==, + integrity: sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ==, } - 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: + merge2@1.4.1: resolution: { - integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==, + integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==, } - engines: { node: ">=8" } - dev: true + engines: { node: ">= 8" } - /delayed-stream@1.0.0: + micromatch@4.0.7: resolution: { - integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==, + integrity: sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==, } - engines: { node: ">=0.4.0" } - dev: false + engines: { node: ">=8.6" } - /depd@1.1.2: + mime-db@1.52.0: resolution: { - integrity: sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==, + integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==, } engines: { node: ">= 0.6" } - dev: true - /depd@2.0.0: + mime-types@2.1.35: resolution: { - integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==, + integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==, } - engines: { node: ">= 0.8" } - dev: true + engines: { node: ">= 0.6" } - /destroy@1.2.0: + minimatch@9.0.4: resolution: { - integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==, + integrity: sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==, } - engines: { node: ">= 0.8", npm: 1.2.8000 || >= 1.4.16 } - dev: true + engines: { node: ">=16 || 14 >=14.17" } - /detect-node@2.1.0: + ms@2.1.2: resolution: { - integrity: sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==, + integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==, } - dev: true - /dns-packet@5.6.1: + muggle-string@0.4.1: resolution: { - integrity: sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==, + integrity: sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==, } - engines: { node: ">=6" } - dependencies: - "@leichtgewicht/ip-codec": 2.0.5 - dev: true - /dom-converter@0.2.0: + nanoid@3.3.7: resolution: { - integrity: sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==, + integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==, } - dependencies: - utila: 0.4.0 - dev: true + engines: { node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1 } + hasBin: true - /dom-serializer@1.4.1: + normalize-path@3.0.0: resolution: { - integrity: sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==, + integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==, } - dependencies: - domelementtype: 2.3.0 - domhandler: 4.3.1 - entities: 2.2.0 - dev: true + engines: { node: ">=0.10.0" } - /domelementtype@2.3.0: + nwsapi@2.2.10: resolution: { - integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==, + integrity: sha512-QK0sRs7MKv0tKe1+5uZIQk/C8XGza4DAnztJG8iD+TpJIORARrCxczA738awHrZoHeTjSSoHqao2teO0dC/gFQ==, } - dev: true - /domexception@4.0.0: + pako@1.0.11: resolution: { - integrity: sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw==, + integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==, } - engines: { node: ">=12" } - deprecated: Use your platform's native DOMException instead - dependencies: - webidl-conversions: 7.0.0 - dev: false - /domhandler@4.3.1: + parse5@7.1.2: resolution: { - integrity: sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==, + integrity: sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==, } - engines: { node: ">= 4" } - dependencies: - domelementtype: 2.3.0 - dev: true - /domutils@2.8.0: + path-browserify@1.0.1: resolution: { - integrity: sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==, + integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==, } - dependencies: - dom-serializer: 1.4.1 - domelementtype: 2.3.0 - domhandler: 4.3.1 - dev: true - /dot-case@3.0.4: + picocolors@1.0.1: resolution: { - integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==, + integrity: sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==, } - dependencies: - no-case: 3.0.4 - tslib: 2.6.2 - dev: true - /ee-first@1.1.1: + picomatch@2.3.1: resolution: { - integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==, + integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==, } - dev: true + engines: { node: ">=8.6" } - /electron-to-chromium@1.4.730: + postcss@8.4.38: resolution: { - integrity: sha512-oJRPo82XEqtQAobHpJIR3zW5YO3sSRRkPz2an4yxi1UvqhsGm54vR/wzTFV74a3soDOJ8CKW7ajOOX5ESzddwg==, + integrity: sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==, } - dev: true + engines: { node: ^10 || ^12 || >=14 } - /encodeurl@1.0.2: + prettier@3.3.2: resolution: { - integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==, + integrity: sha512-rAVeHYMcv8ATV5d508CFdn+8/pHPpXeIid1DdrPwXnaAdH7cqjVbpJaT5eq4yRAFU/lsbwYwSF/n5iNrdJHPQA==, } - engines: { node: ">= 0.8" } - dev: true + engines: { node: ">=14" } + hasBin: true - /enhanced-resolve@5.16.0: + process-nextick-args@2.0.1: resolution: { - integrity: sha512-O+QWCviPNSSLAD9Ucn8Awv+poAkqn3T1XY5/N7kR7rQO9yfSGWkYZDwpJ+iKF7B8rxaQKWngSqACpgzeapSyoA==, + integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==, } - engines: { node: ">=10.13.0" } - dependencies: - graceful-fs: 4.2.11 - tapable: 2.2.1 - dev: true - /entities@2.2.0: + psl@1.9.0: resolution: { - integrity: sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==, + integrity: sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==, } - dev: true - /entities@4.5.0: + punycode@2.3.1: resolution: { - integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==, + integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==, } - engines: { node: ">=0.12" } - dev: false + engines: { node: ">=6" } - /envinfo@7.12.0: + querystringify@2.2.0: resolution: { - integrity: sha512-Iw9rQJBGpJRd3rwXm9ft/JiGoAZmLxxJZELYDQoPRZ4USVhkKtIcNBPw6U+/K2mBpaqM25JSV6Yl4Az9vO2wJg==, + integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==, } - engines: { node: ">=4" } - hasBin: true - dev: true - /es-define-property@1.0.0: + queue-microtask@1.2.3: resolution: { - integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==, + integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==, } - engines: { node: ">= 0.4" } - dependencies: - get-intrinsic: 1.2.4 - dev: true - /es-errors@1.3.0: + readable-stream@2.3.8: resolution: { - integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==, + integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==, } - engines: { node: ">= 0.4" } - dev: true - /es-module-lexer@1.5.0: + readdirp@3.6.0: resolution: { - integrity: sha512-pqrTKmwEIgafsYZAGw9kszYzmagcE/n4dbgwGWLEXg7J4QFJVQRBld8j3Q3GNez79jzxZshq0bcT962QHOghjw==, + integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==, } - dev: true + engines: { node: ">=8.10.0" } - /escalade@3.1.2: + requires-port@1.0.0: resolution: { - integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==, + integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==, } - engines: { node: ">=6" } - dev: true - /escape-html@1.0.3: + reusify@1.0.4: resolution: { - integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==, + integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==, } - dev: true + engines: { iojs: ">=1.0.0", node: ">=0.10.0" } - /eslint-scope@5.1.1: + rollup@4.18.0: resolution: { - integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==, + integrity: sha512-QmJz14PX3rzbJCN1SG4Xe/bAAX2a6NpCP8ab2vfu2GiUr8AQcr2nCV/oEO3yneFarB67zk8ShlIyWb2LGTb3Sg==, } - engines: { node: ">=8.0.0" } - dependencies: - esrecurse: 4.3.0 - estraverse: 4.3.0 - dev: true + engines: { node: ">=18.0.0", npm: ">=8.0.0" } + hasBin: true - /esrecurse@4.3.0: + rrweb-cssom@0.6.0: resolution: { - integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==, + integrity: sha512-APM0Gt1KoXBz0iIkkdB/kfvGOwC4UuJFeG/c+yV7wSc7q96cG/kJ0HiYCnzivD9SB53cLV1MlHFNfOuPaadYSw==, } - engines: { node: ">=4.0" } - dependencies: - estraverse: 5.3.0 - dev: true - /estraverse@4.3.0: + run-parallel@1.2.0: resolution: { - integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==, + integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==, } - engines: { node: ">=4.0" } - dev: true - /estraverse@5.3.0: + safe-buffer@5.1.2: resolution: { - integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==, + integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==, } - engines: { node: ">=4.0" } - dev: true - /etag@1.8.1: + safer-buffer@2.1.2: resolution: { - integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==, + integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==, } - engines: { node: ">= 0.6" } - dev: true - /eventemitter3@4.0.7: + sass@1.77.6: resolution: { - integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==, + integrity: sha512-ByXE1oLD79GVq9Ht1PeHWCPMPB8XHpBuz1r85oByKHjZY6qV6rWnQovQzXJXuQ/XyE1Oj3iPk3lo28uzaRA2/Q==, } - dev: true + engines: { node: ">=14.0.0" } + hasBin: true - /events@3.3.0: + saxes@6.0.0: resolution: { - integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==, + integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==, } - engines: { node: ">=0.8.x" } - dev: true + engines: { node: ">=v12.22.7" } - /execa@5.1.1: + semver@7.6.2: resolution: { - integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==, + integrity: sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==, } 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 + hasBin: true - /express@4.19.2: + setimmediate@1.0.5: resolution: { - integrity: sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==, + integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==, } - 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: + source-map-js@1.2.0: resolution: { - integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==, + integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==, } - dev: true + engines: { node: ">=0.10.0" } - /fast-json-stable-stringify@2.1.0: + string_decoder@1.1.1: resolution: { - integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==, + integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==, } - dev: true - /fastest-levenshtein@1.0.16: + symbol-tree@3.2.4: resolution: { - integrity: sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==, + integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==, } - engines: { node: ">= 4.9.1" } - dev: true - /faye-websocket@0.11.4: + to-fast-properties@2.0.0: resolution: { - integrity: sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==, + integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==, } - engines: { node: ">=0.8.0" } - dependencies: - websocket-driver: 0.7.4 - dev: true + engines: { node: ">=4" } - /fill-range@7.0.1: + to-regex-range@5.0.1: resolution: { - integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==, + integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==, } - engines: { node: ">=8" } - dependencies: - to-regex-range: 5.0.1 - dev: true + engines: { node: ">=8.0" } - /finalhandler@1.2.0: + tough-cookie@4.1.4: resolution: { - integrity: sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==, + integrity: sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==, } - 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 + engines: { node: ">=6" } - /find-up@4.1.0: + tr46@5.0.0: resolution: { - integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==, + integrity: sha512-tk2G5R2KRwBd+ZN0zaEXpmzdKyOYksXwywulIX95MBODjSzMIuQnQ3m8JxgbhnL1LeVo7lqQKsYa1O3Htl7K5g==, } - engines: { node: ">=8" } - dependencies: - locate-path: 5.0.0 - path-exists: 4.0.0 - dev: true + engines: { node: ">=18" } - /flat@5.0.2: + typescript@5.5.2: resolution: { - integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==, + integrity: sha512-NcRtPEOsPFFWjobJEtfihkLCZCXZt/os3zf8nTxjVH3RvTSxjrCamJpbExGvYOF+tFHc3pA65qpdwPbzjohhew==, } + engines: { node: ">=14.17" } hasBin: true - dev: true - /follow-redirects@1.15.6: + universalify@0.2.0: resolution: { - integrity: sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==, + integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==, } - engines: { node: ">=4.0" } - peerDependencies: - debug: "*" - peerDependenciesMeta: - debug: - optional: true - dev: true + engines: { node: ">= 4.0.0" } - /form-data@4.0.0: + universalify@2.0.1: resolution: { - integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==, + integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==, } - engines: { node: ">= 6" } - dependencies: - asynckit: 0.4.0 - combined-stream: 1.0.8 - mime-types: 2.1.35 - dev: false + engines: { node: ">= 10.0.0" } - /forwarded@0.2.0: + upath@2.0.1: resolution: { - integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==, + integrity: sha512-1uEe95xksV1O0CYKXo8vQvN1JEbtJp7lb7C5U9HMsIp6IVwntkH/oNUzyVNQSd4S1sYk2FpSSW44FqMc8qee5w==, } - engines: { node: ">= 0.6" } - dev: true + engines: { node: ">=4" } - /fresh@0.5.2: + url-parse@1.5.10: resolution: { - integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==, + integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==, } - engines: { node: ">= 0.6" } - dev: true - /fs-monkey@1.0.5: + util-deprecate@1.0.2: resolution: { - integrity: sha512-8uMbBjrhzW76TYgEV27Y5E//W2f/lTFmx78P2w19FZSxarhI/798APGQyuGCwmkNxgwGRhrLfvWyLBvNtuOmew==, + integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==, } - dev: true - /fs.realpath@1.0.0: + vite-plugin-static-copy@1.0.5: resolution: { - integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==, + integrity: sha512-02k0Rox+buYdEOfeilKZSgs1gXfPf9RjVztZEIYZgVIxjsVZi6AXssjzdi+qW6zYt00d3bq+tpP2voVXN2fKLw==, } - dev: true + engines: { node: ^18.0.0 || >=20.0.0 } + peerDependencies: + vite: ^5.0.0 - /fsevents@2.3.3: + vite-plugin-vuetify@2.0.3: resolution: { - integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==, + integrity: sha512-HbYajgGgb/noaVKNRhnnXIiQZrNXfNIeanUGAwXgOxL6h/KULS40Uf51Kyz8hNmdegF+DwjgXXI/8J1PNS83xw==, } - engines: { node: ^8.16.0 || ^10.6.0 || >=11.0.0 } - os: [darwin] - requiresBuild: true - dev: true - optional: true + engines: { node: ^18.0.0 || >=20.0.0 } + peerDependencies: + vite: ">=5" + vue: ^3.0.0 + vuetify: ^3.0.0 - /function-bind@1.1.2: + vite@5.3.1: resolution: { - integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==, + integrity: sha512-XBmSKRLXLxiaPYamLv3/hnP/KXDai1NDexN0FpkTaZXTfycHvkRHoenpgl/fvuK/kPbB6xAgoyiryAhQNxYmAQ==, } - dev: true + engines: { node: ^18.0.0 || >=20.0.0 } + hasBin: true + peerDependencies: + "@types/node": ^18.0.0 || >=20.0.0 + less: "*" + lightningcss: ^1.21.0 + sass: "*" + stylus: "*" + sugarss: "*" + terser: ^5.4.0 + peerDependenciesMeta: + "@types/node": + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true - /get-intrinsic@1.2.4: + vscode-uri@3.0.8: resolution: { - integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==, + integrity: sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==, } - 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: + vue-template-compiler@2.7.16: resolution: { - integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==, + integrity: sha512-AYbUWAJHLGGQM7+cNTELw+KsOG9nl2CnSv467WobS5Cv9uk3wFcnr1Etsz2sEIHEZvw1U+o9mRlEO6QbZvUPGQ==, } - engines: { node: ">=10" } - dev: true - /glob-parent@5.1.2: + vue-tsc@2.0.21: resolution: { - integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==, + integrity: sha512-E6x1p1HaHES6Doy8pqtm7kQern79zRtIewkf9fiv7Y43Zo4AFDS5hKi+iHi2RwEhqRmuiwliB1LCEFEGwvxQnw==, } - engines: { node: ">= 6" } - dependencies: - is-glob: 4.0.3 - dev: true + hasBin: true + peerDependencies: + typescript: "*" - /glob-to-regexp@0.4.1: + vue@3.4.29: resolution: { - integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==, + integrity: sha512-8QUYfRcYzNlYuzKPfge1UWC6nF9ym0lx7mpGVPJYNhddxEf3DD0+kU07NTL0sXuiT2HuJuKr/iEO8WvXvT0RSQ==, } - dev: true + peerDependencies: + typescript: "*" + peerDependenciesMeta: + typescript: + optional: true - /glob@7.2.3: + vuetify@3.6.10: resolution: { - integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==, + integrity: sha512-Myd9+EFq4Gmu61yKPNVS0QdGQkcZ9cHom27wuvRw7jgDxM+X4MT9BwQRk/Dt1q3G3JlK8oh+ZYyq5Ps/Z73cMg==, } - 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 + engines: { node: ^12.20 || >=14.13 } + peerDependencies: + 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: + typescript: + optional: true + vite-plugin-vuetify: + optional: true + vue-i18n: + optional: true + webpack-plugin-vuetify: + optional: true - /gopd@1.0.1: + w3c-xmlserializer@5.0.0: resolution: { - integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==, + integrity: sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==, } - dependencies: - get-intrinsic: 1.2.4 - dev: true + engines: { node: ">=18" } - /graceful-fs@4.2.11: + webidl-conversions@7.0.0: resolution: { - integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==, + integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==, } - dev: true + engines: { node: ">=12" } - /handle-thing@2.0.1: + whatwg-encoding@3.1.1: resolution: { - integrity: sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==, + integrity: sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==, } - dev: true + engines: { node: ">=18" } - /has-flag@4.0.0: + whatwg-mimetype@4.0.0: resolution: { - integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==, + integrity: sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==, } - engines: { node: ">=8" } - dev: true + engines: { node: ">=18" } - /has-property-descriptors@1.0.2: + whatwg-url@14.0.0: resolution: { - integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==, + integrity: sha512-1lfMEm2IEr7RIV+f4lUNPOqfFL+pO+Xw3fJSqmjX9AbXcXcYOkCe1P6+9VBZB6n94af16NfZf+sSk0JCBZC9aw==, } - dependencies: - es-define-property: 1.0.0 - dev: true + engines: { node: ">=18" } - /has-proto@1.0.3: + ws@8.17.1: resolution: { - integrity: sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==, + integrity: sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==, } - engines: { node: ">= 0.4" } - dev: true + engines: { node: ">=10.0.0" } + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ">=5.0.2" + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true - /has-symbols@1.0.3: + xml-name-validator@5.0.0: resolution: { - integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==, + integrity: sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==, } - engines: { node: ">= 0.4" } - dev: true + engines: { node: ">=18" } - /hasown@2.0.2: + xmlchars@2.2.0: resolution: { - integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==, + integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==, } - 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 +snapshots: + "@babel/helper-string-parser@7.24.7": {} - /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 + "@babel/helper-validator-identifier@7.24.7": {} - /html-encoding-sniffer@3.0.0: - resolution: - { - integrity: sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==, - } - engines: { node: ">=12" } + "@babel/parser@7.24.7": dependencies: - whatwg-encoding: 2.0.0 - dev: false - - /html-entities@2.5.2: - resolution: - { - integrity: sha512-K//PSRMQk4FZ78Kyau+mZurHn3FH0Vwr+H36eE0rPbeYkRRi9YxceYPhuN60UwWorxyKHhqoAJl2OFKa4BVtaA==, - } - dev: true + "@babel/types": 7.24.7 - /html-minifier-terser@6.1.0: - resolution: - { - integrity: sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==, - } - engines: { node: ">=12" } - hasBin: true + "@babel/types@7.24.7": 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 + "@babel/helper-string-parser": 7.24.7 + "@babel/helper-validator-identifier": 7.24.7 + to-fast-properties: 2.0.0 - /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 + "@blockly/theme-dark@7.0.1(blockly@11.1.1)": 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 + blockly: 11.1.1 - /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 + "@esbuild/aix-ppc64@0.21.5": + optional: true - /http-deceiver@1.2.7: - resolution: - { - integrity: sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==, - } - dev: true + "@esbuild/android-arm64@0.21.5": + optional: 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 + "@esbuild/android-arm@0.21.5": + optional: 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 + "@esbuild/android-x64@0.21.5": + optional: true - /http-parser-js@0.5.8: - resolution: - { - integrity: sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==, - } - dev: true + "@esbuild/darwin-arm64@0.21.5": + optional: 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 + "@esbuild/darwin-x64@0.21.5": + optional: true - /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 + "@esbuild/freebsd-arm64@0.21.5": + optional: 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 + "@esbuild/freebsd-x64@0.21.5": + optional: 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 + "@esbuild/linux-arm64@0.21.5": + optional: true - /human-signals@2.1.0: - resolution: - { - integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==, - } - engines: { node: ">=10.17.0" } - dev: true + "@esbuild/linux-arm@0.21.5": + optional: 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 + "@esbuild/linux-ia32@0.21.5": + optional: true - /p-try@2.2.0: - resolution: - { - integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==, - } - engines: { node: ">=6" } - dev: true + "@esbuild/linux-loong64@0.21.5": + optional: true - /param-case@3.0.4: - resolution: - { - integrity: sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==, - } - dependencies: - dot-case: 3.0.4 - tslib: 2.6.2 - dev: true + "@esbuild/linux-mips64el@0.21.5": + optional: true - /parse5@7.1.2: - resolution: - { - integrity: sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==, - } - dependencies: - entities: 4.5.0 - dev: false + "@esbuild/linux-ppc64@0.21.5": + optional: true - /parseurl@1.3.3: - resolution: - { - integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==, - } - engines: { node: ">= 0.8" } - dev: true + "@esbuild/linux-riscv64@0.21.5": + optional: true - /pascal-case@3.1.2: - resolution: - { - integrity: sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==, - } - dependencies: - no-case: 3.0.4 - tslib: 2.6.2 - dev: true + "@esbuild/linux-s390x@0.21.5": + optional: true - /path-exists@4.0.0: - resolution: - { - integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==, - } - engines: { node: ">=8" } - dev: true + "@esbuild/linux-x64@0.21.5": + optional: true - /path-is-absolute@1.0.1: - resolution: - { - integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==, - } - engines: { node: ">=0.10.0" } - dev: true + "@esbuild/netbsd-x64@0.21.5": + optional: true - /path-key@3.1.1: - resolution: - { - integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==, - } - engines: { node: ">=8" } - dev: true + "@esbuild/openbsd-x64@0.21.5": + optional: true - /path-parse@1.0.7: - resolution: - { - integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==, - } - dev: true + "@esbuild/sunos-x64@0.21.5": + optional: true - /path-to-regexp@0.1.7: - resolution: - { - integrity: sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==, - } - dev: true + "@esbuild/win32-arm64@0.21.5": + optional: true - /picocolors@1.0.0: - resolution: - { - integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==, - } - dev: true + "@esbuild/win32-ia32@0.21.5": + optional: true - /picomatch@2.3.1: - resolution: - { - integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==, - } - engines: { node: ">=8.6" } - dev: true + "@esbuild/win32-x64@0.21.5": + optional: true - /pkg-dir@4.2.0: - resolution: - { - integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==, - } - engines: { node: ">=8" } + "@highlightjs/vue-plugin@2.1.0(highlight.js@11.9.0)(vue@3.4.29(typescript@5.5.2))": dependencies: - find-up: 4.1.0 - dev: true + highlight.js: 11.9.0 + vue: 3.4.29(typescript@5.5.2) - /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 + "@jridgewell/sourcemap-codec@1.4.15": {} - /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 + "@mdi/js@7.4.47": {} - /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 + "@nodelib/fs.scandir@2.1.5": dependencies: - postcss: 8.4.38 - postcss-selector-parser: 6.0.16 - dev: true + "@nodelib/fs.stat": 2.0.5 + run-parallel: 1.2.0 - /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 + "@nodelib/fs.stat@2.0.5": {} - /postcss-selector-parser@6.0.16: - resolution: - { - integrity: sha512-A0RVJrX+IUkVZbW3ClroRWurercFhieevHB38sr2+l9eUClMqome3LmEmnhlNy+5Mr2EYN6B2Kaw9wYdd+VHiw==, - } - engines: { node: ">=4" } + "@nodelib/fs.walk@1.2.8": dependencies: - cssesc: 3.0.0 - util-deprecate: 1.0.2 - dev: true + "@nodelib/fs.scandir": 2.1.5 + fastq: 1.17.1 - /postcss-value-parser@4.2.0: - resolution: - { - integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==, - } - dev: true + "@rollup/rollup-android-arm-eabi@4.18.0": + optional: 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 + "@rollup/rollup-android-arm64@4.18.0": + optional: true - /prettier@3.2.5: - resolution: - { - integrity: sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==, - } - engines: { node: ">=14" } - hasBin: true - dev: true + "@rollup/rollup-darwin-arm64@4.18.0": + optional: true - /pretty-error@4.0.0: - resolution: - { - integrity: sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==, - } - dependencies: - lodash: 4.17.21 - renderkid: 3.0.0 - dev: true + "@rollup/rollup-darwin-x64@4.18.0": + optional: true - /process-nextick-args@2.0.1: - resolution: - { - integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==, - } - dev: true + "@rollup/rollup-linux-arm-gnueabihf@4.18.0": + optional: 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 + "@rollup/rollup-linux-arm-musleabihf@4.18.0": + optional: true - /psl@1.9.0: - resolution: - { - integrity: sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==, - } - dev: false + "@rollup/rollup-linux-arm64-gnu@4.18.0": + optional: true - /punycode@2.3.1: - resolution: - { - integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==, - } - engines: { node: ">=6" } + "@rollup/rollup-linux-arm64-musl@4.18.0": + optional: true - /qs@6.11.0: - resolution: - { - integrity: sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==, - } - engines: { node: ">=0.6" } - dependencies: - side-channel: 1.0.6 - dev: true + "@rollup/rollup-linux-powerpc64le-gnu@4.18.0": + optional: true - /querystringify@2.2.0: - resolution: - { - integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==, - } - dev: false + "@rollup/rollup-linux-riscv64-gnu@4.18.0": + optional: true - /randombytes@2.1.0: - resolution: - { - integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==, - } - dependencies: - safe-buffer: 5.2.1 - dev: true + "@rollup/rollup-linux-s390x-gnu@4.18.0": + optional: true - /range-parser@1.2.1: - resolution: - { - integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==, - } - engines: { node: ">= 0.6" } - dev: true + "@rollup/rollup-linux-x64-gnu@4.18.0": + optional: 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 + "@rollup/rollup-linux-x64-musl@4.18.0": + optional: 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 + "@rollup/rollup-win32-arm64-msvc@4.18.0": + optional: 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 + "@rollup/rollup-win32-ia32-msvc@4.18.0": + optional: true - /readdirp@3.6.0: - resolution: - { - integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==, - } - engines: { node: ">=8.10.0" } - dependencies: - picomatch: 2.3.1 - dev: true + "@rollup/rollup-win32-x64-msvc@4.18.0": + optional: true - /rechoir@0.7.1: - resolution: - { - integrity: sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg==, - } - engines: { node: ">= 0.10" } - dependencies: - resolve: 1.22.8 - dev: true + "@types/estree@1.0.5": {} - /relateurl@0.2.7: - resolution: - { - integrity: sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==, - } - engines: { node: ">= 0.10" } - dev: true + "@types/file-saver@2.0.7": {} - /renderkid@3.0.0: - resolution: - { - integrity: sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==, - } + "@vitejs/plugin-vue@5.0.5(vite@5.3.1(sass@1.77.6))(vue@3.4.29(typescript@5.5.2))": 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 - - /require-from-string@2.0.2: - resolution: - { - integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==, - } - engines: { node: ">=0.10.0" } - dev: true - - /requires-port@1.0.0: - resolution: - { - integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==, - } + vite: 5.3.1(sass@1.77.6) + vue: 3.4.29(typescript@5.5.2) - /resolve-cwd@3.0.0: - resolution: - { - integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==, - } - engines: { node: ">=8" } + "@volar/language-core@2.3.0": dependencies: - resolve-from: 5.0.0 - dev: true - - /resolve-from@5.0.0: - resolution: - { - integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==, - } - engines: { node: ">=8" } - dev: true + "@volar/source-map": 2.3.0 - /resolve@1.22.8: - resolution: - { - integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==, - } - hasBin: true + "@volar/source-map@2.3.0": dependencies: - is-core-module: 2.13.1 - path-parse: 1.0.7 - supports-preserve-symlinks-flag: 1.0.0 - dev: true - - /retry@0.13.1: - resolution: - { - integrity: sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==, - } - engines: { node: ">= 4" } - dev: true + muggle-string: 0.4.1 - /rimraf@3.0.2: - resolution: - { - integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==, - } - hasBin: true + "@volar/typescript@2.3.0": dependencies: - glob: 7.2.3 - dev: true + "@volar/language-core": 2.3.0 + path-browserify: 1.0.1 + vscode-uri: 3.0.8 - /rrweb-cssom@0.6.0: - resolution: - { - integrity: sha512-APM0Gt1KoXBz0iIkkdB/kfvGOwC4UuJFeG/c+yV7wSc7q96cG/kJ0HiYCnzivD9SB53cLV1MlHFNfOuPaadYSw==, - } - dev: false + "@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 - /safe-buffer@5.1.2: - resolution: - { - integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==, - } - dev: true + "@vue/compiler-dom@3.4.29": + dependencies: + "@vue/compiler-core": 3.4.29 + "@vue/shared": 3.4.29 - /safe-buffer@5.2.1: - resolution: - { - integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==, - } - dev: true + "@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 - /safer-buffer@2.1.2: - resolution: - { - integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==, - } + "@vue/compiler-ssr@3.4.29": + dependencies: + "@vue/compiler-dom": 3.4.29 + "@vue/shared": 3.4.29 - /saxes@6.0.0: - resolution: - { - integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==, - } - engines: { node: ">=v12.22.7" } + "@vue/language-core@2.0.21(typescript@5.5.2)": dependencies: - xmlchars: 2.2.0 - dev: false + "@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 - /schema-utils@3.3.0: - resolution: - { - integrity: sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==, - } - engines: { node: ">= 10.13.0" } + "@vue/reactivity@3.4.29": dependencies: - "@types/json-schema": 7.0.15 - ajv: 6.12.6 - ajv-keywords: 3.5.2(ajv@6.12.6) - dev: true + "@vue/shared": 3.4.29 - /schema-utils@4.2.0: - resolution: - { - integrity: sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==, - } - engines: { node: ">= 12.13.0" } + "@vue/runtime-core@3.4.29": 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 + "@vue/reactivity": 3.4.29 + "@vue/shared": 3.4.29 - /select-hose@2.0.0: - resolution: - { - integrity: sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==, - } - dev: true + "@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 - /selfsigned@2.4.1: - resolution: - { - integrity: sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==, - } - engines: { node: ">=10" } + "@vue/server-renderer@3.4.29(vue@3.4.29(typescript@5.5.2))": dependencies: - "@types/node-forge": 1.3.11 - node-forge: 1.3.1 - dev: true + "@vue/compiler-ssr": 3.4.29 + "@vue/shared": 3.4.29 + vue: 3.4.29(typescript@5.5.2) - /semver@7.6.0: - resolution: - { - integrity: sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==, - } - engines: { node: ">=10" } - hasBin: true + "@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: - lru-cache: 6.0.0 - dev: true + 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)) - /send@0.18.0: - resolution: - { - integrity: sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==, - } - engines: { node: ">= 0.8.0" } + agent-base@7.1.1: 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 + debug: 4.3.5 transitivePeerDependencies: - supports-color - dev: true - /serialize-javascript@6.0.2: - resolution: - { - integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==, - } + anymatch@3.1.3: dependencies: - randombytes: 2.1.0 - dev: true + normalize-path: 3.0.0 + picomatch: 2.3.1 - /serve-index@1.9.1: - resolution: - { - integrity: sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==, - } - engines: { node: ">= 0.8.0" } + asynckit@0.4.0: {} + + balanced-match@1.0.2: {} + + binary-extensions@2.3.0: {} + + blockly@11.1.1: 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 + jsdom: 23.0.0 transitivePeerDependencies: + - bufferutil + - canvas - supports-color - dev: true + - utf-8-validate - /serve-static@1.15.0: - resolution: - { - integrity: sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==, - } - engines: { node: ">= 0.8.0" } + brace-expansion@2.0.1: dependencies: - encodeurl: 1.0.2 - escape-html: 1.0.3 - parseurl: 1.3.3 - send: 0.18.0 - transitivePeerDependencies: - - supports-color - dev: true + balanced-match: 1.0.2 - /set-function-length@1.2.2: - resolution: - { - integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==, - } - engines: { node: ">= 0.4" } + braces@3.0.3: 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 + fill-range: 7.1.1 - /setprototypeof@1.1.0: - resolution: - { - integrity: sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==, - } - dev: true + 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 - /setprototypeof@1.2.0: - resolution: - { - integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==, - } - dev: true + combined-stream@1.0.8: + dependencies: + delayed-stream: 1.0.0 - /shallow-clone@3.0.1: - resolution: - { - integrity: sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==, - } - engines: { node: ">=8" } + computeds@0.0.1: {} + + core-util-is@1.0.3: {} + + cssstyle@3.0.0: dependencies: - kind-of: 6.0.3 - dev: true + rrweb-cssom: 0.6.0 - /shebang-command@2.0.0: - resolution: - { - integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==, - } - engines: { node: ">=8" } + csstype@3.1.3: {} + + data-urls@5.0.0: dependencies: - shebang-regex: 3.0.0 - dev: true + whatwg-mimetype: 4.0.0 + whatwg-url: 14.0.0 - /shebang-regex@3.0.0: - resolution: - { - integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==, - } - engines: { node: ">=8" } - dev: true + de-indent@1.0.2: {} - /shell-quote@1.8.1: - resolution: - { - integrity: sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==, - } - dev: true + debug@4.3.5: + dependencies: + ms: 2.1.2 - /side-channel@1.0.6: - resolution: - { - integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==, - } - engines: { node: ">= 0.4" } + 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: - call-bind: 1.0.7 - es-errors: 1.3.0 - get-intrinsic: 1.2.4 - object-inspect: 1.13.1 - dev: true + reusify: 1.0.4 - /signal-exit@3.0.7: - resolution: - { - integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==, - } - dev: true + file-saver@2.0.5: {} - /sockjs@0.3.24: - resolution: - { - integrity: sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==, - } + fill-range@7.1.1: dependencies: - faye-websocket: 0.11.4 - uuid: 8.3.2 - websocket-driver: 0.7.4 - dev: true + to-regex-range: 5.0.1 - /source-map-js@1.2.0: - resolution: - { - integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==, - } - engines: { node: ">=0.10.0" } - dev: true + form-data@4.0.0: + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + mime-types: 2.1.35 - /source-map-loader@4.0.2(webpack@5.91.0): - resolution: - { - integrity: sha512-oYwAqCuL0OZhBoSgmdrLa7mv9MjommVMiQIWgcztf+eS4+8BfcUee6nenFnDhKOhzAVnk5gpZdfnz1iiBv+5sg==, - } - engines: { node: ">= 14.15.0" } - peerDependencies: - webpack: ^5.72.1 + fs-extra@11.2.0: dependencies: - iconv-lite: 0.6.3 - source-map-js: 1.2.0 - webpack: 5.91.0(webpack-cli@4.10.0) - dev: true + graceful-fs: 4.2.11 + jsonfile: 6.1.0 + universalify: 2.0.1 - /source-map-support@0.5.21: - resolution: - { - integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==, - } + fsevents@2.3.3: + optional: true + + glob-parent@5.1.2: dependencies: - buffer-from: 1.1.2 - source-map: 0.6.1 - dev: true + is-glob: 4.0.3 - /source-map@0.6.1: - resolution: - { - integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==, - } - engines: { node: ">=0.10.0" } - dev: true + graceful-fs@4.2.11: {} - /source-map@0.7.4: - resolution: - { - integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==, - } - engines: { node: ">= 8" } - dev: true + he@1.2.0: {} - /spdy-transport@3.0.0: - resolution: - { - integrity: sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==, - } + highlight.js@11.9.0: {} + + html-encoding-sniffer@4.0.0: + dependencies: + whatwg-encoding: 3.1.1 + + http-proxy-agent@7.0.2: 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 + agent-base: 7.1.1 + debug: 4.3.5 transitivePeerDependencies: - supports-color - dev: true - /spdy@4.0.2: - resolution: - { - integrity: sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==, - } - engines: { node: ">=6.0.0" } + https-proxy-agent@7.0.4: 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 + agent-base: 7.1.1 + debug: 4.3.5 transitivePeerDependencies: - supports-color - dev: true - /statuses@1.5.0: - resolution: - { - integrity: sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==, - } - engines: { node: ">= 0.6" } - dev: true + iconv-lite@0.6.3: + dependencies: + safer-buffer: 2.1.2 - /statuses@2.0.1: - resolution: - { - integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==, - } - engines: { node: ">= 0.8" } - dev: true + immediate@3.0.6: {} - /string_decoder@1.1.1: - resolution: - { - integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==, - } + immutable@4.3.6: {} + + inherits@2.0.4: {} + + is-binary-path@2.1.0: dependencies: - safe-buffer: 5.1.2 - dev: true + binary-extensions: 2.3.0 - /string_decoder@1.3.0: - resolution: - { - integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==, - } + is-extglob@2.1.1: {} + + is-glob@4.0.3: dependencies: - safe-buffer: 5.2.1 - dev: true + is-extglob: 2.1.1 - /strip-ansi@6.0.1: - resolution: - { - integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==, - } - engines: { node: ">=8" } + is-number@7.0.0: {} + + is-potential-custom-element-name@1.0.1: {} + + isarray@1.0.0: {} + + jsdom@23.0.0: dependencies: - ansi-regex: 5.0.1 - dev: true + 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 - /strip-final-newline@2.0.0: - resolution: - { - integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==, - } - engines: { node: ">=6" } - dev: true + jsonfile@6.1.0: + dependencies: + universalify: 2.0.1 + optionalDependencies: + graceful-fs: 4.2.11 - /style-loader@3.3.4(webpack@5.91.0): - resolution: - { - integrity: sha512-0WqXzrsMTyb8yjZJHDqwmnwRJvhALK9LfRtRc6B4UTWe8AijYLZYZ9thuJTZc2VfQWINADW/j+LiJnfy2RoC1w==, - } - engines: { node: ">= 12.13.0" } - peerDependencies: - webpack: ^5.0.0 + jszip@3.10.1: dependencies: - webpack: 5.91.0(webpack-cli@4.10.0) - dev: true + lie: 3.3.0 + pako: 1.0.11 + readable-stream: 2.3.8 + setimmediate: 1.0.5 - /supports-color@7.2.0: - resolution: - { - integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==, - } - engines: { node: ">=8" } + lie@3.3.0: dependencies: - has-flag: 4.0.0 - dev: true + immediate: 3.0.6 - /supports-color@8.1.1: - resolution: - { - integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==, - } - engines: { node: ">=10" } + magic-string@0.30.10: dependencies: - has-flag: 4.0.0 - dev: true + "@jridgewell/sourcemap-codec": 1.4.15 - /supports-preserve-symlinks-flag@1.0.0: - resolution: - { - integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==, - } - engines: { node: ">= 0.4" } - dev: true + merge2@1.4.1: {} - /symbol-tree@3.2.4: - resolution: - { - integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==, - } - dev: false + micromatch@4.0.7: + dependencies: + braces: 3.0.3 + picomatch: 2.3.1 - /tapable@2.2.1: - resolution: - { - integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==, - } - engines: { node: ">=6" } - dev: true + mime-db@1.52.0: {} - /terser-webpack-plugin@5.3.10(webpack@5.91.0): - resolution: - { - integrity: sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==, - } - 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 + mime-types@2.1.35: 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 + mime-db: 1.52.0 - /terser@5.30.3: - resolution: - { - integrity: sha512-STdUgOUx8rLbMGO9IOwHLpCqolkDITFFQSMYYwKE1N2lY6MVSaeoi10z/EhWxRc6ybqoVmKSkhKYH/XUpl7vSA==, - } - engines: { node: ">=10" } - hasBin: true + minimatch@9.0.4: dependencies: - "@jridgewell/source-map": 0.3.6 - acorn: 8.11.3 - commander: 2.20.3 - source-map-support: 0.5.21 - dev: true + 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: {} - /thunky@1.1.0: - resolution: - { - integrity: sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==, - } - dev: true + pako@1.0.11: {} - /to-regex-range@5.0.1: - resolution: - { - integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==, - } - engines: { node: ">=8.0" } + parse5@7.1.2: dependencies: - is-number: 7.0.0 - dev: true + entities: 4.5.0 - /toidentifier@1.0.1: - resolution: - { - integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==, - } - engines: { node: ">=0.6" } - dev: true + path-browserify@1.0.1: {} - /tough-cookie@4.1.3: - resolution: - { - integrity: sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==, - } - engines: { node: ">=6" } + picocolors@1.0.1: {} + + picomatch@2.3.1: {} + + postcss@8.4.38: dependencies: - psl: 1.9.0 - punycode: 2.3.1 - universalify: 0.2.0 - url-parse: 1.5.10 - dev: false + nanoid: 3.3.7 + picocolors: 1.0.1 + source-map-js: 1.2.0 - /tr46@4.1.1: - resolution: - { - integrity: sha512-2lv/66T7e5yNyhAAC4NaKe5nVavzuGJQVVtRYLyQ2OI8tsJ61PMLlelehb0wi2Hx6+hT/OJUWZcw8MjlSRnxvw==, - } - engines: { node: ">=14" } + prettier@3.3.2: {} + + process-nextick-args@2.0.1: {} + + psl@1.9.0: {} + + punycode@2.3.1: {} + + querystringify@2.2.0: {} + + queue-microtask@1.2.3: {} + + readable-stream@2.3.8: dependencies: - punycode: 2.3.1 - dev: false + 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 - /ts-loader@9.5.1(typescript@5.4.4)(webpack@5.91.0): - resolution: - { - integrity: sha512-rNH3sK9kGZcH9dYzC7CewQm4NtxJTjSEVRJ2DyBZR7f8/wcta+iV44UPCXc5+nzDzivKtlzV6c9P4e+oFhDLYg==, - } - engines: { node: ">=12.0.0" } - peerDependencies: - typescript: "*" - webpack: ^5.0.0 + readdirp@3.6.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) - dev: true + picomatch: 2.3.1 - /tslib@2.6.2: - resolution: - { - integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==, - } - dev: true + requires-port@1.0.0: {} - /type-is@1.6.18: - resolution: - { - integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==, - } - engines: { node: ">= 0.6" } + reusify@1.0.4: {} + + rollup@4.18.0: dependencies: - media-typer: 0.3.0 - mime-types: 2.1.35 - dev: true + "@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 - /typescript@5.4.4: - resolution: - { - integrity: sha512-dGE2Vv8cpVvw28v8HCPqyb08EzbBURxDpuhJvTrusShUfGnhHBafDsLdS1EhhxyL6BJQE+2cT3dDPAv+MQ6oLw==, - } - engines: { node: ">=14.17" } - hasBin: true - dev: true + rrweb-cssom@0.6.0: {} - /undici-types@5.26.5: - resolution: - { - integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==, - } - dev: true + run-parallel@1.2.0: + dependencies: + queue-microtask: 1.2.3 - /universalify@0.2.0: - resolution: - { - integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==, - } - engines: { node: ">= 4.0.0" } - dev: false + safe-buffer@5.1.2: {} - /unpipe@1.0.0: - resolution: - { - integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==, - } - engines: { node: ">= 0.8" } - dev: true + safer-buffer@2.1.2: {} - /update-browserslist-db@1.0.13(browserslist@4.23.0): - resolution: - { - integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==, - } - hasBin: true - peerDependencies: - browserslist: ">= 4.21.0" + sass@1.77.6: dependencies: - browserslist: 4.23.0 - escalade: 3.1.2 - picocolors: 1.0.0 - dev: true + chokidar: 3.6.0 + immutable: 4.3.6 + source-map-js: 1.2.0 - /uri-js@4.4.1: - resolution: - { - integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==, - } + saxes@6.0.0: dependencies: - punycode: 2.3.1 - dev: true + xmlchars: 2.2.0 - /url-parse@1.5.10: - resolution: - { - integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==, - } - dependencies: - querystringify: 2.2.0 - requires-port: 1.0.0 - dev: false + semver@7.6.2: {} - /util-deprecate@1.0.2: - resolution: - { - integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==, - } - dev: true + setimmediate@1.0.5: {} - /utila@0.4.0: - resolution: - { - integrity: sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==, - } - dev: true + source-map-js@1.2.0: {} - /utils-merge@1.0.1: - resolution: - { - integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==, - } - engines: { node: ">= 0.4.0" } - dev: true + string_decoder@1.1.1: + dependencies: + safe-buffer: 5.1.2 - /uuid@8.3.2: - resolution: - { - integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==, - } - hasBin: true - dev: true + symbol-tree@3.2.4: {} - /vary@1.1.2: - resolution: - { - integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==, - } - engines: { node: ">= 0.8" } - dev: true + to-fast-properties@2.0.0: {} - /w3c-xmlserializer@4.0.0: - resolution: - { - integrity: sha512-d+BFHzbiCx6zGfz0HyQ6Rg69w9k19nviJspaj4yNscGjrHu94sVP+aRm75yEbCh+r2/yR+7q6hux9LVtbuTGBw==, - } - engines: { node: ">=14" } + to-regex-range@5.0.1: dependencies: - xml-name-validator: 4.0.0 - dev: false + is-number: 7.0.0 - /watchpack@2.4.1: - resolution: - { - integrity: sha512-8wrBCMtVhqcXP2Sup1ctSkga6uc2Bx0IIvKyT7yTFier5AXHooSI+QyQQAtTb7+E0IUCCKyTFmXqdqgum2XWGg==, - } - engines: { node: ">=10.13.0" } + tough-cookie@4.1.4: dependencies: - glob-to-regexp: 0.4.1 - graceful-fs: 4.2.11 - dev: true + psl: 1.9.0 + punycode: 2.3.1 + universalify: 0.2.0 + url-parse: 1.5.10 - /wbuf@1.7.3: - resolution: - { - integrity: sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==, - } + tr46@5.0.0: dependencies: - minimalistic-assert: 1.0.1 - dev: true + punycode: 2.3.1 - /webidl-conversions@7.0.0: - resolution: - { - integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==, - } - engines: { node: ">=12" } - dev: false + typescript@5.5.2: {} - /webpack-cli@4.10.0(webpack-dev-server@4.15.2)(webpack@5.91.0): - resolution: - { - integrity: sha512-NLhDfH/h4O6UOy+0LSso42xvYypClINuMNBVVzX4vX98TmTaTUxwRbXdhucbFMd2qLaCTcLq/PdYrvi8onw90w==, - } - engines: { node: ">=10.13.0" } - hasBin: true - peerDependencies: - "@webpack-cli/generators": "*" - "@webpack-cli/migrate": "*" - webpack: 4.x.x || 5.x.x - webpack-bundle-analyzer: "*" - webpack-dev-server: "*" - peerDependenciesMeta: - "@webpack-cli/generators": - optional: true - "@webpack-cli/migrate": - optional: true - webpack-bundle-analyzer: - optional: true - webpack-dev-server: - 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 - - /webpack-dev-middleware@5.3.4(webpack@5.91.0): - resolution: - { - integrity: sha512-BVdTqhhs+0IfoeAf7EoH5WE+exCmqGerHfDM0IL096Px60Tq2Mn9MAbnaGUe6HiMa41KMCYF19gyzZmBcq/o4Q==, - } - engines: { node: ">= 12.13.0" } - peerDependencies: - webpack: ^4.0.0 || ^5.0.0 + universalify@0.2.0: {} + + universalify@2.0.1: {} + + upath@2.0.1: {} + + url-parse@1.5.10: 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) - dev: true + querystringify: 2.2.0 + requires-port: 1.0.0 - /webpack-dev-server@4.15.2(webpack-cli@4.10.0)(webpack@5.91.0): - resolution: - { - integrity: sha512-0XavAZbNJ5sDrCbkpWL8mia0o5WPOd2YGtxrEiZkBK9FjLppIUK2TgxK6qGD2P3hUXTJNNPVibrerKcx5WkR1g==, - } - 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 + util-deprecate@1.0.2: {} + + vite-plugin-static-copy@1.0.5(vite@5.3.1(sass@1.77.6)): 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 + 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: - - bufferutil - - debug - supports-color - - utf-8-validate - dev: true - /webpack-merge@5.10.0: - resolution: - { - integrity: sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==, - } - engines: { node: ">=10.0.0" } + vite@5.3.1(sass@1.77.6): dependencies: - clone-deep: 4.0.1 - flat: 5.0.2 - wildcard: 2.0.1 - dev: true + esbuild: 0.21.5 + postcss: 8.4.38 + rollup: 4.18.0 + optionalDependencies: + fsevents: 2.3.3 + sass: 1.77.6 - /webpack-sources@3.2.3: - resolution: - { - integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==, - } - engines: { node: ">=10.13.0" } - dev: true + vscode-uri@3.0.8: {} - /webpack@5.91.0(webpack-cli@4.10.0): - resolution: - { - integrity: sha512-rzVwlLeBWHJbmgTC/8TvAcu5vpJNII+MelQpylD4jNERPwpBJOE2lEcko1zJX3QJeLjTTAnQxn/OJ8bjDzVQaw==, - } - engines: { node: ">=10.13.0" } - hasBin: true - peerDependencies: - webpack-cli: "*" - peerDependenciesMeta: - webpack-cli: - optional: true + vue-template-compiler@2.7.16: 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 + de-indent: 1.0.2 + he: 1.2.0 - /websocket-driver@0.7.4: - resolution: - { - integrity: sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==, - } - engines: { node: ">=0.8.0" } + vue-tsc@2.0.21(typescript@5.5.2): dependencies: - http-parser-js: 0.5.8 - safe-buffer: 5.2.1 - websocket-extensions: 0.1.4 - dev: true - - /websocket-extensions@0.1.4: - resolution: - { - integrity: sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==, - } - engines: { node: ">=0.8.0" } - dev: true + "@volar/typescript": 2.3.0 + "@vue/language-core": 2.0.21(typescript@5.5.2) + semver: 7.6.2 + typescript: 5.5.2 - /whatwg-encoding@2.0.0: - resolution: - { - integrity: sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==, - } - engines: { node: ">=12" } + vue@3.4.29(typescript@5.5.2): dependencies: - iconv-lite: 0.6.3 - dev: false - - /whatwg-mimetype@3.0.0: - resolution: - { - integrity: sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==, - } - engines: { node: ">=12" } - dev: false + "@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 - /whatwg-url@12.0.1: - resolution: - { - integrity: sha512-Ed/LrqB8EPlGxjS+TrsXcpUond1mhccS3pchLhzSgPCnTimUCKj3IZE75pAs5m6heB2U2TMerKFUXheyHY+VDQ==, - } - engines: { node: ">=14" } + vuetify@3.6.10(typescript@5.5.2)(vite-plugin-vuetify@2.0.3)(vue@3.4.29(typescript@5.5.2)): dependencies: - tr46: 4.1.1 - webidl-conversions: 7.0.0 - dev: false + 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) - /which@2.0.2: - resolution: - { - integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==, - } - engines: { node: ">= 8" } - hasBin: true + w3c-xmlserializer@5.0.0: dependencies: - isexe: 2.0.0 - dev: true + xml-name-validator: 5.0.0 - /wildcard@2.0.1: - resolution: - { - integrity: sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==, - } - dev: true + webidl-conversions@7.0.0: {} - /wrappy@1.0.2: - resolution: - { - integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==, - } - dev: true + whatwg-encoding@3.1.1: + dependencies: + iconv-lite: 0.6.3 - /ws@8.16.0: - resolution: - { - integrity: sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==, - } - engines: { node: ">=10.0.0" } - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: ">=5.0.2" - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true + whatwg-mimetype@4.0.0: {} - /xml-name-validator@4.0.0: - resolution: - { - integrity: sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==, - } - engines: { node: ">=12" } - dev: false + whatwg-url@14.0.0: + dependencies: + tr46: 5.0.0 + webidl-conversions: 7.0.0 - /xmlchars@2.2.0: - resolution: - { - integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==, - } - dev: false + ws@8.17.1: {} - /yallist@4.0.0: - resolution: - { - integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==, - } - dev: true + xml-name-validator@5.0.0: {} + + xmlchars@2.2.0: {}