diff --git a/blocks/lists.ts b/blocks/lists.ts index 6754b6847..864803b93 100644 --- a/blocks/lists.ts +++ b/blocks/lists.ts @@ -1046,22 +1046,19 @@ blocks['lists_split'] = { /** * Returns the state of this block as a JSON serializable object. - * This block does not need to serialize any specific state as it is already - * encoded in the dropdown values, but must have an implementation to avoid - * the backward compatible XML mutations being serialized. * * @returns The state of this block. */ - saveExtraState: function (this: SplitBlock): null { - return null; + saveExtraState: function (this: SplitBlock): {mode: string} { + return {'mode': this.getFieldValue('MODE')}; }, /** * Applies the given state to this block. - * No extra state is needed or expected as it is already encoded in the - * dropdown values. */ - loadExtraState: function (this: SplitBlock) {}, + loadExtraState: function (this: SplitBlock, state: {mode: string}) { + this.updateType_(state['mode']); + }, }; // Register provided blocks. diff --git a/core/block_svg.ts b/core/block_svg.ts index 1c1de49ec..10fa995ff 100644 --- a/core/block_svg.ts +++ b/core/block_svg.ts @@ -243,7 +243,7 @@ export class BlockSvg * * @returns #RRGGBB string. */ - getColourSecondary(): string | undefined { + getColourSecondary(): string { return this.style.colourSecondary; } @@ -252,7 +252,7 @@ export class BlockSvg * * @returns #RRGGBB string. */ - getColourTertiary(): string | undefined { + getColourTertiary(): string { return this.style.colourTertiary; } @@ -1172,6 +1172,15 @@ export class BlockSvg } } + /** + * Returns the BlockStyle object used to style this block. + * + * @returns This block's style object. + */ + getStyle(): BlockStyle { + return this.style; + } + /** * Move this block to the front of the visible workspace. * tags do not respect z-index so SVG renders them in the diff --git a/core/bubbles/text_bubble.ts b/core/bubbles/text_bubble.ts index 7ac5fa029..6db81cd99 100644 --- a/core/bubbles/text_bubble.ts +++ b/core/bubbles/text_bubble.ts @@ -16,7 +16,7 @@ import {Bubble} from './bubble.js'; * A bubble that displays non-editable text. Used by the warning icon. */ export class TextBubble extends Bubble { - private paragraph: SVGTextElement; + private paragraph: SVGGElement; constructor( private text: string, @@ -48,43 +48,52 @@ export class TextBubble extends Bubble { */ private stringToSvg(text: string, container: SVGGElement) { const paragraph = this.createParagraph(container); - const spans = this.createSpans(paragraph, text); + const fragments = this.createTextFragments(paragraph, text); if (this.workspace.RTL) - this.rightAlignSpans(paragraph.getBBox().width, spans); + this.rightAlignTextFragments(paragraph.getBBox().width, fragments); return paragraph; } - /** Creates the paragraph container for this bubble's view's spans. */ - private createParagraph(container: SVGGElement): SVGTextElement { + /** Creates the paragraph container for this bubble's view's text fragments. */ + private createParagraph(container: SVGGElement): SVGGElement { return dom.createSvgElement( - Svg.TEXT, + Svg.G, { 'class': 'blocklyText blocklyBubbleText blocklyNoPointerEvents', - 'y': Bubble.BORDER_WIDTH, + 'transform': `translate(0,${Bubble.BORDER_WIDTH})`, + 'style': `direction: ${this.workspace.RTL ? 'rtl' : 'ltr'}`, }, container, ); } - /** Creates the spans visualizing the text of this bubble. */ - private createSpans(parent: SVGTextElement, text: string): SVGTSpanElement[] { + /** Creates the text fragments visualizing the text of this bubble. */ + private createTextFragments( + parent: SVGGElement, + text: string, + ): SVGTextElement[] { + let lineNum = 1; return text.split('\n').map((line) => { - const tspan = dom.createSvgElement( - Svg.TSPAN, - {'dy': '1em', 'x': Bubble.BORDER_WIDTH}, + const fragment = dom.createSvgElement( + Svg.TEXT, + {'y': `${lineNum}em`, 'x': Bubble.BORDER_WIDTH}, parent, ); const textNode = document.createTextNode(line); - tspan.appendChild(textNode); - return tspan; + fragment.appendChild(textNode); + lineNum += 1; + return fragment; }); } - /** Right aligns the given spans. */ - private rightAlignSpans(maxWidth: number, spans: SVGTSpanElement[]) { - for (const span of spans) { - span.setAttribute('text-anchor', 'end'); - span.setAttribute('x', `${maxWidth + Bubble.BORDER_WIDTH}`); + /** Right aligns the given text fragments. */ + private rightAlignTextFragments( + maxWidth: number, + fragments: SVGTextElement[], + ) { + for (const text of fragments) { + text.setAttribute('text-anchor', 'start'); + text.setAttribute('x', `${maxWidth + Bubble.BORDER_WIDTH}`); } } diff --git a/core/clipboard.ts b/core/clipboard.ts index 62e23fd24..ba6f44e6f 100644 --- a/core/clipboard.ts +++ b/core/clipboard.ts @@ -83,7 +83,9 @@ function pasteFromData( workspace: WorkspaceSvg, coordinate?: Coordinate, ): ICopyable | null { - workspace = workspace.getRootWorkspace() ?? workspace; + workspace = workspace.isMutator + ? workspace + : (workspace.getRootWorkspace() ?? workspace); return (globalRegistry .getObject(globalRegistry.Type.PASTER, copyData.paster, false) ?.paste(copyData, workspace, coordinate) ?? null) as ICopyable | null; diff --git a/core/contextmenu_items.ts b/core/contextmenu_items.ts index 25ffab59b..58429fb13 100644 --- a/core/contextmenu_items.ts +++ b/core/contextmenu_items.ts @@ -611,7 +611,9 @@ export function registerCommentDuplicate() { export function registerCommentCreate() { const createOption: RegistryItem = { displayText: () => Msg['ADD_COMMENT'], - preconditionFn: () => 'enabled', + preconditionFn: (scope: Scope) => { + return scope.workspace?.isMutator ? 'hidden' : 'enabled'; + }, callback: (scope: Scope, e: PointerEvent) => { const workspace = scope.workspace; if (!workspace) return; diff --git a/core/field_dropdown.ts b/core/field_dropdown.ts index b1e3b5af2..6e8b5f8c8 100644 --- a/core/field_dropdown.ts +++ b/core/field_dropdown.ts @@ -29,7 +29,6 @@ import {Coordinate} from './utils/coordinate.js'; import * as dom from './utils/dom.js'; import * as parsing from './utils/parsing.js'; import * as utilsString from './utils/string.js'; -import * as style from './utils/style.js'; import {Svg} from './utils/svg.js'; /** @@ -291,7 +290,7 @@ export class FieldDropdown extends Field { if (this.getConstants()!.FIELD_DROPDOWN_COLOURED_DIV) { const primaryColour = block.getColour(); - const borderColour = (this.sourceBlock_ as BlockSvg).style.colourTertiary; + const borderColour = (this.sourceBlock_ as BlockSvg).getColourTertiary(); dropDownDiv.setColour(primaryColour, borderColour); } @@ -304,11 +303,6 @@ export class FieldDropdown extends Field { if (this.selectedMenuItem) { this.menu_!.setHighlighted(this.selectedMenuItem); - style.scrollIntoContainerView( - this.selectedMenuItem.getElement()!, - dropDownDiv.getContentDiv(), - true, - ); } this.applyColour(); @@ -467,21 +461,21 @@ export class FieldDropdown extends Field { * Updates the dropdown arrow to match the colour/style of the block. */ override applyColour() { - const style = (this.sourceBlock_ as BlockSvg).style; + const sourceBlock = this.sourceBlock_ as BlockSvg; if (this.borderRect_) { - this.borderRect_.setAttribute('stroke', style.colourTertiary); + this.borderRect_.setAttribute('stroke', sourceBlock.getColourTertiary()); if (this.menu_) { - this.borderRect_.setAttribute('fill', style.colourTertiary); + this.borderRect_.setAttribute('fill', sourceBlock.getColourTertiary()); } else { this.borderRect_.setAttribute('fill', 'transparent'); } } // Update arrow's colour. - if (this.sourceBlock_ && this.arrow) { - if (this.sourceBlock_.isShadow()) { - this.arrow.style.fill = style.colourSecondary; + if (sourceBlock && this.arrow) { + if (sourceBlock.isShadow()) { + this.arrow.style.fill = sourceBlock.getColourSecondary(); } else { - this.arrow.style.fill = style.colourPrimary; + this.arrow.style.fill = sourceBlock.getColour(); } } } diff --git a/core/field_input.ts b/core/field_input.ts index eecb4ec94..2c8a48e67 100644 --- a/core/field_input.ts +++ b/core/field_input.ts @@ -226,7 +226,7 @@ export abstract class FieldInput extends Field< if (!this.isFullBlockField() && this.borderRect_) { this.borderRect_!.style.display = 'block'; - this.borderRect_.setAttribute('stroke', block.style.colourTertiary); + this.borderRect_.setAttribute('stroke', block.getColourTertiary()); } else { this.borderRect_!.style.display = 'none'; // In general, do *not* let fields control the color of blocks. Having the @@ -429,8 +429,8 @@ export abstract class FieldInput extends Field< borderRadius = (bBox.bottom - bBox.top) / 2 + 'px'; // Pull stroke colour from the existing shadow block const strokeColour = block.getParent() - ? (block.getParent() as BlockSvg).style.colourTertiary - : (this.sourceBlock_ as BlockSvg).style.colourTertiary; + ? (block.getParent() as BlockSvg).getColourTertiary() + : (this.sourceBlock_ as BlockSvg).getColourTertiary(); htmlInput.style.border = 1 * scale + 'px solid ' + strokeColour; div!.style.borderRadius = borderRadius; div!.style.transition = 'box-shadow 0.25s ease 0s'; diff --git a/core/icons/comment_icon.ts b/core/icons/comment_icon.ts index ea120ca17..24a276d87 100644 --- a/core/icons/comment_icon.ts +++ b/core/icons/comment_icon.ts @@ -126,7 +126,7 @@ export class CommentIcon extends Icon implements IHasBubble, ISerializable { override applyColour(): void { super.applyColour(); - const colour = (this.sourceBlock as BlockSvg).style.colourPrimary; + const colour = (this.sourceBlock as BlockSvg).getColour(); this.textInputBubble?.setColour(colour); } diff --git a/core/icons/mutator_icon.ts b/core/icons/mutator_icon.ts index d02c7e187..eea533eab 100644 --- a/core/icons/mutator_icon.ts +++ b/core/icons/mutator_icon.ts @@ -136,7 +136,7 @@ export class MutatorIcon extends Icon implements IHasBubble { override applyColour(): void { super.applyColour(); - this.miniWorkspaceBubble?.setColour(this.sourceBlock.style.colourPrimary); + this.miniWorkspaceBubble?.setColour(this.sourceBlock.getColour()); this.miniWorkspaceBubble?.updateBlockStyles(); } diff --git a/core/icons/warning_icon.ts b/core/icons/warning_icon.ts index 2744195f9..b82ad1097 100644 --- a/core/icons/warning_icon.ts +++ b/core/icons/warning_icon.ts @@ -108,7 +108,7 @@ export class WarningIcon extends Icon implements IHasBubble { override applyColour(): void { super.applyColour(); - this.textBubble?.setColour(this.sourceBlock.style.colourPrimary); + this.textBubble?.setColour(this.sourceBlock.getColour()); } override updateCollapsed(): void { diff --git a/core/inject.ts b/core/inject.ts index b425d77b7..40016bc23 100644 --- a/core/inject.ts +++ b/core/inject.ts @@ -77,6 +77,16 @@ export function inject( }); browserEvents.conditionalBind(subContainer, 'keydown', null, onKeyDown); + browserEvents.conditionalBind( + dropDownDiv.getContentDiv(), + 'keydown', + null, + onKeyDown, + ); + const widgetContainer = WidgetDiv.getDiv(); + if (widgetContainer) { + browserEvents.conditionalBind(widgetContainer, 'keydown', null, onKeyDown); + } return workspace; } diff --git a/core/menu.ts b/core/menu.ts index b0fb55573..d1c86a802 100644 --- a/core/menu.ts +++ b/core/menu.ts @@ -260,10 +260,14 @@ export class Menu { this.highlightedItem = item; // Bring the highlighted item into view. This has no effect if the menu is // not scrollable. - const el = this.getElement() as Element; - style.scrollIntoContainerView(item.getElement() as Element, el); - - aria.setState(el, aria.State.ACTIVEDESCENDANT, item.getId()); + const el = this.getElement(); + if (el) { + aria.setState(el, aria.State.ACTIVEDESCENDANT, item.getId()); + } + item.getElement()?.scrollIntoView({ + block: 'nearest', + inline: 'start', + }); } } diff --git a/core/renderers/zelos/path_object.ts b/core/renderers/zelos/path_object.ts index 060190ee1..a46d355b6 100644 --- a/core/renderers/zelos/path_object.ts +++ b/core/renderers/zelos/path_object.ts @@ -68,7 +68,7 @@ export class PathObject extends BasePathObject { // Set shadow stroke colour. const parent = block.getParent(); if (block.isShadow() && parent) { - this.svgPath.setAttribute('stroke', parent.style.colourTertiary); + this.svgPath.setAttribute('stroke', parent.getColourTertiary()); } // Apply colour to outlines. diff --git a/core/shortcut_items.ts b/core/shortcut_items.ts index 3a32b687f..0db28a51a 100644 --- a/core/shortcut_items.ts +++ b/core/shortcut_items.ts @@ -18,7 +18,7 @@ import {KeyboardShortcut, ShortcutRegistry} from './shortcut_registry.js'; import {Coordinate} from './utils/coordinate.js'; import {KeyCodes} from './utils/keycodes.js'; import {Rect} from './utils/rect.js'; -import type {WorkspaceSvg} from './workspace_svg.js'; +import {WorkspaceSvg} from './workspace_svg.js'; /** * Object holding the names of the default shortcut items. @@ -131,7 +131,10 @@ export function registerCopy() { const selected = common.getSelected(); if (!selected || !isCopyable(selected)) return false; copyData = selected.toCopyData(); - copyWorkspace = workspace; + copyWorkspace = + selected.workspace instanceof WorkspaceSvg + ? selected.workspace + : workspace; copyCoords = isDraggable(selected) ? selected.getRelativeToSurfaceXY() : null; diff --git a/core/trashcan.ts b/core/trashcan.ts index d30c4a4e2..05ae9fbf2 100644 --- a/core/trashcan.ts +++ b/core/trashcan.ts @@ -395,6 +395,8 @@ export class Trashcan 'transform', 'translate(' + this.left + ',' + this.top + ')', ); + + this.flyout?.position(); } /** diff --git a/core/utils/style.ts b/core/utils/style.ts index 4f8324be5..5de69001f 100644 --- a/core/utils/style.ts +++ b/core/utils/style.ts @@ -7,6 +7,7 @@ // Former goog.module ID: Blockly.utils.style import {Coordinate} from './coordinate.js'; +import * as deprecation from './deprecation.js'; import {Rect} from './rect.js'; import {Size} from './size.js'; @@ -58,6 +59,7 @@ function getSizeInternal(element: Element): Size { * @returns Object with width/height properties. */ function getSizeWithDisplay(element: Element): Size { + deprecation.warn(`Blockly.utils.style.getSizeWithDisplay()`, 'v11.2', 'v13'); const offsetWidth = (element as HTMLElement).offsetWidth; const offsetHeight = (element as HTMLElement).offsetHeight; return new Size(offsetWidth, offsetHeight); @@ -130,6 +132,7 @@ export function getViewportPageOffset(): Coordinate { * @returns The computed border widths. */ export function getBorderBox(element: Element): Rect { + deprecation.warn(`Blockly.utils.style.getBorderBox()`, 'v11.2', 'v13'); const left = parseFloat(getComputedStyle(element, 'borderLeftWidth')); const right = parseFloat(getComputedStyle(element, 'borderRightWidth')); const top = parseFloat(getComputedStyle(element, 'borderTopWidth')); @@ -156,6 +159,12 @@ export function scrollIntoContainerView( container: Element, opt_center?: boolean, ) { + deprecation.warn( + `Blockly.utils.style.scrollIntoContainerView()`, + 'v11.2', + 'v13', + 'the native Element.scrollIntoView()', + ); const offset = getContainerOffsetToScrollInto(element, container, opt_center); container.scrollLeft = offset.x; container.scrollTop = offset.y; @@ -180,6 +189,11 @@ export function getContainerOffsetToScrollInto( container: Element, opt_center?: boolean, ): Coordinate { + deprecation.warn( + `Blockly.utils.style.getContainerOffsetToScrollInto()`, + 'v11.2', + 'v13', + ); // Absolute position of the element's border's top left corner. const elementPos = getPageOffset(element); // Absolute position of the container's border's top left corner. diff --git a/package-lock.json b/package-lock.json index 7bd880eb6..86c603884 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "blockly", - "version": "11.1.1", + "version": "11.2.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "blockly", - "version": "11.1.1", + "version": "11.2.1", "hasInstallScript": true, "license": "Apache-2.0", "dependencies": { @@ -70,9 +70,9 @@ } }, "node_modules/@blockly/block-test": { - "version": "6.0.8", - "resolved": "https://registry.npmjs.org/@blockly/block-test/-/block-test-6.0.8.tgz", - "integrity": "sha512-uJg7d79gqqZGuF8tWriT1SJHaELFWQgv4Hf8/j7EDn5qnCRkDtoDqDQrVWNsios3tJHXviFNL3aetWkbBNOrVA==", + "version": "6.0.11", + "resolved": "https://registry.npmjs.org/@blockly/block-test/-/block-test-6.0.11.tgz", + "integrity": "sha512-aIgcxkof1gLJtJXKSvmnug9iSXbv5Qilnov4Sa/QNURiWJRxvMNqWiTZJVu/reuCQK4Qm4jadg9R9l+eu7ujvw==", "dev": true, "engines": { "node": ">=8.17.0" @@ -82,16 +82,16 @@ } }, "node_modules/@blockly/dev-tools": { - "version": "8.0.9", - "resolved": "https://registry.npmjs.org/@blockly/dev-tools/-/dev-tools-8.0.9.tgz", - "integrity": "sha512-ta8tzBOJRZdjKynDFTtzK8xWuEzsBlKIc84zX15OhBShUZqvrsS1abRNDcnVe8/ZH93K2yezCgVfAf3AcOFvbQ==", + "version": "8.0.12", + "resolved": "https://registry.npmjs.org/@blockly/dev-tools/-/dev-tools-8.0.12.tgz", + "integrity": "sha512-jE0y/Z7ggmM2JS4l0Xf2ic3eecuM+ZDjUZNCcM2k6yy0VDJoxOPN63Cq2soswXQRuKHfzRMHY48rCvoKL3MqPA==", "dev": true, "dependencies": { - "@blockly/block-test": "^6.0.8", - "@blockly/theme-dark": "^7.0.7", - "@blockly/theme-deuteranopia": "^6.0.7", - "@blockly/theme-highcontrast": "^6.0.7", - "@blockly/theme-tritanopia": "^6.0.7", + "@blockly/block-test": "^6.0.11", + "@blockly/theme-dark": "^7.0.10", + "@blockly/theme-deuteranopia": "^6.0.10", + "@blockly/theme-highcontrast": "^6.0.10", + "@blockly/theme-tritanopia": "^6.0.10", "chai": "^4.2.0", "dat.gui": "^0.7.7", "lodash.assign": "^4.2.0", @@ -176,9 +176,9 @@ } }, "node_modules/@blockly/theme-dark": { - "version": "7.0.7", - "resolved": "https://registry.npmjs.org/@blockly/theme-dark/-/theme-dark-7.0.7.tgz", - "integrity": "sha512-p6urK/fLyzLhrHcSo1DhEvRkasyJjBYDpBPgPipAqGNJRlLR1pbNoBRcrpv3RzTgKIKbA0TeawsWHrHOXG0S/w==", + "version": "7.0.10", + "resolved": "https://registry.npmjs.org/@blockly/theme-dark/-/theme-dark-7.0.10.tgz", + "integrity": "sha512-Wc6n115vt9alxzPkEwYtvBBGoPUV3gaYE00dvSKhqXTNoy1Xioujj9kT9VkGmdMO2mhgnJNczSpvxG8tcd4zLQ==", "dev": true, "engines": { "node": ">=8.17.0" @@ -188,9 +188,9 @@ } }, "node_modules/@blockly/theme-deuteranopia": { - "version": "6.0.7", - "resolved": "https://registry.npmjs.org/@blockly/theme-deuteranopia/-/theme-deuteranopia-6.0.7.tgz", - "integrity": "sha512-br1pto4qKhHQYYZZdzWz+gooBmH0MAIpnu038BIzEiRzpcXtKNvsPexwVLAqYII+w37rZTvE4vgl/9yjH/AzJA==", + "version": "6.0.10", + "resolved": "https://registry.npmjs.org/@blockly/theme-deuteranopia/-/theme-deuteranopia-6.0.10.tgz", + "integrity": "sha512-im5nIvf/Z0f1vJ9DK5Euu6URfY8G44xeFsat2b7TySF0BfAUWkGsagK3C6D5NatigPxKZqz3exC9zeXEtprAcg==", "dev": true, "engines": { "node": ">=8.17.0" @@ -200,9 +200,9 @@ } }, "node_modules/@blockly/theme-highcontrast": { - "version": "6.0.7", - "resolved": "https://registry.npmjs.org/@blockly/theme-highcontrast/-/theme-highcontrast-6.0.7.tgz", - "integrity": "sha512-zZry3A1UBbuDclo3+yhJ45te5dQypwMCbao4djR28PVQEousM1t6h7AiQHy8zCop+nxqVSTESsgjEt96OQTb/g==", + "version": "6.0.10", + "resolved": "https://registry.npmjs.org/@blockly/theme-highcontrast/-/theme-highcontrast-6.0.10.tgz", + "integrity": "sha512-s1hehl/b50IhebCs20hm2hFWbUTqJ2YSGdR0gnp2NLfNNRWwyZHZk+q4aG3k4L0YBWjNfE3XiRCkDISy83dBIA==", "dev": true, "engines": { "node": ">=8.17.0" @@ -212,9 +212,9 @@ } }, "node_modules/@blockly/theme-modern": { - "version": "6.0.7", - "resolved": "https://registry.npmjs.org/@blockly/theme-modern/-/theme-modern-6.0.7.tgz", - "integrity": "sha512-RUEmunGe1L6So0sTpBd1yUz3foUAzjTj1x0y3P4iyuGu0HzfLIacqUpdU4wQNteGPbKSBp7qDFRXaH/V2eJ6QA==", + "version": "6.0.10", + "resolved": "https://registry.npmjs.org/@blockly/theme-modern/-/theme-modern-6.0.10.tgz", + "integrity": "sha512-xOVf5Vq5ACgbVsaNAKWb5cE0msUfBxj1G1asp0aBmWo1QCr3Yze4rUtFDaNIoeCd8EsRpuWZgBYg74zPL9eAow==", "dev": true, "engines": { "node": ">=8.17.0" @@ -224,9 +224,9 @@ } }, "node_modules/@blockly/theme-tritanopia": { - "version": "6.0.7", - "resolved": "https://registry.npmjs.org/@blockly/theme-tritanopia/-/theme-tritanopia-6.0.7.tgz", - "integrity": "sha512-AF0iyzFYxY41pOVvZiCy1kAa4LeIHL9007B2xfRbVN/bTEA4rnd4W2k3XaEGv9xO026iBfvfRL9DJ9xASF9LFw==", + "version": "6.0.10", + "resolved": "https://registry.npmjs.org/@blockly/theme-tritanopia/-/theme-tritanopia-6.0.10.tgz", + "integrity": "sha512-QNIvUHokGMLnCWUzERRZa6sSkD5RIUynWDI+KNurBH21NeWnSNScQiNu0dS/w5MSkZ/Iqqbi79UZoF49SzEayg==", "dev": true, "engines": { "node": ">=8.17.0" @@ -332,9 +332,9 @@ } }, "node_modules/@eslint/js": { - "version": "9.16.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.16.0.tgz", - "integrity": "sha512-tw2HxzQkrbeuvyj1tG2Yqq+0H9wGoI2IMk4EOsQeX+vmd75FtJAzf+gTA69WF+baUKRYQ3x2kbLE08js5OsTVg==", + "version": "9.17.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.17.0.tgz", + "integrity": "sha512-Sxc4hqcs1kTu0iID3kcZDW3JHq2a77HO9P8CP6YEA/FpH3Ll8UXE2r/86Rz9YJLKme39S9vU5OWNjC6Xl0Cr3w==", "dev": true, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -739,18 +739,18 @@ } }, "node_modules/@microsoft/api-extractor": { - "version": "7.47.11", - "resolved": "https://registry.npmjs.org/@microsoft/api-extractor/-/api-extractor-7.47.11.tgz", - "integrity": "sha512-lrudfbPub5wzBhymfFtgZKuBvXxoSIAdrvS2UbHjoMT2TjIEddq6Z13pcve7A03BAouw0x8sW8G4txdgfiSwpQ==", + "version": "7.48.1", + "resolved": "https://registry.npmjs.org/@microsoft/api-extractor/-/api-extractor-7.48.1.tgz", + "integrity": "sha512-HN9Osa1WxqLM66RaqB5nPAadx+nTIQmY/XtkFdaJvusjG8Tus++QqZtD7KPZDSkhEMGHsYeSyeU8qUzCDUXPjg==", "dev": true, "dependencies": { - "@microsoft/api-extractor-model": "7.29.8", - "@microsoft/tsdoc": "~0.15.0", - "@microsoft/tsdoc-config": "~0.17.0", - "@rushstack/node-core-library": "5.9.0", + "@microsoft/api-extractor-model": "7.30.1", + "@microsoft/tsdoc": "~0.15.1", + "@microsoft/tsdoc-config": "~0.17.1", + "@rushstack/node-core-library": "5.10.1", "@rushstack/rig-package": "0.5.3", - "@rushstack/terminal": "0.14.2", - "@rushstack/ts-command-line": "4.23.0", + "@rushstack/terminal": "0.14.4", + "@rushstack/ts-command-line": "4.23.2", "lodash": "~4.17.15", "minimatch": "~3.0.3", "resolve": "~1.22.1", @@ -773,18 +773,87 @@ "@rushstack/node-core-library": "5.9.0" } }, - "node_modules/@microsoft/api-extractor/node_modules/@rushstack/ts-command-line": { - "version": "4.23.0", - "resolved": "https://registry.npmjs.org/@rushstack/ts-command-line/-/ts-command-line-4.23.0.tgz", - "integrity": "sha512-jYREBtsxduPV6ptNq8jOKp9+yx0ld1Tb/Tkdnlj8gTjazl1sF3DwX2VbluyYrNd0meWIL0bNeer7WDf5tKFjaQ==", + "node_modules/@microsoft/api-extractor/node_modules/@microsoft/api-extractor-model": { + "version": "7.30.1", + "resolved": "https://registry.npmjs.org/@microsoft/api-extractor-model/-/api-extractor-model-7.30.1.tgz", + "integrity": "sha512-CTS2PlASJHxVY8hqHORVb1HdECWOEMcMnM6/kDkPr0RZapAFSIHhg9D4jxuE8g+OWYHtPc10LCpmde5pylTRlA==", "dev": true, "dependencies": { - "@rushstack/terminal": "0.14.2", + "@microsoft/tsdoc": "~0.15.1", + "@microsoft/tsdoc-config": "~0.17.1", + "@rushstack/node-core-library": "5.10.1" + } + }, + "node_modules/@microsoft/api-extractor/node_modules/@rushstack/node-core-library": { + "version": "5.10.1", + "resolved": "https://registry.npmjs.org/@rushstack/node-core-library/-/node-core-library-5.10.1.tgz", + "integrity": "sha512-BSb/KcyBHmUQwINrgtzo6jiH0HlGFmrUy33vO6unmceuVKTEyL2q+P0fQq2oB5hvXVWOEUhxB2QvlkZluvUEmg==", + "dev": true, + "dependencies": { + "ajv": "~8.13.0", + "ajv-draft-04": "~1.0.0", + "ajv-formats": "~3.0.1", + "fs-extra": "~7.0.1", + "import-lazy": "~4.0.0", + "jju": "~1.4.0", + "resolve": "~1.22.1", + "semver": "~7.5.4" + }, + "peerDependencies": { + "@types/node": "*" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@microsoft/api-extractor/node_modules/@rushstack/terminal": { + "version": "0.14.4", + "resolved": "https://registry.npmjs.org/@rushstack/terminal/-/terminal-0.14.4.tgz", + "integrity": "sha512-NxACqERW0PHq8Rpq1V6v5iTHEwkRGxenjEW+VWqRYQ8T9puUzgmGHmEZUaUEDHAe9Qyvp0/Ew04sAiQw9XjhJg==", + "dev": true, + "dependencies": { + "@rushstack/node-core-library": "5.10.1", + "supports-color": "~8.1.1" + }, + "peerDependencies": { + "@types/node": "*" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@microsoft/api-extractor/node_modules/@rushstack/ts-command-line": { + "version": "4.23.2", + "resolved": "https://registry.npmjs.org/@rushstack/ts-command-line/-/ts-command-line-4.23.2.tgz", + "integrity": "sha512-JJ7XZX5K3ThBBva38aomgsPv1L7FV6XmSOcR6HtM7HDFZJkepqT65imw26h9ggGqMjsY0R9jcl30tzKcVj9aOQ==", + "dev": true, + "dependencies": { + "@rushstack/terminal": "0.14.4", "@types/argparse": "1.0.38", "argparse": "~1.0.9", "string-argv": "~0.3.1" } }, + "node_modules/@microsoft/api-extractor/node_modules/ajv": { + "version": "8.13.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.13.0.tgz", + "integrity": "sha512-PRA911Blj99jR5RMeTunVbNXMF6Lp4vZXnk5GQjcnUWUTsrXtekg/pnmFFI2u/I36Y/2bITGS30GZCXei6uNkA==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.3", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.4.1" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, "node_modules/@microsoft/api-extractor/node_modules/argparse": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", @@ -794,6 +863,12 @@ "sprintf-js": "~1.0.2" } }, + "node_modules/@microsoft/api-extractor/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, "node_modules/@microsoft/api-extractor/node_modules/minimatch": { "version": "3.0.8", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.8.tgz", @@ -815,6 +890,21 @@ "node": ">=0.10.0" } }, + "node_modules/@microsoft/api-extractor/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, "node_modules/@microsoft/api-extractor/node_modules/typescript": { "version": "5.4.2", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.2.tgz", @@ -829,18 +919,18 @@ } }, "node_modules/@microsoft/tsdoc": { - "version": "0.15.0", - "resolved": "https://registry.npmjs.org/@microsoft/tsdoc/-/tsdoc-0.15.0.tgz", - "integrity": "sha512-HZpPoABogPvjeJOdzCOSJsXeL/SMCBgBZMVC3X3d7YYp2gf31MfxhUoYUNwf1ERPJOnQc0wkFn9trqI6ZEdZuA==", + "version": "0.15.1", + "resolved": "https://registry.npmjs.org/@microsoft/tsdoc/-/tsdoc-0.15.1.tgz", + "integrity": "sha512-4aErSrCR/On/e5G2hDP0wjooqDdauzEbIq8hIkIe5pXV0rtWJZvdCEKL0ykZxex+IxIwBp0eGeV48hQN07dXtw==", "dev": true }, "node_modules/@microsoft/tsdoc-config": { - "version": "0.17.0", - "resolved": "https://registry.npmjs.org/@microsoft/tsdoc-config/-/tsdoc-config-0.17.0.tgz", - "integrity": "sha512-v/EYRXnCAIHxOHW+Plb6OWuUoMotxTN0GLatnpOb1xq0KuTNw/WI3pamJx/UbsoJP5k9MCw1QxvvhPcF9pH3Zg==", + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/@microsoft/tsdoc-config/-/tsdoc-config-0.17.1.tgz", + "integrity": "sha512-UtjIFe0C6oYgTnad4q1QP4qXwLhe6tIpNTRStJ2RZEPIkqQPREAwE5spzVxsdn9UaEMUqhh0AqSx3X4nWAKXWw==", "dev": true, "dependencies": { - "@microsoft/tsdoc": "0.15.0", + "@microsoft/tsdoc": "0.15.1", "ajv": "~8.12.0", "jju": "~1.4.0", "resolve": "~1.22.2" @@ -926,9 +1016,9 @@ } }, "node_modules/@promptbook/utils": { - "version": "0.70.0-1", - "resolved": "https://registry.npmjs.org/@promptbook/utils/-/utils-0.70.0-1.tgz", - "integrity": "sha512-qd2lLRRN+sE6UuNMi2tEeUUeb4zmXnxY5EMdfHVXNE+bqBDpUC7/aEfXgA3jnUXEr+xFjQ8PTFQgWvBMaKvw0g==", + "version": "0.69.5", + "resolved": "https://registry.npmjs.org/@promptbook/utils/-/utils-0.69.5.tgz", + "integrity": "sha512-xm5Ti/Hp3o4xHrsK9Yy3MS6KbDxYbq485hDsFvxqaNA7equHLPdo8H8faTitTeb14QCDfLW4iwCxdVYu5sn6YQ==", "dev": true, "funding": [ { @@ -941,19 +1031,19 @@ } ], "dependencies": { - "spacetrim": "0.11.39" + "spacetrim": "0.11.59" } }, "node_modules/@puppeteer/browsers": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-2.4.0.tgz", - "integrity": "sha512-x8J1csfIygOwf6D6qUAZ0ASk3z63zPb7wkNeHRerCMh82qWKUrOgkuP005AJC8lDL6/evtXETGEJVcwykKT4/g==", + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-2.6.1.tgz", + "integrity": "sha512-aBSREisdsGH890S2rQqK82qmQYU3uFpSH8wcZWHgHzl3LfzsxAKbLNiAG9mO8v1Y0UICBeClICxPJvyr0rcuxg==", "dev": true, "dependencies": { - "debug": "^4.3.6", + "debug": "^4.4.0", "extract-zip": "^2.0.1", "progress": "^2.0.3", - "proxy-agent": "^6.4.0", + "proxy-agent": "^6.5.0", "semver": "^7.6.3", "tar-fs": "^3.0.6", "unbzip2-stream": "^1.4.3", @@ -1200,9 +1290,9 @@ "dev": true }, "node_modules/@types/ws": { - "version": "8.5.12", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.12.tgz", - "integrity": "sha512-3tPRkv1EtkDpzlgyKyI8pGsGZAGPEaXeu0DOj5DI25Ja91bdAYddYHbADRYVrZMRbfW+1l5YwXVDKohDJNQxkQ==", + "version": "8.5.13", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.13.tgz", + "integrity": "sha512-osM/gWBTPKgHV8XkTunnegTRIsvF6owmf5w+JtAfOw472dptdm0dlGv4xCt6GwQRcC2XVOvvRE/0bAoQcL2QkA==", "dev": true, "dependencies": { "@types/node": "*" @@ -1457,14 +1547,14 @@ } }, "node_modules/@wdio/config": { - "version": "9.0.8", - "resolved": "https://registry.npmjs.org/@wdio/config/-/config-9.0.8.tgz", - "integrity": "sha512-37L+hd+A1Nyehd/pgfTrLC6w+Ngbu0CIoFh9Vv6v8Cgu5Hih0TLofvlg+J1BNbcTd5eQ2tFKZBDeFMhQaIiTpg==", + "version": "9.4.2", + "resolved": "https://registry.npmjs.org/@wdio/config/-/config-9.4.2.tgz", + "integrity": "sha512-pTwxN0EmkHzYKTfYnk/d+qIBRJFrNxNa58PDPbAc0On4dq7qqueDm/HyyFnTXc6t0vrqCNlR55DmKwqt3UqsKQ==", "dev": true, "dependencies": { - "@wdio/logger": "9.0.8", - "@wdio/types": "9.0.8", - "@wdio/utils": "9.0.8", + "@wdio/logger": "9.1.3", + "@wdio/types": "9.4.2", + "@wdio/utils": "9.4.2", "decamelize": "^6.0.0", "deepmerge-ts": "^7.0.3", "glob": "^10.2.2", @@ -1475,9 +1565,9 @@ } }, "node_modules/@wdio/logger": { - "version": "9.0.8", - "resolved": "https://registry.npmjs.org/@wdio/logger/-/logger-9.0.8.tgz", - "integrity": "sha512-uIyYIDBwLczmsp9JE5hN3ME8Xg+9WNBfSNXD69ICHrY9WPTzFf94UeTuavK7kwSKF3ro2eJbmNZItYOfnoovnw==", + "version": "9.1.3", + "resolved": "https://registry.npmjs.org/@wdio/logger/-/logger-9.1.3.tgz", + "integrity": "sha512-cumRMK/gE1uedBUw3WmWXOQ7HtB6DR8EyKQioUz2P0IJtRRpglMBdZV7Svr3b++WWawOuzZHMfbTkJQmaVt8Gw==", "dev": true, "dependencies": { "chalk": "^5.1.2", @@ -1517,9 +1607,9 @@ } }, "node_modules/@wdio/protocols": { - "version": "9.0.8", - "resolved": "https://registry.npmjs.org/@wdio/protocols/-/protocols-9.0.8.tgz", - "integrity": "sha512-xRH54byFf623/w/KW62xkf/C2mGyigSfMm+UT3tNEAd5ZA9X2VAWQWQBPzdcrsck7Fxk4zlQX8Kb34RSs7Cy4Q==", + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/@wdio/protocols/-/protocols-9.2.2.tgz", + "integrity": "sha512-0GMUSHCbYm+J+rnRU6XPtaUgVCRICsiH6W5zCXpePm3wLlbmg/mvZ+4OnNErssbpIOulZuAmC2jNmut2AEfWSw==", "dev": true }, "node_modules/@wdio/repl": { @@ -1535,9 +1625,9 @@ } }, "node_modules/@wdio/types": { - "version": "9.0.8", - "resolved": "https://registry.npmjs.org/@wdio/types/-/types-9.0.8.tgz", - "integrity": "sha512-pmz2iRWddTanrv8JC7v3wUGm17KRv2WyyJhQfklMSANn9V1ep6pw1RJG2WJnKq4NojMvH1nVv1sMZxXrYPhpYw==", + "version": "9.4.2", + "resolved": "https://registry.npmjs.org/@wdio/types/-/types-9.4.2.tgz", + "integrity": "sha512-eaEqngtnYQ2D6YLbfM2HGJVbJBjO1fAotPdu1G1cr28RAjcsANpl5IbDHZMlsKmiU9JtJx5CadhxCnrCLZVVDw==", "dev": true, "dependencies": { "@types/node": "^20.1.0" @@ -1547,22 +1637,22 @@ } }, "node_modules/@wdio/utils": { - "version": "9.0.8", - "resolved": "https://registry.npmjs.org/@wdio/utils/-/utils-9.0.8.tgz", - "integrity": "sha512-p3EgOdkhCvMxJFd3WTtSChqYFQu2mz69/5tOsljDaL+4QYwnRR7O8M9wFsL3/9XMVcHdnC4Ija2VRxQ/lb+hHQ==", + "version": "9.4.2", + "resolved": "https://registry.npmjs.org/@wdio/utils/-/utils-9.4.2.tgz", + "integrity": "sha512-ryjPjmyR0s/9qgBBLKvh1cP/OndJ2BkY2LZhc4Nx6z9IxKmKDq79ajKNmsWR55mTMcembhcb8ikCACW8tEGEdA==", "dev": true, "dependencies": { "@puppeteer/browsers": "^2.2.0", - "@wdio/logger": "9.0.8", - "@wdio/types": "9.0.8", + "@wdio/logger": "9.1.3", + "@wdio/types": "9.4.2", "decamelize": "^6.0.0", "deepmerge-ts": "^7.0.3", - "edgedriver": "^5.6.1", - "geckodriver": "^4.3.3", + "edgedriver": "^6.1.1", + "geckodriver": "^5.0.0", "get-port": "^7.0.0", "import-meta-resolve": "^4.0.0", "locate-app": "^2.2.24", - "safaridriver": "^0.1.2", + "safaridriver": "^1.0.0", "split2": "^4.2.0", "wait-port": "^1.1.0" }, @@ -1577,9 +1667,9 @@ "dev": true }, "node_modules/@zip.js/zip.js": { - "version": "2.7.52", - "resolved": "https://registry.npmjs.org/@zip.js/zip.js/-/zip.js-2.7.52.tgz", - "integrity": "sha512-+5g7FQswvrCHwYKNMd/KFxZSObctLSsQOgqBSi0LzwHo3li9Eh1w5cF5ndjQw9Zbr3ajVnd2+XyiX85gAetx1Q==", + "version": "2.7.54", + "resolved": "https://registry.npmjs.org/@zip.js/zip.js/-/zip.js-2.7.54.tgz", + "integrity": "sha512-qMrJVg2hoEsZJjMJez9yI2+nZlBUxgYzGV3mqcb2B/6T1ihXp0fWBDYlVHlHquuorgNUQP5a8qSmX6HF5rFJNg==", "dev": true, "engines": { "bun": ">=0.7.0", @@ -1621,12 +1711,9 @@ } }, "node_modules/agent-base": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", - "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", - "dependencies": { - "debug": "^4.3.4" - }, + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz", + "integrity": "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==", "engines": { "node": ">= 14" } @@ -2050,9 +2137,9 @@ } }, "node_modules/ast-types/node_modules/tslib": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.7.0.tgz", - "integrity": "sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==", + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", "dev": true }, "node_modules/async": { @@ -2176,14 +2263,13 @@ } }, "node_modules/bare-stream": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/bare-stream/-/bare-stream-2.3.0.tgz", - "integrity": "sha512-pVRWciewGUeCyKEuRxwv06M079r+fRjAQjBEK2P6OYGrO43O+Z0LrPZZEjlc4mB6C2RpZ9AxJ1s7NLEtOHO6eA==", + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/bare-stream/-/bare-stream-2.6.1.tgz", + "integrity": "sha512-eVZbtKM+4uehzrsj49KtCy3Pbg7kO1pJ3SKZ1SFrIH/0pnj9scuGGgUlNDf/7qS8WKtGdiJY5Kyhs/ivYPTB/g==", "dev": true, "optional": true, "dependencies": { - "b4a": "^1.6.6", - "streamx": "^2.20.0" + "streamx": "^2.21.0" } }, "node_modules/base64-js": { @@ -2756,9 +2842,9 @@ } }, "node_modules/concurrently": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-9.0.1.tgz", - "integrity": "sha512-wYKvCd/f54sTXJMSfV6Ln/B8UrfLBKOYa+lzc6CHay3Qek+LorVSBdMVfyewFhRbH0Rbabsk4D+3PL/VjQ5gzg==", + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-9.1.2.tgz", + "integrity": "sha512-H9MWcoPsYddwbOGM6difjVwVZHl63nwMEwDJG/L7VGtuaJhb12h2caPG2tVPWs7emuYix252iGfqOyrz1GczTQ==", "dev": true, "dependencies": { "chalk": "^4.1.2", @@ -3081,11 +3167,11 @@ } }, "node_modules/debug": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz", - "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", "dependencies": { - "ms": "2.1.2" + "ms": "^2.1.3" }, "engines": { "node": ">=6.0" @@ -3158,9 +3244,9 @@ "dev": true }, "node_modules/deepmerge-ts": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/deepmerge-ts/-/deepmerge-ts-7.1.0.tgz", - "integrity": "sha512-q6bNsfNBtgr8ZOQqmZbl94MmYWm+QcDNIkqCxVWiw1vKvf+y/N2dZQKdnDXn4c5Ygt/y63tDof6OCN+2YwWVEg==", + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/deepmerge-ts/-/deepmerge-ts-7.1.3.tgz", + "integrity": "sha512-qCSH6I0INPxd9Y1VtAiLpnYvz5O//6rCfJXKk0z66Up9/VOSr+1yS8XSKA5IWRxjocFGlzPyaZYe+jxq7OOLtQ==", "dev": true, "engines": { "node": ">=16.0.0" @@ -3315,49 +3401,27 @@ } }, "node_modules/edgedriver": { - "version": "5.6.1", - "resolved": "https://registry.npmjs.org/edgedriver/-/edgedriver-5.6.1.tgz", - "integrity": "sha512-3Ve9cd5ziLByUdigw6zovVeWJjVs8QHVmqOB0sJ0WNeVPcwf4p18GnxMmVvlFmYRloUwf5suNuorea4QzwBIOA==", + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/edgedriver/-/edgedriver-6.1.1.tgz", + "integrity": "sha512-/dM/PoBf22Xg3yypMWkmRQrBKEnSyNaZ7wHGCT9+qqT14izwtFT+QvdR89rjNkMfXwW+bSFoqOfbcvM+2Cyc7w==", "dev": true, "hasInstallScript": true, "dependencies": { - "@wdio/logger": "^8.38.0", - "@zip.js/zip.js": "^2.7.48", + "@wdio/logger": "^9.1.3", + "@zip.js/zip.js": "^2.7.53", "decamelize": "^6.0.0", "edge-paths": "^3.0.5", - "fast-xml-parser": "^4.4.1", + "fast-xml-parser": "^4.5.0", + "http-proxy-agent": "^7.0.2", + "https-proxy-agent": "^7.0.5", "node-fetch": "^3.3.2", - "which": "^4.0.0" + "which": "^5.0.0" }, "bin": { "edgedriver": "bin/edgedriver.js" - } - }, - "node_modules/edgedriver/node_modules/@wdio/logger": { - "version": "8.38.0", - "resolved": "https://registry.npmjs.org/@wdio/logger/-/logger-8.38.0.tgz", - "integrity": "sha512-kcHL86RmNbcQP+Gq/vQUGlArfU6IIcbbnNp32rRIraitomZow+iEoc519rdQmSVusDozMS5DZthkgDdxK+vz6Q==", - "dev": true, - "dependencies": { - "chalk": "^5.1.2", - "loglevel": "^1.6.0", - "loglevel-plugin-prefix": "^0.8.4", - "strip-ansi": "^7.1.0" }, "engines": { - "node": "^16.13 || >=18" - } - }, - "node_modules/edgedriver/node_modules/chalk": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", - "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", - "dev": true, - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "node": ">=18.0.0" } }, "node_modules/edgedriver/node_modules/isexe": { @@ -3369,25 +3433,10 @@ "node": ">=16" } }, - "node_modules/edgedriver/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, "node_modules/edgedriver/node_modules/which": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz", - "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/which/-/which-5.0.0.tgz", + "integrity": "sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ==", "dev": true, "dependencies": { "isexe": "^3.1.1" @@ -3396,7 +3445,7 @@ "node-which": "bin/which.js" }, "engines": { - "node": "^16.13.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/emoji-regex": { @@ -3553,9 +3602,9 @@ } }, "node_modules/eslint": { - "version": "9.16.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.16.0.tgz", - "integrity": "sha512-whp8mSQI4C8VXd+fLgSM0lh3UlmcFtVwUQjyKCFfsp+2ItAIYhlq/hqGahGqHE6cv9unM41VlqKk2VtKYR2TaA==", + "version": "9.17.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.17.0.tgz", + "integrity": "sha512-evtlNcpJg+cZLcnVKwsai8fExnqjGPicK7gnUtlNuzu+Fv9bI0aLpND5T44VLQtoMEnI57LoXO9XAkIXwohKrA==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", @@ -3563,7 +3612,7 @@ "@eslint/config-array": "^0.19.0", "@eslint/core": "^0.9.0", "@eslint/eslintrc": "^3.2.0", - "@eslint/js": "9.16.0", + "@eslint/js": "9.17.0", "@eslint/plugin-kit": "^0.2.3", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", @@ -3572,7 +3621,7 @@ "@types/json-schema": "^7.0.15", "ajv": "^6.12.4", "chalk": "^4.0.0", - "cross-spawn": "^7.0.5", + "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", "eslint-scope": "^8.2.0", @@ -3636,9 +3685,9 @@ } }, "node_modules/eslint-plugin-jsdoc": { - "version": "50.5.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-50.5.0.tgz", - "integrity": "sha512-xTkshfZrUbiSHXBwZ/9d5ulZ2OcHXxSvm/NPo494H/hadLRJwOq5PMV0EUpMqsb9V+kQo+9BAgi6Z7aJtdBp2A==", + "version": "50.6.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-50.6.0.tgz", + "integrity": "sha512-tCNp4fR79Le3dYTPB0dKEv7yFyvGkUCa+Z3yuTrrNGGOxBlXo9Pn0PEgroOZikUQOGjxoGMVKNjrOHcYEdfszg==", "dev": true, "dependencies": { "@es-joy/jsdoccomment": "~0.49.0", @@ -4010,9 +4059,9 @@ "dev": true }, "node_modules/fast-xml-parser": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.5.0.tgz", - "integrity": "sha512-/PlTQCI96+fZMAOLMZK4CWG1ItCbfZ/0jx7UIJFChPNrx7tcEgerUgWbeieCM9MfHInUDyK8DWYZ+YrywDJuTg==", + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.5.1.tgz", + "integrity": "sha512-y655CeyUQ+jj7KBbYMc4FG01V8ZQqjN+gDYGJ50RtfsUB8iG9AmwmwoAgeKLJdmueKKMrH1RJ7yXHTSoczdv5w==", "dev": true, "funding": [ { @@ -4341,26 +4390,26 @@ } }, "node_modules/geckodriver": { - "version": "4.4.4", - "resolved": "https://registry.npmjs.org/geckodriver/-/geckodriver-4.4.4.tgz", - "integrity": "sha512-0zaw19tcmWeluqx7+Y559JGBtidu1D0Lb8ElYKiNEQu8r3sCfrLUf5V10xypl8u29ZLbgRV7WflxCJVTCkCMFA==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/geckodriver/-/geckodriver-5.0.0.tgz", + "integrity": "sha512-vn7TtQ3b9VMJtVXsyWtQQl1fyBVFhQy7UvJF96kPuuJ0or5THH496AD3eUyaDD11+EqCxH9t6V+EP9soZQk4YQ==", "dev": true, "hasInstallScript": true, "dependencies": { - "@wdio/logger": "^9.0.0", - "@zip.js/zip.js": "^2.7.48", + "@wdio/logger": "^9.1.3", + "@zip.js/zip.js": "^2.7.53", "decamelize": "^6.0.0", "http-proxy-agent": "^7.0.2", "https-proxy-agent": "^7.0.5", "node-fetch": "^3.3.2", "tar-fs": "^3.0.6", - "which": "^4.0.0" + "which": "^5.0.0" }, "bin": { "geckodriver": "bin/geckodriver.js" }, "engines": { - "node": "^16.13 || >=18 || >=20" + "node": ">=18.0.0" } }, "node_modules/geckodriver/node_modules/isexe": { @@ -4373,9 +4422,9 @@ } }, "node_modules/geckodriver/node_modules/which": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz", - "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/which/-/which-5.0.0.tgz", + "integrity": "sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ==", "dev": true, "dependencies": { "isexe": "^3.1.1" @@ -4384,7 +4433,7 @@ "node-which": "bin/which.js" }, "engines": { - "node": "^16.13.0 || >=18.0.0" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/get-caller-file": { @@ -4433,15 +4482,14 @@ } }, "node_modules/get-uri": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-6.0.3.tgz", - "integrity": "sha512-BzUrJBS9EcUb4cFol8r4W3v1cPsSyajLSthNkz5BxbpDcHN5tIrM10E2eNvfnvBn3DaT3DUgx0OpsBKkaOpanw==", + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-6.0.4.tgz", + "integrity": "sha512-E1b1lFFLvLgak2whF2xDBcOy6NLVGZBqqjJjsIhvopKfWWEi64pLVTWWehV8KlLerZkfNTA95sTe2OdJKm1OzQ==", "dev": true, "dependencies": { "basic-ftp": "^5.0.2", "data-uri-to-buffer": "^6.0.2", - "debug": "^4.3.4", - "fs-extra": "^11.2.0" + "debug": "^4.3.4" }, "engines": { "node": ">= 14" @@ -4456,20 +4504,6 @@ "node": ">= 14" } }, - "node_modules/get-uri/node_modules/fs-extra": { - "version": "11.2.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", - "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=14.14" - } - }, "node_modules/glob": { "version": "10.4.1", "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.1.tgz", @@ -5206,9 +5240,9 @@ } }, "node_modules/htmlfy": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/htmlfy/-/htmlfy-0.2.1.tgz", - "integrity": "sha512-HoomFHQ3av1uhq+7FxJTq4Ns0clAD+tGbQNrSd0WFY3UAjjUk6G3LaWEqdgmIXYkY4pexZiyZ3ykZJhQlM0J5A==", + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/htmlfy/-/htmlfy-0.3.2.tgz", + "integrity": "sha512-FsxzfpeDYRqn1emox9VpxMPfGjADoUmmup8D604q497R0VNxiXs4ZZTN2QzkaMA5C9aHGUoe1iQRVSm+HK9xuA==", "dev": true }, "node_modules/htmlparser2": { @@ -5284,11 +5318,11 @@ } }, "node_modules/https-proxy-agent": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.5.tgz", - "integrity": "sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", "dependencies": { - "agent-base": "^7.0.2", + "agent-base": "^7.1.2", "debug": "4" }, "engines": { @@ -6044,9 +6078,9 @@ } }, "node_modules/locate-app": { - "version": "2.4.43", - "resolved": "https://registry.npmjs.org/locate-app/-/locate-app-2.4.43.tgz", - "integrity": "sha512-BX6NEdECUGcDQw8aqqg02qLyF9rF8V+dAfyAnBzL2AofIlIvf4Q6EGXnzVWpWot9uBE+x/o8CjXHo7Zlegu91Q==", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/locate-app/-/locate-app-2.5.0.tgz", + "integrity": "sha512-xIqbzPMBYArJRmPGUZD9CzV9wOqmVtQnaAn3wrj3s6WYW0bQvPI7x+sPYUGmDTYMHefVK//zc6HEYZ1qnxIK+Q==", "dev": true, "funding": [ { @@ -6059,9 +6093,21 @@ } ], "dependencies": { - "@promptbook/utils": "0.70.0-1", - "type-fest": "2.13.0", - "userhome": "1.0.0" + "@promptbook/utils": "0.69.5", + "type-fest": "4.26.0", + "userhome": "1.0.1" + } + }, + "node_modules/locate-app/node_modules/type-fest": { + "version": "4.26.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.26.0.tgz", + "integrity": "sha512-OduNjVJsFbifKb57UqZ2EMP1i4u64Xwow3NYXUtBbD4vIwJdQd4+xl8YDou1dlm4DVrtwT/7Ky8z8WyCULVfxw==", + "dev": true, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/locate-path": { @@ -6419,12 +6465,6 @@ "node": ">=10" } }, - "node_modules/mocha/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true - }, "node_modules/mocha/node_modules/supports-color": { "version": "8.1.1", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", @@ -6474,9 +6514,9 @@ "dev": true }, "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" }, "node_modules/mute-stdout": { "version": "2.0.0", @@ -6723,19 +6763,19 @@ } }, "node_modules/pac-proxy-agent": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-7.0.2.tgz", - "integrity": "sha512-BFi3vZnO9X5Qt6NRz7ZOaPja3ic0PhlsmCRYLOpN11+mWBCR6XJDqW5RF3j8jm4WGGQZtBA+bTfxYzeKW73eHg==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-7.1.0.tgz", + "integrity": "sha512-Z5FnLVVZSnX7WjBg0mhDtydeRZ1xMcATZThjySQUHqr+0ksP8kqaw23fNKkaaN/Z8gwLUs/W7xdl0I75eP2Xyw==", "dev": true, "dependencies": { "@tootallnate/quickjs-emscripten": "^0.23.0", - "agent-base": "^7.0.2", + "agent-base": "^7.1.2", "debug": "^4.3.4", "get-uri": "^6.0.1", "http-proxy-agent": "^7.0.0", - "https-proxy-agent": "^7.0.5", + "https-proxy-agent": "^7.0.6", "pac-resolver": "^7.0.1", - "socks-proxy-agent": "^8.0.4" + "socks-proxy-agent": "^8.0.5" }, "engines": { "node": ">= 14" @@ -7189,21 +7229,16 @@ } }, "node_modules/prettier-plugin-organize-imports": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/prettier-plugin-organize-imports/-/prettier-plugin-organize-imports-4.0.0.tgz", - "integrity": "sha512-vnKSdgv9aOlqKeEFGhf9SCBsTyzDSyScy1k7E0R1Uo4L0cTcOV7c1XQaT7jfXIOc/p08WLBfN2QUQA9zDSZMxA==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/prettier-plugin-organize-imports/-/prettier-plugin-organize-imports-4.1.0.tgz", + "integrity": "sha512-5aWRdCgv645xaa58X8lOxzZoiHAldAPChljr/MT0crXVOWTZ+Svl4hIWlz+niYSlO6ikE5UXkN1JrRvIP2ut0A==", "dev": true, - "license": "MIT", "peerDependencies": { - "@vue/language-plugin-pug": "^2.0.24", "prettier": ">=2.0", "typescript": ">=2.9", - "vue-tsc": "^2.0.24" + "vue-tsc": "^2.1.0" }, "peerDependenciesMeta": { - "@vue/language-plugin-pug": { - "optional": true - }, "vue-tsc": { "optional": true } @@ -7234,19 +7269,19 @@ } }, "node_modules/proxy-agent": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-6.4.0.tgz", - "integrity": "sha512-u0piLU+nCOHMgGjRbimiXmA9kM/L9EHh3zL81xCdp7m+Y2pHIsnmbdDoEDoAz5geaonNR6q6+yOPQs6n4T6sBQ==", + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-6.5.0.tgz", + "integrity": "sha512-TmatMXdr2KlRiA2CyDu8GqR8EjahTG3aY3nXjdzFyoZbmB8hrBsTyMezhULIXKnC0jpfjlmiZ3+EaCzoInSu/A==", "dev": true, "dependencies": { - "agent-base": "^7.0.2", + "agent-base": "^7.1.2", "debug": "^4.3.4", "http-proxy-agent": "^7.0.1", - "https-proxy-agent": "^7.0.3", + "https-proxy-agent": "^7.0.6", "lru-cache": "^7.14.1", - "pac-proxy-agent": "^7.0.1", + "pac-proxy-agent": "^7.1.0", "proxy-from-env": "^1.1.0", - "socks-proxy-agent": "^8.0.2" + "socks-proxy-agent": "^8.0.5" }, "engines": { "node": ">= 14" @@ -7636,10 +7671,13 @@ "dev": true }, "node_modules/safaridriver": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/safaridriver/-/safaridriver-0.1.2.tgz", - "integrity": "sha512-4R309+gWflJktzPXBQCobbWEHlzC4aK3a+Ov3tz2Ib2aBxiwd11phkdIBH1l0EO22x24CJMUQkpKFumRriCSRg==", - "dev": true + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safaridriver/-/safaridriver-1.0.0.tgz", + "integrity": "sha512-J92IFbskyo7OYB3Dt4aTdyhag1GlInrfbPCmMteb7aBK7PwlnGz1HI0+oyNN97j7pV9DqUAVoVgkNRMrfY47mQ==", + "dev": true, + "engines": { + "node": ">=18.0.0" + } }, "node_modules/safe-buffer": { "version": "5.1.2", @@ -7826,12 +7864,12 @@ } }, "node_modules/socks-proxy-agent": { - "version": "8.0.4", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.4.tgz", - "integrity": "sha512-GNAq/eg8Udq2x0eNiFkr9gRg5bA7PXEWagQdeRX4cPSG+X/8V38v637gim9bjFptMk1QWsCTr0ttrJEiXbNnRw==", + "version": "8.0.5", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.5.tgz", + "integrity": "sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==", "dev": true, "dependencies": { - "agent-base": "^7.1.1", + "agent-base": "^7.1.2", "debug": "^4.3.4", "socks": "^2.8.3" }, @@ -7859,9 +7897,9 @@ } }, "node_modules/spacetrim": { - "version": "0.11.39", - "resolved": "https://registry.npmjs.org/spacetrim/-/spacetrim-0.11.39.tgz", - "integrity": "sha512-S/baW29azJ7py5ausQRE2S6uEDQnlxgMHOEEq4V770ooBDD1/9kZnxRcco/tjZYuDuqYXblCk/r3N13ZmvHZ2g==", + "version": "0.11.59", + "resolved": "https://registry.npmjs.org/spacetrim/-/spacetrim-0.11.59.tgz", + "integrity": "sha512-lLYsktklSRKprreOm7NXReW8YiX2VBjbgmXYEziOoGf/qsJqAEACaDvoTtUOycwjpaSh+bT8eu0KrJn7UNxiCg==", "dev": true, "funding": [ { @@ -7971,9 +8009,9 @@ "dev": true }, "node_modules/streamx": { - "version": "2.20.1", - "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.20.1.tgz", - "integrity": "sha512-uTa0mU6WUC65iUvzKH4X9hEdvSW7rbPxPtwfWiLMSj3qTdQbAiUboZTxauKfpFuGIGa1C2BYijZ7wgdUXICJhA==", + "version": "2.21.1", + "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.21.1.tgz", + "integrity": "sha512-PhP9wUnFLa+91CPy3N6tiQsK+gnYyUNuk15S3YG/zjYE7RuPeCjJngqnzpC31ow0lzBHQ+QGO4cNJnd0djYUsw==", "dev": true, "dependencies": { "fast-fifo": "^1.3.2", @@ -8478,9 +8516,9 @@ } }, "node_modules/undici": { - "version": "6.19.8", - "resolved": "https://registry.npmjs.org/undici/-/undici-6.19.8.tgz", - "integrity": "sha512-U8uCCl2x9TK3WANvmBavymRzxbfFYG+tAu+fgx3zxQy3qdagQqBLwJVrdyO1TBfUXvfKveMKJZhpvUYoOjM+4g==", + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-6.21.0.tgz", + "integrity": "sha512-BUgJXc752Kou3oOIuU1i+yZZypyZRqNPW0vqoMPl8VaoalSfeR0D8/t4iAS3yirs79SSMTxTag+ZC86uswv+Cw==", "dev": true, "engines": { "node": ">=18.17" @@ -8535,9 +8573,9 @@ "dev": true }, "node_modules/userhome": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/userhome/-/userhome-1.0.0.tgz", - "integrity": "sha512-ayFKY3H+Pwfy4W98yPdtH1VqH4psDeyW8lYYFzfecR9d6hqLpqhecktvYR3SEEXt7vG0S1JEpciI3g94pMErig==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/userhome/-/userhome-1.0.1.tgz", + "integrity": "sha512-5cnLm4gseXjAclKowC4IjByaGsjtAoV6PrOQOljplNB54ReUYJP8HdAFq2muHinSDAh09PPX/uXDPfdxRHvuSA==", "dev": true, "engines": { "node": ">= 0.8.0" @@ -8758,19 +8796,20 @@ } }, "node_modules/webdriver": { - "version": "9.0.8", - "resolved": "https://registry.npmjs.org/webdriver/-/webdriver-9.0.8.tgz", - "integrity": "sha512-UnV0ANriSTUgypGk0pz8lApeQuHt+72WEDQG5hFwkkSvggtKLyWdT7+PQkNoXvDajTmiLIqUOq8XPI/Pm71rtw==", + "version": "9.4.2", + "resolved": "https://registry.npmjs.org/webdriver/-/webdriver-9.4.2.tgz", + "integrity": "sha512-1H3DY42kaGYF05sSozwtBpEYxJsnWga2QqYQAPwQmNonqJznGWkl5tlNEuqvI+T7pHTiLbOHlldgdMV5woSrqA==", "dev": true, "dependencies": { "@types/node": "^20.1.0", "@types/ws": "^8.5.3", - "@wdio/config": "9.0.8", - "@wdio/logger": "9.0.8", - "@wdio/protocols": "9.0.8", - "@wdio/types": "9.0.8", - "@wdio/utils": "9.0.8", + "@wdio/config": "9.4.2", + "@wdio/logger": "9.1.3", + "@wdio/protocols": "9.2.2", + "@wdio/types": "9.4.2", + "@wdio/utils": "9.4.2", "deepmerge-ts": "^7.0.3", + "undici": "^6.20.1", "ws": "^8.8.0" }, "engines": { @@ -8778,26 +8817,26 @@ } }, "node_modules/webdriverio": { - "version": "9.0.9", - "resolved": "https://registry.npmjs.org/webdriverio/-/webdriverio-9.0.9.tgz", - "integrity": "sha512-IwvKzhcJ9NjOL55xwj27uTTKkfxsg77dmAfqoKFSP5dQ70JzU+NgxiALEjjWQDybtt1yGIkHk7wjjxjboMU1uw==", + "version": "9.4.2", + "resolved": "https://registry.npmjs.org/webdriverio/-/webdriverio-9.4.2.tgz", + "integrity": "sha512-e6Gu5pFWQEtJuz3tT0NV3FRhC4/yZuWA8/Q7u1GGC+kaKxZOEuXxNMyrhfSstugGvQ92jnbWP/g2lBwhrZIl2A==", "dev": true, "dependencies": { "@types/node": "^20.11.30", "@types/sinonjs__fake-timers": "^8.1.5", - "@wdio/config": "9.0.8", - "@wdio/logger": "9.0.8", - "@wdio/protocols": "9.0.8", + "@wdio/config": "9.4.2", + "@wdio/logger": "9.1.3", + "@wdio/protocols": "9.2.2", "@wdio/repl": "9.0.8", - "@wdio/types": "9.0.8", - "@wdio/utils": "9.0.8", + "@wdio/types": "9.4.2", + "@wdio/utils": "9.4.2", "archiver": "^7.0.1", "aria-query": "^5.3.0", "cheerio": "^1.0.0-rc.12", "css-shorthand-properties": "^1.1.1", "css-value": "^0.0.1", "grapheme-splitter": "^1.0.4", - "htmlfy": "^0.2.1", + "htmlfy": "^0.3.0", "import-meta-resolve": "^4.0.0", "is-plain-obj": "^4.1.0", "jszip": "^3.10.1", @@ -8809,7 +8848,7 @@ "rgb2hex": "0.2.5", "serialize-error": "^11.0.3", "urlpattern-polyfill": "^10.0.0", - "webdriver": "9.0.8" + "webdriver": "9.4.2" }, "engines": { "node": ">=18.20.0" diff --git a/package.json b/package.json index afa6e7d90..332338eac 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "blockly", - "version": "11.1.1", + "version": "11.2.1", "description": "Blockly is a library for building visual programming editors.", "keywords": [ "blockly" diff --git a/scripts/gulpfiles/package_tasks.js b/scripts/gulpfiles/package_tasks.js index 48dfd5b84..89264a0e3 100644 --- a/scripts/gulpfiles/package_tasks.js +++ b/scripts/gulpfiles/package_tasks.js @@ -159,7 +159,7 @@ module.exports = require('./${bundle}'); * This task copies all the media/* files into the release directory. */ function packageMedia() { - return gulp.src('media/*') + return gulp.src('media/*', {encoding: false}) .pipe(gulp.dest(`${RELEASE_DIR}/media`)); }; diff --git a/tests/browser/test/basic_playground_test.mjs b/tests/browser/test/basic_playground_test.mjs index 55ff58e4b..c0a1f8930 100644 --- a/tests/browser/test/basic_playground_test.mjs +++ b/tests/browser/test/basic_playground_test.mjs @@ -137,7 +137,7 @@ suite('Disabling', function () { 110, ); await connect(this.browser, child, 'OUTPUT', parent, 'IF0'); - + await this.browser.pause(PAUSE_TIME); await contextMenuSelect(this.browser, parent, 'Disable Block'); chai.assert.isTrue(await getIsDisabled(this.browser, child.id)); diff --git a/tests/browser/test/delete_blocks_test.mjs b/tests/browser/test/delete_blocks_test.mjs index 27e17054d..a5df88705 100644 --- a/tests/browser/test/delete_blocks_test.mjs +++ b/tests/browser/test/delete_blocks_test.mjs @@ -123,10 +123,14 @@ suite('Delete blocks', function (done) { ) .waitForExist({timeout: 2000, reverse: true}); - // Load the start blocks - await this.browser.execute((blocks) => { - Blockly.serialization.workspaces.load(blocks, Blockly.getMainWorkspace()); - }, startBlocks); + // Load the start blocks. This hangs indefinitely if `startBlocks` is + // passed without being stringified. + this.browser.execute((blocks) => { + Blockly.serialization.workspaces.load( + JSON.parse(blocks), + Blockly.getMainWorkspace(), + ); + }, JSON.stringify(startBlocks)); // Wait for there to be a block on the main workspace before continuing (await getBlockElementById(this.browser, firstBlockId)).waitForExist({ timeout: 2000, diff --git a/tests/browser/test/procedure_test.mjs b/tests/browser/test/procedure_test.mjs index 34368c732..c01eb4956 100644 --- a/tests/browser/test/procedure_test.mjs +++ b/tests/browser/test/procedure_test.mjs @@ -26,6 +26,9 @@ suite('Testing Connecting Blocks', function (done) { // Setup Selenium for all of the tests suiteSetup(async function () { this.browser = await testSetup(testFileLocations.CODE_DEMO); + // Prevent WebDriver from suppressing alerts + // https://github.com/webdriverio/webdriverio/issues/13610#issuecomment-2357768103 + this.browser.on('dialog', (dialog) => {}); }); test('Testing Procedure', async function () { diff --git a/tests/browser/test/test_setup.mjs b/tests/browser/test/test_setup.mjs index 523a5d851..9b48a3638 100644 --- a/tests/browser/test/test_setup.mjs +++ b/tests/browser/test/test_setup.mjs @@ -38,6 +38,7 @@ export async function driverSetup() { const options = { capabilities: { 'browserName': 'chrome', + 'unhandledPromptBehavior': 'ignore', 'goog:chromeOptions': { args: ['--allow-file-access-from-files'], }, @@ -254,9 +255,9 @@ export async function getCategory(browser, categoryName) { export async function getNthBlockOfCategory(browser, categoryName, n) { const category = await getCategory(browser, categoryName); await category.click(); - const block = await browser.$( - `.blocklyFlyout .blocklyBlockCanvas > g:nth-child(${3 + n * 2})`, - ); + const block = ( + await browser.$$(`.blocklyFlyout .blocklyBlockCanvas > .blocklyDraggable`) + )[n]; return block; } diff --git a/tests/browser/test/workspace_comment_test.mjs b/tests/browser/test/workspace_comment_test.mjs index 5719948d0..516523276 100644 --- a/tests/browser/test/workspace_comment_test.mjs +++ b/tests/browser/test/workspace_comment_test.mjs @@ -5,7 +5,6 @@ */ import * as chai from 'chai'; -import * as sinon from 'sinon'; import {testFileLocations, testSetup} from './test_setup.mjs'; suite('Workspace comments', function () { @@ -20,8 +19,6 @@ suite('Workspace comments', function () { }); teardown(async function () { - sinon.restore(); - await this.browser.execute(() => { Blockly.getMainWorkspace().clear(); }); diff --git a/tests/generators/index.html b/tests/generators/index.html index 9ec1db773..8ca5cb90e 100644 --- a/tests/generators/index.html +++ b/tests/generators/index.html @@ -38,7 +38,7 @@ function start() { * If some tests are failing, load test suites individually to continue * debugging. */ -function loadSelected() { +async function loadSelected() { var output = document.getElementById('importExport'); output.style.background = 'gray'; @@ -53,9 +53,12 @@ function loadSelected() { if (boxList[i].checked) { var testUrl = boxList[i].value; if (testUrl) { - var xmlText = fetchFile(testUrl); + var xmlText = await fetchFile(testUrl); if (xmlText !== null) { fromXml(testUrl, xmlText, /* opt_append */ true); + // Clean up the workspace to normalize the position of blocks and + // thus the order of functions in the generated code. + Blockly.getMainWorkspace().cleanUp(); } } } @@ -67,23 +70,24 @@ function loadSelected() { /** * Ask the user for a file name, then load that file's contents. */ -function loadOther() { +async function loadOther() { var url = window.prompt('Enter URL of test file.'); if (!url) { return; } - var xmlText = fetchFile(url); + var xmlText = await fetchFile(url); if (xmlText !== null) { fromXml(url, xmlText); } } -function fetchFile(xmlUrl) { +async function fetchFile(xmlUrl) { try { - var xmlHttp = new XMLHttpRequest(); - xmlHttp.open('GET', xmlUrl, false); - xmlHttp.setRequestHeader('Content-Type', 'text/xml'); - xmlHttp.send(''); + const response = await fetch(xmlUrl); + if (!response.ok) { + throw new Error(`Got a 404 when loading ${xmlUrl}`); + } + return response.text(); } catch (e) { // Attempt to diagnose the problem. var msg = 'Error: Unable to load XML data.\n'; @@ -95,7 +99,6 @@ function fetchFile(xmlUrl) { alert(msg + '\n' + e); return null; } - return xmlHttp.responseText; } /** @@ -188,7 +191,7 @@ function toDart() { function changeIndex() { var oneBasedIndex = document.getElementById('indexing').checked; demoWorkspace.options.oneBasedIndex = oneBasedIndex; - demoWorkspace.getToolbox().flyout_.workspace_.options.oneBasedIndex = oneBasedIndex; + demoWorkspace.getToolbox().getFlyout().getWorkspace().options.oneBasedIndex = oneBasedIndex; } diff --git a/tests/generators/webdriver.js b/tests/generators/webdriver.js index 4f86edb1b..004b5c878 100644 --- a/tests/generators/webdriver.js +++ b/tests/generators/webdriver.js @@ -78,7 +78,7 @@ async function runGeneratorsInBrowser(outputDir) { await browser.execute(function() { checkAll(); - loadSelected(); + return loadSelected(); }); await runLangGeneratorInBrowser(browser, prefix + '.js', diff --git a/tests/mocha/blocks/lists_test.js b/tests/mocha/blocks/lists_test.js index 0c7a92bf6..490109d22 100644 --- a/tests/mocha/blocks/lists_test.js +++ b/tests/mocha/blocks/lists_test.js @@ -181,16 +181,58 @@ suite('Lists', function () { * Test cases for serialization tests. * @type {Array} */ - const testCases = makeTestCasesForBlockNotNeedingExtraState_( + const testCases = [ { - 'type': 'lists_split', - 'id': '1', - 'fields': { - 'MODE': 'SPLIT', + title: 'JSON for splitting', + json: { + type: 'lists_split', + id: '1', + extraState: {mode: 'SPLIT'}, + fields: {MODE: 'SPLIT'}, + inputs: { + DELIM: { + shadow: { + type: 'text', + id: '2', + fields: { + TEXT: ',', + }, + }, + }, + }, + }, + assertBlockStructure: (block) => { + assert.equal(block.type, 'lists_split'); + assert.deepEqual(block.outputConnection.getCheck(), ['Array']); + assert.isTrue(block.getField('MODE').getValue() === 'SPLIT'); }, }, - '', - ); + { + title: 'JSON for joining', + json: { + type: 'lists_split', + id: '1', + extraState: {mode: 'JOIN'}, + fields: {MODE: 'JOIN'}, + inputs: { + DELIM: { + shadow: { + type: 'text', + id: '2', + fields: { + TEXT: ',', + }, + }, + }, + }, + }, + assertBlockStructure: (block) => { + assert.equal(block.type, 'lists_split'); + assert.deepEqual(block.outputConnection.getCheck(), ['String']); + assert.isTrue(block.getField('MODE').getValue() === 'JOIN'); + }, + }, + ]; runSerializationTestSuite(testCases); }); }); diff --git a/tests/mocha/clipboard_test.js b/tests/mocha/clipboard_test.js index 652698421..0f2d06770 100644 --- a/tests/mocha/clipboard_test.js +++ b/tests/mocha/clipboard_test.js @@ -61,6 +61,30 @@ suite('Clipboard', function () { ); }); + test('copied from a mutator pastes them into the mutator', async function () { + const block = Blockly.serialization.blocks.append( + { + 'type': 'controls_if', + 'id': 'blockId', + 'extraState': { + 'elseIfCount': 1, + }, + }, + this.workspace, + ); + const mutatorIcon = block.getIcon(Blockly.icons.IconType.MUTATOR); + await mutatorIcon.setBubbleVisible(true); + const mutatorWorkspace = mutatorIcon.getWorkspace(); + const elseIf = mutatorWorkspace.getBlocksByType('controls_if_elseif')[0]; + assert.notEqual(elseIf, undefined); + assert.lengthOf(mutatorWorkspace.getAllBlocks(), 2); + assert.lengthOf(this.workspace.getAllBlocks(), 1); + const data = elseIf.toCopyData(); + Blockly.clipboard.paste(data, mutatorWorkspace); + assert.lengthOf(mutatorWorkspace.getAllBlocks(), 3); + assert.lengthOf(this.workspace.getAllBlocks(), 1); + }); + suite('pasted blocks are placed in unambiguous locations', function () { test('pasted blocks are bumped to not overlap', function () { const block = Blockly.serialization.blocks.append(