From c858cf906375eba9ecb17369b134c29839399cb1 Mon Sep 17 00:00:00 2001 From: LimeNade Date: Sat, 20 Apr 2024 15:53:15 +0200 Subject: [PATCH 01/11] feat: Dynamic inputs --- src/lib/blocks/Javascript/Loops.ts | 2 +- src/lib/blocks/Javascript/logic.ts | 11 +- src/lib/components/Workspace.svelte | 5 +- src/lib/types/DiscodesInput.ts | 9 ++ src/lib/utils/BlockGen/Blocks/Block.ts | 118 +++++++++++++++--- src/lib/utils/BlockGen/Inputs/BaseInput.ts | 13 +- src/lib/utils/BlockGen/Inputs/Dropdown.ts | 8 +- src/lib/utils/BlockGen/Inputs/Image.ts | 20 +-- src/lib/utils/BlockGen/Inputs/NumberInput.ts | 13 +- .../utils/BlockGen/Inputs/StatementInput.ts | 6 +- src/lib/utils/BlockGen/Inputs/TextInput.ts | 6 +- src/lib/utils/BlockGen/Inputs/ValueInput.ts | 8 +- 12 files changed, 164 insertions(+), 55 deletions(-) create mode 100644 src/lib/types/DiscodesInput.ts diff --git a/src/lib/blocks/Javascript/Loops.ts b/src/lib/blocks/Javascript/Loops.ts index f6982bb..1206c2b 100644 --- a/src/lib/blocks/Javascript/Loops.ts +++ b/src/lib/blocks/Javascript/Loops.ts @@ -14,7 +14,7 @@ const blocks: BlockDefinition[] = [ shape: BlockShape.Action, inline: true, colour: rgbToHex(91, 165, 91), - tooltip: "Repeat x times", + tooltip: "Repeats the code inside the given ammount of times.", helpUrl: "", code: (args) => { return `for (let i = 0; i < ${args.VALUE}; i++) {\n${args.INPUT}\n}`; diff --git a/src/lib/blocks/Javascript/logic.ts b/src/lib/blocks/Javascript/logic.ts index 0f117f7..7140b06 100644 --- a/src/lib/blocks/Javascript/logic.ts +++ b/src/lib/blocks/Javascript/logic.ts @@ -2,6 +2,8 @@ import { BlockShape, BlockType, DropdownType, WarningType } from "$lib/enums/Blo import type { BlockDefinition } from "$lib/types/BlockDefinition"; import type { CategoryDefinition } from "$lib/types/CategoryDefinition"; import Dropdown from "$lib/utils/BlockGen/Inputs/Dropdown"; +import NumberInput from "$lib/utils/BlockGen/Inputs/NumberInput"; +import TextInput from "$lib/utils/BlockGen/Inputs/TextInput"; import ValueInput from "$lib/utils/BlockGen/Inputs/ValueInput"; import Warning from "$lib/utils/BlockGen/Warnings/Warning"; import rgbToHex from "$lib/utils/helpers/rgbToHex"; @@ -33,8 +35,13 @@ const blocks: BlockDefinition[] = [ colour: rgbToHex(91, 128, 165), tooltip: "Checks if the first input and the second input validate the condition.", helpUrl: "https://www.w3schools.com/js/js_comparisons.asp", - code: (args) => { - return `${args.A} ${args.CONDITION} ${args.B}`; + code: (args, block) => { + block.addInput(new Dropdown("bob", DropdownType.Auto, {"bob": "hello", "alex":"nikola"})); + block.addInput(new ValueInput("chicken", BlockType.Any)); + block.addInput(new NumberInput("numberrr", 50, {max: 100, min: 50, precision: 10})); + block.addInput(new TextInput("textttt", "I am a text input!")); + console.log("Args (code prop parameter): ",args); + return `${args.textttt}`; } }, { diff --git a/src/lib/components/Workspace.svelte b/src/lib/components/Workspace.svelte index 9dd1a44..4d1f073 100644 --- a/src/lib/components/Workspace.svelte +++ b/src/lib/components/Workspace.svelte @@ -24,7 +24,6 @@ await loadBlocks(); workspace = Blockly.inject("blocklyDiv", { ...options, toolbox: toolbox }); - // Only console log the code and warnings when debug mode is enabled. const supportedEvents = new Set([ Blockly.Events.BLOCK_CHANGE, Blockly.Events.BLOCK_CREATE, @@ -33,9 +32,13 @@ ]); function updateCode(event: Abstract) { + workspace.getAllBlocks(true).forEach((block) => { + if (block.type === "is_equal") console.log(block) + }) if (workspace.isDragging()) return; // Don't update while changes are happening. if (!supportedEvents.has(event.type)) return; + // Needed to remove the deleted block imports from the imports list. if (event.type === Blockly.Events.BLOCK_DELETE) wipeImports(); if (LOG_CODE) { diff --git a/src/lib/types/DiscodesInput.ts b/src/lib/types/DiscodesInput.ts new file mode 100644 index 0000000..d64bad8 --- /dev/null +++ b/src/lib/types/DiscodesInput.ts @@ -0,0 +1,9 @@ +import type BaseInput from "$lib/utils/BlockGen/Inputs/BaseInput"; +import type { DropdownIDef } from "$lib/utils/BlockGen/Inputs/Dropdown"; +import type { ImageIDef } from "$lib/utils/BlockGen/Inputs/Image"; +import type { NumberIDef } from "$lib/utils/BlockGen/Inputs/NumberInput"; +import type { StatementIDef } from "$lib/utils/BlockGen/Inputs/StatementInput"; +import type { TextIDef } from "$lib/utils/BlockGen/Inputs/TextInput"; +import type { ValueIDef } from "$lib/utils/BlockGen/Inputs/ValueInput"; + +export type DiscodesInput = BaseInput; diff --git a/src/lib/utils/BlockGen/Blocks/Block.ts b/src/lib/utils/BlockGen/Blocks/Block.ts index cfa309f..c2a581d 100644 --- a/src/lib/utils/BlockGen/Blocks/Block.ts +++ b/src/lib/utils/BlockGen/Blocks/Block.ts @@ -1,13 +1,15 @@ // Blockly import Blockly from "blockly/core"; -import "@blockly/field-grid-dropdown"; +import * as gridDropdown from "@blockly/field-grid-dropdown"; import pkg from "blockly/javascript"; const { javascriptGenerator, Order } = pkg; // Types import type { Argument, BlockDefinition } from "$lib/types/BlockDefinition"; -import { BlockShape, BlockType, WarningType } from "$lib/enums/BlockTypes"; +import { BlockShape, BlockType, DropdownType, WarningType } from "$lib/enums/BlockTypes"; import type { Abstract } from "blockly/core/events/events_abstract"; +import type { DiscodesInput } from "$lib/types/DiscodesInput"; +import type Warning from "../Warnings/Warning"; // Warnings import { addWarning, removeWarning, warnings as warningsObj } from "../Warnings/WarningsList"; @@ -17,11 +19,22 @@ import { EventsToTriggerWarnings } from "$lib/constants/warnings"; import { dev } from "$app/environment"; import salt from "$lib/utils/helpers/salt"; import { addImport } from "$lib/utils/BlockGen/Blocks/importsList"; -import type Warning from "../Warnings/Warning"; + +interface BlocklyBlockDefinition { + type: string + colour: string + tooltip: string + helpUrl: string + inputsInline: boolean + args0: Record[] + message0: string + mutator:string | undefined +}; export default class Block { private _blockDefinition: BlockDefinition; private _block!: Blockly.Block; + private _blocklyDefinition!: BlocklyBlockDefinition; constructor(definition: BlockDefinition) { this._blockDefinition = definition; @@ -35,18 +48,77 @@ export default class Block { this._block.setColour(colour); } - addWarning(warning: Warning): void { + public addWarning(warning: Warning): void { if (this._blockDefinition.label) throw new Error("Cannot add a warning to a label"); if (warningsObj[this._block.id] && warningsObj[this._block.id][warning.data.fieldName]) return; this._blockDefinition.warnings = this._blockDefinition.warnings ? [...this._blockDefinition.warnings, warning] : [warning]; } - removeWarning(fieldName: string): void { + public removeWarning(fieldName: string): void { if (this._blockDefinition.label) throw new Error("Cannot remove a warning form a label"); if ((!warningsObj[this._block.id] || !warningsObj[this._block.id][fieldName]) && this._blockDefinition.warnings !== undefined) return; this._blockDefinition.warnings = this._blockDefinition.warnings?.filter(warning => warning.data.fieldName !== fieldName); } + public addText(text: string, fieldName: string): void { + this._block.appendDummyInput(fieldName).appendField(text); + } + + public removeText(fieldName: string): void { + this._block.removeInput(fieldName); + } + + public addInput(input: DiscodesInput): void { + const generated = input.generate(); + if (!this._block || this._block.getInput(generated.name) || this._block.isInFlyout) return; + let isDummy: boolean = true; + + switch(generated.type) { + + case DropdownType.Grid: + this._block.appendDummyInput(generated.name) + .appendField(new gridDropdown.FieldGridDropdown(generated.options as Blockly.MenuGenerator) as Blockly.Field); + break; + + case DropdownType.List: + this._block.appendDummyInput(generated.name) + .appendField(new Blockly.FieldDropdown(generated.options as Blockly.MenuGenerator) as Blockly.Field); + break; + + case "input_value": + this._block.appendValueInput(generated.name) + .setCheck(generated.check as string | string[] | undefined ? generated.check as string | string[]: null); + isDummy = false; + break; + + case "input_statement": + this._block.appendStatementInput(generated.name); + isDummy = false; + break; + + case "field_number": + this._block.appendDummyInput(generated.name) + .appendField(new Blockly.FieldNumber(generated.value, generated.min, generated.max, generated.precision)); + break; + + case "field_image": + this._block.appendDummyInput(generated.name) + .appendField(new Blockly.FieldImage(generated.src, generated.width, generated.height, generated.alt)); + break; + + case "field_input": + this._block.appendDummyInput(generated.name) + .appendField(new Blockly.FieldTextInput(generated.text, undefined,{spellcheck: generated.spellcheck})); + break; + } + (this._blocklyDefinition.args0 as Array).push({...generated, isDummy: isDummy}); + } + + public removeInput(inputName: string): void { + if (!this._block.getInput(inputName)) return; + this._block.removeInput(inputName); + } + generate(): void { if (this._blockDefinition.label) return; @@ -61,17 +133,19 @@ export default class Block { ? this._blockDefinition.id + salt(5) : ""; - const blockDef = { + const blockDef: BlocklyBlockDefinition = { type: this._blockDefinition.id, colour: this._blockDefinition.colour, tooltip: this._blockDefinition.tooltip, helpUrl: this._blockDefinition.helpUrl, inputsInline: this._blockDefinition.inline, - args0: [] as Record[], + args0: [], message0: "", mutator: mutatorName == "" ? undefined : mutatorName }; + blockClass._blocklyDefinition = blockDef; + if (this._blockDefinition.mutator) { this._blockDefinition.mutator.registerMutator(mutatorName); } @@ -128,6 +202,7 @@ export default class Block { !this.isInFlyout && changeEvent.type !== Blockly.Events.VIEWPORT_CHANGE ) { + // "import" is a reserved name for (const import_ of importName) { addImport(import_); } @@ -186,27 +261,36 @@ export default class Block { // Generating the export code javascriptGenerator.forBlock[blockDef.type] = function(block: Blockly.Block) { - const args: Record = {}; //? Object we will pass as argument for the custom code to run properly - - for (const arg in blockDef.args0) { - const argValue = blockDef.args0[arg]; //? The argument object, contains the name, the type etc.. - const argName: string = blockDef.args0[arg].name as string; + const args: Record = {}; //? Object we will pass as argument to be used for code generation + + for (const arg of blockClass._blocklyDefinition.args0) { + if (arg.isDummy === true) { + // Since it's a dummy input we need to get the value from the fields array inside the dummy input! + //@ts-expect-error We have to access the protected value to generate it correctly. + args[arg.name] = block.getInput(arg.name)?.fieldRow[0].value_; + continue; + } - switch (argValue.type) { + switch (arg.type) { case "input_value": - args[argName] = javascriptGenerator.valueToCode( + args[arg.name] = javascriptGenerator.valueToCode( block, - argName, + arg.name, javascriptGenerator.ORDER_ATOMIC ); break; + case "input_statement": - args[argName] = javascriptGenerator.statementToCode(block, argName); + args[arg.name] = javascriptGenerator.statementToCode(block, arg.name); break; + default: - args[argName] = block.getFieldValue(argName); + args[arg.name] = block.getFieldValue(arg.name); break; } + + + } return output ? [code(args, blockClass), Order.NONE] : code(args, blockClass); }; diff --git a/src/lib/utils/BlockGen/Inputs/BaseInput.ts b/src/lib/utils/BlockGen/Inputs/BaseInput.ts index d3208c0..949963a 100644 --- a/src/lib/utils/BlockGen/Inputs/BaseInput.ts +++ b/src/lib/utils/BlockGen/Inputs/BaseInput.ts @@ -1,16 +1,11 @@ -export default class BaseInput { - //! Replace unknown by an enum with all the types of inputs! - private _method: () => unknown; +export default class BaseInput { + private _method!: () => Definition; - constructor() { - this._method = () => {}; - } - - protected setMethod(generationMethod: () => unknown) { + protected setMethod(generationMethod: () => Definition) { this._method = generationMethod; } - public generate(): unknown { + public generate(): Definition { return this._method(); } } diff --git a/src/lib/utils/BlockGen/Inputs/Dropdown.ts b/src/lib/utils/BlockGen/Inputs/Dropdown.ts index be2b4f7..6f9795d 100644 --- a/src/lib/utils/BlockGen/Inputs/Dropdown.ts +++ b/src/lib/utils/BlockGen/Inputs/Dropdown.ts @@ -2,10 +2,10 @@ import BaseInput from "./BaseInput"; import { DropdownType } from "$lib/enums/BlockTypes"; -interface DropdownJSON { +export interface DropdownIDef { name: string; type: DropdownType; - options: Array>; + options: string[][]; } /** @@ -15,7 +15,7 @@ interface DropdownJSON { * @class Dropdown * @extends {BaseInput} */ -export default class Dropdown extends BaseInput { +export default class Dropdown extends BaseInput { private readonly _name: string; private readonly _options: Array>; private _dropdownType: DropdownType; @@ -47,7 +47,7 @@ export default class Dropdown extends BaseInput { * @return {*} {DropdownJSON} * @memberof Dropdown */ - getDefinition(): DropdownJSON { + getDefinition(): DropdownIDef { if (this._dropdownType === DropdownType.Auto) { // Automatically swaps between grid and list type depending on the length of the arguments. this._dropdownType = this._options.length > 10 ? DropdownType.Grid : DropdownType.List; diff --git a/src/lib/utils/BlockGen/Inputs/Image.ts b/src/lib/utils/BlockGen/Inputs/Image.ts index 337cf1b..3f0feb7 100644 --- a/src/lib/utils/BlockGen/Inputs/Image.ts +++ b/src/lib/utils/BlockGen/Inputs/Image.ts @@ -1,6 +1,15 @@ import BaseInput from "./BaseInput"; -export default class Image extends BaseInput { +export interface ImageIDef { + name: string; + type: "field_image"; + src: string; + alt: string; + width: number; + height: number; +} + +export default class Image extends BaseInput { private readonly _src: string; private readonly _settings: { alt: string; @@ -22,14 +31,7 @@ export default class Image extends BaseInput { this._settings = settings; } - private getDefinition(): { - name: string; - type: "field_image"; - src: string; - alt: string; - width: number; - height: number; - } { + private getDefinition(): ImageIDef { return { name: this._settings.alt, type: "field_image", diff --git a/src/lib/utils/BlockGen/Inputs/NumberInput.ts b/src/lib/utils/BlockGen/Inputs/NumberInput.ts index ed4587c..5d59a00 100644 --- a/src/lib/utils/BlockGen/Inputs/NumberInput.ts +++ b/src/lib/utils/BlockGen/Inputs/NumberInput.ts @@ -1,6 +1,15 @@ import BaseInput from "./BaseInput"; -export default class NumberInput extends BaseInput { +export interface NumberIDef { + type: "field_number"; + name: string; + value: number + min? : number + max?: number + precision?: number +} + +export default class NumberInput extends BaseInput { private readonly _name: string; private readonly _value: number; private readonly _settings: { @@ -22,7 +31,7 @@ export default class NumberInput extends BaseInput { this._settings = settings || {}; } - private getDefinition(): { type: "field_number"; name: string; value: number } { + private getDefinition(): NumberIDef { return { type: "field_number", name: this._name, diff --git a/src/lib/utils/BlockGen/Inputs/StatementInput.ts b/src/lib/utils/BlockGen/Inputs/StatementInput.ts index d59c26d..0b52617 100644 --- a/src/lib/utils/BlockGen/Inputs/StatementInput.ts +++ b/src/lib/utils/BlockGen/Inputs/StatementInput.ts @@ -1,6 +1,6 @@ import BaseInput from "./BaseInput"; -interface StatementInputJSON { +export interface StatementIDef { name: string; type: "input_statement"; } @@ -12,7 +12,7 @@ interface StatementInputJSON { * @class ValueInput * @extends {BaseInput} */ -export default class StatementInput extends BaseInput { +export default class StatementInput extends BaseInput { private readonly _name: string; constructor(name: string) { @@ -28,7 +28,7 @@ export default class StatementInput extends BaseInput { * @return {*} {ValueInputJSON} * @memberof ValueInput */ - getDefinition(): StatementInputJSON { + getDefinition(): StatementIDef { return { type: "input_statement", name: this._name diff --git a/src/lib/utils/BlockGen/Inputs/TextInput.ts b/src/lib/utils/BlockGen/Inputs/TextInput.ts index b18a2e1..8583bb8 100644 --- a/src/lib/utils/BlockGen/Inputs/TextInput.ts +++ b/src/lib/utils/BlockGen/Inputs/TextInput.ts @@ -1,6 +1,6 @@ import BaseInput from "./BaseInput"; -interface TextInputObject { +export interface TextIDef { type: "field_input"; name: string; text: string; @@ -8,7 +8,7 @@ interface TextInputObject { spellcheck: false; } -export default class TextInput extends BaseInput { +export default class TextInput extends BaseInput { private readonly _name: string; private readonly _text: string; @@ -20,7 +20,7 @@ export default class TextInput extends BaseInput { this._text = defaultValue; } - private getDefinition(): TextInputObject { + private getDefinition(): TextIDef { return { type: "field_input", name: this._name, diff --git a/src/lib/utils/BlockGen/Inputs/ValueInput.ts b/src/lib/utils/BlockGen/Inputs/ValueInput.ts index 846bfc4..33a460e 100644 --- a/src/lib/utils/BlockGen/Inputs/ValueInput.ts +++ b/src/lib/utils/BlockGen/Inputs/ValueInput.ts @@ -2,7 +2,7 @@ import { BlockType } from "$lib/enums/BlockTypes"; import BaseInput from "./BaseInput"; import argFilter from "../../helpers/argFilter"; -interface ValueInputJSON { +export interface ValueIDef { name: string; type: "input_value"; check?: BlockType | BlockType[]; @@ -14,7 +14,7 @@ interface ValueInputJSON { * @class ValueInput * @extends {BaseInput} */ -export default class ValueInput extends BaseInput { +export default class ValueInput extends BaseInput { private readonly _name: string; private readonly _type: BlockType[]; @@ -32,8 +32,8 @@ export default class ValueInput extends BaseInput { * @return {*} {ValueInputJSON} * @memberof ValueInput */ - getDefinition(): ValueInputJSON { - const result: ValueInputJSON = { + getDefinition(): ValueIDef { + const result: ValueIDef = { type: "input_value", name: this._name }; From 2d835e6fe7f50bffd2214fc430eefb04a990ebda Mon Sep 17 00:00:00 2001 From: LimeNade Date: Sat, 20 Apr 2024 16:10:15 +0200 Subject: [PATCH 02/11] Fix: math category errors --- src/lib/blocks/Javascript/math.ts | 70 +++++++++++++------------- src/lib/utils/BlockGen/Blocks/Block.ts | 8 +-- 2 files changed, 36 insertions(+), 42 deletions(-) diff --git a/src/lib/blocks/Javascript/math.ts b/src/lib/blocks/Javascript/math.ts index 98d709c..35ca01c 100644 --- a/src/lib/blocks/Javascript/math.ts +++ b/src/lib/blocks/Javascript/math.ts @@ -1,12 +1,10 @@ -import { BlockShape, BlockType, WarningType, DropdownType, PlaceholderType } from "$lib/enums/BlockTypes"; +import { BlockShape, BlockType, DropdownType, PlaceholderType } from "$lib/enums/BlockTypes"; import type { BlockDefinition } from "$lib/types/BlockDefinition"; import type { CategoryDefinition } from "$lib/types/CategoryDefinition"; -import TextInput from "$lib/utils/BlockGen/Inputs/TextInput"; +import Dropdown from "$lib/utils/BlockGen/Inputs/Dropdown"; import NumberInput from "$lib/utils/BlockGen/Inputs/NumberInput"; import ValueInput from "$lib/utils/BlockGen/Inputs/ValueInput"; import Placeholder from "$lib/utils/ToolboxGen/Placeholder"; -import { Order } from "blockly/javascript"; -import Dropdown from "$lib/utils/BlockGen/Inputs/Dropdown"; const blocks: BlockDefinition[] = [ { @@ -93,21 +91,21 @@ const blocks: BlockDefinition[] = [ code: (args) => { switch (args.OPERATION) { case "negate": - return `Math.abs(${args.NUMBER}) * -1` + return `Math.abs(${args.NUMBER}) * -1`; case "inverse": - return `${args.NUMBER}) * -1` + return `${args.NUMBER}) * -1`; case "log10": - return `Math.log(${args.NUMBER}) / Math.log(10)` + return `Math.log(${args.NUMBER}) / Math.log(10)`; case "sin": case "cos": case "tan": case "asin": case "acos": case "atan": - return `(Math.(${args.OPERATION}) / Math.PI) * 180` + return `(Math.(${args.OPERATION}) / Math.PI) * 180`; default: - return `Math.${args.OPERATION}(${args.NUMBER})` + return `Math.${args.OPERATION}(${args.NUMBER})`; } } }, @@ -132,7 +130,7 @@ const blocks: BlockDefinition[] = [ tooltip: "Allows you to use constants.", helpUrl: "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number", code: (args) => { - return `${args.CONSTANT}` + return `${args.CONSTANT}`; } }, { @@ -164,21 +162,21 @@ const blocks: BlockDefinition[] = [ code: (args) => { switch (`${args.VALUE}`) { case "number": - return `typeof ${args.NUMBER} === "number" && ${args.NUMBER} % 1 === 0` + return `typeof ${args.NUMBER} === "number" && ${args.NUMBER} % 1 === 0`; case "even": - return `${args.NUMBER} % 2 === 0` + return `${args.NUMBER} % 2 === 0`; case "odd": - return `${args.NUMBER} % 2!== 0` + return `${args.NUMBER} % 2!== 0`; case "prime": - return `isPrime(${args.NUMBER})` /* function isPrime(number) {if (number < 2) {return false;};for (let i = 2; i <= Math.sqrt(number); i++) {if (number % i === 0) {return false;}}return true;} */ + return `isPrime(${args.NUMBER})`; /* function isPrime(number) {if (number < 2) {return false;};for (let i = 2; i <= Math.sqrt(number); i++) {if (number % i === 0) {return false;}}return true;} */ case "whole": - return `${args.NUMBER} % 1 === 0` + return `${args.NUMBER} % 1 === 0`; case "positive": - return `${args.NUMBER} > 0` + return `${args.NUMBER} > 0`; case "negative": - return `${args.NUMBER} < 0` + return `${args.NUMBER} < 0`; default: - return `${args.NUMBER} % ${args.VALUE} === 0` // fix when added mutator + return `${args.NUMBER} % ${args.VALUE} === 0`; // fix when added mutator } } }, @@ -212,25 +210,25 @@ const blocks: BlockDefinition[] = [ code: (args) => { switch (args.OPERATION) { case "sum": - return `${args.ARRAY}.reduce((a, b) => a + b)` + return `${args.ARRAY}.reduce((a, b) => a + b)`; case "min": - return `${args.ARRAY}.reduce((a, b) => Math.min(a, b))` + return `${args.ARRAY}.reduce((a, b) => Math.min(a, b))`; case "max": - return `${args.ARRAY}.reduce((a, b) => Math.max(a, b))` + return `${args.ARRAY}.reduce((a, b) => Math.max(a, b))`; case "average": - return `${args.ARRAY}.reduce((a, b) => a + b) / ${args.ARRAY}.length` + return `${args.ARRAY}.reduce((a, b) => a + b) / ${args.ARRAY}.length`; case "median": - return `${args.ARRAY}.sort((a, b) => a - b).length % 2? ${args.ARRAY}.sort((a, b) => a - b)[Math.floor(${args.ARRAY}.length / 2)] : ((${args.ARRAY}.sort((a, b) => a - b)[Math.floor(${args.ARRAY}.length / 2)] + ${args.ARRAY}.sort((a, b) => a - b - 1)[Math.floor(${args.ARRAY}.length / 2)]) / 2 ))` + return `${args.ARRAY}.sort((a, b) => a - b).length % 2? ${args.ARRAY}.sort((a, b) => a - b)[Math.floor(${args.ARRAY}.length / 2)] : ((${args.ARRAY}.sort((a, b) => a - b)[Math.floor(${args.ARRAY}.length / 2)] + ${args.ARRAY}.sort((a, b) => a - b - 1)[Math.floor(${args.ARRAY}.length / 2)]) / 2 ))`; case "mode": - return `${args.ARRAY}.sort((a, b) => a - b).length % 2` + return `${args.ARRAY}.sort((a, b) => a - b).length % 2`; case "range": - return `${args.ARRAY}.reduce((a, b) => Math.max(a, b) - Math.min(a, b))` + return `${args.ARRAY}.reduce((a, b) => Math.max(a, b) - Math.min(a, b))`; case "random": - return `Math.floor(Math.random() * ${args.ARRAY}.length)` + return `Math.floor(Math.random() * ${args.ARRAY}.length)`; case "standard deviation": - return `Math.sqrt(${args.ARRAY}.reduce((a, b) => Math.pow(a - b, 2)) / ${args.ARRAY}.length)` + return `Math.sqrt(${args.ARRAY}.reduce((a, b) => Math.pow(a - b, 2)) / ${args.ARRAY}.length)`; default: - return `Math.${args.OPERATION}(${args.ARRAY})` + return `Math.${args.OPERATION}(${args.ARRAY})`; } } }, @@ -252,7 +250,7 @@ const blocks: BlockDefinition[] = [ tooltip: "Gets a random integer between two numbers.", helpUrl: "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number", code: (args) => { - return `Math.floor(Math.random() * (${args.MAX} - ${args.MIN}) + ${args.MIN})` + return `Math.floor(Math.random() * (${args.MAX} - ${args.MIN}) + ${args.MIN})`; } }, { @@ -265,8 +263,8 @@ const blocks: BlockDefinition[] = [ colour: "#5b67a5", tooltip: "Gets a random fraction.", helpUrl: "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number", - code: (args) => { - return `Math.random()` + code: () => { + return "Math.random()"; } }, { @@ -285,7 +283,7 @@ const blocks: BlockDefinition[] = [ tooltip: "Converts text to a number.", helpUrl: "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number", code: (args) => { - return `parseInt(${args.TEXT})` + return `parseInt(${args.TEXT})`; } }, { @@ -308,7 +306,7 @@ const blocks: BlockDefinition[] = [ tooltip: "Constrains a number between two numbers.", helpUrl: "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number", code: (args) => { - return `Math.min(Math.max(${args.VALUE}, ${args.MIN}), ${args.MAX})` + return `Math.min(Math.max(${args.VALUE}, ${args.MIN}), ${args.MAX})`; } }, // { @@ -332,11 +330,11 @@ const blocks: BlockDefinition[] = [ // } -] +]; const category: CategoryDefinition = { name: "Math", colour: "#5b67a5" -} +}; -export default {blocks, category} \ No newline at end of file +export default {blocks, category}; diff --git a/src/lib/utils/BlockGen/Blocks/Block.ts b/src/lib/utils/BlockGen/Blocks/Block.ts index c2a581d..9e64bf7 100644 --- a/src/lib/utils/BlockGen/Blocks/Block.ts +++ b/src/lib/utils/BlockGen/Blocks/Block.ts @@ -74,7 +74,6 @@ export default class Block { let isDummy: boolean = true; switch(generated.type) { - case DropdownType.Grid: this._block.appendDummyInput(generated.name) .appendField(new gridDropdown.FieldGridDropdown(generated.options as Blockly.MenuGenerator) as Blockly.Field); @@ -264,6 +263,8 @@ export default class Block { const args: Record = {}; //? Object we will pass as argument to be used for code generation for (const arg of blockClass._blocklyDefinition.args0) { + //! Fix this asap... + //@ts-expect-error gergerg if (arg.isDummy === true) { // Since it's a dummy input we need to get the value from the fields array inside the dummy input! //@ts-expect-error We have to access the protected value to generate it correctly. @@ -288,13 +289,8 @@ export default class Block { args[arg.name] = block.getFieldValue(arg.name); break; } - - - } return output ? [code(args, blockClass), Order.NONE] : code(args, blockClass); }; } - - } From da86697f0ae9e3e6a9c344ad3d570ce2687974d9 Mon Sep 17 00:00:00 2001 From: LimeNade Date: Sat, 20 Apr 2024 20:13:03 +0200 Subject: [PATCH 03/11] Fix: Merge conflicts crumbs --- src/lib/blocks/Javascript/Loops.ts | 6 +++--- src/lib/utils/BlockGen/Blocks/Block.ts | 2 +- src/lib/utils/BlockGen/Inputs/BaseInput.ts | 2 +- src/lib/utils/BlockGen/Inputs/Dropdown.ts | 2 -- src/lib/utils/BlockGen/Inputs/Image.ts | 6 +----- src/lib/utils/BlockGen/Inputs/NumberInput.ts | 1 - src/lib/utils/BlockGen/Inputs/StatementInput.ts | 2 -- src/lib/utils/BlockGen/Inputs/TextInput.ts | 1 - src/lib/utils/BlockGen/Inputs/ValueInput.ts | 1 - 9 files changed, 6 insertions(+), 17 deletions(-) diff --git a/src/lib/blocks/Javascript/Loops.ts b/src/lib/blocks/Javascript/Loops.ts index 27ed0f0..2a7fddb 100644 --- a/src/lib/blocks/Javascript/Loops.ts +++ b/src/lib/blocks/Javascript/Loops.ts @@ -61,9 +61,9 @@ const blocks: BlockDefinition[] = [ helpUrl: "", code: (args) => { if(args.VARIABLE === "") return ""; - let variable = `let ${args.VARIABLE} =${args.START ===""? "0" : args.START}`; - let condition = `${args.VARIABLE} < ${args.END === ""? "0" : args.END}`; - let step = `${args.VARIABLE} += ${args.STEP ===""? "0" : args.STEP}}`; + const variable = `let ${args.VARIABLE} =${args.START ===""? "0" : args.START}`; + const condition = `${args.VARIABLE} < ${args.END === ""? "0" : args.END}`; + const step = `${args.VARIABLE} += ${args.STEP ===""? "0" : args.STEP}}`; if (args.VARIABLE === "") { const varName = salt(10); return `for(let vk${varName} = 0; false; vk${varName}+= 0) {}`; diff --git a/src/lib/utils/BlockGen/Blocks/Block.ts b/src/lib/utils/BlockGen/Blocks/Block.ts index 5f80426..8427212 100644 --- a/src/lib/utils/BlockGen/Blocks/Block.ts +++ b/src/lib/utils/BlockGen/Blocks/Block.ts @@ -11,7 +11,7 @@ import type { CheckBoxMutatorBlock, MutatorBlock } from "$lib/types/BlockDefinition"; -import { BlockShape, BlockType, DropdownType, WarningType } from "$lib/enums/BlockTypes"; +import { BlockShape, BlockType, DropdownType, MutatorType, WarningType } from "$lib/enums/BlockTypes"; import type { Abstract } from "blockly/core/events/events_abstract"; import type { DiscodesInput } from "$lib/types/DiscodesInput"; import type Warning from "../Warnings/Warning"; diff --git a/src/lib/utils/BlockGen/Inputs/BaseInput.ts b/src/lib/utils/BlockGen/Inputs/BaseInput.ts index c8375f3..0bcdadb 100644 --- a/src/lib/utils/BlockGen/Inputs/BaseInput.ts +++ b/src/lib/utils/BlockGen/Inputs/BaseInput.ts @@ -15,7 +15,7 @@ export default class BaseInput { /* this function currently is meant for Mutator use */ - public setField(text: string): BaseInput { + public setField(text: string): BaseInput { this._fieldText = text; return this; } diff --git a/src/lib/utils/BlockGen/Inputs/Dropdown.ts b/src/lib/utils/BlockGen/Inputs/Dropdown.ts index 506f255..f47b068 100644 --- a/src/lib/utils/BlockGen/Inputs/Dropdown.ts +++ b/src/lib/utils/BlockGen/Inputs/Dropdown.ts @@ -17,7 +17,6 @@ export interface DropdownIDef { */ export default class Dropdown extends BaseInput { - private readonly _name: string; private readonly _options: Array>; private _dropdownType: DropdownType; @@ -53,7 +52,6 @@ export default class Dropdown extends BaseInput { // Automatically swaps between grid and list type depending on the length of the arguments. this._dropdownType = this._options.length > 10 ? DropdownType.Grid : DropdownType.List; } - console.log(this._options) return { type: this._dropdownType, name: super.name, diff --git a/src/lib/utils/BlockGen/Inputs/Image.ts b/src/lib/utils/BlockGen/Inputs/Image.ts index 3f0feb7..cc5dedd 100644 --- a/src/lib/utils/BlockGen/Inputs/Image.ts +++ b/src/lib/utils/BlockGen/Inputs/Image.ts @@ -24,7 +24,7 @@ export default class Image extends BaseInput { * @memberof NumberInput */ constructor(src: string, settings: { alt: string; width: number; height: number }) { - super(); + super(settings.alt); this.setMethod(this.getDefinition); this._src = src; @@ -39,8 +39,4 @@ export default class Image extends BaseInput { ...this._settings }; } - - get name(): string { - return this._settings.alt; - } } diff --git a/src/lib/utils/BlockGen/Inputs/NumberInput.ts b/src/lib/utils/BlockGen/Inputs/NumberInput.ts index cbc326b..b9ed18b 100644 --- a/src/lib/utils/BlockGen/Inputs/NumberInput.ts +++ b/src/lib/utils/BlockGen/Inputs/NumberInput.ts @@ -11,7 +11,6 @@ export interface NumberIDef { } export default class NumberInput extends BaseInput { - private readonly _name: string; private readonly _value: number; private readonly _settings: { min?: number; diff --git a/src/lib/utils/BlockGen/Inputs/StatementInput.ts b/src/lib/utils/BlockGen/Inputs/StatementInput.ts index 21d15e2..dd26c8c 100644 --- a/src/lib/utils/BlockGen/Inputs/StatementInput.ts +++ b/src/lib/utils/BlockGen/Inputs/StatementInput.ts @@ -14,8 +14,6 @@ export interface StatementIDef { */ export default class StatementInput extends BaseInput { - private readonly _name: string; - constructor(name: string) { super(name); diff --git a/src/lib/utils/BlockGen/Inputs/TextInput.ts b/src/lib/utils/BlockGen/Inputs/TextInput.ts index c7d764e..7000423 100644 --- a/src/lib/utils/BlockGen/Inputs/TextInput.ts +++ b/src/lib/utils/BlockGen/Inputs/TextInput.ts @@ -10,7 +10,6 @@ export interface TextIDef { export default class TextInput extends BaseInput { - private readonly _name: string; private readonly _text: string; constructor(name: string, defaultValue: string) { diff --git a/src/lib/utils/BlockGen/Inputs/ValueInput.ts b/src/lib/utils/BlockGen/Inputs/ValueInput.ts index cd1a581..1962258 100644 --- a/src/lib/utils/BlockGen/Inputs/ValueInput.ts +++ b/src/lib/utils/BlockGen/Inputs/ValueInput.ts @@ -16,7 +16,6 @@ export interface ValueIDef { */ export default class ValueInput extends BaseInput { - private readonly _name: string; private readonly _type: BlockType[]; constructor(name: string, type: BlockType | BlockType[]) { From 4fdb7c2ad3fac05de3d648987e299ff33ede1aa3 Mon Sep 17 00:00:00 2001 From: LimeNade Date: Sat, 20 Apr 2024 20:17:05 +0200 Subject: [PATCH 04/11] Fix: import bug --- src/lib/blocks/Javascript/text.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/lib/blocks/Javascript/text.ts b/src/lib/blocks/Javascript/text.ts index 0e2f9a4..980a019 100644 --- a/src/lib/blocks/Javascript/text.ts +++ b/src/lib/blocks/Javascript/text.ts @@ -6,7 +6,7 @@ import ValueInput from "$lib/utils/BlockGen/Inputs/ValueInput"; import Placeholder from "$lib/utils/ToolboxGen/Placeholder"; import StatementInput from "$lib/utils/BlockGen/Inputs/StatementInput"; import Dropdown from "$lib/utils/BlockGen/Inputs/Dropdown"; -import AssemblerMutator from "$lib/utils/BlockGen/Mutators/AssemblerMutator"; +import AssemblerMutatorV2 from "$lib/utils/BlockGen/Mutators/AssemblerMutatorV2"; const blocks: BlockDefinition[] = [ @@ -40,7 +40,7 @@ const blocks: BlockDefinition[] = [ code: (args) => { return `new Text("${args.CONTENT}")`; }, - mutator: new AssemblerMutator("Add Content", [ + mutator: new AssemblerMutatorV2("Add Content", [ { block: "text_content", adds: [new ValueInput("text_content", BlockType.String)], From 218930aff81b2436e6b797d28c95005de9f3b1cf Mon Sep 17 00:00:00 2001 From: LimeNade Date: Sat, 20 Apr 2024 20:22:39 +0200 Subject: [PATCH 05/11] Chore: Lint --- src/lib/blocks/Javascript/Loops.ts | 12 +- src/lib/blocks/Javascript/logic.ts | 73 +- src/lib/blocks/Javascript/math.ts | 640 +++++++++--------- src/lib/blocks/Javascript/text.ts | 569 ++++++++-------- src/lib/blocks/Test Blocks/mutators.ts | 43 +- src/lib/components/Workspace.svelte | 4 +- src/lib/enums/BlockTypes.ts | 2 +- src/lib/types/BlockDefinition.ts | 10 +- src/lib/types/DiscodesInput.ts | 4 +- src/lib/utils/BlockGen/Blocks/Block.ts | 206 +++--- src/lib/utils/BlockGen/Inputs/BaseInput.ts | 2 +- src/lib/utils/BlockGen/Inputs/Dropdown.ts | 1 - src/lib/utils/BlockGen/Inputs/NumberInput.ts | 16 +- .../utils/BlockGen/Inputs/StatementInput.ts | 4 +- src/lib/utils/BlockGen/Inputs/TextInput.ts | 2 - src/lib/utils/BlockGen/Inputs/ValueInput.ts | 1 - .../BlockGen/Mutators/AssemblerMutatorV2.ts | 474 +++++++------ .../BlockGen/Mutators/CheckboxMutator.ts | 78 ++- src/lib/utils/BlockGen/Mutators/Mutator.ts | 8 +- src/lib/utils/helpers/getInputValue.ts | 24 +- src/routes/+page.svelte | 2 +- 21 files changed, 1087 insertions(+), 1088 deletions(-) diff --git a/src/lib/blocks/Javascript/Loops.ts b/src/lib/blocks/Javascript/Loops.ts index 2a7fddb..02f8ccc 100644 --- a/src/lib/blocks/Javascript/Loops.ts +++ b/src/lib/blocks/Javascript/Loops.ts @@ -18,7 +18,7 @@ const blocks: BlockDefinition[] = [ tooltip: "Repeats the code inside the given ammount of times.", helpUrl: "", code: (args) => { - return `for (let i = 0; i < ${args.VALUE === ""? "0" : args.VALUE}; i++) {\n${args.INPUT === ""? "" : args.INPUT}\n}`; + return `for (let i = 0; i < ${args.VALUE === "" ? "0" : args.VALUE}; i++) {\n${args.INPUT === "" ? "" : args.INPUT}\n}`; } }, { @@ -38,7 +38,7 @@ const blocks: BlockDefinition[] = [ tooltip: "Repeat while", helpUrl: "", code: (args) => { - return `while (${args.WHILE === "while" ? "" : "!"}( ${args.CONDITION === ""? "false" : args.CONDITION} )) {\n${args.INPUT === ""? "" : args.INPUT}\n}`; + return `while (${args.WHILE === "while" ? "" : "!"}( ${args.CONDITION === "" ? "false" : args.CONDITION} )) {\n${args.INPUT === "" ? "" : args.INPUT}\n}`; } }, { @@ -60,10 +60,10 @@ const blocks: BlockDefinition[] = [ tooltip: "For loop", helpUrl: "", code: (args) => { - if(args.VARIABLE === "") return ""; - const variable = `let ${args.VARIABLE} =${args.START ===""? "0" : args.START}`; - const condition = `${args.VARIABLE} < ${args.END === ""? "0" : args.END}`; - const step = `${args.VARIABLE} += ${args.STEP ===""? "0" : args.STEP}}`; + if (args.VARIABLE === "") return ""; + const variable = `let ${args.VARIABLE} =${args.START === "" ? "0" : args.START}`; + const condition = `${args.VARIABLE} < ${args.END === "" ? "0" : args.END}`; + const step = `${args.VARIABLE} += ${args.STEP === "" ? "0" : args.STEP}}`; if (args.VARIABLE === "") { const varName = salt(10); return `for(let vk${varName} = 0; false; vk${varName}+= 0) {}`; diff --git a/src/lib/blocks/Javascript/logic.ts b/src/lib/blocks/Javascript/logic.ts index 0fe8bcf..335c42b 100644 --- a/src/lib/blocks/Javascript/logic.ts +++ b/src/lib/blocks/Javascript/logic.ts @@ -12,50 +12,58 @@ import AssemblerMutatorV2 from "$lib/utils/BlockGen/Mutators/AssemblerMutatorV2" const blocks: BlockDefinition[] = [ { - id: "if_block", text: "if {operand} {if}", args: [new ValueInput("operand", BlockType.Boolean), new StatementInput("if")], - warnings: [new Warning(WarningType.Input, { - fieldName: "operand", - })], + warnings: [ + new Warning(WarningType.Input, { + fieldName: "operand" + }) + ], shape: BlockShape.Action, inline: true, colour: rgbToHex(91, 128, 165), tooltip: "Returns the opposite of the input", helpUrl: - `https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Logical_NOT`, + "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Logical_NOT", code: (args) => { - console.log(args) - let code = `if(${args.operand === ""? "false" : args.operand}) { + console.log(args); + let code = `if(${args.operand === "" ? "false" : args.operand}) { ${args.if} }`; const ifInputs = args.if_input as string[]; const ifStatementInputs = args.if_statement as string[]; - for (let i=0; i < ifInputs.length; i++) { + for (let i = 0; i < ifInputs.length; i++) { const ifInp = ifInputs[i]; - code += ` else if(${ifInp === ""? "false" : ifInp}) { + code += ` else if(${ifInp === "" ? "false" : ifInp}) { ${ifStatementInputs[i]} }`; } return code; }, - mutator: new AssemblerMutatorV2("If", [ - { - block: "if_test", - adds: [new ValueInput("if_input", BlockType.Boolean).setField("else if"), new StatementInput("if_statement").setField("do")], - once: true - }, + mutator: new AssemblerMutatorV2( + "If", + [ + { + block: "if_test", + adds: [ + new ValueInput("if_input", BlockType.Boolean).setField("else if"), + new StatementInput("if_statement").setField("do") + ], + once: true + }, + { + block: "else_test", + adds: [new StatementInput("else_input").setField("else")], + once: true + } + ], { - block: "else_test", - adds: [new StatementInput("else_input").setField("else")], - once: true + color: rgbToHex(91, 128, 165) } - ], { - color: rgbToHex(91, 128, 165) - }) + ) }, { id: "is_equal", @@ -68,7 +76,7 @@ const blocks: BlockDefinition[] = [ "<": "<", "≤": "<=", ">": ">", - "≥": ">=", + "≥": ">=" //always need to use === instead of == in js, removed this //because user is always going to select the first one and question the last one. //"==": "===" @@ -90,13 +98,12 @@ const blocks: BlockDefinition[] = [ // return `${args.A} ${args.CONDITION} ${args.B}`; code: (args, block) => { - block.addInput(new Dropdown("bob", DropdownType.Auto, {"bob": "hello", "alex":"nikola"})); + block.addInput(new Dropdown("bob", DropdownType.Auto, { bob: "hello", alex: "nikola" })); block.addInput(new ValueInput("chicken", BlockType.Any)); - block.addInput(new NumberInput("numberrr", 50, {max: 100, min: 50, precision: 10})); + block.addInput(new NumberInput("numberrr", 50, { max: 100, min: 50, precision: 10 })); block.addInput(new TextInput("textttt", "I am a text input!")); - console.log("Args (code prop parameter): ",args); + console.log("Args (code prop parameter): ", args); return `${args.textttt}`; - } }, { @@ -118,7 +125,7 @@ const blocks: BlockDefinition[] = [ tooltip: "Checks if the first input and the second input validate the condition.", helpUrl: "", code: (args) => { - if(args.A === "" || args.B === "") return "false"; + if (args.A === "" || args.B === "") return "false"; return `${args.A} ${args.CONDITION} ${args.B}`; } @@ -136,7 +143,7 @@ const blocks: BlockDefinition[] = [ helpUrl: "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Logical_NOT", code: (args) => { - if(args.OPERAND === "") return "false"; + if (args.OPERAND === "") return "false"; return `!${args.OPERAND}`; } @@ -148,18 +155,18 @@ const blocks: BlockDefinition[] = [ new Dropdown("INPUT", DropdownType.Auto, { true: "true", false: "false", - null: "null", + null: "null" //undefined: "undefined" }) ], shape: BlockShape.Floating, - output: BlockType.Any , + output: BlockType.Any, inline: true, colour: rgbToHex(91, 128, 165), tooltip: "", helpUrl: "", code: (args) => { - return `${args.INPUT !== ""? args.INPUT : "null"}`; + return `${args.INPUT !== "" ? args.INPUT : "null"}`; } }, { @@ -197,7 +204,7 @@ const blocks: BlockDefinition[] = [ tooltip: "", helpUrl: "", code: (args) => { - if(args.OPERAND === "") return "null"; + if (args.OPERAND === "") return "null"; return `typeof ${args.OPERAND}`; } }, @@ -218,10 +225,8 @@ const blocks: BlockDefinition[] = [ }) ], warnings: [ - // new Warning(WarningType.Input, { fieldName: "OPERAND" }), new Warning(WarningType.Input, { fieldName: "TYPE" }) - ], shape: BlockShape.Bottom, output: BlockType.Boolean, diff --git a/src/lib/blocks/Javascript/math.ts b/src/lib/blocks/Javascript/math.ts index 35ca01c..d54ba0e 100644 --- a/src/lib/blocks/Javascript/math.ts +++ b/src/lib/blocks/Javascript/math.ts @@ -7,334 +7,326 @@ import ValueInput from "$lib/utils/BlockGen/Inputs/ValueInput"; import Placeholder from "$lib/utils/ToolboxGen/Placeholder"; const blocks: BlockDefinition[] = [ - { - id: "number", - text: "{NUMBER}", - args: [ - new NumberInput("NUMBER", 0) - ], - shape: BlockShape.Floating, - output: BlockType.Number, - inline: true, - colour: "#5b67a5", - tooltip: "Allows you to make a number input.", - helpUrl: "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number", - code: (args) => { - return `${args.NUMBER}`; - } - }, - { - id: "operations", - text: "{OPERAND1} {OPERATOR} {OPERAND2}", - args: [ - new ValueInput("OPERAND1", BlockType.Number), - new Dropdown("OPERATOR", DropdownType.Auto, { - "+": "+", - "-": "-", - "*": "*", - "/": "/", - "%": "%", - "^": "pow", - }), - new ValueInput("OPERAND2", BlockType.Number), - ], - placeholders: [ - new Placeholder(PlaceholderType.Block, "OPERAND1", "number", {NUMBER: 1}), - new Placeholder(PlaceholderType.Block, "OPERAND2", "number", {NUMBER: 2}) + { + id: "number", + text: "{NUMBER}", + args: [new NumberInput("NUMBER", 0)], + shape: BlockShape.Floating, + output: BlockType.Number, + inline: true, + colour: "#5b67a5", + tooltip: "Allows you to make a number input.", + helpUrl: + "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number", + code: (args) => { + return `${args.NUMBER}`; + } + }, + { + id: "operations", + text: "{OPERAND1} {OPERATOR} {OPERAND2}", + args: [ + new ValueInput("OPERAND1", BlockType.Number), + new Dropdown("OPERATOR", DropdownType.Auto, { + "+": "+", + "-": "-", + "*": "*", + "/": "/", + "%": "%", + "^": "pow" + }), + new ValueInput("OPERAND2", BlockType.Number) + ], + placeholders: [ + new Placeholder(PlaceholderType.Block, "OPERAND1", "number", { NUMBER: 1 }), + new Placeholder(PlaceholderType.Block, "OPERAND2", "number", { NUMBER: 2 }) + ], + shape: BlockShape.Floating, + output: BlockType.Number, + inline: true, + colour: "#5b67a5", + tooltip: "Allows you to make operations with numbers.", + helpUrl: + "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number", + code: (args) => { + if (args.OPERATOR === "pow") return `Math.pow(${args.OPERAND1}, ${args.OPERAND2})`; + return `${args.OPERAND1} ${args.OPERATOR} ${args.OPERAND2}`; + } + }, + { + id: "operations2", + text: "{OPERATION} {NUMBER}", + args: [ + new Dropdown("OPERATION", DropdownType.Auto, { + "square root": "sqrt", + absolute: "abs", + negate: "negative", + inverse: "inverse", + ln: "log", + log10: "log10", + exp: "exp", + sin: "sin", + cos: "cos", + tan: "tan", + asin: "asin", + acos: "acos", + atan: "atan", + round: "round", + "round up": "ceil", + "round down": "floor" + }), + new ValueInput("NUMBER", BlockType.Number) + ], + placeholders: [new Placeholder(PlaceholderType.Block, "NUMBER", "number", { NUMBER: 1 })], + shape: BlockShape.Floating, + output: BlockType.Number, + inline: true, + colour: "#5b67a5", + tooltip: "Allows you to make operations with numbers.", + helpUrl: + "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number", + code: (args) => { + switch (args.OPERATION) { + case "negate": + return `Math.abs(${args.NUMBER}) * -1`; - ], - shape: BlockShape.Floating, - output: BlockType.Number, - inline: true, - colour: "#5b67a5", - tooltip: "Allows you to make operations with numbers.", - helpUrl: "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number", - code: (args) => { - if (args.OPERATOR === "pow") return `Math.pow(${args.OPERAND1}, ${args.OPERAND2})`; - return `${args.OPERAND1} ${args.OPERATOR} ${args.OPERAND2}`; - } - }, - { - id: "operations2", - text: "{OPERATION} {NUMBER}", - args: [ - new Dropdown("OPERATION", DropdownType.Auto, { - "square root": "sqrt", - "absolute": "abs", - "negate": "negative", - "inverse": "inverse", - "ln": "log", - "log10": "log10", - "exp": "exp", - "sin": "sin", - "cos": "cos", - "tan": "tan", - "asin": "asin", - "acos": "acos", - "atan": "atan", - "round": "round", - "round up": "ceil", - "round down": "floor", - } - ), - new ValueInput("NUMBER", BlockType.Number), - ], - placeholders: [ - new Placeholder(PlaceholderType.Block, "NUMBER", "number", {NUMBER: 1}) - ], - shape: BlockShape.Floating, - output: BlockType.Number, - inline: true, - colour: "#5b67a5", - tooltip: "Allows you to make operations with numbers.", - helpUrl: "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number", - code: (args) => { - switch (args.OPERATION) { - case "negate": - return `Math.abs(${args.NUMBER}) * -1`; - - case "inverse": - return `${args.NUMBER}) * -1`; - case "log10": - return `Math.log(${args.NUMBER}) / Math.log(10)`; - case "sin": - case "cos": - case "tan": - case "asin": - case "acos": - case "atan": - return `(Math.(${args.OPERATION}) / Math.PI) * 180`; - default: - return `Math.${args.OPERATION}(${args.NUMBER})`; - } - } - }, - { - id: "constants", - text: "{CONSTANT}", - args: [ - new Dropdown("CONSTANT", DropdownType.Auto, { - "π": "Math.PI", - "e": "Math.E", - "ϕ": "(1 + Math.sqrt(5)) / 2", - "√(2)": "Math.SQRT2", - "√(½)": "Math.Math.SQRT1_2", - "∞": "Infinity", - "NaN": "NaN", - }) - ], - shape: BlockShape.Floating, - output: BlockType.Number, - inline: true, - colour: "#5b67a5", - tooltip: "Allows you to use constants.", - helpUrl: "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number", - code: (args) => { - return `${args.CONSTANT}`; - } - }, - { - id: "is", - text: "{NUMBER} is {VALUE}", - args: [ - new ValueInput("NUMBER", BlockType.Number), - new Dropdown("VALUE", DropdownType.Auto, { - "number": "number", - "even": "even", - "odd": "odd", - "prime": "prime", - "whole": "whole", - "positive": "positive", - "negative": "negative", - "divisible by": "divisible" - })], - placeholders: [ - new Placeholder(PlaceholderType.Block, "NUMBER", "number", {NUMBER: 1}), - - - ], - shape: BlockShape.Floating, - output: BlockType.Boolean, - inline: true, - colour: "#5b67a5", - tooltip: "Checks if a number is even, odd, prime, whole, positive, negative, or div", - helpUrl: "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number", - code: (args) => { - switch (`${args.VALUE}`) { - case "number": - return `typeof ${args.NUMBER} === "number" && ${args.NUMBER} % 1 === 0`; - case "even": - return `${args.NUMBER} % 2 === 0`; - case "odd": - return `${args.NUMBER} % 2!== 0`; - case "prime": - return `isPrime(${args.NUMBER})`; /* function isPrime(number) {if (number < 2) {return false;};for (let i = 2; i <= Math.sqrt(number); i++) {if (number % i === 0) {return false;}}return true;} */ - case "whole": - return `${args.NUMBER} % 1 === 0`; - case "positive": - return `${args.NUMBER} > 0`; - case "negative": - return `${args.NUMBER} < 0`; - default: - return `${args.NUMBER} % ${args.VALUE} === 0`; // fix when added mutator - } - } - }, - { - id: "array_math", - text: "{OPERATION} of list {ARRAY}", - args: [ - new Dropdown("OPERATION", DropdownType.Auto, { - "sum": "sum", - "min": "min", - "max": "max", - "average": "average", - "median": "median", - "mode": "mode", - "range": "range", - "random": "random", - "standard deviation": "standard deviation", - - }), - new ValueInput("ARRAY", BlockType.Array) - ], - // placeholders: [ - // new Placeholder(PlaceholderType.Block, "ARRAY", "array", {ARRAY: [1, 2, 3]}) - // ], - shape: BlockShape.Floating, - output: BlockType.Number, - inline: true, - colour: "#5b67a5", - tooltip: "Allows you to use math with arrays.", - helpUrl: "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number", - code: (args) => { - switch (args.OPERATION) { - case "sum": - return `${args.ARRAY}.reduce((a, b) => a + b)`; - case "min": - return `${args.ARRAY}.reduce((a, b) => Math.min(a, b))`; - case "max": - return `${args.ARRAY}.reduce((a, b) => Math.max(a, b))`; - case "average": - return `${args.ARRAY}.reduce((a, b) => a + b) / ${args.ARRAY}.length`; - case "median": - return `${args.ARRAY}.sort((a, b) => a - b).length % 2? ${args.ARRAY}.sort((a, b) => a - b)[Math.floor(${args.ARRAY}.length / 2)] : ((${args.ARRAY}.sort((a, b) => a - b)[Math.floor(${args.ARRAY}.length / 2)] + ${args.ARRAY}.sort((a, b) => a - b - 1)[Math.floor(${args.ARRAY}.length / 2)]) / 2 ))`; - case "mode": - return `${args.ARRAY}.sort((a, b) => a - b).length % 2`; - case "range": - return `${args.ARRAY}.reduce((a, b) => Math.max(a, b) - Math.min(a, b))`; - case "random": - return `Math.floor(Math.random() * ${args.ARRAY}.length)`; - case "standard deviation": - return `Math.sqrt(${args.ARRAY}.reduce((a, b) => Math.pow(a - b, 2)) / ${args.ARRAY}.length)`; - default: - return `Math.${args.OPERATION}(${args.ARRAY})`; - } - } - }, - { - id: "random_int", - text: "random integer between {MIN} to {MAX}", - args: [ - new ValueInput("MIN", BlockType.Number), - new ValueInput("MAX", BlockType.Number) - ], - placeholders: [ - new Placeholder(PlaceholderType.Block, "MIN", "number", {NUMBER: 1}), - new Placeholder(PlaceholderType.Block, "MAX", "number", {NUMBER: 10}) - ], - shape: BlockShape.Floating, - output: BlockType.Number, - inline: true, - colour: "#5b67a5", - tooltip: "Gets a random integer between two numbers.", - helpUrl: "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number", - code: (args) => { - return `Math.floor(Math.random() * (${args.MAX} - ${args.MIN}) + ${args.MIN})`; - } - }, - { - id: "random_fraction", - text: "random fraction", - args: [], - shape: BlockShape.Floating, - output: BlockType.Number, - inline: true, - colour: "#5b67a5", - tooltip: "Gets a random fraction.", - helpUrl: "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number", - code: () => { - return "Math.random()"; - } - }, - { - id: "toNumber", - text: "convert text {TEXT} to number", - args: [ - new ValueInput("TEXT", BlockType.String) - ], - placeholders: [ - new Placeholder(PlaceholderType.Block, "TEXT", "text", {TEXT: "123"}) - ], - shape: BlockShape.Floating, - output: BlockType.Number, - inline: true, - colour: "#5b67a5", - tooltip: "Converts text to a number.", - helpUrl: "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number", - code: (args) => { - return `parseInt(${args.TEXT})`; - } - }, - { - id: "constrain {VALUE} between {MIN} and {MAX}", - text: "constrain {VALUE} between {MIN} and {MAX}", - args: [ - new ValueInput("VALUE", BlockType.Number), - new ValueInput("MIN", BlockType.Number), - new ValueInput("MAX", BlockType.Number) - ], - placeholders: [ - new Placeholder(PlaceholderType.Block, "VALUE", "number", {NUMBER: 50}), - new Placeholder(PlaceholderType.Block, "MIN", "number", {NUMBER: 1}), - new Placeholder(PlaceholderType.Block, "MAX", "number", {NUMBER: 100}) - ], - shape: BlockShape.Floating, - output: BlockType.Number, - inline: true, - colour: "#5b67a5", - tooltip: "Constrains a number between two numbers.", - helpUrl: "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number", - code: (args) => { - return `Math.min(Math.max(${args.VALUE}, ${args.MIN}), ${args.MAX})`; - } - }, - // { - // id: "chance {CHANCE} %", - // text: "{CHANCE} % chance of true", - // args: [ - // new ValueInput("CHANCE", BlockType.Number) - // ], - // placeholders: [ - // new Placeholder(PlaceholderType.Block, "CHANCE", "number", {NUMBER: 50}) - // ], - // shape: BlockShape.Floating, - // output: BlockType.Boolean, - // inline: true, - // colour: "#5b67a5", - // tooltip: "Chances a number between two numbers.", - // helpUrl: "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number", - // code: (args) => { - // return `Math.random() * 100 < ${args.CHANCE}` - // } - - // } + case "inverse": + return `${args.NUMBER}) * -1`; + case "log10": + return `Math.log(${args.NUMBER}) / Math.log(10)`; + case "sin": + case "cos": + case "tan": + case "asin": + case "acos": + case "atan": + return `(Math.(${args.OPERATION}) / Math.PI) * 180`; + default: + return `Math.${args.OPERATION}(${args.NUMBER})`; + } + } + }, + { + id: "constants", + text: "{CONSTANT}", + args: [ + new Dropdown("CONSTANT", DropdownType.Auto, { + π: "Math.PI", + e: "Math.E", + ϕ: "(1 + Math.sqrt(5)) / 2", + "√(2)": "Math.SQRT2", + "√(½)": "Math.Math.SQRT1_2", + "∞": "Infinity", + NaN: "NaN" + }) + ], + shape: BlockShape.Floating, + output: BlockType.Number, + inline: true, + colour: "#5b67a5", + tooltip: "Allows you to use constants.", + helpUrl: + "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number", + code: (args) => { + return `${args.CONSTANT}`; + } + }, + { + id: "is", + text: "{NUMBER} is {VALUE}", + args: [ + new ValueInput("NUMBER", BlockType.Number), + new Dropdown("VALUE", DropdownType.Auto, { + number: "number", + even: "even", + odd: "odd", + prime: "prime", + whole: "whole", + positive: "positive", + negative: "negative", + "divisible by": "divisible" + }) + ], + placeholders: [new Placeholder(PlaceholderType.Block, "NUMBER", "number", { NUMBER: 1 })], + shape: BlockShape.Floating, + output: BlockType.Boolean, + inline: true, + colour: "#5b67a5", + tooltip: "Checks if a number is even, odd, prime, whole, positive, negative, or div", + helpUrl: + "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number", + code: (args) => { + switch (`${args.VALUE}`) { + case "number": + return `typeof ${args.NUMBER} === "number" && ${args.NUMBER} % 1 === 0`; + case "even": + return `${args.NUMBER} % 2 === 0`; + case "odd": + return `${args.NUMBER} % 2!== 0`; + case "prime": + return `isPrime(${args.NUMBER})`; /* function isPrime(number) {if (number < 2) {return false;};for (let i = 2; i <= Math.sqrt(number); i++) {if (number % i === 0) {return false;}}return true;} */ + case "whole": + return `${args.NUMBER} % 1 === 0`; + case "positive": + return `${args.NUMBER} > 0`; + case "negative": + return `${args.NUMBER} < 0`; + default: + return `${args.NUMBER} % ${args.VALUE} === 0`; // fix when added mutator + } + } + }, + { + id: "array_math", + text: "{OPERATION} of list {ARRAY}", + args: [ + new Dropdown("OPERATION", DropdownType.Auto, { + sum: "sum", + min: "min", + max: "max", + average: "average", + median: "median", + mode: "mode", + range: "range", + random: "random", + "standard deviation": "standard deviation" + }), + new ValueInput("ARRAY", BlockType.Array) + ], + // placeholders: [ + // new Placeholder(PlaceholderType.Block, "ARRAY", "array", {ARRAY: [1, 2, 3]}) + // ], + shape: BlockShape.Floating, + output: BlockType.Number, + inline: true, + colour: "#5b67a5", + tooltip: "Allows you to use math with arrays.", + helpUrl: + "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number", + code: (args) => { + switch (args.OPERATION) { + case "sum": + return `${args.ARRAY}.reduce((a, b) => a + b)`; + case "min": + return `${args.ARRAY}.reduce((a, b) => Math.min(a, b))`; + case "max": + return `${args.ARRAY}.reduce((a, b) => Math.max(a, b))`; + case "average": + return `${args.ARRAY}.reduce((a, b) => a + b) / ${args.ARRAY}.length`; + case "median": + return `${args.ARRAY}.sort((a, b) => a - b).length % 2? ${args.ARRAY}.sort((a, b) => a - b)[Math.floor(${args.ARRAY}.length / 2)] : ((${args.ARRAY}.sort((a, b) => a - b)[Math.floor(${args.ARRAY}.length / 2)] + ${args.ARRAY}.sort((a, b) => a - b - 1)[Math.floor(${args.ARRAY}.length / 2)]) / 2 ))`; + case "mode": + return `${args.ARRAY}.sort((a, b) => a - b).length % 2`; + case "range": + return `${args.ARRAY}.reduce((a, b) => Math.max(a, b) - Math.min(a, b))`; + case "random": + return `Math.floor(Math.random() * ${args.ARRAY}.length)`; + case "standard deviation": + return `Math.sqrt(${args.ARRAY}.reduce((a, b) => Math.pow(a - b, 2)) / ${args.ARRAY}.length)`; + default: + return `Math.${args.OPERATION}(${args.ARRAY})`; + } + } + }, + { + id: "random_int", + text: "random integer between {MIN} to {MAX}", + args: [new ValueInput("MIN", BlockType.Number), new ValueInput("MAX", BlockType.Number)], + placeholders: [ + new Placeholder(PlaceholderType.Block, "MIN", "number", { NUMBER: 1 }), + new Placeholder(PlaceholderType.Block, "MAX", "number", { NUMBER: 10 }) + ], + shape: BlockShape.Floating, + output: BlockType.Number, + inline: true, + colour: "#5b67a5", + tooltip: "Gets a random integer between two numbers.", + helpUrl: + "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number", + code: (args) => { + return `Math.floor(Math.random() * (${args.MAX} - ${args.MIN}) + ${args.MIN})`; + } + }, + { + id: "random_fraction", + text: "random fraction", + args: [], + shape: BlockShape.Floating, + output: BlockType.Number, + inline: true, + colour: "#5b67a5", + tooltip: "Gets a random fraction.", + helpUrl: + "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number", + code: () => { + return "Math.random()"; + } + }, + { + id: "toNumber", + text: "convert text {TEXT} to number", + args: [new ValueInput("TEXT", BlockType.String)], + placeholders: [new Placeholder(PlaceholderType.Block, "TEXT", "text", { TEXT: "123" })], + shape: BlockShape.Floating, + output: BlockType.Number, + inline: true, + colour: "#5b67a5", + tooltip: "Converts text to a number.", + helpUrl: + "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number", + code: (args) => { + return `parseInt(${args.TEXT})`; + } + }, + { + id: "constrain {VALUE} between {MIN} and {MAX}", + text: "constrain {VALUE} between {MIN} and {MAX}", + args: [ + new ValueInput("VALUE", BlockType.Number), + new ValueInput("MIN", BlockType.Number), + new ValueInput("MAX", BlockType.Number) + ], + placeholders: [ + new Placeholder(PlaceholderType.Block, "VALUE", "number", { NUMBER: 50 }), + new Placeholder(PlaceholderType.Block, "MIN", "number", { NUMBER: 1 }), + new Placeholder(PlaceholderType.Block, "MAX", "number", { NUMBER: 100 }) + ], + shape: BlockShape.Floating, + output: BlockType.Number, + inline: true, + colour: "#5b67a5", + tooltip: "Constrains a number between two numbers.", + helpUrl: + "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number", + code: (args) => { + return `Math.min(Math.max(${args.VALUE}, ${args.MIN}), ${args.MAX})`; + } + } + // { + // id: "chance {CHANCE} %", + // text: "{CHANCE} % chance of true", + // args: [ + // new ValueInput("CHANCE", BlockType.Number) + // ], + // placeholders: [ + // new Placeholder(PlaceholderType.Block, "CHANCE", "number", {NUMBER: 50}) + // ], + // shape: BlockShape.Floating, + // output: BlockType.Boolean, + // inline: true, + // colour: "#5b67a5", + // tooltip: "Chances a number between two numbers.", + // helpUrl: "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number", + // code: (args) => { + // return `Math.random() * 100 < ${args.CHANCE}` + // } + // } ]; const category: CategoryDefinition = { - name: "Math", - colour: "#5b67a5" + name: "Math", + colour: "#5b67a5" }; -export default {blocks, category}; +export default { blocks, category }; diff --git a/src/lib/blocks/Javascript/text.ts b/src/lib/blocks/Javascript/text.ts index 980a019..18ea2fc 100644 --- a/src/lib/blocks/Javascript/text.ts +++ b/src/lib/blocks/Javascript/text.ts @@ -8,7 +8,6 @@ import StatementInput from "$lib/utils/BlockGen/Inputs/StatementInput"; import Dropdown from "$lib/utils/BlockGen/Inputs/Dropdown"; import AssemblerMutatorV2 from "$lib/utils/BlockGen/Mutators/AssemblerMutatorV2"; - const blocks: BlockDefinition[] = [ { id: "text", @@ -26,147 +25,144 @@ const blocks: BlockDefinition[] = [ } }, { - id: "create_text_with_x", - text: "create text with {CONTENT}", - args: [ - new ValueInput("CONTENT", BlockType.String), - ], - shape: BlockShape.Floating, + id: "create_text_with_x", + text: "create text with {CONTENT}", + args: [new ValueInput("CONTENT", BlockType.String)], + shape: BlockShape.Floating, output: BlockType.String, - inline: true, - colour: "%{BKY_TEXTS_HUE}", - tooltip: "Creates text with dynamic content", - helpUrl: "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String", - code: (args) => { - return `new Text("${args.CONTENT}")`; - }, - mutator: new AssemblerMutatorV2("Add Content", [ - { - block: "text_content", - adds: [new ValueInput("text_content", BlockType.String)], - once: true - } - ]) - }, - { - id: "text_content", - text: "text {TEXT_CONTENT}", - args: [ - new ValueInput("TEXT_CONTENT", BlockType.String) - ], - shape: BlockShape.Action, - inline: true, - colour: "%{BKY_TEXTS_HUE}", - tooltip: "Text content for creating text with x", - helpUrl: "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String", - code: (args) => { - return args.TEXT_CONTENT; - }, + inline: true, + colour: "%{BKY_TEXTS_HUE}", + tooltip: "Creates text with dynamic content", + helpUrl: + "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String", + code: (args) => { + return `new Text("${args.CONTENT}")`; + }, + mutator: new AssemblerMutatorV2("Add Content", [ + { + block: "text_content", + adds: [new ValueInput("text_content", BlockType.String)], + once: true + } + ]) + }, + { + id: "text_content", + text: "text {TEXT_CONTENT}", + args: [new ValueInput("TEXT_CONTENT", BlockType.String)], + shape: BlockShape.Action, + inline: true, + colour: "%{BKY_TEXTS_HUE}", + tooltip: "Text content for creating text with x", + helpUrl: + "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String", + code: (args) => { + return `${args.TEXT_CONTENT}`; + }, hidden: true - }, + }, { - id: "text_count", - text: "count {INPUT} in {TEXT}", - args: [ - new ValueInput("INPUT", BlockType.String), - new ValueInput("TEXT", BlockType.String) - ], + id: "text_count", + text: "count {INPUT} in {TEXT}", + args: [new ValueInput("INPUT", BlockType.String), new ValueInput("TEXT", BlockType.String)], placeholders: [ - new Placeholder(PlaceholderType.Block, "INPUT", "text", {TEXT: "o"}), - new Placeholder(PlaceholderType.Block, "TEXT", "text", {INPUT: "Hello World"}) + new Placeholder(PlaceholderType.Block, "INPUT", "text", { TEXT: "o" }), + new Placeholder(PlaceholderType.Block, "TEXT", "text", { INPUT: "Hello World" }) ], - shape: BlockShape.Floating, - output: BlockType.Number, - inline: true, - colour: "%{BKY_TEXTS_HUE}", - tooltip: "Counts the occurrences of a substring in a text.", - helpUrl: "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String", - code: (args) => { - return `String(${args.TEXT}).split(${args.INPUT}).length - 1`; - } - }, + shape: BlockShape.Floating, + output: BlockType.Number, + inline: true, + colour: "%{BKY_TEXTS_HUE}", + tooltip: "Counts the occurrences of a substring in a text.", + helpUrl: + "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String", + code: (args) => { + return `String(${args.TEXT}).split(${args.INPUT}).length - 1`; + } + }, { - id: "text_trim", - text: "trim spaces from {SIDE} of {TEXT}", - args: [ - new Dropdown("SIDE", DropdownType.Auto, { - "both sides": "trim", - "left side": "trimLeft", - "right side": "trimRight" - }), - new ValueInput("TEXT", BlockType.String), - ], + id: "text_trim", + text: "trim spaces from {SIDE} of {TEXT}", + args: [ + new Dropdown("SIDE", DropdownType.Auto, { + "both sides": "trim", + "left side": "trimLeft", + "right side": "trimRight" + }), + new ValueInput("TEXT", BlockType.String) + ], placeholders: [ - new Placeholder(PlaceholderType.Block, "TEXT", "text", {SIDE: " Hello World "}) - ], - shape: BlockShape.Floating, - output: BlockType.String, - inline: true, - colour: "%{BKY_TEXTS_HUE}", - tooltip: "Removes leading and trailing whitespace from a string.", - helpUrl: "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/Trim", - code: (args) => { - return `String(${args.TEXT}).${args.SIDE}()`; - } - }, + new Placeholder(PlaceholderType.Block, "TEXT", "text", { SIDE: " Hello World " }) + ], + shape: BlockShape.Floating, + output: BlockType.String, + inline: true, + colour: "%{BKY_TEXTS_HUE}", + tooltip: "Removes leading and trailing whitespace from a string.", + helpUrl: + "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/Trim", + code: (args) => { + return `String(${args.TEXT}).${args.SIDE}()`; + } + }, { - id: "text_case", - text: "tp {CASE} case of {TEXT}", - args: [ - new Dropdown("CASE", DropdownType.Auto, { - "upper": "toUpperCase", - "lower": "toLowerCase", - "title": "toTitleCase" - }), - new ValueInput("TEXT", BlockType.String), - ], - placeholders: [ - new Placeholder(PlaceholderType.Block, "TEXT", "text", {CASE: "abc"}) - ], - shape: BlockShape.Floating, - output: BlockType.String, - inline: true, - colour: "%{BKY_TEXTS_HUE}", - tooltip: "Converts the case of text.", - helpUrl: "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String", - code: (args) => { - if(args.CASE === 'toTitleCase') { - return `String(${args.TEXT}).replace(/\\w\\S*/g, function(txt){return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase();})`; - } - return `String(${args.TEXT}).${args.CASE}()`; - } - }, + id: "text_case", + text: "tp {CASE} case of {TEXT}", + args: [ + new Dropdown("CASE", DropdownType.Auto, { + upper: "toUpperCase", + lower: "toLowerCase", + title: "toTitleCase" + }), + new ValueInput("TEXT", BlockType.String) + ], + placeholders: [new Placeholder(PlaceholderType.Block, "TEXT", "text", { CASE: "abc" })], + shape: BlockShape.Floating, + output: BlockType.String, + inline: true, + colour: "%{BKY_TEXTS_HUE}", + tooltip: "Converts the case of text.", + helpUrl: + "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String", + code: (args) => { + if (args.CASE === "toTitleCase") { + return `String(${args.TEXT}).replace(/\\w\\S*/g, function(txt){return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase();})`; + } + return `String(${args.TEXT}).${args.CASE}()`; + } + }, { id: "text_substring", text: "in text {TEXT} get substring from {FROM} {INPUT1} to {TO} {INPUT2}", args: [ new ValueInput("TEXT", BlockType.String), new Dropdown("FROM", DropdownType.Auto, { - "letter": "charAt", + letter: "charAt", "first letter": "start", "last letter": "charEndAt", "from end": "end" }), new ValueInput("INPUT1", BlockType.Number), new Dropdown("TO", DropdownType.Auto, { - "letter": "charAt", - "last": "last", + letter: "charAt", + last: "last", "from start letter": "substring", "x from end": "slice" }), new ValueInput("INPUT2", BlockType.Number) ], placeholders: [ - new Placeholder(PlaceholderType.Block, "TEXT", "text", {TEXT: "hey"}), - new Placeholder(PlaceholderType.Block, "INPUT1", "number", {NUMBER: 1}), - new Placeholder(PlaceholderType.Block, "INPUT2", "number", {NUMBER: 2}), - ], + new Placeholder(PlaceholderType.Block, "TEXT", "text", { TEXT: "hey" }), + new Placeholder(PlaceholderType.Block, "INPUT1", "number", { NUMBER: 1 }), + new Placeholder(PlaceholderType.Block, "INPUT2", "number", { NUMBER: 2 }) + ], shape: BlockShape.Floating, output: BlockType.String, inline: true, colour: "%{BKY_TEXTS_HUE}", tooltip: "Gets a substring from a text.", - helpUrl: "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String", + helpUrl: + "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String", code: (args) => { return `String(${args.TEXT}).${args.FROM}(${args.INPUT1}, ${args.INPUT2})`; // No idea how to make this } @@ -177,39 +173,40 @@ const blocks: BlockDefinition[] = [ args: [ new ValueInput("TEXT", BlockType.String), new Dropdown("LETTER", DropdownType.Auto, { - "letter": "charAt", + letter: "charAt", "letter from end": "chatEndAt", - "first": "charStart", - "last": "charEnd", - "random": "random" + first: "charStart", + last: "charEnd", + random: "random" }), new ValueInput("INPUT", BlockType.Number) ], placeholders: [ - new Placeholder(PlaceholderType.Block, "TEXT", "text", {TEXT: "hey"}), - new Placeholder(PlaceholderType.Block, "INPUT", "number", {NUMBER: 1}), - ], + new Placeholder(PlaceholderType.Block, "TEXT", "text", { TEXT: "hey" }), + new Placeholder(PlaceholderType.Block, "INPUT", "number", { NUMBER: 1 }) + ], shape: BlockShape.Floating, output: BlockType.String, inline: true, colour: "%{BKY_TEXTS_HUE}", tooltip: "Gets a specific letter from a text.", - helpUrl: "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String", + helpUrl: + "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String", code: (args) => { const text = `String(${args.TEXT})`; switch (args.LETTER) { - case 'charAt': - return text + `.charAt(${args.INPUT})`; - case 'chatEndAt': - return text + `.slice(-${args.INPUT}).charAt(0)`; - case 'charStart': - return text + `.charAt(0)`; - case 'charEnd': - return text + `.slice(-1)`; - case 'random': - return text + `.charAt(Math.floor(Math.random() * ${args.INPUT}))`; - default: - return ''; + case "charAt": + return `${text}.charAt(${args.INPUT})`; + case "chatEndAt": + return `${text}.slice(-${args.INPUT}).charAt(0)`; + case "charStart": + return `${text}.charAt(0)`; + case "charEnd": + return `${text}.slice(-1)`; + case "random": + return `${text}.charAt(Math.floor(Math.random() * ${args.INPUT}))`; + default: + return ""; } } }, @@ -219,21 +216,22 @@ const blocks: BlockDefinition[] = [ args: [ new ValueInput("TEXT", BlockType.String), new Dropdown("FIRST_LAST", DropdownType.Auto, { - "first": "indexOf", - "last": "lastIndexOf" + first: "indexOf", + last: "lastIndexOf" }), new ValueInput("ITEM", BlockType.String) ], placeholders: [ - new Placeholder(PlaceholderType.Block, "TEXT", "text", {TEXT: "hey hey"}), - new Placeholder(PlaceholderType.Block, "ITEM", "text", {TEXT: "hey"}) - ], + new Placeholder(PlaceholderType.Block, "TEXT", "text", { TEXT: "hey hey" }), + new Placeholder(PlaceholderType.Block, "ITEM", "text", { TEXT: "hey" }) + ], shape: BlockShape.Floating, output: BlockType.Number, inline: true, colour: "%{BKY_TEXTS_HUE}", tooltip: "Finds the first or last occurrence of an item in a text.", - helpUrl: "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String", + helpUrl: + "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String", code: (args) => { const text = `String(${args.TEXT})`; return `${text}.${args.FIRST_LAST}(${args.ITEM})`; @@ -242,18 +240,15 @@ const blocks: BlockDefinition[] = [ { id: "text_reverse", text: "reverse text {TEXT}", - args: [ - new ValueInput("TEXT", BlockType.String) - ], - placeholders: [ - new Placeholder(PlaceholderType.Block, "TEXT", "text", {TEXT: "abc"}) - ], + args: [new ValueInput("TEXT", BlockType.String)], + placeholders: [new Placeholder(PlaceholderType.Block, "TEXT", "text", { TEXT: "abc" })], shape: BlockShape.Floating, output: BlockType.String, inline: true, colour: "%{BKY_TEXTS_HUE}", tooltip: "Reverses the given text.", - helpUrl: "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String", + helpUrl: + "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String", code: (args) => { return `String(${args.TEXT}).split('').reverse().join('')`; } @@ -261,18 +256,15 @@ const blocks: BlockDefinition[] = [ { id: "text_is_empty", text: "text {TEXT} is empty?", - args: [ - new ValueInput("TEXT", BlockType.String) - ], - placeholders: [ - new Placeholder(PlaceholderType.Block, "TEXT", "text", {TEXT: ""}) - ], + args: [new ValueInput("TEXT", BlockType.String)], + placeholders: [new Placeholder(PlaceholderType.Block, "TEXT", "text", { TEXT: "" })], shape: BlockShape.Floating, output: BlockType.Boolean, inline: true, colour: "%{BKY_TEXTS_HUE}", tooltip: "Checks if the given text is empty.", - helpUrl: "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String", + helpUrl: + "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String", code: (args) => { return `String(${args.TEXT}).length === 0`; } @@ -286,158 +278,155 @@ const blocks: BlockDefinition[] = [ new ValueInput("TEXT", BlockType.String) ], placeholders: [ - new Placeholder(PlaceholderType.Block, "INPUT", "text", {TEXT: "Hello"}), - new Placeholder(PlaceholderType.Block, "REPLACE", "text", {TEXT: "Bye"}), - new Placeholder(PlaceholderType.Block, "TEXT", "text", {TEXT: "Hello World"}) - ], - shape: BlockShape.Floating, + new Placeholder(PlaceholderType.Block, "INPUT", "text", { TEXT: "Hello" }), + new Placeholder(PlaceholderType.Block, "REPLACE", "text", { TEXT: "Bye" }), + new Placeholder(PlaceholderType.Block, "TEXT", "text", { TEXT: "Hello World" }) + ], + shape: BlockShape.Floating, output: BlockType.String, inline: true, colour: "%{BKY_TEXTS_HUE}", tooltip: "Replaces occurrences of input with replace in the given text.", - helpUrl: "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String", + helpUrl: + "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String", code: (args) => { return `String(${args.TEXT}).replace(new RegExp(${args.INPUT}, 'g'), ${args.REPLACE})`; } }, { - id: "text_length", - text: "length of {TEXT}", - args: [ - new ValueInput("TEXT", BlockType.String) - ], - placeholders: [ - new Placeholder(PlaceholderType.Block, "TEXT", "text", {TEXT: "Hello World"}) - ], - shape: BlockShape.Floating, - output: BlockType.Number, - inline: true, - colour: "%{BKY_TEXTS_HUE}", - tooltip: "Gets the length of a text.", - helpUrl: "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/length", - code: (args) => { - return `String(${args.TEXT}).length`; - } - }, - { - id: "text_starts_ends", - text: "{TEXT} {OPTION} {OTHERTEXT}", - args: [ - new ValueInput("TEXT", BlockType.String), - new Dropdown("OPTION", DropdownType.Auto, { - "starts with": "startsWith", - "ends with": "endsWith", - "includes": "includes", - }), - new ValueInput("OTHERTEXT", BlockType.String), - ], - placeholders: [ - new Placeholder(PlaceholderType.Block, "TEXT", "text", {TEXT: "abcdefg"}), - new Placeholder(PlaceholderType.Block, "OTHERTEXT", "text", {TEXT: "abc"}) + id: "text_length", + text: "length of {TEXT}", + args: [new ValueInput("TEXT", BlockType.String)], + placeholders: [new Placeholder(PlaceholderType.Block, "TEXT", "text", { TEXT: "Hello World" })], + shape: BlockShape.Floating, + output: BlockType.Number, + inline: true, + colour: "%{BKY_TEXTS_HUE}", + tooltip: "Gets the length of a text.", + helpUrl: + "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/length", + code: (args) => { + return `String(${args.TEXT}).length`; + } + }, + { + id: "text_starts_ends", + text: "{TEXT} {OPTION} {OTHERTEXT}", + args: [ + new ValueInput("TEXT", BlockType.String), + new Dropdown("OPTION", DropdownType.Auto, { + "starts with": "startsWith", + "ends with": "endsWith", + includes: "includes" + }), + new ValueInput("OTHERTEXT", BlockType.String) ], - shape: BlockShape.Floating, - output: BlockType.Boolean, - inline: true, - colour: "%{BKY_TEXTS_HUE}", - tooltip: "Checks if text starts, ends, or includes another text.", - helpUrl: "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String", - code: (args) => { - return `String(${args.TEXT}).${args.OPTION}(${args.OTHERTEXT})`; - } - }, - { - id: "text_newline", - text: "new line", - output: BlockType.String, - shape: BlockShape.Floating, - inline: true, - colour: "%{BKY_TEXTS_HUE}", - tooltip: "Represents a new line character.", - helpUrl: "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String", - code: () => { - return `\\n`; - } - }, - { - id: "text_contains_number", - text: "{TEXT} contains numbers ?", - args: [ - new ValueInput("TEXT", BlockType.String) - ], placeholders: [ - new Placeholder(PlaceholderType.Block, "TEXT", "text", {TEXT: "abc123"}) - ], - shape: BlockShape.Floating, - output: BlockType.Boolean, - inline: true, - colour: "%{BKY_TEXTS_HUE}", - tooltip: "Checks if text contains any numbers.", - helpUrl: "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String", - code: (args) => { - return `String(${args.TEXT}).match(/\\d+/g) !== null`; - } - }, - { - id: "text_for_each", - text: "for each {SELECT} in {TEXT} \n {INPUT}", - args: [ - new Dropdown("SELECT", DropdownType.Auto, { - "character": "char", - "word": "word" - }), - new ValueInput("TEXT", BlockType.String), + new Placeholder(PlaceholderType.Block, "TEXT", "text", { TEXT: "abcdefg" }), + new Placeholder(PlaceholderType.Block, "OTHERTEXT", "text", { TEXT: "abc" }) + ], + shape: BlockShape.Floating, + output: BlockType.Boolean, + inline: true, + colour: "%{BKY_TEXTS_HUE}", + tooltip: "Checks if text starts, ends, or includes another text.", + helpUrl: + "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String", + code: (args) => { + return `String(${args.TEXT}).${args.OPTION}(${args.OTHERTEXT})`; + } + }, + { + id: "text_newline", + text: "new line", + output: BlockType.String, + shape: BlockShape.Floating, + inline: true, + colour: "%{BKY_TEXTS_HUE}", + tooltip: "Represents a new line character.", + helpUrl: + "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String", + code: () => { + return "\\n"; + } + }, + { + id: "text_contains_number", + text: "{TEXT} contains numbers ?", + args: [new ValueInput("TEXT", BlockType.String)], + placeholders: [new Placeholder(PlaceholderType.Block, "TEXT", "text", { TEXT: "abc123" })], + shape: BlockShape.Floating, + output: BlockType.Boolean, + inline: true, + colour: "%{BKY_TEXTS_HUE}", + tooltip: "Checks if text contains any numbers.", + helpUrl: + "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String", + code: (args) => { + return `String(${args.TEXT}).match(/\\d+/g) !== null`; + } + }, + { + id: "text_for_each", + text: "for each {SELECT} in {TEXT} \n {INPUT}", + args: [ + new Dropdown("SELECT", DropdownType.Auto, { + character: "char", + word: "word" + }), + new ValueInput("TEXT", BlockType.String), new StatementInput("INPUT") - ], - placeholders: [ - new Placeholder(PlaceholderType.Block, "TEXT", "text", {TEXT: "abc"}) - ], - shape: BlockShape.Action, - inline: true, - colour: "%{BKY_TEXTS_HUE}", - tooltip: "Iterates through each character or word in the text.", - helpUrl: "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String", - code: (args) => { - switch (args.SELECT) { - case 'char': - return `for (let char_i = 0; char_i < String(${args.TEXT}).length; char_i++){\nlet char_i_char = String(${args.TEXT})[char_i] ${args.INPUT}}`; - case 'word': - return `for (let word_i = 0; word_i < String(${args.TEXT}).split(' ').length; word_i++){\nlet word_i_word = String(${args.TEXT}).split(' ')[word_i] ${args.INPUT}}`; - default: - return ''; - } - } - }, - { - id: "text_character", - text: "{SELECT}", - args: [ - new Dropdown("SELECT", DropdownType.Auto, { - "character": "char", - "word": "word" - }) - ], - shape: BlockShape.Floating, - output: BlockType.String, - inline: true, - colour: "%{BKY_TEXTS_HUE}", - tooltip: "Outputs the selected character or word.", - helpUrl: "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String", - code: (args) => { - switch (args.SELECT) { - case 'char': - return `char_i_char`; - case 'word': - return `word_i_word`; - default: - return ''; - } - } - } + ], + placeholders: [new Placeholder(PlaceholderType.Block, "TEXT", "text", { TEXT: "abc" })], + shape: BlockShape.Action, + inline: true, + colour: "%{BKY_TEXTS_HUE}", + tooltip: "Iterates through each character or word in the text.", + helpUrl: + "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String", + code: (args) => { + switch (args.SELECT) { + case "char": + return `for (let char_i = 0; char_i < String(${args.TEXT}).length; char_i++){\nlet char_i_char = String(${args.TEXT})[char_i] ${args.INPUT}}`; + case "word": + return `for (let word_i = 0; word_i < String(${args.TEXT}).split(' ').length; word_i++){\nlet word_i_word = String(${args.TEXT}).split(' ')[word_i] ${args.INPUT}}`; + default: + return ""; + } + } + }, + { + id: "text_character", + text: "{SELECT}", + args: [ + new Dropdown("SELECT", DropdownType.Auto, { + character: "char", + word: "word" + }) + ], + shape: BlockShape.Floating, + output: BlockType.String, + inline: true, + colour: "%{BKY_TEXTS_HUE}", + tooltip: "Outputs the selected character or word.", + helpUrl: + "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String", + code: (args) => { + switch (args.SELECT) { + case "char": + return "char_i_char"; + case "word": + return "word_i_word"; + default: + return ""; + } + } + } ]; const category: CategoryDefinition = { - name: "Text", - colour: "#5ba58c" -} + name: "Text", + colour: "#5ba58c" +}; -export default {blocks, category}; +export default { blocks, category }; diff --git a/src/lib/blocks/Test Blocks/mutators.ts b/src/lib/blocks/Test Blocks/mutators.ts index 2abb6f2..cd827ad 100644 --- a/src/lib/blocks/Test Blocks/mutators.ts +++ b/src/lib/blocks/Test Blocks/mutators.ts @@ -84,7 +84,6 @@ const blocks: BlockDefinition[] = [ // }, { - id: "checkbox_mutator", text: "checkbox mutator\n", shape: BlockShape.Action, @@ -92,28 +91,34 @@ const blocks: BlockDefinition[] = [ colour: rgbToHex(91, 128, 165), tooltip: "Returns the opposite of the input", helpUrl: - `https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Logical_NOT`, + "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Logical_NOT", code: (args) => { - return "${args}"; + return `${args}`; }, - mutator: new CheckboxMutator("hello", [ - { - text: "input 1", - inputName: "if_test", - adds: [new ValueInput("if_input", BlockType.Boolean).setField("else if"), new StatementInput("if_statement").setField("do")], - defaultValue: true, - }, + mutator: new CheckboxMutator( + "hello", + [ + { + text: "input 1", + inputName: "if_test", + adds: [ + new ValueInput("if_input", BlockType.Boolean).setField("else if"), + new StatementInput("if_statement").setField("do") + ], + defaultValue: true + }, + { + text: "input 2", + inputName: "else_test", + adds: [new StatementInput("else_input").setField("else")], + defaultValue: false + } + ], { - text: "input 2", - inputName: "else_test", - adds: [new StatementInput("else_input").setField("else")], - defaultValue: false, - + color: rgbToHex(91, 128, 165) } - ], { - color: rgbToHex(91, 128, 165) - }) - }, + ) + } ]; const category: CategoryDefinition = { diff --git a/src/lib/components/Workspace.svelte b/src/lib/components/Workspace.svelte index 4d1f073..f9d015b 100644 --- a/src/lib/components/Workspace.svelte +++ b/src/lib/components/Workspace.svelte @@ -33,8 +33,8 @@ function updateCode(event: Abstract) { workspace.getAllBlocks(true).forEach((block) => { - if (block.type === "is_equal") console.log(block) - }) + if (block.type === "is_equal") console.log(block); + }); if (workspace.isDragging()) return; // Don't update while changes are happening. if (!supportedEvents.has(event.type)) return; diff --git a/src/lib/enums/BlockTypes.ts b/src/lib/enums/BlockTypes.ts index 9f3f2de..40e31b1 100644 --- a/src/lib/enums/BlockTypes.ts +++ b/src/lib/enums/BlockTypes.ts @@ -33,5 +33,5 @@ export enum PlaceholderType { } export enum MutatorType { Assembler = "assembler", - Checkbox = "checkbox", + Checkbox = "checkbox" } diff --git a/src/lib/types/BlockDefinition.ts b/src/lib/types/BlockDefinition.ts index 53f9eeb..3215032 100644 --- a/src/lib/types/BlockDefinition.ts +++ b/src/lib/types/BlockDefinition.ts @@ -1,7 +1,7 @@ import type { BlockShape, BlockType } from "$lib/enums/BlockTypes"; import type Block from "$lib/utils/BlockGen/Blocks/Block"; import type BaseInput from "$lib/utils/BlockGen/Inputs/BaseInput"; -import type {Mutator} from "$lib/utils/BlockGen/Mutators/Mutator"; +import type { Mutator } from "$lib/utils/BlockGen/Mutators/Mutator"; import type Warning from "$lib/utils/BlockGen/Warnings/Warning"; import type Placeholder from "$lib/utils/ToolboxGen/Placeholder"; @@ -32,7 +32,7 @@ export type BlockDefinition = text: string; }; -export interface MutatorBlock { +export interface MutatorBlock { // What inputs it adds to the block adds: Argument[]; } @@ -44,8 +44,8 @@ export interface CheckBoxMutatorBlock extends MutatorBlock { */ defaultValue?: boolean; /** - * Text that appears in containerBlock in mutator menu - */ + * Text that appears in containerBlock in mutator menu + */ text: string; /** * name for input in container block @@ -54,7 +54,7 @@ export interface CheckBoxMutatorBlock extends MutatorBlock { } export interface AssemblerMutator extends MutatorBlock { // Name of the block that appears in the block list in the UI - block: string + block: string; // Can it only be added once in the UI once: boolean; } diff --git a/src/lib/types/DiscodesInput.ts b/src/lib/types/DiscodesInput.ts index d64bad8..688d19d 100644 --- a/src/lib/types/DiscodesInput.ts +++ b/src/lib/types/DiscodesInput.ts @@ -6,4 +6,6 @@ import type { StatementIDef } from "$lib/utils/BlockGen/Inputs/StatementInput"; import type { TextIDef } from "$lib/utils/BlockGen/Inputs/TextInput"; import type { ValueIDef } from "$lib/utils/BlockGen/Inputs/ValueInput"; -export type DiscodesInput = BaseInput; +export type DiscodesInput = BaseInput< + DropdownIDef | ImageIDef | NumberIDef | StatementIDef | TextIDef | ValueIDef +>; diff --git a/src/lib/utils/BlockGen/Blocks/Block.ts b/src/lib/utils/BlockGen/Blocks/Block.ts index 8427212..5bc1b45 100644 --- a/src/lib/utils/BlockGen/Blocks/Block.ts +++ b/src/lib/utils/BlockGen/Blocks/Block.ts @@ -11,36 +11,39 @@ import type { CheckBoxMutatorBlock, MutatorBlock } from "$lib/types/BlockDefinition"; -import { BlockShape, BlockType, DropdownType, MutatorType, WarningType } from "$lib/enums/BlockTypes"; +import { + BlockShape, + BlockType, + DropdownType, + MutatorType, + WarningType +} from "$lib/enums/BlockTypes"; import type { Abstract } from "blockly/core/events/events_abstract"; import type { DiscodesInput } from "$lib/types/DiscodesInput"; import type Warning from "../Warnings/Warning"; - // Warnings -import {addWarning, removeWarning, warnings as warningsObj} from "../Warnings/WarningsList"; -import {EventsToTriggerWarnings} from "$lib/constants/warnings"; +import { addWarning, removeWarning, warnings as warningsObj } from "../Warnings/WarningsList"; +import { EventsToTriggerWarnings } from "$lib/constants/warnings"; // Helpers -import {dev} from "$app/environment"; +import { dev } from "$app/environment"; import salt from "$lib/utils/helpers/salt"; -import {getInputValue} from "$lib/utils/helpers/getInputValue"; - - +import { getInputValue } from "$lib/utils/helpers/getInputValue"; import { addImport } from "$lib/utils/BlockGen/Blocks/importsList"; interface BlocklyBlockDefinition { - type: string - colour: string - tooltip: string - helpUrl: string - inputsInline: boolean - args0: Record[] - message0: string - mutator:string | undefined -}; + type: string; + colour: string; + tooltip: string; + helpUrl: string; + inputsInline: boolean; + args0: Record[]; + message0: string; + mutator: string | undefined; +} const { javascriptGenerator, Order } = pkg; @@ -64,13 +67,22 @@ export default class Block { public addWarning(warning: Warning): void { if (this._blockDefinition.label) throw new Error("Cannot add a warning to a label"); if (warningsObj[this._block.id] && warningsObj[this._block.id][warning.data.fieldName]) return; - this._blockDefinition.warnings = this._blockDefinition.warnings ? [...this._blockDefinition.warnings, warning] : [warning]; + this._blockDefinition.warnings = this._blockDefinition.warnings + ? [...this._blockDefinition.warnings, warning] + : [warning]; } public removeWarning(fieldName: string): void { if (this._blockDefinition.label) throw new Error("Cannot remove a warning form a label"); - if ((!warningsObj[this._block.id] || !warningsObj[this._block.id][fieldName]) && this._blockDefinition.warnings !== undefined) return; - this._blockDefinition.warnings = this._blockDefinition.warnings?.filter(warning => warning.data.fieldName !== fieldName); + if ( + (!warningsObj[this._block.id] || !warningsObj[this._block.id][fieldName]) && + this._blockDefinition.warnings !== undefined + ) { + return; + } + this._blockDefinition.warnings = this._blockDefinition.warnings?.filter( + (warning) => warning.data.fieldName !== fieldName + ); } public addText(text: string, fieldName: string): void { @@ -86,44 +98,73 @@ export default class Block { if (!this._block || this._block.getInput(generated.name) || this._block.isInFlyout) return; let isDummy: boolean = true; - switch(generated.type) { + switch (generated.type) { case DropdownType.Grid: - this._block.appendDummyInput(generated.name) - .appendField(new gridDropdown.FieldGridDropdown(generated.options as Blockly.MenuGenerator) as Blockly.Field); + this._block + .appendDummyInput(generated.name) + .appendField( + new gridDropdown.FieldGridDropdown( + generated.options as Blockly.MenuGenerator + ) as Blockly.Field + ); break; case DropdownType.List: - this._block.appendDummyInput(generated.name) - .appendField(new Blockly.FieldDropdown(generated.options as Blockly.MenuGenerator) as Blockly.Field); + this._block + .appendDummyInput(generated.name) + .appendField( + new Blockly.FieldDropdown(generated.options as Blockly.MenuGenerator) as Blockly.Field< + string | undefined + > + ); break; - + case "input_value": - this._block.appendValueInput(generated.name) - .setCheck(generated.check as string | string[] | undefined ? generated.check as string | string[]: null); + this._block + .appendValueInput(generated.name) + .setCheck( + (generated.check as string | string[] | undefined) + ? (generated.check as string | string[]) + : null + ); isDummy = false; break; - + case "input_statement": this._block.appendStatementInput(generated.name); isDummy = false; break; case "field_number": - this._block.appendDummyInput(generated.name) - .appendField(new Blockly.FieldNumber(generated.value, generated.min, generated.max, generated.precision)); + this._block + .appendDummyInput(generated.name) + .appendField( + new Blockly.FieldNumber( + generated.value, + generated.min, + generated.max, + generated.precision + ) + ); break; case "field_image": - this._block.appendDummyInput(generated.name) - .appendField(new Blockly.FieldImage(generated.src, generated.width, generated.height, generated.alt)); + this._block + .appendDummyInput(generated.name) + .appendField( + new Blockly.FieldImage(generated.src, generated.width, generated.height, generated.alt) + ); break; case "field_input": - this._block.appendDummyInput(generated.name) - .appendField(new Blockly.FieldTextInput(generated.text, undefined,{spellcheck: generated.spellcheck})); + this._block.appendDummyInput(generated.name).appendField( + new Blockly.FieldTextInput(generated.text, undefined, { + spellcheck: generated.spellcheck + }) + ); break; } - (this._blocklyDefinition.args0 as Array).push({...generated, isDummy: isDummy}); + (this._blocklyDefinition.args0 as Array).push({ ...generated, isDummy: isDummy }); } public removeInput(inputName: string): void { @@ -133,7 +174,7 @@ export default class Block { generate(): void { if (this._blockDefinition.label) return; - + // eslint-disable-next-line @typescript-eslint/no-this-alias const blockClass = this; // Used because `this` is overwritten in the blockly functions. @@ -210,7 +251,6 @@ export default class Block { const block = this; // Warnings Code this.setOnChange(function(this: Blockly.Block, changeEvent: Abstract) { - if ( importName && !this.isInFlyout && @@ -227,12 +267,14 @@ export default class Block { !this.isInFlyout && block.id == this.id ) { - const warnings = blockClass._blockDefinition.label ? undefined : blockClass._blockDefinition.warnings; + const warnings = blockClass._blockDefinition.label + ? undefined + : blockClass._blockDefinition.warnings; if (!warnings) return; - + const topParent = this.getRootBlock(); let resultMessage: string = ""; - + for (const warning of warnings) { const { warningType, message, fieldName } = warning.data; switch (warningType) { @@ -275,21 +317,18 @@ export default class Block { }; const properties = this._blockDefinition.mutator?.properties; const propertyMap: Record = {}; - if(properties) { + if (properties) { for (const property of properties) { - if(this._blockDefinition.mutator?.type === MutatorType.Assembler) { + if (this._blockDefinition.mutator?.type === MutatorType.Assembler) { propertyMap[(property as AssemblerMutator).block] = property; - - } else if(this._blockDefinition.mutator?.type === MutatorType.Checkbox) { + } else if (this._blockDefinition.mutator?.type === MutatorType.Checkbox) { propertyMap[(property as CheckBoxMutatorBlock).inputName] = property; - } } } // Generating the export code javascriptGenerator.forBlock[blockDef.type] = function(block: Blockly.Block) { - const args: Record = {}; //? Object we will pass as argument for the custom code to run properly for (const arg in blockDef.args0) { @@ -299,53 +338,52 @@ export default class Block { } //parse mutator values - for(const propertyKey of Object.keys(propertyMap)) { + for (const propertyKey of Object.keys(propertyMap)) { const property = propertyMap[propertyKey]; - console.log(propertyMap) + console.log(propertyMap); for (const add of property.adds) { const valueList: string[] = []; let i = 1; let input = block.getInput(add.name + i); - while(input) { + while (input) { const definition = add.generate() as Record; - valueList.push(getInputValue(block, definition.name as string + i, definition.type as string)); + valueList.push( + getInputValue(block, (definition.name as string) + i, definition.type as string) + ); i++; input = block.getInput(add.name + i); } - args[add.name] = valueList; - - -// const args: Record = {}; //? Object we will pass as argument to be used for code generation - -// for (const arg of blockClass._blocklyDefinition.args0) { -// //! Fix this asap... -// //@ts-expect-error gergerg -// if (arg.isDummy === true) { -// // Since it's a dummy input we need to get the value from the fields array inside the dummy input! -// //@ts-expect-error We have to access the protected value to generate it correctly. -// args[arg.name] = block.getInput(arg.name)?.fieldRow[0].value_; -// continue; -// } - -// switch (arg.type) { -// case "input_value": -// args[arg.name] = javascriptGenerator.valueToCode( -// block, -// arg.name, -// javascriptGenerator.ORDER_ATOMIC -// ); -// break; - -// case "input_statement": -// args[arg.name] = javascriptGenerator.statementToCode(block, arg.name); -// break; - -// default: -// args[arg.name] = block.getFieldValue(arg.name); -// break; - + args[add.name] = valueList; + + // const args: Record = {}; //? Object we will pass as argument to be used for code generation + + // for (const arg of blockClass._blocklyDefinition.args0) { + // //! Fix this asap... + // //@ts-expect-error gergerg + // if (arg.isDummy === true) { + // // Since it's a dummy input we need to get the value from the fields array inside the dummy input! + // //@ts-expect-error We have to access the protected value to generate it correctly. + // args[arg.name] = block.getInput(arg.name)?.fieldRow[0].value_; + // continue; + // } + + // switch (arg.type) { + // case "input_value": + // args[arg.name] = javascriptGenerator.valueToCode( + // block, + // arg.name, + // javascriptGenerator.ORDER_ATOMIC + // ); + // break; + + // case "input_statement": + // args[arg.name] = javascriptGenerator.statementToCode(block, arg.name); + // break; + + // default: + // args[arg.name] = block.getFieldValue(arg.name); + // break; } - } return output ? [code(args, blockClass), Order.NONE] : code(args, blockClass); }; diff --git a/src/lib/utils/BlockGen/Inputs/BaseInput.ts b/src/lib/utils/BlockGen/Inputs/BaseInput.ts index 0bcdadb..4eac117 100644 --- a/src/lib/utils/BlockGen/Inputs/BaseInput.ts +++ b/src/lib/utils/BlockGen/Inputs/BaseInput.ts @@ -15,7 +15,7 @@ export default class BaseInput { /* this function currently is meant for Mutator use */ - public setField(text: string): BaseInput { + public setField(text: string): BaseInput { this._fieldText = text; return this; } diff --git a/src/lib/utils/BlockGen/Inputs/Dropdown.ts b/src/lib/utils/BlockGen/Inputs/Dropdown.ts index f47b068..adafe50 100644 --- a/src/lib/utils/BlockGen/Inputs/Dropdown.ts +++ b/src/lib/utils/BlockGen/Inputs/Dropdown.ts @@ -58,5 +58,4 @@ export default class Dropdown extends BaseInput { options: this._options }; } - } diff --git a/src/lib/utils/BlockGen/Inputs/NumberInput.ts b/src/lib/utils/BlockGen/Inputs/NumberInput.ts index b9ed18b..7cc0ed7 100644 --- a/src/lib/utils/BlockGen/Inputs/NumberInput.ts +++ b/src/lib/utils/BlockGen/Inputs/NumberInput.ts @@ -1,13 +1,12 @@ import BaseInput from "./BaseInput"; - -export interface NumberIDef { - type: "field_number"; - name: string; - value: number - min? : number - max?: number - precision?: number +export interface NumberIDef { + type: "field_number"; + name: string; + value: number; + min?: number; + max?: number; + precision?: number; } export default class NumberInput extends BaseInput { @@ -39,5 +38,4 @@ export default class NumberInput extends BaseInput { ...this._settings }; } - } diff --git a/src/lib/utils/BlockGen/Inputs/StatementInput.ts b/src/lib/utils/BlockGen/Inputs/StatementInput.ts index dd26c8c..0d55a12 100644 --- a/src/lib/utils/BlockGen/Inputs/StatementInput.ts +++ b/src/lib/utils/BlockGen/Inputs/StatementInput.ts @@ -1,6 +1,6 @@ import BaseInput from "./BaseInput"; -export interface StatementIDef { +export interface StatementIDef { name: string; type: "input_statement"; } @@ -19,7 +19,6 @@ export default class StatementInput extends BaseInput { this.setMethod(this.getDefinition); super.setName(name); - } /** @@ -34,5 +33,4 @@ export default class StatementInput extends BaseInput { name: super.name }; } - } diff --git a/src/lib/utils/BlockGen/Inputs/TextInput.ts b/src/lib/utils/BlockGen/Inputs/TextInput.ts index 7000423..26d5eb5 100644 --- a/src/lib/utils/BlockGen/Inputs/TextInput.ts +++ b/src/lib/utils/BlockGen/Inputs/TextInput.ts @@ -8,7 +8,6 @@ export interface TextIDef { spellcheck: false; } - export default class TextInput extends BaseInput { private readonly _text: string; @@ -28,5 +27,4 @@ export default class TextInput extends BaseInput { spellcheck: false }; } - } diff --git a/src/lib/utils/BlockGen/Inputs/ValueInput.ts b/src/lib/utils/BlockGen/Inputs/ValueInput.ts index 1962258..10364ca 100644 --- a/src/lib/utils/BlockGen/Inputs/ValueInput.ts +++ b/src/lib/utils/BlockGen/Inputs/ValueInput.ts @@ -46,5 +46,4 @@ export default class ValueInput extends BaseInput { result.check = [...filtered]; return result; } - } diff --git a/src/lib/utils/BlockGen/Mutators/AssemblerMutatorV2.ts b/src/lib/utils/BlockGen/Mutators/AssemblerMutatorV2.ts index 2493019..a52c057 100644 --- a/src/lib/utils/BlockGen/Mutators/AssemblerMutatorV2.ts +++ b/src/lib/utils/BlockGen/Mutators/AssemblerMutatorV2.ts @@ -1,259 +1,241 @@ -import type {AssemblerMutator} from "$lib/types/BlockDefinition"; +import type { AssemblerMutator } from "$lib/types/BlockDefinition"; import salt from "$lib/utils/helpers/salt"; import pkg from "blockly/javascript"; -import type {AdditionalSettings} from "./Mutator"; -import {Mutator} from "./Mutator"; -import Blockly, {Connection} from "blockly/core"; -import {MutatorType} from "$lib/enums/BlockTypes"; +import type { AdditionalSettings } from "./Mutator"; +import { Mutator } from "./Mutator"; +import Blockly, { Connection } from "blockly/core"; +import { MutatorType } from "$lib/enums/BlockTypes"; const { javascriptGenerator } = pkg; function orderListChanged(order1: string[], order2: string[]): boolean { - if(!(Array.isArray(order1) && Array.isArray(order2))) return false; - if(order1.length !== order2.length) return true; - for (let i = 0; i < order1.length; i++) { - if(order1[i] !== order2[i]) { - return true; - } - } - return false; + if (!(Array.isArray(order1) && Array.isArray(order2))) return false; + if (order1.length !== order2.length) return true; + for (let i = 0; i < order1.length; i++) { + if (order1[i] !== order2[i]) { + return true; + } + } + return false; } interface ClauseBlock extends Blockly.Block { - //input_type: Connection - connections_: {[key: string]: Connection} + //input_type: Connection + connections_: { [key: string]: Connection }; } -type ConnectionMap = {[key: string]: ConnectionMapConnection}; +type ConnectionMap = { [key: string]: ConnectionMapConnection }; interface ConnectionMapConnection { - connection: Connection, - input_name: string + connection: Connection; + input_name: string; } export default class AssemblerMutatorV2 extends Mutator { - //will store each properties name - private order: string[]; - private settings: AdditionalSettings | undefined; - constructor(containerBlockText: string, properties: AssemblerMutator[], settings?: AdditionalSettings) { - super(properties, containerBlockText, MutatorType.Assembler); - this.order = []; - this.mixin = this.getMixin(settings); - this.setBlocks = this.blocks; - this.settings = settings; - } - - get blocks(): string[] { - const arr: string[] = []; - for (const prop of super.properties as AssemblerMutator[]) { - arr.push(prop.block); - } - return arr; - } - - - getMixin(settings?: AdditionalSettings): object { - this.order = []; - const properties = super.properties as AssemblerMutator[]; - const propertieMap = Object.create(null); - const containerBlockName = salt(10); - const containerBlockText = super.containerBlockText; - let inputIndexMap: Map = new Map(); - // First we set the save and load states. - for(const prop of properties) { - propertieMap[prop.block] = prop; - } - console.log(settings) - Blockly.Blocks[containerBlockName] = { - init: function(this: Blockly.Block) { - this.jsonInit({ - type: containerBlockName, - message0: `${containerBlockText}`, - nextStatement: true, - - colour: settings?.color ?? 230, - tooltip: "Put blocks under the container block to modify the original block", - helpUrl: "" - }); - - } - }; - javascriptGenerator.forBlock[containerBlockName] = function() { - return ""; - }; - const mixin = { - //! Disable eslint cuz the state variable is of type any until they fully migrate to typescript - // eslint-disable-next-line - saveExtraState: function(this: any): object { - - const state = Object.create(null); - if(this.order) state["order"] = this.order; - return state; - }, - //! Disable eslint cuz the state variable is of type any until they fully migrate to typescript - // eslint-disable-next-line - loadExtraState: function (this: any, state: any): void { - // const oldOrder = this.order; - this.order = state["order"] ?? []; - /*if(orderListChanged(oldOrder, this.order)) */ - this.updateShape_(); - - }, - decompose: function(this: Blockly.Block, workspace: Blockly.WorkspaceSvg) { - - const containerBlock = workspace.newBlock(containerBlockName); - containerBlock.initSvg(); - // eslint-disable-next-line - const orders = (this as any).order as string[]; - // let connection = containerBlock.getInput("STACK")?.connection; - let connection = containerBlock.nextConnection; - if(orders) { - for(const order of orders) { - const block = workspace.newBlock(order); - block.initSvg(); - connection?.connect(block.previousConnection!); - connection = block.nextConnection!; - } - } - - - - return containerBlock; - - }, - // eslint-disable-next-line - compose: function(this: any, containerBlock: Blockly.Block) { - const connections: ConnectionMap= {}; - const oldOrder = this.order; - const order = []; - - // let itemBlock: ClauseBlock | null = containerBlock.getInputTargetBlock("STACK") as ClauseBlock | null; - // eslint-disable-next-line - let itemBlock = containerBlock.nextConnection!.targetBlock() as any; - - while(itemBlock) { - order.push(itemBlock.type); - if(itemBlock.connections_) { - for (const conStr of Object.keys(itemBlock.connections_)) { - connections[conStr] = { - connection: itemBlock.connections_[conStr], - input_name: itemBlock.type - }; - } - } - // connections.push(itemBlock.conne); - itemBlock = itemBlock.nextConnection && itemBlock.nextConnection.targetBlock() as ClauseBlock | null; - } - this.order = order; - if(orderListChanged(oldOrder, this.order)) this.updateShape_(); - this.reconnectChildBlocks_( - connections - ); - }, - // eslint-disable-next-line - updateShape_: function(this: any) { - - for (const inp of properties) { - for(const add of inp.adds) { - let i = 1; - let moreInputs = true; - while(moreInputs) { - const failed = !this.removeInput(add.name + i, true); - i++; - if(failed) moreInputs = false; - } - } - } - inputIndexMap = new Map(); - if(this.order) { - for (const order of this.order) { - const adds = propertieMap[order].adds; - for (const add of adds) { - inputIndexMap.set(add._name, (inputIndexMap.get(add.name)??0) + 1); - const name = add._name + inputIndexMap.get(add.name) ; - if (!this.getInput(name)) { - const input = add.generate(); - this.appendInput_(input, name, add.getField()); - } - - - } - - } - } - - - }, - reconnectChildBlocks_: function( - this: Blockly.Block, - connections: ConnectionMap, - - ) { - const count = new Map(); - for (const connectionKey in connections) { - const ConMap = connections[connectionKey]; - const property = propertieMap[ConMap.input_name]; - const connection = ConMap.connection; - if(!connection) continue; - for (const add of property.adds) { - const name = add.name; - const c = count.get(name) ?? 1; - connection.reconnect(this, name+c); - count.set(name, c+1); - - } - } - // for (let i = 1; i <= 10; i++) { - // connections[i]?.reconnect(this, 'IF' + i); - // } - }, - // eslint-disable-next-line - saveConnections: function(this: any, containerBlock: Blockly.Block) { - const count = new Map(); - //let clauseBlock = containerBlock.getInputTargetBlock("STACK") as ClauseBlock | null; - let clauseBlock = containerBlock as ClauseBlock | null; - - while(clauseBlock) { - if(clauseBlock.isInsertionMarker()) { - clauseBlock = clauseBlock.getNextBlock() as ClauseBlock | null; - continue; - } - clauseBlock.connections_ = {}; - //count - const c = count.get(clauseBlock.type) ?? 1; - const prop = propertieMap[clauseBlock.type]; - if(prop) { - for(const add of prop.adds) { - const inp = this.getInput(add._name + c); - if(inp) { - - clauseBlock.connections_[add._name + c] = inp && inp.connection!.targetConnection; - count.set(clauseBlock.type, c+1); - } - } - } - - clauseBlock = clauseBlock.getNextBlock() as ClauseBlock | null; - } - - }, - appendInput_: function(this: Blockly.Block, input, name, fieldText) { - const inputType = input.type || "input_value"; // Default to input_value if type is not specified - const inputCheck = input.check; // Check for input type if specified - - switch (inputType) { - case "input_value": - this.appendValueInput(name).setCheck(inputCheck).appendField(fieldText); - break; - case "input_statement": - this.appendStatementInput(name).setCheck(inputCheck).appendField(fieldText); - break; - case "input_dummy": - this.appendDummyInput(name).appendField(fieldText); - break; - default: - throw new Error(`Unsupported input type: ${inputType}`); - } - } - - }; - - return mixin; - } + //will store each properties name + private order: string[]; + private settings: AdditionalSettings | undefined; + constructor( + containerBlockText: string, + properties: AssemblerMutator[], + settings?: AdditionalSettings + ) { + super(properties, containerBlockText, MutatorType.Assembler); + this.order = []; + this.mixin = this.getMixin(settings); + this.setBlocks = this.blocks; + this.settings = settings; + } + + get blocks(): string[] { + const arr: string[] = []; + for (const prop of super.properties as AssemblerMutator[]) { + arr.push(prop.block); + } + return arr; + } + + getMixin(settings?: AdditionalSettings): object { + this.order = []; + const properties = super.properties as AssemblerMutator[]; + const propertieMap = Object.create(null); + const containerBlockName = salt(10); + const containerBlockText = super.containerBlockText; + let inputIndexMap: Map = new Map(); + // First we set the save and load states. + for (const prop of properties) { + propertieMap[prop.block] = prop; + } + console.log(settings); + Blockly.Blocks[containerBlockName] = { + init: function(this: Blockly.Block) { + this.jsonInit({ + type: containerBlockName, + message0: `${containerBlockText}`, + nextStatement: true, + + colour: settings?.color ?? 230, + tooltip: "Put blocks under the container block to modify the original block", + helpUrl: "" + }); + } + }; + javascriptGenerator.forBlock[containerBlockName] = function() { + return ""; + }; + const mixin = { + //! Disable eslint cuz the state variable is of type any until they fully migrate to typescript + // eslint-disable-next-line + saveExtraState: function (this: any): object { + const state = Object.create(null); + if (this.order) state["order"] = this.order; + return state; + }, + //! Disable eslint cuz the state variable is of type any until they fully migrate to typescript + // eslint-disable-next-line + loadExtraState: function (this: any, state: any): void { + // const oldOrder = this.order; + this.order = state["order"] ?? []; + /*if(orderListChanged(oldOrder, this.order)) */ + this.updateShape_(); + }, + decompose: function(this: Blockly.Block, workspace: Blockly.WorkspaceSvg) { + const containerBlock = workspace.newBlock(containerBlockName); + containerBlock.initSvg(); + // eslint-disable-next-line + const orders = (this as any).order as string[]; + // let connection = containerBlock.getInput("STACK")?.connection; + let connection = containerBlock.nextConnection; + if (orders) { + for (const order of orders) { + const block = workspace.newBlock(order); + block.initSvg(); + connection?.connect(block.previousConnection!); + connection = block.nextConnection!; + } + } + + return containerBlock; + }, + // eslint-disable-next-line + compose: function (this: any, containerBlock: Blockly.Block) { + const connections: ConnectionMap = {}; + const oldOrder = this.order; + const order = []; + + // let itemBlock: ClauseBlock | null = containerBlock.getInputTargetBlock("STACK") as ClauseBlock | null; + // eslint-disable-next-line + let itemBlock = containerBlock.nextConnection!.targetBlock() as any; + + while (itemBlock) { + order.push(itemBlock.type); + if (itemBlock.connections_) { + for (const conStr of Object.keys(itemBlock.connections_)) { + connections[conStr] = { + connection: itemBlock.connections_[conStr], + input_name: itemBlock.type + }; + } + } + // connections.push(itemBlock.conne); + itemBlock = + itemBlock.nextConnection && + (itemBlock.nextConnection.targetBlock() as ClauseBlock | null); + } + this.order = order; + if (orderListChanged(oldOrder, this.order)) this.updateShape_(); + this.reconnectChildBlocks_(connections); + }, + // eslint-disable-next-line + updateShape_: function (this: any) { + for (const inp of properties) { + for (const add of inp.adds) { + let i = 1; + let moreInputs = true; + while (moreInputs) { + const failed = !this.removeInput(add.name + i, true); + i++; + if (failed) moreInputs = false; + } + } + } + inputIndexMap = new Map(); + if (this.order) { + for (const order of this.order) { + const adds = propertieMap[order].adds; + for (const add of adds) { + inputIndexMap.set(add._name, (inputIndexMap.get(add.name) ?? 0) + 1); + const name = add._name + inputIndexMap.get(add.name); + if (!this.getInput(name)) { + const input = add.generate(); + this.appendInput_(input, name, add.getField()); + } + } + } + } + }, + reconnectChildBlocks_: function(this: Blockly.Block, connections: ConnectionMap) { + const count = new Map(); + for (const connectionKey in connections) { + const ConMap = connections[connectionKey]; + const property = propertieMap[ConMap.input_name]; + const connection = ConMap.connection; + if (!connection) continue; + for (const add of property.adds) { + const name = add.name; + const c = count.get(name) ?? 1; + connection.reconnect(this, name + c); + count.set(name, c + 1); + } + } + // for (let i = 1; i <= 10; i++) { + // connections[i]?.reconnect(this, 'IF' + i); + // } + }, + // eslint-disable-next-line + saveConnections: function (this: any, containerBlock: Blockly.Block) { + const count = new Map(); + //let clauseBlock = containerBlock.getInputTargetBlock("STACK") as ClauseBlock | null; + let clauseBlock = containerBlock as ClauseBlock | null; + + while (clauseBlock) { + if (clauseBlock.isInsertionMarker()) { + clauseBlock = clauseBlock.getNextBlock() as ClauseBlock | null; + continue; + } + clauseBlock.connections_ = {}; + //count + const c = count.get(clauseBlock.type) ?? 1; + const prop = propertieMap[clauseBlock.type]; + if (prop) { + for (const add of prop.adds) { + const inp = this.getInput(add._name + c); + if (inp) { + clauseBlock.connections_[add._name + c] = inp && inp.connection!.targetConnection; + count.set(clauseBlock.type, c + 1); + } + } + } + + clauseBlock = clauseBlock.getNextBlock() as ClauseBlock | null; + } + }, + appendInput_: function(this: Blockly.Block, input, name, fieldText) { + const inputType = input.type || "input_value"; // Default to input_value if type is not specified + const inputCheck = input.check; // Check for input type if specified + + switch (inputType) { + case "input_value": + this.appendValueInput(name).setCheck(inputCheck).appendField(fieldText); + break; + case "input_statement": + this.appendStatementInput(name).setCheck(inputCheck).appendField(fieldText); + break; + case "input_dummy": + this.appendDummyInput(name).appendField(fieldText); + break; + default: + throw new Error(`Unsupported input type: ${inputType}`); + } + } + }; + + return mixin; + } } diff --git a/src/lib/utils/BlockGen/Mutators/CheckboxMutator.ts b/src/lib/utils/BlockGen/Mutators/CheckboxMutator.ts index aae344f..695d9e2 100644 --- a/src/lib/utils/BlockGen/Mutators/CheckboxMutator.ts +++ b/src/lib/utils/BlockGen/Mutators/CheckboxMutator.ts @@ -1,23 +1,28 @@ -import {Mutator} from "./Mutator"; -import type {AdditionalSettings} from "./Mutator"; +import { Mutator } from "./Mutator"; +import type { AdditionalSettings } from "./Mutator"; -import type {CheckBoxMutatorBlock} from "$lib/types/BlockDefinition"; +import type { CheckBoxMutatorBlock } from "$lib/types/BlockDefinition"; import salt from "$lib/utils/helpers/salt"; -import Blockly, {Connection} from "blockly/core"; +// eslint-disable-next-line @typescript-eslint/no-unused-vars +import Blockly, { Connection } from "blockly/core"; import pkg from "blockly/javascript"; -import {MutatorType} from "$lib/enums/BlockTypes"; +import { MutatorType } from "$lib/enums/BlockTypes"; const { javascriptGenerator } = pkg; interface ClauseBlock extends Blockly.Block { //input_type: Connection - connections_: { [p: string]: Blockly.Connection } + connections_: { [p: string]: Blockly.Connection }; } -type ConnectionMap = {[key: string]: Blockly.Connection}; +type ConnectionMap = { [key: string]: Blockly.Connection }; export default class CheckboxMutator extends Mutator { private settings: AdditionalSettings | undefined; - constructor(containerBlockText: string, properties: CheckBoxMutatorBlock[], settings?: AdditionalSettings) { + constructor( + containerBlockText: string, + properties: CheckBoxMutatorBlock[], + settings?: AdditionalSettings + ) { super(properties, containerBlockText, MutatorType.Checkbox); this.settings = settings; @@ -36,14 +41,14 @@ export default class CheckboxMutator extends Mutator { const properties = super.properties as CheckBoxMutatorBlock[]; const propertieMap: Record = {}; - for(const prop of properties) { + for (const prop of properties) { propertieMap[prop.inputName] = prop; } const containerBlockName = salt(10); const containerBlockText = super.containerBlockText; const inputData: boolean[] = []; const fieldData: string[] = []; - for(const prop of properties) { + for (const prop of properties) { fieldData.push(prop.inputName); inputData.push(!!prop.defaultValue); } @@ -53,12 +58,10 @@ export default class CheckboxMutator extends Mutator { type: containerBlockName, message0: `${containerBlockText}`, - colour: settings?.color ?? 230, tooltip: "", helpUrl: "" }); - } }; javascriptGenerator.forBlock[containerBlockName] = function() { @@ -69,8 +72,7 @@ export default class CheckboxMutator extends Mutator { fields_: fieldData, //! Disable eslint cuz the state variable is of type any until they fully migrate to typescript // eslint-disable-next-line - saveExtraState: function(this: any): object { - + saveExtraState: function (this: any): object { if (!this.inputs_ || this.inputs_.length === 0) return {}; const state = Object.create(null); if (this.inputs_ && this.fields_) { @@ -87,24 +89,27 @@ export default class CheckboxMutator extends Mutator { this.inputs_[i] = state[this.fields_[i]] ?? false; } this.updateShape_(); - }, // eslint-disable-next-line - decompose: function(this: any, workspace: Blockly.WorkspaceSvg) { + decompose: function (this: any, workspace: Blockly.WorkspaceSvg) { const containerBlock = workspace.newBlock(containerBlockName); - for (let i= 0; iCreate - \ No newline at end of file + From 06bb44d5c88abe54b9ea74b86999caccd0f20327 Mon Sep 17 00:00:00 2001 From: LimeNade Date: Sat, 20 Apr 2024 20:28:38 +0200 Subject: [PATCH 06/11] Feat: Removed AsMu V1 -> V2 --- src/lib/blocks/Javascript/logic.ts | 2 +- src/lib/blocks/Javascript/text.ts | 2 +- .../BlockGen/Mutators/AssemblerMutator.ts | 463 +++++++++--------- .../BlockGen/Mutators/AssemblerMutatorV2.ts | 241 --------- src/lib/utils/BlockGen/Mutators/Mutator.ts | 1 + 5 files changed, 244 insertions(+), 465 deletions(-) delete mode 100644 src/lib/utils/BlockGen/Mutators/AssemblerMutatorV2.ts diff --git a/src/lib/blocks/Javascript/logic.ts b/src/lib/blocks/Javascript/logic.ts index 335c42b..1f7583d 100644 --- a/src/lib/blocks/Javascript/logic.ts +++ b/src/lib/blocks/Javascript/logic.ts @@ -8,7 +8,7 @@ import ValueInput from "$lib/utils/BlockGen/Inputs/ValueInput"; import Warning from "$lib/utils/BlockGen/Warnings/Warning"; import rgbToHex from "$lib/utils/helpers/rgbToHex"; import StatementInput from "$lib/utils/BlockGen/Inputs/StatementInput"; -import AssemblerMutatorV2 from "$lib/utils/BlockGen/Mutators/AssemblerMutatorV2"; +import AssemblerMutatorV2 from "$lib/utils/BlockGen/Mutators/AssemblerMutator"; const blocks: BlockDefinition[] = [ { diff --git a/src/lib/blocks/Javascript/text.ts b/src/lib/blocks/Javascript/text.ts index 18ea2fc..15fabf8 100644 --- a/src/lib/blocks/Javascript/text.ts +++ b/src/lib/blocks/Javascript/text.ts @@ -6,7 +6,7 @@ import ValueInput from "$lib/utils/BlockGen/Inputs/ValueInput"; import Placeholder from "$lib/utils/ToolboxGen/Placeholder"; import StatementInput from "$lib/utils/BlockGen/Inputs/StatementInput"; import Dropdown from "$lib/utils/BlockGen/Inputs/Dropdown"; -import AssemblerMutatorV2 from "$lib/utils/BlockGen/Mutators/AssemblerMutatorV2"; +import AssemblerMutatorV2 from "$lib/utils/BlockGen/Mutators/AssemblerMutator"; const blocks: BlockDefinition[] = [ { diff --git a/src/lib/utils/BlockGen/Mutators/AssemblerMutator.ts b/src/lib/utils/BlockGen/Mutators/AssemblerMutator.ts index 615939e..d43b839 100644 --- a/src/lib/utils/BlockGen/Mutators/AssemblerMutator.ts +++ b/src/lib/utils/BlockGen/Mutators/AssemblerMutator.ts @@ -1,222 +1,241 @@ -// import type { MutatorBlock } from "$lib/types/BlockDefinition"; -// import salt from "$lib/utils/helpers/salt"; -// import pkg from "blockly/javascript"; -// const { javascriptGenerator } = pkg; -// import {Mutator} from "./Mutator"; -// import Blockly from "blockly/core"; -// -// export default class AssemblerMutator extends Mutator { -// -// -// constructor(containerBlockText: string, properties: MutatorBlock[]) { -// super(properties, containerBlockText); -// this.mixin = this.getMixin(); -// this.setBlocks = this.blocks; -// } -// -// get blocks(): string[] { -// return super.properties.map((val) => val.block); -// } -// -// getMixin(): object { -// const properties = super.properties; -// const containerBlockName = salt(10); -// const containerBlockText = super.containerBlockText; -// const extraStateObj: Record = {}; -// -// // First we set the save and load states. -// const mixin = { -// -// saveExtraState: function(this: any): object { -// -// for (const mutatorProp of properties) { -// extraStateObj[mutatorProp.block] = this[`${mutatorProp.block}_count_`]; -// } -// return extraStateObj; -// }, -// //! Disable eslint cuz the state variable is of type any until they fully migrate to typescript -// // eslint-disable-next-line -// loadExtraState: function (this: any, state: any): void { -// for (const mutatorProp of properties) { -// this[`${mutatorProp.block}_count_`] = state[mutatorProp.block]; -// } -// this.updateShape_(); -// }, -// -// decompose: function(this: any, workspace: Blockly.WorkspaceSvg) { -// -// Blockly.Blocks[containerBlockName] = { -// init: function(this: Blockly.Block) { -// this.jsonInit({ -// type: containerBlockName, -// message0: `${containerBlockText}\n %1`, -// args0: [ -// { -// type: "input_statement", -// name: "STACK" -// } -// ], -// colour: 230, -// tooltip: "Put blocks inside of the container block to modify the original block", -// helpUrl: "" -// }); -// } -// }; -// javascriptGenerator.forBlock[containerBlockName] = function() { -// return ""; -// }; -// -// const containerBlock = workspace.newBlock(containerBlockName); -// containerBlock.initSvg(); -// -// let connection = containerBlock.getInput("STACK")?.connection; -// for (const key in extraStateObj) { -// for (let i = 0; i < this[`${key}_count_`]; i++) { -// const blockToAdd: string = key; -// -// const itemBlock = workspace.newBlock(blockToAdd); -// itemBlock.initSvg(); -// connection?.connect(itemBlock.previousConnection); -// connection = itemBlock.nextConnection; -// } -// } -// -// return containerBlock; -// }, -// -// -// // eslint-disable-next-line -// compose: function (this: any, containerBlock: Blockly.Block) { -// -// const workspaceBlocks = []; -// let itemBlock = containerBlock.getInputTargetBlock("STACK"); -// // Iterate over each child block in the mutator workspace and add it to the array -// while (itemBlock) { -// workspaceBlocks.push(itemBlock); -// itemBlock = itemBlock.nextConnection && itemBlock.nextConnection.targetBlock(); -// } -// // Update the shape of the original block based on the number of child blocks -// for (const mutatorProp of properties) { -// const blockCount = workspaceBlocks.filter( -// (block) => block.type === mutatorProp.block -// ).length; -// this[`${mutatorProp.block}_count_`] = blockCount; -// } -// this.updateShape_(); -// }, -// updateShape_: function(this: Blockly.Block) { -// // Iterate over each MutatorBlock defined in the properties array -// for (let i = 0; i < properties.length; i++) { -// // @ts-expect-error MutatorProp is type is "any" -// const blockCount = this[`${mutatorProp.block}_count_`]; -// if (blockCount > 0) { -// // Determine the number of items in the adds array for the current MutatorBlock -// -// // Add inputs for each block count -// for (let j = 0; j < blockCount; j++) { -// // @ts-expect-error MutatorProp is type is "any" -// const inputName = mutatorProp.block + j; -// // @ts-expect-error MutatorProp is type is "any" -// const addsLength = mutatorProp.adds.length; -// -// if (!this.getInput(inputName)) { -// // Get the input index by taking the modulo of j with the length of the adds array -// const addsIndex = j % addsLength; -// // Generate input definition from the corresponding adds item -// // @ts-expect-error MutatorProp is type is "any" -// const input = mutatorProp.adds[addsIndex].generate(); -// // Append the input to the block -// // @ts-expect-error Undefined blockly type for the private function -// this.appendInput_(input, inputName); -// } -// } -// } else { -// // If there are no child blocks, remove all inputs for this type -// let j = 0; -// // @ts-expect-error MutatorProp is type is "any" -// while (this.getInput(mutatorProp.block + j)) { -// // @ts-expect-error MutatorProp is type is "any" -// this.removeInput(mutatorProp.block + j); -// j++; -// } -// } -// -// // If 'once' is true, disable adding more blocks of this type -// // @ts-expect-error MutatorProp is type is "any" -// if (mutatorProp.once && blockCount > 0) { -// // @ts-expect-error MutatorProp is type is "any" -// this.getInput(mutatorProp.block + (blockCount - 1)).setCheck(null); -// } -// -// // Break if we have reached the end of the properties array -// if (i + 1 >= properties.length) { -// break; -// } -// -// // Continue adding inputs for the next MutatorBlock -// const nextMutatorProp = properties[i + 1]; -// // @ts-expect-error nextMutatorProp is type is "any" -// const nextBlockCount = this[`${nextMutatorProp.block}_count_`]; -// if (nextBlockCount > 0) { -// // Determine the number of items in the adds array for the next MutatorBlock -// const nextAddsLength = nextMutatorProp.adds.length; -// // Add inputs for each block count -// for (let k = 0; k < nextBlockCount; k++) { -// const nextInputName = nextMutatorProp.block + k; -// if (!this.getInput(nextInputName)) { -// // Get the input index by taking the modulo of k with the length of the adds array -// const nextAddsIndex = k % nextAddsLength; -// // Generate input definition from the corresponding adds item -// const nextInput = nextMutatorProp.adds[nextAddsIndex].generate(); -// // Append the input to the block -// // @ts-expect-error Undefined blockly type for the private function -// this.appendInput_(nextInput, nextInputName); -// } -// } -// } else { -// // If there are no child blocks, remove all inputs for this type -// let k = 0; -// while (this.getInput(nextMutatorProp.block + k)) { -// this.removeInput(nextMutatorProp.block + k); -// k++; -// } -// } -// -// // If 'once' is true, disable adding more blocks of this type -// if (nextMutatorProp.once && nextBlockCount > 0) { -// // @ts-expect-error MutatorProp is type is "any" -// this.getInput(nextMutatorProp.block + (nextBlockCount - 1)).setCheck(null); -// } -// } -// }, -// -// /** -// * Append a Blockly input to the block -// * @param {object} input - Input definition -// * @param {string} name - Name of the input -// * @private -// */ -// // eslint-disable-next-line -// appendInput_: function (this: Blockly.Block, input: any, name: any) { -// const inputType = input.type || "input_value"; // Default to input_value if type is not specified -// const inputCheck = input.check; // Check for input type if specified -// -// switch (inputType) { -// case "input_value": -// this.appendValueInput(name).setCheck(inputCheck); -// break; -// case "input_statement": -// this.appendStatementInput(name).setCheck(inputCheck); -// break; -// case "input_dummy": -// this.appendDummyInput(name); -// break; -// default: -// throw new Error(`Unsupported input type: ${inputType}`); -// } -// } -// }; -// -// return mixin; -// } -// } +import type { AssemblerMutator as AssemblerMutatorType } from "$lib/types/BlockDefinition"; +import salt from "$lib/utils/helpers/salt"; +import pkg from "blockly/javascript"; +import type { AdditionalSettings } from "./Mutator"; +import { Mutator } from "./Mutator"; +import Blockly, { Connection } from "blockly/core"; +import { MutatorType } from "$lib/enums/BlockTypes"; + +const { javascriptGenerator } = pkg; + +function orderListChanged(order1: string[], order2: string[]): boolean { + if (!(Array.isArray(order1) && Array.isArray(order2))) return false; + if (order1.length !== order2.length) return true; + for (let i = 0; i < order1.length; i++) { + if (order1[i] !== order2[i]) { + return true; + } + } + return false; +} +interface ClauseBlock extends Blockly.Block { + //input_type: Connection + connections_: { [key: string]: Connection }; +} +type ConnectionMap = { [key: string]: ConnectionMapConnection }; +interface ConnectionMapConnection { + connection: Connection; + input_name: string; +} +export default class AssemblerMutator extends Mutator { + //will store each properties name + private order: string[]; + private settings: AdditionalSettings | undefined; + constructor( + containerBlockText: string, + properties: AssemblerMutatorType[], + settings?: AdditionalSettings + ) { + super(properties, containerBlockText, MutatorType.Assembler); + this.order = []; + this.mixin = this.getMixin(settings); + this.setBlocks = this.blocks; + this.settings = settings; + } + + get blocks(): string[] { + const arr: string[] = []; + for (const prop of super.properties as AssemblerMutatorType[]) { + arr.push(prop.block); + } + return arr; + } + + getMixin(settings?: AdditionalSettings): object { + this.order = []; + const properties = super.properties as AssemblerMutatorType[]; + const propertieMap = Object.create(null); + const containerBlockName = salt(10); + const containerBlockText = super.containerBlockText; + let inputIndexMap: Map = new Map(); + // First we set the save and load states. + for (const prop of properties) { + propertieMap[prop.block] = prop; + } + console.log(settings); + Blockly.Blocks[containerBlockName] = { + init: function(this: Blockly.Block) { + this.jsonInit({ + type: containerBlockName, + message0: `${containerBlockText}`, + nextStatement: true, + + colour: settings?.color ?? 230, + tooltip: "Put blocks under the container block to modify the original block", + helpUrl: "" + }); + } + }; + javascriptGenerator.forBlock[containerBlockName] = function() { + return ""; + }; + const mixin = { + //! Disable eslint cuz the state variable is of type any until they fully migrate to typescript + // eslint-disable-next-line + saveExtraState: function (this: any): object { + const state = Object.create(null); + if (this.order) state["order"] = this.order; + return state; + }, + //! Disable eslint cuz the state variable is of type any until they fully migrate to typescript + // eslint-disable-next-line + loadExtraState: function (this: any, state: any): void { + // const oldOrder = this.order; + this.order = state["order"] ?? []; + /*if(orderListChanged(oldOrder, this.order)) */ + this.updateShape_(); + }, + decompose: function(this: Blockly.Block, workspace: Blockly.WorkspaceSvg) { + const containerBlock = workspace.newBlock(containerBlockName); + containerBlock.initSvg(); + // eslint-disable-next-line + const orders = (this as any).order as string[]; + // let connection = containerBlock.getInput("STACK")?.connection; + let connection = containerBlock.nextConnection; + if (orders) { + for (const order of orders) { + const block = workspace.newBlock(order); + block.initSvg(); + connection?.connect(block.previousConnection!); + connection = block.nextConnection!; + } + } + + return containerBlock; + }, + // eslint-disable-next-line + compose: function (this: any, containerBlock: Blockly.Block) { + const connections: ConnectionMap = {}; + const oldOrder = this.order; + const order = []; + + // let itemBlock: ClauseBlock | null = containerBlock.getInputTargetBlock("STACK") as ClauseBlock | null; + // eslint-disable-next-line + let itemBlock = containerBlock.nextConnection!.targetBlock() as any; + + while (itemBlock) { + order.push(itemBlock.type); + if (itemBlock.connections_) { + for (const conStr of Object.keys(itemBlock.connections_)) { + connections[conStr] = { + connection: itemBlock.connections_[conStr], + input_name: itemBlock.type + }; + } + } + // connections.push(itemBlock.conne); + itemBlock = + itemBlock.nextConnection && + (itemBlock.nextConnection.targetBlock() as ClauseBlock | null); + } + this.order = order; + if (orderListChanged(oldOrder, this.order)) this.updateShape_(); + this.reconnectChildBlocks_(connections); + }, + // eslint-disable-next-line + updateShape_: function (this: any) { + for (const inp of properties) { + for (const add of inp.adds) { + let i = 1; + let moreInputs = true; + while (moreInputs) { + const failed = !this.removeInput(add.name + i, true); + i++; + if (failed) moreInputs = false; + } + } + } + inputIndexMap = new Map(); + if (this.order) { + for (const order of this.order) { + const adds = propertieMap[order].adds; + for (const add of adds) { + inputIndexMap.set(add._name, (inputIndexMap.get(add.name) ?? 0) + 1); + const name = add._name + inputIndexMap.get(add.name); + if (!this.getInput(name)) { + const input = add.generate(); + this.appendInput_(input, name, add.getField()); + } + } + } + } + }, + reconnectChildBlocks_: function(this: Blockly.Block, connections: ConnectionMap) { + const count = new Map(); + for (const connectionKey in connections) { + const ConMap = connections[connectionKey]; + const property = propertieMap[ConMap.input_name]; + const connection = ConMap.connection; + if (!connection) continue; + for (const add of property.adds) { + const name = add.name; + const c = count.get(name) ?? 1; + connection.reconnect(this, name + c); + count.set(name, c + 1); + } + } + // for (let i = 1; i <= 10; i++) { + // connections[i]?.reconnect(this, 'IF' + i); + // } + }, + // eslint-disable-next-line + saveConnections: function (this: any, containerBlock: Blockly.Block) { + const count = new Map(); + //let clauseBlock = containerBlock.getInputTargetBlock("STACK") as ClauseBlock | null; + let clauseBlock = containerBlock as ClauseBlock | null; + + while (clauseBlock) { + if (clauseBlock.isInsertionMarker()) { + clauseBlock = clauseBlock.getNextBlock() as ClauseBlock | null; + continue; + } + clauseBlock.connections_ = {}; + //count + const c = count.get(clauseBlock.type) ?? 1; + const prop = propertieMap[clauseBlock.type]; + if (prop) { + for (const add of prop.adds) { + const inp = this.getInput(add._name + c); + if (inp) { + clauseBlock.connections_[add._name + c] = inp && inp.connection!.targetConnection; + count.set(clauseBlock.type, c + 1); + } + } + } + + clauseBlock = clauseBlock.getNextBlock() as ClauseBlock | null; + } + }, + appendInput_: function(this: Blockly.Block, input, name, fieldText) { + const inputType = input.type || "input_value"; // Default to input_value if type is not specified + const inputCheck = input.check; // Check for input type if specified + + switch (inputType) { + case "input_value": + this.appendValueInput(name).setCheck(inputCheck).appendField(fieldText); + break; + case "input_statement": + this.appendStatementInput(name).setCheck(inputCheck).appendField(fieldText); + break; + case "input_dummy": + this.appendDummyInput(name).appendField(fieldText); + break; + default: + throw new Error(`Unsupported input type: ${inputType}`); + } + } + }; + + return mixin; + } +} diff --git a/src/lib/utils/BlockGen/Mutators/AssemblerMutatorV2.ts b/src/lib/utils/BlockGen/Mutators/AssemblerMutatorV2.ts deleted file mode 100644 index a52c057..0000000 --- a/src/lib/utils/BlockGen/Mutators/AssemblerMutatorV2.ts +++ /dev/null @@ -1,241 +0,0 @@ -import type { AssemblerMutator } from "$lib/types/BlockDefinition"; -import salt from "$lib/utils/helpers/salt"; -import pkg from "blockly/javascript"; -import type { AdditionalSettings } from "./Mutator"; -import { Mutator } from "./Mutator"; -import Blockly, { Connection } from "blockly/core"; -import { MutatorType } from "$lib/enums/BlockTypes"; - -const { javascriptGenerator } = pkg; - -function orderListChanged(order1: string[], order2: string[]): boolean { - if (!(Array.isArray(order1) && Array.isArray(order2))) return false; - if (order1.length !== order2.length) return true; - for (let i = 0; i < order1.length; i++) { - if (order1[i] !== order2[i]) { - return true; - } - } - return false; -} -interface ClauseBlock extends Blockly.Block { - //input_type: Connection - connections_: { [key: string]: Connection }; -} -type ConnectionMap = { [key: string]: ConnectionMapConnection }; -interface ConnectionMapConnection { - connection: Connection; - input_name: string; -} -export default class AssemblerMutatorV2 extends Mutator { - //will store each properties name - private order: string[]; - private settings: AdditionalSettings | undefined; - constructor( - containerBlockText: string, - properties: AssemblerMutator[], - settings?: AdditionalSettings - ) { - super(properties, containerBlockText, MutatorType.Assembler); - this.order = []; - this.mixin = this.getMixin(settings); - this.setBlocks = this.blocks; - this.settings = settings; - } - - get blocks(): string[] { - const arr: string[] = []; - for (const prop of super.properties as AssemblerMutator[]) { - arr.push(prop.block); - } - return arr; - } - - getMixin(settings?: AdditionalSettings): object { - this.order = []; - const properties = super.properties as AssemblerMutator[]; - const propertieMap = Object.create(null); - const containerBlockName = salt(10); - const containerBlockText = super.containerBlockText; - let inputIndexMap: Map = new Map(); - // First we set the save and load states. - for (const prop of properties) { - propertieMap[prop.block] = prop; - } - console.log(settings); - Blockly.Blocks[containerBlockName] = { - init: function(this: Blockly.Block) { - this.jsonInit({ - type: containerBlockName, - message0: `${containerBlockText}`, - nextStatement: true, - - colour: settings?.color ?? 230, - tooltip: "Put blocks under the container block to modify the original block", - helpUrl: "" - }); - } - }; - javascriptGenerator.forBlock[containerBlockName] = function() { - return ""; - }; - const mixin = { - //! Disable eslint cuz the state variable is of type any until they fully migrate to typescript - // eslint-disable-next-line - saveExtraState: function (this: any): object { - const state = Object.create(null); - if (this.order) state["order"] = this.order; - return state; - }, - //! Disable eslint cuz the state variable is of type any until they fully migrate to typescript - // eslint-disable-next-line - loadExtraState: function (this: any, state: any): void { - // const oldOrder = this.order; - this.order = state["order"] ?? []; - /*if(orderListChanged(oldOrder, this.order)) */ - this.updateShape_(); - }, - decompose: function(this: Blockly.Block, workspace: Blockly.WorkspaceSvg) { - const containerBlock = workspace.newBlock(containerBlockName); - containerBlock.initSvg(); - // eslint-disable-next-line - const orders = (this as any).order as string[]; - // let connection = containerBlock.getInput("STACK")?.connection; - let connection = containerBlock.nextConnection; - if (orders) { - for (const order of orders) { - const block = workspace.newBlock(order); - block.initSvg(); - connection?.connect(block.previousConnection!); - connection = block.nextConnection!; - } - } - - return containerBlock; - }, - // eslint-disable-next-line - compose: function (this: any, containerBlock: Blockly.Block) { - const connections: ConnectionMap = {}; - const oldOrder = this.order; - const order = []; - - // let itemBlock: ClauseBlock | null = containerBlock.getInputTargetBlock("STACK") as ClauseBlock | null; - // eslint-disable-next-line - let itemBlock = containerBlock.nextConnection!.targetBlock() as any; - - while (itemBlock) { - order.push(itemBlock.type); - if (itemBlock.connections_) { - for (const conStr of Object.keys(itemBlock.connections_)) { - connections[conStr] = { - connection: itemBlock.connections_[conStr], - input_name: itemBlock.type - }; - } - } - // connections.push(itemBlock.conne); - itemBlock = - itemBlock.nextConnection && - (itemBlock.nextConnection.targetBlock() as ClauseBlock | null); - } - this.order = order; - if (orderListChanged(oldOrder, this.order)) this.updateShape_(); - this.reconnectChildBlocks_(connections); - }, - // eslint-disable-next-line - updateShape_: function (this: any) { - for (const inp of properties) { - for (const add of inp.adds) { - let i = 1; - let moreInputs = true; - while (moreInputs) { - const failed = !this.removeInput(add.name + i, true); - i++; - if (failed) moreInputs = false; - } - } - } - inputIndexMap = new Map(); - if (this.order) { - for (const order of this.order) { - const adds = propertieMap[order].adds; - for (const add of adds) { - inputIndexMap.set(add._name, (inputIndexMap.get(add.name) ?? 0) + 1); - const name = add._name + inputIndexMap.get(add.name); - if (!this.getInput(name)) { - const input = add.generate(); - this.appendInput_(input, name, add.getField()); - } - } - } - } - }, - reconnectChildBlocks_: function(this: Blockly.Block, connections: ConnectionMap) { - const count = new Map(); - for (const connectionKey in connections) { - const ConMap = connections[connectionKey]; - const property = propertieMap[ConMap.input_name]; - const connection = ConMap.connection; - if (!connection) continue; - for (const add of property.adds) { - const name = add.name; - const c = count.get(name) ?? 1; - connection.reconnect(this, name + c); - count.set(name, c + 1); - } - } - // for (let i = 1; i <= 10; i++) { - // connections[i]?.reconnect(this, 'IF' + i); - // } - }, - // eslint-disable-next-line - saveConnections: function (this: any, containerBlock: Blockly.Block) { - const count = new Map(); - //let clauseBlock = containerBlock.getInputTargetBlock("STACK") as ClauseBlock | null; - let clauseBlock = containerBlock as ClauseBlock | null; - - while (clauseBlock) { - if (clauseBlock.isInsertionMarker()) { - clauseBlock = clauseBlock.getNextBlock() as ClauseBlock | null; - continue; - } - clauseBlock.connections_ = {}; - //count - const c = count.get(clauseBlock.type) ?? 1; - const prop = propertieMap[clauseBlock.type]; - if (prop) { - for (const add of prop.adds) { - const inp = this.getInput(add._name + c); - if (inp) { - clauseBlock.connections_[add._name + c] = inp && inp.connection!.targetConnection; - count.set(clauseBlock.type, c + 1); - } - } - } - - clauseBlock = clauseBlock.getNextBlock() as ClauseBlock | null; - } - }, - appendInput_: function(this: Blockly.Block, input, name, fieldText) { - const inputType = input.type || "input_value"; // Default to input_value if type is not specified - const inputCheck = input.check; // Check for input type if specified - - switch (inputType) { - case "input_value": - this.appendValueInput(name).setCheck(inputCheck).appendField(fieldText); - break; - case "input_statement": - this.appendStatementInput(name).setCheck(inputCheck).appendField(fieldText); - break; - case "input_dummy": - this.appendDummyInput(name).appendField(fieldText); - break; - default: - throw new Error(`Unsupported input type: ${inputType}`); - } - } - }; - - return mixin; - } -} diff --git a/src/lib/utils/BlockGen/Mutators/Mutator.ts b/src/lib/utils/BlockGen/Mutators/Mutator.ts index 6ffd29c..996ed47 100644 --- a/src/lib/utils/BlockGen/Mutators/Mutator.ts +++ b/src/lib/utils/BlockGen/Mutators/Mutator.ts @@ -12,6 +12,7 @@ export class Mutator { private _blocks: string[] | undefined; private _helperFunction: (() => void) | undefined; private mutatorType: MutatorType; + constructor(properties: MutatorBlock[], containerBlockText: string, mutatorType: MutatorType) { this._properties = properties; this._containerBlockText = containerBlockText; From 5517252136de38966692137052a14a16f48bb4b6 Mon Sep 17 00:00:00 2001 From: LimeNade Date: Sun, 21 Apr 2024 13:10:30 +0200 Subject: [PATCH 07/11] Feat: Better Tooltips + Remove logs Also Fixed dynamic inputs code generation bug. Still not fixed: Dynamic inputs breaking toolbox reopen --- src/lib/blocks/Javascript/Loops.ts | 6 +-- src/lib/blocks/Javascript/logic.ts | 32 ++++++-------- src/lib/blocks/Javascript/math.ts | 24 +++++----- src/lib/components/Workspace.svelte | 3 -- src/lib/utils/BlockGen/Blocks/Block.ts | 44 +++++-------------- .../BlockGen/Mutators/AssemblerMutator.ts | 2 +- .../BlockGen/Mutators/CheckboxMutator.ts | 1 - 7 files changed, 39 insertions(+), 73 deletions(-) diff --git a/src/lib/blocks/Javascript/Loops.ts b/src/lib/blocks/Javascript/Loops.ts index 02f8ccc..a24c02d 100644 --- a/src/lib/blocks/Javascript/Loops.ts +++ b/src/lib/blocks/Javascript/Loops.ts @@ -35,7 +35,7 @@ const blocks: BlockDefinition[] = [ shape: BlockShape.Action, inline: true, colour: rgbToHex(91, 165, 91), - tooltip: "Repeat while", + tooltip: "Repeats the code inside until/while the condition is met.", helpUrl: "", code: (args) => { return `while (${args.WHILE === "while" ? "" : "!"}( ${args.CONDITION === "" ? "false" : args.CONDITION} )) {\n${args.INPUT === "" ? "" : args.INPUT}\n}`; @@ -82,7 +82,7 @@ const blocks: BlockDefinition[] = [ shape: BlockShape.Action, inline: true, colour: rgbToHex(91, 165, 91), - tooltip: "Array iteration", + tooltip: "Loops throught every item of the given array.", helpUrl: "", code: (args) => { return `for (let ${args.ITEM} of ${args.ARRAY}) {\n${args.INPUT}\n}`; @@ -100,7 +100,7 @@ const blocks: BlockDefinition[] = [ shape: BlockShape.Action, inline: true, colour: rgbToHex(91, 165, 91), - tooltip: "Break", + tooltip: "Breaks out of a loop.", helpUrl: "", code: (args) => { return `${args.ACTION};`; diff --git a/src/lib/blocks/Javascript/logic.ts b/src/lib/blocks/Javascript/logic.ts index 1f7583d..832bbfe 100644 --- a/src/lib/blocks/Javascript/logic.ts +++ b/src/lib/blocks/Javascript/logic.ts @@ -23,24 +23,18 @@ const blocks: BlockDefinition[] = [ shape: BlockShape.Action, inline: true, colour: rgbToHex(91, 128, 165), - tooltip: "Returns the opposite of the input", + tooltip: "Runs the code inside if the condition is met!", helpUrl: "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Logical_NOT", code: (args) => { - console.log(args); - let code = `if(${args.operand === "" ? "false" : args.operand}) { - ${args.if} -}`; + let code = `if(${args.operand === "" ? "false" : args.operand}) {${args.if}}`; const ifInputs = args.if_input as string[]; const ifStatementInputs = args.if_statement as string[]; for (let i = 0; i < ifInputs.length; i++) { const ifInp = ifInputs[i]; - code += ` else if(${ifInp === "" ? "false" : ifInp}) { - ${ifStatementInputs[i]} -}`; + code += ` else if(${ifInp === "" ? "false" : ifInp}) {${ifStatementInputs[i]}}`; } - return code; }, mutator: new AssemblerMutatorV2( @@ -98,6 +92,8 @@ const blocks: BlockDefinition[] = [ // return `${args.A} ${args.CONDITION} ${args.B}`; code: (args, block) => { + block.colour = rgbToHex(255, 128, 165); + block.outputType = BlockType.Any; block.addInput(new Dropdown("bob", DropdownType.Auto, { bob: "hello", alex: "nikola" })); block.addInput(new ValueInput("chicken", BlockType.Any)); block.addInput(new NumberInput("numberrr", 50, { max: 100, min: 50, precision: 10 })); @@ -149,7 +145,7 @@ const blocks: BlockDefinition[] = [ } }, { - id: "values", + id: "booleans", text: "{INPUT}", args: [ new Dropdown("INPUT", DropdownType.Auto, { @@ -163,7 +159,7 @@ const blocks: BlockDefinition[] = [ output: BlockType.Any, inline: true, colour: rgbToHex(91, 128, 165), - tooltip: "", + tooltip: "Boolean values used to verify conditions.", helpUrl: "", code: (args) => { return `${args.INPUT !== "" ? args.INPUT : "null"}`; @@ -186,7 +182,7 @@ const blocks: BlockDefinition[] = [ output: BlockType.Any, inline: false, colour: rgbToHex(91, 128, 165), - tooltip: "", + tooltip: "JavaScript ternary operator.", helpUrl: "", code: (args) => { return `${args.CONDITION} ? ${args.ONTRUE} : ${args.ONFALSE}`; @@ -201,7 +197,7 @@ const blocks: BlockDefinition[] = [ output: BlockType.String, inline: true, colour: rgbToHex(91, 128, 165), - tooltip: "", + tooltip: "Gives the type of the input.", helpUrl: "", code: (args) => { if (args.OPERAND === "") return "null"; @@ -209,8 +205,8 @@ const blocks: BlockDefinition[] = [ } }, { - id: "typeof_types", - text: "typeof types {TYPE}", + id: "types", + text: "type {TYPE}", args: [ // new ValueInput("OPERAND", BlockType.Any), new Dropdown("TYPE", DropdownType.Auto, { @@ -232,7 +228,7 @@ const blocks: BlockDefinition[] = [ output: BlockType.Boolean, inline: true, colour: rgbToHex(91, 128, 165), - tooltip: "", + tooltip: "A colletion of all JavaScript base types.", helpUrl: "", code: (args) => { return `"${args.TYPE}"`; @@ -240,11 +236,11 @@ const blocks: BlockDefinition[] = [ }, { id: "stop_script", - text: "stop script", + text: "Stop script", shape: BlockShape.Bottom, inline: true, colour: rgbToHex(165, 91, 153), - tooltip: "", + tooltip: "Stops the script, cannot have any blocks under it.", helpUrl: "", code: () => { return "return;"; diff --git a/src/lib/blocks/Javascript/math.ts b/src/lib/blocks/Javascript/math.ts index d54ba0e..ed09c83 100644 --- a/src/lib/blocks/Javascript/math.ts +++ b/src/lib/blocks/Javascript/math.ts @@ -15,7 +15,7 @@ const blocks: BlockDefinition[] = [ output: BlockType.Number, inline: true, colour: "#5b67a5", - tooltip: "Allows you to make a number input.", + tooltip: "A simple number value.", helpUrl: "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number", code: (args) => { @@ -45,7 +45,7 @@ const blocks: BlockDefinition[] = [ output: BlockType.Number, inline: true, colour: "#5b67a5", - tooltip: "Allows you to make operations with numbers.", + tooltip: "Performs a binary operation on the two given inputs.", helpUrl: "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number", code: (args) => { @@ -82,7 +82,7 @@ const blocks: BlockDefinition[] = [ output: BlockType.Number, inline: true, colour: "#5b67a5", - tooltip: "Allows you to make operations with numbers.", + tooltip: "Perform complex math operations on a number.", helpUrl: "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number", code: (args) => { @@ -124,7 +124,7 @@ const blocks: BlockDefinition[] = [ output: BlockType.Number, inline: true, colour: "#5b67a5", - tooltip: "Allows you to use constants.", + tooltip: "A set of math constants.", helpUrl: "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number", code: (args) => { @@ -200,7 +200,7 @@ const blocks: BlockDefinition[] = [ output: BlockType.Number, inline: true, colour: "#5b67a5", - tooltip: "Allows you to use math with arrays.", + tooltip: "Performs math operations on lists.", helpUrl: "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number", code: (args) => { @@ -240,14 +240,14 @@ const blocks: BlockDefinition[] = [ output: BlockType.Number, inline: true, colour: "#5b67a5", - tooltip: "Gets a random integer between two numbers.", - helpUrl: - "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number", + tooltip: "Generates a random number between the two given numbers.", + helpUrl: "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number", code: (args) => { return `Math.floor(Math.random() * (${args.MAX} - ${args.MIN}) + ${args.MIN})`; } }, { + //Todo: Delete/Remake completely this block. id: "random_fraction", text: "random fraction", args: [], @@ -255,9 +255,8 @@ const blocks: BlockDefinition[] = [ output: BlockType.Number, inline: true, colour: "#5b67a5", - tooltip: "Gets a random fraction.", - helpUrl: - "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number", + tooltip: "Generates a random fraction", + helpUrl: "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number", code: () => { return "Math.random()"; } @@ -272,8 +271,7 @@ const blocks: BlockDefinition[] = [ inline: true, colour: "#5b67a5", tooltip: "Converts text to a number.", - helpUrl: - "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number", + helpUrl: "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number", code: (args) => { return `parseInt(${args.TEXT})`; } diff --git a/src/lib/components/Workspace.svelte b/src/lib/components/Workspace.svelte index f9d015b..7bf7785 100644 --- a/src/lib/components/Workspace.svelte +++ b/src/lib/components/Workspace.svelte @@ -32,9 +32,6 @@ ]); function updateCode(event: Abstract) { - workspace.getAllBlocks(true).forEach((block) => { - if (block.type === "is_equal") console.log(block); - }); if (workspace.isDragging()) return; // Don't update while changes are happening. if (!supportedEvents.has(event.type)) return; diff --git a/src/lib/utils/BlockGen/Blocks/Block.ts b/src/lib/utils/BlockGen/Blocks/Block.ts index 5bc1b45..a505337 100644 --- a/src/lib/utils/BlockGen/Blocks/Block.ts +++ b/src/lib/utils/BlockGen/Blocks/Block.ts @@ -331,16 +331,21 @@ export default class Block { javascriptGenerator.forBlock[blockDef.type] = function(block: Blockly.Block) { const args: Record = {}; //? Object we will pass as argument for the custom code to run properly - for (const arg in blockDef.args0) { - const argValue = blockDef.args0[arg]; //? The argument object, contains the name, the type etc.. - const argName: string = blockDef.args0[arg].name as string; - args[argName] = getInputValue(block, argName, argValue.type); + for (const arg of blockDef.args0) { + //! Fix this asap... + //@ts-expect-error gergerg + if (arg.isDummy === true) { + // Since it's a dummy input we need to get the value from the fields array inside the dummy input! + //@ts-expect-error We have to access the protected value to generate it correctly. + args[arg.name] = block.getInput(arg.name)?.fieldRow[0].value_; + continue; + } + args[arg.name] = getInputValue(block, arg.name, arg.type); } //parse mutator values for (const propertyKey of Object.keys(propertyMap)) { const property = propertyMap[propertyKey]; - console.log(propertyMap); for (const add of property.adds) { const valueList: string[] = []; let i = 1; @@ -354,35 +359,6 @@ export default class Block { input = block.getInput(add.name + i); } args[add.name] = valueList; - - // const args: Record = {}; //? Object we will pass as argument to be used for code generation - - // for (const arg of blockClass._blocklyDefinition.args0) { - // //! Fix this asap... - // //@ts-expect-error gergerg - // if (arg.isDummy === true) { - // // Since it's a dummy input we need to get the value from the fields array inside the dummy input! - // //@ts-expect-error We have to access the protected value to generate it correctly. - // args[arg.name] = block.getInput(arg.name)?.fieldRow[0].value_; - // continue; - // } - - // switch (arg.type) { - // case "input_value": - // args[arg.name] = javascriptGenerator.valueToCode( - // block, - // arg.name, - // javascriptGenerator.ORDER_ATOMIC - // ); - // break; - - // case "input_statement": - // args[arg.name] = javascriptGenerator.statementToCode(block, arg.name); - // break; - - // default: - // args[arg.name] = block.getFieldValue(arg.name); - // break; } } return output ? [code(args, blockClass), Order.NONE] : code(args, blockClass); diff --git a/src/lib/utils/BlockGen/Mutators/AssemblerMutator.ts b/src/lib/utils/BlockGen/Mutators/AssemblerMutator.ts index d43b839..bfb2809 100644 --- a/src/lib/utils/BlockGen/Mutators/AssemblerMutator.ts +++ b/src/lib/utils/BlockGen/Mutators/AssemblerMutator.ts @@ -62,7 +62,7 @@ export default class AssemblerMutator extends Mutator { for (const prop of properties) { propertieMap[prop.block] = prop; } - console.log(settings); + Blockly.Blocks[containerBlockName] = { init: function(this: Blockly.Block) { this.jsonInit({ diff --git a/src/lib/utils/BlockGen/Mutators/CheckboxMutator.ts b/src/lib/utils/BlockGen/Mutators/CheckboxMutator.ts index 695d9e2..ad84c4f 100644 --- a/src/lib/utils/BlockGen/Mutators/CheckboxMutator.ts +++ b/src/lib/utils/BlockGen/Mutators/CheckboxMutator.ts @@ -140,7 +140,6 @@ export default class CheckboxMutator extends Mutator { if (!conn) continue; conn.reconnect(this, connectionKey); } - console.log(connections); }, // eslint-disable-next-line saveConnections: function (this: any, containerBlock: any) { From f4c5d61ed0d25330cc64eea4501d77112b215a50 Mon Sep 17 00:00:00 2001 From: mrredo <74524695+mrredo@users.noreply.github.com> Date: Thu, 22 Aug 2024 10:56:26 +0300 Subject: [PATCH 08/11] Logic category finished Added things - Mutator input warnings - changed how to access mutator input values "{input_name}_list" --- .github/workflows/pr-block-rules.yml | 20 ++++ block_creation_rules.md | 0 src/lib/blocks/Javascript/logic.ts | 45 +++++--- src/lib/blocks/Test Blocks/mutators.ts | 7 +- src/lib/types/BlockDefinition.ts | 2 +- src/lib/utils/BlockGen/Blocks/Block.ts | 101 ++++++++++++------ .../utils/BlockGen/Warnings/WarningsList.ts | 2 + 7 files changed, 131 insertions(+), 46 deletions(-) create mode 100644 .github/workflows/pr-block-rules.yml create mode 100644 block_creation_rules.md diff --git a/.github/workflows/pr-block-rules.yml b/.github/workflows/pr-block-rules.yml new file mode 100644 index 0000000..630e44a --- /dev/null +++ b/.github/workflows/pr-block-rules.yml @@ -0,0 +1,20 @@ +name: PR Block Rules + +on: + pull_request: + types: [opened, edited] + +jobs: + comment-on-pr: + runs-on: ubuntu-latest + + steps: + - name: Checkout code + uses: actions/checkout@v2 + + - name: Display block rules + run: | + RULES=$(cat ./block_creation_rules.md) + gh pr comment ${{ github.event.pull_request.number }} --body "$RULES" + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/block_creation_rules.md b/block_creation_rules.md new file mode 100644 index 0000000..e69de29 diff --git a/src/lib/blocks/Javascript/logic.ts b/src/lib/blocks/Javascript/logic.ts index 832bbfe..4083949 100644 --- a/src/lib/blocks/Javascript/logic.ts +++ b/src/lib/blocks/Javascript/logic.ts @@ -9,15 +9,19 @@ import Warning from "$lib/utils/BlockGen/Warnings/Warning"; import rgbToHex from "$lib/utils/helpers/rgbToHex"; import StatementInput from "$lib/utils/BlockGen/Inputs/StatementInput"; import AssemblerMutatorV2 from "$lib/utils/BlockGen/Mutators/AssemblerMutator"; - +/* +Logic category is finished. +*/ const blocks: BlockDefinition[] = [ { id: "if_block", - text: "if {operand} {if}", - args: [new ValueInput("operand", BlockType.Boolean), new StatementInput("if")], + text: "if {if_input} {if}", + args: [new ValueInput("if_input", BlockType.Boolean), new StatementInput("if")], warnings: [ + new Warning(WarningType.Input, { - fieldName: "operand" + + fieldName: "if_input" }) ], shape: BlockShape.Action, @@ -27,14 +31,16 @@ const blocks: BlockDefinition[] = [ helpUrl: "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Logical_NOT", code: (args) => { - let code = `if(${args.operand === "" ? "false" : args.operand}) {${args.if}}`; - const ifInputs = args.if_input as string[]; - const ifStatementInputs = args.if_statement as string[]; - + console.log(args) + let code = `if(${args.if_input === "" ? "false" : args.if_input}) {\n${args.if}\n}`; + const ifInputs = args.if_input_list as string[]; + const ifStatementInputs = args.if_statement_list as string[]; + const else_input = args.else_input_list as string[] for (let i = 0; i < ifInputs.length; i++) { const ifInp = ifInputs[i]; - code += ` else if(${ifInp === "" ? "false" : ifInp}) {${ifStatementInputs[i]}}`; + code += ` else if(${ifInp === "" ? "false" : ifInp}) {\n${ifStatementInputs[i]}\n}`; } + if(else_input.length !== 0) code += ` else {\n${else_input}\n}` return code; }, mutator: new AssemblerMutatorV2( @@ -65,14 +71,12 @@ const blocks: BlockDefinition[] = [ args: [ new ValueInput("A", BlockType.Any), new Dropdown("CONDITION", DropdownType.Auto, { - "=": "===", + "=": "===",//Based on research better to use "===", but it can always be changed "≠": "!=", "<": "<", "≤": "<=", ">": ">", "≥": ">=" - //always need to use === instead of == in js, removed this - //because user is always going to select the first one and question the last one. //"==": "===" }), new ValueInput("B", BlockType.Any) @@ -151,12 +155,11 @@ const blocks: BlockDefinition[] = [ new Dropdown("INPUT", DropdownType.Auto, { true: "true", false: "false", - null: "null" //undefined: "undefined" }) ], shape: BlockShape.Floating, - output: BlockType.Any, + output: BlockType.Boolean, inline: true, colour: rgbToHex(91, 128, 165), tooltip: "Boolean values used to verify conditions.", @@ -165,6 +168,20 @@ const blocks: BlockDefinition[] = [ return `${args.INPUT !== "" ? args.INPUT : "null"}`; } }, + { + id: "null", + text: "null", + + shape: BlockShape.Floating, + output: BlockType.Any, + inline: true, + colour: rgbToHex(91, 128, 165), + tooltip: "Null values used to check null conditions.", + helpUrl: "", + code: (args) => { + return `null`; + } + }, { id: "ternary", text: "test {CONDITION} on true {ONTRUE} on false {ONFALSE}", diff --git a/src/lib/blocks/Test Blocks/mutators.ts b/src/lib/blocks/Test Blocks/mutators.ts index cd827ad..9ef9a00 100644 --- a/src/lib/blocks/Test Blocks/mutators.ts +++ b/src/lib/blocks/Test Blocks/mutators.ts @@ -1,4 +1,4 @@ -import { BlockShape, BlockType } from "$lib/enums/BlockTypes"; +import { BlockShape, BlockType, WarningType } from "$lib/enums/BlockTypes"; import type { BlockDefinition } from "$lib/types/BlockDefinition"; import type { CategoryDefinition } from "$lib/types/CategoryDefinition"; import StatementInput from "$lib/utils/BlockGen/Inputs/StatementInput"; @@ -6,6 +6,7 @@ import ValueInput from "$lib/utils/BlockGen/Inputs/ValueInput"; import rgbToHex from "$lib/utils/helpers/rgbToHex"; import CheckboxMutator from "$lib/utils/BlockGen/Mutators/CheckboxMutator"; +import Warning from "$lib/utils/BlockGen/Warnings/Warning"; const blocks: BlockDefinition[] = [ { @@ -89,6 +90,10 @@ const blocks: BlockDefinition[] = [ shape: BlockShape.Action, inline: true, colour: rgbToHex(91, 128, 165), + warnings: [ + new Warning(WarningType.Input, { fieldName: "if_input"}) + ], + tooltip: "Returns the opposite of the input", helpUrl: "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Logical_NOT", diff --git a/src/lib/types/BlockDefinition.ts b/src/lib/types/BlockDefinition.ts index 3215032..8e6c7ed 100644 --- a/src/lib/types/BlockDefinition.ts +++ b/src/lib/types/BlockDefinition.ts @@ -5,7 +5,7 @@ import type { Mutator } from "$lib/utils/BlockGen/Mutators/Mutator"; import type Warning from "$lib/utils/BlockGen/Warnings/Warning"; import type Placeholder from "$lib/utils/ToolboxGen/Placeholder"; -export type Argument = BaseInput; +export type Argument = BaseInput; export type BlockDefinition = | { diff --git a/src/lib/utils/BlockGen/Blocks/Block.ts b/src/lib/utils/BlockGen/Blocks/Block.ts index a505337..358f050 100644 --- a/src/lib/utils/BlockGen/Blocks/Block.ts +++ b/src/lib/utils/BlockGen/Blocks/Block.ts @@ -84,7 +84,42 @@ export default class Block { (warning) => warning.data.fieldName !== fieldName ); } - + public handleWarning(data: { message: string; warningType: WarningType; fieldName: string }, resultMessage: string, topParent: Blockly.Block): string { + const {message, warningType, fieldName} = data + + switch (warningType) { + case WarningType.Parent: + if (topParent.type != fieldName) { + resultMessage += `${message}\n`; + addWarning(this._block.id, fieldName, message); + break; + } + removeWarning(this._block.id, fieldName); + break; + + case WarningType.Input: + if (this._block.getInput(fieldName)?.connection?.targetConnection === null) { + resultMessage += `${message}\n`; + addWarning(this._block.id, fieldName, message); + break; + } + + removeWarning(this._block.id, fieldName); + break; + + case WarningType.Deprec: + resultMessage += `${message}\n`; + addWarning(this._block.id, fieldName, message); + break; + + case WarningType.Permanent: + resultMessage += `${message}\n`; + addWarning(this._block.id, fieldName, message); + break; + } + return resultMessage + } + public addText(text: string, fieldName: string): void { this._block.appendDummyInput(fieldName).appendField(text); } @@ -216,6 +251,7 @@ export default class Block { throw Error(`Block "${blockDef.type}" is defined twice.`); } //const blockDefinition = this._blockDefinition; + const BlockClass = this; // Add The block to the blocks list Blockly.Blocks[blockDef.type] = { init: function(this: Blockly.Block) { @@ -275,41 +311,41 @@ export default class Block { const topParent = this.getRootBlock(); let resultMessage: string = ""; + /* + make check warning function + check if input + "1" exists if exists go to mutator detecting + where it goes in a loop unitl input + "n" doesn't exist + */ for (const warning of warnings) { const { warningType, message, fieldName } = warning.data; - switch (warningType) { - case WarningType.Parent: - if (topParent.type != fieldName) { - resultMessage += `${message}\n`; - addWarning(this.id, fieldName, message); - break; - } - removeWarning(this.id, fieldName); - break; - - case WarningType.Input: - if (this.getInput(fieldName)?.connection?.targetConnection === null) { - resultMessage += `${message}\n`; - addWarning(this.id, fieldName, message); - break; - } - removeWarning(this.id, fieldName); - break; - - case WarningType.Deprec: - resultMessage += `${message}\n`; - addWarning(this.id, fieldName, message); - break; - - case WarningType.Permanent: - resultMessage += `${message}\n`; - addWarning(this.id, fieldName, message); - break; + if(this.getInput(fieldName)) { + console.log(BlockClass.handleWarning(warning.data, resultMessage, topParent)) + resultMessage = BlockClass.handleWarning(warning.data, resultMessage, topParent) + } + let input = this.getInput(fieldName + "1") + //handles mutator input warnings + if(input) { + const warningObject = { + message: message, + fieldName: fieldName, + warningType: warningType + } + let i = 1; + while(input) { + warningObject.fieldName = warning.data.fieldName+ i + resultMessage = BlockClass.handleWarning(warningObject, resultMessage, topParent) + i++ + input = this.getInput(`${fieldName}${i}`) + } } + + + } if (warningsObj[this.id] && Object.keys(warningsObj[this.id]).length === 0) { delete warningsObj[this.id]; } + console.log(resultMessage) this.setWarningText(resultMessage); } }); @@ -358,7 +394,12 @@ export default class Block { i++; input = block.getInput(add.name + i); } - args[add.name] = valueList; + /* + _list is added that so basic inputs and mutator inputs can have the same names and it creates better block warnings + */ + args[add.name + "_list"] = valueList; + + } } return output ? [code(args, blockClass), Order.NONE] : code(args, blockClass); diff --git a/src/lib/utils/BlockGen/Warnings/WarningsList.ts b/src/lib/utils/BlockGen/Warnings/WarningsList.ts index 028af1e..7268438 100644 --- a/src/lib/utils/BlockGen/Warnings/WarningsList.ts +++ b/src/lib/utils/BlockGen/Warnings/WarningsList.ts @@ -11,4 +11,6 @@ export function addWarning(block: string, field: string, message: string): void export function removeWarning(block: string, field: string): void { if (!warnings[block] || !warnings[block][field]) return; delete warnings[block][field]; + if(Object.keys(warnings[block]).length === 0) return; + delete warnings[block] } From 4415aea74af775cfd45669869b8b3842224d57b4 Mon Sep 17 00:00:00 2001 From: mrredo <74524695+mrredo@users.noreply.github.com> Date: Thu, 22 Aug 2024 14:45:24 +0300 Subject: [PATCH 09/11] added block creation rules --- block_creation_rules.md | 32 ++++++++++++++++++++++++++ src/lib/utils/BlockGen/Blocks/Block.ts | 4 +++- 2 files changed, 35 insertions(+), 1 deletion(-) diff --git a/block_creation_rules.md b/block_creation_rules.md index e69de29..8250ba0 100644 --- a/block_creation_rules.md +++ b/block_creation_rules.md @@ -0,0 +1,32 @@ +Hello there! +Thank you for contributing. + +Before merging, please ensure that each modified or newly created block meets the following requirements: + +**Concise List:** + +##### 1. The block does one thing. +- For example, the `create_embed` block should only create an embed and not create a variable. + +##### 2. The block has warnings for crucial inputs. +- For example, in the `get_user_by_id` block, the `id` field must include a warning, as it is crucial for the block to function as intended. + +##### 3. Each block has maximum customizability. + +##### 4. Inputs are error-proofed. +- **DO NOT CREATE INPUTS WHERE YOU CAN TYPE CODE** (with the exception of the insert JS block). +- Inputs should not cause errors, even when left empty. + +##### 5. Consistent design patterns. +- Every block should be created in the same style. + +##### 6. Clear and descriptive titles. + +##### 7. Block modularity and reusability. +- Ensure that blocks can connect with each other in various scenarios. For example, if two blocks have the `user` type, they should be usable in all user inputs. + +##### 8. Performance. + +##### 9. Consider user feedback. + +These rules will make app development easier, help eliminate pesky bugs, and simplify refactoring. diff --git a/src/lib/utils/BlockGen/Blocks/Block.ts b/src/lib/utils/BlockGen/Blocks/Block.ts index 358f050..2dc56eb 100644 --- a/src/lib/utils/BlockGen/Blocks/Block.ts +++ b/src/lib/utils/BlockGen/Blocks/Block.ts @@ -47,6 +47,7 @@ interface BlocklyBlockDefinition { const { javascriptGenerator, Order } = pkg; +I'm making a concise list of rules that each block must follow. export default class Block { private _blockDefinition: BlockDefinition; private _block!: Blockly.Block; @@ -320,7 +321,8 @@ export default class Block { const { warningType, message, fieldName } = warning.data; if(this.getInput(fieldName)) { console.log(BlockClass.handleWarning(warning.data, resultMessage, topParent)) - resultMessage = BlockClass.handleWarning(warning.data, resultMessage, topParent) + resultMessage I'm making a concise list of rules that each block must follow. + = BlockClass.handleWarning(warning.data, resultMessage, topParent) } let input = this.getInput(fieldName + "1") //handles mutator input warnings From 2e8cb913d26d3f984f9fe7d55e70f47913ced454 Mon Sep 17 00:00:00 2001 From: mrredo <74524695+mrredo@users.noreply.github.com> Date: Sun, 25 Aug 2024 09:12:59 +0300 Subject: [PATCH 10/11] fixes --- package-lock.json | 9 +- src/lib/blocks/Javascript/logic.ts | 17 +- src/lib/types/BlockDefinition.ts | 61 +- src/lib/utils/BlockGen/Blocks/Block.ts | 71 +- yarn.lock | 1039 ++++++++++-------------- 5 files changed, 521 insertions(+), 676 deletions(-) diff --git a/package-lock.json b/package-lock.json index 4e0dc5f..e0208a6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,7 +9,8 @@ "version": "0.0.1", "dependencies": { "@blockly/field-grid-dropdown": "^4.0.11", - "blockly": "^10.4.3" + "blockly": "^10.4.3", + "dexie": "^4.0.1" }, "devDependencies": { "@playwright/test": "^1.28.1", @@ -2036,6 +2037,12 @@ "integrity": "sha512-KqFl6pOgOW+Y6wJgu80rHpo2/3H07vr8ntR9rkkFIRETewbf5GaYYcakYfiKz89K+sLsuPkQIZaXDMjUObZwWg==", "dev": true }, + "node_modules/dexie": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/dexie/-/dexie-4.0.8.tgz", + "integrity": "sha512-1G6cJevS17KMDK847V3OHvK2zei899GwpDiqfEXHP1ASvme6eWJmAp9AU4s1son2TeGkWmC0g3y8ezOBPnalgQ==", + "license": "Apache-2.0" + }, "node_modules/didyoumean": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", diff --git a/src/lib/blocks/Javascript/logic.ts b/src/lib/blocks/Javascript/logic.ts index 44f5c36..6326ee0 100644 --- a/src/lib/blocks/Javascript/logic.ts +++ b/src/lib/blocks/Javascript/logic.ts @@ -31,7 +31,6 @@ const blocks: BlockDefinition[] = [ helpUrl: "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Logical_NOT", code: (args) => { - console.log(args) let code = `if(${args.if_input === "" ? "false" : args.if_input}) {\n${args.if}\n}`; const ifInputs = args.if_input_list as string[]; const ifStatementInputs = args.if_statement_list as string[]; @@ -96,14 +95,8 @@ const blocks: BlockDefinition[] = [ // return `${args.A} ${args.CONDITION} ${args.B}`; code: (args, block) => { - block.colour = rgbToHex(255, 128, 165); - block.outputType = BlockType.Any; - block.addInput(new Dropdown("bob", DropdownType.Auto, { bob: "hello", alex: "nikola" })); - block.addInput(new ValueInput("chicken", BlockType.Any)); - block.addInput(new NumberInput("numberrr", 50, { max: 100, min: 50, precision: 10 })); - block.addInput(new TextInput("textttt", "I am a text input!")); - console.log("Args (code prop parameter): ", args); - return `${args.textttt}`; + + return (args.A == '' || args.B == '')? `false ${args.CONDITION} false` : `${args.A} ${args.CONDITION} ${args.B}`; } }, { @@ -111,7 +104,7 @@ const blocks: BlockDefinition[] = [ text: "{A} {CONDITION} {B}", args: [ new ValueInput("A", BlockType.Boolean), - new DropdownInput("CONDITION", DropdownType.Auto, { and: "&&", or: "||" }), + new Dropdown("CONDITION", DropdownType.Auto, { and: "&&", or: "||" }), new ValueInput("B", BlockType.Boolean) ], warnings: [ @@ -152,7 +145,7 @@ const blocks: BlockDefinition[] = [ id: "booleans", text: "{INPUT}", args: [ - new DropdownInput("INPUT", DropdownType.Auto, { + new Dropdown("INPUT", DropdownType.Auto, { true: "true", false: "false", //undefined: "undefined" @@ -226,7 +219,7 @@ const blocks: BlockDefinition[] = [ text: "type {TYPE}", args: [ // new ValueInput("OPERAND", BlockType.Any), - new DropdownInput("TYPE", DropdownType.Auto, { + new Dropdown("TYPE", DropdownType.Auto, { string: "string", number: "number", boolean: "boolean", diff --git a/src/lib/types/BlockDefinition.ts b/src/lib/types/BlockDefinition.ts index 50cf958..baddeb7 100644 --- a/src/lib/types/BlockDefinition.ts +++ b/src/lib/types/BlockDefinition.ts @@ -9,36 +9,39 @@ import {FlyoutButton} from "blockly"; export type Argument = BaseInput; export type BlockDefinition = - | { - id: string; // This is the "type" of the block - label?: false; // To see if the definition is a label or not - text: string; // This is "message0" - output?: BlockType; - shape: BlockShape; // The block shape - args?: Argument[]; // This is "args0" - warnings?: Warning[]; - placeholders?: Placeholder[]; - inline: boolean; // This is "inputsInline" - colour: string; - tooltip: string; - helpUrl: string; - code: (args: Record, block: Block) => string; - - mutator?: Mutator; - hidden?: boolean; - imports?: `${string}@${string}`[]; - } - | { - label: true; - text: string; - } | - { - kind: "button"; - text: string; - callbackKey: string; - callback: (p1: FlyoutButton) => void; - }; + | BlockBlockDefinition + | LabelBlockDefinition + | ButtonBlockDefinition; +export interface BlockBlockDefinition { + id: string; // This is the "type" of the block + kind?: null; + label?: false; // To see if the definition is a label or not + text: string; // This is "message0" + output?: BlockType; + shape: BlockShape; // The block shape + args?: Argument[]; // This is "args0" + warnings?: Warning[]; + placeholders?: Placeholder[]; + inline: boolean; // This is "inputsInline" + colour: string; + tooltip: string; + helpUrl: string; + code: (args: Record, block: Block) => string; + mutator?: Mutator; + hidden?: boolean; + imports?: `${string}@${string}`[]; +} +export interface LabelBlockDefinition { + label: true; + text: string; +} +export interface ButtonBlockDefinition { + kind: "button"; + text: string; + callbackKey: string; + callback: (p1: FlyoutButton) => void; +} export interface MutatorBlock { // What inputs it adds to the block adds: Argument[]; diff --git a/src/lib/utils/BlockGen/Blocks/Block.ts b/src/lib/utils/BlockGen/Blocks/Block.ts index 9b3b74e..c498c16 100644 --- a/src/lib/utils/BlockGen/Blocks/Block.ts +++ b/src/lib/utils/BlockGen/Blocks/Block.ts @@ -7,6 +7,7 @@ import pkg from "blockly/javascript"; import type { Argument, AssemblerMutator, + BlockBlockDefinition, BlockDefinition, CheckBoxMutatorBlock, MutatorBlock @@ -47,7 +48,6 @@ interface BlocklyBlockDefinition { const { javascriptGenerator, Order } = pkg; -I'm making a concise list of rules that each block must follow. export default class Block { private _blockDefinition: BlockDefinition; private _block!: Blockly.Block; @@ -66,23 +66,26 @@ export default class Block { } public addWarning(warning: Warning): void { - if (this._blockDefinition.label) throw new Error("Cannot add a warning to a label"); + const blockDefinition = this._blockDefinition as BlockBlockDefinition; + if (blockDefinition.label) throw new Error("Cannot add a warning to a label"); if (warningsObj[this._block.id] && warningsObj[this._block.id][warning.data.fieldName]) return; - this._blockDefinition.warnings = this._blockDefinition.warnings - ? [...this._blockDefinition.warnings, warning] + blockDefinition.warnings = blockDefinition.warnings + ? [...blockDefinition.warnings, warning] : [warning]; } public removeWarning(fieldName: string): void { - if (this._blockDefinition.kind) throw new Error("Cannot remove a warning from a input/button"); - if (this._blockDefinition.label) throw new Error("Cannot remove a warning from a label"); + const blockDefinition = this._blockDefinition as BlockBlockDefinition; + + if (blockDefinition.kind) throw new Error("Cannot remove a warning from a input/button"); + if (blockDefinition.label) throw new Error("Cannot remove a warning from a label"); if ( (!warningsObj[this._block.id] || !warningsObj[this._block.id][fieldName]) && - this._blockDefinition.warnings !== undefined + blockDefinition.warnings !== undefined ) { return; } - this._blockDefinition.warnings = this._blockDefinition.warnings?.filter( + blockDefinition.warnings = blockDefinition.warnings?.filter( (warning) => warning.data.fieldName !== fieldName ); } @@ -210,26 +213,28 @@ export default class Block { } generate(): void { - if (this._blockDefinition.label || this._blockDefinition.kind) return; + const blockDefinition = this._blockDefinition as BlockBlockDefinition; + + if (blockDefinition.label || blockDefinition.kind) return; // eslint-disable-next-line @typescript-eslint/no-this-alias const blockClass = this; // Used because `this` is overwritten in the blockly functions. + - - const code = this._blockDefinition.code; - const shape = this._blockDefinition.shape; - const output = this._blockDefinition.output; - const importName = this._blockDefinition.imports; - const mutatorName: string = this._blockDefinition.mutator - ? this._blockDefinition.id + salt(5) + const code = blockDefinition.code; + const shape = blockDefinition.shape; + const output = blockDefinition.output; + const importName = blockDefinition.imports; + const mutatorName: string = blockDefinition.mutator + ? blockDefinition.id + salt(5) : ""; const blockDef: BlocklyBlockDefinition = { - type: this._blockDefinition.id, - colour: this._blockDefinition.colour, - tooltip: this._blockDefinition.tooltip, - helpUrl: this._blockDefinition.helpUrl, - inputsInline: this._blockDefinition.inline, + type: blockDefinition.id, + colour: blockDefinition.colour, + tooltip: blockDefinition.tooltip, + helpUrl: blockDefinition.helpUrl, + inputsInline: blockDefinition.inline, args0: [], message0: "", mutator: mutatorName == "" ? undefined : mutatorName @@ -237,23 +242,23 @@ export default class Block { blockClass._blocklyDefinition = blockDef; - if (this._blockDefinition.mutator) { - this._blockDefinition.mutator.registerMutator(mutatorName); + if (blockDefinition.mutator) { + blockDefinition.mutator.registerMutator(mutatorName); } // Converts the classes into usable objects for the block definition - this._blockDefinition.args?.forEach((arg: Argument) => { + blockDefinition.args?.forEach((arg: Argument) => { blockDef.args0.push(arg.generate() as Record); }); // Converts the raw text into a blockly valid "message0" with this format: "text %1 other text %2" let counter: number = 1; - blockDef.message0 = this._blockDefinition.text.replace(/\{.*?\}/g, () => `%${counter++}`); + blockDef.message0 = blockDefinition.text.replace(/\{.*?\}/g, () => `%${counter++}`); if (Blockly.Blocks[blockDef.type] !== undefined && !dev) { throw Error(`Block "${blockDef.type}" is defined twice.`); } - //const blockDefinition = this._blockDefinition; + //const blockDefinition = blockDefinition; const BlockClass = this; // Add The block to the blocks list Blockly.Blocks[blockDef.type] = { @@ -310,9 +315,9 @@ export default class Block { !this.isInFlyout && block.id == this.id ) { - const warnings = blockClass._blockDefinition.label + const warnings = blockDefinition.label ? undefined - : blockClass._blockDefinition.warnings; + : blockDefinition.warnings; if (!warnings) return; const topParent = this.getRootBlock(); @@ -327,8 +332,7 @@ export default class Block { const { warningType, message, fieldName } = warning.data; if(this.getInput(fieldName)) { console.log(BlockClass.handleWarning(warning.data, resultMessage, topParent)) - resultMessage I'm making a concise list of rules that each block must follow. - = BlockClass.handleWarning(warning.data, resultMessage, topParent) + resultMessage = BlockClass.handleWarning(warning.data, resultMessage, topParent) } let input = this.getInput(fieldName + "1") //handles mutator input warnings @@ -353,19 +357,18 @@ export default class Block { if (warningsObj[this.id] && Object.keys(warningsObj[this.id]).length === 0) { delete warningsObj[this.id]; } - console.log(resultMessage) this.setWarningText(resultMessage); } }); } }; - const properties = this._blockDefinition.mutator?.properties; + const properties = blockDefinition.mutator?.properties; const propertyMap: Record = {}; if (properties) { for (const property of properties) { - if (this._blockDefinition.mutator?.type === MutatorType.Assembler) { + if (blockDefinition.mutator?.type === MutatorType.Assembler) { propertyMap[(property as AssemblerMutator).block] = property; - } else if (this._blockDefinition.mutator?.type === MutatorType.Checkbox) { + } else if (blockDefinition.mutator?.type === MutatorType.Checkbox) { propertyMap[(property as CheckBoxMutatorBlock).inputName] = property; } } diff --git a/yarn.lock b/yarn.lock index 9b1e5bc..26b3013 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4,17 +4,17 @@ "@aashutoshrathi/word-wrap@^1.2.3": version "1.2.6" - resolved "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz#bd9154aec9983f77b3a034ecaa015c2e4201f6cf" + resolved "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz" integrity sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA== "@alloc/quick-lru@^5.2.0": version "5.2.0" - resolved "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz#7bf68b20c0a350f936915fcae06f58e32007ce30" + resolved "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz" integrity sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw== "@ampproject/remapping@^2.2.1": version "2.3.0" - resolved "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz#ed441b6fa600072520ce18b43d2c8cc8caecc7f4" + resolved "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz" integrity sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw== dependencies: "@jridgewell/gen-mapping" "^0.3.5" @@ -22,139 +22,29 @@ "@blockly/field-grid-dropdown@^4.0.11": version "4.0.12" - resolved "https://registry.npmjs.org/@blockly/field-grid-dropdown/-/field-grid-dropdown-4.0.12.tgz#cb7f36e654797ad682a8e601c00312ac9240f749" + resolved "https://registry.npmjs.org/@blockly/field-grid-dropdown/-/field-grid-dropdown-4.0.12.tgz" integrity sha512-Z6pn0iWLam3G95Z3eIjbwgpSSLSps23SpNXawOfjpoogSRofCivK9SFXSluxbpPLxVSboZAC0w4X4f4V8qc/6Q== -"@esbuild/aix-ppc64@0.20.2": - version "0.20.2" - resolved "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.20.2.tgz#a70f4ac11c6a1dfc18b8bbb13284155d933b9537" - integrity sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g== - -"@esbuild/android-arm64@0.20.2": - version "0.20.2" - resolved "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.20.2.tgz#db1c9202a5bc92ea04c7b6840f1bbe09ebf9e6b9" - integrity sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg== - -"@esbuild/android-arm@0.20.2": - version "0.20.2" - resolved "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.20.2.tgz#3b488c49aee9d491c2c8f98a909b785870d6e995" - integrity sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w== - -"@esbuild/android-x64@0.20.2": - version "0.20.2" - resolved "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.20.2.tgz#3b1628029e5576249d2b2d766696e50768449f98" - integrity sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg== - -"@esbuild/darwin-arm64@0.20.2": - version "0.20.2" - resolved "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.20.2.tgz#6e8517a045ddd86ae30c6608c8475ebc0c4000bb" - integrity sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA== - -"@esbuild/darwin-x64@0.20.2": - version "0.20.2" - resolved "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.20.2.tgz#90ed098e1f9dd8a9381695b207e1cff45540a0d0" - integrity sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA== - -"@esbuild/freebsd-arm64@0.20.2": - version "0.20.2" - resolved "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.20.2.tgz#d71502d1ee89a1130327e890364666c760a2a911" - integrity sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw== - -"@esbuild/freebsd-x64@0.20.2": - version "0.20.2" - resolved "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.20.2.tgz#aa5ea58d9c1dd9af688b8b6f63ef0d3d60cea53c" - integrity sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw== - -"@esbuild/linux-arm64@0.20.2": - version "0.20.2" - resolved "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.20.2.tgz#055b63725df678379b0f6db9d0fa85463755b2e5" - integrity sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A== - -"@esbuild/linux-arm@0.20.2": - version "0.20.2" - resolved "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.20.2.tgz#76b3b98cb1f87936fbc37f073efabad49dcd889c" - integrity sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg== - -"@esbuild/linux-ia32@0.20.2": - version "0.20.2" - resolved "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.20.2.tgz#c0e5e787c285264e5dfc7a79f04b8b4eefdad7fa" - integrity sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig== - -"@esbuild/linux-loong64@0.20.2": - version "0.20.2" - resolved "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.20.2.tgz#a6184e62bd7cdc63e0c0448b83801001653219c5" - integrity sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ== - -"@esbuild/linux-mips64el@0.20.2": - version "0.20.2" - resolved "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.20.2.tgz#d08e39ce86f45ef8fc88549d29c62b8acf5649aa" - integrity sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA== - -"@esbuild/linux-ppc64@0.20.2": - version "0.20.2" - resolved "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.20.2.tgz#8d252f0b7756ffd6d1cbde5ea67ff8fd20437f20" - integrity sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg== - -"@esbuild/linux-riscv64@0.20.2": - version "0.20.2" - resolved "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.20.2.tgz#19f6dcdb14409dae607f66ca1181dd4e9db81300" - integrity sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg== - -"@esbuild/linux-s390x@0.20.2": - version "0.20.2" - resolved "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.20.2.tgz#3c830c90f1a5d7dd1473d5595ea4ebb920988685" - integrity sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ== - -"@esbuild/linux-x64@0.20.2": - version "0.20.2" - resolved "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.20.2.tgz#86eca35203afc0d9de0694c64ec0ab0a378f6fff" - integrity sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw== - -"@esbuild/netbsd-x64@0.20.2": - version "0.20.2" - resolved "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.20.2.tgz#e771c8eb0e0f6e1877ffd4220036b98aed5915e6" - integrity sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ== - -"@esbuild/openbsd-x64@0.20.2": - version "0.20.2" - resolved "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.20.2.tgz#9a795ae4b4e37e674f0f4d716f3e226dd7c39baf" - integrity sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ== - -"@esbuild/sunos-x64@0.20.2": - version "0.20.2" - resolved "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.20.2.tgz#7df23b61a497b8ac189def6e25a95673caedb03f" - integrity sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w== - -"@esbuild/win32-arm64@0.20.2": - version "0.20.2" - resolved "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.20.2.tgz#f1ae5abf9ca052ae11c1bc806fb4c0f519bacf90" - integrity sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ== - -"@esbuild/win32-ia32@0.20.2": - version "0.20.2" - resolved "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.20.2.tgz#241fe62c34d8e8461cd708277813e1d0ba55ce23" - integrity sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ== - "@esbuild/win32-x64@0.20.2": version "0.20.2" - resolved "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.20.2.tgz#9c907b21e30a52db959ba4f80bb01a0cc403d5cc" + resolved "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.20.2.tgz" integrity sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ== "@eslint-community/eslint-utils@^4.2.0", "@eslint-community/eslint-utils@^4.4.0": version "4.4.0" - resolved "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz#a23514e8fb9af1269d5f7788aa556798d61c6b59" + resolved "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz" integrity sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA== dependencies: eslint-visitor-keys "^3.3.0" "@eslint-community/regexpp@^4.5.1", "@eslint-community/regexpp@^4.6.1": version "4.10.0" - resolved "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz#548f6de556857c8bb73bbee70c35dc82a2e74d63" + resolved "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz" integrity sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA== "@eslint/eslintrc@^2.1.4": version "2.1.4" - resolved "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz#388a269f0f25c1b6adc317b5a2c55714894c70ad" + resolved "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz" integrity sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ== dependencies: ajv "^6.12.4" @@ -169,12 +59,12 @@ "@eslint/js@8.57.0": version "8.57.0" - resolved "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz#a5417ae8427873f1dd08b70b3574b453e67b5f7f" + resolved "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz" integrity sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g== "@humanwhocodes/config-array@^0.11.14": version "0.11.14" - resolved "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz#d78e481a039f7566ecc9660b4ea7fe6b1fec442b" + resolved "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz" integrity sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg== dependencies: "@humanwhocodes/object-schema" "^2.0.2" @@ -183,17 +73,17 @@ "@humanwhocodes/module-importer@^1.0.1": version "1.0.1" - resolved "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" + resolved "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz" integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== "@humanwhocodes/object-schema@^2.0.2": version "2.0.3" - resolved "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz#4a2868d75d6d6963e423bcf90b7fd1be343409d3" + resolved "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz" integrity sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA== "@isaacs/cliui@^8.0.2": version "8.0.2" - resolved "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz#b37667b7bc181c168782259bab42474fbf52b550" + resolved "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz" integrity sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA== dependencies: string-width "^5.1.2" @@ -205,14 +95,14 @@ "@jest/schemas@^29.6.3": version "29.6.3" - resolved "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz#430b5ce8a4e0044a7e3819663305a7b3091c8e03" + resolved "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz" integrity sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA== dependencies: "@sinclair/typebox" "^0.27.8" "@jridgewell/gen-mapping@^0.3.2", "@jridgewell/gen-mapping@^0.3.5": version "0.3.5" - resolved "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz#dcce6aff74bdf6dad1a95802b69b04a2fcb1fb36" + resolved "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz" integrity sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg== dependencies: "@jridgewell/set-array" "^1.2.1" @@ -221,22 +111,22 @@ "@jridgewell/resolve-uri@^3.1.0": version "3.1.2" - resolved "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6" + resolved "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz" integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== "@jridgewell/set-array@^1.2.1": version "1.2.1" - resolved "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz#558fb6472ed16a4c850b889530e6b36438c49280" + resolved "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz" integrity sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A== "@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14", "@jridgewell/sourcemap-codec@^1.4.15": version "1.4.15" - resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" + resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz" integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== "@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.18", "@jridgewell/trace-mapping@^0.3.24": version "0.3.25" - resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz#15f190e98895f3fc23276ee14bc76b675c2e50f0" + resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz" integrity sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ== dependencies: "@jridgewell/resolve-uri" "^3.1.0" @@ -244,20 +134,20 @@ "@nodelib/fs.scandir@2.1.5": version "2.1.5" - resolved "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" + resolved "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz" integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== dependencies: "@nodelib/fs.stat" "2.0.5" run-parallel "^1.1.9" -"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": +"@nodelib/fs.stat@^2.0.2", "@nodelib/fs.stat@2.0.5": version "2.0.5" - resolved "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" + resolved "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz" integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== "@nodelib/fs.walk@^1.2.3", "@nodelib/fs.walk@^1.2.8": version "1.2.8" - resolved "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" + resolved "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz" integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== dependencies: "@nodelib/fs.scandir" "2.1.5" @@ -265,111 +155,41 @@ "@pkgjs/parseargs@^0.11.0": version "0.11.0" - resolved "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33" + resolved "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz" integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg== "@playwright/test@^1.28.1": version "1.42.1" - resolved "https://registry.npmjs.org/@playwright/test/-/test-1.42.1.tgz#9eff7417bcaa770e9e9a00439e078284b301f31c" + resolved "https://registry.npmjs.org/@playwright/test/-/test-1.42.1.tgz" integrity sha512-Gq9rmS54mjBL/7/MvBaNOBwbfnh7beHvS6oS4srqXFcQHpQCV1+c8JXWE8VLPyRDhgS3H8x8A7hztqI9VnwrAQ== dependencies: playwright "1.42.1" "@polka/url@^1.0.0-next.24": version "1.0.0-next.25" - resolved "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.25.tgz#f077fdc0b5d0078d30893396ff4827a13f99e817" + resolved "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.25.tgz" integrity sha512-j7P6Rgr3mmtdkeDGTe0E/aYyWEWVtc5yFXtHCRHs28/jptDEWfaVOc5T7cblqy1XKPPfCxJc/8DwQ5YgLOZOVQ== -"@rollup/rollup-android-arm-eabi@4.13.2": - version "4.13.2" - resolved "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.13.2.tgz#fbf098f49d96a8cac9056f22f5fd80906ef3af85" - integrity sha512-3XFIDKWMFZrMnao1mJhnOT1h2g0169Os848NhhmGweEcfJ4rCi+3yMCOLG4zA61rbJdkcrM/DjVZm9Hg5p5w7g== - -"@rollup/rollup-android-arm64@4.13.2": - version "4.13.2" - resolved "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.13.2.tgz#0d2448251040fce19a98eee505dff5b3c8ec9b98" - integrity sha512-GdxxXbAuM7Y/YQM9/TwwP+L0omeE/lJAR1J+olu36c3LqqZEBdsIWeQ91KBe6nxwOnb06Xh7JS2U5ooWU5/LgQ== - -"@rollup/rollup-darwin-arm64@4.13.2": - version "4.13.2" - resolved "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.13.2.tgz#78db4d4da5b1b84c22adbe25c8a4961b3f22d3af" - integrity sha512-mCMlpzlBgOTdaFs83I4XRr8wNPveJiJX1RLfv4hggyIVhfB5mJfN4P8Z6yKh+oE4Luz+qq1P3kVdWrCKcMYrrA== - -"@rollup/rollup-darwin-x64@4.13.2": - version "4.13.2" - resolved "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.13.2.tgz#fcc05af54379f8ee5c7e954987d4514c6fd0fb42" - integrity sha512-yUoEvnH0FBef/NbB1u6d3HNGyruAKnN74LrPAfDQL3O32e3k3OSfLrPgSJmgb3PJrBZWfPyt6m4ZhAFa2nZp2A== - -"@rollup/rollup-linux-arm-gnueabihf@4.13.2": - version "4.13.2" - resolved "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.13.2.tgz#2ce200efa1ef4a56ee2af7b453edc74a259d7d31" - integrity sha512-GYbLs5ErswU/Xs7aGXqzc3RrdEjKdmoCrgzhJWyFL0r5fL3qd1NPcDKDowDnmcoSiGJeU68/Vy+OMUluRxPiLQ== - -"@rollup/rollup-linux-arm64-gnu@4.13.2": - version "4.13.2" - resolved "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.13.2.tgz#5a24aac882bff9abfda3f45f6f1db2166c342a4a" - integrity sha512-L1+D8/wqGnKQIlh4Zre9i4R4b4noxzH5DDciyahX4oOz62CphY7WDWqJoQ66zNR4oScLNOqQJfNSIAe/6TPUmQ== - -"@rollup/rollup-linux-arm64-musl@4.13.2": - version "4.13.2" - resolved "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.13.2.tgz#f1fb4c6f961d3f3397231a99e621d199200e4ea9" - integrity sha512-tK5eoKFkXdz6vjfkSTCupUzCo40xueTOiOO6PeEIadlNBkadH1wNOH8ILCPIl8by/Gmb5AGAeQOFeLev7iZDOA== - -"@rollup/rollup-linux-powerpc64le-gnu@4.13.2": - version "4.13.2" - resolved "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.13.2.tgz#46b2463d94ac3af3e0f7a2947b695397bc13b755" - integrity sha512-zvXvAUGGEYi6tYhcDmb9wlOckVbuD+7z3mzInCSTACJ4DQrdSLPNUeDIcAQW39M3q6PDquqLWu7pnO39uSMRzQ== - -"@rollup/rollup-linux-riscv64-gnu@4.13.2": - version "4.13.2" - resolved "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.13.2.tgz#47b932ee59a5395a3a341b0493e361d9e6032cf2" - integrity sha512-C3GSKvMtdudHCN5HdmAMSRYR2kkhgdOfye4w0xzyii7lebVr4riCgmM6lRiSCnJn2w1Xz7ZZzHKuLrjx5620kw== - -"@rollup/rollup-linux-s390x-gnu@4.13.2": - version "4.13.2" - resolved "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.13.2.tgz#8e14a1b3c3b9a4440c70a9c1ba12d32aa21f9712" - integrity sha512-l4U0KDFwzD36j7HdfJ5/TveEQ1fUTjFFQP5qIt9gBqBgu1G8/kCaq5Ok05kd5TG9F8Lltf3MoYsUMw3rNlJ0Yg== - -"@rollup/rollup-linux-x64-gnu@4.13.2": - version "4.13.2" - resolved "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.13.2.tgz#270e939194b66df77bcb33dd9a5ddf7784bd7997" - integrity sha512-xXMLUAMzrtsvh3cZ448vbXqlUa7ZL8z0MwHp63K2IIID2+DeP5iWIT6g1SN7hg1VxPzqx0xZdiDM9l4n9LRU1A== - -"@rollup/rollup-linux-x64-musl@4.13.2": - version "4.13.2" - resolved "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.13.2.tgz#e8dd0f3c2046acbda2934490b36552e856a3bc6a" - integrity sha512-M/JYAWickafUijWPai4ehrjzVPKRCyDb1SLuO+ZyPfoXgeCEAlgPkNXewFZx0zcnoIe3ay4UjXIMdXQXOZXWqA== - -"@rollup/rollup-win32-arm64-msvc@4.13.2": - version "4.13.2" - resolved "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.13.2.tgz#f8b65a4a7e7a6b383e7b14439129b2f474ff123c" - integrity sha512-2YWwoVg9KRkIKaXSh0mz3NmfurpmYoBBTAXA9qt7VXk0Xy12PoOP40EFuau+ajgALbbhi4uTj3tSG3tVseCjuA== - -"@rollup/rollup-win32-ia32-msvc@4.13.2": - version "4.13.2" - resolved "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.13.2.tgz#bc1c5a4fbc4337d6cb15da80a4de95fd53ab3573" - integrity sha512-2FSsE9aQ6OWD20E498NYKEQLneShWes0NGMPQwxWOdws35qQXH+FplabOSP5zEe1pVjurSDOGEVCE2agFwSEsw== - "@rollup/rollup-win32-x64-msvc@4.13.2": version "4.13.2" - resolved "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.13.2.tgz#851959c4c1c3c6647aba1f388198c8243aed6917" + resolved "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.13.2.tgz" integrity sha512-7h7J2nokcdPePdKykd8wtc8QqqkqxIrUz7MHj6aNr8waBRU//NLDVnNjQnqQO6fqtjrtCdftpbTuOKAyrAQETQ== "@sinclair/typebox@^0.27.8": version "0.27.8" - resolved "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz#6667fac16c436b5434a387a34dedb013198f6e6e" + resolved "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz" integrity sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA== "@sveltejs/adapter-auto@^3.0.0": version "3.2.0" - resolved "https://registry.npmjs.org/@sveltejs/adapter-auto/-/adapter-auto-3.2.0.tgz#00720dfad99f95452c6e47cc64a1cb58324337d2" + resolved "https://registry.npmjs.org/@sveltejs/adapter-auto/-/adapter-auto-3.2.0.tgz" integrity sha512-She5nKT47kwHE18v9NMe6pbJcvULr82u0V3yZ0ej3n1laWKGgkgdEABE9/ak5iDPs93LqsBkuIo51kkwCLBjJA== dependencies: import-meta-resolve "^4.0.0" "@sveltejs/kit@^2.0.0": version "2.5.5" - resolved "https://registry.npmjs.org/@sveltejs/kit/-/kit-2.5.5.tgz#ceb4e2ec35bc82a5fedebc97a02c51815b8b0d32" + resolved "https://registry.npmjs.org/@sveltejs/kit/-/kit-2.5.5.tgz" integrity sha512-ULe3PB00q4+wYRL+IS5FDPsCEVnhEITofm7b9Yz8malcH3r1SAnW/JJ6T13hIMeu8QNRIuVQWo+P4+2VklbnLQ== dependencies: "@types/cookie" "^0.6.0" @@ -387,14 +207,14 @@ "@sveltejs/vite-plugin-svelte-inspector@^2.0.0": version "2.0.0" - resolved "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte-inspector/-/vite-plugin-svelte-inspector-2.0.0.tgz#365afaa0dd63517838ce4686a3dc3982be348a9b" + resolved "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte-inspector/-/vite-plugin-svelte-inspector-2.0.0.tgz" integrity sha512-gjr9ZFg1BSlIpfZ4PRewigrvYmHWbDrq2uvvPB1AmTWKuM+dI1JXQSUu2pIrYLb/QncyiIGkFDFKTwJ0XqQZZg== dependencies: debug "^4.3.4" "@sveltejs/vite-plugin-svelte@^3.0.0": version "3.0.2" - resolved "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte/-/vite-plugin-svelte-3.0.2.tgz#5c33534d07130283cff92304f627010387c11af0" + resolved "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte/-/vite-plugin-svelte-3.0.2.tgz" integrity sha512-MpmF/cju2HqUls50WyTHQBZUV3ovV/Uk8k66AN2gwHogNAG8wnW8xtZDhzNBsFJJuvmq1qnzA5kE7YfMJNFv2Q== dependencies: "@sveltejs/vite-plugin-svelte-inspector" "^2.0.0" @@ -407,45 +227,45 @@ "@tootallnate/once@2": version "2.0.0" - resolved "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz#f544a148d3ab35801c1f633a7441fd87c2e484bf" + resolved "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz" integrity sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A== "@types/cookie@^0.6.0": version "0.6.0" - resolved "https://registry.npmjs.org/@types/cookie/-/cookie-0.6.0.tgz#eac397f28bf1d6ae0ae081363eca2f425bedf0d5" + resolved "https://registry.npmjs.org/@types/cookie/-/cookie-0.6.0.tgz" integrity sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA== "@types/eslint@^8.56.0": version "8.56.7" - resolved "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.7.tgz#c33b5b5a9cfb66881beb7b5be6c34aa3e81d3366" + resolved "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.7.tgz" integrity sha512-SjDvI/x3zsZnOkYZ3lCt9lOZWZLB2jIlNKz+LBgCtDurK0JZcwucxYHn1w2BJkD34dgX9Tjnak0txtq4WTggEA== dependencies: "@types/estree" "*" "@types/json-schema" "*" -"@types/estree@*", "@types/estree@1.0.5", "@types/estree@^1.0.0", "@types/estree@^1.0.1": +"@types/estree@*", "@types/estree@^1.0.0", "@types/estree@^1.0.1", "@types/estree@1.0.5": version "1.0.5" - resolved "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz#a6ce3e556e00fd9895dd872dd172ad0d4bd687f4" + resolved "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz" integrity sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw== "@types/json-schema@*", "@types/json-schema@^7.0.12": version "7.0.15" - resolved "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841" + resolved "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz" integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== "@types/pug@^2.0.6": version "2.0.10" - resolved "https://registry.npmjs.org/@types/pug/-/pug-2.0.10.tgz#52f8dbd6113517aef901db20b4f3fca543b88c1f" + resolved "https://registry.npmjs.org/@types/pug/-/pug-2.0.10.tgz" integrity sha512-Sk/uYFOBAB7mb74XcpizmH0KOR2Pv3D2Hmrh1Dmy5BmK3MpdSa5kqZcg6EKBdklU0bFXX9gCfzvpnyUehrPIuA== "@types/semver@^7.5.0": version "7.5.8" - resolved "https://registry.npmjs.org/@types/semver/-/semver-7.5.8.tgz#8268a8c57a3e4abd25c165ecd36237db7948a55e" + resolved "https://registry.npmjs.org/@types/semver/-/semver-7.5.8.tgz" integrity sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ== "@typescript-eslint/eslint-plugin@^7.0.0": version "7.5.0" - resolved "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.5.0.tgz#1dc52fe48454d5b54be2d5f089680452f1628a5a" + resolved "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.5.0.tgz" integrity sha512-HpqNTH8Du34nLxbKgVMGljZMG0rJd2O9ecvr2QLYp+7512ty1j42KnsFwspPXg1Vh8an9YImf6CokUBltisZFQ== dependencies: "@eslint-community/regexpp" "^4.5.1" @@ -462,7 +282,7 @@ "@typescript-eslint/parser@^7.0.0": version "7.5.0" - resolved "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.5.0.tgz#1eeff36309ac2253c905dd4a88b4b71b72a358ed" + resolved "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.5.0.tgz" integrity sha512-cj+XGhNujfD2/wzR1tabNsidnYRaFfEkcULdcIyVBYcXjBvBKOes+mpMBP7hMpOyk+gBcfXsrg4NBGAStQyxjQ== dependencies: "@typescript-eslint/scope-manager" "7.5.0" @@ -473,7 +293,7 @@ "@typescript-eslint/scope-manager@7.5.0": version "7.5.0" - resolved "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.5.0.tgz#70f0a7361430ab1043a5f97386da2a0d8b2f4d56" + resolved "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.5.0.tgz" integrity sha512-Z1r7uJY0MDeUlql9XJ6kRVgk/sP11sr3HKXn268HZyqL7i4cEfrdFuSSY/0tUqT37l5zT0tJOsuDP16kio85iA== dependencies: "@typescript-eslint/types" "7.5.0" @@ -481,7 +301,7 @@ "@typescript-eslint/type-utils@7.5.0": version "7.5.0" - resolved "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.5.0.tgz#a8faa403232da3a3901655387c7082111f692cf9" + resolved "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.5.0.tgz" integrity sha512-A021Rj33+G8mx2Dqh0nMO9GyjjIBK3MqgVgZ2qlKf6CJy51wY/lkkFqq3TqqnH34XyAHUkq27IjlUkWlQRpLHw== dependencies: "@typescript-eslint/typescript-estree" "7.5.0" @@ -491,12 +311,12 @@ "@typescript-eslint/types@7.5.0": version "7.5.0" - resolved "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.5.0.tgz#0a284bcdef3cb850ec9fd57992df9f29d6bde1bc" + resolved "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.5.0.tgz" integrity sha512-tv5B4IHeAdhR7uS4+bf8Ov3k793VEVHd45viRRkehIUZxm0WF82VPiLgHzA/Xl4TGPg1ZD49vfxBKFPecD5/mg== "@typescript-eslint/typescript-estree@7.5.0": version "7.5.0" - resolved "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.5.0.tgz#aa5031c511874420f6b5edd90f8e4021525ee776" + resolved "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.5.0.tgz" integrity sha512-YklQQfe0Rv2PZEueLTUffiQGKQneiIEKKnfIqPIOxgM9lKSZFCjT5Ad4VqRKj/U4+kQE3fa8YQpskViL7WjdPQ== dependencies: "@typescript-eslint/types" "7.5.0" @@ -510,7 +330,7 @@ "@typescript-eslint/utils@7.5.0": version "7.5.0" - resolved "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.5.0.tgz#bbd963647fbbe9ffea033f42c0fb7e89bb19c858" + resolved "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.5.0.tgz" integrity sha512-3vZl9u0R+/FLQcpy2EHyRGNqAS/ofJ3Ji8aebilfJe+fobK8+LbIFmrHciLVDxjDoONmufDcnVSF38KwMEOjzw== dependencies: "@eslint-community/eslint-utils" "^4.4.0" @@ -523,7 +343,7 @@ "@typescript-eslint/visitor-keys@7.5.0": version "7.5.0" - resolved "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.5.0.tgz#8abcac66f93ef20b093e87a400c2d21e3a6d55ee" + resolved "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.5.0.tgz" integrity sha512-mcuHM/QircmA6O7fy6nn2w/3ditQkj+SgtOc8DW3uQ10Yfj42amm2i+6F2K4YAOPNNTmE6iM1ynM6lrSwdendA== dependencies: "@typescript-eslint/types" "7.5.0" @@ -531,12 +351,12 @@ "@ungap/structured-clone@^1.2.0": version "1.2.0" - resolved "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz#756641adb587851b5ccb3e095daf27ae581c8406" + resolved "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz" integrity sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ== "@vitest/expect@1.4.0": version "1.4.0" - resolved "https://registry.npmjs.org/@vitest/expect/-/expect-1.4.0.tgz#d64e17838a20007fecd252397f9b96a1ca81bfb0" + resolved "https://registry.npmjs.org/@vitest/expect/-/expect-1.4.0.tgz" integrity sha512-Jths0sWCJZ8BxjKe+p+eKsoqev1/T8lYcrjavEaz8auEJ4jAVY0GwW3JKmdVU4mmNPLPHixh4GNXP7GFtAiDHA== dependencies: "@vitest/spy" "1.4.0" @@ -545,7 +365,7 @@ "@vitest/runner@1.4.0": version "1.4.0" - resolved "https://registry.npmjs.org/@vitest/runner/-/runner-1.4.0.tgz#907c2d17ad5975b70882c25ab7a13b73e5a28da9" + resolved "https://registry.npmjs.org/@vitest/runner/-/runner-1.4.0.tgz" integrity sha512-EDYVSmesqlQ4RD2VvWo3hQgTJ7ZrFQ2VSJdfiJiArkCerDAGeyF1i6dHkmySqk573jLp6d/cfqCN+7wUB5tLgg== dependencies: "@vitest/utils" "1.4.0" @@ -554,7 +374,7 @@ "@vitest/snapshot@1.4.0": version "1.4.0" - resolved "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-1.4.0.tgz#2945b3fb53767a3f4f421919e93edfef2935b8bd" + resolved "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-1.4.0.tgz" integrity sha512-saAFnt5pPIA5qDGxOHxJ/XxhMFKkUSBJmVt5VgDsAqPTX6JP326r5C/c9UuCMPoXNzuudTPsYDZCoJ5ilpqG2A== dependencies: magic-string "^0.30.5" @@ -563,14 +383,14 @@ "@vitest/spy@1.4.0": version "1.4.0" - resolved "https://registry.npmjs.org/@vitest/spy/-/spy-1.4.0.tgz#cf953c93ae54885e801cbe6b408a547ae613f26c" + resolved "https://registry.npmjs.org/@vitest/spy/-/spy-1.4.0.tgz" integrity sha512-Ywau/Qs1DzM/8Uc+yA77CwSegizMlcgTJuYGAi0jujOteJOUf1ujunHThYo243KG9nAyWT3L9ifPYZ5+As/+6Q== dependencies: tinyspy "^2.2.0" "@vitest/utils@1.4.0": version "1.4.0" - resolved "https://registry.npmjs.org/@vitest/utils/-/utils-1.4.0.tgz#ea6297e0d329f9ff0a106f4e1f6daf3ff6aad3f0" + resolved "https://registry.npmjs.org/@vitest/utils/-/utils-1.4.0.tgz" integrity sha512-mx3Yd1/6e2Vt/PUC98DcqTirtfxUyAZ32uK82r8rZzbtBeBo+nqgnjx/LvqQdWsrvNtm14VmurNgcf4nqY5gJg== dependencies: diff-sequences "^29.6.3" @@ -580,34 +400,34 @@ abab@^2.0.6: version "2.0.6" - resolved "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz#41b80f2c871d19686216b82309231cfd3cb3d291" + resolved "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz" integrity sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA== acorn-jsx@^5.3.2: version "5.3.2" - resolved "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" + resolved "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz" integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== acorn-walk@^8.3.2: version "8.3.2" - resolved "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.2.tgz#7703af9415f1b6db9315d6895503862e231d34aa" + resolved "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.2.tgz" integrity sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A== -acorn@^8.10.0, acorn@^8.11.3, acorn@^8.9.0: +"acorn@^6.0.0 || ^7.0.0 || ^8.0.0", acorn@^8.10.0, acorn@^8.11.3, acorn@^8.9.0: version "8.11.3" - resolved "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz#71e0b14e13a4ec160724b38fb7b0f233b1b81d7a" + resolved "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz" integrity sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg== agent-base@6: version "6.0.2" - resolved "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" + resolved "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz" integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== dependencies: debug "4" ajv@^6.12.4: version "6.12.6" - resolved "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" + resolved "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz" integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== dependencies: fast-deep-equal "^3.1.1" @@ -617,39 +437,39 @@ ajv@^6.12.4: ansi-regex@^5.0.1: version "5.0.1" - resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" + resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz" integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== ansi-regex@^6.0.1: version "6.0.1" - resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz#3183e38fae9a65d7cb5e53945cd5897d0260a06a" + resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz" integrity sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA== ansi-styles@^4.0.0, ansi-styles@^4.1.0: version "4.3.0" - resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz" integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== dependencies: color-convert "^2.0.1" ansi-styles@^5.0.0: version "5.2.0" - resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz#07449690ad45777d1924ac2abb2fc8895dba836b" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz" integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== ansi-styles@^6.1.0: version "6.2.1" - resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz#0e62320cf99c21afff3b3012192546aacbfb05c5" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz" integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== any-promise@^1.0.0: version "1.3.0" - resolved "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f" + resolved "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz" integrity sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A== anymatch@~3.1.2: version "3.1.3" - resolved "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" + resolved "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz" integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== dependencies: normalize-path "^3.0.0" @@ -657,39 +477,39 @@ anymatch@~3.1.2: arg@^5.0.2: version "5.0.2" - resolved "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz#c81433cc427c92c4dcf4865142dbca6f15acd59c" + resolved "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz" integrity sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg== argparse@^2.0.1: version "2.0.1" - resolved "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" + resolved "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz" integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== aria-query@^5.3.0: version "5.3.0" - resolved "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz#650c569e41ad90b51b3d7df5e5eed1c7549c103e" + resolved "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz" integrity sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A== dependencies: dequal "^2.0.3" array-union@^2.1.0: version "2.1.0" - resolved "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" + resolved "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz" integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== assertion-error@^1.1.0: version "1.1.0" - resolved "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz#e60b6b0e8f301bd97e5375215bda406c85118c0b" + resolved "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz" integrity sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw== asynckit@^0.4.0: version "0.4.0" - resolved "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + resolved "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz" integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== autoprefixer@^10.4.18: version "10.4.19" - resolved "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.19.tgz#ad25a856e82ee9d7898c59583c1afeb3fa65f89f" + resolved "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.19.tgz" integrity sha512-BaENR2+zBZ8xXhM4pUaKUxlVdxZ0EZhjvbopwnXmxRUfqDmwSpC2lAi/QXvx7NRdPCo1WKEcEF6mV64si1z4Ew== dependencies: browserslist "^4.23.0" @@ -701,31 +521,31 @@ autoprefixer@^10.4.18: axobject-query@^4.0.0: version "4.0.0" - resolved "https://registry.npmjs.org/axobject-query/-/axobject-query-4.0.0.tgz#04a4c90dce33cc5d606c76d6216e3b250ff70dab" + resolved "https://registry.npmjs.org/axobject-query/-/axobject-query-4.0.0.tgz" integrity sha512-+60uv1hiVFhHZeO+Lz0RYzsVHy5Wr1ayX0mwda9KPDVLNJgZ1T9Ny7VmFbLDzxsH0D87I86vgj3gFrjTJUYznw== dependencies: dequal "^2.0.3" balanced-match@^1.0.0: version "1.0.2" - resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz" integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== binary-extensions@^2.0.0: version "2.3.0" - resolved "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz#f6e14a97858d327252200242d4ccfe522c445522" + resolved "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz" integrity sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw== -blockly@^10.4.3: +blockly@^10.0.0, blockly@^10.4.3: version "10.4.3" - resolved "https://registry.npmjs.org/blockly/-/blockly-10.4.3.tgz#a3ca155e2ba7bae59883a143b8b901c781bfac0d" + resolved "https://registry.npmjs.org/blockly/-/blockly-10.4.3.tgz" integrity sha512-+opfBmQnSiv7vTiY/TkDEBOslxUyfj8luS3S+qs1NnQKjInC+Waf2l9cNsMh9J8BMkmiCIT+Ed/3mmjIaL9wug== dependencies: jsdom "22.1.0" brace-expansion@^1.1.7: version "1.1.11" - resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz" integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== dependencies: balanced-match "^1.0.0" @@ -733,21 +553,21 @@ brace-expansion@^1.1.7: brace-expansion@^2.0.1: version "2.0.1" - resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" + resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz" integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== dependencies: balanced-match "^1.0.0" braces@^3.0.2, braces@~3.0.2: version "3.0.2" - resolved "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" + resolved "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz" integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== dependencies: fill-range "^7.0.1" -browserslist@^4.23.0: +browserslist@^4.23.0, "browserslist@>= 4.21.0": version "4.23.0" - resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.23.0.tgz#8f3acc2bbe73af7213399430890f86c63a5674ab" + resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.23.0.tgz" integrity sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ== dependencies: caniuse-lite "^1.0.30001587" @@ -757,32 +577,32 @@ browserslist@^4.23.0: buffer-crc32@^0.2.5: version "0.2.13" - resolved "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242" + resolved "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz" integrity sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ== cac@^6.7.14: version "6.7.14" - resolved "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz#804e1e6f506ee363cb0e3ccbb09cad5dd9870959" + resolved "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz" integrity sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ== callsites@^3.0.0: version "3.1.0" - resolved "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" + resolved "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz" integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== camelcase-css@^2.0.1: version "2.0.1" - resolved "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz#ee978f6947914cc30c6b44741b6ed1df7f043fd5" + resolved "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz" integrity sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA== caniuse-lite@^1.0.30001587, caniuse-lite@^1.0.30001599: version "1.0.30001605" - resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001605.tgz#ca12d7330dd8bcb784557eb9aa64f0037870d9d6" + resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001605.tgz" integrity sha512-nXwGlFWo34uliI9z3n6Qc0wZaf7zaZWA1CPZ169La5mV3I/gem7bst0vr5XQH5TJXZIMfDeZyOrZnSlVzKxxHQ== chai@^4.3.10: version "4.4.1" - resolved "https://registry.npmjs.org/chai/-/chai-4.4.1.tgz#3603fa6eba35425b0f2ac91a009fe924106e50d1" + resolved "https://registry.npmjs.org/chai/-/chai-4.4.1.tgz" integrity sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g== dependencies: assertion-error "^1.1.0" @@ -795,7 +615,7 @@ chai@^4.3.10: chalk@^4.0.0: version "4.1.2" - resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== dependencies: ansi-styles "^4.1.0" @@ -803,14 +623,14 @@ chalk@^4.0.0: check-error@^1.0.3: version "1.0.3" - resolved "https://registry.npmjs.org/check-error/-/check-error-1.0.3.tgz#a6502e4312a7ee969f646e83bb3ddd56281bd694" + resolved "https://registry.npmjs.org/check-error/-/check-error-1.0.3.tgz" integrity sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg== dependencies: get-func-name "^2.0.2" chokidar@^3.4.1, chokidar@^3.5.3: version "3.6.0" - resolved "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz#197c6cc669ef2a8dc5e7b4d97ee4e092c3eb0d5b" + resolved "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz" integrity sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw== dependencies: anymatch "~3.1.2" @@ -825,7 +645,7 @@ chokidar@^3.4.1, chokidar@^3.5.3: code-red@^1.0.3: version "1.0.4" - resolved "https://registry.npmjs.org/code-red/-/code-red-1.0.4.tgz#59ba5c9d1d320a4ef795bc10a28bd42bfebe3e35" + resolved "https://registry.npmjs.org/code-red/-/code-red-1.0.4.tgz" integrity sha512-7qJWqItLA8/VPVlKJlFXU+NBlo/qyfs39aJcuMT/2ere32ZqvF5OSxgdM5xOfJJ7O429gg2HM47y8v9P+9wrNw== dependencies: "@jridgewell/sourcemap-codec" "^1.4.15" @@ -836,41 +656,41 @@ code-red@^1.0.3: color-convert@^2.0.1: version "2.0.1" - resolved "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + resolved "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz" integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== dependencies: color-name "~1.1.4" color-name@~1.1.4: version "1.1.4" - resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== combined-stream@^1.0.8: version "1.0.8" - resolved "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" + resolved "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz" integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== dependencies: delayed-stream "~1.0.0" commander@^4.0.0: version "4.1.1" - resolved "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz#9fd602bd936294e9e9ef46a3f4d6964044b18068" + resolved "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz" integrity sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA== concat-map@0.0.1: version "0.0.1" - resolved "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + resolved "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== cookie@^0.6.0: version "0.6.0" - resolved "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz#2798b04b071b0ecbff0dbb62a505a8efa4e19051" + resolved "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz" integrity sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw== cross-spawn@^7.0.0, cross-spawn@^7.0.2, cross-spawn@^7.0.3: version "7.0.3" - resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" + resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz" integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== dependencies: path-key "^3.1.0" @@ -879,7 +699,7 @@ cross-spawn@^7.0.0, cross-spawn@^7.0.2, cross-spawn@^7.0.3: css-selector-tokenizer@^0.8: version "0.8.0" - resolved "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.8.0.tgz#88267ef6238e64f2215ea2764b3e2cf498b845dd" + resolved "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.8.0.tgz" integrity sha512-Jd6Ig3/pe62/qe5SBPTN8h8LeUg/pT4lLgtavPf7updwwHpvFzxvOQBHYj2LZDMjUnBzgvIUSjRcf6oT5HzHFg== dependencies: cssesc "^3.0.0" @@ -887,7 +707,7 @@ css-selector-tokenizer@^0.8: css-tree@^2.3.1: version "2.3.1" - resolved "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz#10264ce1e5442e8572fc82fbe490644ff54b5c20" + resolved "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz" integrity sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw== dependencies: mdn-data "2.0.30" @@ -895,24 +715,24 @@ css-tree@^2.3.1: cssesc@^3.0.0: version "3.0.0" - resolved "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" + resolved "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz" integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== cssstyle@^3.0.0: version "3.0.0" - resolved "https://registry.npmjs.org/cssstyle/-/cssstyle-3.0.0.tgz#17ca9c87d26eac764bb8cfd00583cff21ce0277a" + resolved "https://registry.npmjs.org/cssstyle/-/cssstyle-3.0.0.tgz" integrity sha512-N4u2ABATi3Qplzf0hWbVCdjenim8F3ojEXpBDF5hBpjzW182MjNGLqfmQ0SkSPeQ+V86ZXgeH8aXj6kayd4jgg== dependencies: rrweb-cssom "^0.6.0" culori@^3: version "3.3.0" - resolved "https://registry.npmjs.org/culori/-/culori-3.3.0.tgz#e33530adbd124d53bd6550394397e695eaaed739" + resolved "https://registry.npmjs.org/culori/-/culori-3.3.0.tgz" integrity sha512-pHJg+jbuFsCjz9iclQBqyL3B2HLCBF71BwVNujUYEvCeQMvV97R59MNK3R2+jgJ3a1fcZgI9B3vYgz8lzr/BFQ== daisyui@^4.9.0: version "4.9.0" - resolved "https://registry.npmjs.org/daisyui/-/daisyui-4.9.0.tgz#c99b0d7146567a73735c56da9895a789da9c73aa" + resolved "https://registry.npmjs.org/daisyui/-/daisyui-4.9.0.tgz" integrity sha512-9JsDx4E+30kPxThE+6yEwQokqg1957uwTx/skP2RE98fG6Ten6U+S9YXeQg1a3CI958aF5aOb0oEA+KZFfrZUA== dependencies: css-selector-tokenizer "^0.8" @@ -922,136 +742,136 @@ daisyui@^4.9.0: data-urls@^4.0.0: version "4.0.0" - resolved "https://registry.npmjs.org/data-urls/-/data-urls-4.0.0.tgz#333a454eca6f9a5b7b0f1013ff89074c3f522dd4" + resolved "https://registry.npmjs.org/data-urls/-/data-urls-4.0.0.tgz" integrity sha512-/mMTei/JXPqvFqQtfyTowxmJVwr2PVAeCcDxyFf6LhoOu/09TX2OX3kb2wzi4DMXcfj4OItwDOnhl5oziPnT6g== dependencies: abab "^2.0.6" whatwg-mimetype "^3.0.0" whatwg-url "^12.0.0" -debug@4, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4: +debug@^4.3.1, debug@^4.3.2, debug@^4.3.4, debug@4: version "4.3.4" - resolved "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" + resolved "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz" integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== dependencies: ms "2.1.2" decimal.js@^10.4.3: version "10.4.3" - resolved "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz#1044092884d245d1b7f65725fa4ad4c6f781cc23" + resolved "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz" integrity sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA== deep-eql@^4.1.3: version "4.1.3" - resolved "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz#7c7775513092f7df98d8df9996dd085eb668cc6d" + resolved "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz" integrity sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw== dependencies: type-detect "^4.0.0" deep-is@^0.1.3: version "0.1.4" - resolved "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" + resolved "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz" integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== deepmerge@^4.3.1: version "4.3.1" - resolved "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz#44b5f2147cd3b00d4b56137685966f26fd25dd4a" + resolved "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz" integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A== delayed-stream@~1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + resolved "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz" integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== dequal@^2.0.3: version "2.0.3" - resolved "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz#2644214f1997d39ed0ee0ece72335490a7ac67be" + resolved "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz" integrity sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA== detect-indent@^6.1.0: version "6.1.0" - resolved "https://registry.npmjs.org/detect-indent/-/detect-indent-6.1.0.tgz#592485ebbbf6b3b1ab2be175c8393d04ca0d57e6" + resolved "https://registry.npmjs.org/detect-indent/-/detect-indent-6.1.0.tgz" integrity sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA== devalue@^4.3.2: version "4.3.2" - resolved "https://registry.npmjs.org/devalue/-/devalue-4.3.2.tgz#cc44e4cf3872ac5a78229fbce3b77e57032727b5" + resolved "https://registry.npmjs.org/devalue/-/devalue-4.3.2.tgz" integrity sha512-KqFl6pOgOW+Y6wJgu80rHpo2/3H07vr8ntR9rkkFIRETewbf5GaYYcakYfiKz89K+sLsuPkQIZaXDMjUObZwWg== dexie@^4.0.1: - version "4.0.1" - resolved "https://registry.npmjs.org/dexie/-/dexie-4.0.1.tgz#0b2aa9a39f706f0bb970134047afaa326a3c923e" - integrity sha512-wSNn+TcCh+DuE2pdg058K3MhxA4g+IiZlW7yGz4cMd/t3z2rJXZcV3HDxZljbrICU2Iq0qY4UHnbolTMK/+bcA== + version "4.0.8" + resolved "https://registry.npmjs.org/dexie/-/dexie-4.0.8.tgz" + integrity sha512-1G6cJevS17KMDK847V3OHvK2zei899GwpDiqfEXHP1ASvme6eWJmAp9AU4s1son2TeGkWmC0g3y8ezOBPnalgQ== didyoumean@^1.2.2: version "1.2.2" - resolved "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz#989346ffe9e839b4555ecf5666edea0d3e8ad037" + resolved "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz" integrity sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw== diff-sequences@^29.6.3: version "29.6.3" - resolved "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz#4deaf894d11407c51efc8418012f9e70b84ea921" + resolved "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz" integrity sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q== dir-glob@^3.0.1: version "3.0.1" - resolved "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" + resolved "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz" integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== dependencies: path-type "^4.0.0" dlv@^1.1.3: version "1.1.3" - resolved "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz#5c198a8a11453596e751494d49874bc7732f2e79" + resolved "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz" integrity sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA== doctrine@^3.0.0: version "3.0.0" - resolved "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" + resolved "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz" integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== dependencies: esutils "^2.0.2" domexception@^4.0.0: version "4.0.0" - resolved "https://registry.npmjs.org/domexception/-/domexception-4.0.0.tgz#4ad1be56ccadc86fc76d033353999a8037d03673" + resolved "https://registry.npmjs.org/domexception/-/domexception-4.0.0.tgz" integrity sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw== dependencies: webidl-conversions "^7.0.0" eastasianwidth@^0.2.0: version "0.2.0" - resolved "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb" + resolved "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz" integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== electron-to-chromium@^1.4.668: version "1.4.723" - resolved "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.723.tgz#827da30c96b316684d352c3d81430029df01bb8e" + resolved "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.723.tgz" integrity sha512-rxFVtrMGMFROr4qqU6n95rUi9IlfIm+lIAt+hOToy/9r6CDv0XiEcQdC3VP71y1pE5CFTzKV0RvxOGYCPWWHPw== emoji-regex@^8.0.0: version "8.0.0" - resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz" integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== emoji-regex@^9.2.2: version "9.2.2" - resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" + resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz" integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== entities@^4.4.0: version "4.5.0" - resolved "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz#5d268ea5e7113ec74c4d033b79ea5a35a488fb48" + resolved "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz" integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw== es6-promise@^3.1.2: version "3.3.1" - resolved "https://registry.npmjs.org/es6-promise/-/es6-promise-3.3.1.tgz#a08cdde84ccdbf34d027a1451bc91d4bcd28a613" + resolved "https://registry.npmjs.org/es6-promise/-/es6-promise-3.3.1.tgz" integrity sha512-SOp9Phqvqn7jtEUxPWdWfWoLmyt2VaJ6MpvP9Comy1MceMXqE6bxvaTu4iaxpYYPzhny28Lc+M87/c2cPK6lDg== esbuild@^0.20.1: version "0.20.2" - resolved "https://registry.npmjs.org/esbuild/-/esbuild-0.20.2.tgz#9d6b2386561766ee6b5a55196c6d766d28c87ea1" + resolved "https://registry.npmjs.org/esbuild/-/esbuild-0.20.2.tgz" integrity sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g== optionalDependencies: "@esbuild/aix-ppc64" "0.20.2" @@ -1080,27 +900,27 @@ esbuild@^0.20.1: escalade@^3.1.1: version "3.1.2" - resolved "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz#54076e9ab29ea5bf3d8f1ed62acffbb88272df27" + resolved "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz" integrity sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA== escape-string-regexp@^4.0.0: version "4.0.0" - resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" + resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz" integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== eslint-compat-utils@^0.1.2: version "0.1.2" - resolved "https://registry.npmjs.org/eslint-compat-utils/-/eslint-compat-utils-0.1.2.tgz#f45e3b5ced4c746c127cf724fb074cd4e730d653" + resolved "https://registry.npmjs.org/eslint-compat-utils/-/eslint-compat-utils-0.1.2.tgz" integrity sha512-Jia4JDldWnFNIru1Ehx1H5s9/yxiRHY/TimCuUc0jNexew3cF1gI6CYZil1ociakfWO3rRqFjl1mskBblB3RYg== eslint-config-prettier@^9.1.0: version "9.1.0" - resolved "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz#31af3d94578645966c082fcb71a5846d3c94867f" + resolved "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz" integrity sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw== eslint-plugin-svelte@^2.35.1: version "2.35.1" - resolved "https://registry.npmjs.org/eslint-plugin-svelte/-/eslint-plugin-svelte-2.35.1.tgz#7b1e3c263b09dbc9293c25fe02d03d309725d2b9" + resolved "https://registry.npmjs.org/eslint-plugin-svelte/-/eslint-plugin-svelte-2.35.1.tgz" integrity sha512-IF8TpLnROSGy98Z3NrsKXWDSCbNY2ReHDcrYTuXZMbfX7VmESISR78TWgO9zdg4Dht1X8coub5jKwHzP0ExRug== dependencies: "@eslint-community/eslint-utils" "^4.2.0" @@ -1118,7 +938,7 @@ eslint-plugin-svelte@^2.35.1: eslint-scope@^7.0.0, eslint-scope@^7.2.2: version "7.2.2" - resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz#deb4f92563390f32006894af62a22dba1c46423f" + resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz" integrity sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg== dependencies: esrecurse "^4.3.0" @@ -1126,12 +946,12 @@ eslint-scope@^7.0.0, eslint-scope@^7.2.2: eslint-visitor-keys@^3.0.0, eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4.3: version "3.4.3" - resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800" + resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz" integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== -eslint@^8.56.0: +"eslint@^6.0.0 || ^7.0.0 || >=8.0.0", "eslint@^7.0.0 || ^8.0.0-0", eslint@^8.56.0, eslint@>=6.0.0, eslint@>=7.0.0: version "8.57.0" - resolved "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz#c786a6fd0e0b68941aaf624596fb987089195668" + resolved "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz" integrity sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ== dependencies: "@eslint-community/eslint-utils" "^4.2.0" @@ -1175,12 +995,12 @@ eslint@^8.56.0: esm-env@^1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/esm-env/-/esm-env-1.0.0.tgz#b124b40b180711690a4cb9b00d16573391950413" + resolved "https://registry.npmjs.org/esm-env/-/esm-env-1.0.0.tgz" integrity sha512-Cf6VksWPsTuW01vU9Mk/3vRue91Zevka5SjyNf3nEpokFRuqt/KjUQoGAwq9qMmhpLTHmXzSIrFRw8zxWzmFBA== espree@^9.0.0, espree@^9.6.0, espree@^9.6.1: version "9.6.1" - resolved "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz#a2a17b8e434690a5432f2f8018ce71d331a48c6f" + resolved "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz" integrity sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ== dependencies: acorn "^8.9.0" @@ -1189,38 +1009,38 @@ espree@^9.0.0, espree@^9.6.0, espree@^9.6.1: esquery@^1.4.2: version "1.5.0" - resolved "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz#6ce17738de8577694edd7361c57182ac8cb0db0b" + resolved "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz" integrity sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg== dependencies: estraverse "^5.1.0" esrecurse@^4.3.0: version "4.3.0" - resolved "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" + resolved "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz" integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== dependencies: estraverse "^5.2.0" estraverse@^5.1.0, estraverse@^5.2.0: version "5.3.0" - resolved "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" + resolved "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz" integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== estree-walker@^3.0.0, estree-walker@^3.0.3: version "3.0.3" - resolved "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz#67c3e549ec402a487b4fc193d1953a524752340d" + resolved "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz" integrity sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g== dependencies: "@types/estree" "^1.0.0" esutils@^2.0.2, esutils@^2.0.3: version "2.0.3" - resolved "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" + resolved "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz" integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== execa@^8.0.1: version "8.0.1" - resolved "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz#51f6a5943b580f963c3ca9c6321796db8cc39b8c" + resolved "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz" integrity sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg== dependencies: cross-spawn "^7.0.3" @@ -1235,12 +1055,12 @@ execa@^8.0.1: fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: version "3.1.3" - resolved "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" + resolved "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz" integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== fast-glob@^3.2.7, fast-glob@^3.2.9, fast-glob@^3.3.0: version "3.3.2" - resolved "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz#a904501e57cfdd2ffcded45e99a54fef55e46129" + resolved "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz" integrity sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow== dependencies: "@nodelib/fs.stat" "^2.0.2" @@ -1251,43 +1071,43 @@ fast-glob@^3.2.7, fast-glob@^3.2.9, fast-glob@^3.3.0: fast-json-stable-stringify@^2.0.0: version "2.1.0" - resolved "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" + resolved "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz" integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== fast-levenshtein@^2.0.6: version "2.0.6" - resolved "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + resolved "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz" integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== fastparse@^1.1.2: version "1.1.2" - resolved "https://registry.npmjs.org/fastparse/-/fastparse-1.1.2.tgz#91728c5a5942eced8531283c79441ee4122c35a9" + resolved "https://registry.npmjs.org/fastparse/-/fastparse-1.1.2.tgz" integrity sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ== fastq@^1.6.0: version "1.17.1" - resolved "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz#2a523f07a4e7b1e81a42b91b8bf2254107753b47" + resolved "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz" integrity sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w== dependencies: reusify "^1.0.4" file-entry-cache@^6.0.1: version "6.0.1" - resolved "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" + resolved "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz" integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== dependencies: flat-cache "^3.0.4" fill-range@^7.0.1: version "7.0.1" - resolved "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" + resolved "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz" integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== dependencies: to-regex-range "^5.0.1" find-up@^5.0.0: version "5.0.0" - resolved "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" + resolved "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz" integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== dependencies: locate-path "^6.0.0" @@ -1295,7 +1115,7 @@ find-up@^5.0.0: flat-cache@^3.0.4: version "3.2.0" - resolved "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz#2c0c2d5040c99b1632771a9d105725c0115363ee" + resolved "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz" integrity sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw== dependencies: flatted "^3.2.9" @@ -1304,12 +1124,12 @@ flat-cache@^3.0.4: flatted@^3.2.9: version "3.3.1" - resolved "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz#21db470729a6734d4997002f439cb308987f567a" + resolved "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz" integrity sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw== foreground-child@^3.1.0: version "3.1.1" - resolved "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz#1d173e776d75d2772fed08efe4a0de1ea1b12d0d" + resolved "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz" integrity sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg== dependencies: cross-spawn "^7.0.0" @@ -1317,7 +1137,7 @@ foreground-child@^3.1.0: form-data@^4.0.0: version "4.0.0" - resolved "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452" + resolved "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz" integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww== dependencies: asynckit "^0.4.0" @@ -1326,56 +1146,53 @@ form-data@^4.0.0: fraction.js@^4.3.7: version "4.3.7" - resolved "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz#06ca0085157e42fda7f9e726e79fefc4068840f7" + resolved "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz" integrity sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew== fs.realpath@^1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + resolved "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz" integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== -fsevents@2.3.2: - version "2.3.2" - resolved "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" - integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== - -fsevents@~2.3.2, fsevents@~2.3.3: - version "2.3.3" - resolved "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" - integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== - function-bind@^1.1.2: version "1.1.2" - resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" + resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz" integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== get-func-name@^2.0.1, get-func-name@^2.0.2: version "2.0.2" - resolved "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz#0d7cf20cd13fda808669ffa88f4ffc7a3943fc41" + resolved "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz" integrity sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ== get-stream@^8.0.1: version "8.0.1" - resolved "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz#def9dfd71742cd7754a7761ed43749a27d02eca2" + resolved "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz" integrity sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA== -glob-parent@^5.1.2, glob-parent@~5.1.2: +glob-parent@^5.1.2: version "5.1.2" - resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz" integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== dependencies: is-glob "^4.0.1" glob-parent@^6.0.2: version "6.0.2" - resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" + resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz" integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== dependencies: is-glob "^4.0.3" +glob-parent@~5.1.2: + version "5.1.2" + resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + dependencies: + is-glob "^4.0.1" + glob@^10.3.10: version "10.3.12" - resolved "https://registry.npmjs.org/glob/-/glob-10.3.12.tgz#3a65c363c2e9998d220338e88a5f6ac97302960b" + resolved "https://registry.npmjs.org/glob/-/glob-10.3.12.tgz" integrity sha512-TCNv8vJ+xz4QiqTpfOJA7HvYv+tNIRHKfUWw/q+v2jdgN4ebz+KY9tGx5J4rHP0o84mNP+ApH66HRX8us3Khqg== dependencies: foreground-child "^3.1.0" @@ -1386,7 +1203,7 @@ glob@^10.3.10: glob@^7.1.3: version "7.2.3" - resolved "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" + resolved "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz" integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== dependencies: fs.realpath "^1.0.0" @@ -1398,19 +1215,19 @@ glob@^7.1.3: globals@^13.19.0: version "13.24.0" - resolved "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz#8432a19d78ce0c1e833949c36adb345400bb1171" + resolved "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz" integrity sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ== dependencies: type-fest "^0.20.2" globalyzer@0.1.0: version "0.1.0" - resolved "https://registry.npmjs.org/globalyzer/-/globalyzer-0.1.0.tgz#cb76da79555669a1519d5a8edf093afaa0bf1465" + resolved "https://registry.npmjs.org/globalyzer/-/globalyzer-0.1.0.tgz" integrity sha512-40oNTM9UfG6aBmuKxk/giHn5nQ8RVz/SS4Ir6zgzOv9/qC3kKZ9v4etGTcJbEl/NyVQH7FGU7d+X1egr57Md2Q== globby@^11.1.0: version "11.1.0" - resolved "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" + resolved "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz" integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== dependencies: array-union "^2.1.0" @@ -1422,41 +1239,41 @@ globby@^11.1.0: globrex@^0.1.2: version "0.1.2" - resolved "https://registry.npmjs.org/globrex/-/globrex-0.1.2.tgz#dd5d9ec826232730cd6793a5e33a9302985e6098" + resolved "https://registry.npmjs.org/globrex/-/globrex-0.1.2.tgz" integrity sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg== graceful-fs@^4.1.3: version "4.2.11" - resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" + resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz" integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== graphemer@^1.4.0: version "1.4.0" - resolved "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6" + resolved "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz" integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== has-flag@^4.0.0: version "4.0.0" - resolved "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + resolved "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz" integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== hasown@^2.0.0: version "2.0.2" - resolved "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" + resolved "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz" integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== dependencies: function-bind "^1.1.2" html-encoding-sniffer@^3.0.0: version "3.0.0" - resolved "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz#2cb1a8cf0db52414776e5b2a7a04d5dd98158de9" + resolved "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz" integrity sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA== dependencies: whatwg-encoding "^2.0.0" http-proxy-agent@^5.0.0: version "5.0.0" - resolved "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz#5129800203520d434f142bc78ff3c170800f2b43" + resolved "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz" integrity sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w== dependencies: "@tootallnate/once" "2" @@ -1465,7 +1282,7 @@ http-proxy-agent@^5.0.0: https-proxy-agent@^5.0.1: version "5.0.1" - resolved "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz#c59ef224a04fe8b754f3db0063a25ea30d0005d6" + resolved "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz" integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA== dependencies: agent-base "6" @@ -1473,24 +1290,24 @@ https-proxy-agent@^5.0.1: human-signals@^5.0.0: version "5.0.0" - resolved "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz#42665a284f9ae0dade3ba41ebc37eb4b852f3a28" + resolved "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz" integrity sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ== iconv-lite@0.6.3: version "0.6.3" - resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" + resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz" integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== dependencies: safer-buffer ">= 2.1.2 < 3.0.0" ignore@^5.2.0, ignore@^5.2.4: version "5.3.1" - resolved "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz#5073e554cd42c5b33b394375f538b8593e34d4ef" + resolved "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz" integrity sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw== import-fresh@^3.2.1: version "3.3.0" - resolved "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" + resolved "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz" integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== dependencies: parent-module "^1.0.0" @@ -1498,17 +1315,17 @@ import-fresh@^3.2.1: import-meta-resolve@^4.0.0: version "4.0.0" - resolved "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-4.0.0.tgz#0b1195915689f60ab00f830af0f15cc841e8919e" + resolved "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-4.0.0.tgz" integrity sha512-okYUR7ZQPH+efeuMJGlq4f8ubUgO50kByRPyt/Cy1Io4PSRsPjxME+YlVaCOx+NIToW7hCsZNFJyTPFFKepRSA== imurmurhash@^0.1.4: version "0.1.4" - resolved "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + resolved "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz" integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== inflight@^1.0.4: version "1.0.6" - resolved "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + resolved "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz" integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== dependencies: once "^1.3.0" @@ -1516,75 +1333,75 @@ inflight@^1.0.4: inherits@2: version "2.0.4" - resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== is-binary-path@~2.1.0: version "2.1.0" - resolved "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" + resolved "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz" integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== dependencies: binary-extensions "^2.0.0" is-core-module@^2.13.0: version "2.13.1" - resolved "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz#ad0d7532c6fea9da1ebdc82742d74525c6273384" + resolved "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz" integrity sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw== dependencies: hasown "^2.0.0" is-extglob@^2.1.1: version "2.1.1" - resolved "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + resolved "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz" integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== is-fullwidth-code-point@^3.0.0: version "3.0.0" - resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz" integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: version "4.0.3" - resolved "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" + resolved "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz" integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== dependencies: is-extglob "^2.1.1" is-number@^7.0.0: version "7.0.0" - resolved "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + resolved "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz" integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== is-path-inside@^3.0.3: version "3.0.3" - resolved "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" + resolved "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz" integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== is-potential-custom-element-name@^1.0.1: version "1.0.1" - resolved "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz#171ed6f19e3ac554394edf78caa05784a45bebb5" + resolved "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz" integrity sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ== is-reference@^3.0.0, is-reference@^3.0.1: version "3.0.2" - resolved "https://registry.npmjs.org/is-reference/-/is-reference-3.0.2.tgz#154747a01f45cd962404ee89d43837af2cba247c" + resolved "https://registry.npmjs.org/is-reference/-/is-reference-3.0.2.tgz" integrity sha512-v3rht/LgVcsdZa3O2Nqs+NMowLOxeOm7Ay9+/ARQ2F+qEoANRcqrjAZKGN0v8ymUetZGgkp26LTnGT7H0Qo9Pg== dependencies: "@types/estree" "*" is-stream@^3.0.0: version "3.0.0" - resolved "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz#e6bfd7aa6bef69f4f472ce9bb681e3e57b4319ac" + resolved "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz" integrity sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA== isexe@^2.0.0: version "2.0.0" - resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz" integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== jackspeak@^2.3.6: version "2.3.6" - resolved "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz#647ecc472238aee4b06ac0e461acc21a8c505ca8" + resolved "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz" integrity sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ== dependencies: "@isaacs/cliui" "^8.0.2" @@ -1593,24 +1410,24 @@ jackspeak@^2.3.6: jiti@^1.21.0: version "1.21.0" - resolved "https://registry.npmjs.org/jiti/-/jiti-1.21.0.tgz#7c97f8fe045724e136a397f7340475244156105d" + resolved "https://registry.npmjs.org/jiti/-/jiti-1.21.0.tgz" integrity sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q== js-tokens@^9.0.0: version "9.0.0" - resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-9.0.0.tgz#0f893996d6f3ed46df7f0a3b12a03f5fd84223c1" + resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-9.0.0.tgz" integrity sha512-WriZw1luRMlmV3LGJaR6QOJjWwgLUTf89OwT2lUOyjX2dJGBwgmIkbcz+7WFZjrZM635JOIR517++e/67CP9dQ== js-yaml@^4.1.0: version "4.1.0" - resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" + resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz" integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== dependencies: argparse "^2.0.1" -jsdom@22.1.0: +jsdom@*, jsdom@22.1.0: version "22.1.0" - resolved "https://registry.npmjs.org/jsdom/-/jsdom-22.1.0.tgz#0fca6d1a37fbeb7f4aac93d1090d782c56b611c8" + resolved "https://registry.npmjs.org/jsdom/-/jsdom-22.1.0.tgz" integrity sha512-/9AVW7xNbsBv6GfWho4TTNjEo9fe6Zhf9O7s0Fhhr3u+awPwAJMKwAMXnkk5vBxflqLW9hTHX/0cs+P3gW+cQw== dependencies: abab "^2.0.6" @@ -1639,44 +1456,44 @@ jsdom@22.1.0: json-buffer@3.0.1: version "3.0.1" - resolved "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" + resolved "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz" integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== json-schema-traverse@^0.4.1: version "0.4.1" - resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz" integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== json-stable-stringify-without-jsonify@^1.0.1: version "1.0.1" - resolved "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" + resolved "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz" integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== jsonc-parser@^3.2.0: version "3.2.1" - resolved "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.1.tgz#031904571ccf929d7670ee8c547545081cb37f1a" + resolved "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.1.tgz" integrity sha512-AilxAyFOAcK5wA1+LeaySVBrHsGQvUFCDWXKpZjzaL0PqW+xfBOttn8GNtWKFWqneyMZj41MWF9Kl6iPWLwgOA== keyv@^4.5.3: version "4.5.4" - resolved "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93" + resolved "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz" integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw== dependencies: json-buffer "3.0.1" kleur@^4.1.5: version "4.1.5" - resolved "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz#95106101795f7050c6c650f350c683febddb1780" + resolved "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz" integrity sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ== known-css-properties@^0.29.0: version "0.29.0" - resolved "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.29.0.tgz#e8ba024fb03886f23cb882e806929f32d814158f" + resolved "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.29.0.tgz" integrity sha512-Ne7wqW7/9Cz54PDt4I3tcV+hAyat8ypyOGzYRJQfdxnnjeWsTxt1cy8pjvvKeI5kfXuyvULyeeAvwvvtAX3ayQ== levn@^0.4.1: version "0.4.1" - resolved "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" + resolved "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz" integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== dependencies: prelude-ls "^1.2.1" @@ -1684,22 +1501,22 @@ levn@^0.4.1: lilconfig@^2.0.5, lilconfig@^2.1.0: version "2.1.0" - resolved "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz#78e23ac89ebb7e1bfbf25b18043de756548e7f52" + resolved "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz" integrity sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ== lilconfig@^3.0.0: version "3.1.1" - resolved "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.1.tgz#9d8a246fa753106cfc205fd2d77042faca56e5e3" + resolved "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.1.tgz" integrity sha512-O18pf7nyvHTckunPWCV1XUNXU1piu01y2b7ATJ0ppkUkk8ocqVWBrYjJBCwHDjD/ZWcfyrA0P4gKhzWGi5EINQ== lines-and-columns@^1.1.6: version "1.2.4" - resolved "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" + resolved "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz" integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== local-pkg@^0.5.0: version "0.5.0" - resolved "https://registry.npmjs.org/local-pkg/-/local-pkg-0.5.0.tgz#093d25a346bae59a99f80e75f6e9d36d7e8c925c" + resolved "https://registry.npmjs.org/local-pkg/-/local-pkg-0.5.0.tgz" integrity sha512-ok6z3qlYyCDS4ZEU27HaU6x/xZa9Whf8jD4ptH5UZTQYZVYeb9bnZ3ojVhiJNLiXK1Hfc0GNbLXcmZ5plLDDBg== dependencies: mlly "^1.4.2" @@ -1707,65 +1524,65 @@ local-pkg@^0.5.0: locate-character@^3.0.0: version "3.0.0" - resolved "https://registry.npmjs.org/locate-character/-/locate-character-3.0.0.tgz#0305c5b8744f61028ef5d01f444009e00779f974" + resolved "https://registry.npmjs.org/locate-character/-/locate-character-3.0.0.tgz" integrity sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA== locate-path@^6.0.0: version "6.0.0" - resolved "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" + resolved "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz" integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== dependencies: p-locate "^5.0.0" lodash.merge@^4.6.2: version "4.6.2" - resolved "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" + resolved "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz" integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== loupe@^2.3.6, loupe@^2.3.7: version "2.3.7" - resolved "https://registry.npmjs.org/loupe/-/loupe-2.3.7.tgz#6e69b7d4db7d3ab436328013d37d1c8c3540c697" + resolved "https://registry.npmjs.org/loupe/-/loupe-2.3.7.tgz" integrity sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA== dependencies: get-func-name "^2.0.1" lru-cache@^10.2.0: version "10.2.0" - resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.0.tgz#0bd445ca57363465900f4d1f9bd8db343a4d95c3" + resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.0.tgz" integrity sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q== lru-cache@^6.0.0: version "6.0.0" - resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" + resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz" integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== dependencies: yallist "^4.0.0" magic-string@^0.30.4, magic-string@^0.30.5: version "0.30.8" - resolved "https://registry.npmjs.org/magic-string/-/magic-string-0.30.8.tgz#14e8624246d2bedba70d5462aa99ac9681844613" + resolved "https://registry.npmjs.org/magic-string/-/magic-string-0.30.8.tgz" integrity sha512-ISQTe55T2ao7XtlAStud6qwYPZjE4GK1S/BeVPus4jrq6JuOnQ00YKQC581RWhR122W7msZV263KzVeLoqidyQ== dependencies: "@jridgewell/sourcemap-codec" "^1.4.15" mdn-data@2.0.30: version "2.0.30" - resolved "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz#ce4df6f80af6cfbe218ecd5c552ba13c4dfa08cc" + resolved "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz" integrity sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA== merge-stream@^2.0.0: version "2.0.0" - resolved "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" + resolved "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz" integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== merge2@^1.3.0, merge2@^1.4.1: version "1.4.1" - resolved "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" + resolved "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz" integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== micromatch@^4.0.4, micromatch@^4.0.5: version "4.0.5" - resolved "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" + resolved "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz" integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== dependencies: braces "^3.0.2" @@ -1773,67 +1590,74 @@ micromatch@^4.0.4, micromatch@^4.0.5: mime-db@1.52.0: version "1.52.0" - resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" + resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz" integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== mime-types@^2.1.12: version "2.1.35" - resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" + resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz" integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== dependencies: mime-db "1.52.0" mimic-fn@^4.0.0: version "4.0.0" - resolved "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz#60a90550d5cb0b239cca65d893b1a53b29871ecc" + resolved "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz" integrity sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw== min-indent@^1.0.0: version "1.0.1" - resolved "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz#a63f681673b30571fbe8bc25686ae746eefa9869" + resolved "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz" integrity sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg== -minimatch@9.0.3: - version "9.0.3" - resolved "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz#a6e00c3de44c3a542bfaae70abfc22420a6da825" - integrity sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg== +minimatch@^3.0.5: + version "3.1.2" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== dependencies: - brace-expansion "^2.0.1" + brace-expansion "^1.1.7" -minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: +minimatch@^3.1.1: version "3.1.2" - resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz" integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== dependencies: brace-expansion "^1.1.7" -minimatch@^9.0.1: - version "9.0.4" - resolved "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz#8e49c731d1749cbec05050ee5145147b32496a51" - integrity sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw== +minimatch@^3.1.2: + version "3.1.2" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== + dependencies: + brace-expansion "^1.1.7" + +minimatch@^9.0.1, minimatch@9.0.3: + version "9.0.3" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz" + integrity sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg== dependencies: brace-expansion "^2.0.1" minimist@^1.2.0, minimist@^1.2.6: version "1.2.8" - resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" + resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz" integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== "minipass@^5.0.0 || ^6.0.2 || ^7.0.0", minipass@^7.0.4: version "7.0.4" - resolved "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz#dbce03740f50a4786ba994c1fb908844d27b038c" + resolved "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz" integrity sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ== mkdirp@^0.5.1: version "0.5.6" - resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6" + resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz" integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw== dependencies: minimist "^1.2.6" mlly@^1.2.0, mlly@^1.4.2: version "1.6.1" - resolved "https://registry.npmjs.org/mlly/-/mlly-1.6.1.tgz#0983067dc3366d6314fc5e12712884e6978d028f" + resolved "https://registry.npmjs.org/mlly/-/mlly-1.6.1.tgz" integrity sha512-vLgaHvaeunuOXHSmEbZ9izxPx3USsk8KCQ8iC+aTlp5sKRSoZvwhHh5L9VbKSaVC6sJDqbyohIS76E2VmHIPAA== dependencies: acorn "^8.11.3" @@ -1843,22 +1667,22 @@ mlly@^1.2.0, mlly@^1.4.2: mri@^1.1.0: version "1.2.0" - resolved "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz#6721480fec2a11a4889861115a48b6cbe7cc8f0b" + resolved "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz" integrity sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA== mrmime@^2.0.0: version "2.0.0" - resolved "https://registry.npmjs.org/mrmime/-/mrmime-2.0.0.tgz#151082a6e06e59a9a39b46b3e14d5cfe92b3abb4" + resolved "https://registry.npmjs.org/mrmime/-/mrmime-2.0.0.tgz" integrity sha512-eu38+hdgojoyq63s+yTpN4XMBdt5l8HhMhc4VKLO9KM5caLIBvUm4thi7fFaxyTmCKeNnXZ5pAlBwCUnhA09uw== ms@2.1.2: version "2.1.2" - resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz" integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== mz@^2.7.0: version "2.7.0" - resolved "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz#95008057a56cafadc2bc63dde7f9ff6955948e32" + resolved "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz" integrity sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q== dependencies: any-promise "^1.0.0" @@ -1867,68 +1691,68 @@ mz@^2.7.0: nanoid@^3.3.7: version "3.3.7" - resolved "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz#d0c301a691bc8d54efa0a2226ccf3fe2fd656bd8" + resolved "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz" integrity sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g== natural-compare@^1.4.0: version "1.4.0" - resolved "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" + resolved "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz" integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== node-releases@^2.0.14: version "2.0.14" - resolved "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz#2ffb053bceb8b2be8495ece1ab6ce600c4461b0b" + resolved "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz" integrity sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw== normalize-path@^3.0.0, normalize-path@~3.0.0: version "3.0.0" - resolved "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + resolved "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz" integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== normalize-range@^0.1.2: version "0.1.2" - resolved "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" + resolved "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz" integrity sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA== npm-run-path@^5.1.0: version "5.3.0" - resolved "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz#e23353d0ebb9317f174e93417e4a4d82d0249e9f" + resolved "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz" integrity sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ== dependencies: path-key "^4.0.0" nwsapi@^2.2.4: version "2.2.7" - resolved "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.7.tgz#738e0707d3128cb750dddcfe90e4610482df0f30" + resolved "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.7.tgz" integrity sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ== object-assign@^4.0.1: version "4.1.1" - resolved "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + resolved "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== object-hash@^3.0.0: version "3.0.0" - resolved "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz#73f97f753e7baffc0e2cc9d6e079079744ac82e9" + resolved "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz" integrity sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw== once@^1.3.0: version "1.4.0" - resolved "https://registry.npmjs.org/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + resolved "https://registry.npmjs.org/once/-/once-1.4.0.tgz" integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== dependencies: wrappy "1" onetime@^6.0.0: version "6.0.0" - resolved "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz#7c24c18ed1fd2e9bca4bd26806a33613c77d34b4" + resolved "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz" integrity sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ== dependencies: mimic-fn "^4.0.0" optionator@^0.9.3: version "0.9.3" - resolved "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz#007397d44ed1872fdc6ed31360190f81814e2c64" + resolved "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz" integrity sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg== dependencies: "@aashutoshrathi/word-wrap" "^1.2.3" @@ -1940,67 +1764,67 @@ optionator@^0.9.3: p-limit@^3.0.2: version "3.1.0" - resolved "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" + resolved "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz" integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== dependencies: yocto-queue "^0.1.0" p-limit@^5.0.0: version "5.0.0" - resolved "https://registry.npmjs.org/p-limit/-/p-limit-5.0.0.tgz#6946d5b7140b649b7a33a027d89b4c625b3a5985" + resolved "https://registry.npmjs.org/p-limit/-/p-limit-5.0.0.tgz" integrity sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ== dependencies: yocto-queue "^1.0.0" p-locate@^5.0.0: version "5.0.0" - resolved "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" + resolved "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz" integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== dependencies: p-limit "^3.0.2" parent-module@^1.0.0: version "1.0.1" - resolved "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" + resolved "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz" integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== dependencies: callsites "^3.0.0" parse5@^7.1.2: version "7.1.2" - resolved "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz#0736bebbfd77793823240a23b7fc5e010b7f8e32" + resolved "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz" integrity sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw== dependencies: entities "^4.4.0" path-exists@^4.0.0: version "4.0.0" - resolved "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" + resolved "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz" integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== path-is-absolute@^1.0.0: version "1.0.1" - resolved "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + resolved "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz" integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== path-key@^3.1.0: version "3.1.1" - resolved "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + resolved "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz" integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== path-key@^4.0.0: version "4.0.0" - resolved "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz#295588dc3aee64154f877adb9d780b81c554bf18" + resolved "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz" integrity sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ== path-parse@^1.0.7: version "1.0.7" - resolved "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" + resolved "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz" integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== path-scurry@^1.10.2: version "1.10.2" - resolved "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.2.tgz#8f6357eb1239d5fa1da8b9f70e9c080675458ba7" + resolved "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.2.tgz" integrity sha512-7xTavNy5RQXnsjANvVvMkEjvloOinkAjv/Z6Ildz9v2RinZ4SBKTWFOVRbaF8p0vpHnyjV/UwNDdKuUv6M5qcA== dependencies: lru-cache "^10.2.0" @@ -2008,22 +1832,22 @@ path-scurry@^1.10.2: path-type@^4.0.0: version "4.0.0" - resolved "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" + resolved "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz" integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== pathe@^1.1.0, pathe@^1.1.1, pathe@^1.1.2: version "1.1.2" - resolved "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz#6c4cb47a945692e48a1ddd6e4094d170516437ec" + resolved "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz" integrity sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ== pathval@^1.1.1: version "1.1.1" - resolved "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz#8534e77a77ce7ac5a2512ea21e0fdb8fcf6c3d8d" + resolved "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz" integrity sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ== periscopic@^3.1.0: version "3.1.0" - resolved "https://registry.npmjs.org/periscopic/-/periscopic-3.1.0.tgz#7e9037bf51c5855bd33b48928828db4afa79d97a" + resolved "https://registry.npmjs.org/periscopic/-/periscopic-3.1.0.tgz" integrity sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw== dependencies: "@types/estree" "^1.0.0" @@ -2032,27 +1856,27 @@ periscopic@^3.1.0: picocolors@^1, picocolors@^1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" + resolved "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz" integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1: version "2.3.1" - resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" + resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== pify@^2.3.0: version "2.3.0" - resolved "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" + resolved "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz" integrity sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog== pirates@^4.0.1: version "4.0.6" - resolved "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz#3018ae32ecfcff6c29ba2267cbf21166ac1f36b9" + resolved "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz" integrity sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg== pkg-types@^1.0.3: version "1.0.3" - resolved "https://registry.npmjs.org/pkg-types/-/pkg-types-1.0.3.tgz#988b42ab19254c01614d13f4f65a2cfc7880f868" + resolved "https://registry.npmjs.org/pkg-types/-/pkg-types-1.0.3.tgz" integrity sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A== dependencies: jsonc-parser "^3.2.0" @@ -2061,12 +1885,12 @@ pkg-types@^1.0.3: playwright-core@1.42.1: version "1.42.1" - resolved "https://registry.npmjs.org/playwright-core/-/playwright-core-1.42.1.tgz#13c150b93c940a3280ab1d3fbc945bc855c9459e" + resolved "https://registry.npmjs.org/playwright-core/-/playwright-core-1.42.1.tgz" integrity sha512-mxz6zclokgrke9p1vtdy/COWBH+eOZgYUVVU34C73M+4j4HLlQJHtfcqiqqxpP0o8HhMkflvfbquLX5dg6wlfA== playwright@1.42.1: version "1.42.1" - resolved "https://registry.npmjs.org/playwright/-/playwright-1.42.1.tgz#79c828b51fe3830211137550542426111dc8239f" + resolved "https://registry.npmjs.org/playwright/-/playwright-1.42.1.tgz" integrity sha512-PgwB03s2DZBcNRoW+1w9E+VkLBxweib6KTXM0M3tkiT4jVxKSi6PmVJ591J+0u10LUrgxB7dLRbiJqO5s2QPMg== dependencies: playwright-core "1.42.1" @@ -2075,7 +1899,7 @@ playwright@1.42.1: postcss-import@^15.1.0: version "15.1.0" - resolved "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz#41c64ed8cc0e23735a9698b3249ffdbf704adc70" + resolved "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz" integrity sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew== dependencies: postcss-value-parser "^4.0.0" @@ -2084,14 +1908,14 @@ postcss-import@^15.1.0: postcss-js@^4, postcss-js@^4.0.1: version "4.0.1" - resolved "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz#61598186f3703bab052f1c4f7d805f3991bee9d2" + resolved "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz" integrity sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw== dependencies: camelcase-css "^2.0.1" -postcss-load-config@^3.1.4: +"postcss-load-config@^2.1.0 || ^3.0.0 || ^4.0.0 || ^5.0.0", postcss-load-config@^3.1.4: version "3.1.4" - resolved "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.1.4.tgz#1ab2571faf84bb078877e1d07905eabe9ebda855" + resolved "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.1.4.tgz" integrity sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg== dependencies: lilconfig "^2.0.5" @@ -2099,7 +1923,7 @@ postcss-load-config@^3.1.4: postcss-load-config@^4.0.1: version "4.0.2" - resolved "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz#7159dcf626118d33e299f485d6afe4aff7c4a3e3" + resolved "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz" integrity sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ== dependencies: lilconfig "^3.0.0" @@ -2107,24 +1931,24 @@ postcss-load-config@^4.0.1: postcss-nested@^6.0.1: version "6.0.1" - resolved "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.1.tgz#f83dc9846ca16d2f4fa864f16e9d9f7d0961662c" + resolved "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.1.tgz" integrity sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ== dependencies: postcss-selector-parser "^6.0.11" postcss-safe-parser@^6.0.0: version "6.0.0" - resolved "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-6.0.0.tgz#bb4c29894171a94bc5c996b9a30317ef402adaa1" + resolved "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-6.0.0.tgz" integrity sha512-FARHN8pwH+WiS2OPCxJI8FuRJpTVnn6ZNFiqAM2aeW2LwTHWWmWgIyKC6cUo0L8aeKiF/14MNvnpls6R2PBeMQ== postcss-scss@^4.0.8: version "4.0.9" - resolved "https://registry.npmjs.org/postcss-scss/-/postcss-scss-4.0.9.tgz#a03c773cd4c9623cb04ce142a52afcec74806685" + resolved "https://registry.npmjs.org/postcss-scss/-/postcss-scss-4.0.9.tgz" integrity sha512-AjKOeiwAitL/MXxQW2DliT28EKukvvbEWx3LBmJIRN8KfBGZbRTxNYW0kSqi1COiTZ57nZ9NW06S6ux//N1c9A== postcss-selector-parser@^6.0.11: version "6.0.16" - resolved "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.16.tgz#3b88b9f5c5abd989ef4e2fc9ec8eedd34b20fb04" + resolved "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.16.tgz" integrity sha512-A0RVJrX+IUkVZbW3ClroRWurercFhieevHB38sr2+l9eUClMqome3LmEmnhlNy+5Mr2EYN6B2Kaw9wYdd+VHiw== dependencies: cssesc "^3.0.0" @@ -2132,12 +1956,12 @@ postcss-selector-parser@^6.0.11: postcss-value-parser@^4.0.0, postcss-value-parser@^4.2.0: version "4.2.0" - resolved "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514" + resolved "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz" integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== -postcss@^8.4.23, postcss@^8.4.29, postcss@^8.4.37, postcss@^8.4.38, postcss@^8.4.5: +"postcss@^7 || ^8", postcss@^8.0.0, postcss@^8.1.0, postcss@^8.2.14, postcss@^8.3.3, postcss@^8.4.21, postcss@^8.4.23, postcss@^8.4.29, postcss@^8.4.37, postcss@^8.4.38, postcss@^8.4.5, postcss@>=8.0.9: version "8.4.38" - resolved "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz#b387d533baf2054288e337066d81c6bee9db9e0e" + resolved "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz" integrity sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A== dependencies: nanoid "^3.3.7" @@ -2146,22 +1970,22 @@ postcss@^8.4.23, postcss@^8.4.29, postcss@^8.4.37, postcss@^8.4.38, postcss@^8.4 prelude-ls@^1.2.1: version "1.2.1" - resolved "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" + resolved "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz" integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== prettier-plugin-svelte@^3.1.2: version "3.2.2" - resolved "https://registry.npmjs.org/prettier-plugin-svelte/-/prettier-plugin-svelte-3.2.2.tgz#df576c8a92088dc0aaec8e27fce8a7d9683de93c" + resolved "https://registry.npmjs.org/prettier-plugin-svelte/-/prettier-plugin-svelte-3.2.2.tgz" integrity sha512-ZzzE/wMuf48/1+Lf2Ffko0uDa6pyCfgHV6+uAhtg2U0AAXGrhCSW88vEJNAkAxW5qyrFY1y1zZ4J8TgHrjW++Q== -prettier@^3.1.1: +prettier@^3.0.0, prettier@^3.1.1: version "3.2.5" - resolved "https://registry.npmjs.org/prettier/-/prettier-3.2.5.tgz#e52bc3090586e824964a8813b09aba6233b28368" + resolved "https://registry.npmjs.org/prettier/-/prettier-3.2.5.tgz" integrity sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A== pretty-format@^29.7.0: version "29.7.0" - resolved "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz#ca42c758310f365bfa71a0bda0a807160b776812" + resolved "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz" integrity sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ== dependencies: "@jest/schemas" "^29.6.3" @@ -2170,56 +1994,56 @@ pretty-format@^29.7.0: psl@^1.1.33: version "1.9.0" - resolved "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz#d0df2a137f00794565fcaf3b2c00cd09f8d5a5a7" + resolved "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz" integrity sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag== punycode@^2.1.0, punycode@^2.1.1, punycode@^2.3.0: version "2.3.1" - resolved "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" + resolved "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz" integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== querystringify@^2.1.1: version "2.2.0" - resolved "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz#3345941b4153cb9d082d8eee4cda2016a9aef7f6" + resolved "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz" integrity sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ== queue-microtask@^1.2.2: version "1.2.3" - resolved "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" + resolved "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz" integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== react-is@^18.0.0: version "18.2.0" - resolved "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz#199431eeaaa2e09f86427efbb4f1473edb47609b" + resolved "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz" integrity sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w== read-cache@^1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz#e664ef31161166c9751cdbe8dbcf86b5fb58f774" + resolved "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz" integrity sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA== dependencies: pify "^2.3.0" readdirp@~3.6.0: version "3.6.0" - resolved "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" + resolved "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz" integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== dependencies: picomatch "^2.2.1" requires-port@^1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" + resolved "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz" integrity sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ== resolve-from@^4.0.0: version "4.0.0" - resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" + resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz" integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== resolve@^1.1.7, resolve@^1.22.2: version "1.22.8" - resolved "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz#b6c87a9f2aa06dfab52e3d70ac8cde321fa5a48d" + resolved "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz" integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw== dependencies: is-core-module "^2.13.0" @@ -2228,26 +2052,26 @@ resolve@^1.1.7, resolve@^1.22.2: reusify@^1.0.4: version "1.0.4" - resolved "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" + resolved "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz" integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== rimraf@^2.5.2: version "2.7.1" - resolved "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" + resolved "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz" integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== dependencies: glob "^7.1.3" rimraf@^3.0.2: version "3.0.2" - resolved "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" + resolved "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz" integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== dependencies: glob "^7.1.3" rollup@^4.13.0: version "4.13.2" - resolved "https://registry.npmjs.org/rollup/-/rollup-4.13.2.tgz#ac57d2dc48e8f5562f5a6daadb9caee590069262" + resolved "https://registry.npmjs.org/rollup/-/rollup-4.13.2.tgz" integrity sha512-MIlLgsdMprDBXC+4hsPgzWUasLO9CE4zOkj/u6j+Z6j5A4zRY+CtiXAdJyPtgCsc42g658Aeh1DlrdVEJhsL2g== dependencies: "@types/estree" "1.0.5" @@ -2271,31 +2095,31 @@ rollup@^4.13.0: rrweb-cssom@^0.6.0: version "0.6.0" - resolved "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.6.0.tgz#ed298055b97cbddcdeb278f904857629dec5e0e1" + resolved "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.6.0.tgz" integrity sha512-APM0Gt1KoXBz0iIkkdB/kfvGOwC4UuJFeG/c+yV7wSc7q96cG/kJ0HiYCnzivD9SB53cLV1MlHFNfOuPaadYSw== run-parallel@^1.1.9: version "1.2.0" - resolved "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" + resolved "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz" integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== dependencies: queue-microtask "^1.2.2" sade@^1.7.4, sade@^1.8.1: version "1.8.1" - resolved "https://registry.npmjs.org/sade/-/sade-1.8.1.tgz#0a78e81d658d394887be57d2a409bf703a3b2701" + resolved "https://registry.npmjs.org/sade/-/sade-1.8.1.tgz" integrity sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A== dependencies: mri "^1.1.0" "safer-buffer@>= 2.1.2 < 3.0.0": version "2.1.2" - resolved "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + resolved "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== sander@^0.5.0: version "0.5.1" - resolved "https://registry.npmjs.org/sander/-/sander-0.5.1.tgz#741e245e231f07cafb6fdf0f133adfa216a502ad" + resolved "https://registry.npmjs.org/sander/-/sander-0.5.1.tgz" integrity sha512-3lVqBir7WuKDHGrKRDn/1Ye3kwpXaDOMsiRP1wd6wpZW56gJhsbp5RqQpA6JG/P+pkXizygnr1dKR8vzWaVsfA== dependencies: es6-promise "^3.1.2" @@ -2305,48 +2129,48 @@ sander@^0.5.0: saxes@^6.0.0: version "6.0.0" - resolved "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz#fe5b4a4768df4f14a201b1ba6a65c1f3d9988cc5" + resolved "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz" integrity sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA== dependencies: xmlchars "^2.2.0" semver@^7.5.3, semver@^7.5.4: version "7.6.0" - resolved "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz#1a46a4db4bffcccd97b743b5005c8325f23d4e2d" + resolved "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz" integrity sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg== dependencies: lru-cache "^6.0.0" set-cookie-parser@^2.6.0: version "2.6.0" - resolved "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.6.0.tgz#131921e50f62ff1a66a461d7d62d7b21d5d15a51" + resolved "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.6.0.tgz" integrity sha512-RVnVQxTXuerk653XfuliOxBP81Sf0+qfQE73LIYKcyMYHG94AuH0kgrQpRDuTZnSmjpysHmzxJXKNfa6PjFhyQ== shebang-command@^2.0.0: version "2.0.0" - resolved "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + resolved "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz" integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== dependencies: shebang-regex "^3.0.0" shebang-regex@^3.0.0: version "3.0.0" - resolved "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + resolved "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz" integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== siginfo@^2.0.0: version "2.0.0" - resolved "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz#32e76c70b79724e3bb567cb9d543eb858ccfaf30" + resolved "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz" integrity sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g== signal-exit@^4.0.1, signal-exit@^4.1.0: version "4.1.0" - resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04" + resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz" integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== sirv@^2.0.4: version "2.0.4" - resolved "https://registry.npmjs.org/sirv/-/sirv-2.0.4.tgz#5dd9a725c578e34e449f332703eb2a74e46a29b0" + resolved "https://registry.npmjs.org/sirv/-/sirv-2.0.4.tgz" integrity sha512-94Bdh3cC2PKrbgSOUqTiGPWVZeSiXfKOVZNJniWoqrWrRkB1CJzBU3NEbiTsPcYy1lDsANA/THzS+9WBiy5nfQ== dependencies: "@polka/url" "^1.0.0-next.24" @@ -2355,12 +2179,12 @@ sirv@^2.0.4: slash@^3.0.0: version "3.0.0" - resolved "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" + resolved "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz" integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== sorcery@^0.11.0: version "0.11.0" - resolved "https://registry.npmjs.org/sorcery/-/sorcery-0.11.0.tgz#310c80ee993433854bb55bb9aa4003acd147fca8" + resolved "https://registry.npmjs.org/sorcery/-/sorcery-0.11.0.tgz" integrity sha512-J69LQ22xrQB1cIFJhPfgtLuI6BpWRiWu1Y3vSsIwK/eAScqJxd/+CJlUuHQRdX2C9NGFamq+KqNywGgaThwfHw== dependencies: "@jridgewell/sourcemap-codec" "^1.4.14" @@ -2370,23 +2194,31 @@ sorcery@^0.11.0: source-map-js@^1.0.1, source-map-js@^1.2.0: version "1.2.0" - resolved "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz#16b809c162517b5b8c3e7dcd315a2a5c2612b2af" + resolved "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz" integrity sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg== stackback@0.0.2: version "0.0.2" - resolved "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz#1ac8a0d9483848d1695e418b6d031a3c3ce68e3b" + resolved "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz" integrity sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw== std-env@^3.5.0: version "3.7.0" - resolved "https://registry.npmjs.org/std-env/-/std-env-3.7.0.tgz#c9f7386ced6ecf13360b6c6c55b8aaa4ef7481d2" + resolved "https://registry.npmjs.org/std-env/-/std-env-3.7.0.tgz" integrity sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg== -"string-width-cjs@npm:string-width@^4.2.0", string-width@^4.1.0: - name string-width-cjs +"string-width-cjs@npm:string-width@^4.2.0": version "4.2.3" - resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +string-width@^4.1.0: + version "4.2.3" + resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== dependencies: emoji-regex "^8.0.0" @@ -2395,54 +2227,61 @@ std-env@^3.5.0: string-width@^5.0.1, string-width@^5.1.2: version "5.1.2" - resolved "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794" + resolved "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz" integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== dependencies: eastasianwidth "^0.2.0" emoji-regex "^9.2.2" strip-ansi "^7.0.1" -"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.0, strip-ansi@^6.0.1: +"strip-ansi-cjs@npm:strip-ansi@^6.0.1": + version "6.0.1" + resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +strip-ansi@^6.0.0, strip-ansi@^6.0.1: version "6.0.1" - resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== dependencies: ansi-regex "^5.0.1" strip-ansi@^7.0.1: version "7.1.0" - resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45" + resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz" integrity sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ== dependencies: ansi-regex "^6.0.1" strip-final-newline@^3.0.0: version "3.0.0" - resolved "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz#52894c313fbff318835280aed60ff71ebf12b8fd" + resolved "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz" integrity sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw== strip-indent@^3.0.0: version "3.0.0" - resolved "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz#c32e1cee940b6b3432c771bc2c54bcce73cd3001" + resolved "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz" integrity sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ== dependencies: min-indent "^1.0.0" strip-json-comments@^3.1.1: version "3.1.1" - resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" + resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== strip-literal@^2.0.0: version "2.1.0" - resolved "https://registry.npmjs.org/strip-literal/-/strip-literal-2.1.0.tgz#6d82ade5e2e74f5c7e8739b6c84692bd65f0bd2a" + resolved "https://registry.npmjs.org/strip-literal/-/strip-literal-2.1.0.tgz" integrity sha512-Op+UycaUt/8FbN/Z2TWPBLge3jWrP3xj10f3fnYxf052bKuS3EKs1ZQcVGjnEMdsNVAM+plXRdmjrZ/KgG3Skw== dependencies: js-tokens "^9.0.0" sucrase@^3.32.0: version "3.35.0" - resolved "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz#57f17a3d7e19b36d8995f06679d121be914ae263" + resolved "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz" integrity sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA== dependencies: "@jridgewell/gen-mapping" "^0.3.2" @@ -2455,19 +2294,19 @@ sucrase@^3.32.0: supports-color@^7.1.0: version "7.2.0" - resolved "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz" integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== dependencies: has-flag "^4.0.0" supports-preserve-symlinks-flag@^1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" + resolved "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz" integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== svelte-check@^3.6.0: version "3.6.9" - resolved "https://registry.npmjs.org/svelte-check/-/svelte-check-3.6.9.tgz#05132d9a996aa8e12202a14644c03e3163267642" + resolved "https://registry.npmjs.org/svelte-check/-/svelte-check-3.6.9.tgz" integrity sha512-hDQrk3L0osX07djQyMiXocKysTLfusqi8AriNcCiQxhQR49/LonYolcUGMtZ0fbUR8HTR198Prrgf52WWU9wEg== dependencies: "@jridgewell/trace-mapping" "^0.3.17" @@ -2481,7 +2320,7 @@ svelte-check@^3.6.0: "svelte-eslint-parser@>=0.33.0 <1.0.0": version "0.33.1" - resolved "https://registry.npmjs.org/svelte-eslint-parser/-/svelte-eslint-parser-0.33.1.tgz#c64dbed2fad099577429b3c39377f6b8d36e5d97" + resolved "https://registry.npmjs.org/svelte-eslint-parser/-/svelte-eslint-parser-0.33.1.tgz" integrity sha512-vo7xPGTlKBGdLH8T5L64FipvTrqv3OQRx9d2z5X05KKZDlF4rQk8KViZO4flKERY+5BiVdOh7zZ7JGJWo5P0uA== dependencies: eslint-scope "^7.0.0" @@ -2492,12 +2331,12 @@ svelte-check@^3.6.0: svelte-hmr@^0.15.3: version "0.15.3" - resolved "https://registry.npmjs.org/svelte-hmr/-/svelte-hmr-0.15.3.tgz#df54ccde9be3f091bf5f18fc4ef7b8eb6405fbe6" + resolved "https://registry.npmjs.org/svelte-hmr/-/svelte-hmr-0.15.3.tgz" integrity sha512-41snaPswvSf8TJUhlkoJBekRrABDXDMdpNpT2tfHIv4JuhgvHqLMhEPGtaQn0BmbNSTkuz2Ed20DF2eHw0SmBQ== svelte-preprocess@^5.1.3: version "5.1.3" - resolved "https://registry.npmjs.org/svelte-preprocess/-/svelte-preprocess-5.1.3.tgz#7682239fe53f724c845b53026816fdfe15d028f9" + resolved "https://registry.npmjs.org/svelte-preprocess/-/svelte-preprocess-5.1.3.tgz" integrity sha512-xxAkmxGHT+J/GourS5mVJeOXZzne1FR5ljeOUAMXUkfEhkLEllRreXpbl3dIYJlcJRfL1LO1uIAPpBpBfiqGPw== dependencies: "@types/pug" "^2.0.6" @@ -2506,9 +2345,9 @@ svelte-preprocess@^5.1.3: sorcery "^0.11.0" strip-indent "^3.0.0" -svelte@^4.2.7: +"svelte@^3.19.0 || ^4.0.0", "svelte@^3.2.0 || ^4.0.0-next.0 || ^5.0.0-next.0", "svelte@^3.23.0 || ^4.0.0-next.0 || ^4.0.0 || ^5.0.0-next.0", "svelte@^3.37.0 || ^4.0.0", "svelte@^3.55.0 || ^4.0.0-next.0 || ^4.0.0 || ^5.0.0-next.0", "svelte@^4.0.0 || ^5.0.0-next.0", svelte@^4.2.7: version "4.2.12" - resolved "https://registry.npmjs.org/svelte/-/svelte-4.2.12.tgz#13d98d2274d24d3ad216c8fdc801511171c70bb1" + resolved "https://registry.npmjs.org/svelte/-/svelte-4.2.12.tgz" integrity sha512-d8+wsh5TfPwqVzbm4/HCXC783/KPHV60NvwitJnyTA5lWn1elhXMNWhXGCJ7PwPa8qFUnyJNIyuIRt2mT0WMug== dependencies: "@ampproject/remapping" "^2.2.1" @@ -2528,12 +2367,12 @@ svelte@^4.2.7: symbol-tree@^3.2.4: version "3.2.4" - resolved "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" + resolved "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz" integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== tailwindcss@^3.4.1: version "3.4.3" - resolved "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.3.tgz#be48f5283df77dfced705451319a5dffb8621519" + resolved "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.3.tgz" integrity sha512-U7sxQk/n397Bmx4JHbJx/iSOOv5G+II3f1kpLpY2QeUv5DcPdcTsYLlusZfq1NthHS1c1cZoyFmmkex1rzke0A== dependencies: "@alloc/quick-lru" "^5.2.0" @@ -2561,26 +2400,26 @@ tailwindcss@^3.4.1: text-table@^0.2.0: version "0.2.0" - resolved "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" + resolved "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz" integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== thenify-all@^1.0.0: version "1.6.0" - resolved "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz#1a1918d402d8fc3f98fbf234db0bcc8cc10e9726" + resolved "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz" integrity sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA== dependencies: thenify ">= 3.1.0 < 4" "thenify@>= 3.1.0 < 4": version "3.3.1" - resolved "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz#8932e686a4066038a016dd9e2ca46add9838a95f" + resolved "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz" integrity sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw== dependencies: any-promise "^1.0.0" tiny-glob@^0.2.9: version "0.2.9" - resolved "https://registry.npmjs.org/tiny-glob/-/tiny-glob-0.2.9.tgz#2212d441ac17928033b110f8b3640683129d31e2" + resolved "https://registry.npmjs.org/tiny-glob/-/tiny-glob-0.2.9.tgz" integrity sha512-g/55ssRPUjShh+xkfx9UPDXqhckHEsHr4Vd9zX55oSdGZc/MD0m3sferOkwWtp98bv+kcVfEHtRJgBVJzelrzg== dependencies: globalyzer "0.1.0" @@ -2588,34 +2427,34 @@ tiny-glob@^0.2.9: tinybench@^2.5.1: version "2.6.0" - resolved "https://registry.npmjs.org/tinybench/-/tinybench-2.6.0.tgz#1423284ee22de07c91b3752c048d2764714b341b" + resolved "https://registry.npmjs.org/tinybench/-/tinybench-2.6.0.tgz" integrity sha512-N8hW3PG/3aOoZAN5V/NSAEDz0ZixDSSt5b/a05iqtpgfLWMSVuCo7w0k2vVvEjdrIoeGqZzweX2WlyioNIHchA== tinypool@^0.8.2: version "0.8.3" - resolved "https://registry.npmjs.org/tinypool/-/tinypool-0.8.3.tgz#e17d0a5315a7d425f875b05f7af653c225492d39" + resolved "https://registry.npmjs.org/tinypool/-/tinypool-0.8.3.tgz" integrity sha512-Ud7uepAklqRH1bvwy22ynrliC7Dljz7Tm8M/0RBUW+YRa4YHhZ6e4PpgE+fu1zr/WqB1kbeuVrdfeuyIBpy4tw== tinyspy@^2.2.0: version "2.2.1" - resolved "https://registry.npmjs.org/tinyspy/-/tinyspy-2.2.1.tgz#117b2342f1f38a0dbdcc73a50a454883adf861d1" + resolved "https://registry.npmjs.org/tinyspy/-/tinyspy-2.2.1.tgz" integrity sha512-KYad6Vy5VDWV4GH3fjpseMQ/XU2BhIYP7Vzd0LG44qRWm/Yt2WCOTicFdvmgo6gWaqooMQCawTtILVQJupKu7A== to-regex-range@^5.0.1: version "5.0.1" - resolved "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + resolved "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz" integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== dependencies: is-number "^7.0.0" totalist@^3.0.0: version "3.0.1" - resolved "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz#ba3a3d600c915b1a97872348f79c127475f6acf8" + resolved "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz" integrity sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ== tough-cookie@^4.1.2: version "4.1.3" - resolved "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.3.tgz#97b9adb0728b42280aa3d814b6b999b2ff0318bf" + resolved "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.3.tgz" integrity sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw== dependencies: psl "^1.1.33" @@ -2625,61 +2464,61 @@ tough-cookie@^4.1.2: tr46@^4.1.1: version "4.1.1" - resolved "https://registry.npmjs.org/tr46/-/tr46-4.1.1.tgz#281a758dcc82aeb4fe38c7dfe4d11a395aac8469" + resolved "https://registry.npmjs.org/tr46/-/tr46-4.1.1.tgz" integrity sha512-2lv/66T7e5yNyhAAC4NaKe5nVavzuGJQVVtRYLyQ2OI8tsJ61PMLlelehb0wi2Hx6+hT/OJUWZcw8MjlSRnxvw== dependencies: punycode "^2.3.0" ts-api-utils@^1.0.1: version "1.3.0" - resolved "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz#4b490e27129f1e8e686b45cc4ab63714dc60eea1" + resolved "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz" integrity sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ== ts-interface-checker@^0.1.9: version "0.1.13" - resolved "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz#784fd3d679722bc103b1b4b8030bcddb5db2a699" + resolved "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz" integrity sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA== tslib@^2.4.1: version "2.6.2" - resolved "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz#703ac29425e7b37cd6fd456e92404d46d1f3e4ae" + resolved "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz" integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q== type-check@^0.4.0, type-check@~0.4.0: version "0.4.0" - resolved "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" + resolved "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz" integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== dependencies: prelude-ls "^1.2.1" type-detect@^4.0.0, type-detect@^4.0.8: version "4.0.8" - resolved "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" + resolved "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz" integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== type-fest@^0.20.2: version "0.20.2" - resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" + resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz" integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== -typescript@^5.0.0, typescript@^5.0.3: +typescript@^5.0.0, typescript@^5.0.3, "typescript@>=3.9.5 || ^4.0.0 || ^5.0.0", typescript@>=4.2.0: version "5.4.3" - resolved "https://registry.npmjs.org/typescript/-/typescript-5.4.3.tgz#5c6fedd4c87bee01cd7a528a30145521f8e0feff" + resolved "https://registry.npmjs.org/typescript/-/typescript-5.4.3.tgz" integrity sha512-KrPd3PKaCLr78MalgiwJnA25Nm8HAmdwN3mYUYZgG/wizIo9EainNVQI9/yDavtVFRN2h3k8uf3GLHuhDMgEHg== ufo@^1.3.2: version "1.5.3" - resolved "https://registry.npmjs.org/ufo/-/ufo-1.5.3.tgz#3325bd3c977b6c6cd3160bf4ff52989adc9d3344" + resolved "https://registry.npmjs.org/ufo/-/ufo-1.5.3.tgz" integrity sha512-Y7HYmWaFwPUmkoQCUIAYpKqkOf+SbVj/2fJJZ4RJMCfZp0rTGwRbzQD+HghfnhKOjL9E01okqz+ncJskGYfBNw== universalify@^0.2.0: version "0.2.0" - resolved "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz#6451760566fa857534745ab1dde952d1b1761be0" + resolved "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz" integrity sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg== update-browserslist-db@^1.0.13: version "1.0.13" - resolved "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz#3c5e4f5c083661bd38ef64b6328c26ed6c8248c4" + resolved "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz" integrity sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg== dependencies: escalade "^3.1.1" @@ -2687,14 +2526,14 @@ update-browserslist-db@^1.0.13: uri-js@^4.2.2: version "4.4.1" - resolved "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" + resolved "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz" integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== dependencies: punycode "^2.1.0" url-parse@^1.5.3: version "1.5.10" - resolved "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz#9d3c2f736c1d75dd3bd2be507dcc111f1e2ea9c1" + resolved "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz" integrity sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ== dependencies: querystringify "^2.1.1" @@ -2702,12 +2541,12 @@ url-parse@^1.5.3: util-deprecate@^1.0.2: version "1.0.2" - resolved "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + resolved "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== vite-node@1.4.0: version "1.4.0" - resolved "https://registry.npmjs.org/vite-node/-/vite-node-1.4.0.tgz#265529d60570ca695ceb69391f87f92847934ad8" + resolved "https://registry.npmjs.org/vite-node/-/vite-node-1.4.0.tgz" integrity sha512-VZDAseqjrHgNd4Kh8icYHWzTKSCZMhia7GyHfhtzLW33fZlG9SwsB6CEhgyVOWkJfJ2pFLrp/Gj1FSfAiqH9Lw== dependencies: cac "^6.7.14" @@ -2716,9 +2555,9 @@ vite-node@1.4.0: picocolors "^1.0.0" vite "^5.0.0" -vite@^5.0.0, vite@^5.0.3: +"vite@^3.0.0 || ^4.0.0 || ^5.0.0", vite@^5.0.0, vite@^5.0.3: version "5.2.7" - resolved "https://registry.npmjs.org/vite/-/vite-5.2.7.tgz#e1b8a985eb54fcb9467d7f7f009d87485016df6e" + resolved "https://registry.npmjs.org/vite/-/vite-5.2.7.tgz" integrity sha512-k14PWOKLI6pMaSzAuGtT+Cf0YmIx12z9YGon39onaJNy8DLBfBJrzg9FQEmkAM5lpHBZs9wksWAsyF/HkpEwJA== dependencies: esbuild "^0.20.1" @@ -2729,12 +2568,12 @@ vite@^5.0.0, vite@^5.0.3: vitefu@^0.2.5: version "0.2.5" - resolved "https://registry.npmjs.org/vitefu/-/vitefu-0.2.5.tgz#c1b93c377fbdd3e5ddd69840ea3aa70b40d90969" + resolved "https://registry.npmjs.org/vitefu/-/vitefu-0.2.5.tgz" integrity sha512-SgHtMLoqaeeGnd2evZ849ZbACbnwQCIwRH57t18FxcXoZop0uQu0uzlIhJBlF/eWVzuce0sHeqPcDo+evVcg8Q== vitest@^1.2.0: version "1.4.0" - resolved "https://registry.npmjs.org/vitest/-/vitest-1.4.0.tgz#f5c812aaf5023818b89b7fc667fa45327396fece" + resolved "https://registry.npmjs.org/vitest/-/vitest-1.4.0.tgz" integrity sha512-gujzn0g7fmwf83/WzrDTnncZt2UiXP41mHuFYFrdwaLRVQ6JYQEiME2IfEjU3vcFL3VKa75XhI3lFgn+hfVsQw== dependencies: "@vitest/expect" "1.4.0" @@ -2760,31 +2599,31 @@ vitest@^1.2.0: w3c-xmlserializer@^4.0.0: version "4.0.0" - resolved "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-4.0.0.tgz#aebdc84920d806222936e3cdce408e32488a3073" + resolved "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-4.0.0.tgz" integrity sha512-d+BFHzbiCx6zGfz0HyQ6Rg69w9k19nviJspaj4yNscGjrHu94sVP+aRm75yEbCh+r2/yR+7q6hux9LVtbuTGBw== dependencies: xml-name-validator "^4.0.0" webidl-conversions@^7.0.0: version "7.0.0" - resolved "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz#256b4e1882be7debbf01d05f0aa2039778ea080a" + resolved "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz" integrity sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g== whatwg-encoding@^2.0.0: version "2.0.0" - resolved "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz#e7635f597fd87020858626805a2729fa7698ac53" + resolved "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz" integrity sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg== dependencies: iconv-lite "0.6.3" whatwg-mimetype@^3.0.0: version "3.0.0" - resolved "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz#5fa1a7623867ff1af6ca3dc72ad6b8a4208beba7" + resolved "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz" integrity sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q== whatwg-url@^12.0.0, whatwg-url@^12.0.1: version "12.0.1" - resolved "https://registry.npmjs.org/whatwg-url/-/whatwg-url-12.0.1.tgz#fd7bcc71192e7c3a2a97b9a8d6b094853ed8773c" + resolved "https://registry.npmjs.org/whatwg-url/-/whatwg-url-12.0.1.tgz" integrity sha512-Ed/LrqB8EPlGxjS+TrsXcpUond1mhccS3pchLhzSgPCnTimUCKj3IZE75pAs5m6heB2U2TMerKFUXheyHY+VDQ== dependencies: tr46 "^4.1.1" @@ -2792,14 +2631,14 @@ whatwg-url@^12.0.0, whatwg-url@^12.0.1: which@^2.0.1: version "2.0.2" - resolved "https://registry.npmjs.org/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + resolved "https://registry.npmjs.org/which/-/which-2.0.2.tgz" integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== dependencies: isexe "^2.0.0" why-is-node-running@^2.2.2: version "2.2.2" - resolved "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.2.2.tgz#4185b2b4699117819e7154594271e7e344c9973e" + resolved "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.2.2.tgz" integrity sha512-6tSwToZxTOcotxHeA+qGCq1mVzKR3CwcJGmVcY+QE8SHy6TnpFnh8PAvPNHYr7EcuVeG0QSMxtYCuO1ta/G/oA== dependencies: siginfo "^2.0.0" @@ -2807,7 +2646,7 @@ why-is-node-running@^2.2.2: "wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": version "7.0.0" - resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz" integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== dependencies: ansi-styles "^4.0.0" @@ -2816,7 +2655,7 @@ why-is-node-running@^2.2.2: wrap-ansi@^8.1.0: version "8.1.0" - resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214" + resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz" integrity sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ== dependencies: ansi-styles "^6.1.0" @@ -2825,45 +2664,45 @@ wrap-ansi@^8.1.0: wrappy@1: version "1.0.2" - resolved "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + resolved "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== ws@^8.13.0: version "8.16.0" - resolved "https://registry.npmjs.org/ws/-/ws-8.16.0.tgz#d1cd774f36fbc07165066a60e40323eab6446fd4" + resolved "https://registry.npmjs.org/ws/-/ws-8.16.0.tgz" integrity sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ== xml-name-validator@^4.0.0: version "4.0.0" - resolved "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz#79a006e2e63149a8600f15430f0a4725d1524835" + resolved "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz" integrity sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw== xmlchars@^2.2.0: version "2.2.0" - resolved "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb" + resolved "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz" integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw== yallist@^4.0.0: version "4.0.0" - resolved "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" + resolved "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz" integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== yaml@^1.10.2: version "1.10.2" - resolved "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" + resolved "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz" integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== yaml@^2.3.4: version "2.4.1" - resolved "https://registry.npmjs.org/yaml/-/yaml-2.4.1.tgz#2e57e0b5e995292c25c75d2658f0664765210eed" + resolved "https://registry.npmjs.org/yaml/-/yaml-2.4.1.tgz" integrity sha512-pIXzoImaqmfOrL7teGUBt/T7ZDnyeGBWyXQBvOVhLkWLN37GXv8NMLK406UY6dS51JfcQHsmcW5cJ441bHg6Lg== yocto-queue@^0.1.0: version "0.1.0" - resolved "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" + resolved "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz" integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== yocto-queue@^1.0.0: version "1.0.0" - resolved "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz#7f816433fb2cbc511ec8bf7d263c3b58a1a3c251" + resolved "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz" integrity sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g== From 309ce8b52d3c3222da7eb90891537f84dccb6d03 Mon Sep 17 00:00:00 2001 From: mrredo <74524695+mrredo@users.noreply.github.com> Date: Sun, 25 Aug 2024 09:18:41 +0300 Subject: [PATCH 11/11] Update block_creation_rules.md --- block_creation_rules.md | 1 + 1 file changed, 1 insertion(+) diff --git a/block_creation_rules.md b/block_creation_rules.md index 8250ba0..61c46b9 100644 --- a/block_creation_rules.md +++ b/block_creation_rules.md @@ -30,3 +30,4 @@ Before merging, please ensure that each modified or newly created block meets th ##### 9. Consider user feedback. These rules will make app development easier, help eliminate pesky bugs, and simplify refactoring. +