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 @@
+
+
+
+
+
+
+
+
+
+ {{ outputsStore.snackbarMsg }}
+
+
+
+
+ 暂存
+ 暂存工作区
+
+
+
+
+ 恢复
+
+ 恢复保存的工作区
+
+
+
+
+
+ 导出项目
+
+ 导出 NoneBot 项目
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
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 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 导出 NoneBot 项目
+
+
+
+
+
+
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 @@
+
+
+
+ 使用方法
+
+
+ 点击左侧的工具箱标签,在对应工具箱中拖出块,在工作区中进行拼接。
+
+
+
+
+ 点击此按钮加载默认示例
+
+
+
+
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod
+ tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim
+ veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea
+ commodo consequat. Duis aute irure dolor in reprehenderit in voluptate
+ velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat
+ cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id
+ est laborum.
+
+
+
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: {}