diff --git a/.github/workflows/appengine_deploy.yml b/.github/workflows/appengine_deploy.yml index 938a16fc714..1dd6d2ffa92 100644 --- a/.github/workflows/appengine_deploy.yml +++ b/.github/workflows/appengine_deploy.yml @@ -42,7 +42,7 @@ jobs: path: _deploy/ - name: Deploy to App Engine - uses: google-github-actions/deploy-appengine@v2.1.4 + uses: google-github-actions/deploy-appengine@v2.1.5 # For parameters see: # https://github.com/google-github-actions/deploy-appengine#inputs with: diff --git a/.github/workflows/assign_reviewers.yml b/.github/workflows/assign_reviewers.yml index 33bd9e778a9..924bf5423a2 100644 --- a/.github/workflows/assign_reviewers.yml +++ b/.github/workflows/assign_reviewers.yml @@ -15,6 +15,9 @@ on: jobs: requested-reviewer: runs-on: ubuntu-latest + permissions: + contents: read + issues: write steps: - name: Assign requested reviewer uses: actions/github-script@v7 diff --git a/.github/workflows/conventional-label.yml b/.github/workflows/conventional-label.yml index 64289d98723..57eaaa6980c 100644 --- a/.github/workflows/conventional-label.yml +++ b/.github/workflows/conventional-label.yml @@ -7,6 +7,9 @@ name: conventional-release-labels jobs: label: runs-on: ubuntu-latest + permissions: + contents: read + pull-requests: write steps: - uses: bcoe/conventional-release-labels@v1 with: diff --git a/blocks/lists.ts b/blocks/lists.ts index 6754b6847db..864803b937c 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_animations.ts b/core/block_animations.ts index f3fc3d454f0..2dbf90777ac 100644 --- a/core/block_animations.ts +++ b/core/block_animations.ts @@ -176,7 +176,7 @@ export function disconnectUiEffect(block: BlockSvg) { } // Start the animation. wobblingBlock = block; - disconnectUiStep(block, magnitude, new Date()); + disconnectUiStep(block, magnitude, new Date(), 0); } /** @@ -184,22 +184,30 @@ export function disconnectUiEffect(block: BlockSvg) { * * @param block Block to animate. * @param magnitude Maximum degrees skew (reversed for RTL). - * @param start Date of animation's start. + * @param start Date of animation's start for deciding when to stop. + * @param step Which step of the animation we're on. */ -function disconnectUiStep(block: BlockSvg, magnitude: number, start: Date) { +function disconnectUiStep( + block: BlockSvg, + magnitude: number, + start: Date, + step: number, +) { const DURATION = 200; // Milliseconds. - const WIGGLES = 3; // Half oscillations. - - const ms = new Date().getTime() - start.getTime(); - const percent = ms / DURATION; + const WIGGLES = [0.66, 1, 0.66, 0, -0.66, -1, -0.66, 0]; // Single cycle let skew = ''; - if (percent <= 1) { - const val = Math.round( - Math.sin(percent * Math.PI * WIGGLES) * (1 - percent) * magnitude, - ); + if (start.getTime() + DURATION > new Date().getTime()) { + const val = Math.round(WIGGLES[step % WIGGLES.length] * magnitude); skew = `skewX(${val})`; - disconnectPid = setTimeout(disconnectUiStep, 10, block, magnitude, start); + disconnectPid = setTimeout( + disconnectUiStep, + 15, + block, + magnitude, + start, + step + 1, + ); } block diff --git a/core/block_svg.ts b/core/block_svg.ts index 1c1de49ec2b..10fa995ffda 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 7ac5fa02965..6db81cd99bc 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 62e23fd24a3..ba6f44e6f4c 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/comments/rendered_workspace_comment.ts b/core/comments/rendered_workspace_comment.ts index ff21335741b..f4885df46f7 100644 --- a/core/comments/rendered_workspace_comment.ts +++ b/core/comments/rendered_workspace_comment.ts @@ -208,8 +208,14 @@ export class RenderedWorkspaceComment private startGesture(e: PointerEvent) { const gesture = this.workspace.getGesture(e); if (gesture) { - gesture.handleCommentStart(e, this); - this.workspace.getLayerManager()?.append(this, layers.BLOCK); + if (browserEvents.isTargetInput(e)) { + // If the text area was the focus, don't allow this event to bubble up + // and steal focus away from the editor/comment. + e.stopPropagation(); + } else { + gesture.handleCommentStart(e, this); + this.workspace.getLayerManager()?.append(this, layers.BLOCK); + } common.setSelected(this); } } diff --git a/core/contextmenu_items.ts b/core/contextmenu_items.ts index 25ffab59b8b..58429fb1381 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/css.ts b/core/css.ts index c7443e5f06d..d0e06704162 100644 --- a/core/css.ts +++ b/core/css.ts @@ -353,6 +353,7 @@ input[type=number] { .blocklyScrollbarBackground { opacity: 0; + pointer-events: none; } .blocklyScrollbarHandle { diff --git a/core/field_dropdown.ts b/core/field_dropdown.ts index a79deaee5aa..bc2d2856f7d 100644 --- a/core/field_dropdown.ts +++ b/core/field_dropdown.ts @@ -29,6 +29,7 @@ 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'; /** @@ -290,7 +291,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); } @@ -303,6 +304,11 @@ export class FieldDropdown extends Field { if (this.selectedMenuItem) { this.menu_!.setHighlighted(this.selectedMenuItem); + style.scrollIntoContainerView( + this.selectedMenuItem.getElement()!, + dropDownDiv.getContentDiv(), + true, + ); } this.applyColour(); @@ -461,21 +467,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 eecb4ec94e8..2c8a48e6760 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 ea120ca1728..24a276d877f 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 d02c7e1871b..eea533eab4a 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 2744195f98d..b82ad10971d 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/menu.ts b/core/menu.ts index d1c86a8020e..ee54c8cf2c3 100644 --- a/core/menu.ts +++ b/core/menu.ts @@ -31,8 +31,8 @@ export class Menu { private readonly menuItems: MenuItem[] = []; /** - * Coordinates of the mousedown event that caused this menu to open. Used to - * prevent the consequent mouseup event due to a simple click from + * Coordinates of the pointerdown event that caused this menu to open. Used to + * prevent the consequent pointerup event due to a simple click from * activating a menu item immediately. */ openingCoords: Coordinate | null = null; @@ -43,17 +43,17 @@ export class Menu { */ private highlightedItem: MenuItem | null = null; - /** Mouse over event data. */ - private mouseOverHandler: browserEvents.Data | null = null; + /** Pointer over event data. */ + private pointerMoveHandler: browserEvents.Data | null = null; /** Click event data. */ private clickHandler: browserEvents.Data | null = null; - /** Mouse enter event data. */ - private mouseEnterHandler: browserEvents.Data | null = null; + /** Pointer enter event data. */ + private pointerEnterHandler: browserEvents.Data | null = null; - /** Mouse leave event data. */ - private mouseLeaveHandler: browserEvents.Data | null = null; + /** Pointer leave event data. */ + private pointerLeaveHandler: browserEvents.Data | null = null; /** Key down event data. */ private onKeyDownHandler: browserEvents.Data | null = null; @@ -99,11 +99,11 @@ export class Menu { } // Add event handlers. - this.mouseOverHandler = browserEvents.conditionalBind( + this.pointerMoveHandler = browserEvents.conditionalBind( element, - 'pointerover', + 'pointermove', this, - this.handleMouseOver, + this.handlePointerMove, true, ); this.clickHandler = browserEvents.conditionalBind( @@ -113,18 +113,18 @@ export class Menu { this.handleClick, true, ); - this.mouseEnterHandler = browserEvents.conditionalBind( + this.pointerEnterHandler = browserEvents.conditionalBind( element, 'pointerenter', this, - this.handleMouseEnter, + this.handlePointerEnter, true, ); - this.mouseLeaveHandler = browserEvents.conditionalBind( + this.pointerLeaveHandler = browserEvents.conditionalBind( element, 'pointerleave', this, - this.handleMouseLeave, + this.handlePointerLeave, true, ); this.onKeyDownHandler = browserEvents.conditionalBind( @@ -183,21 +183,21 @@ export class Menu { /** Dispose of this menu. */ dispose() { // Remove event handlers. - if (this.mouseOverHandler) { - browserEvents.unbind(this.mouseOverHandler); - this.mouseOverHandler = null; + if (this.pointerMoveHandler) { + browserEvents.unbind(this.pointerMoveHandler); + this.pointerMoveHandler = null; } if (this.clickHandler) { browserEvents.unbind(this.clickHandler); this.clickHandler = null; } - if (this.mouseEnterHandler) { - browserEvents.unbind(this.mouseEnterHandler); - this.mouseEnterHandler = null; + if (this.pointerEnterHandler) { + browserEvents.unbind(this.pointerEnterHandler); + this.pointerEnterHandler = null; } - if (this.mouseLeaveHandler) { - browserEvents.unbind(this.mouseLeaveHandler); - this.mouseLeaveHandler = null; + if (this.pointerLeaveHandler) { + browserEvents.unbind(this.pointerLeaveHandler); + this.pointerLeaveHandler = null; } if (this.onKeyDownHandler) { browserEvents.unbind(this.onKeyDownHandler); @@ -260,14 +260,13 @@ 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(); - if (el) { - aria.setState(el, aria.State.ACTIVEDESCENDANT, item.getId()); - } - item.getElement()?.scrollIntoView({ - block: 'nearest', - inline: 'start', - }); + const menuElement = this.getElement(); + const scrollingParent = menuElement?.parentElement; + const menuItemElement = item.getElement(); + if (!scrollingParent || !menuItemElement) return; + + style.scrollIntoContainerView(menuItemElement, scrollingParent); + aria.setState(menuElement, aria.State.ACTIVEDESCENDANT, item.getId()); } } @@ -326,14 +325,26 @@ export class Menu { } } - // Mouse events. + // Pointer events. /** - * Handles mouseover events. Highlight menuitems as the user hovers over them. + * Handles pointermove events. Highlight menu items as the user hovers over + * them. * - * @param e Mouse event to handle. + * @param e Pointer event to handle. */ - private handleMouseOver(e: PointerEvent) { + private handlePointerMove(e: PointerEvent) { + // Check whether the pointer actually did move. Move events are triggered if + // the element underneath the pointer moves, even if the pointer itself has + // remained stationary. In the case where the pointer is hovering over + // the menu but the user is navigating through the list of items via the + // keyboard and causing items off the end of the menu to scroll into view, + // a pointermove event would be triggered due to the pointer now being over + // a new child, but we don't want to highlight the item that's now under the + // pointer. + const delta = Math.max(Math.abs(e.movementX), Math.abs(e.movementY)); + if (delta === 0) return; + const menuItem = this.getMenuItem(e.target as Element); if (menuItem) { @@ -359,11 +370,11 @@ export class Menu { if (oldCoords && typeof e.clientX === 'number') { const newCoords = new Coordinate(e.clientX, e.clientY); if (Coordinate.distance(oldCoords, newCoords) < 1) { - // This menu was opened by a mousedown and we're handling the consequent - // click event. The coords haven't changed, meaning this was the same - // opening event. Don't do the usual behavior because the menu just - // popped up under the mouse and the user didn't mean to activate this - // item. + // This menu was opened by a pointerdown and we're handling the + // consequent click event. The coords haven't changed, meaning this was + // the same opening event. Don't do the usual behavior because the menu + // just popped up under the pointer and the user didn't mean to activate + // this item. return; } } @@ -375,22 +386,21 @@ export class Menu { } /** - * Handles mouse enter events. Focus the element. + * Handles pointer enter events. Focus the element. * - * @param _e Mouse event to handle. + * @param _e Pointer event to handle. */ - private handleMouseEnter(_e: PointerEvent) { + private handlePointerEnter(_e: PointerEvent) { this.focus(); } /** - * Handles mouse leave events. Blur and clear highlight. + * Handles pointer leave events by clearing the active highlight. * - * @param _e Mouse event to handle. + * @param _e Pointer event to handle. */ - private handleMouseLeave(_e: PointerEvent) { + private handlePointerLeave(_e: PointerEvent) { if (this.getElement()) { - this.blur(); this.setHighlighted(null); } } diff --git a/core/rendered_connection.ts b/core/rendered_connection.ts index f73dc0628cc..c1d97dcddee 100644 --- a/core/rendered_connection.ts +++ b/core/rendered_connection.ts @@ -533,6 +533,21 @@ export class RenderedConnection extends Connection { childBlock.updateDisabled(); childBlock.queueRender(); + // If either block being connected was selected, visually un- and reselect + // it. This has the effect of moving the selection path to the end of the + // list of child nodes in the DOM. Since SVG z-order is determined by node + // order in the DOM, this works around an issue where the selection outline + // path could be partially obscured by a new block inserted after it in the + // DOM. + const selection = common.getSelected(); + const selectedBlock = + (selection === parentBlock && parentBlock) || + (selection === childBlock && childBlock); + if (selectedBlock) { + selectedBlock.removeSelect(); + selectedBlock.addSelect(); + } + // The input the child block is connected to (if any). const parentInput = parentBlock.getInputWithBlock(childBlock); if (parentInput) { diff --git a/core/renderers/zelos/constants.ts b/core/renderers/zelos/constants.ts index 74df72aeb91..afef605ebb3 100644 --- a/core/renderers/zelos/constants.ts +++ b/core/renderers/zelos/constants.ts @@ -844,11 +844,11 @@ export class ConstantProvider extends BaseConstantProvider { `}`, // Widget and Dropdown Div - `${selector}.blocklyWidgetDiv .goog-menuitem,`, - `${selector}.blocklyDropDownDiv .goog-menuitem {`, + `${selector}.blocklyWidgetDiv .blocklyMenuItem,`, + `${selector}.blocklyDropDownDiv .blocklyMenuItem {`, `font-family: ${this.FIELD_TEXT_FONTFAMILY};`, `}`, - `${selector}.blocklyDropDownDiv .goog-menuitem-content {`, + `${selector}.blocklyDropDownDiv .blocklyMenuItemContent {`, `color: #fff;`, `}`, diff --git a/core/renderers/zelos/path_object.ts b/core/renderers/zelos/path_object.ts index 060190ee1b0..a46d355b674 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 3a32b687fe8..0db28a51a4b 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 d30c4a4e22b..05ae9fbf270 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 5de69001fb7..4f8324be5c0 100644 --- a/core/utils/style.ts +++ b/core/utils/style.ts @@ -7,7 +7,6 @@ // 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'; @@ -59,7 +58,6 @@ 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); @@ -132,7 +130,6 @@ 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')); @@ -159,12 +156,6 @@ 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; @@ -189,11 +180,6 @@ 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/generators/dart/logic.ts b/generators/dart/logic.ts index 45c385b863a..7e8a4709b3f 100644 --- a/generators/dart/logic.ts +++ b/generators/dart/logic.ts @@ -46,7 +46,9 @@ export function controls_if(block: Block, generator: DartGenerator) { } while (block.getInput('IF' + n)); if (block.getInput('ELSE') || generator.STATEMENT_SUFFIX) { - branchCode = generator.statementToCode(block, 'ELSE'); + branchCode = block.getInput('ELSE') + ? generator.statementToCode(block, 'ELSE') + : ''; if (generator.STATEMENT_SUFFIX) { branchCode = generator.prefixLines( diff --git a/generators/javascript/logic.ts b/generators/javascript/logic.ts index 60174c85a4a..1e26f86e7dd 100644 --- a/generators/javascript/logic.ts +++ b/generators/javascript/logic.ts @@ -44,7 +44,9 @@ export function controls_if(block: Block, generator: JavascriptGenerator) { } while (block.getInput('IF' + n)); if (block.getInput('ELSE') || generator.STATEMENT_SUFFIX) { - let branchCode = generator.statementToCode(block, 'ELSE'); + let branchCode = block.getInput('ELSE') + ? generator.statementToCode(block, 'ELSE') + : ''; if (generator.STATEMENT_SUFFIX) { branchCode = generator.prefixLines( diff --git a/generators/lua/logic.ts b/generators/lua/logic.ts index b6448445c6a..8e48c741a47 100644 --- a/generators/lua/logic.ts +++ b/generators/lua/logic.ts @@ -39,7 +39,9 @@ export function controls_if(block: Block, generator: LuaGenerator): string { } while (block.getInput('IF' + n)); if (block.getInput('ELSE') || generator.STATEMENT_SUFFIX) { - let branchCode = generator.statementToCode(block, 'ELSE'); + let branchCode = block.getInput('ELSE') + ? generator.statementToCode(block, 'ELSE') + : ''; if (generator.STATEMENT_SUFFIX) { branchCode = generator.prefixLines( diff --git a/generators/php/logic.ts b/generators/php/logic.ts index 731fe570867..80d4e331dd0 100644 --- a/generators/php/logic.ts +++ b/generators/php/logic.ts @@ -46,7 +46,9 @@ export function controls_if(block: Block, generator: PhpGenerator) { } while (block.getInput('IF' + n)); if (block.getInput('ELSE') || generator.STATEMENT_SUFFIX) { - branchCode = generator.statementToCode(block, 'ELSE'); + branchCode = block.getInput('ELSE') + ? generator.statementToCode(block, 'ELSE') + : ''; if (generator.STATEMENT_SUFFIX) { branchCode = generator.prefixLines( diff --git a/generators/python/logic.ts b/generators/python/logic.ts index 40133600d74..db1f60e2a5c 100644 --- a/generators/python/logic.ts +++ b/generators/python/logic.ts @@ -40,7 +40,11 @@ export function controls_if(block: Block, generator: PythonGenerator) { } while (block.getInput('IF' + n)); if (block.getInput('ELSE') || generator.STATEMENT_SUFFIX) { - branchCode = generator.statementToCode(block, 'ELSE') || generator.PASS; + if (block.getInput('ELSE')) { + branchCode = generator.statementToCode(block, 'ELSE') || generator.PASS; + } else { + branchCode = generator.PASS; + } if (generator.STATEMENT_SUFFIX) { branchCode = generator.prefixLines( diff --git a/package-lock.json b/package-lock.json index c44ddbfef9a..ae683ebfc6d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "blockly", - "version": "11.2.1", + "version": "11.2.2", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "blockly", - "version": "11.2.1", + "version": "11.2.2", "hasInstallScript": true, "license": "Apache-2.0", "dependencies": { @@ -28,7 +28,7 @@ "eslint-config-prettier": "^9.1.0", "eslint-plugin-jsdoc": "^50.5.0", "eslint-plugin-prettier": "^5.2.1", - "glob": "^10.3.4", + "glob": "^11.0.1", "globals": "^15.12.0", "google-closure-compiler": "^20240317.0.0", "gulp": "^5.0.0", @@ -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" @@ -570,10 +570,11 @@ } }, "node_modules/@hyperjump/json-schema": { - "version": "1.9.8", - "resolved": "https://registry.npmjs.org/@hyperjump/json-schema/-/json-schema-1.9.8.tgz", - "integrity": "sha512-qmdMpYn8CpYR7z3fxkL6fgkDvMaAEFKtmYu3XDi6hWW2BT+rLl7T4Y4QpafEIR4wkcmCxcJf9me9FmxKpv3i9g==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@hyperjump/json-schema/-/json-schema-1.11.0.tgz", + "integrity": "sha512-gX1YNObOybUW6tgJjvb1lomNbI/VnY+EBPokmEGy9Lk8cgi+gE0vXhX1XDgIpUUA4UXfgHEn5I1mga5vHgOttg==", "dev": true, + "license": "MIT", "dependencies": { "@hyperjump/json-pointer": "^1.1.0", "@hyperjump/pact": "^1.2.0", @@ -619,6 +620,7 @@ "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", "dev": true, + "license": "ISC", "dependencies": { "string-width": "^5.1.2", "string-width-cjs": "npm:string-width@^4.2.0", @@ -636,6 +638,7 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -647,13 +650,15 @@ "version": "9.2.2", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@isaacs/cliui/node_modules/string-width": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", "dev": true, + "license": "MIT", "dependencies": { "eastasianwidth": "^0.2.0", "emoji-regex": "^9.2.2", @@ -671,6 +676,7 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", "dev": true, + "license": "MIT", "dependencies": { "ansi-regex": "^6.0.1" }, @@ -686,6 +692,7 @@ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^6.1.0", "string-width": "^5.0.1", @@ -699,16 +706,17 @@ } }, "node_modules/@microsoft/api-documenter": { - "version": "7.25.14", - "resolved": "https://registry.npmjs.org/@microsoft/api-documenter/-/api-documenter-7.25.14.tgz", - "integrity": "sha512-nysAB+j4l5Al3XvCdee6tw0rw4fXpnlIq9En2opcc3DgITeoehiaYYoZZqoqOQSKlSUDWF7Z55GGsvntVrcBkg==", + "version": "7.26.7", + "resolved": "https://registry.npmjs.org/@microsoft/api-documenter/-/api-documenter-7.26.7.tgz", + "integrity": "sha512-VruYlHYAhQfuBNyndvyD9GBmCRWSOZ8D9+eXicygycNPMC/SPM71WWu2OwP98CTBvq/OhG/uRvUGGdL4QvgiFQ==", "dev": true, + "license": "MIT", "dependencies": { - "@microsoft/api-extractor-model": "7.29.8", - "@microsoft/tsdoc": "~0.15.0", - "@rushstack/node-core-library": "5.9.0", - "@rushstack/terminal": "0.14.2", - "@rushstack/ts-command-line": "4.22.8", + "@microsoft/api-extractor-model": "7.30.3", + "@microsoft/tsdoc": "~0.15.1", + "@rushstack/node-core-library": "5.11.0", + "@rushstack/terminal": "0.14.6", + "@rushstack/ts-command-line": "4.23.4", "js-yaml": "~3.13.1", "resolve": "~1.22.1" }, @@ -739,18 +747,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", @@ -763,28 +771,98 @@ } }, "node_modules/@microsoft/api-extractor-model": { - "version": "7.29.8", - "resolved": "https://registry.npmjs.org/@microsoft/api-extractor-model/-/api-extractor-model-7.29.8.tgz", - "integrity": "sha512-t3Z/xcO6TRbMcnKGVMs4uMzv/gd5j0NhMiJIGjD4cJMeFJ1Hf8wnLSx37vxlRlL0GWlGJhnFgxvnaL6JlS+73g==", + "version": "7.30.3", + "resolved": "https://registry.npmjs.org/@microsoft/api-extractor-model/-/api-extractor-model-7.30.3.tgz", + "integrity": "sha512-yEAvq0F78MmStXdqz9TTT4PZ05Xu5R8nqgwI5xmUmQjWBQ9E6R2n8HB/iZMRciG4rf9iwI2mtuQwIzDXBvHn1w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@microsoft/tsdoc": "~0.15.1", + "@microsoft/tsdoc-config": "~0.17.1", + "@rushstack/node-core-library": "5.11.0" + } + }, + "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": { + "@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": { - "@microsoft/tsdoc": "~0.15.0", - "@microsoft/tsdoc-config": "~0.17.0", - "@rushstack/node-core-library": "5.9.0" + "@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.0", - "resolved": "https://registry.npmjs.org/@rushstack/ts-command-line/-/ts-command-line-4.23.0.tgz", - "integrity": "sha512-jYREBtsxduPV6ptNq8jOKp9+yx0ld1Tb/Tkdnlj8gTjazl1sF3DwX2VbluyYrNd0meWIL0bNeer7WDf5tKFjaQ==", + "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.2", + "@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 +872,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 +899,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 +928,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" @@ -873,6 +972,7 @@ "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", "dev": true, + "license": "MIT", "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" @@ -886,6 +986,7 @@ "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", "dev": true, + "license": "MIT", "engines": { "node": ">= 8" } @@ -895,6 +996,7 @@ "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", "dev": true, + "license": "MIT", "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" @@ -908,6 +1010,7 @@ "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", "dev": true, + "license": "MIT", "optional": true, "engines": { "node": ">=14" @@ -926,9 +1029,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 +1044,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", @@ -979,15 +1082,16 @@ } }, "node_modules/@rushstack/node-core-library": { - "version": "5.9.0", - "resolved": "https://registry.npmjs.org/@rushstack/node-core-library/-/node-core-library-5.9.0.tgz", - "integrity": "sha512-MMsshEWkTbXqxqFxD4gcIUWQOCeBChlGczdZbHfqmNZQFLHB3yWxDFSMHFUdu2/OB9NUk7Awn5qRL+rws4HQNg==", + "version": "5.11.0", + "resolved": "https://registry.npmjs.org/@rushstack/node-core-library/-/node-core-library-5.11.0.tgz", + "integrity": "sha512-I8+VzG9A0F3nH2rLpPd7hF8F7l5Xb7D+ldrWVZYegXM6CsKkvWc670RlgK3WX8/AseZfXA/vVrh0bpXe2Y2UDQ==", "dev": true, + "license": "MIT", "dependencies": { "ajv": "~8.13.0", "ajv-draft-04": "~1.0.0", "ajv-formats": "~3.0.1", - "fs-extra": "~7.0.1", + "fs-extra": "~11.3.0", "import-lazy": "~4.0.0", "jju": "~1.4.0", "resolve": "~1.22.1", @@ -1007,6 +1111,7 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.13.0.tgz", "integrity": "sha512-PRA911Blj99jR5RMeTunVbNXMF6Lp4vZXnk5GQjcnUWUTsrXtekg/pnmFFI2u/I36Y/2bITGS30GZCXei6uNkA==", "dev": true, + "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.3", "json-schema-traverse": "^1.0.0", @@ -1018,11 +1123,27 @@ "url": "https://github.com/sponsors/epoberezkin" } }, + "node_modules/@rushstack/node-core-library/node_modules/fs-extra": { + "version": "11.3.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.0.tgz", + "integrity": "sha512-Z4XaCL6dUDHfP/jT25jJKMmtxvuwbkrD1vNSMFlo9lNLY2c5FHYSQgHPRZUjAB26TpDEoW9HCOgplrdbaPV/ew==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, "node_modules/@rushstack/node-core-library/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 + "dev": true, + "license": "MIT" }, "node_modules/@rushstack/rig-package": { "version": "0.5.3", @@ -1035,12 +1156,13 @@ } }, "node_modules/@rushstack/terminal": { - "version": "0.14.2", - "resolved": "https://registry.npmjs.org/@rushstack/terminal/-/terminal-0.14.2.tgz", - "integrity": "sha512-2fC1wqu1VCExKC0/L+0noVcFQEXEnoBOtCIex1TOjBzEDWcw8KzJjjj7aTP6mLxepG0XIyn9OufeFb6SFsa+sg==", + "version": "0.14.6", + "resolved": "https://registry.npmjs.org/@rushstack/terminal/-/terminal-0.14.6.tgz", + "integrity": "sha512-4nMUy4h0u5PGXVG71kEA9uYI3l8GjVqewoHOFONiM6fuqS51ORdaJZ5ZXB2VZEGUyfg1TOTSy88MF2cdAy+lqA==", "dev": true, + "license": "MIT", "dependencies": { - "@rushstack/node-core-library": "5.9.0", + "@rushstack/node-core-library": "5.11.0", "supports-color": "~8.1.1" }, "peerDependencies": { @@ -1057,6 +1179,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "dev": true, + "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -1068,12 +1191,13 @@ } }, "node_modules/@rushstack/ts-command-line": { - "version": "4.22.8", - "resolved": "https://registry.npmjs.org/@rushstack/ts-command-line/-/ts-command-line-4.22.8.tgz", - "integrity": "sha512-XbFjOoV7qZHJnSuFUHv0pKaFA4ixyCuki+xMjsMfDwfvQjs5MYG0IK5COal3tRnG7KCDe2l/G+9LrzYE/RJhgg==", + "version": "4.23.4", + "resolved": "https://registry.npmjs.org/@rushstack/ts-command-line/-/ts-command-line-4.23.4.tgz", + "integrity": "sha512-pqmzDJCm0TS8VyeqnzcJ7ncwXgiLDQ6LVmXXfqv2nPL6VIz+UpyTpNVfZRJpyyJ+UDxqob1vIj2liaUfBjv8/A==", "dev": true, + "license": "MIT", "dependencies": { - "@rushstack/terminal": "0.14.2", + "@rushstack/terminal": "0.14.6", "@types/argparse": "1.0.38", "argparse": "~1.0.9", "string-argv": "~0.3.1" @@ -1084,6 +1208,7 @@ "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dev": true, + "license": "MIT", "dependencies": { "sprintf-js": "~1.0.2" } @@ -1200,9 +1325,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": "*" @@ -1219,20 +1344,21 @@ } }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.16.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.16.0.tgz", - "integrity": "sha512-5YTHKV8MYlyMI6BaEG7crQ9BhSc8RxzshOReKwZwRWN0+XvvTOm+L/UYLCYxFpfwYuAAqhxiq4yae0CMFwbL7Q==", + "version": "8.23.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.23.0.tgz", + "integrity": "sha512-vBz65tJgRrA1Q5gWlRfvoH+w943dq9K1p1yDBY2pc+a1nbBLZp7fB9+Hk8DaALUbzjqlMfgaqlVPT1REJdkt/w==", "dev": true, + "license": "MIT", "dependencies": { "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "8.16.0", - "@typescript-eslint/type-utils": "8.16.0", - "@typescript-eslint/utils": "8.16.0", - "@typescript-eslint/visitor-keys": "8.16.0", + "@typescript-eslint/scope-manager": "8.23.0", + "@typescript-eslint/type-utils": "8.23.0", + "@typescript-eslint/utils": "8.23.0", + "@typescript-eslint/visitor-keys": "8.23.0", "graphemer": "^1.4.0", "ignore": "^5.3.1", "natural-compare": "^1.4.0", - "ts-api-utils": "^1.3.0" + "ts-api-utils": "^2.0.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -1243,24 +1369,21 @@ }, "peerDependencies": { "@typescript-eslint/parser": "^8.0.0 || ^8.0.0-alpha.0", - "eslint": "^8.57.0 || ^9.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.8.0" } }, "node_modules/@typescript-eslint/parser": { - "version": "8.16.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.16.0.tgz", - "integrity": "sha512-D7DbgGFtsqIPIFMPJwCad9Gfi/hC0PWErRRHFnaCWoEDYi5tQUDiJCTmGUbBiLzjqAck4KcXt9Ayj0CNlIrF+w==", + "version": "8.23.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.23.0.tgz", + "integrity": "sha512-h2lUByouOXFAlMec2mILeELUbME5SZRN/7R9Cw2RD2lRQQY08MWMM+PmVVKKJNK1aIwqTo9t/0CvOxwPbRIE2Q==", "dev": true, + "license": "MIT", "dependencies": { - "@typescript-eslint/scope-manager": "8.16.0", - "@typescript-eslint/types": "8.16.0", - "@typescript-eslint/typescript-estree": "8.16.0", - "@typescript-eslint/visitor-keys": "8.16.0", + "@typescript-eslint/scope-manager": "8.23.0", + "@typescript-eslint/types": "8.23.0", + "@typescript-eslint/typescript-estree": "8.23.0", + "@typescript-eslint/visitor-keys": "8.23.0", "debug": "^4.3.4" }, "engines": { @@ -1271,22 +1394,19 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.8.0" } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "8.16.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.16.0.tgz", - "integrity": "sha512-mwsZWubQvBki2t5565uxF0EYvG+FwdFb8bMtDuGQLdCCnGPrDEDvm1gtfynuKlnpzeBRqdFCkMf9jg1fnAK8sg==", + "version": "8.23.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.23.0.tgz", + "integrity": "sha512-OGqo7+dXHqI7Hfm+WqkZjKjsiRtFUQHPdGMXzk5mYXhJUedO7e/Y7i8AK3MyLMgZR93TX4bIzYrfyVjLC+0VSw==", "dev": true, + "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.16.0", - "@typescript-eslint/visitor-keys": "8.16.0" + "@typescript-eslint/types": "8.23.0", + "@typescript-eslint/visitor-keys": "8.23.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -1297,15 +1417,16 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "8.16.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.16.0.tgz", - "integrity": "sha512-IqZHGG+g1XCWX9NyqnI/0CX5LL8/18awQqmkZSl2ynn8F76j579dByc0jhfVSnSnhf7zv76mKBQv9HQFKvDCgg==", + "version": "8.23.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.23.0.tgz", + "integrity": "sha512-iIuLdYpQWZKbiH+RkCGc6iu+VwscP5rCtQ1lyQ7TYuKLrcZoeJVpcLiG8DliXVkUxirW/PWlmS+d6yD51L9jvA==", "dev": true, + "license": "MIT", "dependencies": { - "@typescript-eslint/typescript-estree": "8.16.0", - "@typescript-eslint/utils": "8.16.0", + "@typescript-eslint/typescript-estree": "8.23.0", + "@typescript-eslint/utils": "8.23.0", "debug": "^4.3.4", - "ts-api-utils": "^1.3.0" + "ts-api-utils": "^2.0.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -1315,19 +1436,16 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.8.0" } }, "node_modules/@typescript-eslint/types": { - "version": "8.16.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.16.0.tgz", - "integrity": "sha512-NzrHj6thBAOSE4d9bsuRNMvk+BvaQvmY4dDglgkgGC0EW/tB3Kelnp3tAKH87GEwzoxgeQn9fNGRyFJM/xd+GQ==", + "version": "8.23.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.23.0.tgz", + "integrity": "sha512-1sK4ILJbCmZOTt9k4vkoulT6/y5CHJ1qUYxqpF1K/DBAd8+ZUL4LlSCxOssuH5m4rUaaN0uS0HlVPvd45zjduQ==", "dev": true, + "license": "MIT", "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, @@ -1337,19 +1455,20 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.16.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.16.0.tgz", - "integrity": "sha512-E2+9IzzXMc1iaBy9zmo+UYvluE3TW7bCGWSF41hVWUE01o8nzr1rvOQYSxelxr6StUvRcTMe633eY8mXASMaNw==", + "version": "8.23.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.23.0.tgz", + "integrity": "sha512-LcqzfipsB8RTvH8FX24W4UUFk1bl+0yTOf9ZA08XngFwMg4Kj8A+9hwz8Cr/ZS4KwHrmo9PJiLZkOt49vPnuvQ==", "dev": true, + "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.16.0", - "@typescript-eslint/visitor-keys": "8.16.0", + "@typescript-eslint/types": "8.23.0", + "@typescript-eslint/visitor-keys": "8.23.0", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", "minimatch": "^9.0.4", "semver": "^7.6.0", - "ts-api-utils": "^1.3.0" + "ts-api-utils": "^2.0.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -1358,10 +1477,8 @@ "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "peerDependencies": { + "typescript": ">=4.8.4 <5.8.0" } }, "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { @@ -1369,6 +1486,7 @@ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "dev": true, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0" } @@ -1378,6 +1496,7 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^2.0.1" }, @@ -1389,10 +1508,11 @@ } }, "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "version": "7.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", + "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", "dev": true, + "license": "ISC", "bin": { "semver": "bin/semver.js" }, @@ -1401,15 +1521,16 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "8.16.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.16.0.tgz", - "integrity": "sha512-C1zRy/mOL8Pj157GiX4kaw7iyRLKfJXBR3L82hk5kS/GyHcOFmy4YUq/zfZti72I9wnuQtA/+xzft4wCC8PJdA==", + "version": "8.23.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.23.0.tgz", + "integrity": "sha512-uB/+PSo6Exu02b5ZEiVtmY6RVYO7YU5xqgzTIVZwTHvvK3HsL8tZZHFaTLFtRG3CsV4A5mhOv+NZx5BlhXPyIA==", "dev": true, + "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", - "@typescript-eslint/scope-manager": "8.16.0", - "@typescript-eslint/types": "8.16.0", - "@typescript-eslint/typescript-estree": "8.16.0" + "@typescript-eslint/scope-manager": "8.23.0", + "@typescript-eslint/types": "8.23.0", + "@typescript-eslint/typescript-estree": "8.23.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -1419,21 +1540,18 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.8.0" } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.16.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.16.0.tgz", - "integrity": "sha512-pq19gbaMOmFE3CbL0ZB8J8BFCo2ckfHBfaIsaOZgBIF4EoISJIdLX5xRhd0FGB0LlHReNRuzoJoMGpTjq8F2CQ==", + "version": "8.23.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.23.0.tgz", + "integrity": "sha512-oWWhcWDLwDfu++BGTZcmXWqpwtkwb5o7fxUIGksMQQDSdPW9prsSnfIOZMlsj4vBOSrcnjIUZMiIjODgGosFhQ==", "dev": true, + "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.16.0", + "@typescript-eslint/types": "8.23.0", "eslint-visitor-keys": "^4.2.0" }, "engines": { @@ -1449,6 +1567,7 @@ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", "dev": true, + "license": "Apache-2.0", "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, @@ -1457,14 +1576,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", @@ -1474,10 +1593,97 @@ "node": ">=18.20.0" } }, + "node_modules/@wdio/config/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@wdio/config/node_modules/glob": { + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "dev": true, + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@wdio/config/node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/@wdio/config/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/@wdio/config/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@wdio/config/node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "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 +1723,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 +1741,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 +1753,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 +1783,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 +1827,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" } @@ -1812,6 +2015,16 @@ "node": ">= 14" } }, + "node_modules/archiver-utils/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, "node_modules/archiver-utils/node_modules/buffer": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", @@ -1836,6 +2049,83 @@ "ieee754": "^1.2.1" } }, + "node_modules/archiver-utils/node_modules/glob": { + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "dev": true, + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/archiver-utils/node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/archiver-utils/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/archiver-utils/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/archiver-utils/node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/archiver-utils/node_modules/readable-stream": { "version": "4.5.2", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.5.2.tgz", @@ -2050,9 +2340,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 +2466,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 +3045,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 +3370,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 +3447,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" @@ -3296,7 +3585,8 @@ "version": "0.2.0", "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/edge-paths": { "version": "3.0.5", @@ -3315,49 +3605,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 +3637,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 +3649,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 +3806,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 +3816,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 +3825,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 +3889,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", @@ -3683,10 +3936,11 @@ } }, "node_modules/eslint-plugin-prettier": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.2.1.tgz", - "integrity": "sha512-gH3iR3g4JfF+yYPaJYkN7jEl9QbweL/YfkoRlNnuIEHEz1vHVlCmWOS+eGGiRuzHQXdJFCOTxRgvju9b8VUmrw==", + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.2.3.tgz", + "integrity": "sha512-qJ+y0FfCp/mQYQ/vWQ3s7eUlFEL4PyKfAJxsnYTJ4YT73nsJBWqmEpFryxV9OeUiqmsTsYJ5Y+KDNaeP31wrRw==", "dev": true, + "license": "MIT", "dependencies": { "prettier-linter-helpers": "^1.0.0", "synckit": "^0.9.1" @@ -3982,16 +4236,17 @@ "dev": true }, "node_modules/fast-glob": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", - "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", "dev": true, + "license": "MIT", "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", "glob-parent": "^5.1.2", "merge2": "^1.3.0", - "micromatch": "^4.0.4" + "micromatch": "^4.0.8" }, "engines": { "node": ">=8.6.0" @@ -4010,9 +4265,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 +4596,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 +4628,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 +4639,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 +4688,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,37 +4710,25 @@ "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", - "integrity": "sha512-2jelhlq3E4ho74ZyVLN03oKdAZVUa6UDZzFLVH1H7dnoax+y9qyaq8zBkfDIggjniU19z0wU18y16jMB2eyVIw==", + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/glob/-/glob-11.0.1.tgz", + "integrity": "sha512-zrQDm8XPnYEKawJScsnM0QzobJxlT/kHOOlRTio8IH/GrmxRE5fjllkzdaHclIuNjUQTJYH2xHNIGfdpJkDJUw==", "dev": true, + "license": "ISC", "dependencies": { "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", + "jackspeak": "^4.0.1", + "minimatch": "^10.0.0", "minipass": "^7.1.2", - "path-scurry": "^1.11.1" + "package-json-from-dist": "^1.0.0", + "path-scurry": "^2.0.0" }, "bin": { "glob": "dist/esm/bin.mjs" }, "engines": { - "node": ">=16 || 14 >=14.18" + "node": "20 || >=22" }, "funding": { "url": "https://github.com/sponsors/isaacs" @@ -4553,20 +4795,22 @@ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "dev": true, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0" } }, "node_modules/glob/node_modules/minimatch": { - "version": "9.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", - "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.0.1.tgz", + "integrity": "sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^2.0.1" }, "engines": { - "node": ">=16 || 14 >=14.17" + "node": "20 || >=22" }, "funding": { "url": "https://github.com/sponsors/isaacs" @@ -4615,10 +4859,11 @@ } }, "node_modules/globals": { - "version": "15.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-15.12.0.tgz", - "integrity": "sha512-1+gLErljJFhbOVyaetcwJiJ4+eLe45S2E7P5UiZ9xGfeq3ATQf5DOv9G7MH3gGbKQLkzmNh2DxfZwLdw+j6oTQ==", + "version": "15.14.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-15.14.0.tgz", + "integrity": "sha512-OkToC372DtlQeje9/zHIo5CT8lRP/FUgEOKBEhU4e0abL7J7CD24fD9ohiLN5hagG/kWCYj4K5oaxxtj2Z0Dig==", "dev": true, + "license": "MIT", "engines": { "node": ">=18" }, @@ -4727,7 +4972,8 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/gulp": { "version": "5.0.0", @@ -5206,9 +5452,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 +5530,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": { @@ -5695,21 +5941,19 @@ } }, "node_modules/jackspeak": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.0.tgz", - "integrity": "sha512-JVYhQnN59LVPFCEcVa2C3CrEKYacvjRfqIQl+h8oi91aLYQVWRYbxjPcv1bUiUy/kLmQaANrYfNMCO3kuEDHfw==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-4.1.0.tgz", + "integrity": "sha512-9DDdhb5j6cpeitCbvLO7n7J4IxnbM6hoF6O1g4HQ5TfhvvKN8ywDM7668ZhMHRqVmxqhps/F6syWK2KcPxYlkw==", "dev": true, + "license": "BlueOak-1.0.0", "dependencies": { "@isaacs/cliui": "^8.0.2" }, "engines": { - "node": ">=14" + "node": "20 || >=22" }, "funding": { "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" } }, "node_modules/jju": { @@ -6044,9 +6288,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 +6303,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": { @@ -6256,15 +6512,17 @@ "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 8" } }, "node_modules/micromatch": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.7.tgz", - "integrity": "sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", "dev": true, + "license": "MIT", "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" @@ -6327,6 +6585,7 @@ "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", "dev": true, + "license": "ISC", "engines": { "node": ">=16 || 14 >=14.17" } @@ -6419,12 +6678,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 +6727,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 +6976,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" @@ -6754,6 +7007,13 @@ "node": ">= 14" } }, + "node_modules/package-json-from-dist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", + "dev": true, + "license": "BlueOak-1.0.0" + }, "node_modules/pako": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", @@ -6994,28 +7254,30 @@ } }, "node_modules/path-scurry": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", - "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.0.tgz", + "integrity": "sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==", "dev": true, + "license": "BlueOak-1.0.0", "dependencies": { - "lru-cache": "^10.2.0", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + "lru-cache": "^11.0.0", + "minipass": "^7.1.2" }, "engines": { - "node": ">=16 || 14 >=14.18" + "node": "20 || >=22" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, "node_modules/path-scurry/node_modules/lru-cache": { - "version": "10.2.2", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.2.tgz", - "integrity": "sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==", + "version": "11.0.2", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.0.2.tgz", + "integrity": "sha512-123qHRfJBmo2jXDbo/a5YOQrJoHF/GNQTLzQ5+IdK5pWpceK17yRc6ozlWd25FxvGKQbIUs91fDFkXmDHTKcyA==", "dev": true, + "license": "ISC", "engines": { - "node": "14 || >=16.14" + "node": "20 || >=22" } }, "node_modules/path-to-regexp": { @@ -7189,21 +7451,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 +7491,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" @@ -7318,7 +7575,8 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "license": "MIT" }, "node_modules/queue-tick": { "version": "1.0.1", @@ -7592,6 +7850,93 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/rimraf/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/rimraf/node_modules/glob": { + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "dev": true, + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rimraf/node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/rimraf/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/rimraf/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rimraf/node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/rrweb-cssom": { "version": "0.7.1", "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.7.1.tgz", @@ -7616,6 +7961,7 @@ "url": "https://feross.org/support" } ], + "license": "MIT", "dependencies": { "queue-microtask": "^1.2.2" } @@ -7636,10 +7982,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 +8175,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 +8208,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 +8320,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", @@ -8022,6 +8371,7 @@ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, + "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -8049,6 +8399,7 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, + "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" }, @@ -8061,6 +8412,7 @@ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -8324,15 +8676,16 @@ } }, "node_modules/ts-api-utils": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz", - "integrity": "sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.0.1.tgz", + "integrity": "sha512-dnlgjFSVetynI8nzgJ+qF62efpglpWRk8isUEWZGWlJYySCTD6aKvbUDu+zbPeDakk3bg5H4XpitHukgfL1m9w==", "dev": true, + "license": "MIT", "engines": { - "node": ">=16" + "node": ">=18.12" }, "peerDependencies": { - "typescript": ">=4.2.0" + "typescript": ">=4.8.4" } }, "node_modules/tslib": { @@ -8400,14 +8753,15 @@ } }, "node_modules/typescript-eslint": { - "version": "8.16.0", - "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.16.0.tgz", - "integrity": "sha512-wDkVmlY6O2do4V+lZd0GtRfbtXbeD0q9WygwXXSJnC1xorE8eqyC2L1tJimqpSeFrOzRlYtWnUp/uzgHQOgfBQ==", + "version": "8.23.0", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.23.0.tgz", + "integrity": "sha512-/LBRo3HrXr5LxmrdYSOCvoAMm7p2jNizNfbIpCgvG4HMsnoprRUOce/+8VJ9BDYWW68rqIENE/haVLWPeFZBVQ==", "dev": true, + "license": "MIT", "dependencies": { - "@typescript-eslint/eslint-plugin": "8.16.0", - "@typescript-eslint/parser": "8.16.0", - "@typescript-eslint/utils": "8.16.0" + "@typescript-eslint/eslint-plugin": "8.23.0", + "@typescript-eslint/parser": "8.23.0", + "@typescript-eslint/utils": "8.23.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -8417,12 +8771,8 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.8.0" } }, "node_modules/unbzip2-stream": { @@ -8478,9 +8828,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 +8885,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 +9108,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 +9129,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 +9160,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" @@ -8931,6 +9282,7 @@ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", diff --git a/package.json b/package.json index 332338eacfe..ca545ed3ec3 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "blockly", - "version": "11.2.1", + "version": "11.2.2", "description": "Blockly is a library for building visual programming editors.", "keywords": [ "blockly" @@ -115,7 +115,7 @@ "eslint-config-prettier": "^9.1.0", "eslint-plugin-jsdoc": "^50.5.0", "eslint-plugin-prettier": "^5.2.1", - "glob": "^10.3.4", + "glob": "^11.0.1", "globals": "^15.12.0", "google-closure-compiler": "^20240317.0.0", "gulp": "^5.0.0", diff --git a/tests/generators/index.html b/tests/generators/index.html index 9ec1db7731d..8ca5cb90eb4 100644 --- a/tests/generators/index.html +++ b/tests/generators/index.html @@ -38,7 +38,7 @@ * 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 @@ 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 @@ /** * 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 @@ alert(msg + '\n' + e); return null; } - return xmlHttp.responseText; } /** @@ -188,7 +191,7 @@ 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 4f86edb1b2c..004b5c878a2 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 0c7a92bf65a..490109d22ca 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 6526984213f..0f2d067708a 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( diff --git a/tests/mocha/connection_checker_test.js b/tests/mocha/connection_checker_test.js index f7aa33ba896..f353a2b77c2 100644 --- a/tests/mocha/connection_checker_test.js +++ b/tests/mocha/connection_checker_test.js @@ -503,8 +503,9 @@ suite('Connection checker', function () { `), this.workspace, ); - [this.blockA, this.blockB, this.blockC] = - this.workspace.getAllBlocks(true); + this.blockA = this.workspace.getBlockById('A'); + this.blockB = this.workspace.getBlockById('B'); + this.blockC = this.workspace.getBlockById('C'); this.checker = this.workspace.connectionChecker; }); diff --git a/tests/mocha/workspace_svg_test.js b/tests/mocha/workspace_svg_test.js index 0cd6da828b3..207cad45dc7 100644 --- a/tests/mocha/workspace_svg_test.js +++ b/tests/mocha/workspace_svg_test.js @@ -408,6 +408,53 @@ suite('WorkspaceSvg', function () { }); suite('cleanUp', function () { + assert.blockIsAtOrigin = function (actual, message) { + assert.blockHasPosition(actual, 0, 0, message || 'block is at origin'); + }; + + assert.blockHasPositionX = function (actual, expectedX, message) { + const position = actual.getRelativeToSurfaceXY(); + message = message || 'block has x value of ' + expectedX; + assert.equal(position.x, expectedX, message); + }; + + assert.blockHasPositionY = function (actual, expectedY, message) { + const position = actual.getRelativeToSurfaceXY(); + message = message || 'block has y value of ' + expectedY; + assert.equal(position.y, expectedY, message); + }; + + assert.blockHasPosition = function (actual, expectedX, expectedY, message) { + assert.blockHasPositionX(actual, expectedX, message); + assert.blockHasPositionY(actual, expectedY, message); + }; + + assert.blockIsAtNotOrigin = function (actual, message) { + const position = actual.getRelativeToSurfaceXY(); + message = message || 'block is not at origin'; + assert.isTrue(position.x != 0 || position.y != 0, message); + }; + + assert.blocksDoNotIntersect = function (a, b, message) { + const rectA = a.getBoundingRectangle(); + const rectB = b.getBoundingRectangle(); + assert.isFalse(rectA.intersects(rectB), message || "a,b don't intersect"); + }; + + assert.blockIsAbove = function (a, b, message) { + // Block a is above b iff a's bottom extreme is < b's top extreme. + const rectA = a.getBoundingRectangle(); + const rectB = b.getBoundingRectangle(); + assert.isBelow(rectA.bottom, rectB.top, message || 'a is above b'); + }; + + assert.blockIsBelow = function (a, b, message) { + // Block a is below b iff a's top extreme is > b's bottom extreme. + const rectA = a.getBoundingRectangle(); + const rectB = b.getBoundingRectangle(); + assert.isAbove(rectA.top, rectB.bottom, message || 'a is below b'); + }; + test('empty workspace does not change', function () { this.workspace.cleanUp(); @@ -429,13 +476,8 @@ suite('WorkspaceSvg', function () { this.workspace.cleanUp(); const blocks = this.workspace.getTopBlocks(true); - const origin = new Blockly.utils.Coordinate(0, 0); assert.equal(blocks.length, 1, 'workspace has one top-level block'); - assert.deepEqual( - blocks[0].getRelativeToSurfaceXY(), - origin, - 'block is at origin', - ); + assert.blockIsAtOrigin(blocks[0]); }); test('single block at (10, 15) is moved to (0, 0)', function () { @@ -453,14 +495,9 @@ suite('WorkspaceSvg', function () { const topBlocks = this.workspace.getTopBlocks(true); const allBlocks = this.workspace.getAllBlocks(false); - const origin = new Blockly.utils.Coordinate(0, 0); assert.equal(topBlocks.length, 1, 'workspace has one top-level block'); assert.equal(allBlocks.length, 1, 'workspace has one block overall'); - assert.deepEqual( - topBlocks[0].getRelativeToSurfaceXY(), - origin, - 'block is at origin', - ); + assert.blockIsAtOrigin(topBlocks[0]); }); test('single block at (10, 15) with child is moved as unit to (0, 0)', function () { @@ -487,19 +524,10 @@ suite('WorkspaceSvg', function () { const topBlocks = this.workspace.getTopBlocks(true); const allBlocks = this.workspace.getAllBlocks(false); - const origin = new Blockly.utils.Coordinate(0, 0); assert.equal(topBlocks.length, 1, 'workspace has one top-level block'); assert.equal(allBlocks.length, 2, 'workspace has two blocks overall'); - assert.deepEqual( - topBlocks[0].getRelativeToSurfaceXY(), - origin, - 'block is at origin', - ); - assert.notDeepEqual( - allBlocks[1].getRelativeToSurfaceXY(), - origin, - 'child is not at origin', - ); + assert.blockIsAtOrigin(topBlocks[0]); // Parent block. + assert.blockIsAtNotOrigin(allBlocks[1]); // Child block. }); // TODO(#8676): Reenable once test passes reliably. @@ -524,19 +552,9 @@ suite('WorkspaceSvg', function () { const topBlocks = this.workspace.getTopBlocks(true); const block1 = this.workspace.getBlockById('block1'); const block2 = this.workspace.getBlockById('block2'); - const origin = new Blockly.utils.Coordinate(0, 0); - const belowBlock2 = new Blockly.utils.Coordinate(0, 50); assert.equal(topBlocks.length, 2, 'workspace has two top-level blocks'); - assert.deepEqual( - block2.getRelativeToSurfaceXY(), - origin, - 'block2 is at origin', - ); - assert.deepEqual( - block1.getRelativeToSurfaceXY(), - belowBlock2, - 'block1 is below block2', - ); + assert.blockIsAtOrigin(block2); + assert.blockIsBelow(block1, block2); }); // TODO(#8676): Reenable once test passes reliably. @@ -564,19 +582,9 @@ suite('WorkspaceSvg', function () { const topBlocks = this.workspace.getTopBlocks(true); const block1 = this.workspace.getBlockById('block1'); const block2 = this.workspace.getBlockById('block2'); - const origin = new Blockly.utils.Coordinate(0, 0); - const belowBlock1 = new Blockly.utils.Coordinate(0, 50); assert.equal(topBlocks.length, 2, 'workspace has two top-level blocks'); - assert.deepEqual( - block1.getRelativeToSurfaceXY(), - origin, - 'block1 is at origin', - ); - assert.deepEqual( - block2.getRelativeToSurfaceXY(), - belowBlock1, - 'block2 is below block1', - ); + assert.blockIsAtOrigin(block1); + assert.blockIsBelow(block2, block1); }); test('two overlapping blocks with snapping are moved to grid-aligned positions', function () { @@ -605,19 +613,9 @@ suite('WorkspaceSvg', function () { const topBlocks = this.workspace.getTopBlocks(true); const block1 = this.workspace.getBlockById('block1'); const block2 = this.workspace.getBlockById('block2'); - const snappedOffOrigin = new Blockly.utils.Coordinate(10, 10); - const belowBlock1 = new Blockly.utils.Coordinate(10, 70); assert.equal(topBlocks.length, 2, 'workspace has two top-level blocks'); - assert.deepEqual( - block1.getRelativeToSurfaceXY(), - snappedOffOrigin, - 'block1 is near origin', - ); - assert.deepEqual( - block2.getRelativeToSurfaceXY(), - belowBlock1, - 'block2 is below block1', - ); + assert.blockHasPosition(block1, 10, 10, 'block1 is at snapped origin'); + assert.blockIsBelow(block2, block1); }); // TODO(#8676): Reenable once test passes reliably. @@ -653,36 +651,28 @@ suite('WorkspaceSvg', function () { const allBlocks = this.workspace.getAllBlocks(false); const block1 = this.workspace.getBlockById('block1'); const block2 = this.workspace.getBlockById('block2'); - const origin = new Blockly.utils.Coordinate(0, 0); - const belowBlock1 = new Blockly.utils.Coordinate(0, 50); - const block1Pos = block1.getRelativeToSurfaceXY(); - const block2Pos = block2.getRelativeToSurfaceXY(); - const block1ChildPos = block1.getChildren()[0].getRelativeToSurfaceXY(); - const block2ChildPos = block2.getChildren()[0].getRelativeToSurfaceXY(); + const block1Child = block1.getChildren()[0]; + const block2Child = block2.getChildren()[0]; + + // Note that the x position tests below are verifying that each block's + // child isn't exactly aligned with it (however, they does overlap since + // the child block has an input connection with its parent). assert.equal(topBlocks.length, 2, 'workspace has two top-level block2'); assert.equal(allBlocks.length, 4, 'workspace has four blocks overall'); - assert.deepEqual(block1Pos, origin, 'block1 is at origin'); - assert.deepEqual(block2Pos, belowBlock1, 'block2 is below block1'); - assert.isAbove( - block1ChildPos.x, - block1Pos.x, - "block1's child is right of it", - ); - assert.isBelow( - block1ChildPos.y, - block2Pos.y, - "block1's child is above block 2", - ); + assert.blockIsAtOrigin(block1); + assert.blockIsBelow(block2, block1); assert.isAbove( - block2ChildPos.x, - block2Pos.x, - "block2's child is right of it", + block1.getChildren()[0].getRelativeToSurfaceXY().x, + block1.getRelativeToSurfaceXY().x, + "block1's child is right of its start", ); + assert.blockIsAbove(block1Child, block2); assert.isAbove( - block2ChildPos.y, - block1Pos.y, - "block2's child is below block 1", + block2.getChildren()[0].getRelativeToSurfaceXY().x, + block2.getRelativeToSurfaceXY().x, + "block2's child is right of its start", ); + assert.blockIsBelow(block2Child, block1); }); // TODO(#8676): Reenable once test passes reliably. @@ -742,19 +732,9 @@ suite('WorkspaceSvg', function () { const topBlocks = this.workspace.getTopBlocks(true); const block1 = this.workspace.getBlockById('block1'); const block2 = this.workspace.getBlockById('block2'); - const origin = new Blockly.utils.Coordinate(0, 0); - const belowBlock1 = new Blockly.utils.Coordinate(0, 144); assert.equal(topBlocks.length, 2, 'workspace has two top-level blocks'); - assert.deepEqual( - block1.getRelativeToSurfaceXY(), - origin, - 'block1 is at origin', - ); - assert.deepEqual( - block2.getRelativeToSurfaceXY(), - belowBlock1, - 'block2 is below block1', - ); + assert.blockIsAtOrigin(block1); + assert.blockIsBelow(block2, block1); }); test('five overlapping blocks are moved in-order as one column', function () { @@ -780,32 +760,21 @@ suite('WorkspaceSvg', function () { this.workspace.cleanUp(); const topBlocks = this.workspace.getTopBlocks(true); - const block1Pos = this.workspace - .getBlockById('block1') - .getRelativeToSurfaceXY(); - const block2Pos = this.workspace - .getBlockById('block2') - .getRelativeToSurfaceXY(); - const block3Pos = this.workspace - .getBlockById('block3') - .getRelativeToSurfaceXY(); - const block4Pos = this.workspace - .getBlockById('block4') - .getRelativeToSurfaceXY(); - const block5Pos = this.workspace - .getBlockById('block5') - .getRelativeToSurfaceXY(); - const origin = new Blockly.utils.Coordinate(0, 0); + const block1 = this.workspace.getBlockById('block1'); + const block2 = this.workspace.getBlockById('block2'); + const block3 = this.workspace.getBlockById('block3'); + const block4 = this.workspace.getBlockById('block4'); + const block5 = this.workspace.getBlockById('block5'); assert.equal(topBlocks.length, 5, 'workspace has five top-level blocks'); - assert.deepEqual(block1Pos, origin, 'block1 is at origin'); - assert.equal(block2Pos.x, 0, 'block2.x is at 0'); - assert.equal(block3Pos.x, 0, 'block3.x is at 0'); - assert.equal(block4Pos.x, 0, 'block4.x is at 0'); - assert.equal(block5Pos.x, 0, 'block5.x is at 0'); - assert.isAbove(block2Pos.y, block1Pos.y, 'block2 is below block1'); - assert.isAbove(block3Pos.y, block2Pos.y, 'block3 is below block2'); - assert.isAbove(block4Pos.y, block3Pos.y, 'block4 is below block3'); - assert.isAbove(block5Pos.y, block4Pos.y, 'block5 is below block4'); + assert.blockIsAtOrigin(block1); + assert.blockHasPositionX(block2, 0); + assert.blockHasPositionX(block3, 0); + assert.blockHasPositionX(block4, 0); + assert.blockHasPositionX(block5, 0); + assert.blockIsBelow(block2, block1); + assert.blockIsBelow(block3, block2); + assert.blockIsBelow(block4, block3); + assert.blockIsBelow(block5, block4); }); test('single immovable block at (10, 15) is not moved', function () { @@ -824,14 +793,9 @@ suite('WorkspaceSvg', function () { const topBlocks = this.workspace.getTopBlocks(true); const allBlocks = this.workspace.getAllBlocks(false); - const origPos = new Blockly.utils.Coordinate(10, 15); assert.equal(topBlocks.length, 1, 'workspace has one top-level block'); assert.equal(allBlocks.length, 1, 'workspace has one block overall'); - assert.deepEqual( - topBlocks[0].getRelativeToSurfaceXY(), - origPos, - 'block is at (10, 15)', - ); + assert.blockHasPosition(topBlocks[0], 10, 15); }); test('multiple block types immovable blocks are not moved', function () { @@ -914,53 +878,29 @@ suite('WorkspaceSvg', function () { this.workspace.cleanUp(); const topBlocks = this.workspace.getTopBlocks(true); - const block1Rect = this.workspace - .getBlockById('block1') - .getBoundingRectangle(); - const block2Rect = this.workspace - .getBlockById('block2') - .getBoundingRectangle(); - const block3Rect = this.workspace - .getBlockById('block3') - .getBoundingRectangle(); - const block4Rect = this.workspace - .getBlockById('block4') - .getBoundingRectangle(); - const block5Rect = this.workspace - .getBlockById('block5') - .getBoundingRectangle(); + const block1 = this.workspace.getBlockById('block1'); + const block2 = this.workspace.getBlockById('block2'); + const block3 = this.workspace.getBlockById('block3'); + const block4 = this.workspace.getBlockById('block4'); + const block5 = this.workspace.getBlockById('block5'); assert.equal(topBlocks.length, 5, 'workspace has five top-level blocks'); // Check that immovable blocks haven't moved. - assert.equal(block2Rect.left, 10, 'block2.x is at 10'); - assert.equal(block2Rect.top, 20, 'block2.y is at 20'); - assert.equal(block5Rect.left, 20, 'block5.x is at 20'); - assert.equal(block5Rect.top, 200, 'block5.y is at 200'); + assert.blockHasPosition(block2, 10, 20); + assert.blockHasPosition(block5, 20, 200); // Check that movable positions have correctly been left-aligned. - assert.equal(block1Rect.left, 0, 'block1.x is at 0'); - assert.equal(block3Rect.left, 0, 'block3.x is at 0'); - assert.equal(block4Rect.left, 0, 'block4.x is at 0'); + assert.blockHasPositionX(block1, 0); + assert.blockHasPositionX(block3, 0); + assert.blockHasPositionX(block4, 0); // Block order should be: 2, 1, 3, 5, 4 since 2 and 5 are immovable. - assert.isAbove(block1Rect.top, block2Rect.top, 'block1 is below block2'); - assert.isAbove(block3Rect.top, block1Rect.top, 'block3 is below block1'); - assert.isAbove(block5Rect.top, block3Rect.top, 'block5 is below block3'); - assert.isAbove(block4Rect.top, block5Rect.top, 'block4 is below block5'); + assert.blockIsBelow(block1, block2); + assert.blockIsBelow(block3, block1); + assert.blockIsBelow(block5, block3); + assert.blockIsBelow(block4, block5); // Ensure no blocks intersect (can check in order due to the position verification above). - assert.isFalse( - block2Rect.intersects(block1Rect), - 'block2/block1 do not intersect', - ); - assert.isFalse( - block1Rect.intersects(block3Rect), - 'block1/block3 do not intersect', - ); - assert.isFalse( - block3Rect.intersects(block5Rect), - 'block3/block5 do not intersect', - ); - assert.isFalse( - block5Rect.intersects(block4Rect), - 'block5/block4 do not intersect', - ); + assert.blocksDoNotIntersect(block2, block1); + assert.blocksDoNotIntersect(block1, block3); + assert.blocksDoNotIntersect(block3, block5); + assert.blocksDoNotIntersect(block5, block4); }); });