diff --git a/.eslintignore b/.eslintignore index 26e22adb5..b8e1c93a8 100644 --- a/.eslintignore +++ b/.eslintignore @@ -7,7 +7,7 @@ /tests/compile/* /tests/jsunit/* /tests/generators/* -/tests/mocha/run_mocha_tests_in_browser.js +/tests/mocha/webdriver.js /tests/screenshot/* /tests/test_runner.js /tests/workspace_svg/* diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 434334e54..f6e75614c 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -10,12 +10,6 @@ updates: target-branch: "develop" schedule: interval: "weekly" - ignore: - - dependency-name: "jsdom" - # For jsdom, ignore all updates for version 16. - # We should test that this does not cause issue - # google/blockly-samples#665 when version 17 is released. - versions: "16.x" commit-message: prefix: "chore(deps)" labels: diff --git a/.github/release.yml b/.github/release.yml index 4147d3f54..2c5b11486 100644 --- a/.github/release.yml +++ b/.github/release.yml @@ -4,23 +4,29 @@ changelog: exclude: labels: - ignore-for-release + - "PR: chore" authors: - dependabot categories: - - title: Breaking Changes ๐Ÿ›  + - title: Breaking changes ๐Ÿ›  labels: - breaking change - - title: New Features + - title: Deprecations ๐Ÿงน - APIs that may be removed in future releases + labels: + - deprecation + - title: New features โœจ labels: - "PR: feature" - - title: Bug fixes + - title: Bug fixes ๐Ÿ› labels: - "PR: fix" - title: Cleanup โ™ป๏ธ labels: - - "PR: chore" - "PR: docs" - "PR: refactor" - - title: Other Changes + - title: Reverted changes โŽŒ + labels: + - "PR: revert" + - title: Other changes labels: - "*" diff --git a/.github/workflows/appengine_deploy.yml b/.github/workflows/appengine_deploy.yml index 6ea1b0daf..a72ddecd3 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@v0.8.2 + uses: google-github-actions/deploy-appengine@v1.0.0 # For parameters see: # https://github.com/google-github-actions/deploy-appengine#inputs with: diff --git a/.github/workflows/check_clang_format.yml b/.github/workflows/check_clang_format.yml index 93150984a..94dc3461f 100644 --- a/.github/workflows/check_clang_format.yml +++ b/.github/workflows/check_clang_format.yml @@ -13,14 +13,14 @@ jobs: steps: - uses: actions/checkout@v3 - - uses: DoozyX/clang-format-lint-action@v0.14 + - uses: DoozyX/clang-format-lint-action@v0.15 with: source: 'core' extensions: 'js,ts' # This should be as close as possible to the version that the npm # package supports. This can be found by running: # npx clang-format --version. - clangFormatVersion: 13 + clangFormatVersion: 15 # The Report clang format workflow (report_clang_format.yml) will # run (if required) after this one to post a comment to the PR. diff --git a/.github/workflows/conventional-label.yml b/.github/workflows/conventional-label.yml index efba70b92..a7ab2c18b 100644 --- a/.github/workflows/conventional-label.yml +++ b/.github/workflows/conventional-label.yml @@ -1,6 +1,8 @@ on: pull_request_target: - types: [ opened, edited ] + types: + - opened + - edited name: conventional-release-labels jobs: label: @@ -8,5 +10,7 @@ jobs: steps: - uses: bcoe/conventional-release-labels@v1 with: - type_labels: '{"feat": "PR: feature", "fix": "PR: fix", "breaking": "breaking change", "chore": "PR: chore", "docs": "PR: docs", "refactor": "PR: refactor"}' + type_labels: '{"feat": "PR: feature", "fix": "PR: fix", "breaking": "breaking + change", "chore": "PR: chore", "docs": "PR: docs", "refactor": "PR: + refactor", "revert": "PR: revert", "deprecate": "deprecation"}' ignored_types: '[]' diff --git a/.github/workflows/update_metadata.yml b/.github/workflows/update_metadata.yml index 125236983..b6cfdaf0c 100644 --- a/.github/workflows/update_metadata.yml +++ b/.github/workflows/update_metadata.yml @@ -36,7 +36,7 @@ jobs: run: source ./tests/scripts/update_metadata.sh - name: Create Pull Request - uses: peter-evans/create-pull-request@b4d51739f96fca8047ad065eccef63442d8e99f7 + uses: peter-evans/create-pull-request@2b011faafdcbc9ceb11414d64d0573f37c774b04 with: commit-message: Update build artifact sizes in check_metadata.sh delete-branch: true diff --git a/appengine/blockly_compressed.js b/appengine/blockly_compressed.js new file mode 100644 index 000000000..dc118dfbe --- /dev/null +++ b/appengine/blockly_compressed.js @@ -0,0 +1,11 @@ +// Added November 2022 after discovering that a number of orgs were hot-linking +// their Blockly applications to https://blockly-demo.appspot.com/ +// Delete this file in early 2024. +var msg = 'Compiled Blockly files should be loaded from https://unpkg.com/blockly/\n' + + 'For help, contact https://groups.google.com/g/blockly'; +console.log(msg); +try { + alert(msg); +} catch (_e) { + // Can't alert? Probably node.js. +} diff --git a/blocks/procedures.js b/blocks/procedures.js index d6fd9ddcf..c7a5d7fc3 100644 --- a/blocks/procedures.js +++ b/blocks/procedures.js @@ -979,7 +979,7 @@ const PROCEDURE_CALL_COMMON = { Xml.domToWorkspace(xml, this.workspace); Events.setGroup(false); } - } else if (event.type === Events.BLOCK_DELETE && event.blockId != this.id) { + } else if (event.type === Events.BLOCK_DELETE) { // Look for the case where a procedure definition has been deleted, // leaving this block (a procedure call) orphaned. In this case, delete // the orphan. diff --git a/core/block.ts b/core/block.ts index caff93df2..de8f16680 100644 --- a/core/block.ts +++ b/core/block.ts @@ -95,6 +95,9 @@ export class Block implements IASTNodeLocation, IDeletable { /** An optional method called during initialization. */ init?: (() => AnyDuringMigration)|null = undefined; + /** An optional method called during disposal. */ + destroy?: (() => void) = undefined; + /** * An optional serialization method for defining how to serialize the * mutation state to XML. This must be coupled with defining @@ -324,16 +327,15 @@ export class Block implements IASTNodeLocation, IDeletable { if (this.isDeadOrDying()) { return; } + // Terminate onchange event calls. + if (this.onchangeWrapper_) { + this.workspace.removeChangeListener(this.onchangeWrapper_); + } this.unplug(healStack); if (eventUtils.isEnabled()) { eventUtils.fire(new (eventUtils.get(eventUtils.BLOCK_DELETE))(this)); } - - if (this.onchangeWrapper_) { - this.workspace.removeChangeListener(this.onchangeWrapper_); - } - eventUtils.disable(); try { @@ -362,6 +364,9 @@ export class Block implements IASTNodeLocation, IDeletable { } } finally { eventUtils.enable(); + if (typeof this.destroy === 'function') { + this.destroy(); + } this.disposed = true; } } @@ -1817,7 +1822,7 @@ export class Block implements IASTNodeLocation, IDeletable { * @param element The element to try to turn into a field. * @returns The field defined by the JSON, or null if one couldn't be created. */ - private fieldFromJson_(element: {alt?: string, type?: string, text?: string}): + private fieldFromJson_(element: {alt?: string, type: string, text?: string}): Field|null { const field = fieldRegistry.fromJson(element); if (!field && element['alt']) { diff --git a/core/block_dragger.ts b/core/block_dragger.ts index 33b0dcf83..c977f5c53 100644 --- a/core/block_dragger.ts +++ b/core/block_dragger.ts @@ -176,7 +176,7 @@ export class BlockDragger implements IBlockDragger { * @param currentDragDeltaXY How far the pointer has moved from the position * at the start of the drag, in pixel units. */ - drag(e: Event, currentDragDeltaXY: Coordinate) { + drag(e: PointerEvent, currentDragDeltaXY: Coordinate) { const delta = this.pixelsToWorkspaceUnits_(currentDragDeltaXY); const newLoc = Coordinate.sum(this.startXY_, delta); this.draggingBlock_.moveDuringDrag(newLoc); @@ -187,7 +187,7 @@ export class BlockDragger implements IBlockDragger { this.draggedConnectionManager_.update(delta, this.dragTarget_); const oldWouldDeleteBlock = this.wouldDeleteBlock_; - this.wouldDeleteBlock_ = this.draggedConnectionManager_.wouldDeleteBlock(); + this.wouldDeleteBlock_ = this.draggedConnectionManager_.wouldDeleteBlock; if (oldWouldDeleteBlock !== this.wouldDeleteBlock_) { // Prevent unnecessary add/remove class calls. this.updateCursorDuringBlockDrag_(); @@ -205,11 +205,11 @@ export class BlockDragger implements IBlockDragger { /** * Finish a block drag and put the block back on the workspace. * - * @param e The mouseup/touchend event. + * @param e The pointerup event. * @param currentDragDeltaXY How far the pointer has moved from the position * at the start of the drag, in pixel units. */ - endDrag(e: Event, currentDragDeltaXY: Coordinate) { + endDrag(e: PointerEvent, currentDragDeltaXY: Coordinate) { // Make sure internal state is fresh. this.drag(e, currentDragDeltaXY); this.dragIconData_ = []; diff --git a/core/block_svg.ts b/core/block_svg.ts index 615e568c4..02e2f0d0a 100644 --- a/core/block_svg.ts +++ b/core/block_svg.ts @@ -227,7 +227,8 @@ export class BlockSvg extends Block implements IASTNodeLocationSvg, this.pathObject.updateMovable(this.isMovable()); const svg = this.getSvgRoot(); if (!this.workspace.options.readOnly && !this.eventsInit_ && svg) { - browserEvents.conditionalBind(svg, 'mousedown', this, this.onMouseDown_); + browserEvents.conditionalBind( + svg, 'pointerdown', this, this.onMouseDown_); } this.eventsInit_ = true; @@ -673,11 +674,11 @@ export class BlockSvg extends Block implements IASTNodeLocationSvg, } /** - * Handle a mouse-down on an SVG block. + * Handle a pointerdown on an SVG block. * - * @param e Mouse down event or touch start event. + * @param e Pointer down event. */ - private onMouseDown_(e: Event) { + private onMouseDown_(e: PointerEvent) { const gesture = this.workspace.getGesture(e); if (gesture) { gesture.handleBlockStart(e, this); diff --git a/core/blockly.ts b/core/blockly.ts index dcb1d8ba9..0537827a9 100644 --- a/core/blockly.ts +++ b/core/blockly.ts @@ -53,19 +53,19 @@ import {DragTarget} from './drag_target.js'; import * as dropDownDiv from './dropdowndiv.js'; import * as Events from './events/events.js'; import * as Extensions from './extensions.js'; -import {Field} from './field.js'; -import {FieldAngle} from './field_angle.js'; -import {FieldCheckbox} from './field_checkbox.js'; -import {FieldColour} from './field_colour.js'; -import {FieldDropdown, MenuGenerator, MenuGeneratorFunction, MenuOption} from './field_dropdown.js'; +import {Field, FieldValidator} from './field.js'; +import {FieldAngle, FieldAngleValidator} from './field_angle.js'; +import {FieldCheckbox, FieldCheckboxValidator} from './field_checkbox.js'; +import {FieldColour, FieldColourValidator} from './field_colour.js'; +import {FieldDropdown, FieldDropdownValidator, MenuGenerator, MenuGeneratorFunction, MenuOption} from './field_dropdown.js'; import {FieldImage} from './field_image.js'; import {FieldLabel} from './field_label.js'; import {FieldLabelSerializable} from './field_label_serializable.js'; -import {FieldMultilineInput} from './field_multilineinput.js'; -import {FieldNumber} from './field_number.js'; +import {FieldMultilineInput, FieldMultilineInputValidator} from './field_multilineinput.js'; +import {FieldNumber, FieldNumberValidator} from './field_number.js'; import * as fieldRegistry from './field_registry.js'; -import {FieldTextInput} from './field_textinput.js'; -import {FieldVariable} from './field_variable.js'; +import {FieldTextInput, FieldTextInputValidator} from './field_textinput.js'; +import {FieldVariable, FieldVariableValidator} from './field_variable.js'; import {Flyout} from './flyout_base.js'; import {FlyoutButton} from './flyout_button.js'; import {HorizontalFlyout} from './flyout_horizontal.js'; @@ -101,7 +101,6 @@ import {IMetricsManager} from './interfaces/i_metrics_manager.js'; import {IMovable} from './interfaces/i_movable.js'; import {IPositionable} from './interfaces/i_positionable.js'; import {IRegistrable} from './interfaces/i_registrable.js'; -import {IRegistrableField} from './interfaces/i_registrable_field.js'; import {ISelectable} from './interfaces/i_selectable.js'; import {ISelectableToolboxItem} from './interfaces/i_selectable_toolbox_item.js'; import {IStyleable} from './interfaces/i_styleable.js'; @@ -146,7 +145,6 @@ import {Toolbox} from './toolbox/toolbox.js'; import {ToolboxItem} from './toolbox/toolbox_item.js'; import * as Tooltip from './tooltip.js'; import * as Touch from './touch.js'; -import {TouchGesture} from './touch_gesture.js'; import {Trashcan} from './trashcan.js'; import * as utils from './utils.js'; import * as colour from './utils/colour.js'; @@ -486,9 +484,7 @@ export function unbindEvent_(bindData: browserEvents.Data): Function { * @param opt_noCaptureIdentifier True if triggering on this event should not * block execution of other event handlers on this touch or other * simultaneous touches. False by default. - * @param opt_noPreventDefault True if triggering on this event should prevent - * the default handler. False by default. If opt_noPreventDefault is - * provided, opt_noCaptureIdentifier must also be provided. + * @param _opt_noPreventDefault No-op, deprecated and will be removed in v10. * @returns Opaque data that can be passed to unbindEvent_. * @deprecated Use **Blockly.browserEvents.conditionalBind** instead. * @see browserEvents.conditionalBind @@ -497,13 +493,12 @@ export function unbindEvent_(bindData: browserEvents.Data): Function { export function bindEventWithChecks_( node: EventTarget, name: string, thisObject: Object|null, func: Function, opt_noCaptureIdentifier?: boolean, - opt_noPreventDefault?: boolean): browserEvents.Data { + _opt_noPreventDefault?: boolean): browserEvents.Data { deprecation.warn( 'Blockly.bindEventWithChecks_', 'December 2021', 'December 2022', 'Blockly.browserEvents.conditionalBind'); return browserEvents.conditionalBind( - node, name, thisObject, func, opt_noCaptureIdentifier, - opt_noPreventDefault); + node, name, thisObject, func, opt_noCaptureIdentifier); } // Aliases to allow external code to access these values for legacy reasons. @@ -648,24 +643,31 @@ export {Cursor}; export {DeleteArea}; export {DragTarget}; export const DropDownDiv = dropDownDiv; -export {Field}; -export {FieldAngle}; -export {FieldCheckbox}; -export {FieldColour}; -export {FieldDropdown, MenuGenerator, MenuGeneratorFunction, MenuOption}; +export {Field, FieldValidator}; +export {FieldAngle, FieldAngleValidator}; +export {FieldCheckbox, FieldCheckboxValidator}; +export {FieldColour, FieldColourValidator}; +export { + FieldDropdown, + FieldDropdownValidator, + MenuGenerator, + MenuGeneratorFunction, + MenuOption, +}; export {FieldImage}; export {FieldLabel}; export {FieldLabelSerializable}; -export {FieldMultilineInput}; -export {FieldNumber}; -export {FieldTextInput}; -export {FieldVariable}; +export {FieldMultilineInput, FieldMultilineInputValidator}; +export {FieldNumber, FieldNumberValidator}; +export {FieldTextInput, FieldTextInputValidator}; +export {FieldVariable, FieldVariableValidator}; export {Flyout}; export {FlyoutButton}; export {FlyoutMetricsManager}; export {CodeGenerator}; export {CodeGenerator as Generator}; // Deprecated name, October 2022. export {Gesture}; +export {Gesture as TouchGesture}; // Remove in v10. export {Grid}; export {HorizontalFlyout}; export {IASTNodeLocation}; @@ -693,7 +695,6 @@ export {Input}; export {InsertionMarkerManager}; export {IPositionable}; export {IRegistrable}; -export {IRegistrableField}; export {ISelectable}; export {ISelectableToolboxItem}; export {IStyleable}; @@ -719,7 +720,6 @@ export {Toolbox}; export {ToolboxCategory}; export {ToolboxItem}; export {ToolboxSeparator}; -export {TouchGesture}; export {Trashcan}; export {VariableMap}; export {VariableModel}; diff --git a/core/blockly_options.ts b/core/blockly_options.ts index 0cf4c851d..8933bd637 100644 --- a/core/blockly_options.ts +++ b/core/blockly_options.ts @@ -32,6 +32,7 @@ export interface BlocklyOptions { maxBlocks?: number; maxInstances?: {[blockType: string]: number}; media?: string; + modalInputs?: boolean; move?: MoveOptions; oneBasedIndex?: boolean; readOnly?: boolean; diff --git a/core/blocks.ts b/core/blocks.ts index aecf6eb69..cb3348c74 100644 --- a/core/blocks.ts +++ b/core/blocks.ts @@ -14,7 +14,7 @@ goog.declareModuleId('Blockly.blocks'); /** - * A block definition. For now this very lose, but it can potentially + * A block definition. For now this very loose, but it can potentially * be refined e.g. by replacing this typedef with a class definition. */ export type BlockDefinition = AnyDuringMigration; diff --git a/core/browser_events.ts b/core/browser_events.ts index efed4a34d..a36c7e537 100644 --- a/core/browser_events.ts +++ b/core/browser_events.ts @@ -13,6 +13,7 @@ import * as goog from '../closure/goog/goog.js'; goog.declareModuleId('Blockly.browserEvents'); import * as Touch from './touch.js'; +import * as deprecation from './utils/deprecation.js'; import * as userAgent from './utils/useragent.js'; @@ -51,42 +52,36 @@ const PAGE_MODE_MULTIPLIER = 125; * @param opt_noCaptureIdentifier True if triggering on this event should not * block execution of other event handlers on this touch or other * simultaneous touches. False by default. - * @param opt_noPreventDefault True if triggering on this event should prevent - * the default handler. False by default. If opt_noPreventDefault is - * provided, opt_noCaptureIdentifier must also be provided. + * @param opt_noPreventDefault No-op, deprecated and will be removed in v10. * @returns Opaque data that can be passed to unbindEvent_. * @alias Blockly.browserEvents.conditionalBind */ export function conditionalBind( node: EventTarget, name: string, thisObject: Object|null, func: Function, opt_noCaptureIdentifier?: boolean, opt_noPreventDefault?: boolean): Data { - let handled = false; + if (opt_noPreventDefault !== undefined) { + deprecation.warn( + 'The opt_noPreventDefault argument of conditionalBind', 'version 9', + 'version 10'); + } /** * * @param e */ function wrapFunc(e: Event) { const captureIdentifier = !opt_noCaptureIdentifier; - // Handle each touch point separately. If the event was a mouse event, this - // will hand back an array with one element, which we're fine handling. - const events = Touch.splitEventByTouches(e); - for (let i = 0; i < events.length; i++) { - const event = events[i]; - if (captureIdentifier && !Touch.shouldHandleEvent(event)) { - continue; - } - Touch.setClientFromTouch(event); + + if (!(captureIdentifier && !Touch.shouldHandleEvent(e))) { if (thisObject) { - func.call(thisObject, event); + func.call(thisObject, e); } else { - func(event); + func(e); } - handled = true; } } const bindData: Data = []; - if (globalThis['PointerEvent'] && name in Touch.TOUCH_MAP) { + if (name in Touch.TOUCH_MAP) { for (let i = 0; i < Touch.TOUCH_MAP[name].length; i++) { const type = Touch.TOUCH_MAP[name][i]; node.addEventListener(type, wrapFunc, false); @@ -95,24 +90,6 @@ export function conditionalBind( } else { node.addEventListener(name, wrapFunc, false); bindData.push([node, name, wrapFunc]); - - // Add equivalent touch event. - if (name in Touch.TOUCH_MAP) { - const touchWrapFunc = (e: Event) => { - wrapFunc(e); - // Calling preventDefault stops the browser from scrolling/zooming the - // page. - const preventDef = !opt_noPreventDefault; - if (handled && preventDef) { - e.preventDefault(); - } - }; - for (let i = 0; i < Touch.TOUCH_MAP[name].length; i++) { - const type = Touch.TOUCH_MAP[name][i]; - node.addEventListener(type, touchWrapFunc, false); - bindData.push([node, type, touchWrapFunc]); - } - } } return bindData; } @@ -146,7 +123,7 @@ export function bind( } const bindData: Data = []; - if (globalThis['PointerEvent'] && name in Touch.TOUCH_MAP) { + if (name in Touch.TOUCH_MAP) { for (let i = 0; i < Touch.TOUCH_MAP[name].length; i++) { const type = Touch.TOUCH_MAP[name][i]; node.addEventListener(type, wrapFunc, false); @@ -155,32 +132,6 @@ export function bind( } else { node.addEventListener(name, wrapFunc, false); bindData.push([node, name, wrapFunc]); - - // Add equivalent touch event. - if (name in Touch.TOUCH_MAP) { - const touchWrapFunc = (e: Event) => { - // Punt on multitouch events. - if (e instanceof TouchEvent && e.changedTouches && - e.changedTouches.length === 1) { - // Map the touch event's properties to the event. - const touchPoint = e.changedTouches[0]; - // TODO (6311): We are trying to make a touch event look like a mouse - // event, which is not allowed, because it requires adding more - // properties to the event. How do we want to deal with this? - (e as AnyDuringMigration).clientX = touchPoint.clientX; - (e as AnyDuringMigration).clientY = touchPoint.clientY; - } - wrapFunc(e); - - // Stop the browser from scrolling/zooming the page. - e.preventDefault(); - }; - for (let i = 0; i < Touch.TOUCH_MAP[name].length; i++) { - const type = Touch.TOUCH_MAP[name][i]; - node.addEventListener(type, touchWrapFunc, false); - bindData.push([node, type, touchWrapFunc]); - } - } } return bindData; } diff --git a/core/bubble.ts b/core/bubble.ts index 000ae773e..054043c2e 100644 --- a/core/bubble.ts +++ b/core/bubble.ts @@ -249,10 +249,10 @@ export class Bubble implements IBubble { if (!this.workspace_.options.readOnly) { this.onMouseDownBubbleWrapper = browserEvents.conditionalBind( - this.bubbleBack, 'mousedown', this, this.bubbleMouseDown); + this.bubbleBack, 'pointerdown', this, this.bubbleMouseDown); if (this.resizeGroup) { this.onMouseDownResizeWrapper = browserEvents.conditionalBind( - this.resizeGroup, 'mousedown', this, this.resizeMouseDown); + this.resizeGroup, 'pointerdown', this, this.resizeMouseDown); } } this.bubbleGroup.appendChild(content); @@ -278,11 +278,11 @@ export class Bubble implements IBubble { } /** - * Handle a mouse-down on bubble's border. + * Handle a pointerdown on bubble's border. * - * @param e Mouse down event. + * @param e Pointer down event. */ - private bubbleMouseDown(e: Event) { + private bubbleMouseDown(e: PointerEvent) { const gesture = this.workspace_.getGesture(e); if (gesture) { gesture.handleBubbleStart(e, this); @@ -318,11 +318,11 @@ export class Bubble implements IBubble { // NOP if bubble is not deletable. /** - * Handle a mouse-down on bubble's resize corner. + * Handle a pointerdown on bubble's resize corner. * - * @param e Mouse down event. + * @param e Pointer down event. */ - private resizeMouseDown(e: MouseEvent) { + private resizeMouseDown(e: PointerEvent) { this.promote(); Bubble.unbindDragEvents(); if (browserEvents.isRightButton(e)) { @@ -337,20 +337,20 @@ export class Bubble implements IBubble { this.workspace_.RTL ? -this.width : this.width, this.height)); Bubble.onMouseUpWrapper = browserEvents.conditionalBind( - document, 'mouseup', this, Bubble.bubbleMouseUp); + document, 'pointerup', this, Bubble.bubbleMouseUp); Bubble.onMouseMoveWrapper = browserEvents.conditionalBind( - document, 'mousemove', this, this.resizeMouseMove); + document, 'pointermove', this, this.resizeMouseMove); this.workspace_.hideChaff(); // This event has been handled. No need to bubble up to the document. e.stopPropagation(); } /** - * Resize this bubble to follow the mouse. + * Resize this bubble to follow the pointer. * - * @param e Mouse move event. + * @param e Pointer move event. */ - private resizeMouseMove(e: MouseEvent) { + private resizeMouseMove(e: PointerEvent) { this.autoLayout = false; const newXY = this.workspace_.moveDrag(e); this.setBubbleSize(this.workspace_.RTL ? -newXY.x : newXY.x, newXY.y); @@ -847,11 +847,11 @@ export class Bubble implements IBubble { } /** - * Handle a mouse-up event while dragging a bubble's border or resize handle. + * Handle a pointerup event while dragging a bubble's border or resize handle. * - * @param _e Mouse up event. + * @param _e Pointer up event. */ - private static bubbleMouseUp(_e: MouseEvent) { + private static bubbleMouseUp(_e: PointerEvent) { Touch.clearTouchIdentifier(); Bubble.unbindDragEvents(); } diff --git a/core/bubble_dragger.ts b/core/bubble_dragger.ts index 1ac916fc4..edd67655b 100644 --- a/core/bubble_dragger.ts +++ b/core/bubble_dragger.ts @@ -89,7 +89,7 @@ export class BubbleDragger { * at the start of the drag, in pixel units. * @internal */ - dragBubble(e: Event, currentDragDeltaXY: Coordinate) { + dragBubble(e: PointerEvent, currentDragDeltaXY: Coordinate) { const delta = this.pixelsToWorkspaceUnits_(currentDragDeltaXY); const newLoc = Coordinate.sum(this.startXY_, delta); this.bubble.moveDuringDrag(this.dragSurface_, newLoc); @@ -141,12 +141,12 @@ export class BubbleDragger { /** * Finish a bubble drag and put the bubble back on the workspace. * - * @param e The mouseup/touchend event. + * @param e The pointerup event. * @param currentDragDeltaXY How far the pointer has moved from the position * at the start of the drag, in pixel units. * @internal */ - endBubbleDrag(e: Event, currentDragDeltaXY: Coordinate) { + endBubbleDrag(e: PointerEvent, currentDragDeltaXY: Coordinate) { // Make sure internal state is fresh. this.dragBubble(e, currentDragDeltaXY); diff --git a/core/comment.ts b/core/comment.ts index 6b383a8ac..d716aa2f0 100644 --- a/core/comment.ts +++ b/core/comment.ts @@ -149,11 +149,8 @@ export class Comment extends Icon { body.appendChild(textarea); this.foreignObject!.appendChild(body); - // Ideally this would be hooked to the focus event for the comment. - // However doing so in Firefox swallows the cursor for unknown reasons. - // So this is hooked to mouseup instead. No big deal. this.onMouseUpWrapper = browserEvents.conditionalBind( - textarea, 'mouseup', this, this.startEdit, true, true); + textarea, 'focus', this, this.startEdit, true); // Don't zoom with mousewheel. this.onWheelWrapper = browserEvents.conditionalBind( textarea, 'wheel', this, function(e: Event) { @@ -315,7 +312,7 @@ export class Comment extends Icon { * * @param _e Mouse up event. */ - private startEdit(_e: Event) { + private startEdit(_e: PointerEvent) { if (this.bubble_?.promote()) { // Since the act of moving this node within the DOM causes a loss of // focus, we need to reapply the focus. diff --git a/core/dropdowndiv.ts b/core/dropdowndiv.ts index 27e1d160d..a1a254d03 100644 --- a/core/dropdowndiv.ts +++ b/core/dropdowndiv.ts @@ -156,6 +156,13 @@ export function setBoundsElement(boundsElem: Element|null) { boundsElement = boundsElem; } +/** + * @returns The field that currently owns this, or null. + */ +export function getOwner(): Field|null { + return owner; +} + /** * Provide the div for inserting content into the drop-down. * @@ -194,11 +201,12 @@ export function setColour(backgroundColour: string, borderColour: string) { * @param opt_secondaryYOffset Optional Y offset for above-block positioning. * @returns True if the menu rendered below block; false if above. */ -export function showPositionedByBlock( - field: Field, block: BlockSvg, opt_onHide?: Function, +export function showPositionedByBlock( + field: Field, block: BlockSvg, opt_onHide?: Function, opt_secondaryYOffset?: number): boolean { return showPositionedByRect( - getScaledBboxOfBlock(block), field, opt_onHide, opt_secondaryYOffset); + getScaledBboxOfBlock(block), field as Field, opt_onHide, + opt_secondaryYOffset); } /** @@ -212,12 +220,13 @@ export function showPositionedByBlock( * @param opt_secondaryYOffset Optional Y offset for above-block positioning. * @returns True if the menu rendered below block; false if above. */ -export function showPositionedByField( - field: Field, opt_onHide?: Function, +export function showPositionedByField( + field: Field, opt_onHide?: Function, opt_secondaryYOffset?: number): boolean { positionToField = true; return showPositionedByRect( - getScaledBboxOfField(field), field, opt_onHide, opt_secondaryYOffset); + getScaledBboxOfField(field as Field), field as Field, opt_onHide, + opt_secondaryYOffset); } /** * Get the scaled bounding box of a block. @@ -300,10 +309,10 @@ function showPositionedByRect( * @returns True if the menu rendered at the primary origin point. * @internal */ -export function show( - newOwner: Field, rtl: boolean, primaryX: number, primaryY: number, +export function show( + newOwner: Field, rtl: boolean, primaryX: number, primaryY: number, secondaryX: number, secondaryY: number, opt_onHide?: Function): boolean { - owner = newOwner; + owner = newOwner as Field; onHide = opt_onHide || null; // Set direction. div.style.direction = rtl ? 'rtl' : 'ltr'; @@ -540,8 +549,8 @@ export function isVisible(): boolean { * animating. * @returns True if hidden. */ -export function hideIfOwner( - divOwner: Field, opt_withoutAnimation?: boolean): boolean { +export function hideIfOwner( + divOwner: Field, opt_withoutAnimation?: boolean): boolean { if (owner === divOwner) { if (opt_withoutAnimation) { hideWithoutAnimation(); diff --git a/core/events/events.ts b/core/events/events.ts index a2bcc8332..c6ffe276e 100644 --- a/core/events/events.ts +++ b/core/events/events.ts @@ -28,6 +28,16 @@ import {CommentCreate, CommentCreateJson} from './events_comment_create.js'; import {CommentDelete} from './events_comment_delete.js'; import {CommentMove, CommentMoveJson} from './events_comment_move.js'; import {MarkerMove, MarkerMoveJson} from './events_marker_move.js'; +import {ProcedureBase} from './events_procedure_base.js'; +import {ProcedureChangeReturn} from './events_procedure_change_return.js'; +import {ProcedureCreate} from './events_procedure_create.js'; +import {ProcedureDelete} from './events_procedure_delete.js'; +import {ProcedureEnable} from './events_procedure_enable.js'; +import {ProcedureRename} from './events_procedure_rename.js'; +import {ProcedureParameterBase} from './events_procedure_parameter_base.js'; +import {ProcedureParameterCreate} from './events_procedure_parameter_create.js'; +import {ProcedureParameterDelete} from './events_procedure_parameter_delete.js'; +import {ProcedureParameterRename} from './events_procedure_parameter_rename.js'; import {Selected, SelectedJson} from './events_selected.js'; import {ThemeChange, ThemeChangeJson} from './events_theme_change.js'; import {ToolboxItemSelect, ToolboxItemSelectJson} from './events_toolbox_item_select.js'; @@ -77,6 +87,16 @@ export {FinishedLoading}; export {FinishedLoadingJson}; export {MarkerMove}; export {MarkerMoveJson}; +export {ProcedureBase}; +export {ProcedureChangeReturn}; +export {ProcedureCreate}; +export {ProcedureDelete}; +export {ProcedureEnable}; +export {ProcedureRename}; +export {ProcedureParameterBase}; +export {ProcedureParameterCreate}; +export {ProcedureParameterDelete}; +export {ProcedureParameterRename}; export {Selected}; export {SelectedJson}; export {ThemeChange}; diff --git a/core/events/events_abstract.ts b/core/events/events_abstract.ts index 78e4bd8b7..39d01c040 100644 --- a/core/events/events_abstract.ts +++ b/core/events/events_abstract.ts @@ -13,6 +13,7 @@ import * as goog from '../../closure/goog/goog.js'; goog.declareModuleId('Blockly.Events.Abstract'); +import * as deprecation from '../utils/deprecation.js'; import * as common from '../common.js'; import type {Workspace} from '../workspace.js'; @@ -25,7 +26,10 @@ import * as eventUtils from './utils.js'; * @alias Blockly.Events.Abstract */ export abstract class Abstract { - /** Whether or not the event is blank (to be populated by fromJson). */ + /** + * Whether or not the event was constructed without necessary parameters + * (to be populated by fromJson). + */ abstract isBlank: boolean; /** The workspace identifier for this event. */ @@ -74,6 +78,26 @@ export abstract class Abstract { this.group = json['group'] || ''; } + /** + * Deserializes the JSON event. + * + * @param event The event to append new properties to. Should be a subclass + * of Abstract (like all events), but we can't specify that due to the + * fact that parameters to static methods in subclasses must be + * supertypes of parameters to static methods in superclasses. + * @internal + */ + static fromJson(json: AbstractEventJson, workspace: Workspace, event: any): + Abstract { + deprecation.warn( + 'Blockly.Events.Abstract.prototype.fromJson', 'version 9', 'version 10', + 'Blockly.Events.fromJson'); + event.isBlank = false; + event.group = json['group'] || ''; + event.workspaceId = workspace.id; + return event; + } + /** * Does this event record any change of state? * @@ -88,8 +112,10 @@ export abstract class Abstract { * * @param _forward True if run forward, false if run backward (undo). */ - run(_forward: boolean) {} - // Defined by subclasses. + run(_forward: boolean) { + // Defined by subclasses. Cannot be abstract b/c UI events do /not/ define + // this. + } /** * Get workspace the event belongs to. diff --git a/core/events/events_block_base.ts b/core/events/events_block_base.ts index c5bbbe0a3..cd134c516 100644 --- a/core/events/events_block_base.ts +++ b/core/events/events_block_base.ts @@ -13,6 +13,8 @@ import * as goog from '../../closure/goog/goog.js'; goog.declareModuleId('Blockly.Events.BlockBase'); import type {Block} from '../block.js'; +import * as deprecation from '../utils/deprecation.js'; +import type {Workspace} from '../workspace.js'; import {Abstract as AbstractEvent, AbstractEventJson} from './events_abstract.js'; @@ -32,7 +34,7 @@ export class BlockBase extends AbstractEvent { */ constructor(opt_block?: Block) { super(); - this.isBlank = !!opt_block; + this.isBlank = !opt_block; if (!opt_block) return; @@ -48,7 +50,7 @@ export class BlockBase extends AbstractEvent { * * @returns JSON representation. */ - override toJson(): AbstractEventJson { + override toJson(): BlockBaseJson { const json = super.toJson() as BlockBaseJson; if (!this.blockId) { throw new Error( @@ -65,9 +67,29 @@ export class BlockBase extends AbstractEvent { * @param json JSON representation. */ override fromJson(json: BlockBaseJson) { + deprecation.warn( + 'Blockly.Events.BlockBase.prototype.fromJson', 'version 9', + 'version 10', 'Blockly.Events.fromJson'); super.fromJson(json); this.blockId = json['blockId']; } + + /** + * Deserializes the JSON event. + * + * @param event The event to append new properties to. Should be a subclass + * of BlockBase, but we can't specify that due to the fact that parameters + * to static methods in subclasses must be supertypes of parameters to + * static methods in superclasses. + * @internal + */ + static fromJson(json: BlockBaseJson, workspace: Workspace, event?: any): + BlockBase { + const newEvent = + super.fromJson(json, workspace, event ?? new BlockBase()) as BlockBase; + newEvent.blockId = json['blockId']; + return newEvent; + } } export interface BlockBaseJson extends AbstractEventJson { diff --git a/core/events/events_block_change.ts b/core/events/events_block_change.ts index a3cd048a1..e9c34013c 100644 --- a/core/events/events_block_change.ts +++ b/core/events/events_block_change.ts @@ -14,7 +14,9 @@ goog.declareModuleId('Blockly.Events.BlockChange'); import type {Block} from '../block.js'; import type {BlockSvg} from '../block_svg.js'; +import * as deprecation from '../utils/deprecation.js'; import * as registry from '../registry.js'; +import {Workspace} from '../workspace.js'; import * as Xml from '../xml.js'; import {BlockBase, BlockBaseJson} from './events_block_base.js'; @@ -79,6 +81,9 @@ export class BlockChange extends BlockBase { * @param json JSON representation. */ override fromJson(json: BlockChangeJson) { + deprecation.warn( + 'Blockly.Events.BlockChange.prototype.fromJson', 'version 9', + 'version 10', 'Blockly.Events.fromJson'); super.fromJson(json); this.element = json['element']; this.name = json['name']; @@ -86,6 +91,27 @@ export class BlockChange extends BlockBase { this.newValue = json['newValue']; } + /** + * Deserializes the JSON event. + * + * @param event The event to append new properties to. Should be a subclass + * of BlockChange, but we can't specify that due to the fact that + * parameters to static methods in subclasses must be supertypes of + * parameters to static methods in superclasses. + * @internal + */ + static fromJson(json: BlockChangeJson, workspace: Workspace, event?: any): + BlockChange { + const newEvent = + super.fromJson(json, workspace, event ?? new BlockChange()) as + BlockChange; + newEvent.element = json['element']; + newEvent.name = json['name']; + newEvent.oldValue = json['oldValue']; + newEvent.newValue = json['newValue']; + return newEvent; + } + /** * Does this event record any change of state? * diff --git a/core/events/events_block_create.ts b/core/events/events_block_create.ts index 744939a88..4a6ad8232 100644 --- a/core/events/events_block_create.ts +++ b/core/events/events_block_create.ts @@ -13,12 +13,14 @@ import * as goog from '../../closure/goog/goog.js'; goog.declareModuleId('Blockly.Events.BlockCreate'); import type {Block} from '../block.js'; +import * as deprecation from '../utils/deprecation.js'; import * as registry from '../registry.js'; import * as blocks from '../serialization/blocks.js'; import * as Xml from '../xml.js'; import {BlockBase, BlockBaseJson} from './events_block_base.js'; import * as eventUtils from './utils.js'; +import {Workspace} from '../workspace.js'; /** @@ -89,6 +91,9 @@ export class BlockCreate extends BlockBase { * @param json JSON representation. */ override fromJson(json: BlockCreateJson) { + deprecation.warn( + 'Blockly.Events.BlockCreate.prototype.fromJson', 'version 9', + 'version 10', 'Blockly.Events.fromJson'); super.fromJson(json); this.xml = Xml.textToDom(json['xml']); this.ids = json['ids']; @@ -98,6 +103,29 @@ export class BlockCreate extends BlockBase { } } + /** + * Deserializes the JSON event. + * + * @param event The event to append new properties to. Should be a subclass + * of BlockCreate, but we can't specify that due to the fact that + * parameters to static methods in subclasses must be supertypes of + * parameters to static methods in superclasses. + * @internal + */ + static fromJson(json: BlockCreateJson, workspace: Workspace, event?: any): + BlockCreate { + const newEvent = + super.fromJson(json, workspace, event ?? new BlockCreate()) as + BlockCreate; + newEvent.xml = Xml.textToDom(json['xml']); + newEvent.ids = json['ids']; + newEvent.json = json['json'] as blocks.State; + if (json['recordUndo'] !== undefined) { + newEvent.recordUndo = json['recordUndo']; + } + return newEvent; + } + /** * Run a creation event. * diff --git a/core/events/events_block_delete.ts b/core/events/events_block_delete.ts index 6a10ae044..0f5cf56e8 100644 --- a/core/events/events_block_delete.ts +++ b/core/events/events_block_delete.ts @@ -13,12 +13,14 @@ import * as goog from '../../closure/goog/goog.js'; goog.declareModuleId('Blockly.Events.BlockDelete'); import type {Block} from '../block.js'; +import * as deprecation from '../utils/deprecation.js'; import * as registry from '../registry.js'; import * as blocks from '../serialization/blocks.js'; import * as Xml from '../xml.js'; import {BlockBase, BlockBaseJson} from './events_block_base.js'; import * as eventUtils from './utils.js'; +import {Workspace} from '../workspace.js'; /** @@ -103,6 +105,9 @@ export class BlockDelete extends BlockBase { * @param json JSON representation. */ override fromJson(json: BlockDeleteJson) { + deprecation.warn( + 'Blockly.Events.BlockDelete.prototype.fromJson', 'version 9', + 'version 10', 'Blockly.Events.fromJson'); super.fromJson(json); this.oldXml = Xml.textToDom(json['oldXml']); this.ids = json['ids']; @@ -114,6 +119,31 @@ export class BlockDelete extends BlockBase { } } + /** + * Deserializes the JSON event. + * + * @param event The event to append new properties to. Should be a subclass + * of BlockDelete, but we can't specify that due to the fact that + * parameters to static methods in subclasses must be supertypes of + * parameters to static methods in superclasses. + * @internal + */ + static fromJson(json: BlockDeleteJson, workspace: Workspace, event?: any): + BlockDelete { + const newEvent = + super.fromJson(json, workspace, event ?? new BlockDelete()) as + BlockDelete; + newEvent.oldXml = Xml.textToDom(json['oldXml']); + newEvent.ids = json['ids']; + newEvent.wasShadow = + json['wasShadow'] || newEvent.oldXml.tagName.toLowerCase() === 'shadow'; + newEvent.oldJson = json['oldJson']; + if (json['recordUndo'] !== undefined) { + newEvent.recordUndo = json['recordUndo']; + } + return newEvent; + } + /** * Run a deletion event. * diff --git a/core/events/events_block_drag.ts b/core/events/events_block_drag.ts index f45790274..822e5dfce 100644 --- a/core/events/events_block_drag.ts +++ b/core/events/events_block_drag.ts @@ -13,10 +13,12 @@ import * as goog from '../../closure/goog/goog.js'; goog.declareModuleId('Blockly.Events.BlockDrag'); import type {Block} from '../block.js'; +import * as deprecation from '../utils/deprecation.js'; import * as registry from '../registry.js'; import {AbstractEventJson} from './events_abstract.js'; import {UiBase} from './events_ui_base.js'; import * as eventUtils from './utils.js'; +import {Workspace} from '../workspace.js'; /** @@ -83,11 +85,33 @@ export class BlockDrag extends UiBase { * @param json JSON representation. */ override fromJson(json: BlockDragJson) { + deprecation.warn( + 'Blockly.Events.BlockDrag.prototype.fromJson', 'version 9', + 'version 10', 'Blockly.Events.fromJson'); super.fromJson(json); this.isStart = json['isStart']; this.blockId = json['blockId']; this.blocks = json['blocks']; } + + /** + * Deserializes the JSON event. + * + * @param event The event to append new properties to. Should be a subclass + * of BlockDrag, but we can't specify that due to the fact that parameters + * to static methods in subclasses must be supertypes of parameters to + * static methods in superclasses.. + * @internal + */ + static fromJson(json: BlockDragJson, workspace: Workspace, event?: any): + BlockDrag { + const newEvent = + super.fromJson(json, workspace, event ?? new BlockDrag()) as BlockDrag; + newEvent.isStart = json['isStart']; + newEvent.blockId = json['blockId']; + newEvent.blocks = json['blocks']; + return newEvent; + } } export interface BlockDragJson extends AbstractEventJson { diff --git a/core/events/events_block_move.ts b/core/events/events_block_move.ts index 6cddb50dd..2aaffa524 100644 --- a/core/events/events_block_move.ts +++ b/core/events/events_block_move.ts @@ -14,11 +14,13 @@ goog.declareModuleId('Blockly.Events.BlockMove'); import type {Block} from '../block.js'; import {ConnectionType} from '../connection_type.js'; +import * as deprecation from '../utils/deprecation.js'; import * as registry from '../registry.js'; import {Coordinate} from '../utils/coordinate.js'; import {BlockBase, BlockBaseJson} from './events_block_base.js'; import * as eventUtils from './utils.js'; +import type {Workspace} from '../workspace.js'; interface BlockLocation { @@ -68,6 +70,12 @@ export class BlockMove extends BlockBase { */ override toJson(): BlockMoveJson { const json = super.toJson() as BlockMoveJson; + json['oldParentId'] = this.oldParentId; + json['oldInputName'] = this.oldInputName; + if (this.oldCoordinate) { + json['oldCoordinate'] = `${Math.round(this.oldCoordinate.x)}, ` + + `${Math.round(this.oldCoordinate.y)}`; + } json['newParentId'] = this.newParentId; json['newInputName'] = this.newInputName; if (this.newCoordinate) { @@ -86,7 +94,16 @@ export class BlockMove extends BlockBase { * @param json JSON representation. */ override fromJson(json: BlockMoveJson) { + deprecation.warn( + 'Blockly.Events.BlockMove.prototype.fromJson', 'version 9', + 'version 10', 'Blockly.Events.fromJson'); super.fromJson(json); + this.oldParentId = json['oldParentId']; + this.oldInputName = json['oldInputName']; + if (json['oldCoordinate']) { + const xy = json['oldCoordinate'].split(','); + this.oldCoordinate = new Coordinate(Number(xy[0]), Number(xy[1])); + } this.newParentId = json['newParentId']; this.newInputName = json['newInputName']; if (json['newCoordinate']) { @@ -98,6 +115,37 @@ export class BlockMove extends BlockBase { } } + /** + * Deserializes the JSON event. + * + * @param event The event to append new properties to. Should be a subclass + * of BlockMove, but we can't specify that due to the fact that parameters + * to static methods in subclasses must be supertypes of parameters to + * static methods in superclasses. + * @internal + */ + static fromJson(json: BlockMoveJson, workspace: Workspace, event?: any): + BlockMove { + const newEvent = + super.fromJson(json, workspace, event ?? new BlockMove()) as BlockMove; + newEvent.oldParentId = json['oldParentId']; + newEvent.oldInputName = json['oldInputName']; + if (json['oldCoordinate']) { + const xy = json['oldCoordinate'].split(','); + newEvent.oldCoordinate = new Coordinate(Number(xy[0]), Number(xy[1])); + } + newEvent.newParentId = json['newParentId']; + newEvent.newInputName = json['newInputName']; + if (json['newCoordinate']) { + const xy = json['newCoordinate'].split(','); + newEvent.newCoordinate = new Coordinate(Number(xy[0]), Number(xy[1])); + } + if (json['recordUndo'] !== undefined) { + newEvent.recordUndo = json['recordUndo']; + } + return newEvent; + } + /** Record the block's new location. Called after the move. */ recordNew() { const location = this.currentLocation_(); @@ -210,6 +258,9 @@ export class BlockMove extends BlockBase { } export interface BlockMoveJson extends BlockBaseJson { + oldParentId?: string; + oldInputName?: string; + oldCoordinate?: string; newParentId?: string; newInputName?: string; newCoordinate?: string; diff --git a/core/events/events_bubble_open.ts b/core/events/events_bubble_open.ts index b847f2cd7..6e6c26934 100644 --- a/core/events/events_bubble_open.ts +++ b/core/events/events_bubble_open.ts @@ -14,9 +14,11 @@ goog.declareModuleId('Blockly.Events.BubbleOpen'); import type {AbstractEventJson} from './events_abstract.js'; import type {BlockSvg} from '../block_svg.js'; +import * as deprecation from '../utils/deprecation.js'; import * as registry from '../registry.js'; import {UiBase} from './events_ui_base.js'; import * as eventUtils from './utils.js'; +import type {Workspace} from '../workspace.js'; /** @@ -81,11 +83,34 @@ export class BubbleOpen extends UiBase { * @param json JSON representation. */ override fromJson(json: BubbleOpenJson) { + deprecation.warn( + 'Blockly.Events.BubbleOpen.prototype.fromJson', 'version 9', + 'version 10', 'Blockly.Events.fromJson'); super.fromJson(json); this.isOpen = json['isOpen']; this.bubbleType = json['bubbleType']; this.blockId = json['blockId']; } + + /** + * Deserializes the JSON event. + * + * @param event The event to append new properties to. Should be a subclass + * of BubbleOpen, but we can't specify that due to the fact that + * parameters to static methods in subclasses must be supertypes of + * parameters to static methods in superclasses. + * @internal + */ + static fromJson(json: BubbleOpenJson, workspace: Workspace, event?: any): + BubbleOpen { + const newEvent = + super.fromJson(json, workspace, event ?? new BubbleOpen()) as + BubbleOpen; + newEvent.isOpen = json['isOpen']; + newEvent.bubbleType = json['bubbleType']; + newEvent.blockId = json['blockId']; + return newEvent; + } } export enum BubbleType { diff --git a/core/events/events_click.ts b/core/events/events_click.ts index c4c782a06..a5cafd718 100644 --- a/core/events/events_click.ts +++ b/core/events/events_click.ts @@ -13,11 +13,13 @@ import * as goog from '../../closure/goog/goog.js'; goog.declareModuleId('Blockly.Events.Click'); import type {Block} from '../block.js'; +import * as deprecation from '../utils/deprecation.js'; import * as registry from '../registry.js'; import {AbstractEventJson} from './events_abstract.js'; import {UiBase} from './events_ui_base.js'; import * as eventUtils from './utils.js'; +import {Workspace} from '../workspace.js'; /** @@ -77,10 +79,30 @@ export class Click extends UiBase { * @param json JSON representation. */ override fromJson(json: ClickJson) { + deprecation.warn( + 'Blockly.Events.Click.prototype.fromJson', 'version 9', 'version 10', + 'Blockly.Events.fromJson'); super.fromJson(json); this.targetType = json['targetType']; this.blockId = json['blockId']; } + + /** + * Deserializes the JSON event. + * + * @param event The event to append new properties to. Should be a subclass + * of Click, but we can't specify that due to the fact that parameters to + * static methods in subclasses must be supertypes of parameters to + * static methods in superclasses. + * @internal + */ + static fromJson(json: ClickJson, workspace: Workspace, event?: any): Click { + const newEvent = + super.fromJson(json, workspace, event ?? new Click()) as Click; + newEvent.targetType = json['targetType']; + newEvent.blockId = json['blockId']; + return newEvent; + } } export enum ClickTarget { diff --git a/core/events/events_comment_base.ts b/core/events/events_comment_base.ts index 6329e3902..dd681a79d 100644 --- a/core/events/events_comment_base.ts +++ b/core/events/events_comment_base.ts @@ -12,6 +12,7 @@ import * as goog from '../../closure/goog/goog.js'; goog.declareModuleId('Blockly.Events.CommentBase'); +import * as deprecation from '../utils/deprecation.js'; import * as utilsXml from '../utils/xml.js'; import type {WorkspaceComment} from '../workspace_comment.js'; import * as Xml from '../xml.js'; @@ -20,6 +21,7 @@ import {Abstract as AbstractEvent, AbstractEventJson} from './events_abstract.js import type {CommentCreate} from './events_comment_create.js'; import type {CommentDelete} from './events_comment_delete.js'; import * as eventUtils from './utils.js'; +import type {Workspace} from '../workspace.js'; /** @@ -81,10 +83,31 @@ export class CommentBase extends AbstractEvent { * @param json JSON representation. */ override fromJson(json: CommentBaseJson) { + deprecation.warn( + 'Blockly.Events.CommentBase.prototype.fromJson', 'version 9', + 'version 10', 'Blockly.Events.fromJson'); super.fromJson(json); this.commentId = json['commentId']; } + /** + * Deserializes the JSON event. + * + * @param event The event to append new properties to. Should be a subclass + * of CommentBase, but we can't specify that due to the fact that + * parameters to static methods in subclasses must be supertypes of + * parameters to static methods in superclasses. + * @internal + */ + static fromJson(json: CommentBaseJson, workspace: Workspace, event?: any): + CommentBase { + const newEvent = + super.fromJson(json, workspace, event ?? new CommentBase()) as + CommentBase; + newEvent.commentId = json['commentId']; + return newEvent; + } + /** * Helper function for Comment[Create|Delete] * diff --git a/core/events/events_comment_change.ts b/core/events/events_comment_change.ts index 134b23714..f1007ed6c 100644 --- a/core/events/events_comment_change.ts +++ b/core/events/events_comment_change.ts @@ -12,11 +12,13 @@ import * as goog from '../../closure/goog/goog.js'; goog.declareModuleId('Blockly.Events.CommentChange'); +import * as deprecation from '../utils/deprecation.js'; import * as registry from '../registry.js'; import type {WorkspaceComment} from '../workspace_comment.js'; import {CommentBase, CommentBaseJson} from './events_comment_base.js'; import * as eventUtils from './utils.js'; +import type {Workspace} from '../workspace.js'; /** @@ -78,11 +80,33 @@ export class CommentChange extends CommentBase { * @param json JSON representation. */ override fromJson(json: CommentChangeJson) { + deprecation.warn( + 'Blockly.Events.CommentChange.prototype.fromJson', 'version 9', + 'version 10', 'Blockly.Events.fromJson'); super.fromJson(json); this.oldContents_ = json['oldContents']; this.newContents_ = json['newContents']; } + /** + * Deserializes the JSON event. + * + * @param event The event to append new properties to. Should be a subclass + * of CommentChange, but we can't specify that due to the fact that + * parameters to static methods in subclasses must be supertypes of + * parameters to static methods in superclasses. + * @internal + */ + static fromJson(json: CommentChangeJson, workspace: Workspace, event?: any): + CommentChange { + const newEvent = + super.fromJson(json, workspace, event ?? new CommentChange()) as + CommentChange; + newEvent.oldContents_ = json['oldContents']; + newEvent.newContents_ = json['newContents']; + return newEvent; + } + /** * Does this event record any change of state? * diff --git a/core/events/events_comment_create.ts b/core/events/events_comment_create.ts index 384d4cca8..fa54b0e96 100644 --- a/core/events/events_comment_create.ts +++ b/core/events/events_comment_create.ts @@ -12,12 +12,14 @@ import * as goog from '../../closure/goog/goog.js'; goog.declareModuleId('Blockly.Events.CommentCreate'); +import * as deprecation from '../utils/deprecation.js'; import * as registry from '../registry.js'; import type {WorkspaceComment} from '../workspace_comment.js'; import * as Xml from '../xml.js'; import {CommentBase, CommentBaseJson} from './events_comment_base.js'; import * as eventUtils from './utils.js'; +import type {Workspace} from '../workspace.js'; /** @@ -67,10 +69,31 @@ export class CommentCreate extends CommentBase { * @param json JSON representation. */ override fromJson(json: CommentCreateJson) { + deprecation.warn( + 'Blockly.Events.CommentCreate.prototype.fromJson', 'version 9', + 'version 10', 'Blockly.Events.fromJson'); super.fromJson(json); this.xml = Xml.textToDom(json['xml']); } + /** + * Deserializes the JSON event. + * + * @param event The event to append new properties to. Should be a subclass + * of CommentCreate, but we can't specify that due to the fact that + * parameters to static methods in subclasses must be supertypes of + * parameters to static methods in superclasses. + * @internal + */ + static fromJson(json: CommentCreateJson, workspace: Workspace, event?: any): + CommentCreate { + const newEvent = + super.fromJson(json, workspace, event ?? new CommentCreate()) as + CommentCreate; + newEvent.xml = Xml.textToDom(json['xml']); + return newEvent; + } + /** * Run a creation event. * diff --git a/core/events/events_comment_delete.ts b/core/events/events_comment_delete.ts index a2c6fddf0..8ec7b5913 100644 --- a/core/events/events_comment_delete.ts +++ b/core/events/events_comment_delete.ts @@ -15,8 +15,10 @@ goog.declareModuleId('Blockly.Events.CommentDelete'); import * as registry from '../registry.js'; import type {WorkspaceComment} from '../workspace_comment.js'; -import {CommentBase} from './events_comment_base.js'; +import {CommentBase, CommentBaseJson} from './events_comment_base.js'; import * as eventUtils from './utils.js'; +import * as Xml from '../xml.js'; +import type {Workspace} from '../workspace.js'; /** @@ -50,6 +52,44 @@ export class CommentDelete extends CommentBase { override run(forward: boolean) { CommentBase.CommentCreateDeleteHelper(this, !forward); } + + /** + * Encode the event as JSON. + * + * @returns JSON representation. + */ + override toJson(): CommentDeleteJson { + const json = super.toJson() as CommentDeleteJson; + if (!this.xml) { + throw new Error( + 'The comment XML is undefined. Either pass a comment to ' + + 'the constructor, or call fromJson'); + } + json['xml'] = Xml.domToText(this.xml); + return json; + } + + /** + * Deserializes the JSON event. + * + * @param event The event to append new properties to. Should be a subclass + * of CommentDelete, but we can't specify that due to the fact that + * parameters to static methods in subclasses must be supertypes of + * parameters to static methods in superclasses. + * @internal + */ + static fromJson(json: CommentDeleteJson, workspace: Workspace, event?: any): + CommentDelete { + const newEvent = + super.fromJson(json, workspace, event ?? new CommentDelete()) as + CommentDelete; + newEvent.xml = Xml.textToDom(json['xml']); + return newEvent; + } +} + +export interface CommentDeleteJson extends CommentBaseJson { + xml: string; } registry.register( diff --git a/core/events/events_comment_move.ts b/core/events/events_comment_move.ts index b9cd62e1c..e40c48569 100644 --- a/core/events/events_comment_move.ts +++ b/core/events/events_comment_move.ts @@ -12,12 +12,14 @@ import * as goog from '../../closure/goog/goog.js'; goog.declareModuleId('Blockly.Events.CommentMove'); +import * as deprecation from '../utils/deprecation.js'; import * as registry from '../registry.js'; import {Coordinate} from '../utils/coordinate.js'; import type {WorkspaceComment} from '../workspace_comment.js'; import {CommentBase, CommentBaseJson} from './events_comment_base.js'; import * as eventUtils from './utils.js'; +import type {Workspace} from '../workspace.js'; /** @@ -111,6 +113,9 @@ export class CommentMove extends CommentBase { * @param json JSON representation. */ override fromJson(json: CommentMoveJson) { + deprecation.warn( + 'Blockly.Events.CommentMove.prototype.fromJson', 'version 9', + 'version 10', 'Blockly.Events.fromJson'); super.fromJson(json); let xy = json['oldCoordinate'].split(','); this.oldCoordinate_ = new Coordinate(Number(xy[0]), Number(xy[1])); @@ -118,6 +123,27 @@ export class CommentMove extends CommentBase { this.newCoordinate_ = new Coordinate(Number(xy[0]), Number(xy[1])); } + /** + * Deserializes the JSON event. + * + * @param event The event to append new properties to. Should be a subclass + * of CommentMove, but we can't specify that due to the fact that + * parameters to static methods in subclasses must be supertypes of + * parameters to static methods in superclasses. + * @internal + */ + static fromJson(json: CommentMoveJson, workspace: Workspace, event?: any): + CommentMove { + const newEvent = + super.fromJson(json, workspace, event ?? new CommentMove()) as + CommentMove; + let xy = json['oldCoordinate'].split(','); + newEvent.oldCoordinate_ = new Coordinate(Number(xy[0]), Number(xy[1])); + xy = json['newCoordinate'].split(','); + newEvent.newCoordinate_ = new Coordinate(Number(xy[0]), Number(xy[1])); + return newEvent; + } + /** * Does this event record any change of state? * diff --git a/core/events/events_marker_move.ts b/core/events/events_marker_move.ts index c7f3aa071..3639c738b 100644 --- a/core/events/events_marker_move.ts +++ b/core/events/events_marker_move.ts @@ -14,6 +14,7 @@ goog.declareModuleId('Blockly.Events.MarkerMove'); import type {Block} from '../block.js'; import {ASTNode} from '../keyboard_nav/ast_node.js'; +import * as deprecation from '../utils/deprecation.js'; import * as registry from '../registry.js'; import type {Workspace} from '../workspace.js'; import {AbstractEventJson} from './events_abstract.js'; @@ -96,12 +97,36 @@ export class MarkerMove extends UiBase { * @param json JSON representation. */ override fromJson(json: MarkerMoveJson) { + deprecation.warn( + 'Blockly.Events.MarkerMove.prototype.fromJson', 'version 9', + 'version 10', 'Blockly.Events.fromJson'); super.fromJson(json); this.isCursor = json['isCursor']; this.blockId = json['blockId']; this.oldNode = json['oldNode']; this.newNode = json['newNode']; } + + /** + * Deserializes the JSON event. + * + * @param event The event to append new properties to. Should be a subclass + * of MarkerMove, but we can't specify that due to the fact that + * parameters to static methods in subclasses must be supertypes of + * parameters to static methods in superclasses. + * @internal + */ + static fromJson(json: MarkerMoveJson, workspace: Workspace, event?: any): + MarkerMove { + const newEvent = + super.fromJson(json, workspace, event ?? new MarkerMove()) as + MarkerMove; + newEvent.isCursor = json['isCursor']; + newEvent.blockId = json['blockId']; + newEvent.oldNode = json['oldNode']; + newEvent.newNode = json['newNode']; + return newEvent; + } } export interface MarkerMoveJson extends AbstractEventJson { diff --git a/core/events/events_procedure_base.ts b/core/events/events_procedure_base.ts new file mode 100644 index 000000000..1c17db24a --- /dev/null +++ b/core/events/events_procedure_base.ts @@ -0,0 +1,37 @@ +/** + * @license + * Copyright 2022 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +import {Abstract as AbstractEvent, AbstractEventJson} from './events_abstract.js'; +import type {IProcedureModel} from '../interfaces/i_procedure_model.js'; +import type {Workspace} from '../workspace.js'; + + +/** + * The base event for an event associated with a procedure. + */ +export abstract class ProcedureBase extends AbstractEvent { + isBlank = false; + + constructor(workspace: Workspace, public readonly model: IProcedureModel) { + super(); + this.workspaceId = workspace.id; + } + + /** + * Encode the event as JSON. + * + * @returns JSON representation. + */ + toJson(): ProcedureBaseJson { + const json = super.toJson() as ProcedureBaseJson; + json['procedureId'] = this.model.getId(); + return json; + } +} + +export interface ProcedureBaseJson extends AbstractEventJson { + procedureId: string; +} diff --git a/core/events/events_procedure_change_return.ts b/core/events/events_procedure_change_return.ts new file mode 100644 index 000000000..a6e3c6be7 --- /dev/null +++ b/core/events/events_procedure_change_return.ts @@ -0,0 +1,87 @@ + +/** + * @license + * Copyright 2022 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +import type {IProcedureModel} from '../interfaces/i_procedure_model.js'; +import * as registry from '../registry.js'; +import type {Workspace} from '../workspace.js'; + +import {ProcedureBase, ProcedureBaseJson} from './events_procedure_base.js'; +import * as eventUtils from './utils.js'; + + +/** + * Represents a procedure's return type/status changing. + */ +export class ProcedureChangeReturn extends ProcedureBase { + /** A string used to check the type of the event. */ + type = eventUtils.PROCEDURE_CHANGE_RETURN; + + /** The new type(s) the procedure's return has been set to. */ + private newTypes: string[]|null; + + /** + * @param oldTypes The type(s) the procedure's return was set to before it + * changed. + */ + constructor( + workpace: Workspace, model: IProcedureModel, + public readonly oldTypes: string[]|null) { + super(workpace, model); + + this.newTypes = model.getReturnTypes(); + } + + run(forward: boolean) { + const procedureModel = + this.getEventWorkspace_().getProcedureMap().get(this.model.getId()); + if (!procedureModel) { + throw new Error( + 'Cannot change the type of a procedure that does not exist ' + + 'in the procedure map'); + } + if (forward) { + procedureModel.setReturnTypes(this.newTypes); + } else { + procedureModel.setReturnTypes(this.oldTypes); + } + } + + /** + * Encode the event as JSON. + * + * @returns JSON representation. + */ + toJson(): ProcedureChangeReturnJson { + const json = super.toJson() as ProcedureChangeReturnJson; + json['oldTypes'] = this.oldTypes; + return json; + } + + /** + * Deserializes the JSON event. + * + * @internal + */ + static fromJson(json: ProcedureChangeReturnJson, workspace: Workspace): + ProcedureChangeReturn { + const model = workspace.getProcedureMap().get(json['procedureId']); + if (!model) { + throw new Error( + 'Cannot deserialize procedure change return event because the ' + + 'target procedure does not exist'); + } + return new ProcedureChangeReturn(workspace, model, json['oldTypes']); + } +} + +export interface ProcedureChangeReturnJson extends ProcedureBaseJson { + oldTypes: string[]|null; +} + +registry.register( + registry.Type.EVENT, eventUtils.PROCEDURE_CHANGE_RETURN, + ProcedureChangeReturn); diff --git a/core/events/events_procedure_create.ts b/core/events/events_procedure_create.ts new file mode 100644 index 000000000..ddccfb983 --- /dev/null +++ b/core/events/events_procedure_create.ts @@ -0,0 +1,74 @@ +/** + * @license + * Copyright 2022 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +import type {IProcedureModel} from '../interfaces/i_procedure_model.js'; +import {ObservableParameterModel, ObservableProcedureModel} from '../procedures.js'; +import * as registry from '../registry.js'; +import {loadProcedure, saveProcedure, State as ProcedureState} from '../serialization/procedures.js'; +import type {Workspace} from '../workspace.js'; + +import {ProcedureBase, ProcedureBaseJson} from './events_procedure_base.js'; +import * as eventUtils from './utils.js'; + + +/** + * Represents a procedure data model being created. + */ +export class ProcedureCreate extends ProcedureBase { + /** A string used to check the type of the event. */ + type = eventUtils.PROCEDURE_CREATE; + + constructor(workspace: Workspace, model: IProcedureModel) { + super(workspace, model); + } + + run(forward: boolean) { + const workspace = this.getEventWorkspace_(); + const procedureMap = workspace.getProcedureMap(); + const procedureModel = procedureMap.get(this.model.getId()); + if (forward) { + if (procedureModel) return; + // TODO: This should add the model to the map instead of creating a dupe. + procedureMap.add(new ObservableProcedureModel( + workspace, this.model.getName(), this.model.getId())); + } else { + if (!procedureModel) return; + procedureMap.delete(this.model.getId()); + } + } + + /** + * Encode the event as JSON. + * + * @returns JSON representation. + */ + toJson(): ProcedureCreateJson { + const json = super.toJson() as ProcedureCreateJson; + json['model'] = saveProcedure(this.model); + return json; + } + + /** + * Deserializes the JSON event. + * + * @internal + */ + static fromJson(json: ProcedureCreateJson, workspace: Workspace): + ProcedureCreate { + return new ProcedureCreate( + workspace, + loadProcedure( + ObservableProcedureModel, ObservableParameterModel, json['model'], + workspace)); + } +} + +export interface ProcedureCreateJson extends ProcedureBaseJson { + model: ProcedureState, +} + +registry.register( + registry.Type.EVENT, eventUtils.PROCEDURE_CREATE, ProcedureCreate); diff --git a/core/events/events_procedure_delete.ts b/core/events/events_procedure_delete.ts new file mode 100644 index 000000000..e7555aeba --- /dev/null +++ b/core/events/events_procedure_delete.ts @@ -0,0 +1,71 @@ + +/** + * @license + * Copyright 2022 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +import type {IProcedureModel} from '../interfaces/i_procedure_model.js'; +import {ObservableProcedureModel} from '../procedures.js'; +import * as registry from '../registry.js'; +import type {Workspace} from '../workspace.js'; + +import {ProcedureBase, ProcedureBaseJson} from './events_procedure_base.js'; +import * as eventUtils from './utils.js'; + + +/** + * Represents a procedure data model being deleted. + */ +export class ProcedureDelete extends ProcedureBase { + /** A string used to check the type of the event. */ + type = eventUtils.PROCEDURE_DELETE; + + constructor(workspace: Workspace, model: IProcedureModel) { + super(workspace, model); + } + + run(forward: boolean) { + const workspace = this.getEventWorkspace_(); + const procedureMap = workspace.getProcedureMap(); + const procedureModel = procedureMap.get(this.model.getId()); + if (forward) { + if (!procedureModel) return; + procedureMap.delete(this.model.getId()); + } else { + if (procedureModel) return; + procedureMap.add(new ObservableProcedureModel( + workspace, this.model.getName(), this.model.getId())); + } + } + + /** + * Encode the event as JSON. + * + * @returns JSON representation. + */ + toJson(): ProcedureDeleteJson { + return super.toJson() as ProcedureDeleteJson; + } + + /** + * Deserializes the JSON event. + * + * @internal + */ + static fromJson(json: ProcedureDeleteJson, workspace: Workspace): + ProcedureDelete { + const model = workspace.getProcedureMap().get(json['procedureId']); + if (!model) { + throw new Error( + 'Cannot deserialize procedure delete event because the ' + + 'target procedure does not exist'); + } + return new ProcedureDelete(workspace, model); + } +} + +export interface ProcedureDeleteJson extends ProcedureBaseJson {} + +registry.register( + registry.Type.EVENT, eventUtils.PROCEDURE_DELETE, ProcedureDelete); diff --git a/core/events/events_procedure_enable.ts b/core/events/events_procedure_enable.ts new file mode 100644 index 000000000..3ae52e93f --- /dev/null +++ b/core/events/events_procedure_enable.ts @@ -0,0 +1,76 @@ + +/** + * @license + * Copyright 2022 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +import type {IProcedureModel} from '../interfaces/i_procedure_model.js'; +import * as registry from '../registry.js'; +import type {Workspace} from '../workspace.js'; + +import {ProcedureBase, ProcedureBaseJson} from './events_procedure_base.js'; +import * as eventUtils from './utils.js'; + +/** + * Represents a procedure data model being enabled or disabled. + */ +export class ProcedureEnable extends ProcedureBase { + /** A string used to check the type of the event. */ + type = eventUtils.PROCEDURE_ENABLE; + + private oldState: boolean; + private newState: boolean; + + constructor(workspace: Workspace, model: IProcedureModel) { + super(workspace, model); + + this.oldState = !model.getEnabled(); + this.newState = model.getEnabled(); + } + + run(forward: boolean) { + const procedureModel = + this.getEventWorkspace_().getProcedureMap().get(this.model.getId()); + if (!procedureModel) { + throw new Error( + 'Cannot change the enabled state of a procedure that does not ' + + 'exist in the procedure map'); + } + if (forward) { + procedureModel.setEnabled(this.newState); + } else { + procedureModel.setEnabled(this.oldState); + } + } + + /** + * Encode the event as JSON. + * + * @returns JSON representation. + */ + toJson(): ProcedureEnableJson { + return super.toJson() as ProcedureEnableJson; + } + + /** + * Deserializes the JSON event. + * + * @internal + */ + static fromJson(json: ProcedureEnableJson, workspace: Workspace): + ProcedureEnable { + const model = workspace.getProcedureMap().get(json['procedureId']); + if (!model) { + throw new Error( + 'Cannot deserialize procedure enable event because the ' + + 'target procedure does not exist'); + } + return new ProcedureEnable(workspace, model); + } +} + +export interface ProcedureEnableJson extends ProcedureBaseJson {} + +registry.register( + registry.Type.EVENT, eventUtils.PROCEDURE_ENABLE, ProcedureEnable); diff --git a/core/events/events_procedure_parameter_base.ts b/core/events/events_procedure_parameter_base.ts new file mode 100644 index 000000000..1bbfb2429 --- /dev/null +++ b/core/events/events_procedure_parameter_base.ts @@ -0,0 +1,39 @@ + +/** + * @license + * Copyright 2022 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +import {IParameterModel} from '../interfaces/i_parameter_model.js'; +import {IProcedureModel} from '../interfaces/i_procedure_model.js'; + +import {ProcedureBase, ProcedureBaseJson} from './events_procedure_base.js'; + +import type {Workspace} from '../workspace.js'; + +/** + * The base event for an event associated with a procedure parameter. + */ +export abstract class ProcedureParameterBase extends ProcedureBase { + constructor( + workspace: Workspace, model: IProcedureModel, + public readonly parameter: IParameterModel) { + super(workspace, model); + } + + /** + * Encode the event as JSON. + * + * @returns JSON representation. + */ + toJson(): ProcedureParameterBaseJson { + const json = super.toJson() as ProcedureParameterBaseJson; + json['parameterId'] = this.model.getId(); + return json; + } +} + +export interface ProcedureParameterBaseJson extends ProcedureBaseJson { + parameterId: string, +} diff --git a/core/events/events_procedure_parameter_create.ts b/core/events/events_procedure_parameter_create.ts new file mode 100644 index 000000000..1271effc3 --- /dev/null +++ b/core/events/events_procedure_parameter_create.ts @@ -0,0 +1,101 @@ +/** + * @license + * Copyright 2022 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +import type {IParameterModel} from '../interfaces/i_parameter_model.js'; +import type {IProcedureModel} from '../interfaces/i_procedure_model.js'; +import {ObservableParameterModel} from '../procedures/observable_parameter_model.js'; +import * as registry from '../registry.js'; +import {loadParameter, ParameterState, saveParameter} from '../serialization/procedures.js'; +import type {Workspace} from '../workspace.js'; + +import {ProcedureParameterBase, ProcedureParameterBaseJson} from './events_procedure_parameter_base.js'; +import * as eventUtils from './utils.js'; + + +/** + * Represents a parameter being added to a procedure. + */ +export class ProcedureParameterCreate extends ProcedureParameterBase { + /** A string used to check the type of the event. */ + type = eventUtils.PROCEDURE_PARAMETER_CREATE; + + /** + * @param parameter The parameter model that was just added to the procedure. + * @param index The index the parameter was inserted at. + */ + constructor( + workspace: Workspace, procedure: IProcedureModel, + parameter: IParameterModel, public readonly index: number) { + super(workspace, procedure, parameter); + } + + run(forward: boolean) { + const workspace = this.getEventWorkspace_(); + const procedureMap = workspace.getProcedureMap(); + const procedureModel = procedureMap.get(this.model.getId()); + if (!procedureModel) { + throw new Error( + 'Cannot add a parameter to a procedure that does not exist ' + + 'in the procedure map'); + } + const parameterModel = procedureModel.getParameter(this.index); + if (forward) { + if (this.parameterMatches(parameterModel)) return; + // TODO: This should just add the parameter instead of creating a dupe. + procedureModel.insertParameter( + new ObservableParameterModel( + workspace, this.parameter.getName(), this.parameter.getId()), + this.index); + } else { + if (!this.parameterMatches(parameterModel)) return; + procedureModel.deleteParameter(this.index); + } + } + + parameterMatches(param: IParameterModel) { + return param && param.getId() === this.parameter.getId(); + } + + /** + * Encode the event as JSON. + * + * @returns JSON representation. + */ + toJson(): ProcedureParameterCreateJson { + const json = super.toJson() as ProcedureParameterCreateJson; + json['parameter'] = saveParameter(this.parameter); + json['index'] = this.index; + return json; + } + + /** + * Deserializes the JSON event. + * + * @internal + */ + static fromJson(json: ProcedureParameterCreateJson, workspace: Workspace): + ProcedureParameterCreate { + const procedure = workspace.getProcedureMap().get(json['procedureId']); + if (!procedure) { + throw new Error( + 'Cannot deserialize parameter create event because the ' + + 'target procedure does not exist'); + } + return new ProcedureParameterCreate( + workspace, procedure, + loadParameter(ObservableParameterModel, json['parameter'], workspace), + json['index']); + } +} + +export interface ProcedureParameterCreateJson extends + ProcedureParameterBaseJson { + parameter: ParameterState, index: number, +} + +registry.register( + registry.Type.EVENT, eventUtils.PROCEDURE_PARAMETER_CREATE, + ProcedureParameterCreate); diff --git a/core/events/events_procedure_parameter_delete.ts b/core/events/events_procedure_parameter_delete.ts new file mode 100644 index 000000000..4ee43bb0b --- /dev/null +++ b/core/events/events_procedure_parameter_delete.ts @@ -0,0 +1,97 @@ +/** + * @license + * Copyright 2022 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +import type {IParameterModel} from '../interfaces/i_parameter_model.js'; +import type {IProcedureModel} from '../interfaces/i_procedure_model.js'; +import {ObservableParameterModel} from '../procedures/observable_parameter_model.js'; +import * as registry from '../registry.js'; +import type {Workspace} from '../workspace.js'; + +import {ProcedureParameterBase, ProcedureParameterBaseJson} from './events_procedure_parameter_base.js'; +import * as eventUtils from './utils.js'; + +/** + * Represents a parameter being removed from a procedure. + */ +export class ProcedureParameterDelete extends ProcedureParameterBase { + /** A string used to check the type of the event. */ + type = eventUtils.PROCEDURE_PARAMETER_DELETE; + + /** + * @param parameter The parameter model that was just removed from the + * procedure. + * @param index The index the parameter was at before it was removed. + */ + constructor( + workspace: Workspace, procedure: IProcedureModel, + parameter: IParameterModel, public readonly index: number) { + super(workspace, procedure, parameter); + } + + run(forward: boolean) { + const workspace = this.getEventWorkspace_(); + const procedureMap = workspace.getProcedureMap(); + const procedureModel = procedureMap.get(this.model.getId()); + if (!procedureModel) { + throw new Error( + 'Cannot add a parameter to a procedure that does not exist ' + + 'in the procedure map'); + } + const parameterModel = procedureModel.getParameter(this.index); + if (forward) { + if (!this.parameterMatches(parameterModel)) return; + procedureModel.deleteParameter(this.index); + } else { + if (this.parameterMatches(parameterModel)) return; + // TODO: this should just insert the model instead of creating a dupe. + procedureModel.insertParameter( + new ObservableParameterModel( + workspace, this.parameter.getName(), this.parameter.getId()), + this.index); + } + } + + parameterMatches(param: IParameterModel) { + return param && param.getId() === this.parameter.getId(); + } + + /** + * Encode the event as JSON. + * + * @returns JSON representation. + */ + toJson(): ProcedureParameterDeleteJson { + const json = super.toJson() as ProcedureParameterDeleteJson; + json['index'] = this.index; + return json; + } + + /** + * Deserializes the JSON event. + * + * @internal + */ + static fromJson(json: ProcedureParameterDeleteJson, workspace: Workspace): + ProcedureParameterDelete { + const model = workspace.getProcedureMap().get(json['procedureId']); + if (!model) { + throw new Error( + 'Cannot deserialize procedure delete event because the ' + + 'target procedure does not exist'); + } + const param = model.getParameter(json['index']); + return new ProcedureParameterDelete(workspace, model, param, json['index']); + } +} + +export interface ProcedureParameterDeleteJson extends + ProcedureParameterBaseJson { + index: number; +} + +registry.register( + registry.Type.EVENT, eventUtils.PROCEDURE_PARAMETER_DELETE, + ProcedureParameterDelete); diff --git a/core/events/events_procedure_parameter_rename.ts b/core/events/events_procedure_parameter_rename.ts new file mode 100644 index 000000000..9baafc11b --- /dev/null +++ b/core/events/events_procedure_parameter_rename.ts @@ -0,0 +1,102 @@ +/** + * @license + * Copyright 2022 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +import type {IParameterModel} from '../interfaces/i_parameter_model.js'; +import type {IProcedureModel} from '../interfaces/i_procedure_model.js'; +import * as registry from '../registry.js'; +import type {Workspace} from '../workspace.js'; + +import {ProcedureParameterBase, ProcedureParameterBaseJson} from './events_procedure_parameter_base.js'; +import * as eventUtils from './utils.js'; + +/** + * Represents a parameter of a procedure being renamed. + */ +export class ProcedureParameterRename extends ProcedureParameterBase { + /** A string used to check the type of the event. */ + type = eventUtils.PROCEDURE_PARAMETER_RENAME; + private readonly newName: string; + + constructor( + workspace: Workspace, procedure: IProcedureModel, + parameter: IParameterModel, public readonly oldName: string) { + super(workspace, procedure, parameter); + + this.newName = parameter.getName(); + } + + run(forward: boolean) { + const parameterModel = findMatchingParameter( + this.getEventWorkspace_(), this.model.getId(), this.parameter.getId()); + if (!parameterModel) { + throw new Error( + 'Cannot rename a parameter that does not exist ' + + 'in the procedure map'); + } + if (forward) { + parameterModel.setName(this.newName); + } else { + parameterModel.setName(this.oldName); + } + } + + /** + * Encode the event as JSON. + * + * @returns JSON representation. + */ + toJson(): ProcedureParameterRenameJson { + const json = super.toJson() as ProcedureParameterRenameJson; + json['oldName'] = this.oldName; + return json; + } + + /** + * Deserializes the JSON event. + * + * @internal + */ + static fromJson(json: ProcedureParameterRenameJson, workspace: Workspace): + ProcedureParameterRename { + const model = workspace.getProcedureMap().get(json['procedureId']); + if (!model) { + throw new Error( + 'Cannot deserialize procedure delete event because the ' + + 'target procedure does not exist'); + } + const param = findMatchingParameter( + workspace, json['procedureId'], json['parameterId']); + if (!param) { + throw new Error( + 'Cannot deserialize parameter rename event because the ' + + 'target parameter does not exist'); + } + return new ProcedureParameterRename( + workspace, model, param, json['oldName']); + } +} + +function findMatchingParameter( + workspace: Workspace, modelId: string, paramId: string): IParameterModel| + undefined { + const procedureModel = workspace.getProcedureMap().get(modelId); + if (!procedureModel) { + throw new Error( + 'Cannot rename the parameter of a procedure that does not exist ' + + 'in the procedure map'); + } + return procedureModel.getParameters().find((p) => p.getId() === paramId); +} + + +export interface ProcedureParameterRenameJson extends + ProcedureParameterBaseJson { + oldName: string; +} + +registry.register( + registry.Type.EVENT, eventUtils.PROCEDURE_PARAMETER_RENAME, + ProcedureParameterRename); diff --git a/core/events/events_procedure_rename.ts b/core/events/events_procedure_rename.ts new file mode 100644 index 000000000..0b849d771 --- /dev/null +++ b/core/events/events_procedure_rename.ts @@ -0,0 +1,78 @@ +/** + * @license + * Copyright 2022 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +import type {IProcedureModel} from '../interfaces/i_procedure_model.js'; +import * as registry from '../registry.js'; +import type {Workspace} from '../workspace.js'; + +import {ProcedureBase, ProcedureBaseJson} from './events_procedure_base.js'; +import * as eventUtils from './utils.js'; + +/** + * Represents a procedure being renamed. + */ +export class ProcedureRename extends ProcedureBase { + /** A string used to check the type of the event. */ + type = eventUtils.PROCEDURE_RENAME; + private newName: string; + + constructor( + workspace: Workspace, model: IProcedureModel, + public readonly oldName: string) { + super(workspace, model); + + this.newName = model.getName(); + } + + run(forward: boolean) { + const procedureModel = + this.getEventWorkspace_().getProcedureMap().get(this.model.getId()); + if (!procedureModel) { + throw new Error( + 'Cannot change the type of a procedure that does not exist ' + + 'in the procedure map'); + } + if (forward) { + procedureModel.setName(this.newName); + } else { + procedureModel.setName(this.oldName); + } + } + + /** + * Encode the event as JSON. + * + * @returns JSON representation. + */ + toJson(): ProcedureRenameJson { + const json = super.toJson() as ProcedureRenameJson; + json['oldName'] = this.oldName; + return json; + } + + /** + * Deserializes the JSON event. + * + * @internal + */ + static fromJson(json: ProcedureRenameJson, workspace: Workspace): + ProcedureRename { + const model = workspace.getProcedureMap().get(json['procedureId']); + if (!model) { + throw new Error( + 'Cannot deserialize procedure rename event because the ' + + 'target procedure does not exist'); + } + return new ProcedureRename(workspace, model, json['oldName']); + } +} + +export interface ProcedureRenameJson extends ProcedureBaseJson { + oldName: string; +} + +registry.register( + registry.Type.EVENT, eventUtils.PROCEDURE_RENAME, ProcedureRename); diff --git a/core/events/events_selected.ts b/core/events/events_selected.ts index 1e596a1ae..347bdb22a 100644 --- a/core/events/events_selected.ts +++ b/core/events/events_selected.ts @@ -12,11 +12,13 @@ import * as goog from '../../closure/goog/goog.js'; goog.declareModuleId('Blockly.Events.Selected'); +import * as deprecation from '../utils/deprecation.js'; import * as registry from '../registry.js'; import {AbstractEventJson} from './events_abstract.js'; import {UiBase} from './events_ui_base.js'; import * as eventUtils from './utils.js'; +import type {Workspace} from '../workspace.js'; /** @@ -67,10 +69,31 @@ export class Selected extends UiBase { * @param json JSON representation. */ override fromJson(json: SelectedJson) { + deprecation.warn( + 'Blockly.Events.Selected.prototype.fromJson', 'version 9', 'version 10', + 'Blockly.Events.fromJson'); super.fromJson(json); this.oldElementId = json['oldElementId']; this.newElementId = json['newElementId']; } + + /** + * Deserializes the JSON event. + * + * @param event The event to append new properties to. Should be a subclass + * of Selected, but we can't specify that due to the fact that parameters + * to static methods in subclasses must be supertypes of parameters to + * static methods in superclasses. + * @internal + */ + static fromJson(json: SelectedJson, workspace: Workspace, event?: any): + Selected { + const newEvent = + super.fromJson(json, workspace, event ?? new Selected()) as Selected; + newEvent.oldElementId = json['oldElementId']; + newEvent.newElementId = json['newElementId']; + return newEvent; + } } export interface SelectedJson extends AbstractEventJson { diff --git a/core/events/events_theme_change.ts b/core/events/events_theme_change.ts index 7c47bd58e..75c5641e2 100644 --- a/core/events/events_theme_change.ts +++ b/core/events/events_theme_change.ts @@ -12,10 +12,12 @@ import * as goog from '../../closure/goog/goog.js'; goog.declareModuleId('Blockly.Events.ThemeChange'); +import * as deprecation from '../utils/deprecation.js'; import * as registry from '../registry.js'; import {AbstractEventJson} from './events_abstract.js'; import {UiBase} from './events_ui_base.js'; import * as eventUtils from './utils.js'; +import type {Workspace} from '../workspace.js'; /** @@ -61,9 +63,30 @@ export class ThemeChange extends UiBase { * @param json JSON representation. */ override fromJson(json: ThemeChangeJson) { + deprecation.warn( + 'Blockly.Events.ThemeChange.prototype.fromJson', 'version 9', + 'version 10', 'Blockly.Events.fromJson'); super.fromJson(json); this.themeName = json['themeName']; } + + /** + * Deserializes the JSON event. + * + * @param event The event to append new properties to. Should be a subclass + * of ThemeChange, but we can't specify that due to the fact that + * parameters to static methods in subclasses must be supertypes of + * parameters to static methods in superclasses. + * @internal + */ + static fromJson(json: ThemeChangeJson, workspace: Workspace, event?: any): + ThemeChange { + const newEvent = + super.fromJson(json, workspace, event ?? new ThemeChange()) as + ThemeChange; + newEvent.themeName = json['themeName']; + return newEvent; + } } export interface ThemeChangeJson extends AbstractEventJson { diff --git a/core/events/events_toolbox_item_select.ts b/core/events/events_toolbox_item_select.ts index 39a13eefc..81e8a7eda 100644 --- a/core/events/events_toolbox_item_select.ts +++ b/core/events/events_toolbox_item_select.ts @@ -12,10 +12,12 @@ import * as goog from '../../closure/goog/goog.js'; goog.declareModuleId('Blockly.Events.ToolboxItemSelect'); +import * as deprecation from '../utils/deprecation.js'; import * as registry from '../registry.js'; import {AbstractEventJson} from './events_abstract.js'; import {UiBase} from './events_ui_base.js'; import * as eventUtils from './utils.js'; +import type {Workspace} from '../workspace.js'; /** @@ -66,10 +68,33 @@ export class ToolboxItemSelect extends UiBase { * @param json JSON representation. */ override fromJson(json: ToolboxItemSelectJson) { + deprecation.warn( + 'Blockly.Events.ToolboxItemSelect.prototype.fromJson', 'version 9', + 'version 10', 'Blockly.Events.fromJson'); super.fromJson(json); this.oldItem = json['oldItem']; this.newItem = json['newItem']; } + + /** + * Deserializes the JSON event. + * + * @param event The event to append new properties to. Should be a subclass + * of ToolboxItemSelect, but we can't specify that due to the fact that + * parameters to static methods in subclasses must be supertypes of + * parameters to static methods in superclasses. + * @internal + */ + static fromJson( + json: ToolboxItemSelectJson, workspace: Workspace, + event?: any): ToolboxItemSelect { + const newEvent = + super.fromJson(json, workspace, event ?? new ToolboxItemSelect()) as + ToolboxItemSelect; + newEvent.oldItem = json['oldItem']; + newEvent.newItem = json['newItem']; + return newEvent; + } } export interface ToolboxItemSelectJson extends AbstractEventJson { diff --git a/core/events/events_trashcan_open.ts b/core/events/events_trashcan_open.ts index ff1e209af..fd6001dfd 100644 --- a/core/events/events_trashcan_open.ts +++ b/core/events/events_trashcan_open.ts @@ -12,11 +12,13 @@ import * as goog from '../../closure/goog/goog.js'; goog.declareModuleId('Blockly.Events.TrashcanOpen'); +import * as deprecation from '../utils/deprecation.js'; import * as registry from '../registry.js'; import {AbstractEventJson} from './events_abstract.js'; import {UiBase} from './events_ui_base.js'; import * as eventUtils from './utils.js'; +import type {Workspace} from '../workspace.js'; /** @@ -63,9 +65,30 @@ export class TrashcanOpen extends UiBase { * @param json JSON representation. */ override fromJson(json: TrashcanOpenJson) { + deprecation.warn( + 'Blockly.Events.TrashcanOpen.prototype.fromJson', 'version 9', + 'version 10', 'Blockly.Events.fromJson'); super.fromJson(json); this.isOpen = json['isOpen']; } + + /** + * Deserializes the JSON event. + * + * @param event The event to append new properties to. Should be a subclass + * of TrashcanOpen, but we can't specify that due to the fact that + * parameters to static methods in subclasses must be supertypes of + * parameters to static methods in superclasses. + * @internal + */ + static fromJson(json: TrashcanOpenJson, workspace: Workspace, event?: any): + TrashcanOpen { + const newEvent = + super.fromJson(json, workspace, event ?? new TrashcanOpen()) as + TrashcanOpen; + newEvent.isOpen = json['isOpen']; + return newEvent; + } } export interface TrashcanOpenJson extends AbstractEventJson { diff --git a/core/events/events_var_base.ts b/core/events/events_var_base.ts index e16426638..41370702d 100644 --- a/core/events/events_var_base.ts +++ b/core/events/events_var_base.ts @@ -12,9 +12,11 @@ import * as goog from '../../closure/goog/goog.js'; goog.declareModuleId('Blockly.Events.VarBase'); +import * as deprecation from '../utils/deprecation.js'; import type {VariableModel} from '../variable_model.js'; import {Abstract as AbstractEvent, AbstractEventJson} from './events_abstract.js'; +import type {Workspace} from '../workspace.js'; /** @@ -64,9 +66,29 @@ export class VarBase extends AbstractEvent { * @param json JSON representation. */ override fromJson(json: VarBaseJson) { + deprecation.warn( + 'Blockly.Events.VarBase.prototype.fromJson', 'version 9', 'version 10', + 'Blockly.Events.fromJson'); super.fromJson(json); this.varId = json['varId']; } + + /** + * Deserializes the JSON event. + * + * @param event The event to append new properties to. Should be a subclass + * of VarBase, but we can't specify that due to the fact that parameters + * to static methods in subclasses must be supertypes of parameters to + * static methods in superclasses. + * @internal + */ + static fromJson(json: VarBaseJson, workspace: Workspace, event?: any): + VarBase { + const newEvent = + super.fromJson(json, workspace, event ?? new VarBase()) as VarBase; + newEvent.varId = json['varId']; + return newEvent; + } } export interface VarBaseJson extends AbstractEventJson { diff --git a/core/events/events_var_create.ts b/core/events/events_var_create.ts index 326d6c301..925071c59 100644 --- a/core/events/events_var_create.ts +++ b/core/events/events_var_create.ts @@ -12,11 +12,13 @@ import * as goog from '../../closure/goog/goog.js'; goog.declareModuleId('Blockly.Events.VarCreate'); +import * as deprecation from '../utils/deprecation.js'; import * as registry from '../registry.js'; import type {VariableModel} from '../variable_model.js'; import {VarBase, VarBaseJson} from './events_var_base.js'; import * as eventUtils from './utils.js'; +import type {Workspace} from '../workspace.js'; /** @@ -70,11 +72,32 @@ export class VarCreate extends VarBase { * @param json JSON representation. */ override fromJson(json: VarCreateJson) { + deprecation.warn( + 'Blockly.Events.VarCreate.prototype.fromJson', 'version 9', + 'version 10', 'Blockly.Events.fromJson'); super.fromJson(json); this.varType = json['varType']; this.varName = json['varName']; } + /** + * Deserializes the JSON event. + * + * @param event The event to append new properties to. Should be a subclass + * of VarCreate, but we can't specify that due to the fact that parameters + * to static methods in subclasses must be supertypes of parameters to + * static methods in superclasses. + * @internal + */ + static fromJson(json: VarCreateJson, workspace: Workspace, event?: any): + VarCreate { + const newEvent = + super.fromJson(json, workspace, event ?? new VarCreate()) as VarCreate; + newEvent.varType = json['varType']; + newEvent.varName = json['varName']; + return newEvent; + } + /** * Run a variable creation event. * diff --git a/core/events/events_var_delete.ts b/core/events/events_var_delete.ts index a8960ddd5..ca9e2de97 100644 --- a/core/events/events_var_delete.ts +++ b/core/events/events_var_delete.ts @@ -12,11 +12,13 @@ import * as goog from '../../closure/goog/goog.js'; goog.declareModuleId('Blockly.Events.VarDelete'); +import * as deprecation from '../utils/deprecation.js'; import * as registry from '../registry.js'; import type {VariableModel} from '../variable_model.js'; import {VarBase, VarBaseJson} from './events_var_base.js'; import * as eventUtils from './utils.js'; +import type {Workspace} from '../workspace.js'; /** @@ -70,11 +72,32 @@ export class VarDelete extends VarBase { * @param json JSON representation. */ override fromJson(json: VarDeleteJson) { + deprecation.warn( + 'Blockly.Events.VarDelete.prototype.fromJson', 'version 9', + 'version 10', 'Blockly.Events.fromJson'); super.fromJson(json); this.varType = json['varType']; this.varName = json['varName']; } + /** + * Deserializes the JSON event. + * + * @param event The event to append new properties to. Should be a subclass + * of VarDelete, but we can't specify that due to the fact that parameters + * to static methods in subclasses must be supertypes of parameters to + * static methods in superclasses. + * @internal + */ + static fromJson(json: VarDeleteJson, workspace: Workspace, event?: any): + VarDelete { + const newEvent = + super.fromJson(json, workspace, event ?? new VarDelete()) as VarDelete; + newEvent.varType = json['varType']; + newEvent.varName = json['varName']; + return newEvent; + } + /** * Run a variable deletion event. * diff --git a/core/events/events_var_rename.ts b/core/events/events_var_rename.ts index f3bfb489d..278a1510d 100644 --- a/core/events/events_var_rename.ts +++ b/core/events/events_var_rename.ts @@ -12,11 +12,13 @@ import * as goog from '../../closure/goog/goog.js'; goog.declareModuleId('Blockly.Events.VarRename'); +import * as deprecation from '../utils/deprecation.js'; import * as registry from '../registry.js'; import type {VariableModel} from '../variable_model.js'; import {VarBase, VarBaseJson} from './events_var_base.js'; import * as eventUtils from './utils.js'; +import type {Workspace} from '../workspace.js'; /** @@ -71,11 +73,32 @@ export class VarRename extends VarBase { * @param json JSON representation. */ override fromJson(json: VarRenameJson) { + deprecation.warn( + 'Blockly.Events.VarRename.prototype.fromJson', 'version 9', + 'version 10', 'Blockly.Events.fromJson'); super.fromJson(json); this.oldName = json['oldName']; this.newName = json['newName']; } + /** + * Deserializes the JSON event. + * + * @param event The event to append new properties to. Should be a subclass + * of VarRename, but we can't specify that due to the fact that parameters + * to static methods in subclasses must be supertypes of parameters to + * static methods in superclasses. + * @internal + */ + static fromJson(json: VarRenameJson, workspace: Workspace, event?: any): + VarRename { + const newEvent = + super.fromJson(json, workspace, event ?? new VarRename()) as VarRename; + newEvent.oldName = json['oldName']; + newEvent.newName = json['newName']; + return newEvent; + } + /** * Run a variable rename event. * diff --git a/core/events/events_viewport.ts b/core/events/events_viewport.ts index a44fc863a..3367e35f8 100644 --- a/core/events/events_viewport.ts +++ b/core/events/events_viewport.ts @@ -12,10 +12,12 @@ import * as goog from '../../closure/goog/goog.js'; goog.declareModuleId('Blockly.Events.ViewportChange'); +import * as deprecation from '../utils/deprecation.js'; import * as registry from '../registry.js'; import {AbstractEventJson} from './events_abstract.js'; import {UiBase} from './events_ui_base.js'; import * as eventUtils from './utils.js'; +import type {Workspace} from '../workspace.js'; /** @@ -105,12 +107,36 @@ export class ViewportChange extends UiBase { * @param json JSON representation. */ override fromJson(json: ViewportChangeJson) { + deprecation.warn( + 'Blockly.Events.Viewport.prototype.fromJson', 'version 9', 'version 10', + 'Blockly.Events.fromJson'); super.fromJson(json); this.viewTop = json['viewTop']; this.viewLeft = json['viewLeft']; this.scale = json['scale']; this.oldScale = json['oldScale']; } + + /** + * Deserializes the JSON event. + * + * @param event The event to append new properties to. Should be a subclass + * of Viewport, but we can't specify that due to the fact that parameters + * to static methods in subclasses must be supertypes of parameters to + * static methods in superclasses. + * @internal + */ + static fromJson(json: ViewportChangeJson, workspace: Workspace, event?: any): + ViewportChange { + const newEvent = + super.fromJson(json, workspace, event ?? new ViewportChange()) as + ViewportChange; + newEvent.viewTop = json['viewTop']; + newEvent.viewLeft = json['viewLeft']; + newEvent.scale = json['scale']; + newEvent.oldScale = json['oldScale']; + return newEvent; + } } export interface ViewportChangeJson extends AbstractEventJson { diff --git a/core/events/utils.ts b/core/events/utils.ts index 9938216ce..9ac08b9fc 100644 --- a/core/events/utils.ts +++ b/core/events/utils.ts @@ -240,6 +240,30 @@ export const COMMENT_MOVE = 'comment_move'; */ export const FINISHED_LOADING = 'finished_loading'; +/** Name of event that creates a procedure model. */ +export const PROCEDURE_CREATE = 'procedure_create'; + +/** Name of event that deletes a procedure model. */ +export const PROCEDURE_DELETE = 'procedure_delete'; + +/** Name of event that renames a procedure model. */ +export const PROCEDURE_RENAME = 'procedure_rename'; + +/** Name of event that enables/disables a procedure model. */ +export const PROCEDURE_ENABLE = 'procedure_enable'; + +/** Name of event that changes the returntype of a procedure model. */ +export const PROCEDURE_CHANGE_RETURN = 'procedure_change_return'; + +/** Name of event that creates a procedure parameter. */ +export const PROCEDURE_PARAMETER_CREATE = 'procedure_parameter_create'; + +/** Name of event that deletes a procedure parameter. */ +export const PROCEDURE_PARAMETER_DELETE = 'procedure_parameter_delete'; + +/** Name of event that renames a procedure parameter. */ +export const PROCEDURE_PARAMETER_RENAME = 'procedure_parameter_rename'; + /** * Type of events that cause objects to be bumped back into the visible * portion of the workspace. @@ -494,15 +518,33 @@ export function getDescendantIds(block: Block): string[] { export function fromJson( json: AnyDuringMigration, workspace: Workspace): Abstract { const eventClass = get(json['type']); - if (!eventClass) { - throw Error('Unknown event type.'); + if (!eventClass) throw Error('Unknown event type.'); + + if (eventClassHasStaticFromJson(eventClass)) { + return (eventClass as any).fromJson(json, workspace); } + + // Fallback to the old deserialization method. const event = new eventClass(); event.fromJson(json); event.workspaceId = workspace.id; return event; } +/** + * Returns true if the given event constructor has /its own/ static fromJson + * method. + * + * Returns false if no static fromJson method exists on the contructor, or if + * the static fromJson method is inheritted. + */ +function eventClassHasStaticFromJson(eventClass: new (...p: any[]) => Abstract): + boolean { + const untypedEventClass = eventClass as any; + return Object.getOwnPropertyDescriptors(untypedEventClass).fromJson && + typeof untypedEventClass.fromJson === 'function'; +} + /** * Gets the class for a specific event type from the registry. * diff --git a/core/field.ts b/core/field.ts index dc9010633..cf9148e1c 100644 --- a/core/field.ts +++ b/core/field.ts @@ -45,15 +45,28 @@ import * as WidgetDiv from './widgetdiv.js'; import type {WorkspaceSvg} from './workspace_svg.js'; import * as Xml from './xml.js'; +export type FieldValidator = (value?: T) => T|null|undefined; /** * Abstract class for an editable field. * * @alias Blockly.Field */ -export abstract class Field implements IASTNodeLocationSvg, - IASTNodeLocationWithBlock, - IKeyboardAccessible, IRegistrable { +export abstract class Field implements IASTNodeLocationSvg, + IASTNodeLocationWithBlock, + IKeyboardAccessible, + IRegistrable { + /** + * To overwrite the default value which is set in **Field**, directly update + * the prototype. + * + * Example: + * ```typescript + * FieldImage.prototype.DEFAULT_VALUE = null; + * ``` + */ + DEFAULT_VALUE: T|null = null; + /** Non-breaking space. */ static readonly NBSP = '\u00A0'; @@ -69,10 +82,10 @@ export abstract class Field implements IASTNodeLocationSvg, * Static labels are usually unnamed. */ name?: string = undefined; - protected value_: AnyDuringMigration; + protected value_: T|null; /** Validation function called when user edits an editable field. */ - protected validator_: Function|null = null; + protected validator_: FieldValidator|null = null; /** * Used to cache the field's tooltip value if setTooltip is called when the @@ -181,15 +194,15 @@ export abstract class Field implements IASTNodeLocationSvg, * this parameter supports. */ constructor( - value: AnyDuringMigration, opt_validator?: Function|null, + value: T|Sentinel, opt_validator?: FieldValidator|null, opt_config?: FieldConfig) { /** * A generic value possessed by the field. * Should generally be non-null, only null when the field is created. */ - this.value_ = ('DEFAULT_VALUE' in (new.target).prototype) ? - ((new.target).prototype as AnyDuringMigration).DEFAULT_VALUE : - null; + this.value_ = 'DEFAULT_VALUE' in new.target.prototype ? + new.target.prototype.DEFAULT_VALUE : + this.DEFAULT_VALUE; /** The size of the area rendered by the field. */ this.size_ = new Size(0, 0); @@ -348,7 +361,7 @@ export abstract class Field implements IASTNodeLocationSvg, if (!clickTarget) throw new Error('A click target has not been set.'); Tooltip.bindMouseEvents(clickTarget); this.mouseDownWrapper_ = browserEvents.conditionalBind( - clickTarget, 'mousedown', this, this.onMouseDown_); + clickTarget, 'pointerdown', this, this.onMouseDown_); } /** @@ -597,7 +610,7 @@ export abstract class Field implements IASTNodeLocationSvg, * @param handler The validator function or null to clear a previous * validator. */ - setValidator(handler: Function) { + setValidator(handler: FieldValidator) { this.validator_ = handler; } @@ -1063,17 +1076,17 @@ export abstract class Field implements IASTNodeLocationSvg, // NOP /** - * Handle a mouse down event on a field. + * Handle a pointerdown event on a field. * - * @param e Mouse down event. + * @param e Pointer down event. */ - protected onMouseDown_(e: Event) { + protected onMouseDown_(e: PointerEvent) { if (!this.sourceBlock_ || this.sourceBlock_.isDeadOrDying()) { return; } const gesture = (this.sourceBlock_.workspace as WorkspaceSvg).getGesture(e); if (gesture) { - gesture.setStartField(this); + gesture.setStartField(this as Field); } } diff --git a/core/field_angle.ts b/core/field_angle.ts index 69a5df239..448147c65 100644 --- a/core/field_angle.ts +++ b/core/field_angle.ts @@ -18,7 +18,7 @@ import * as Css from './css.js'; import * as dropDownDiv from './dropdowndiv.js'; import {Field, UnattachedFieldError} from './field.js'; import * as fieldRegistry from './field_registry.js'; -import {FieldTextInputConfig, FieldTextInput} from './field_textinput.js'; +import {FieldInput, FieldInputConfig, FieldInputValidator} from './field_input.js'; import * as dom from './utils/dom.js'; import {KeyCodes} from './utils/keycodes.js'; import * as math from './utils/math.js'; @@ -27,16 +27,14 @@ import {Svg} from './utils/svg.js'; import * as userAgent from './utils/useragent.js'; import * as WidgetDiv from './widgetdiv.js'; +export type FieldAngleValidator = FieldInputValidator; /** * Class for an editable angle field. * * @alias Blockly.FieldAngle */ -export class FieldAngle extends FieldTextInput { - /** The default value for this field. */ - // protected override DEFAULT_VALUE = 0; - +export class FieldAngle extends FieldInput { /** * The default amount to round angles to when using a mouse or keyboard nav * input. Must be a positive integer to support keyboard navigation. @@ -135,7 +133,7 @@ export class FieldAngle extends FieldTextInput { * for a list of properties this parameter supports. */ constructor( - opt_value?: string|number|Sentinel, opt_validator?: Function, + opt_value?: string|number|Sentinel, opt_validator?: FieldAngleValidator, opt_config?: FieldAngleConfig) { super(Field.SKIP_SETUP); @@ -280,9 +278,9 @@ export class FieldAngle extends FieldTextInput { // a click handler on the drag surface to update the value if the surface // is clicked. this.clickSurfaceWrapper_ = browserEvents.conditionalBind( - circle, 'click', this, this.onMouseMove_, true, true); + circle, 'pointerdown', this, this.onMouseMove_, true); this.moveSurfaceWrapper_ = browserEvents.conditionalBind( - circle, 'mousemove', this, this.onMouseMove_, true, true); + circle, 'pointermove', this, this.onMouseMove_, true); this.editor_ = svg; } @@ -315,15 +313,11 @@ export class FieldAngle extends FieldTextInput { * * @param e Mouse move event. */ - protected onMouseMove_(e: Event) { + protected onMouseMove_(e: PointerEvent) { // Calculate angle. const bBox = this.gauge_!.ownerSVGElement!.getBoundingClientRect(); - // AnyDuringMigration because: Property 'clientX' does not exist on type - // 'Event'. - const dx = (e as AnyDuringMigration).clientX - bBox.left - FieldAngle.HALF; - // AnyDuringMigration because: Property 'clientY' does not exist on type - // 'Event'. - const dy = (e as AnyDuringMigration).clientY - bBox.top - FieldAngle.HALF; + const dx = e.clientX - bBox.left - FieldAngle.HALF; + const dy = e.clientY - bBox.top - FieldAngle.HALF; let angle = Math.atan(-dy / dx); if (isNaN(angle)) { // This shouldn't happen, but let's not let this error propagate further. @@ -480,7 +474,7 @@ export class FieldAngle extends FieldTextInput { * @nocollapse * @internal */ - static override fromJson(options: FieldAngleFromJsonConfig): FieldAngle { + static fromJson(options: FieldAngleFromJsonConfig): FieldAngle { // `this` might be a subclass of FieldAngle if that class doesn't override // the static fromJson method. return new this(options.angle, undefined, options); @@ -517,7 +511,7 @@ Css.register(` fieldRegistry.register('field_angle', FieldAngle); -(FieldAngle.prototype as AnyDuringMigration).DEFAULT_VALUE = 0; +FieldAngle.prototype.DEFAULT_VALUE = 0; /** * The two main modes of the angle field. @@ -541,7 +535,7 @@ export enum Mode { /** * Extra configuration options for the angle field. */ -export interface FieldAngleConfig extends FieldTextInputConfig { +export interface FieldAngleConfig extends FieldInputConfig { mode?: Mode; clockwise?: boolean; offset?: number; diff --git a/core/field_checkbox.ts b/core/field_checkbox.ts index f8ac67aae..1007e1884 100644 --- a/core/field_checkbox.ts +++ b/core/field_checkbox.ts @@ -16,17 +16,18 @@ goog.declareModuleId('Blockly.FieldCheckbox'); import './events/events_block_change.js'; import * as dom from './utils/dom.js'; -import {FieldConfig, Field} from './field.js'; +import {Field, FieldConfig, FieldValidator} from './field.js'; import * as fieldRegistry from './field_registry.js'; import type {Sentinel} from './utils/sentinel.js'; +export type FieldCheckboxValidator = FieldValidator; /** * Class for a checkbox field. * * @alias Blockly.FieldCheckbox */ -export class FieldCheckbox extends Field { +export class FieldCheckbox extends Field { /** Default character for the checkmark. */ static readonly CHECK_CHAR = 'โœ“'; private checkChar_: string; @@ -58,7 +59,8 @@ export class FieldCheckbox extends Field { * for a list of properties this parameter supports. */ constructor( - opt_value?: string|boolean|Sentinel, opt_validator?: Function, + opt_value?: string|boolean|Sentinel, + opt_validator?: FieldCheckboxValidator, opt_config?: FieldCheckboxConfig) { super(Field.SKIP_SETUP); @@ -236,7 +238,7 @@ export class FieldCheckbox extends Field { fieldRegistry.register('field_checkbox', FieldCheckbox); -(FieldCheckbox.prototype as AnyDuringMigration).DEFAULT_VALUE = false; +FieldCheckbox.prototype.DEFAULT_VALUE = false; /** * Config options for the checkbox field. diff --git a/core/field_colour.ts b/core/field_colour.ts index aa1a5b9f0..729ebe54f 100644 --- a/core/field_colour.ts +++ b/core/field_colour.ts @@ -20,7 +20,7 @@ import * as browserEvents from './browser_events.js'; import * as Css from './css.js'; import * as dom from './utils/dom.js'; import * as dropDownDiv from './dropdowndiv.js'; -import {FieldConfig, Field} from './field.js'; +import {Field, FieldConfig, FieldValidator} from './field.js'; import * as fieldRegistry from './field_registry.js'; import * as aria from './utils/aria.js'; import * as colour from './utils/colour.js'; @@ -29,13 +29,14 @@ import {KeyCodes} from './utils/keycodes.js'; import type {Sentinel} from './utils/sentinel.js'; import {Size} from './utils/size.js'; +export type FieldColourValidator = FieldValidator; /** * Class for a colour input field. * * @alias Blockly.FieldColour */ -export class FieldColour extends Field { +export class FieldColour extends Field { /** * An array of colour strings for the palette. * Copied from goog.ui.ColorPicker.SIMPLE_GRID_COLORS @@ -152,7 +153,7 @@ export class FieldColour extends Field { * for a list of properties this parameter supports. */ constructor( - opt_value?: string|Sentinel, opt_validator?: Function, + opt_value?: string|Sentinel, opt_validator?: FieldColourValidator, opt_config?: FieldColourConfig) { super(Field.SKIP_SETUP); @@ -305,7 +306,7 @@ export class FieldColour extends Field { * * @param e Mouse event. */ - private onClick_(e: MouseEvent) { + private onClick_(e: PointerEvent) { const cell = e.target as Element; const colour = cell && cell.getAttribute('data-colour'); if (colour !== null) { @@ -414,7 +415,7 @@ export class FieldColour extends Field { * * @param e Mouse event. */ - private onMouseMove_(e: MouseEvent) { + private onMouseMove_(e: PointerEvent) { const cell = e.target as Element; const index = cell && Number(cell.getAttribute('data-index')); if (index !== null && index !== this.highlightedIndex_) { @@ -533,13 +534,13 @@ export class FieldColour extends Field { // Configure event handler on the table to listen for any event in a cell. this.onClickWrapper_ = browserEvents.conditionalBind( - table, 'click', this, this.onClick_, true); + table, 'pointerdown', this, this.onClick_, true); this.onMouseMoveWrapper_ = browserEvents.conditionalBind( - table, 'mousemove', this, this.onMouseMove_, true); + table, 'pointermove', this, this.onMouseMove_, true); this.onMouseEnterWrapper_ = browserEvents.conditionalBind( - table, 'mouseenter', this, this.onMouseEnter_, true); + table, 'pointerenter', this, this.onMouseEnter_, true); this.onMouseLeaveWrapper_ = browserEvents.conditionalBind( - table, 'mouseleave', this, this.onMouseLeave_, true); + table, 'pointerleave', this, this.onMouseLeave_, true); this.onKeyDownWrapper_ = browserEvents.conditionalBind(table, 'keydown', this, this.onKeyDown_); @@ -588,10 +589,7 @@ export class FieldColour extends Field { } /** The default value for this field. */ -// AnyDuringMigration because: Property 'DEFAULT_VALUE' is protected and only -// accessible within class 'FieldColour' and its subclasses. -(FieldColour.prototype as AnyDuringMigration).DEFAULT_VALUE = - FieldColour.COLOURS[0]; +FieldColour.prototype.DEFAULT_VALUE = FieldColour.COLOURS[0]; /** CSS for colour picker. See css.js for use. */ Css.register(` diff --git a/core/field_dropdown.ts b/core/field_dropdown.ts index 4615db5ef..eb14d766f 100644 --- a/core/field_dropdown.ts +++ b/core/field_dropdown.ts @@ -16,7 +16,7 @@ goog.declareModuleId('Blockly.FieldDropdown'); import type {BlockSvg} from './block_svg.js'; import * as dropDownDiv from './dropdowndiv.js'; -import {FieldConfig, Field, UnattachedFieldError} from './field.js'; +import {Field, FieldConfig, FieldValidator, UnattachedFieldError} from './field.js'; import * as fieldRegistry from './field_registry.js'; import {Menu} from './menu.js'; import {MenuItem} from './menuitem.js'; @@ -28,12 +28,14 @@ import type {Sentinel} from './utils/sentinel.js'; import * as utilsString from './utils/string.js'; import {Svg} from './utils/svg.js'; +export type FieldDropdownValidator = FieldValidator; + /** * Class for an editable dropdown field. * * @alias Blockly.FieldDropdown */ -export class FieldDropdown extends Field { +export class FieldDropdown extends Field { /** Horizontal distance that a checkmark overhangs the dropdown. */ static CHECKMARK_OVERHANG = 25; @@ -111,13 +113,13 @@ export class FieldDropdown extends Field { */ constructor( menuGenerator: MenuGenerator, - opt_validator?: Function, + opt_validator?: FieldDropdownValidator, opt_config?: FieldConfig, ); constructor(menuGenerator: Sentinel); constructor( menuGenerator: MenuGenerator|Sentinel, - opt_validator?: Function, + opt_validator?: FieldDropdownValidator, opt_config?: FieldConfig, ) { super(Field.SKIP_SETUP); diff --git a/core/field_image.ts b/core/field_image.ts index 9d0d527e6..728be7e94 100644 --- a/core/field_image.ts +++ b/core/field_image.ts @@ -12,7 +12,7 @@ import * as goog from '../closure/goog/goog.js'; goog.declareModuleId('Blockly.FieldImage'); -import {FieldConfig, Field} from './field.js'; +import {Field, FieldConfig} from './field.js'; import * as fieldRegistry from './field_registry.js'; import * as dom from './utils/dom.js'; import * as parsing from './utils/parsing.js'; @@ -20,13 +20,12 @@ import type {Sentinel} from './utils/sentinel.js'; import {Size} from './utils/size.js'; import {Svg} from './utils/svg.js'; - /** * Class for an image on a block. * * @alias Blockly.FieldImage */ -export class FieldImage extends Field { +export class FieldImage extends Field { /** * Vertical padding below the image, which is included in the reported height * of the field. @@ -269,7 +268,7 @@ export class FieldImage extends Field { fieldRegistry.register('field_image', FieldImage); -(FieldImage.prototype as AnyDuringMigration).DEFAULT_VALUE = ''; +FieldImage.prototype.DEFAULT_VALUE = ''; /** * Config options for the image field. diff --git a/core/field_input.ts b/core/field_input.ts new file mode 100644 index 000000000..b7e36d05b --- /dev/null +++ b/core/field_input.ts @@ -0,0 +1,593 @@ +/** + * @license + * Copyright 2012 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * Text input field. + * + * @class + */ +import * as goog from '../closure/goog/goog.js'; +goog.declareModuleId('Blockly.FieldInput'); + +// Unused import preserved for side-effects. Remove if unneeded. +import './events/events_block_change.js'; + +import type {BlockSvg} from './block_svg.js'; +import * as browserEvents from './browser_events.js'; +import * as dialog from './dialog.js'; +import * as dom from './utils/dom.js'; +import * as dropDownDiv from './dropdowndiv.js'; +import * as eventUtils from './events/utils.js'; +import {Field, FieldConfig, FieldValidator, UnattachedFieldError} from './field.js'; +import {Msg} from './msg.js'; +import * as aria from './utils/aria.js'; +import {Coordinate} from './utils/coordinate.js'; +import {KeyCodes} from './utils/keycodes.js'; +import type {Sentinel} from './utils/sentinel.js'; +import * as userAgent from './utils/useragent.js'; +import * as WidgetDiv from './widgetdiv.js'; +import type {WorkspaceSvg} from './workspace_svg.js'; + +export type InputTypes = string|number; +export type FieldInputValidator = FieldValidator; + +/** + * Class for an editable text field. + * + * @alias Blockly.FieldInput + */ +export abstract class FieldInput extends Field { + /** + * Pixel size of input border radius. + * Should match blocklyText's border-radius in CSS. + */ + static BORDERRADIUS = 4; + + /** Allow browser to spellcheck this field. */ + protected spellcheck_ = true; + + /** The HTML input element. */ + protected htmlInput_: HTMLInputElement|null = null; + + /** True if the field's value is currently being edited via the UI. */ + protected isBeingEdited_ = false; + + /** + * True if the value currently displayed in the field's editory UI is valid. + */ + protected isTextValid_ = false; + + /** Key down event data. */ + private onKeyDownWrapper_: browserEvents.Data|null = null; + + /** Key input event data. */ + private onKeyInputWrapper_: browserEvents.Data|null = null; + + /** + * Whether the field should consider the whole parent block to be its click + * target. + */ + fullBlockClickTarget_: boolean|null = false; + + /** The workspace that this field belongs to. */ + protected workspace_: WorkspaceSvg|null = null; + + /** + * Serializable fields are saved by the serializer, non-serializable fields + * are not. Editable fields should also be serializable. + */ + override SERIALIZABLE = true; + + /** Mouse cursor style when over the hotspot that initiates the editor. */ + override CURSOR = 'text'; + override clickTarget_: AnyDuringMigration; + override value_: AnyDuringMigration; + override isDirty_: AnyDuringMigration; + + /** + * @param opt_value The initial value of the field. Should cast to a string. + * Defaults to an empty string if null or undefined. Also accepts + * Field.SKIP_SETUP if you wish to skip setup (only used by subclasses + * that want to handle configuration and setting the field value after + * their own constructors have run). + * @param opt_validator A function that is called to validate changes to the + * field's value. Takes in a string & returns a validated string, or null + * to abort the change. + * @param opt_config A map of options used to configure the field. + * See the [field creation documentation]{@link + * https://developers.google.com/blockly/guides/create-custom-blocks/fields/built-in-fields/text-input#creation} + * for a list of properties this parameter supports. + */ + constructor( + opt_value?: string|Sentinel, opt_validator?: FieldInputValidator|null, + opt_config?: FieldInputConfig) { + super(Field.SKIP_SETUP); + + if (opt_value === Field.SKIP_SETUP) { + return; + } + if (opt_config) { + this.configure_(opt_config); + } + this.setValue(opt_value); + if (opt_validator) { + this.setValidator(opt_validator); + } + } + + protected override configure_(config: FieldInputConfig) { + super.configure_(config); + if (config.spellcheck !== undefined) { + this.spellcheck_ = config.spellcheck; + } + } + + /** @internal */ + override initView() { + const block = this.getSourceBlock(); + if (!block) { + throw new UnattachedFieldError(); + } + if (this.getConstants()!.FULL_BLOCK_FIELDS) { + // Step one: figure out if this is the only field on this block. + // Rendering is quite different in that case. + let nFields = 0; + let nConnections = 0; + // Count the number of fields, excluding text fields + for (let i = 0, input; input = block.inputList[i]; i++) { + for (let j = 0; input.fieldRow[j]; j++) { + nFields++; + } + if (input.connection) { + nConnections++; + } + } + // The special case is when this is the only non-label field on the block + // and it has an output but no inputs. + this.fullBlockClickTarget_ = + nFields <= 1 && block.outputConnection && !nConnections; + } else { + this.fullBlockClickTarget_ = false; + } + + if (this.fullBlockClickTarget_) { + this.clickTarget_ = (this.sourceBlock_ as BlockSvg).getSvgRoot(); + } else { + this.createBorderRect_(); + } + this.createTextElement_(); + } + + /** + * Ensure that the input value casts to a valid string. + * + * @param opt_newValue The input value. + * @returns A valid string, or null if invalid. + */ + protected override doClassValidation_(opt_newValue?: AnyDuringMigration): + AnyDuringMigration { + if (opt_newValue === null || opt_newValue === undefined) { + return null; + } + return String(opt_newValue); + } + + /** + * Called by setValue if the text input is not valid. If the field is + * currently being edited it reverts value of the field to the previous + * value while allowing the display text to be handled by the htmlInput_. + * + * @param _invalidValue The input value that was determined to be invalid. + * This is not used by the text input because its display value is stored + * on the htmlInput_. + */ + protected override doValueInvalid_(_invalidValue: AnyDuringMigration) { + if (this.isBeingEdited_) { + this.isDirty_ = true; + this.isTextValid_ = false; + const oldValue = this.value_; + // Revert value when the text becomes invalid. + this.value_ = this.htmlInput_!.getAttribute('data-untyped-default-value'); + if (this.sourceBlock_ && eventUtils.isEnabled()) { + eventUtils.fire(new (eventUtils.get(eventUtils.BLOCK_CHANGE))( + this.sourceBlock_, 'field', this.name || null, oldValue, + this.value_)); + } + } + } + + /** + * Called by setValue if the text input is valid. Updates the value of the + * field, and updates the text of the field if it is not currently being + * edited (i.e. handled by the htmlInput_). + * + * @param newValue The value to be saved. The default validator guarantees + * that this is a string. + */ + protected override doValueUpdate_(newValue: AnyDuringMigration) { + this.isDirty_ = true; + this.isTextValid_ = true; + this.value_ = newValue; + } + + /** + * Updates text field to match the colour/style of the block. + * + * @internal + */ + override applyColour() { + if (!this.sourceBlock_ || !this.getConstants()!.FULL_BLOCK_FIELDS) return; + + const source = this.sourceBlock_ as BlockSvg; + + if (this.borderRect_) { + this.borderRect_.setAttribute('stroke', source.style.colourTertiary); + } else { + source.pathObject.svgPath.setAttribute( + 'fill', this.getConstants()!.FIELD_BORDER_RECT_COLOUR); + } + } + + /** + * Updates the colour of the htmlInput given the current validity of the + * field's value. + */ + protected override render_() { + super.render_(); + // This logic is done in render_ rather than doValueInvalid_ or + // doValueUpdate_ so that the code is more centralized. + if (this.isBeingEdited_) { + this.resizeEditor_(); + const htmlInput = this.htmlInput_ as HTMLElement; + if (!this.isTextValid_) { + dom.addClass(htmlInput, 'blocklyInvalidInput'); + aria.setState(htmlInput, aria.State.INVALID, true); + } else { + dom.removeClass(htmlInput, 'blocklyInvalidInput'); + aria.setState(htmlInput, aria.State.INVALID, false); + } + } + } + + /** + * Set whether this field is spellchecked by the browser. + * + * @param check True if checked. + */ + setSpellcheck(check: boolean) { + if (check === this.spellcheck_) { + return; + } + this.spellcheck_ = check; + if (this.htmlInput_) { + // AnyDuringMigration because: Argument of type 'boolean' is not + // assignable to parameter of type 'string'. + this.htmlInput_.setAttribute( + 'spellcheck', this.spellcheck_ as AnyDuringMigration); + } + } + + /** + * Show an editor for the field. + * Shows the inline free-text editor on top of the text by default. + * Shows a prompt editor for mobile browsers if the modalInputs option is + * enabled. + * + * @param _opt_e Optional mouse event that triggered the field to open, or + * undefined if triggered programmatically. + * @param opt_quietInput True if editor should be created without focus. + * Defaults to false. + */ + protected override showEditor_(_opt_e?: Event, opt_quietInput?: boolean) { + this.workspace_ = (this.sourceBlock_ as BlockSvg).workspace; + const quietInput = opt_quietInput || false; + if (!quietInput && this.workspace_.options.modalInputs && + (userAgent.MOBILE || userAgent.ANDROID || userAgent.IPAD)) { + this.showPromptEditor_(); + } else { + this.showInlineEditor_(quietInput); + } + } + + /** + * Create and show a text input editor that is a prompt (usually a popup). + * Mobile browsers may have issues with in-line textareas (focus and + * keyboards). + */ + private showPromptEditor_() { + dialog.prompt( + Msg['CHANGE_VALUE_TITLE'], this.getText(), (text: string|null) => { + // Text is null if user pressed cancel button. + if (text !== null) { + this.setValue(this.getValueFromEditorText_(text)); + } + }); + } + + /** + * Create and show a text input editor that sits directly over the text input. + * + * @param quietInput True if editor should be created without focus. + */ + private showInlineEditor_(quietInput: boolean) { + const block = this.getSourceBlock(); + if (!block) { + throw new UnattachedFieldError(); + } + WidgetDiv.show(this, block.RTL, this.widgetDispose_.bind(this)); + this.htmlInput_ = this.widgetCreate_() as HTMLInputElement; + this.isBeingEdited_ = true; + + if (!quietInput) { + (this.htmlInput_ as HTMLElement).focus({ + preventScroll: true, + }); + this.htmlInput_.select(); + } + } + + /** + * Create the text input editor widget. + * + * @returns The newly created text input editor. + */ + protected widgetCreate_(): HTMLElement { + const block = this.getSourceBlock(); + if (!block) { + throw new UnattachedFieldError(); + } + eventUtils.setGroup(true); + const div = WidgetDiv.getDiv(); + + const clickTarget = this.getClickTarget_(); + if (!clickTarget) throw new Error('A click target has not been set.'); + dom.addClass(clickTarget, 'editing'); + + const htmlInput = (document.createElement('input')); + htmlInput.className = 'blocklyHtmlInput'; + // AnyDuringMigration because: Argument of type 'boolean' is not assignable + // to parameter of type 'string'. + htmlInput.setAttribute( + 'spellcheck', this.spellcheck_ as AnyDuringMigration); + const scale = this.workspace_!.getScale(); + const fontSize = this.getConstants()!.FIELD_TEXT_FONTSIZE * scale + 'pt'; + div!.style.fontSize = fontSize; + htmlInput.style.fontSize = fontSize; + let borderRadius = FieldInput.BORDERRADIUS * scale + 'px'; + + if (this.fullBlockClickTarget_) { + const bBox = this.getScaledBBox(); + + // Override border radius. + 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; + htmlInput.style.border = 1 * scale + 'px solid ' + strokeColour; + div!.style.borderRadius = borderRadius; + div!.style.transition = 'box-shadow 0.25s ease 0s'; + if (this.getConstants()!.FIELD_TEXTINPUT_BOX_SHADOW) { + div!.style.boxShadow = + 'rgba(255, 255, 255, 0.3) 0 0 0 ' + 4 * scale + 'px'; + } + } + htmlInput.style.borderRadius = borderRadius; + + div!.appendChild(htmlInput); + + htmlInput.value = htmlInput.defaultValue = this.getEditorText_(this.value_); + htmlInput.setAttribute('data-untyped-default-value', this.value_); + + this.resizeEditor_(); + + this.bindInputEvents_(htmlInput); + + return htmlInput; + } + + /** + * Closes the editor, saves the results, and disposes of any events or + * DOM-references belonging to the editor. + */ + protected widgetDispose_() { + // Non-disposal related things that we do when the editor closes. + this.isBeingEdited_ = false; + this.isTextValid_ = true; + // Make sure the field's node matches the field's internal value. + this.forceRerender(); + this.onFinishEditing_(this.value_); + eventUtils.setGroup(false); + + // Actual disposal. + this.unbindInputEvents_(); + const style = WidgetDiv.getDiv()!.style; + style.width = 'auto'; + style.height = 'auto'; + style.fontSize = ''; + style.transition = ''; + style.boxShadow = ''; + this.htmlInput_ = null; + + const clickTarget = this.getClickTarget_(); + if (!clickTarget) throw new Error('A click target has not been set.'); + dom.removeClass(clickTarget, 'editing'); + } + + /** + * A callback triggered when the user is done editing the field via the UI. + * + * @param _value The new value of the field. + */ + onFinishEditing_(_value: AnyDuringMigration) {} + // NOP by default. + // TODO(#2496): Support people passing a func into the field. + + /** + * Bind handlers for user input on the text input field's editor. + * + * @param htmlInput The htmlInput to which event handlers will be bound. + */ + protected bindInputEvents_(htmlInput: HTMLElement) { + // Trap Enter without IME and Esc to hide. + this.onKeyDownWrapper_ = browserEvents.conditionalBind( + htmlInput, 'keydown', this, this.onHtmlInputKeyDown_); + // Resize after every input change. + this.onKeyInputWrapper_ = browserEvents.conditionalBind( + htmlInput, 'input', this, this.onHtmlInputChange_); + } + + /** Unbind handlers for user input and workspace size changes. */ + protected unbindInputEvents_() { + if (this.onKeyDownWrapper_) { + browserEvents.unbind(this.onKeyDownWrapper_); + this.onKeyDownWrapper_ = null; + } + if (this.onKeyInputWrapper_) { + browserEvents.unbind(this.onKeyInputWrapper_); + this.onKeyInputWrapper_ = null; + } + } + + /** + * Handle key down to the editor. + * + * @param e Keyboard event. + */ + protected onHtmlInputKeyDown_(e: Event) { + // AnyDuringMigration because: Property 'keyCode' does not exist on type + // 'Event'. + if ((e as AnyDuringMigration).keyCode === KeyCodes.ENTER) { + WidgetDiv.hide(); + dropDownDiv.hideWithoutAnimation(); + // AnyDuringMigration because: Property 'keyCode' does not exist on type + // 'Event'. + } else if ((e as AnyDuringMigration).keyCode === KeyCodes.ESC) { + this.setValue( + this.htmlInput_!.getAttribute('data-untyped-default-value')); + WidgetDiv.hide(); + dropDownDiv.hideWithoutAnimation(); + // AnyDuringMigration because: Property 'keyCode' does not exist on type + // 'Event'. + } else if ((e as AnyDuringMigration).keyCode === KeyCodes.TAB) { + WidgetDiv.hide(); + dropDownDiv.hideWithoutAnimation(); + // AnyDuringMigration because: Property 'shiftKey' does not exist on type + // 'Event'. AnyDuringMigration because: Argument of type 'this' is not + // assignable to parameter of type 'Field'. + (this.sourceBlock_ as BlockSvg) + .tab(this as AnyDuringMigration, !(e as AnyDuringMigration).shiftKey); + e.preventDefault(); + } + } + + /** + * Handle a change to the editor. + * + * @param _e Keyboard event. + */ + private onHtmlInputChange_(_e: Event) { + this.setValue(this.getValueFromEditorText_(this.htmlInput_!.value)); + } + + /** + * Set the HTML input value and the field's internal value. The difference + * between this and `setValue` is that this also updates the HTML input + * value whilst editing. + * + * @param newValue New value. + */ + protected setEditorValue_(newValue: AnyDuringMigration) { + this.isDirty_ = true; + if (this.isBeingEdited_) { + // In the case this method is passed an invalid value, we still + // pass it through the transformation method `getEditorText` to deal + // with. Otherwise, the internal field's state will be inconsistent + // with what's shown to the user. + this.htmlInput_!.value = this.getEditorText_(newValue); + } + this.setValue(newValue); + } + + /** Resize the editor to fit the text. */ + protected resizeEditor_() { + const block = this.getSourceBlock(); + if (!block) { + throw new UnattachedFieldError(); + } + const div = WidgetDiv.getDiv(); + const bBox = this.getScaledBBox(); + div!.style.width = bBox.right - bBox.left + 'px'; + div!.style.height = bBox.bottom - bBox.top + 'px'; + + // In RTL mode block fields and LTR input fields the left edge moves, + // whereas the right edge is fixed. Reposition the editor. + const x = block.RTL ? bBox.right - div!.offsetWidth : bBox.left; + const xy = new Coordinate(x, bBox.top); + + div!.style.left = xy.x + 'px'; + div!.style.top = xy.y + 'px'; + } + + /** + * Returns whether or not the field is tab navigable. + * + * @returns True if the field is tab navigable. + */ + override isTabNavigable(): boolean { + return true; + } + + /** + * Use the `getText_` developer hook to override the field's text + * representation. When we're currently editing, return the current HTML value + * instead. Otherwise, return null which tells the field to use the default + * behaviour (which is a string cast of the field's value). + * + * @returns The HTML value if we're editing, otherwise null. + */ + protected override getText_(): string|null { + if (this.isBeingEdited_ && this.htmlInput_) { + // We are currently editing, return the HTML input value instead. + return this.htmlInput_.value; + } + return null; + } + + /** + * Transform the provided value into a text to show in the HTML input. + * Override this method if the field's HTML input representation is different + * than the field's value. This should be coupled with an override of + * `getValueFromEditorText_`. + * + * @param value The value stored in this field. + * @returns The text to show on the HTML input. + */ + protected getEditorText_(value: AnyDuringMigration): string { + return String(value); + } + + /** + * Transform the text received from the HTML input into a value to store + * in this field. + * Override this method if the field's HTML input representation is different + * than the field's value. This should be coupled with an override of + * `getEditorText_`. + * + * @param text Text received from the HTML input. + * @returns The value to store. + */ + protected getValueFromEditorText_(text: string): AnyDuringMigration { + return text; + } +} + +/** + * Config options for the input field. + */ +export interface FieldInputConfig extends FieldConfig { + spellcheck?: boolean; +} diff --git a/core/field_label.ts b/core/field_label.ts index c35e29157..2a4730ff2 100644 --- a/core/field_label.ts +++ b/core/field_label.ts @@ -14,18 +14,17 @@ import * as goog from '../closure/goog/goog.js'; goog.declareModuleId('Blockly.FieldLabel'); import * as dom from './utils/dom.js'; -import {FieldConfig, Field} from './field.js'; +import {Field, FieldConfig} from './field.js'; import * as fieldRegistry from './field_registry.js'; import * as parsing from './utils/parsing.js'; import type {Sentinel} from './utils/sentinel.js'; - /** * Class for a non-editable, non-serializable text field. * * @alias Blockly.FieldLabel */ -export class FieldLabel extends Field { +export class FieldLabel extends Field { /** The html class name to use for this field. */ private class_: string|null = null; @@ -130,7 +129,7 @@ export class FieldLabel extends Field { fieldRegistry.register('field_label', FieldLabel); -(FieldLabel.prototype as AnyDuringMigration).DEFAULT_VALUE = ''; +FieldLabel.prototype.DEFAULT_VALUE = ''; // clang-format off // Clang does not like the 'class' keyword being used as a property. diff --git a/core/field_label_serializable.ts b/core/field_label_serializable.ts index 63815e958..ad1a5a06e 100644 --- a/core/field_label_serializable.ts +++ b/core/field_label_serializable.ts @@ -14,11 +14,10 @@ import * as goog from '../closure/goog/goog.js'; goog.declareModuleId('Blockly.FieldLabelSerializable'); -import {FieldLabelConfig, FieldLabelFromJsonConfig, FieldLabel} from './field_label.js'; +import {FieldLabel, FieldLabelConfig, FieldLabelFromJsonConfig} from './field_label.js'; import * as fieldRegistry from './field_registry.js'; import * as parsing from './utils/parsing.js'; - /** * Class for a non-editable, serializable text field. * diff --git a/core/field_multilineinput.ts b/core/field_multilineinput.ts index 403f725cc..abd53193a 100644 --- a/core/field_multilineinput.ts +++ b/core/field_multilineinput.ts @@ -15,7 +15,7 @@ goog.declareModuleId('Blockly.FieldMultilineInput'); import * as Css from './css.js'; import {Field, UnattachedFieldError} from './field.js'; import * as fieldRegistry from './field_registry.js'; -import {FieldTextInputConfig, FieldTextInput} from './field_textinput.js'; +import {FieldTextInput, FieldTextInputConfig, FieldTextInputValidator} from './field_textinput.js'; import * as aria from './utils/aria.js'; import * as dom from './utils/dom.js'; import {KeyCodes} from './utils/keycodes.js'; @@ -25,6 +25,7 @@ import {Svg} from './utils/svg.js'; import * as userAgent from './utils/useragent.js'; import * as WidgetDiv from './widgetdiv.js'; +export type FieldMultilineInputValidator = FieldTextInputValidator; /** * Class for an editable text area field. @@ -65,7 +66,7 @@ export class FieldMultilineInput extends FieldTextInput { * for a list of properties this parameter supports. */ constructor( - opt_value?: string|Sentinel, opt_validator?: Function, + opt_value?: string|Sentinel, opt_validator?: FieldMultilineInputValidator, opt_config?: FieldMultilineInputConfig) { super(Field.SKIP_SETUP); diff --git a/core/field_number.ts b/core/field_number.ts index 5725014ad..a891f1c58 100644 --- a/core/field_number.ts +++ b/core/field_number.ts @@ -14,17 +14,18 @@ goog.declareModuleId('Blockly.FieldNumber'); import {Field} from './field.js'; import * as fieldRegistry from './field_registry.js'; -import {FieldTextInputConfig, FieldTextInput} from './field_textinput.js'; +import {FieldInput, FieldInputConfig, FieldInputValidator} from './field_input.js'; import * as aria from './utils/aria.js'; import type {Sentinel} from './utils/sentinel.js'; +export type FieldNumberValidator = FieldInputValidator; /** * Class for an editable number field. * * @alias Blockly.FieldNumber */ -export class FieldNumber extends FieldTextInput { +export class FieldNumber extends FieldInput { /** The minimum value this number field can contain. */ protected min_ = -Infinity; @@ -46,6 +47,9 @@ export class FieldNumber extends FieldTextInput { */ override SERIALIZABLE = true; + /** Don't spellcheck numbers. Our validator does a better job. */ + protected override spellcheck_ = false; + /** * @param opt_value The initial value of the field. Should cast to a number. * Defaults to 0. Also accepts Field.SKIP_SETUP if you wish to skip setup @@ -68,7 +72,8 @@ export class FieldNumber extends FieldTextInput { constructor( opt_value?: string|number|Sentinel, opt_min?: string|number|null, opt_max?: string|number|null, opt_precision?: string|number|null, - opt_validator?: Function|null, opt_config?: FieldNumberConfig) { + opt_validator?: FieldNumberValidator|null, + opt_config?: FieldNumberConfig) { // Pass SENTINEL so that we can define properties before value validation. super(Field.SKIP_SETUP); @@ -310,7 +315,7 @@ export class FieldNumber extends FieldTextInput { * @nocollapse * @internal */ - static override fromJson(options: FieldNumberFromJsonConfig): FieldNumber { + static fromJson(options: FieldNumberFromJsonConfig): FieldNumber { // `this` might be a subclass of FieldNumber if that class doesn't override // the static fromJson method. return new this( @@ -320,12 +325,12 @@ export class FieldNumber extends FieldTextInput { fieldRegistry.register('field_number', FieldNumber); -(FieldNumber.prototype as AnyDuringMigration).DEFAULT_VALUE = 0; +FieldNumber.prototype.DEFAULT_VALUE = 0; /** * Config options for the number field. */ -export interface FieldNumberConfig extends FieldTextInputConfig { +export interface FieldNumberConfig extends FieldInputConfig { min?: number; max?: number; precision?: number; diff --git a/core/field_registry.ts b/core/field_registry.ts index 7880bf643..172e1d8ae 100644 --- a/core/field_registry.ts +++ b/core/field_registry.ts @@ -14,10 +14,13 @@ import * as goog from '../closure/goog/goog.js'; goog.declareModuleId('Blockly.fieldRegistry'); -import type {Field} from './field.js'; -import type {IRegistrableField} from './interfaces/i_registrable_field.js'; +import type {Field, FieldProto} from './field.js'; import * as registry from './registry.js'; +interface RegistryOptions { + type: string; + [key: string]: unknown; +} /** * Registers a field type. @@ -31,7 +34,7 @@ import * as registry from './registry.js'; * or the fieldClass is not an object containing a fromJson function. * @alias Blockly.fieldRegistry.register */ -export function register(type: string, fieldClass: IRegistrableField) { +export function register(type: string, fieldClass: FieldProto) { registry.register(registry.Type.FIELD, type, fieldClass); } @@ -57,7 +60,7 @@ export function unregister(type: string) { * @alias Blockly.fieldRegistry.fromJson * @internal */ -export function fromJson(options: AnyDuringMigration): Field|null { +export function fromJson(options: RegistryOptions): Field|null { return TEST_ONLY.fromJsonInternal(options); } @@ -66,8 +69,8 @@ export function fromJson(options: AnyDuringMigration): Field|null { * * @param options */ -function fromJsonInternal(options: AnyDuringMigration): Field|null { - const fieldObject = registry.getObject(registry.Type.FIELD, options['type']); +function fromJsonInternal(options: RegistryOptions): Field|null { + const fieldObject = registry.getObject(registry.Type.FIELD, options.type); if (!fieldObject) { console.warn( 'Blockly could not create a field of type ' + options['type'] + @@ -78,7 +81,8 @@ function fromJsonInternal(options: AnyDuringMigration): Field|null { } else if (typeof (fieldObject as any).fromJson !== 'function') { throw new TypeError('returned Field was not a IRegistrableField'); } else { - return (fieldObject as unknown as IRegistrableField).fromJson(options); + type fromJson = (options: {}) => Field; + return (fieldObject as unknown as {fromJson: fromJson}).fromJson(options); } } diff --git a/core/field_textinput.ts b/core/field_textinput.ts index ca4e6053c..2a2f1c6db 100644 --- a/core/field_textinput.ts +++ b/core/field_textinput.ts @@ -15,78 +15,14 @@ goog.declareModuleId('Blockly.FieldTextInput'); // Unused import preserved for side-effects. Remove if unneeded. import './events/events_block_change.js'; -import type {BlockSvg} from './block_svg.js'; -import * as browserEvents from './browser_events.js'; -import * as dialog from './dialog.js'; -import * as dom from './utils/dom.js'; -import * as dropDownDiv from './dropdowndiv.js'; -import * as eventUtils from './events/utils.js'; -import {FieldConfig, Field, UnattachedFieldError} from './field.js'; +import {FieldInput, FieldInputConfig, FieldInputValidator} from './field_input.js'; import * as fieldRegistry from './field_registry.js'; -import {Msg} from './msg.js'; -import * as aria from './utils/aria.js'; -import {Coordinate} from './utils/coordinate.js'; -import {KeyCodes} from './utils/keycodes.js'; import * as parsing from './utils/parsing.js'; import type {Sentinel} from './utils/sentinel.js'; -import * as userAgent from './utils/useragent.js'; -import * as WidgetDiv from './widgetdiv.js'; -import type {WorkspaceSvg} from './workspace_svg.js'; +export type FieldTextInputValidator = FieldInputValidator; -/** - * Class for an editable text field. - * - * @alias Blockly.FieldTextInput - */ -export class FieldTextInput extends Field { - /** - * Pixel size of input border radius. - * Should match blocklyText's border-radius in CSS. - */ - static BORDERRADIUS = 4; - - /** Allow browser to spellcheck this field. */ - protected spellcheck_ = true; - - /** The HTML input element. */ - protected htmlInput_: HTMLInputElement|null = null; - - /** True if the field's value is currently being edited via the UI. */ - protected isBeingEdited_ = false; - - /** - * True if the value currently displayed in the field's editory UI is valid. - */ - protected isTextValid_ = false; - - /** Key down event data. */ - private onKeyDownWrapper_: browserEvents.Data|null = null; - - /** Key input event data. */ - private onKeyInputWrapper_: browserEvents.Data|null = null; - - /** - * Whether the field should consider the whole parent block to be its click - * target. - */ - fullBlockClickTarget_: boolean|null = false; - - /** The workspace that this field belongs to. */ - protected workspace_: WorkspaceSvg|null = null; - - /** - * Serializable fields are saved by the serializer, non-serializable fields - * are not. Editable fields should also be serializable. - */ - override SERIALIZABLE = true; - - /** Mouse cursor style when over the hotspot that initiates the editor. */ - override CURSOR = 'text'; - override clickTarget_: AnyDuringMigration; - override value_: AnyDuringMigration; - override isDirty_: AnyDuringMigration; - +export class FieldTextInput extends FieldInput { /** * @param opt_value The initial value of the field. Should cast to a string. * Defaults to an empty string if null or undefined. Also accepts @@ -102,493 +38,9 @@ export class FieldTextInput extends Field { * for a list of properties this parameter supports. */ constructor( - opt_value?: string|Sentinel, opt_validator?: Function|null, - opt_config?: FieldTextInputConfig) { - super(Field.SKIP_SETUP); - - if (opt_value === Field.SKIP_SETUP) { - return; - } - if (opt_config) { - this.configure_(opt_config); - } - this.setValue(opt_value); - if (opt_validator) { - this.setValidator(opt_validator); - } - } - - protected override configure_(config: FieldTextInputConfig) { - super.configure_(config); - if (config.spellcheck !== undefined) { - this.spellcheck_ = config.spellcheck; - } - } - - /** @internal */ - override initView() { - const block = this.getSourceBlock(); - if (!block) { - throw new UnattachedFieldError(); - } - if (this.getConstants()!.FULL_BLOCK_FIELDS) { - // Step one: figure out if this is the only field on this block. - // Rendering is quite different in that case. - let nFields = 0; - let nConnections = 0; - // Count the number of fields, excluding text fields - for (let i = 0, input; input = block.inputList[i]; i++) { - for (let j = 0; input.fieldRow[j]; j++) { - nFields++; - } - if (input.connection) { - nConnections++; - } - } - // The special case is when this is the only non-label field on the block - // and it has an output but no inputs. - this.fullBlockClickTarget_ = - nFields <= 1 && block.outputConnection && !nConnections; - } else { - this.fullBlockClickTarget_ = false; - } - - if (this.fullBlockClickTarget_) { - this.clickTarget_ = (this.sourceBlock_ as BlockSvg).getSvgRoot(); - } else { - this.createBorderRect_(); - } - this.createTextElement_(); - } - - /** - * Ensure that the input value casts to a valid string. - * - * @param opt_newValue The input value. - * @returns A valid string, or null if invalid. - */ - protected override doClassValidation_(opt_newValue?: AnyDuringMigration): - AnyDuringMigration { - if (opt_newValue === null || opt_newValue === undefined) { - return null; - } - return String(opt_newValue); - } - - /** - * Called by setValue if the text input is not valid. If the field is - * currently being edited it reverts value of the field to the previous - * value while allowing the display text to be handled by the htmlInput_. - * - * @param _invalidValue The input value that was determined to be invalid. - * This is not used by the text input because its display value is stored - * on the htmlInput_. - */ - protected override doValueInvalid_(_invalidValue: AnyDuringMigration) { - if (this.isBeingEdited_) { - this.isTextValid_ = false; - const oldValue = this.value_; - // Revert value when the text becomes invalid. - this.value_ = this.htmlInput_!.getAttribute('data-untyped-default-value'); - if (this.sourceBlock_ && eventUtils.isEnabled()) { - eventUtils.fire(new (eventUtils.get(eventUtils.BLOCK_CHANGE))( - this.sourceBlock_, 'field', this.name || null, oldValue, - this.value_)); - } - } - } - - /** - * Called by setValue if the text input is valid. Updates the value of the - * field, and updates the text of the field if it is not currently being - * edited (i.e. handled by the htmlInput_). - * - * @param newValue The value to be saved. The default validator guarantees - * that this is a string. - */ - protected override doValueUpdate_(newValue: AnyDuringMigration) { - this.isTextValid_ = true; - this.value_ = newValue; - if (!this.isBeingEdited_) { - // This should only occur if setValue is triggered programmatically. - this.isDirty_ = true; - } - } - - /** - * Updates text field to match the colour/style of the block. - * - * @internal - */ - override applyColour() { - if (!this.sourceBlock_ || !this.getConstants()!.FULL_BLOCK_FIELDS) return; - - const source = this.sourceBlock_ as BlockSvg; - - if (this.borderRect_) { - this.borderRect_.setAttribute('stroke', source.style.colourTertiary); - } else { - source.pathObject.svgPath.setAttribute( - 'fill', this.getConstants()!.FIELD_BORDER_RECT_COLOUR); - } - } - - /** - * Updates the colour of the htmlInput given the current validity of the - * field's value. - */ - protected override render_() { - super.render_(); - // This logic is done in render_ rather than doValueInvalid_ or - // doValueUpdate_ so that the code is more centralized. - if (this.isBeingEdited_) { - this.resizeEditor_(); - const htmlInput = this.htmlInput_ as HTMLElement; - if (!this.isTextValid_) { - dom.addClass(htmlInput, 'blocklyInvalidInput'); - aria.setState(htmlInput, aria.State.INVALID, true); - } else { - dom.removeClass(htmlInput, 'blocklyInvalidInput'); - aria.setState(htmlInput, aria.State.INVALID, false); - } - } - } - - /** - * Set whether this field is spellchecked by the browser. - * - * @param check True if checked. - */ - setSpellcheck(check: boolean) { - if (check === this.spellcheck_) { - return; - } - this.spellcheck_ = check; - if (this.htmlInput_) { - // AnyDuringMigration because: Argument of type 'boolean' is not - // assignable to parameter of type 'string'. - this.htmlInput_.setAttribute( - 'spellcheck', this.spellcheck_ as AnyDuringMigration); - } - } - - /** - * Show the inline free-text editor on top of the text. - * - * @param _opt_e Optional mouse event that triggered the field to open, or - * undefined if triggered programmatically. - * @param opt_quietInput True if editor should be created without focus. - * Defaults to false. - */ - protected override showEditor_(_opt_e?: Event, opt_quietInput?: boolean) { - this.workspace_ = (this.sourceBlock_ as BlockSvg).workspace; - const quietInput = opt_quietInput || false; - if (!quietInput && - (userAgent.MOBILE || userAgent.ANDROID || userAgent.IPAD)) { - this.showPromptEditor_(); - } else { - this.showInlineEditor_(quietInput); - } - } - - /** - * Create and show a text input editor that is a prompt (usually a popup). - * Mobile browsers have issues with in-line textareas (focus and keyboards). - */ - private showPromptEditor_() { - dialog.prompt( - Msg['CHANGE_VALUE_TITLE'], this.getText(), (text: string|null) => { - // Text is null if user pressed cancel button. - if (text !== null) { - this.setValue(this.getValueFromEditorText_(text)); - } - }); - } - - /** - * Create and show a text input editor that sits directly over the text input. - * - * @param quietInput True if editor should be created without focus. - */ - private showInlineEditor_(quietInput: boolean) { - const block = this.getSourceBlock(); - if (!block) { - throw new UnattachedFieldError(); - } - WidgetDiv.show(this, block.RTL, this.widgetDispose_.bind(this)); - this.htmlInput_ = this.widgetCreate_() as HTMLInputElement; - this.isBeingEdited_ = true; - - if (!quietInput) { - (this.htmlInput_ as HTMLElement).focus({ - preventScroll: true, - }); - this.htmlInput_.select(); - } - } - - /** - * Create the text input editor widget. - * - * @returns The newly created text input editor. - */ - protected widgetCreate_(): HTMLElement { - const block = this.getSourceBlock(); - if (!block) { - throw new UnattachedFieldError(); - } - eventUtils.setGroup(true); - const div = WidgetDiv.getDiv(); - - const clickTarget = this.getClickTarget_(); - if (!clickTarget) throw new Error('A click target has not been set.'); - dom.addClass(clickTarget, 'editing'); - - const htmlInput = (document.createElement('input')); - htmlInput.className = 'blocklyHtmlInput'; - // AnyDuringMigration because: Argument of type 'boolean' is not assignable - // to parameter of type 'string'. - htmlInput.setAttribute( - 'spellcheck', this.spellcheck_ as AnyDuringMigration); - const scale = this.workspace_!.getScale(); - const fontSize = this.getConstants()!.FIELD_TEXT_FONTSIZE * scale + 'pt'; - div!.style.fontSize = fontSize; - htmlInput.style.fontSize = fontSize; - let borderRadius = FieldTextInput.BORDERRADIUS * scale + 'px'; - - if (this.fullBlockClickTarget_) { - const bBox = this.getScaledBBox(); - - // Override border radius. - 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; - htmlInput.style.border = 1 * scale + 'px solid ' + strokeColour; - div!.style.borderRadius = borderRadius; - div!.style.transition = 'box-shadow 0.25s ease 0s'; - if (this.getConstants()!.FIELD_TEXTINPUT_BOX_SHADOW) { - div!.style.boxShadow = - 'rgba(255, 255, 255, 0.3) 0 0 0 ' + 4 * scale + 'px'; - } - } - htmlInput.style.borderRadius = borderRadius; - - div!.appendChild(htmlInput); - - htmlInput.value = htmlInput.defaultValue = this.getEditorText_(this.value_); - htmlInput.setAttribute('data-untyped-default-value', this.value_); - htmlInput.setAttribute('data-old-value', ''); - - this.resizeEditor_(); - - this.bindInputEvents_(htmlInput); - - return htmlInput; - } - - /** - * Closes the editor, saves the results, and disposes of any events or - * DOM-references belonging to the editor. - */ - protected widgetDispose_() { - // Non-disposal related things that we do when the editor closes. - this.isBeingEdited_ = false; - this.isTextValid_ = true; - // Make sure the field's node matches the field's internal value. - this.forceRerender(); - this.onFinishEditing_(this.value_); - eventUtils.setGroup(false); - - // Actual disposal. - this.unbindInputEvents_(); - const style = WidgetDiv.getDiv()!.style; - style.width = 'auto'; - style.height = 'auto'; - style.fontSize = ''; - style.transition = ''; - style.boxShadow = ''; - this.htmlInput_ = null; - - const clickTarget = this.getClickTarget_(); - if (!clickTarget) throw new Error('A click target has not been set.'); - dom.removeClass(clickTarget, 'editing'); - } - - /** - * A callback triggered when the user is done editing the field via the UI. - * - * @param _value The new value of the field. - */ - onFinishEditing_(_value: AnyDuringMigration) {} - // NOP by default. - // TODO(#2496): Support people passing a func into the field. - - /** - * Bind handlers for user input on the text input field's editor. - * - * @param htmlInput The htmlInput to which event handlers will be bound. - */ - protected bindInputEvents_(htmlInput: HTMLElement) { - // Trap Enter without IME and Esc to hide. - this.onKeyDownWrapper_ = browserEvents.conditionalBind( - htmlInput, 'keydown', this, this.onHtmlInputKeyDown_); - // Resize after every input change. - this.onKeyInputWrapper_ = browserEvents.conditionalBind( - htmlInput, 'input', this, this.onHtmlInputChange_); - } - - /** Unbind handlers for user input and workspace size changes. */ - protected unbindInputEvents_() { - if (this.onKeyDownWrapper_) { - browserEvents.unbind(this.onKeyDownWrapper_); - this.onKeyDownWrapper_ = null; - } - if (this.onKeyInputWrapper_) { - browserEvents.unbind(this.onKeyInputWrapper_); - this.onKeyInputWrapper_ = null; - } - } - - /** - * Handle key down to the editor. - * - * @param e Keyboard event. - */ - protected onHtmlInputKeyDown_(e: Event) { - // AnyDuringMigration because: Property 'keyCode' does not exist on type - // 'Event'. - if ((e as AnyDuringMigration).keyCode === KeyCodes.ENTER) { - WidgetDiv.hide(); - dropDownDiv.hideWithoutAnimation(); - // AnyDuringMigration because: Property 'keyCode' does not exist on type - // 'Event'. - } else if ((e as AnyDuringMigration).keyCode === KeyCodes.ESC) { - this.setValue( - this.htmlInput_!.getAttribute('data-untyped-default-value')); - WidgetDiv.hide(); - dropDownDiv.hideWithoutAnimation(); - // AnyDuringMigration because: Property 'keyCode' does not exist on type - // 'Event'. - } else if ((e as AnyDuringMigration).keyCode === KeyCodes.TAB) { - WidgetDiv.hide(); - dropDownDiv.hideWithoutAnimation(); - // AnyDuringMigration because: Property 'shiftKey' does not exist on type - // 'Event'. AnyDuringMigration because: Argument of type 'this' is not - // assignable to parameter of type 'Field'. - (this.sourceBlock_ as BlockSvg) - .tab(this as AnyDuringMigration, !(e as AnyDuringMigration).shiftKey); - e.preventDefault(); - } - } - - /** - * Handle a change to the editor. - * - * @param _e Keyboard event. - */ - private onHtmlInputChange_(_e: Event) { - const text = this.htmlInput_!.value; - if (text !== this.htmlInput_!.getAttribute('data-old-value')) { - this.htmlInput_!.setAttribute('data-old-value', text); - - const value = this.getValueFromEditorText_(text); - this.setValue(value); - this.forceRerender(); - this.resizeEditor_(); - } - } - - /** - * Set the HTML input value and the field's internal value. The difference - * between this and `setValue` is that this also updates the HTML input - * value whilst editing. - * - * @param newValue New value. - */ - protected setEditorValue_(newValue: AnyDuringMigration) { - this.isDirty_ = true; - if (this.isBeingEdited_) { - // In the case this method is passed an invalid value, we still - // pass it through the transformation method `getEditorText` to deal - // with. Otherwise, the internal field's state will be inconsistent - // with what's shown to the user. - this.htmlInput_!.value = this.getEditorText_(newValue); - } - this.setValue(newValue); - } - - /** Resize the editor to fit the text. */ - protected resizeEditor_() { - const block = this.getSourceBlock(); - if (!block) { - throw new UnattachedFieldError(); - } - const div = WidgetDiv.getDiv(); - const bBox = this.getScaledBBox(); - div!.style.width = bBox.right - bBox.left + 'px'; - div!.style.height = bBox.bottom - bBox.top + 'px'; - - // In RTL mode block fields and LTR input fields the left edge moves, - // whereas the right edge is fixed. Reposition the editor. - const x = block.RTL ? bBox.right - div!.offsetWidth : bBox.left; - const xy = new Coordinate(x, bBox.top); - - div!.style.left = xy.x + 'px'; - div!.style.top = xy.y + 'px'; - } - - /** - * Returns whether or not the field is tab navigable. - * - * @returns True if the field is tab navigable. - */ - override isTabNavigable(): boolean { - return true; - } - - /** - * Use the `getText_` developer hook to override the field's text - * representation. When we're currently editing, return the current HTML value - * instead. Otherwise, return null which tells the field to use the default - * behaviour (which is a string cast of the field's value). - * - * @returns The HTML value if we're editing, otherwise null. - */ - protected override getText_(): string|null { - if (this.isBeingEdited_ && this.htmlInput_) { - // We are currently editing, return the HTML input value instead. - return this.htmlInput_.value; - } - return null; - } - - /** - * Transform the provided value into a text to show in the HTML input. - * Override this method if the field's HTML input representation is different - * than the field's value. This should be coupled with an override of - * `getValueFromEditorText_`. - * - * @param value The value stored in this field. - * @returns The text to show on the HTML input. - */ - protected getEditorText_(value: AnyDuringMigration): string { - return String(value); - } - - /** - * Transform the text received from the HTML input into a value to store - * in this field. - * Override this method if the field's HTML input representation is different - * than the field's value. This should be coupled with an override of - * `getEditorText_`. - * - * @param text Text received from the HTML input. - * @returns The value to store. - */ - protected getValueFromEditorText_(text: string): AnyDuringMigration { - return text; + opt_value?: string|Sentinel, opt_validator?: FieldTextInputValidator|null, + opt_config?: FieldInputConfig) { + super(opt_value, opt_validator, opt_config); } /** @@ -610,18 +62,13 @@ export class FieldTextInput extends Field { fieldRegistry.register('field_input', FieldTextInput); -(FieldTextInput.prototype as AnyDuringMigration).DEFAULT_VALUE = ''; - -/** - * Config options for the text input field. - */ -export interface FieldTextInputConfig extends FieldConfig { - spellcheck?: boolean; -} +FieldTextInput.prototype.DEFAULT_VALUE = ''; /** * fromJson config options for the text input field. */ -export interface FieldTextInputFromJsonConfig extends FieldTextInputConfig { +export interface FieldTextInputFromJsonConfig extends FieldInputConfig { text?: string; } + +export {FieldInputConfig as FieldTextInputConfig}; diff --git a/core/field_variable.ts b/core/field_variable.ts index 040a2f0ff..e3b98f4fe 100644 --- a/core/field_variable.ts +++ b/core/field_variable.ts @@ -17,7 +17,7 @@ import './events/events_block_change.js'; import type {Block} from './block.js'; import {Field, FieldConfig, UnattachedFieldError} from './field.js'; -import {FieldDropdown, MenuGenerator, MenuOption} from './field_dropdown.js'; +import {FieldDropdown, FieldDropdownValidator, MenuGenerator, MenuOption} from './field_dropdown.js'; import * as fieldRegistry from './field_registry.js'; import * as internalConstants from './internal_constants.js'; import type {Menu} from './menu.js'; @@ -30,6 +30,7 @@ import {VariableModel} from './variable_model.js'; import * as Variables from './variables.js'; import * as Xml from './xml.js'; +export type FieldVariableValidator = FieldDropdownValidator; /** * Class for a variable's dropdown field. @@ -79,7 +80,7 @@ export class FieldVariable extends FieldDropdown { * for a list of properties this parameter supports. */ constructor( - varName: string|null|Sentinel, opt_validator?: Function, + varName: string|null|Sentinel, opt_validator?: FieldVariableValidator, opt_variableTypes?: string[], opt_defaultType?: string, opt_config?: FieldVariableConfig) { super(Field.SKIP_SETUP); diff --git a/core/flyout_base.ts b/core/flyout_base.ts index 762e9078c..be6b5da4b 100644 --- a/core/flyout_base.ts +++ b/core/flyout_base.ts @@ -371,7 +371,7 @@ export abstract class Flyout extends DeleteArea implements IFlyout { Array.prototype.push.apply( this.eventWrappers_, browserEvents.conditionalBind( - (this.svgBackground_ as SVGPathElement), 'mousedown', this, + (this.svgBackground_ as SVGPathElement), 'pointerdown', this, this.onMouseDown_)); // A flyout connected to a workspace doesn't have its own current gesture. @@ -450,7 +450,6 @@ export abstract class Flyout extends DeleteArea implements IFlyout { * Get the workspace inside the flyout. * * @returns The workspace inside the flyout. - * @internal */ getWorkspace(): WorkspaceSvg { return this.workspace_; @@ -615,7 +614,7 @@ export abstract class Flyout extends DeleteArea implements IFlyout { } this.listeners_.push(browserEvents.conditionalBind( - (this.svgBackground_ as SVGPathElement), 'mouseover', this, + (this.svgBackground_ as SVGPathElement), 'pointerover', this, deselectAll)); if (this.horizontalLayout) { @@ -912,27 +911,27 @@ export abstract class Flyout extends DeleteArea implements IFlyout { protected addBlockListeners_( root: SVGElement, block: BlockSvg, rect: SVGElement) { this.listeners_.push(browserEvents.conditionalBind( - root, 'mousedown', null, this.blockMouseDown_(block))); + root, 'pointerdown', null, this.blockMouseDown_(block))); this.listeners_.push(browserEvents.conditionalBind( - rect, 'mousedown', null, this.blockMouseDown_(block))); + rect, 'pointerdown', null, this.blockMouseDown_(block))); this.listeners_.push( - browserEvents.bind(root, 'mouseenter', block, block.addSelect)); + browserEvents.bind(root, 'pointerenter', block, block.addSelect)); this.listeners_.push( - browserEvents.bind(root, 'mouseleave', block, block.removeSelect)); + browserEvents.bind(root, 'pointerleave', block, block.removeSelect)); this.listeners_.push( - browserEvents.bind(rect, 'mouseenter', block, block.addSelect)); + browserEvents.bind(rect, 'pointerenter', block, block.addSelect)); this.listeners_.push( - browserEvents.bind(rect, 'mouseleave', block, block.removeSelect)); + browserEvents.bind(rect, 'pointerleave', block, block.removeSelect)); } /** - * Handle a mouse-down on an SVG block in a non-closing flyout. + * Handle a pointerdown on an SVG block in a non-closing flyout. * * @param block The flyout block to copy. * @returns Function to call when block is clicked. */ private blockMouseDown_(block: BlockSvg): Function { - return (e: MouseEvent) => { + return (e: PointerEvent) => { const gesture = this.targetWorkspace.getGesture(e); if (gesture) { gesture.setStartBlock(block); @@ -942,11 +941,11 @@ export abstract class Flyout extends DeleteArea implements IFlyout { } /** - * Mouse down on the flyout background. Start a vertical scroll drag. + * Pointer down on the flyout background. Start a vertical scroll drag. * - * @param e Mouse down event. + * @param e Pointer down event. */ - private onMouseDown_(e: MouseEvent) { + private onMouseDown_(e: PointerEvent) { const gesture = this.targetWorkspace.getGesture(e); if (gesture) { gesture.handleFlyoutStart(e, this); @@ -1027,7 +1026,7 @@ export abstract class Flyout extends DeleteArea implements IFlyout { // Clicking on a flyout button or label is a lot like clicking on the // flyout background. this.listeners_.push(browserEvents.conditionalBind( - buttonSvg, 'mousedown', this, this.onMouseDown_)); + buttonSvg, 'pointerdown', this, this.onMouseDown_)); this.buttons_.push(button); } diff --git a/core/flyout_button.ts b/core/flyout_button.ts index 256df77fd..9faa5671e 100644 --- a/core/flyout_button.ts +++ b/core/flyout_button.ts @@ -170,7 +170,8 @@ export class FlyoutButton { // AnyDuringMigration because: Argument of type 'SVGGElement | null' is not // assignable to parameter of type 'EventTarget'. this.onMouseUpWrapper_ = browserEvents.conditionalBind( - this.svgGroup_ as AnyDuringMigration, 'mouseup', this, this.onMouseUp_); + this.svgGroup_ as AnyDuringMigration, 'pointerup', this, + this.onMouseUp_); return this.svgGroup_!; } @@ -244,9 +245,9 @@ export class FlyoutButton { /** * Do something when the button is clicked. * - * @param e Mouse up event. + * @param e Pointer up event. */ - private onMouseUp_(e: Event) { + private onMouseUp_(e: PointerEvent) { const gesture = this.targetWorkspace.getGesture(e); if (gesture) { gesture.cancel(); diff --git a/core/gesture.ts b/core/gesture.ts index 295d30721..935aa37d8 100644 --- a/core/gesture.ts +++ b/core/gesture.ts @@ -5,8 +5,8 @@ */ /** - * The class representing an in-progress gesture, usually a drag - * or a tap. + * The class representing an in-progress gesture, e.g. a drag, + * tap, or pinch to zoom. * * @class */ @@ -22,6 +22,7 @@ import * as browserEvents from './browser_events.js'; import {BubbleDragger} from './bubble_dragger.js'; import * as common from './common.js'; import {config} from './config.js'; +import * as dropDownDiv from './dropdowndiv.js'; import * as eventUtils from './events/utils.js'; import type {Field} from './field.js'; import type {IBlockDragger} from './interfaces/i_block_dragger.js'; @@ -38,10 +39,16 @@ import type {WorkspaceSvg} from './workspace_svg.js'; /** - * Note: In this file "start" refers to touchstart, mousedown, and pointerstart - * events. "End" refers to touchend, mouseup, and pointerend events. + * Note: In this file "start" refers to pointerdown + * events. "End" refers to pointerup events. */ -// TODO: Consider touchcancel/pointercancel. + +/** A multiplier used to convert the gesture scale to a zoom in delta. */ +const ZOOM_IN_MULTIPLIER = 5; + +/** A multiplier used to convert the gesture scale to a zoom out delta. */ +const ZOOM_OUT_MULTIPLIER = 6; + /** * Class for one gesture. * @@ -49,8 +56,8 @@ import type {WorkspaceSvg} from './workspace_svg.js'; */ export class Gesture { /** - * The position of the mouse when the gesture started. Units are CSS - * pixels, with (0, 0) at the top left of the browser window (mouseEvent + * The position of the pointer when the gesture started. Units are CSS + * pixels, with (0, 0) at the top left of the browser window (pointer event * clientX/Y). */ private mouseDownXY_ = new Coordinate(0, 0); @@ -97,13 +104,13 @@ export class Gesture { private hasExceededDragRadius_ = false; /** - * A handle to use to unbind a mouse move listener at the end of a drag. + * A handle to use to unbind a pointermove listener at the end of a drag. * Opaque data returned from Blockly.bindEventWithChecks_. */ protected onMoveWrapper_: browserEvents.Data|null = null; /** - * A handle to use to unbind a mouse up listener at the end of a drag. + * A handle to use to unbind a pointerup listener at the end of a drag. * Opaque data returned from Blockly.bindEventWithChecks_. */ protected onUpWrapper_: browserEvents.Data|null = null; @@ -134,18 +141,54 @@ export class Gesture { private healStack_: boolean; /** The event that most recently updated this gesture. */ - private mostRecentEvent_: Event; + private mostRecentEvent_: PointerEvent; + + /** Boolean for whether or not this gesture is a multi-touch gesture. */ + private isMultiTouch_ = false; + + /** A map of cached points used for tracking multi-touch gestures. */ + private cachedPoints = new Map(); + + /** + * This is the ratio between the starting distance between the touch points + * and the most recent distance between the touch points. + * Scales between 0 and 1 mean the most recent zoom was a zoom out. + * Scales above 1.0 mean the most recent zoom was a zoom in. + */ + private previousScale_ = 0; + + /** The starting distance between two touch points. */ + private startDistance_ = 0; + + /** + * A handle to use to unbind the second pointerdown listener + * at the end of a drag. + * Opaque data returned from Blockly.bindEventWithChecks_. + */ + private onStartWrapper_: browserEvents.Data|null = null; + + /** Boolean for whether or not the workspace supports pinch-zoom. */ + private isPinchZoomEnabled_: boolean|null = null; + + /** + * The owner of the dropdownDiv when this gesture first starts. + * Needed because we'll close the dropdown before fields get to + * act on their events, and some fields care about who owns + * the dropdown. + */ + currentDropdownOwner: Field|null = null; /** * @param e The event that kicked off this gesture. * @param creatorWorkspace The workspace that created this gesture and has a * reference to it. */ - constructor(e: Event, private readonly creatorWorkspace: WorkspaceSvg) { + constructor( + e: PointerEvent, private readonly creatorWorkspace: WorkspaceSvg) { this.mostRecentEvent_ = e; /** - * How far the mouse has moved during this drag, in pixel units. + * How far the pointer has moved during this drag, in pixel units. * (0, 0) is at this.mouseDownXY_. */ this.currentDragDeltaXY_ = new Coordinate(0, 0); @@ -181,19 +224,19 @@ export class Gesture { if (this.workspaceDragger_) { this.workspaceDragger_.dispose(); } + + if (this.onStartWrapper_) { + browserEvents.unbind(this.onStartWrapper_); + } } /** * Update internal state based on an event. * - * @param e The most recent mouse or touch event. + * @param e The most recent pointer event. */ - private updateFromEvent_(e: Event) { - // AnyDuringMigration because: Property 'clientY' does not exist on type - // 'Event'. AnyDuringMigration because: Property 'clientX' does not exist - // on type 'Event'. - const currentXY = new Coordinate( - (e as AnyDuringMigration).clientX, (e as AnyDuringMigration).clientY); + private updateFromEvent_(e: PointerEvent) { + const currentXY = new Coordinate(e.clientX, e.clientY); const changed = this.updateDragDelta_(currentXY); // Exceeded the drag radius for the first time. if (changed) { @@ -204,9 +247,10 @@ export class Gesture { } /** - * DO MATH to set currentDragDeltaXY_ based on the most recent mouse position. + * DO MATH to set currentDragDeltaXY_ based on the most recent pointer + * position. * - * @param currentXY The most recent mouse/pointer position, in pixel units, + * @param currentXY The most recent pointer position, in pixel units, * with (0, 0) at the window's top left corner. * @returns True if the drag just exceeded the drag radius for the first time. */ @@ -230,7 +274,7 @@ export class Gesture { /** * Update this gesture to record whether a block is being dragged from the * flyout. - * This function should be called on a mouse/touch move event the first time + * This function should be called on a pointermove event the first time * the drag radius is exceeded. It should be called no more than once per * gesture. If a block should be dragged from the flyout this function creates * the new block on the main workspace and updates targetBlock_ and @@ -267,7 +311,7 @@ export class Gesture { /** * Update this gesture to record whether a bubble is being dragged. - * This function should be called on a mouse/touch move event the first time + * This function should be called on a pointermove event the first time * the drag radius is exceeded. It should be called no more than once per * gesture. If a bubble should be dragged this function creates the necessary * BubbleDragger and starts the drag. @@ -288,7 +332,7 @@ export class Gesture { * from the flyout or in the workspace, create the necessary BlockDragger and * start the drag. * - * This function should be called on a mouse/touch move event the first time + * This function should be called on a pointermove event the first time * the drag radius is exceeded. It should be called no more than once per * gesture. If a block should be dragged, either from the flyout or in the * workspace, this function creates the necessary BlockDragger and starts the @@ -316,7 +360,7 @@ export class Gesture { * Check whether to start a workspace drag. If a workspace is being dragged, * create the necessary WorkspaceDragger and start the drag. * - * This function should be called on a mouse/touch move event the first time + * This function should be called on a pointermove event the first time * the drag radius is exceeded. It should be called no more than once per * gesture. If a workspace is being dragged this function creates the * necessary WorkspaceDragger and starts the drag. @@ -340,7 +384,7 @@ export class Gesture { /** * Update this gesture to record whether anything is being dragged. - * This function should be called on a mouse/touch move event the first time + * This function should be called on a pointermove event the first time * the drag radius is exceeded. It should be called no more than once per * gesture. */ @@ -398,23 +442,25 @@ export class Gesture { /** * Start a gesture: update the workspace to indicate that a gesture is in - * progress and bind mousemove and mouseup handlers. + * progress and bind pointermove and pointerup handlers. * - * @param e A mouse down or touch start event. + * @param e A pointerdown event. * @internal */ - doStart(e: MouseEvent) { + doStart(e: PointerEvent) { + if (!this.startWorkspace_) { + throw new Error( + 'Cannot start the touch gesture becauase the start ' + + 'workspace is undefined'); + } + this.isPinchZoomEnabled_ = this.startWorkspace_.options.zoomOptions && + this.startWorkspace_.options.zoomOptions.pinch; + if (browserEvents.isTargetInput(e)) { this.cancel(); return; } - if (!this.startWorkspace_) { - throw new Error( - 'Cannot start the gesture because the start ' + - 'workspace is undefined'); - } - this.hasStarted_ = true; blockAnimations.disconnectUiStop(); @@ -425,6 +471,9 @@ export class Gesture { // dragged, the block was moved, the parent workspace zoomed, etc. this.startWorkspace_.resize(); } + + // Keep track of which field owns the dropdown before we close it. + this.currentDropdownOwner = dropDownDiv.getOwner(); // Hide chaff also hides the flyout, so don't do it if the click is in a // flyout. this.startWorkspace_.hideChaff(!!this.flyout_); @@ -443,106 +492,252 @@ export class Gesture { return; } - // TODO(#6097): Make types accurate, possibly by refactoring touch handling. - const typelessEvent = e as AnyDuringMigration; - if ((e.type.toLowerCase() === 'touchstart' || - e.type.toLowerCase() === 'pointerdown') && - typelessEvent.pointerType !== 'mouse') { - Touch.longStart(typelessEvent, this); + if (e.type.toLowerCase() === 'pointerdown' && e.pointerType !== 'mouse') { + Touch.longStart(e, this); } - // AnyDuringMigration because: Property 'clientY' does not exist on type - // 'Event'. AnyDuringMigration because: Property 'clientX' does not exist - // on type 'Event'. - this.mouseDownXY_ = new Coordinate( - (e as AnyDuringMigration).clientX, (e as AnyDuringMigration).clientY); - // AnyDuringMigration because: Property 'metaKey' does not exist on type - // 'Event'. AnyDuringMigration because: Property 'ctrlKey' does not exist - // on type 'Event'. AnyDuringMigration because: Property 'altKey' does not - // exist on type 'Event'. - this.healStack_ = (e as AnyDuringMigration).altKey || - (e as AnyDuringMigration).ctrlKey || (e as AnyDuringMigration).metaKey; + this.mouseDownXY_ = new Coordinate(e.clientX, e.clientY); + this.healStack_ = e.altKey || e.ctrlKey || e.metaKey; this.bindMouseEvents(e); + + if (!this.isEnding_) { + this.handleTouchStart(e); + } } /** * Bind gesture events. * - * @param e A mouse down or touch start event. + * @param e A pointerdown event. * @internal */ - bindMouseEvents(e: Event) { + bindMouseEvents(e: PointerEvent) { + this.onStartWrapper_ = browserEvents.conditionalBind( + document, 'pointerdown', null, this.handleStart.bind(this), + /* opt_noCaptureIdentifier */ true); this.onMoveWrapper_ = browserEvents.conditionalBind( - document, 'mousemove', null, this.handleMove.bind(this)); + document, 'pointermove', null, this.handleMove.bind(this), + /* opt_noCaptureIdentifier */ true); this.onUpWrapper_ = browserEvents.conditionalBind( - document, 'mouseup', null, this.handleUp.bind(this)); + document, 'pointerup', null, this.handleUp.bind(this), + /* opt_noCaptureIdentifier */ true); e.preventDefault(); e.stopPropagation(); } /** - * Handle a mouse move or touch move event. + * Handle a pointerdown event. * - * @param e A mouse move or touch move event. + * @param e A pointerdown event. * @internal */ - handleMove(e: Event) { - this.updateFromEvent_(e); - if (this.workspaceDragger_) { - this.workspaceDragger_.drag(this.currentDragDeltaXY_); - } else if (this.blockDragger_) { - this.blockDragger_.drag(this.mostRecentEvent_, this.currentDragDeltaXY_); - } else if (this.bubbleDragger_) { - this.bubbleDragger_.dragBubble( - this.mostRecentEvent_, this.currentDragDeltaXY_); - } - e.preventDefault(); - e.stopPropagation(); - } - - /** - * Handle a mouse up or touch end event. - * - * @param e A mouse up or touch end event. - * @internal - */ - handleUp(e: Event) { - this.updateFromEvent_(e); - Touch.longStop(); - - if (this.isEnding_) { - console.log('Trying to end a gesture recursively.'); + handleStart(e: PointerEvent) { + if (this.isDragging()) { + // A drag has already started, so this can no longer be a pinch-zoom. return; } - this.isEnding_ = true; - // The ordering of these checks is important: drags have higher priority - // than clicks. Fields have higher priority than blocks; blocks have higher - // priority than workspaces. - // The ordering within drags does not matter, because the three types of - // dragging are exclusive. - if (this.bubbleDragger_) { - this.bubbleDragger_.endBubbleDrag(e, this.currentDragDeltaXY_); - } else if (this.blockDragger_) { - this.blockDragger_.endDrag(e, this.currentDragDeltaXY_); - } else if (this.workspaceDragger_) { - this.workspaceDragger_.endDrag(this.currentDragDeltaXY_); - } else if (this.isBubbleClick_()) { - // Bubbles are in front of all fields and blocks. - this.doBubbleClick_(); - } else if (this.isFieldClick_()) { - this.doFieldClick_(); - } else if (this.isBlockClick_()) { - this.doBlockClick_(); - } else if (this.isWorkspaceClick_()) { - this.doWorkspaceClick_(e); + this.handleTouchStart(e); + + if (this.isMultiTouch()) { + Touch.longStop(); } + } + /** + * Handle a pointermove event. + * + * @param e A pointermove event. + * @internal + */ + handleMove(e: PointerEvent) { + if ((this.isDragging() && Touch.shouldHandleEvent(e)) || + !this.isMultiTouch()) { + this.updateFromEvent_(e); + if (this.workspaceDragger_) { + this.workspaceDragger_.drag(this.currentDragDeltaXY_); + } else if (this.blockDragger_) { + this.blockDragger_.drag( + this.mostRecentEvent_, this.currentDragDeltaXY_); + } else if (this.bubbleDragger_) { + this.bubbleDragger_.dragBubble( + this.mostRecentEvent_, this.currentDragDeltaXY_); + } + e.preventDefault(); + e.stopPropagation(); + } else if (this.isMultiTouch()) { + this.handleTouchMove(e); + Touch.longStop(); + } + } + + /** + * Handle a pointerup event. + * + * @param e A pointerup event. + * @internal + */ + handleUp(e: PointerEvent) { + if (!this.isDragging()) { + this.handleTouchEnd(e); + } + if (!this.isMultiTouch() || this.isDragging()) { + if (!Touch.shouldHandleEvent(e)) { + return; + } + this.updateFromEvent_(e); + Touch.longStop(); + + if (this.isEnding_) { + console.log('Trying to end a gesture recursively.'); + return; + } + this.isEnding_ = true; + // The ordering of these checks is important: drags have higher priority + // than clicks. Fields have higher priority than blocks; blocks have + // higher priority than workspaces. The ordering within drags does not + // matter, because the three types of dragging are exclusive. + if (this.bubbleDragger_) { + this.bubbleDragger_.endBubbleDrag(e, this.currentDragDeltaXY_); + } else if (this.blockDragger_) { + this.blockDragger_.endDrag(e, this.currentDragDeltaXY_); + } else if (this.workspaceDragger_) { + this.workspaceDragger_.endDrag(this.currentDragDeltaXY_); + } else if (this.isBubbleClick_()) { + // Bubbles are in front of all fields and blocks. + this.doBubbleClick_(); + } else if (this.isFieldClick_()) { + this.doFieldClick_(); + } else if (this.isBlockClick_()) { + this.doBlockClick_(); + } else if (this.isWorkspaceClick_()) { + this.doWorkspaceClick_(e); + } + + e.preventDefault(); + e.stopPropagation(); + + this.dispose(); + } else { + e.preventDefault(); + e.stopPropagation(); + + this.dispose(); + } + } + + /** + * Handle a pointerdown event and keep track of current + * pointers. + * + * @param e A pointerdown event. + * @internal + */ + handleTouchStart(e: PointerEvent) { + const pointerId = Touch.getTouchIdentifierFromEvent(e); + // store the pointerId in the current list of pointers + this.cachedPoints.set(pointerId, this.getTouchPoint(e)); + const pointers = Array.from(this.cachedPoints.keys()); + // If two pointers are down, store info + if (pointers.length === 2) { + const point0 = (this.cachedPoints.get(pointers[0]))!; + const point1 = (this.cachedPoints.get(pointers[1]))!; + this.startDistance_ = Coordinate.distance(point0, point1); + this.isMultiTouch_ = true; + e.preventDefault(); + } + } + + /** + * Handle a pointermove event and zoom in/out if two pointers + * are on the screen. + * + * @param e A pointermove event. + * @internal + */ + handleTouchMove(e: PointerEvent) { + const pointerId = Touch.getTouchIdentifierFromEvent(e); + // Update the cache + this.cachedPoints.set(pointerId, this.getTouchPoint(e)); + + if (this.isPinchZoomEnabled_ && this.cachedPoints.size === 2) { + this.handlePinch_(e); + } else { + this.handleMove(e); + } + } + + /** + * Handle pinch zoom gesture. + * + * @param e A pointermove event. + */ + private handlePinch_(e: PointerEvent) { + const pointers = Array.from(this.cachedPoints.keys()); + // Calculate the distance between the two pointers + const point0 = (this.cachedPoints.get(pointers[0]))!; + const point1 = (this.cachedPoints.get(pointers[1]))!; + const moveDistance = Coordinate.distance(point0, point1); + const scale = moveDistance / this.startDistance_; + + if (this.previousScale_ > 0 && this.previousScale_ < Infinity) { + const gestureScale = scale - this.previousScale_; + const delta = gestureScale > 0 ? gestureScale * ZOOM_IN_MULTIPLIER : + gestureScale * ZOOM_OUT_MULTIPLIER; + if (!this.startWorkspace_) { + throw new Error( + 'Cannot handle a pinch because the start workspace ' + + 'is undefined'); + } + const workspace = this.startWorkspace_; + const position = browserEvents.mouseToSvg( + e, workspace.getParentSvg(), workspace.getInverseScreenCTM()); + workspace.zoom(position.x, position.y, delta); + } + this.previousScale_ = scale; e.preventDefault(); - e.stopPropagation(); + } - this.dispose(); + /** + * Handle a pointerup event and end the gesture. + * + * @param e A pointerup event. + * @internal + */ + handleTouchEnd(e: PointerEvent) { + const pointerId = Touch.getTouchIdentifierFromEvent(e); + if (this.cachedPoints.has(pointerId)) { + this.cachedPoints.delete(pointerId); + } + if (this.cachedPoints.size < 2) { + this.cachedPoints.clear(); + this.previousScale_ = 0; + } + } + + /** + * Helper function returning the current touch point coordinate. + * + * @param e A pointer event. + * @returns The current touch point coordinate + * @internal + */ + getTouchPoint(e: PointerEvent): Coordinate|null { + if (!this.startWorkspace_) { + return null; + } + return new Coordinate(e.pageX, e.pageY); + } + + /** + * Whether this gesture is part of a multi-touch gesture. + * + * @returns Whether this gesture is part of a multi-touch gesture. + * @internal + */ + isMultiTouch(): boolean { + return this.isMultiTouch_; } /** @@ -574,10 +769,10 @@ export class Gesture { /** * Handle a real or faked right-click event by showing a context menu. * - * @param e A mouse move or touch move event. + * @param e A pointerdown event. * @internal */ - handleRightClick(e: Event) { + handleRightClick(e: PointerEvent) { if (this.targetBlock_) { this.bringBlockToFront_(); this.targetBlock_.workspace.hideChaff(!!this.flyout_); @@ -597,13 +792,13 @@ export class Gesture { } /** - * Handle a mousedown/touchstart event on a workspace. + * Handle a pointerdown event on a workspace. * - * @param e A mouse down or touch start event. + * @param e A pointerdown event. * @param ws The workspace the event hit. * @internal */ - handleWsStart(e: MouseEvent, ws: WorkspaceSvg) { + handleWsStart(e: PointerEvent, ws: WorkspaceSvg) { if (this.hasStarted_) { throw Error( 'Tried to call gesture.handleWsStart, ' + @@ -625,13 +820,13 @@ export class Gesture { } /** - * Handle a mousedown/touchstart event on a flyout. + * Handle a pointerdown event on a flyout. * - * @param e A mouse down or touch start event. + * @param e A pointerdown event. * @param flyout The flyout the event hit. * @internal */ - handleFlyoutStart(e: MouseEvent, flyout: IFlyout) { + handleFlyoutStart(e: PointerEvent, flyout: IFlyout) { if (this.hasStarted_) { throw Error( 'Tried to call gesture.handleFlyoutStart, ' + @@ -642,13 +837,13 @@ export class Gesture { } /** - * Handle a mousedown/touchstart event on a block. + * Handle a pointerdown event on a block. * - * @param e A mouse down or touch start event. + * @param e A pointerdown event. * @param block The block the event hit. * @internal */ - handleBlockStart(e: Event, block: BlockSvg) { + handleBlockStart(e: PointerEvent, block: BlockSvg) { if (this.hasStarted_) { throw Error( 'Tried to call gesture.handleBlockStart, ' + @@ -659,13 +854,13 @@ export class Gesture { } /** - * Handle a mousedown/touchstart event on a bubble. + * Handle a pointerdown event on a bubble. * - * @param e A mouse down or touch start event. + * @param e A pointerdown event. * @param bubble The bubble the event hit. * @internal */ - handleBubbleStart(e: Event, bubble: IBubble) { + handleBubbleStart(e: PointerEvent, bubble: IBubble) { if (this.hasStarted_) { throw Error( 'Tried to call gesture.handleBubbleStart, ' + @@ -695,7 +890,13 @@ export class Gesture { 'Cannot do a field click because the start field is ' + 'undefined'); } - this.startField_.showEditor(this.mostRecentEvent_); + + // Only show the editor if the field's editor wasn't already open + // right before this gesture started. + const dropdownAlreadyOpen = this.currentDropdownOwner === this.startField_; + if (!dropdownAlreadyOpen) { + this.startField_.showEditor(this.mostRecentEvent_); + } this.bringBlockToFront_(); } @@ -734,9 +935,9 @@ export class Gesture { * Execute a workspace click. When in accessibility mode shift clicking will * move the cursor. * - * @param _e A mouse up or touch end event. + * @param _e A pointerup event. */ - private doWorkspaceClick_(_e: Event) { + private doWorkspaceClick_(_e: PointerEvent) { const ws = this.creatorWorkspace; if (common.getSelected()) { common.getSelected()!.unselect(); @@ -760,7 +961,7 @@ export class Gesture { } } - /* Begin functions for populating a gesture at mouse down. */ + /* Begin functions for populating a gesture at pointerdown. */ /** * Record the field that a gesture started on. @@ -849,14 +1050,14 @@ export class Gesture { } } - /* End functions for populating a gesture at mouse down. */ + /* End functions for populating a gesture at pointerdown. */ /* Begin helper functions defining types of clicks. Any developer wanting * to change the definition of a click should modify only this code. */ /** * Whether this gesture is a click on a bubble. This should only be called - * when ending a gesture (mouse up, touch end). + * when ending a gesture (pointerup). * * @returns Whether this gesture was a click on a bubble. */ @@ -868,7 +1069,7 @@ export class Gesture { /** * Whether this gesture is a click on a block. This should only be called - * when ending a gesture (mouse up, touch end). + * when ending a gesture (pointerup). * * @returns Whether this gesture was a click on a block. */ @@ -882,7 +1083,7 @@ export class Gesture { /** * Whether this gesture is a click on a field. This should only be called - * when ending a gesture (mouse up, touch end). + * when ending a gesture (pointerup). * * @returns Whether this gesture was a click on a field. */ @@ -895,7 +1096,7 @@ export class Gesture { /** * Whether this gesture is a click on a workspace. This should only be called - * when ending a gesture (mouse up, touch end). + * when ending a gesture (pointerup). * * @returns Whether this gesture was a click on a workspace. */ @@ -921,9 +1122,9 @@ export class Gesture { } /** - * Whether this gesture has already been started. In theory every mouse down - * has a corresponding mouse up, but in reality it is possible to lose a - * mouse up, leaving an in-process gesture hanging. + * Whether this gesture has already been started. In theory every pointerdown + * has a corresponding pointerup, but in reality it is possible to lose a + * pointerup, leaving an in-process gesture hanging. * * @returns Whether this gesture was a click on a workspace. * @internal diff --git a/core/icon.ts b/core/icon.ts index b771d706f..83051610a 100644 --- a/core/icon.ts +++ b/core/icon.ts @@ -75,7 +75,7 @@ export abstract class Icon { this.getBlock().getSvgRoot().appendChild(this.iconGroup_); browserEvents.conditionalBind( - this.iconGroup_, 'mouseup', this, this.iconClick_); + this.iconGroup_, 'pointerup', this, this.iconClick_); this.updateEditable(); } @@ -104,7 +104,7 @@ export abstract class Icon { * * @param e Mouse click event. */ - protected iconClick_(e: MouseEvent) { + protected iconClick_(e: PointerEvent) { if (this.getBlock().workspace.isDragging()) { // Drag operation is concluding. Don't open the editor. return; @@ -179,14 +179,14 @@ export abstract class Icon { // No-op on base class. /** - * Show or hide the icon. + * Show or hide the bubble. * - * @param _visible True if the icon should be visible. + * @param _visible True if the bubble should be visible. */ setVisible(_visible: boolean) {} /** - * Returns the block this icon is attached to. + * @returns The block this icon is attached to. */ protected getBlock(): BlockSvg { if (!this.block_) { diff --git a/core/inject.ts b/core/inject.ts index 833075665..71a359edb 100644 --- a/core/inject.ts +++ b/core/inject.ts @@ -393,7 +393,7 @@ function loadSounds(pathToMedia: string, workspace: WorkspaceSvg) { // Android ignores any sound not loaded as a result of a user action. soundBinds.push(browserEvents.conditionalBind( - document, 'mousemove', null, unbindSounds, true)); + document, 'pointermove', null, unbindSounds, true)); soundBinds.push(browserEvents.conditionalBind( document, 'touchstart', null, unbindSounds, true)); } diff --git a/core/input.ts b/core/input.ts index ed321a6ad..5b69e566a 100644 --- a/core/input.ts +++ b/core/input.ts @@ -30,12 +30,13 @@ import type {RenderedConnection} from './rendered_connection.js'; * @alias Blockly.Input */ export class Input { - private sourceBlock_: Block; + private sourceBlock: Block; fieldRow: Field[] = []; - align: Align; + /** Alignment of input's fields (left, right or centre). */ + align = Align.LEFT; /** Is the input visible? */ - private visible_ = true; + private visible = true; /** * @param type The type of the input. @@ -51,19 +52,16 @@ export class Input { throw Error( 'Value inputs and statement inputs must have non-empty name.'); } - this.sourceBlock_ = block; - - /** Alignment of input's fields (left, right or centre). */ - this.align = Align.LEFT; + this.sourceBlock = block; } /** * Get the source block for this input. * - * @returns The source block, or null if there is none. + * @returns The block this input is part of. */ getSourceBlock(): Block { - return this.sourceBlock_; + return this.sourceBlock; } /** @@ -75,7 +73,7 @@ export class Input { * field again. Should be unique to the host block. * @returns The input being append to (to allow chaining). */ - appendField(field: string|Field, opt_name?: string): Input { + appendField(field: string|Field, opt_name?: string): Input { this.insertFieldAt(this.fieldRow.length, field, opt_name); return this; } @@ -90,7 +88,8 @@ export class Input { * field again. Should be unique to the host block. * @returns The index following the last inserted field. */ - insertFieldAt(index: number, field: string|Field, opt_name?: string): number { + insertFieldAt(index: number, field: string|Field, opt_name?: string): + number { if (index < 0 || index > this.fieldRow.length) { throw Error('index ' + index + ' out of bounds.'); } @@ -103,13 +102,13 @@ export class Input { // Generate a FieldLabel when given a plain text field. if (typeof field === 'string') { field = fieldRegistry.fromJson({ - 'type': 'field_label', - 'text': field, - }) as Field; + type: 'field_label', + text: field, + })!; } - field.setSourceBlock(this.sourceBlock_); - if (this.sourceBlock_.rendered) { + field.setSourceBlock(this.sourceBlock); + if (this.sourceBlock.rendered) { field.init(); field.applyColour(); } @@ -121,17 +120,17 @@ export class Input { index = this.insertFieldAt(index, field.prefixField); } // Add the field to the field row. - this.fieldRow.splice(index, 0, field); + this.fieldRow.splice(index, 0, field as Field); index++; if (field.suffixField) { // Add any suffix. index = this.insertFieldAt(index, field.suffixField); } - if (this.sourceBlock_.rendered) { - (this.sourceBlock_ as BlockSvg).render(); + if (this.sourceBlock.rendered) { + (this.sourceBlock as BlockSvg).render(); // Adding a field will cause the block to change shape. - this.sourceBlock_.bumpNeighbours(); + this.sourceBlock.bumpNeighbours(); } return index; } @@ -150,10 +149,10 @@ export class Input { if (field.name === name) { field.dispose(); this.fieldRow.splice(i, 1); - if (this.sourceBlock_.rendered) { - (this.sourceBlock_ as BlockSvg).render(); + if (this.sourceBlock.rendered) { + (this.sourceBlock as BlockSvg).render(); // Removing a field will cause the block to change shape. - this.sourceBlock_.bumpNeighbours(); + this.sourceBlock.bumpNeighbours(); } return true; } @@ -170,7 +169,7 @@ export class Input { * @returns True if visible. */ isVisible(): boolean { - return this.visible_; + return this.visible; } /** @@ -186,10 +185,10 @@ export class Input { // because this function is package. If this function goes back to being a // public API tests (lots of tests) should be added. let renderList: AnyDuringMigration[] = []; - if (this.visible_ === visible) { + if (this.visible === visible) { return renderList; } - this.visible_ = visible; + this.visible = visible; for (let y = 0, field; field = this.fieldRow[y]; y++) { field.setVisible(visible); @@ -245,8 +244,8 @@ export class Input { */ setAlign(align: Align): Input { this.align = align; - if (this.sourceBlock_.rendered) { - const sourceBlock = this.sourceBlock_ as BlockSvg; + if (this.sourceBlock.rendered) { + const sourceBlock = this.sourceBlock as BlockSvg; sourceBlock.render(); } return this; @@ -280,7 +279,7 @@ export class Input { /** Initialize the fields on this input. */ init() { - if (!this.sourceBlock_.workspace.rendered) { + if (!this.sourceBlock.workspace.rendered) { return; // Headless blocks don't need fields initialized. } for (let i = 0; i < this.fieldRow.length; i++) { diff --git a/core/insertion_marker_manager.ts b/core/insertion_marker_manager.ts index 01a3301a6..278809a7d 100644 --- a/core/insertion_marker_manager.ts +++ b/core/insertion_marker_manager.ts @@ -29,8 +29,17 @@ import type {WorkspaceSvg} from './workspace_svg.js'; /** Represents a nearby valid connection. */ interface CandidateConnection { - closest: RenderedConnection|null; - local: RenderedConnection|null; + /** + * A nearby valid connection that is compatible with local. + * This is not on any of the blocks that are being dragged. + */ + closest: RenderedConnection; + /** + * A connection on the dragging stack that is compatible with closest. This is + * on the top block that is being dragged or the last block in the dragging + * stack. + */ + local: RenderedConnection; radius: number; } @@ -51,87 +60,81 @@ const DUPLICATE_BLOCK_ERROR = 'The insertion marker ' + * @alias Blockly.InsertionMarkerManager */ export class InsertionMarkerManager { - private readonly topBlock_: BlockSvg; - private readonly workspace_: WorkspaceSvg; + /** + * The top block in the stack being dragged. + * Does not change during a drag. + */ + private readonly topBlock: BlockSvg; + + /** + * The workspace on which these connections are being dragged. + * Does not change during a drag. + */ + private readonly workspace: WorkspaceSvg; /** * The last connection on the stack, if it's not the last connection on the * first block. * Set in initAvailableConnections, if at all. */ - private lastOnStack_: RenderedConnection|null = null; + private lastOnStack: RenderedConnection|null = null; /** * The insertion marker corresponding to the last block in the stack, if * that's not the same as the first block in the stack. * Set in initAvailableConnections, if at all */ - private lastMarker_: BlockSvg|null = null; - private firstMarker_: BlockSvg; + private lastMarker: BlockSvg|null = null; /** - * The connection that this block would connect to if released immediately. - * Updated on every mouse move. - * This is not on any of the blocks that are being dragged. + * The insertion marker that shows up between blocks to show where a block + * would go if dropped immediately. */ - private closestConnection_: RenderedConnection|null = null; + private firstMarker: BlockSvg; /** - * The connection that would connect to this.closestConnection_ if this - * block were released immediately. Updated on every mouse move. This is on - * the top block that is being dragged or the last block in the dragging - * stack. + * Information about the connection that would be made if the dragging block + * were released immediately. Updated on every mouse move. */ - private localConnection_: RenderedConnection|null = null; + private activeCandidate: CandidateConnection|null = null; /** * Whether the block would be deleted if it were dropped immediately. * Updated on every mouse move. + * + * @internal */ - private wouldDeleteBlock_ = false; + public wouldDeleteBlock = false; /** * Connection on the insertion marker block that corresponds to - * this.localConnection_ on the currently dragged block. + * the active candidate's local connection on the currently dragged block. */ - private markerConnection_: RenderedConnection|null = null; + private markerConnection: RenderedConnection|null = null; /** The block that currently has an input being highlighted, or null. */ - private highlightedBlock_: BlockSvg|null = null; + private highlightedBlock: BlockSvg|null = null; /** The block being faded to indicate replacement, or null. */ - private fadedBlock_: BlockSvg|null = null; - private availableConnections_: RenderedConnection[]; + private fadedBlock: BlockSvg|null = null; + + /** + * The connections on the dragging blocks that are available to connect to + * other blocks. This includes all open connections on the top block, as + * well as the last connection on the block stack. + */ + private availableConnections: RenderedConnection[]; /** @param block The top block in the stack being dragged. */ constructor(block: BlockSvg) { common.setSelected(block); + this.topBlock = block; - /** - * The top block in the stack being dragged. - * Does not change during a drag. - */ - this.topBlock_ = block; + this.workspace = block.workspace; - /** - * The workspace on which these connections are being dragged. - * Does not change during a drag. - */ - this.workspace_ = block.workspace; + this.firstMarker = this.createMarkerBlock(this.topBlock); - /** - * The insertion marker that shows up between blocks to show where a block - * would go if dropped immediately. - */ - this.firstMarker_ = this.createMarkerBlock_(this.topBlock_); - - /** - * The connections on the dragging blocks that are available to connect to - * other blocks. This includes all open connections on the top block, as - * well as the last connection on the block stack. Does not change during a - * drag. - */ - this.availableConnections_ = this.initAvailableConnections_(); + this.availableConnections = this.initAvailableConnections(); } /** @@ -140,15 +143,15 @@ export class InsertionMarkerManager { * @internal */ dispose() { - this.availableConnections_.length = 0; + this.availableConnections.length = 0; eventUtils.disable(); try { - if (this.firstMarker_) { - this.firstMarker_.dispose(); + if (this.firstMarker) { + this.firstMarker.dispose(); } - if (this.lastMarker_) { - this.lastMarker_.dispose(); + if (this.lastMarker) { + this.lastMarker.dispose(); } } finally { eventUtils.enable(); @@ -162,18 +165,7 @@ export class InsertionMarkerManager { * @internal */ updateAvailableConnections() { - this.availableConnections_ = this.initAvailableConnections_(); - } - - /** - * Return whether the block would be deleted if dropped immediately, based on - * information from the most recent move event. - * - * @returns True if the block would be deleted if dropped immediately. - * @internal - */ - wouldDeleteBlock(): boolean { - return this.wouldDeleteBlock_; + this.availableConnections = this.initAvailableConnections(); } /** @@ -184,7 +176,7 @@ export class InsertionMarkerManager { * @internal */ wouldConnectBlock(): boolean { - return !!this.closestConnection_; + return !!this.activeCandidate; } /** @@ -194,26 +186,21 @@ export class InsertionMarkerManager { * @internal */ applyConnections() { - if (!this.closestConnection_) return; - if (!this.localConnection_) { - throw new Error( - 'Cannot apply connections because there is no local connection'); - } + if (!this.activeCandidate) return; // Don't fire events for insertion markers. eventUtils.disable(); - this.hidePreview_(); + this.hidePreview(); eventUtils.enable(); + const {local, closest} = this.activeCandidate; // Connect two blocks together. - this.localConnection_.connect(this.closestConnection_); - if (this.topBlock_.rendered) { + local.connect(closest); + if (this.topBlock.rendered) { // Trigger a connection animation. // Determine which connection is inferior (lower in the source stack). - const inferiorConnection = this.localConnection_.isSuperior() ? - this.closestConnection_ : - this.localConnection_; + const inferiorConnection = local.isSuperior() ? closest : local; blockAnimations.connectionUiEffect(inferiorConnection.getSourceBlock()); // Bring the just-edited stack to the front. - const rootBlock = this.topBlock_.getRootBlock(); + const rootBlock = this.topBlock.getRootBlock(); rootBlock.bringToFront(); } } @@ -226,18 +213,18 @@ export class InsertionMarkerManager { * @internal */ update(dxy: Coordinate, dragTarget: IDragTarget|null) { - const candidate = this.getCandidate_(dxy); + const newCandidate = this.getCandidate(dxy); - this.wouldDeleteBlock_ = this.shouldDelete_(candidate, dragTarget); + this.wouldDeleteBlock = this.shouldDelete(!!newCandidate, dragTarget); const shouldUpdate = - this.wouldDeleteBlock_ || this.shouldUpdatePreviews_(candidate, dxy); + this.wouldDeleteBlock || this.shouldUpdatePreviews(newCandidate, dxy); if (shouldUpdate) { // Don't fire events for insertion marker creation or movement. eventUtils.disable(); - this.maybeHidePreview_(candidate); - this.maybeShowPreview_(candidate); + this.maybeHidePreview(newCandidate); + this.maybeShowPreview(newCandidate); eventUtils.enable(); } } @@ -248,13 +235,13 @@ export class InsertionMarkerManager { * @param sourceBlock The block that the insertion marker will represent. * @returns The insertion marker that represents the given block. */ - private createMarkerBlock_(sourceBlock: BlockSvg): BlockSvg { + private createMarkerBlock(sourceBlock: BlockSvg): BlockSvg { const imType = sourceBlock.type; eventUtils.disable(); let result: BlockSvg; try { - result = this.workspace_.newBlock(imType); + result = this.workspace.newBlock(imType); result.setInsertionMarker(true); if (sourceBlock.saveExtraState) { const state = sourceBlock.saveExtraState(); @@ -304,27 +291,27 @@ export class InsertionMarkerManager { /** * Populate the list of available connections on this block stack. This * should only be called once, at the beginning of a drag. If the stack has - * more than one block, this function will populate lastOnStack_ and create + * more than one block, this function will populate lastOnStack and create * the corresponding insertion marker. * * @returns A list of available connections. */ - private initAvailableConnections_(): RenderedConnection[] { - const available = this.topBlock_.getConnections_(false); + private initAvailableConnections(): RenderedConnection[] { + const available = this.topBlock.getConnections_(false); // Also check the last connection on this stack - const lastOnStack = this.topBlock_.lastConnectionInStack(true); - if (lastOnStack && lastOnStack !== this.topBlock_.nextConnection) { + const lastOnStack = this.topBlock.lastConnectionInStack(true); + if (lastOnStack && lastOnStack !== this.topBlock.nextConnection) { available.push(lastOnStack); - this.lastOnStack_ = lastOnStack; - if (this.lastMarker_) { + this.lastOnStack = lastOnStack; + if (this.lastMarker) { eventUtils.disable(); try { - this.lastMarker_.dispose(); + this.lastMarker.dispose(); } finally { eventUtils.enable(); } } - this.lastMarker_ = this.createMarkerBlock_(lastOnStack.getSourceBlock()); + this.lastMarker = this.createMarkerBlock(lastOnStack.getSourceBlock()); } return available; } @@ -333,51 +320,34 @@ export class InsertionMarkerManager { * Whether the previews (insertion marker and replacement marker) should be * updated based on the closest candidate and the current drag distance. * - * @param candidate An object containing a local connection, a closest - * connection, and a radius. Returned by getCandidate_. + * @param newCandidate A new candidate connection that may replace the current + * best candidate. * @param dxy Position relative to drag start, in workspace units. * @returns Whether the preview should be updated. */ - private shouldUpdatePreviews_( - candidate: CandidateConnection, dxy: Coordinate): boolean { - const candidateLocal = candidate.local; - const candidateClosest = candidate.closest; - const radius = candidate.radius; + private shouldUpdatePreviews( + newCandidate: CandidateConnection|null, dxy: Coordinate): boolean { + // Only need to update if we were showing a preview before. + if (!newCandidate) return !!this.activeCandidate; - // Found a connection! - if (candidateLocal && candidateClosest) { - // We're already showing an insertion marker. - // Decide whether the new connection has higher priority. - if (this.localConnection_ && this.closestConnection_) { - // The connection was the same as the current connection. - if (this.closestConnection_ === candidateClosest && - this.localConnection_ === candidateLocal) { - return false; - } - const xDiff = - this.localConnection_.x + dxy.x - this.closestConnection_.x; - const yDiff = - this.localConnection_.y + dxy.y - this.closestConnection_.y; - const curDistance = Math.sqrt(xDiff * xDiff + yDiff * yDiff); - // Slightly prefer the existing preview over a new preview. - return !( - candidateClosest && - radius > curDistance - config.currentConnectionPreference); - } else if (!this.localConnection_ && !this.closestConnection_) { - // We weren't showing a preview before, but we should now. - return true; - } else { - console.error( - 'Only one of localConnection_ and closestConnection_ was set.'); - } - } else { // No connection found. - // Only need to update if we were showing a preview before. - return !!(this.localConnection_ && this.closestConnection_); + // We weren't showing a preview before, but we should now. + if (!this.activeCandidate) return true; + + // We're already showing an insertion marker. + // Decide whether the new connection has higher priority. + const {local: activeLocal, closest: activeClosest} = this.activeCandidate; + if (activeClosest === newCandidate.closest && + activeLocal === newCandidate.local) { + // The connection was the same as the current connection. + return false; } - console.error( - 'Returning true from shouldUpdatePreviews, but it\'s not clear why.'); - return true; + const xDiff = activeLocal.x + dxy.x - activeClosest.x; + const yDiff = activeLocal.y + dxy.y - activeClosest.y; + const curDistance = Math.sqrt(xDiff * xDiff + yDiff * yDiff); + // Slightly prefer the existing preview over a new preview. + return ( + newCandidate.radius < curDistance - config.currentConnectionPreference); } /** @@ -388,11 +358,7 @@ export class InsertionMarkerManager { * @returns An object containing a local connection, a closest connection, and * a radius. */ - private getCandidate_(dxy: Coordinate): CandidateConnection { - let radius = this.getStartRadius_(); - let candidateClosest = null; - let candidateLocal = null; - + private getCandidate(dxy: Coordinate): CandidateConnection|null { // It's possible that a block has added or removed connections during a // drag, (e.g. in a drag/move event handler), so let's update the available // connections. Note that this will be called on every move while dragging, @@ -400,20 +366,25 @@ export class InsertionMarkerManager { // so, maybe it could be made more efficient. Also note that we won't update // the connections if we've already connected the insertion marker to a // block. - if (!this.markerConnection_ || !this.markerConnection_.isConnected()) { + if (!this.markerConnection || !this.markerConnection.isConnected()) { this.updateAvailableConnections(); } - for (let i = 0; i < this.availableConnections_.length; i++) { - const myConnection = this.availableConnections_[i]; + let radius = this.getStartRadius(); + let candidate = null; + for (let i = 0; i < this.availableConnections.length; i++) { + const myConnection = this.availableConnections[i]; const neighbour = myConnection.closest(radius, dxy); if (neighbour.connection) { - candidateClosest = neighbour.connection; - candidateLocal = myConnection; + candidate = { + closest: neighbour.connection, + local: myConnection, + radius: neighbour.radius, + }; radius = neighbour.radius; } } - return {closest: candidateClosest, local: candidateLocal, radius}; + return candidate; } /** @@ -422,36 +393,34 @@ export class InsertionMarkerManager { * @returns The radius at which to start the search for the closest * connection. */ - private getStartRadius_(): number { + private getStartRadius(): number { // If there is already a connection highlighted, // increase the radius we check for making new connections. - // Why? When a connection is highlighted, blocks move around when the + // When a connection is highlighted, blocks move around when the // insertion marker is created, which could cause the connection became out // of range. By increasing radiusConnection when a connection already // exists, we never "lose" the connection from the offset. - if (this.closestConnection_ && this.localConnection_) { - return config.connectingSnapRadius; - } - return config.snapRadius; + return this.activeCandidate ? config.connectingSnapRadius : + config.snapRadius; } /** * Whether ending the drag would delete the block. * - * @param candidate An object containing a local connection, a closest - * connection, and a radius. + * @param newCandidate Whether there is a candidate connection that the + * block could connect to if the drag ended immediately. * @param dragTarget The drag target that the block is currently over. * @returns Whether dropping the block immediately would delete the block. */ - private shouldDelete_( - candidate: CandidateConnection, dragTarget: IDragTarget|null): boolean { + private shouldDelete(newCandidate: boolean, dragTarget: IDragTarget|null): + boolean { if (dragTarget) { - const componentManager = this.workspace_.getComponentManager(); + const componentManager = this.workspace.getComponentManager(); const isDeleteArea = componentManager.hasCapability( dragTarget.id, ComponentManager.Capability.DELETE_AREA); if (isDeleteArea) { return (dragTarget as IDeleteArea) - .wouldDelete(this.topBlock_, candidate && !!candidate.closest); + .wouldDelete(this.topBlock, newCandidate); } } return false; @@ -460,150 +429,122 @@ export class InsertionMarkerManager { /** * Show an insertion marker or replacement highlighting during a drag, if * needed. - * At the beginning of this function, this.localConnection_ and - * this.closestConnection_ should both be null. + * At the beginning of this function, this.activeConnection should be null. * - * @param candidate An object containing a local connection, a closest - * connection, and a radius. + * @param newCandidate A new candidate connection that may replace the current + * best candidate. */ - private maybeShowPreview_(candidate: CandidateConnection) { - // Nope, don't add a marker. - if (this.wouldDeleteBlock_) { - return; - } - const closest = candidate.closest; - const local = candidate.local; + private maybeShowPreview(newCandidate: CandidateConnection|null) { + if (this.wouldDeleteBlock) return; // Nope, don't add a marker. + if (!newCandidate) return; // Nothing to connect to. - // Nothing to connect to. - if (!closest) { - return; - } + const closest = newCandidate.closest; // Something went wrong and we're trying to connect to an invalid // connection. - if (closest === this.closestConnection_ || + if (closest === this.activeCandidate?.closest || closest.getSourceBlock().isInsertionMarker()) { console.log('Trying to connect to an insertion marker'); return; } + this.activeCandidate = newCandidate; // Add an insertion marker or replacement marker. - this.closestConnection_ = closest; - this.localConnection_ = local; - this.showPreview_(); + this.showPreview(this.activeCandidate); } /** * A preview should be shown. This function figures out if it should be a * block highlight or an insertion marker, and shows the appropriate one. + * + * @param activeCandidate The connection that will be made if the drag ends + * immediately. */ - private showPreview_() { - if (!this.closestConnection_) { - throw new Error( - 'Cannot show the preview because there is no closest connection'); - } - if (!this.localConnection_) { - throw new Error( - 'Cannot show the preview because there is no local connection'); - } - const closest = this.closestConnection_; - const renderer = this.workspace_.getRenderer(); + private showPreview(activeCandidate: CandidateConnection) { + const renderer = this.workspace.getRenderer(); const method = renderer.getConnectionPreviewMethod( - closest, this.localConnection_, this.topBlock_); + activeCandidate.closest, activeCandidate.local, this.topBlock); switch (method) { case InsertionMarkerManager.PREVIEW_TYPE.INPUT_OUTLINE: - this.showInsertionInputOutline_(); + this.showInsertionInputOutline(activeCandidate); break; case InsertionMarkerManager.PREVIEW_TYPE.INSERTION_MARKER: - this.showInsertionMarker_(); + this.showInsertionMarker(activeCandidate); break; case InsertionMarkerManager.PREVIEW_TYPE.REPLACEMENT_FADE: - this.showReplacementFade_(); + this.showReplacementFade(activeCandidate); break; } // Optionally highlight the actual connection, as a nod to previous // behaviour. - if (closest && renderer.shouldHighlightConnection(closest)) { - closest.highlight(); + if (renderer.shouldHighlightConnection(activeCandidate.closest)) { + activeCandidate.closest.highlight(); } } /** - * Show an insertion marker or replacement highlighting during a drag, if + * Hide an insertion marker or replacement highlighting during a drag, if * needed. - * At the end of this function, this.localConnection_ and - * this.closestConnection_ should both be null. + * At the end of this function, this.activeCandidate will be null. * - * @param candidate An object containing a local connection, a closest - * connection, and a radius. + * @param newCandidate A new candidate connection that may replace the current + * best candidate. */ - private maybeHidePreview_(candidate: CandidateConnection) { + private maybeHidePreview(newCandidate: CandidateConnection|null) { // If there's no new preview, remove the old one but don't bother deleting // it. We might need it later, and this saves disposing of it and recreating // it. - if (!candidate.closest) { - this.hidePreview_(); + if (!newCandidate) { + this.hidePreview(); } else { - // If there's a new preview and there was an preview before, and either - // connection has changed, remove the old preview. - const hadPreview = this.closestConnection_ && this.localConnection_; - const closestChanged = this.closestConnection_ !== candidate.closest; - const localChanged = this.localConnection_ !== candidate.local; + if (this.activeCandidate) { + const closestChanged = + this.activeCandidate.closest !== newCandidate.closest; + const localChanged = this.activeCandidate.local !== newCandidate.local; - // Also hide if we had a preview before but now we're going to delete - // instead. - if (hadPreview && - (closestChanged || localChanged || this.wouldDeleteBlock_)) { - this.hidePreview_(); + // If there's a new preview and there was a preview before, and either + // connection has changed, remove the old preview. + // Also hide if we had a preview before but now we're going to delete + // instead. + if ((closestChanged || localChanged || this.wouldDeleteBlock)) { + this.hidePreview(); + } } } // Either way, clear out old state. - this.markerConnection_ = null; - this.closestConnection_ = null; - this.localConnection_ = null; + this.markerConnection = null; + this.activeCandidate = null; } /** - * A preview should be hidden. This function figures out if it is a block - * highlight or an insertion marker, and hides the appropriate one. + * A preview should be hidden. Loop through all possible preview modes + * and hide everything. */ - private hidePreview_() { - if (this.closestConnection_ && this.closestConnection_.targetBlock() && - this.workspace_.getRenderer().shouldHighlightConnection( - this.closestConnection_)) { - this.closestConnection_.unhighlight(); - } - if (this.fadedBlock_) { - this.hideReplacementFade_(); - } else if (this.highlightedBlock_) { - this.hideInsertionInputOutline_(); - } else if (this.markerConnection_) { - this.hideInsertionMarker_(); + private hidePreview() { + const closest = this.activeCandidate?.closest; + if (closest && closest.targetBlock() && + this.workspace.getRenderer().shouldHighlightConnection(closest)) { + closest.unhighlight(); } + this.hideReplacementFade(); + this.hideInsertionInputOutline(); + this.hideInsertionMarker(); } /** * Shows an insertion marker connected to the appropriate blocks (based on * manager state). + * + * @param activeCandidate The connection that will be made if the drag ends + * immediately. */ - private showInsertionMarker_() { - if (!this.localConnection_) { - throw new Error( - 'Cannot show the insertion marker because there is no local ' + - 'connection'); - } - if (!this.closestConnection_) { - throw new Error( - 'Cannot show the insertion marker because there is no closest ' + - 'connection'); - } - const local = this.localConnection_; - const closest = this.closestConnection_; + private showInsertionMarker(activeCandidate: CandidateConnection) { + const {local, closest} = activeCandidate; - const isLastInStack = this.lastOnStack_ && local === this.lastOnStack_; - let insertionMarker = isLastInStack ? this.lastMarker_ : this.firstMarker_; + const isLastInStack = this.lastOnStack && local === this.lastOnStack; + let insertionMarker = isLastInStack ? this.lastMarker : this.firstMarker; if (!insertionMarker) { throw new Error( 'Cannot show the insertion marker because there is no insertion ' + @@ -620,8 +561,8 @@ export class InsertionMarkerManager { // probably recreate the marker block (e.g. in getCandidate_), which is // called more often during the drag, but creating a block that often // might be too slow, so we only do it if necessary. - this.firstMarker_ = this.createMarkerBlock_(this.topBlock_); - insertionMarker = isLastInStack ? this.lastMarker_ : this.firstMarker_; + this.firstMarker = this.createMarkerBlock(this.topBlock); + insertionMarker = isLastInStack ? this.lastMarker : this.firstMarker; if (!insertionMarker) { throw new Error( 'Cannot show the insertion marker because there is no insertion ' + @@ -637,7 +578,7 @@ export class InsertionMarkerManager { 'associated connection'); } - if (imConn === this.markerConnection_) { + if (imConn === this.markerConnection) { throw new Error( 'Made it to showInsertionMarker_ even though the marker isn\'t ' + 'changing'); @@ -658,39 +599,37 @@ export class InsertionMarkerManager { imConn.connect(closest); } - this.markerConnection_ = imConn; + this.markerConnection = imConn; } /** * Disconnects and hides the current insertion marker. Should return the * blocks to their original state. */ - private hideInsertionMarker_() { - if (!this.markerConnection_) { - console.log('No insertion marker connection to disconnect'); - return; - } + private hideInsertionMarker() { + if (!this.markerConnection) return; - const imConn = this.markerConnection_; - const imBlock = imConn.getSourceBlock(); + const markerConn = this.markerConnection; + const imBlock = markerConn.getSourceBlock(); const markerNext = imBlock.nextConnection; const markerPrev = imBlock.previousConnection; const markerOutput = imBlock.outputConnection; - const isFirstInStatementStack = - imConn === markerNext && !(markerPrev && markerPrev.targetConnection); + const isNext = markerConn === markerNext; - const isFirstInOutputStack = imConn.type === ConnectionType.INPUT_VALUE && + const isFirstInStatementStack = + isNext && !(markerPrev && markerPrev.targetConnection); + + const isFirstInOutputStack = + markerConn.type === ConnectionType.INPUT_VALUE && !(markerOutput && markerOutput.targetConnection); // The insertion marker is the first block in a stack. Unplug won't do // anything in that case. Instead, unplug the following block. if (isFirstInStatementStack || isFirstInOutputStack) { - imConn.targetBlock()!.unplug(false); - } else if ( - imConn.type === ConnectionType.NEXT_STATEMENT && - imConn !== markerNext) { + markerConn.targetBlock()!.unplug(false); + } else if (markerConn.type === ConnectionType.NEXT_STATEMENT && !isNext) { // Inside of a C-block, first statement connection. - const innerConnection = imConn.targetConnection; + const innerConnection = markerConn.targetConnection; if (innerConnection) { innerConnection.getSourceBlock().unplug(false); } @@ -703,80 +642,73 @@ export class InsertionMarkerManager { previousBlockNextConnection.connect(innerConnection); } } else { - imBlock.unplug(/* healStack */ - true); + imBlock.unplug(/* healStack */ true); } - if (imConn.targetConnection) { + if (markerConn.targetConnection) { throw Error( - 'markerConnection_ still connected at the end of ' + + 'markerConnection still connected at the end of ' + 'disconnectInsertionMarker'); } - this.markerConnection_ = null; + this.markerConnection = null; const svg = imBlock.getSvgRoot(); if (svg) { svg.setAttribute('visibility', 'hidden'); } } - /** Shows an outline around the input the closest connection belongs to. */ - private showInsertionInputOutline_() { - if (!this.closestConnection_) { - throw new Error( - 'Cannot show the insertion marker outline because ' + - 'there is no closest connection'); - } - const closest = this.closestConnection_; - this.highlightedBlock_ = closest.getSourceBlock(); - this.highlightedBlock_.highlightShapeForInput(closest, true); + /** + * Shows an outline around the input the closest connection belongs to. + * + * @param activeCandidate The connection that will be made if the drag ends + * immediately. + */ + private showInsertionInputOutline(activeCandidate: CandidateConnection) { + const closest = activeCandidate.closest; + this.highlightedBlock = closest.getSourceBlock(); + this.highlightedBlock.highlightShapeForInput(closest, true); } /** Hides any visible input outlines. */ - private hideInsertionInputOutline_() { - if (!this.highlightedBlock_) { + private hideInsertionInputOutline() { + if (!this.highlightedBlock) return; + + if (!this.activeCandidate) { throw new Error( 'Cannot hide the insertion marker outline because ' + - 'there is no highlighted block'); + 'there is no active candidate'); } - if (!this.closestConnection_) { - throw new Error( - 'Cannot hide the insertion marker outline because ' + - 'there is no closest connection'); - } - this.highlightedBlock_.highlightShapeForInput( - this.closestConnection_, false); - this.highlightedBlock_ = null; + this.highlightedBlock.highlightShapeForInput( + this.activeCandidate.closest, false); + this.highlightedBlock = null; } /** * Shows a replacement fade affect on the closest connection's target block * (the block that is currently connected to it). + * + * @param activeCandidate The connection that will be made if the drag ends + * immediately. */ - private showReplacementFade_() { - if (!this.closestConnection_) { - throw new Error( - 'Cannot show the replacement fade because there ' + - 'is no closest connection'); - } - this.fadedBlock_ = this.closestConnection_.targetBlock(); - if (!this.fadedBlock_) { + private showReplacementFade(activeCandidate: CandidateConnection) { + this.fadedBlock = activeCandidate.closest.targetBlock(); + if (!this.fadedBlock) { throw new Error( 'Cannot show the replacement fade because the ' + 'closest connection does not have a target block'); } - this.fadedBlock_.fadeForReplacement(true); + this.fadedBlock.fadeForReplacement(true); } - /** Hides/Removes any visible fade affects. */ - private hideReplacementFade_() { - if (!this.fadedBlock_) { - throw new Error( - 'Cannot hide the replacement because there is no ' + - 'faded block'); - } - this.fadedBlock_.fadeForReplacement(false); - this.fadedBlock_ = null; + /** + * Hides/Removes any visible fade affects. + */ + private hideReplacementFade() { + if (!this.fadedBlock) return; + + this.fadedBlock.fadeForReplacement(false); + this.fadedBlock = null; } /** @@ -788,11 +720,11 @@ export class InsertionMarkerManager { */ getInsertionMarkers(): BlockSvg[] { const result = []; - if (this.firstMarker_) { - result.push(this.firstMarker_); + if (this.firstMarker) { + result.push(this.firstMarker); } - if (this.lastMarker_) { - result.push(this.lastMarker_); + if (this.lastMarker) { + result.push(this.lastMarker); } return result; } diff --git a/core/interfaces/i_observable.ts b/core/interfaces/i_observable.ts new file mode 100644 index 000000000..c6b02c9e6 --- /dev/null +++ b/core/interfaces/i_observable.ts @@ -0,0 +1,25 @@ +/** + * @license + * Copyright 2022 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + + +/** + * An object that fires events optionally. + * + * @internal + */ +export interface IObservable { + startPublishing(): void; + stopPublishing(): void; +} + +/** + * Type guard for checking if an object fulfills IObservable. + * + * @internal + */ +export function isObservable(obj: any): obj is IObservable { + return obj.startPublishing !== undefined && obj.stopPublishing !== undefined; +} diff --git a/core/interfaces/i_parameter_model.ts b/core/interfaces/i_parameter_model.ts index fe9eda6b0..c712fdf22 100644 --- a/core/interfaces/i_parameter_model.ts +++ b/core/interfaces/i_parameter_model.ts @@ -4,11 +4,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -/** - * The interface for the data model of a procedure parameter. - * - * @namespace Blockly.IParameterModel - */ +import {IProcedureModel} from './i_procedure_model'; /** @@ -42,4 +38,7 @@ export interface IParameterModel { * over time. */ getId(): string; + + /** Sets the procedure model this parameter is associated with. */ + setProcedureModel(model: IProcedureModel): this; } diff --git a/core/interfaces/i_registrable_field.ts b/core/interfaces/i_registrable_field.ts deleted file mode 100644 index be2ad4eb0..000000000 --- a/core/interfaces/i_registrable_field.ts +++ /dev/null @@ -1,29 +0,0 @@ -/** - * @license - * Copyright 2020 Google LLC - * SPDX-License-Identifier: Apache-2.0 - */ - -/** - * The interface for a Blockly field that can be registered. - * - * @namespace Blockly.IRegistrableField - */ -import * as goog from '../../closure/goog/goog.js'; -goog.declareModuleId('Blockly.IRegistrableField'); - -import type {Field} from '../field.js'; - - -type fromJson = (p1: object) => Field; - -/** - * A registrable field. - * Note: We are not using an interface here as we are interested in defining the - * static methods of a field rather than the instance methods. - * - * @alias Blockly.IRegistrableField - */ -export interface IRegistrableField { - fromJson: fromJson; -} diff --git a/core/menu.ts b/core/menu.ts index 93edeb1df..85b8070cf 100644 --- a/core/menu.ts +++ b/core/menu.ts @@ -105,13 +105,13 @@ export class Menu { // Add event handlers. this.mouseOverHandler = browserEvents.conditionalBind( - element, 'mouseover', this, this.handleMouseOver, true); + element, 'pointerover', this, this.handleMouseOver, true); this.clickHandler = browserEvents.conditionalBind( - element, 'click', this, this.handleClick, true); + element, 'pointerdown', this, this.handleClick, true); this.mouseEnterHandler = browserEvents.conditionalBind( - element, 'mouseenter', this, this.handleMouseEnter, true); + element, 'pointerenter', this, this.handleMouseEnter, true); this.mouseLeaveHandler = browserEvents.conditionalBind( - element, 'mouseleave', this, this.handleMouseLeave, true); + element, 'pointerleave', this, this.handleMouseLeave, true); this.onKeyDownHandler = browserEvents.conditionalBind( element, 'keydown', this, this.handleKeyEvent); @@ -310,7 +310,7 @@ export class Menu { * * @param e Mouse event to handle. */ - private handleMouseOver(e: Event) { + private handleMouseOver(e: PointerEvent) { const menuItem = this.getMenuItem(e.target as Element); if (menuItem) { @@ -329,18 +329,12 @@ export class Menu { * * @param e Click event to handle. */ - private handleClick(e: Event) { + private handleClick(e: PointerEvent) { const oldCoords = this.openingCoords; // Clear out the saved opening coords immediately so they're not used twice. this.openingCoords = null; - // AnyDuringMigration because: Property 'clientX' does not exist on type - // 'Event'. - if (oldCoords && typeof (e as AnyDuringMigration).clientX === 'number') { - // AnyDuringMigration because: Property 'clientY' does not exist on type - // 'Event'. AnyDuringMigration because: Property 'clientX' does not exist - // on type 'Event'. - const newCoords = new Coordinate( - (e as AnyDuringMigration).clientX, (e as AnyDuringMigration).clientY); + 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 @@ -362,7 +356,7 @@ export class Menu { * * @param _e Mouse event to handle. */ - private handleMouseEnter(_e: Event) { + private handleMouseEnter(_e: PointerEvent) { this.focus(); } @@ -371,7 +365,7 @@ export class Menu { * * @param _e Mouse event to handle. */ - private handleMouseLeave(_e: Event) { + private handleMouseLeave(_e: PointerEvent) { if (this.getElement()) { this.blur(); this.setHighlighted(null); diff --git a/core/mutator.ts b/core/mutator.ts index 498608967..6153009b0 100644 --- a/core/mutator.ts +++ b/core/mutator.ts @@ -155,7 +155,7 @@ export class Mutator extends Icon { * * @param e Mouse click event. */ - protected override iconClick_(e: MouseEvent) { + protected override iconClick_(e: PointerEvent) { if (this.getBlock().isEditable()) { super.iconClick_(e); } diff --git a/core/options.ts b/core/options.ts index c1efdee25..92fd7182e 100644 --- a/core/options.ts +++ b/core/options.ts @@ -38,6 +38,7 @@ export class Options { readOnly: boolean; maxBlocks: number; maxInstances: {[key: string]: number}|null; + modalInputs: boolean; pathToMedia: string; hasCategories: boolean; moveOptions: MoveOptions; @@ -155,6 +156,11 @@ export class Options { const plugins = options['plugins'] || {}; + let modalInputs = options['modalInputs']; + if (modalInputs === undefined) { + modalInputs = true; + } + this.RTL = rtl; this.oneBasedIndex = oneBasedIndex; this.collapse = hasCollapse; @@ -163,6 +169,7 @@ export class Options { this.readOnly = readOnly; this.maxBlocks = options['maxBlocks'] || Infinity; this.maxInstances = options['maxInstances'] ?? null; + this.modalInputs = modalInputs; this.pathToMedia = pathToMedia; this.hasCategories = hasCategories; this.moveOptions = Options.parseMoveOptions_(options, hasCategories); diff --git a/core/procedures/observable_parameter_model.ts b/core/procedures/observable_parameter_model.ts index 535c6aea1..95261d748 100644 --- a/core/procedures/observable_parameter_model.ts +++ b/core/procedures/observable_parameter_model.ts @@ -4,8 +4,10 @@ * SPDX-License-Identifier: Apache-2.0 */ +import * as eventUtils from '../events/utils.js'; import {genUid} from '../utils/idgenerator.js'; import type {IParameterModel} from '../interfaces/i_parameter_model.js'; +import type {IProcedureModel} from '../interfaces/i_procedure_model'; import {triggerProceduresUpdate} from './update_procedures.js'; import type {VariableModel} from '../variable_model.js'; import type {Workspace} from '../workspace.js'; @@ -14,6 +16,8 @@ import type {Workspace} from '../workspace.js'; export class ObservableParameterModel implements IParameterModel { private id: string; private variable: VariableModel; + private shouldFireEvents = false; + private procedureModel: IProcedureModel|null = null; constructor( private readonly workspace: Workspace, name: string, id?: string) { @@ -26,11 +30,16 @@ export class ObservableParameterModel implements IParameterModel { * Sets the name of this parameter to the given name. */ setName(name: string): this { - // TODO(#6516): Fire events. - if (name == this.variable.name) return this; + if (name === this.variable.name) return this; + const oldName = this.variable.name; this.variable = this.workspace.getVariable(name) ?? this.workspace.createVariable(name); triggerProceduresUpdate(this.workspace); + if (this.shouldFireEvents) { + eventUtils.fire( + new (eventUtils.get(eventUtils.PROCEDURE_PARAMETER_RENAME))( + this.workspace, this.procedureModel, this, oldName)); + } return this; } @@ -76,4 +85,31 @@ export class ObservableParameterModel implements IParameterModel { getVariableModel(): VariableModel { return this.variable; } + + /** + * Tells the parameter model it should fire events. + * + * @internal + */ + startPublishing() { + this.shouldFireEvents = true; + } + + /** + * Tells the parameter model it should not fire events. + * + * @internal + */ + stopPublishing() { + this.shouldFireEvents = false; + } + + /** Sets the procedure model this parameter is a part of. */ + setProcedureModel(model: IProcedureModel): this { + // TODO: Not sure if we want to do this, or accept it via the constructor. + // That means it could be non-null, but it would also break the fluent + // API. + this.procedureModel = model; + return this; + } } diff --git a/core/procedures/observable_procedure_map.ts b/core/procedures/observable_procedure_map.ts index a9ad169c5..2f0b0f0a6 100644 --- a/core/procedures/observable_procedure_map.ts +++ b/core/procedures/observable_procedure_map.ts @@ -4,10 +4,12 @@ * SPDX-License-Identifier: Apache-2.0 */ +import * as eventUtils from '../events/utils.js'; +import {IProcedureMap} from '../interfaces/i_procedure_map.js'; import type {IProcedureModel} from '../interfaces/i_procedure_model.js'; +import {isObservable} from '../interfaces/i_observable.js'; import {triggerProceduresUpdate} from './update_procedures.js'; import type {Workspace} from '../workspace.js'; -import {IProcedureMap} from '../interfaces/i_procedure_map.js'; export class ObservableProcedureMap extends @@ -20,8 +22,11 @@ export class ObservableProcedureMap extends * Adds the given procedure model to the procedure map. */ override set(id: string, proc: IProcedureModel): this { - // TODO(#6516): Fire events. + if (this.get(id) === proc) return this; super.set(id, proc); + eventUtils.fire(new (eventUtils.get(eventUtils.PROCEDURE_CREATE))( + this.workspace, proc)); + if (isObservable(proc)) proc.startPublishing(); return this; } @@ -30,9 +35,13 @@ export class ObservableProcedureMap extends * exists). */ override delete(id: string): boolean { - // TODO(#6516): Fire events. + const proc = this.get(id); const existed = super.delete(id); + if (!existed) return existed; triggerProceduresUpdate(this.workspace); + eventUtils.fire(new (eventUtils.get(eventUtils.PROCEDURE_DELETE))( + this.workspace, proc)); + if (isObservable(proc)) proc.stopPublishing(); return existed; } @@ -40,8 +49,13 @@ export class ObservableProcedureMap extends * Removes all ProcedureModels from the procedure map. */ override clear() { - // TODO(#6516): Fire events. - super.clear(); + if (!this.size) return; + for (const id of this.keys()) { + const proc = this.get(id); + super.delete(id); + eventUtils.fire(new (eventUtils.get(eventUtils.PROCEDURE_DELETE))( + this.workspace, proc)); + } triggerProceduresUpdate(this.workspace); } @@ -50,7 +64,6 @@ export class ObservableProcedureMap extends * blocks can find it. */ add(proc: IProcedureModel): this { - // TODO(#6516): Fire events. // TODO(#6526): See if this method is actually useful. return this.set(proc.getId(), proc); } diff --git a/core/procedures/observable_procedure_model.ts b/core/procedures/observable_procedure_model.ts index be8d05fe5..9b44496ea 100644 --- a/core/procedures/observable_procedure_model.ts +++ b/core/procedures/observable_procedure_model.ts @@ -4,9 +4,11 @@ * SPDX-License-Identifier: Apache-2.0 */ +import * as eventUtils from '../events/utils.js'; import {genUid} from '../utils/idgenerator.js'; import type {IParameterModel} from '../interfaces/i_parameter_model.js'; import type {IProcedureModel} from '../interfaces/i_procedure_model.js'; +import {isObservable} from '../interfaces/i_observable.js'; import {triggerProceduresUpdate} from './update_procedures.js'; import type {Workspace} from '../workspace.js'; @@ -17,6 +19,7 @@ export class ObservableProcedureModel implements IProcedureModel { private parameters: IParameterModel[] = []; private returnTypes: string[]|null = null; private enabled = true; + private shouldFireEvents = false; constructor( private readonly workspace: Workspace, name: string, id?: string) { @@ -26,9 +29,14 @@ export class ObservableProcedureModel implements IProcedureModel { /** Sets the human-readable name of the procedure. */ setName(name: string): this { - // TODO(#6516): Fire events. + if (name === this.name) return this; + const prevName = this.name; this.name = name; triggerProceduresUpdate(this.workspace); + if (this.shouldFireEvents) { + eventUtils.fire(new (eventUtils.get(eventUtils.PROCEDURE_RENAME))( + this.workspace, this, prevName)); + } return this; } @@ -38,17 +46,46 @@ export class ObservableProcedureModel implements IProcedureModel { * To move a parameter, first delete it, and then re-insert. */ insertParameter(parameterModel: IParameterModel, index: number): this { - // TODO(#6516): Fire events. + if (this.parameters[index] && + this.parameters[index].getId() === parameterModel.getId()) { + return this; + } + this.parameters.splice(index, 0, parameterModel); + parameterModel.setProcedureModel(this); + if (isObservable(parameterModel)) { + if (this.shouldFireEvents) { + parameterModel.startPublishing(); + } else { + parameterModel.stopPublishing(); + } + } + triggerProceduresUpdate(this.workspace); + if (this.shouldFireEvents) { + eventUtils.fire( + new (eventUtils.get(eventUtils.PROCEDURE_PARAMETER_CREATE))( + this.workspace, this, parameterModel, index)); + } return this; } /** Removes the parameter at the given index from the parameter list. */ deleteParameter(index: number): this { - // TODO(#6516): Fire events. + if (!this.parameters[index]) return this; + const oldParam = this.parameters[index]; + this.parameters.splice(index, 1); triggerProceduresUpdate(this.workspace); + if (isObservable(oldParam)) { + oldParam.stopPublishing(); + } + + if (this.shouldFireEvents) { + eventUtils.fire( + new (eventUtils.get(eventUtils.PROCEDURE_PARAMETER_DELETE))( + this.workspace, this, oldParam, index)); + } return this; } @@ -67,9 +104,15 @@ export class ObservableProcedureModel implements IProcedureModel { 'The built-in ProcedureModel does not support typing. You need to ' + 'implement your own custom ProcedureModel.'); } + // Either they're both an empty array, or both null. Noop either way. + if (!!types === !!this.returnTypes) return this; + const oldReturnTypes = this.returnTypes; this.returnTypes = types; - // TODO(#6516): Fire events. triggerProceduresUpdate(this.workspace); + if (this.shouldFireEvents) { + eventUtils.fire(new (eventUtils.get(eventUtils.PROCEDURE_CHANGE_RETURN))( + this.workspace, this, oldReturnTypes)); + } return this; } @@ -78,9 +121,13 @@ export class ObservableProcedureModel implements IProcedureModel { * all procedure caller blocks should be disabled as well. */ setEnabled(enabled: boolean): this { - // TODO(#6516): Fire events. + if (enabled === this.enabled) return this; this.enabled = enabled; triggerProceduresUpdate(this.workspace); + if (this.shouldFireEvents) { + eventUtils.fire(new (eventUtils.get(eventUtils.PROCEDURE_ENABLE))( + this.workspace, this)); + } return this; } @@ -120,4 +167,28 @@ export class ObservableProcedureModel implements IProcedureModel { getEnabled(): boolean { return this.enabled; } + + /** + * Tells the procedure model it should fire events. + * + * @internal + */ + startPublishing() { + this.shouldFireEvents = true; + for (const param of this.parameters) { + if (isObservable(param)) param.startPublishing(); + } + } + + /** + * Tells the procedure model it should not fire events. + * + * @internal + */ + stopPublishing() { + this.shouldFireEvents = false; + for (const param of this.parameters) { + if (isObservable(param)) param.stopPublishing(); + } + } } diff --git a/core/scrollbar.ts b/core/scrollbar.ts index 313148852..652d5ae2d 100644 --- a/core/scrollbar.ts +++ b/core/scrollbar.ts @@ -211,9 +211,9 @@ export class Scrollbar { } this.onMouseDownBarWrapper_ = browserEvents.conditionalBind( - this.svgBackground, 'mousedown', this, this.onMouseDownBar); + this.svgBackground, 'pointerdown', this, this.onMouseDownBar); this.onMouseDownHandleWrapper_ = browserEvents.conditionalBind( - this.svgHandle, 'mousedown', this, this.onMouseDownHandle); + this.svgHandle, 'pointerdown', this, this.onMouseDownHandle); } /** @@ -703,7 +703,7 @@ export class Scrollbar { * * @param e Mouse down event. */ - private onMouseDownHandle(e: MouseEvent) { + private onMouseDownHandle(e: PointerEvent) { this.workspace.markFocused(); this.cleanUp(); if (browserEvents.isRightButton(e)) { @@ -723,9 +723,9 @@ export class Scrollbar { // Record the current mouse position. this.startDragMouse = this.horizontal ? e.clientX : e.clientY; this.onMouseUpWrapper_ = browserEvents.conditionalBind( - document, 'mouseup', this, this.onMouseUpHandle); + document, 'pointerup', this, this.onMouseUpHandle); this.onMouseMoveWrapper_ = browserEvents.conditionalBind( - document, 'mousemove', this, this.onMouseMoveHandle); + document, 'pointermove', this, this.onMouseMoveHandle); e.stopPropagation(); e.preventDefault(); } @@ -735,7 +735,7 @@ export class Scrollbar { * * @param e Mouse move event. */ - private onMouseMoveHandle(e: MouseEvent) { + private onMouseMoveHandle(e: PointerEvent) { const currentMouse = this.horizontal ? e.clientX : e.clientY; const mouseDelta = currentMouse - this.startDragMouse; const handlePosition = this.startDragHandle + mouseDelta; diff --git a/core/serialization/procedures.ts b/core/serialization/procedures.ts index 47022203b..05f70b03b 100644 --- a/core/serialization/procedures.ts +++ b/core/serialization/procedures.ts @@ -18,6 +18,7 @@ import type {Workspace} from '../workspace.js'; * Representation of a procedure data model. */ export interface State { + // TODO: This should also handle enabled. id: string, name: string, returnTypes: string[]|null, parameters?: ParameterState[], } @@ -50,8 +51,12 @@ type ParameterModelConstructor = new (workspace: Workspace, name: string, id: string) => ParameterModel; -/** Serializes the given IProcedureModel to JSON. */ -function saveProcedure(proc: IProcedureModel): State { +/** + * Serializes the given IProcedureModel to JSON. + * + * @internal + */ +export function saveProcedure(proc: IProcedureModel): State { const state: State = { id: proc.getId(), name: proc.getName(), @@ -62,8 +67,12 @@ function saveProcedure(proc: IProcedureModel): State { return state; } -/** Serializes the given IParameterModel to JSON. */ -function saveParameter(param: IParameterModel): ParameterState { +/** + * Serializes the given IParameterModel to JSON. + * + * @internal + */ +export function saveParameter(param: IParameterModel): ParameterState { const state: ParameterState = { id: param.getId(), name: param.getName(), @@ -73,8 +82,12 @@ function saveParameter(param: IParameterModel): ParameterState { return state; } -/** Deserializes the given procedure model State from JSON. */ -function +/** + * Deserializes the given procedure model State from JSON. + * + * @internal + */ +export function loadProcedure( procedureModelClass: ProcedureModelConstructor, @@ -90,12 +103,17 @@ loadProcedure( +/** + * Deserializes the given ParameterState from JSON. + * + * @internal + */ +export function loadParameter( parameterModelClass: ParameterModelConstructor, state: ParameterState, workspace: Workspace): ParameterModel { - return new parameterModelClass(workspace, state.name, state.id) - .setTypes(state.types || []); + const model = new parameterModelClass(workspace, state.name, state.id); + if (state.types) model.setTypes(state.types); + return model; } /** Serializer for saving and loading procedure state. */ diff --git a/core/toolbox/toolbox.ts b/core/toolbox/toolbox.ts index 3c9e3c23b..9b700fcf7 100644 --- a/core/toolbox/toolbox.ts +++ b/core/toolbox/toolbox.ts @@ -229,13 +229,13 @@ export class Toolbox extends DeleteArea implements IAutoHideable, container: HTMLDivElement, contentsContainer: HTMLDivElement) { // Clicking on toolbox closes popups. const clickEvent = browserEvents.conditionalBind( - container, 'click', this, this.onClick_, - /* opt_noCaptureIdentifier */ false, /* opt_noPreventDefault */ true); + container, 'pointerdown', this, this.onClick_, + /* opt_noCaptureIdentifier */ false); this.boundEvents_.push(clickEvent); const keyDownEvent = browserEvents.conditionalBind( contentsContainer, 'keydown', this, this.onKeyDown_, - /* opt_noCaptureIdentifier */ false, /* opt_noPreventDefault */ true); + /* opt_noCaptureIdentifier */ false); this.boundEvents_.push(keyDownEvent); } @@ -244,7 +244,7 @@ export class Toolbox extends DeleteArea implements IAutoHideable, * * @param e Click event to handle. */ - protected onClick_(e: MouseEvent) { + protected onClick_(e: PointerEvent) { if (browserEvents.isRightButton(e) || e.target === this.HtmlDiv) { // Close flyout. (common.getMainWorkspace() as WorkspaceSvg).hideChaff(false); diff --git a/core/tooltip.ts b/core/tooltip.ts index 498490ee2..cdd5bde0d 100644 --- a/core/tooltip.ts +++ b/core/tooltip.ts @@ -231,14 +231,14 @@ export function createDom() { export function bindMouseEvents(element: Element) { // TODO (#6097): Don't stash wrapper info on the DOM. (element as AnyDuringMigration).mouseOverWrapper_ = - browserEvents.bind(element, 'mouseover', null, onMouseOver); + browserEvents.bind(element, 'pointerover', null, onMouseOver); (element as AnyDuringMigration).mouseOutWrapper_ = - browserEvents.bind(element, 'mouseout', null, onMouseOut); + browserEvents.bind(element, 'pointerout', null, onMouseOut); // Don't use bindEvent_ for mousemove since that would create a // corresponding touch handler, even though this only makes sense in the // context of a mouseover/mouseout. - element.addEventListener('mousemove', onMouseMove, false); + element.addEventListener('pointermove', onMouseMove, false); } /** @@ -254,7 +254,7 @@ export function unbindMouseEvents(element: Element|null) { // TODO (#6097): Don't stash wrapper info on the DOM. browserEvents.unbind((element as AnyDuringMigration).mouseOverWrapper_); browserEvents.unbind((element as AnyDuringMigration).mouseOutWrapper_); - element.removeEventListener('mousemove', onMouseMove); + element.removeEventListener('pointermove', onMouseMove); } /** @@ -263,7 +263,7 @@ export function unbindMouseEvents(element: Element|null) { * * @param e Mouse event. */ -function onMouseOver(e: Event) { +function onMouseOver(e: PointerEvent) { if (blocked) { // Someone doesn't want us to show tooltips. return; @@ -285,7 +285,7 @@ function onMouseOver(e: Event) { * * @param _e Mouse event. */ -function onMouseOut(_e: Event) { +function onMouseOut(_e: PointerEvent) { if (blocked) { // Someone doesn't want us to show tooltips. return; diff --git a/core/touch.ts b/core/touch.ts index 2b621bac6..250b162a1 100644 --- a/core/touch.ts +++ b/core/touch.ts @@ -13,6 +13,7 @@ import * as goog from '../closure/goog/goog.js'; goog.declareModuleId('Blockly.Touch'); import type {Gesture} from './gesture.js'; +import * as deprecation from './utils/deprecation.js'; /** @@ -52,23 +53,17 @@ let touchIdentifier_: string|null = null; * * @alias Blockly.Touch.TOUCH_MAP */ -export const TOUCH_MAP: {[key: string]: string[]} = globalThis['PointerEvent'] ? - { - 'mousedown': ['pointerdown'], - 'mouseenter': ['pointerenter'], - 'mouseleave': ['pointerleave'], - 'mousemove': ['pointermove'], - 'mouseout': ['pointerout'], - 'mouseover': ['pointerover'], - 'mouseup': ['pointerup', 'pointercancel'], - 'touchend': ['pointerup'], - 'touchcancel': ['pointercancel'], - } : - { - 'mousedown': ['touchstart'], - 'mousemove': ['touchmove'], - 'mouseup': ['touchend', 'touchcancel'], - }; +export const TOUCH_MAP: {[key: string]: string[]} = { + 'mousedown': ['pointerdown'], + 'mouseenter': ['pointerenter'], + 'mouseleave': ['pointerleave'], + 'mousemove': ['pointermove'], + 'mouseout': ['pointerout'], + 'mouseover': ['pointerover'], + 'mouseup': ['pointerup', 'pointercancel'], + 'touchend': ['pointerup'], + 'touchcancel': ['pointercancel'], +}; /** PID of queued long-press task. */ let longPid_: AnyDuringMigration = 0; @@ -85,29 +80,9 @@ let longPid_: AnyDuringMigration = 0; * @alias Blockly.Touch.longStart * @internal */ -export function longStart(e: Event, gesture: Gesture) { +export function longStart(e: PointerEvent, gesture: Gesture) { longStop(); - // Punt on multitouch events. - // AnyDuringMigration because: Property 'changedTouches' does not exist on - // type 'Event'. - if ((e as AnyDuringMigration).changedTouches && - (e as AnyDuringMigration).changedTouches.length !== 1) { - return; - } longPid_ = setTimeout(function() { - // TODO(#6097): Make types accurate, possibly by refactoring touch handling. - // AnyDuringMigration because: Property 'changedTouches' does not exist on - // type 'Event'. - const typelessEvent = e as AnyDuringMigration; - // Additional check to distinguish between touch events and pointer events - if (typelessEvent.changedTouches) { - // TouchEvent - typelessEvent.button = 2; // Simulate a right button click. - // e was a touch event. It needs to pretend to be a mouse event. - typelessEvent.clientX = typelessEvent.changedTouches[0].clientX; - typelessEvent.clientY = typelessEvent.changedTouches[0].clientY; - } - // Let the gesture route the right-click correctly. if (gesture) { gesture.handleRightClick(e); @@ -150,78 +125,46 @@ export function clearTouchIdentifier() { * handler; false if it should be blocked. * @alias Blockly.Touch.shouldHandleEvent */ -export function shouldHandleEvent(e: Event|PseudoEvent): boolean { - return !isMouseOrTouchEvent(e) || checkTouchIdentifier(e); +export function shouldHandleEvent(e: Event): boolean { + // Do not replace the startsWith with a check for `instanceof PointerEvent`. + // `click` and `contextmenu` are PointerEvents in some browsers, + // despite not starting with `pointer`, but we want to always handle them + // without worrying about touch identifiers. + return !(e.type.startsWith('pointer')) || + (e instanceof PointerEvent && checkTouchIdentifier(e)); } /** - * Get the touch identifier from the given event. If it was a mouse event, the - * identifier is the string 'mouse'. + * Get the pointer identifier from the given event. * - * @param e Pointer event, mouse event, or touch event. - * @returns The pointerId, or touch identifier from the first changed touch, if - * defined. Otherwise 'mouse'. + * @param e Pointer event. + * @returns The pointerId of the event. * @alias Blockly.Touch.getTouchIdentifierFromEvent */ -export function getTouchIdentifierFromEvent(e: Event|PseudoEvent): string { - if (e instanceof PointerEvent) { - return String(e.pointerId); - } - - if (e instanceof MouseEvent) { - return 'mouse'; - } - - /** - * TODO(#6097): Fix types. This is a catch-all for everything but mouse - * and pointer events. - */ - const pseudoEvent = /** {!PseudoEvent} */ e; - - // AnyDuringMigration because: Property 'changedTouches' does not exist on - // type 'PseudoEvent | Event'. AnyDuringMigration because: Property - // 'changedTouches' does not exist on type 'PseudoEvent | Event'. - // AnyDuringMigration because: Property 'changedTouches' does not exist on - // type 'PseudoEvent | Event'. AnyDuringMigration because: Property - // 'changedTouches' does not exist on type 'PseudoEvent | Event'. - // AnyDuringMigration because: Property 'changedTouches' does not exist on - // type 'PseudoEvent | Event'. - return (pseudoEvent as AnyDuringMigration).changedTouches && - (pseudoEvent as AnyDuringMigration).changedTouches[0] && - (pseudoEvent as AnyDuringMigration).changedTouches[0].identifier !== - undefined && - (pseudoEvent as AnyDuringMigration).changedTouches[0].identifier !== - null ? - String((pseudoEvent as AnyDuringMigration).changedTouches[0].identifier) : - 'mouse'; +export function getTouchIdentifierFromEvent(e: PointerEvent): string { + return `${e.pointerId}`; } /** - * Check whether the touch identifier on the event matches the current saved - * identifier. If there is no identifier, that means it's a mouse event and - * we'll use the identifier "mouse". This means we won't deal well with - * multiple mice being used at the same time. That seems okay. - * If the current identifier was unset, save the identifier from the - * event. This starts a drag/gesture, during which touch events with other - * identifiers will be silently ignored. + * Check whether the pointer identifier on the event matches the current saved + * identifier. If the current identifier was unset, save the identifier from + * the event. This starts a drag/gesture, during which pointer events with + * other identifiers will be silently ignored. * - * @param e Mouse event or touch event. + * @param e Pointer event. * @returns Whether the identifier on the event matches the current saved * identifier. * @alias Blockly.Touch.checkTouchIdentifier */ -export function checkTouchIdentifier(e: Event|PseudoEvent): boolean { +export function checkTouchIdentifier(e: PointerEvent): boolean { const identifier = getTouchIdentifierFromEvent(e); - // if (touchIdentifier_) is insufficient because Android touch - // identifiers may be zero. - if (touchIdentifier_ !== undefined && touchIdentifier_ !== null) { + if (touchIdentifier_) { // We're already tracking some touch/mouse event. Is this from the same // source? return touchIdentifier_ === identifier; } - if (e.type === 'mousedown' || e.type === 'touchstart' || - e.type === 'pointerdown') { + if (e.type === 'pointerdown') { // No identifier set yet, and this is the start of a drag. Set it and // return. touchIdentifier_ = identifier; @@ -241,6 +184,7 @@ export function checkTouchIdentifier(e: Event|PseudoEvent): boolean { * @alias Blockly.Touch.setClientFromTouch */ export function setClientFromTouch(e: Event|PseudoEvent) { + deprecation.warn('setClientFromTouch()', 'version 9', 'version 10'); // AnyDuringMigration because: Property 'changedTouches' does not exist on // type 'PseudoEvent | Event'. if (e.type.startsWith('touch') && (e as AnyDuringMigration).changedTouches) { @@ -265,6 +209,7 @@ export function setClientFromTouch(e: Event|PseudoEvent) { * @alias Blockly.Touch.isMouseOrTouchEvent */ export function isMouseOrTouchEvent(e: Event|PseudoEvent): boolean { + deprecation.warn('isMouseOrTouchEvent()', 'version 9', 'version 10'); return e.type.startsWith('touch') || e.type.startsWith('mouse') || e.type.startsWith('pointer'); } @@ -277,6 +222,7 @@ export function isMouseOrTouchEvent(e: Event|PseudoEvent): boolean { * @alias Blockly.Touch.isTouchEvent */ export function isTouchEvent(e: Event|PseudoEvent): boolean { + deprecation.warn('isTouchEvent()', 'version 9', 'version 10'); return e.type.startsWith('touch') || e.type.startsWith('pointer'); } @@ -291,6 +237,7 @@ export function isTouchEvent(e: Event|PseudoEvent): boolean { * @alias Blockly.Touch.splitEventByTouches */ export function splitEventByTouches(e: Event): Array { + deprecation.warn('splitEventByTouches()', 'version 9', 'version 10'); const events = []; // AnyDuringMigration because: Property 'changedTouches' does not exist on // type 'PseudoEvent | Event'. diff --git a/core/touch_gesture.ts b/core/touch_gesture.ts deleted file mode 100644 index 4fea2fdbd..000000000 --- a/core/touch_gesture.ts +++ /dev/null @@ -1,312 +0,0 @@ -/** - * @license - * Copyright 2017 Google LLC - * SPDX-License-Identifier: Apache-2.0 - */ - -/** - * The class extends Gesture to support pinch to zoom - * for both pointer and touch events. - * - * @class - */ -import * as goog from '../closure/goog/goog.js'; -goog.declareModuleId('Blockly.TouchGesture'); - -import * as browserEvents from './browser_events.js'; -import {Gesture} from './gesture.js'; -import * as Touch from './touch.js'; -import {Coordinate} from './utils/coordinate.js'; - -/* - * Note: In this file "start" refers to touchstart, mousedown, and pointerstart - * events. "End" refers to touchend, mouseup, and pointerend events. - */ - -/** A multiplier used to convert the gesture scale to a zoom in delta. */ -const ZOOM_IN_MULTIPLIER = 5; - -/** A multiplier used to convert the gesture scale to a zoom out delta. */ -const ZOOM_OUT_MULTIPLIER = 6; - -/** - * Class for one gesture. - * - * @alias Blockly.TouchGesture - */ -export class TouchGesture extends Gesture { - /** Boolean for whether or not this gesture is a multi-touch gesture. */ - private isMultiTouch_ = false; - - /** A map of cached points used for tracking multi-touch gestures. */ - private cachedPoints = new Map(); - - /** - * This is the ratio between the starting distance between the touch points - * and the most recent distance between the touch points. - * Scales between 0 and 1 mean the most recent zoom was a zoom out. - * Scales above 1.0 mean the most recent zoom was a zoom in. - */ - private previousScale_ = 0; - - /** The starting distance between two touch points. */ - private startDistance_ = 0; - - /** - * A handle to use to unbind the second touch start or pointer down listener - * at the end of a drag. - * Opaque data returned from Blockly.bindEventWithChecks_. - */ - private onStartWrapper_: browserEvents.Data|null = null; - - /** Boolean for whether or not the workspace supports pinch-zoom. */ - private isPinchZoomEnabled_: boolean|null = null; - override onMoveWrapper_: browserEvents.Data|null = null; - override onUpWrapper_: browserEvents.Data|null = null; - - /** - * Start a gesture: update the workspace to indicate that a gesture is in - * progress and bind mousemove and mouseup handlers. - * - * @param e A mouse down, touch start or pointer down event. - * @internal - */ - override doStart(e: MouseEvent) { - if (!this.startWorkspace_) { - throw new Error( - 'Cannot start the touch event becauase the start ' + - 'workspace is undefined'); - } - this.isPinchZoomEnabled_ = this.startWorkspace_.options.zoomOptions && - this.startWorkspace_.options.zoomOptions.pinch; - super.doStart(e); - if (!this.isEnding_ && Touch.isTouchEvent(e)) { - this.handleTouchStart(e); - } - } - - /** - * Bind gesture events. - * Overriding the gesture definition of this function, binding the same - * functions for onMoveWrapper_ and onUpWrapper_ but passing - * opt_noCaptureIdentifier. - * In addition, binding a second mouse down event to detect multi-touch - * events. - * - * @param e A mouse down or touch start event. - * @internal - */ - override bindMouseEvents(e: Event) { - this.onStartWrapper_ = browserEvents.conditionalBind( - document, 'mousedown', null, this.handleStart.bind(this), - /* opt_noCaptureIdentifier */ true); - this.onMoveWrapper_ = browserEvents.conditionalBind( - document, 'mousemove', null, this.handleMove.bind(this), - /* opt_noCaptureIdentifier */ true); - this.onUpWrapper_ = browserEvents.conditionalBind( - document, 'mouseup', null, this.handleUp.bind(this), - /* opt_noCaptureIdentifier */ true); - - e.preventDefault(); - e.stopPropagation(); - } - - /** - * Handle a mouse down, touch start, or pointer down event. - * - * @param e A mouse down, touch start, or pointer down event. - * @internal - */ - handleStart(e: Event) { - if (this.isDragging()) { - // A drag has already started, so this can no longer be a pinch-zoom. - return; - } - if (Touch.isTouchEvent(e)) { - this.handleTouchStart(e); - - if (this.isMultiTouch()) { - Touch.longStop(); - } - } - } - - /** - * Handle a mouse move, touch move, or pointer move event. - * - * @param e A mouse move, touch move, or pointer move event. - * @internal - */ - override handleMove(e: MouseEvent) { - if (this.isDragging()) { - // We are in the middle of a drag, only handle the relevant events - if (Touch.shouldHandleEvent(e)) { - super.handleMove(e); - } - return; - } - if (this.isMultiTouch()) { - if (Touch.isTouchEvent(e)) { - this.handleTouchMove(e); - } - Touch.longStop(); - } else { - super.handleMove(e); - } - } - - /** - * Handle a mouse up, touch end, or pointer up event. - * - * @param e A mouse up, touch end, or pointer up event. - * @internal - */ - override handleUp(e: Event) { - if (Touch.isTouchEvent(e) && !this.isDragging()) { - this.handleTouchEnd(e); - } - if (!this.isMultiTouch() || this.isDragging()) { - if (!Touch.shouldHandleEvent(e)) { - return; - } - super.handleUp(e); - } else { - e.preventDefault(); - e.stopPropagation(); - - this.dispose(); - } - } - - /** - * Whether this gesture is part of a multi-touch gesture. - * - * @returns Whether this gesture is part of a multi-touch gesture. - * @internal - */ - isMultiTouch(): boolean { - return this.isMultiTouch_; - } - - /** - * Sever all links from this object. - * - * @internal - */ - override dispose() { - super.dispose(); - - if (this.onStartWrapper_) { - browserEvents.unbind(this.onStartWrapper_); - } - } - - /** - * Handle a touch start or pointer down event and keep track of current - * pointers. - * - * @param e A touch start, or pointer down event. - * @internal - */ - handleTouchStart(e: Event) { - const pointerId = Touch.getTouchIdentifierFromEvent(e); - // store the pointerId in the current list of pointers - this.cachedPoints.set(pointerId, this.getTouchPoint(e)); - const pointers = Array.from(this.cachedPoints.keys()); - // If two pointers are down, store info - if (pointers.length === 2) { - const point0 = (this.cachedPoints.get(pointers[0]))!; - const point1 = (this.cachedPoints.get(pointers[1]))!; - this.startDistance_ = Coordinate.distance(point0, point1); - this.isMultiTouch_ = true; - e.preventDefault(); - } - } - - /** - * Handle a touch move or pointer move event and zoom in/out if two pointers - * are on the screen. - * - * @param e A touch move, or pointer move event. - * @internal - */ - handleTouchMove(e: MouseEvent) { - const pointerId = Touch.getTouchIdentifierFromEvent(e); - // Update the cache - this.cachedPoints.set(pointerId, this.getTouchPoint(e)); - - if (this.isPinchZoomEnabled_ && this.cachedPoints.size === 2) { - this.handlePinch_(e); - } else { - super.handleMove(e); - } - } - - /** - * Handle pinch zoom gesture. - * - * @param e A touch move, or pointer move event. - */ - private handlePinch_(e: MouseEvent) { - const pointers = Array.from(this.cachedPoints.keys()); - // Calculate the distance between the two pointers - const point0 = (this.cachedPoints.get(pointers[0]))!; - const point1 = (this.cachedPoints.get(pointers[1]))!; - const moveDistance = Coordinate.distance(point0, point1); - const scale = moveDistance / this.startDistance_; - - if (this.previousScale_ > 0 && this.previousScale_ < Infinity) { - const gestureScale = scale - this.previousScale_; - const delta = gestureScale > 0 ? gestureScale * ZOOM_IN_MULTIPLIER : - gestureScale * ZOOM_OUT_MULTIPLIER; - if (!this.startWorkspace_) { - throw new Error( - 'Cannot handle a pinch because the start workspace ' + - 'is undefined'); - } - const workspace = this.startWorkspace_; - const position = browserEvents.mouseToSvg( - e, workspace.getParentSvg(), workspace.getInverseScreenCTM()); - workspace.zoom(position.x, position.y, delta); - } - this.previousScale_ = scale; - e.preventDefault(); - } - - /** - * Handle a touch end or pointer end event and end the gesture. - * - * @param e A touch end, or pointer end event. - * @internal - */ - handleTouchEnd(e: Event) { - const pointerId = Touch.getTouchIdentifierFromEvent(e); - if (this.cachedPoints.has(pointerId)) { - this.cachedPoints.delete(pointerId); - } - if (this.cachedPoints.size < 2) { - this.cachedPoints.clear(); - this.previousScale_ = 0; - } - } - - /** - * Helper function returning the current touch point coordinate. - * - * @param e A touch or pointer event. - * @returns The current touch point coordinate - * @internal - */ - getTouchPoint(e: Event): Coordinate|null { - if (!this.startWorkspace_) { - return null; - } - // TODO(#6097): Make types accurate, possibly by refactoring touch handling. - const typelessEvent = e as AnyDuringMigration; - return new Coordinate( - typelessEvent.changedTouches ? typelessEvent.changedTouches[0].pageX : - typelessEvent.pageX, - typelessEvent.changedTouches ? typelessEvent.changedTouches[0].pageY : - typelessEvent.pageY); - } -} diff --git a/core/trashcan.ts b/core/trashcan.ts index 18bd2e370..04c1196e7 100644 --- a/core/trashcan.ts +++ b/core/trashcan.ts @@ -201,11 +201,11 @@ export class Trashcan extends DeleteArea implements IAutoHideable, // Using bindEventWithChecks_ for blocking mousedown causes issue in mobile. // See #4303 browserEvents.bind( - this.svgGroup_, 'mousedown', this, this.blockMouseDownWhenOpenable_); - browserEvents.bind(this.svgGroup_, 'mouseup', this, this.click); + this.svgGroup_, 'pointerdown', this, this.blockMouseDownWhenOpenable_); + browserEvents.bind(this.svgGroup_, 'pointerup', this, this.click); // Bind to body instead of this.svgGroup_ so that we don't get lid jitters - browserEvents.bind(body, 'mouseover', this, this.mouseOver_); - browserEvents.bind(body, 'mouseout', this, this.mouseOut_); + browserEvents.bind(body, 'pointerover', this, this.mouseOver_); + browserEvents.bind(body, 'pointerout', this, this.mouseOut_); this.animateLid_(); return this.svgGroup_; } @@ -275,7 +275,13 @@ export class Trashcan extends DeleteArea implements IAutoHideable, const contents = this.contents_.map(function(string) { return JSON.parse(string); }); - this.flyout?.show(contents); + // Trashcans with lots of blocks can take a second to render. + const blocklyStyle = this.workspace.getParentSvg().style; + blocklyStyle.cursor = 'wait'; + setTimeout(() => { + this.flyout?.show(contents); + blocklyStyle.cursor = ''; + }, 10); this.fireUiEvent_(true); } @@ -513,7 +519,7 @@ export class Trashcan extends DeleteArea implements IAutoHideable, * * @param e A mouse down event. */ - private blockMouseDownWhenOpenable_(e: Event) { + private blockMouseDownWhenOpenable_(e: PointerEvent) { if (!this.contentsIsOpen() && this.hasContents_()) { // Don't start a workspace scroll. e.stopPropagation(); diff --git a/core/variable_map.ts b/core/variable_map.ts index f2dd95edb..ecba4b87f 100644 --- a/core/variable_map.ts +++ b/core/variable_map.ts @@ -59,6 +59,7 @@ export class VariableMap { * @internal */ renameVariable(variable: VariableModel, newName: string) { + if (variable.name === newName) return; const type = variable.type; const conflictVar = this.getVariable(newName, type); const blocks = this.workspace.getAllBlocks(false); @@ -184,6 +185,8 @@ export class VariableMap { this.variableMap.delete(type); this.variableMap.set(type, variables); + eventUtils.fire(new (eventUtils.get(eventUtils.VAR_CREATE))(variable)); + return variable; } /* Begin functions for variable deletion. */ diff --git a/core/variable_model.ts b/core/variable_model.ts index cd404d316..cfd832a90 100644 --- a/core/variable_model.ts +++ b/core/variable_model.ts @@ -15,7 +15,6 @@ goog.declareModuleId('Blockly.VariableModel'); // Unused import preserved for side-effects. Remove if unneeded. import './events/events_var_create.js'; -import * as eventUtils from './events/utils.js'; import * as idGenerator from './utils/idgenerator.js'; import type {Workspace} from './workspace.js'; @@ -58,8 +57,6 @@ export class VariableModel { * UUID. */ this.id_ = opt_id || idGenerator.genUid(); - - eventUtils.fire(new (eventUtils.get(eventUtils.VAR_CREATE))(this)); } /** @returns The ID for the variable. */ diff --git a/core/variables.ts b/core/variables.ts index b3a15584d..e50327347 100644 --- a/core/variables.ts +++ b/core/variables.ts @@ -222,7 +222,7 @@ export function generateUniqueNameFromOptions( } } if (!inUse) { - return potName; + break; } letterIndex++; @@ -233,6 +233,7 @@ export function generateUniqueNameFromOptions( } potName = letters.charAt(letterIndex) + suffix; } + return potName; } /** diff --git a/core/workspace_comment_svg.ts b/core/workspace_comment_svg.ts index 1af608b41..9e5e96b0d 100644 --- a/core/workspace_comment_svg.ts +++ b/core/workspace_comment_svg.ts @@ -170,10 +170,10 @@ export class WorkspaceCommentSvg extends WorkspaceComment implements } if (!this.workspace.options.readOnly && !this.eventsInit_) { browserEvents.conditionalBind( - this.svgRectTarget_ as SVGRectElement, 'mousedown', this, + this.svgRectTarget_ as SVGRectElement, 'pointerdown', this, this.pathMouseDown_); browserEvents.conditionalBind( - this.svgHandleTarget_ as SVGRectElement, 'mousedown', this, + this.svgHandleTarget_ as SVGRectElement, 'pointerdown', this, this.pathMouseDown_); } this.eventsInit_ = true; @@ -189,11 +189,11 @@ export class WorkspaceCommentSvg extends WorkspaceComment implements } /** - * Handle a mouse-down on an SVG comment. + * Handle a pointerdown on an SVG comment. * - * @param e Mouse down event or touch start event. + * @param e Pointer down event. */ - private pathMouseDown_(e: Event) { + private pathMouseDown_(e: PointerEvent) { const gesture = this.workspace.getGesture(e); if (gesture) { gesture.handleBubbleStart(e, this); @@ -203,11 +203,11 @@ export class WorkspaceCommentSvg extends WorkspaceComment implements /** * Show the context menu for this workspace comment. * - * @param e Mouse event. + * @param e Pointer event. * @internal */ // eslint-disable-next-line @typescript-eslint/no-unused-vars - showContextMenu(e: Event) { + showContextMenu(e: PointerEvent) { throw new Error( 'The implementation of showContextMenu should be ' + 'monkey-patched in by blockly.ts'); @@ -685,18 +685,18 @@ export class WorkspaceCommentSvg extends WorkspaceComment implements if (this.resizeGroup_) { browserEvents.conditionalBind( - (this.resizeGroup_), 'mousedown', this, this.resizeMouseDown_); + (this.resizeGroup_), 'pointerdown', this, this.resizeMouseDown_); } if (this.isDeletable()) { browserEvents.conditionalBind( - this.deleteGroup_ as SVGGElement, 'mousedown', this, + this.deleteGroup_ as SVGGElement, 'pointerdown', this, this.deleteMouseDown_); browserEvents.conditionalBind( - this.deleteGroup_ as SVGGElement, 'mouseout', this, + this.deleteGroup_ as SVGGElement, 'pointerout', this, this.deleteMouseOut_); browserEvents.conditionalBind( - this.deleteGroup_ as SVGGElement, 'mouseup', this, + this.deleteGroup_ as SVGGElement, 'pointerup', this, this.deleteMouseUp_); } } @@ -820,11 +820,11 @@ export class WorkspaceCommentSvg extends WorkspaceComment implements } /** - * Handle a mouse-down on comment's resize corner. + * Handle a pointerdown on comment's resize corner. * - * @param e Mouse down event. + * @param e Pointer down event. */ - private resizeMouseDown_(e: MouseEvent) { + private resizeMouseDown_(e: PointerEvent) { this.unbindDragEvents_(); if (browserEvents.isRightButton(e)) { // No right-click. @@ -838,20 +838,20 @@ export class WorkspaceCommentSvg extends WorkspaceComment implements this.workspace.RTL ? -this.width_ : this.width_, this.height_)); this.onMouseUpWrapper_ = browserEvents.conditionalBind( - document, 'mouseup', this, this.resizeMouseUp_); + document, 'pointerup', this, this.resizeMouseUp_); this.onMouseMoveWrapper_ = browserEvents.conditionalBind( - document, 'mousemove', this, this.resizeMouseMove_); + document, 'pointermove', this, this.resizeMouseMove_); this.workspace.hideChaff(); // This event has been handled. No need to bubble up to the document. e.stopPropagation(); } /** - * Handle a mouse-down on comment's delete icon. + * Handle a pointerdown on comment's delete icon. * - * @param e Mouse down event. + * @param e Pointer down event. */ - private deleteMouseDown_(e: Event) { + private deleteMouseDown_(e: PointerEvent) { // Highlight the delete icon. if (this.deleteIconBorder_) { dom.addClass(this.deleteIconBorder_, 'blocklyDeleteIconHighlighted'); @@ -861,11 +861,11 @@ export class WorkspaceCommentSvg extends WorkspaceComment implements } /** - * Handle a mouse-out on comment's delete icon. + * Handle a pointerout on comment's delete icon. * - * @param _e Mouse out event. + * @param _e Pointer out event. */ - private deleteMouseOut_(_e: Event) { + private deleteMouseOut_(_e: PointerEvent) { // Restore highlight on the delete icon. if (this.deleteIconBorder_) { dom.removeClass(this.deleteIconBorder_, 'blocklyDeleteIconHighlighted'); @@ -873,18 +873,18 @@ export class WorkspaceCommentSvg extends WorkspaceComment implements } /** - * Handle a mouse-up on comment's delete icon. + * Handle a pointerup on comment's delete icon. * - * @param e Mouse up event. + * @param e Pointer up event. */ - private deleteMouseUp_(e: Event) { + private deleteMouseUp_(e: PointerEvent) { // Delete this comment. this.dispose(); // This event has been handled. No need to bubble up to the document. e.stopPropagation(); } - /** Stop binding to the global mouseup and mousemove events. */ + /** Stop binding to the global pointerup and pointermove events. */ private unbindDragEvents_() { if (this.onMouseUpWrapper_) { browserEvents.unbind(this.onMouseUpWrapper_); @@ -897,21 +897,22 @@ export class WorkspaceCommentSvg extends WorkspaceComment implements } /** - * Handle a mouse-up event while dragging a comment's border or resize handle. + * Handle a pointerup event while dragging a comment's border or resize + * handle. * - * @param _e Mouse up event. + * @param _e Pointer up event. */ - private resizeMouseUp_(_e: Event) { + private resizeMouseUp_(_e: PointerEvent) { Touch.clearTouchIdentifier(); this.unbindDragEvents_(); } /** - * Resize this comment to follow the mouse. + * Resize this comment to follow the pointer. * - * @param e Mouse move event. + * @param e Pointer move event. */ - private resizeMouseMove_(e: MouseEvent) { + private resizeMouseMove_(e: PointerEvent) { this.autoLayout_ = false; const newXY = this.workspace.moveDrag(e); this.setSize_(this.RTL ? -newXY.x : newXY.x, newXY.y); diff --git a/core/workspace_svg.ts b/core/workspace_svg.ts index 551b60476..06c43d682 100644 --- a/core/workspace_svg.ts +++ b/core/workspace_svg.ts @@ -56,7 +56,6 @@ import type {Theme} from './theme.js'; import {Classic} from './theme/classic.js'; import {ThemeManager} from './theme_manager.js'; import * as Tooltip from './tooltip.js'; -import {TouchGesture} from './touch_gesture.js'; import type {Trashcan} from './trashcan.js'; import * as arrayUtils from './utils/array.js'; import {Coordinate} from './utils/coordinate.js'; @@ -224,7 +223,7 @@ export class WorkspaceSvg extends Workspace implements IASTNodeLocationSvg { * * @internal */ - currentGesture_: TouchGesture|null = null; + currentGesture_: Gesture|null = null; /** This workspace's surface for dragging blocks, if it exists. */ private readonly blockDragSurface: BlockDragSurfaceSvg|null = null; @@ -774,7 +773,7 @@ export class WorkspaceSvg extends Workspace implements IASTNodeLocationSvg { if (!this.isFlyout) { browserEvents.conditionalBind( - this.svgGroup_, 'mousedown', this, this.onMouseDown_, false, true); + this.svgGroup_, 'pointerdown', this, this.onMouseDown_, false); // This no-op works around https://bugs.webkit.org/show_bug.cgi?id=226683, // which otherwise prevents zoom/scroll events from being observed in // Safari. Once that bug is fixed it should be removed. @@ -959,7 +958,6 @@ export class WorkspaceSvg extends Workspace implements IASTNodeLocationSvg { * * @param opt_own Whether to only return the workspace's own flyout. * @returns The flyout on this workspace. - * @internal */ getFlyout(opt_own?: boolean): IFlyout|null { if (this.flyout || opt_own) { @@ -975,7 +973,6 @@ export class WorkspaceSvg extends Workspace implements IASTNodeLocationSvg { * Getter for the toolbox associated with this workspace, if one exists. * * @returns The toolbox on this workspace. - * @internal */ getToolbox(): IToolbox|null { return this.toolbox_; @@ -1596,17 +1593,15 @@ export class WorkspaceSvg extends Workspace implements IASTNodeLocationSvg { /* eslint-enable */ /** - * Returns the drag target the mouse event is over. + * Returns the drag target the pointer event is over. * - * @param e Mouse move event. + * @param e Pointer move event. * @returns Null if not over a drag target, or the drag target the event is * over. */ - getDragTarget(e: Event): IDragTarget|null { + getDragTarget(e: PointerEvent): IDragTarget|null { for (let i = 0, targetArea; targetArea = this.dragTargetAreas[i]; i++) { - if (targetArea.clientRect.contains( - (e as AnyDuringMigration).clientX, - (e as AnyDuringMigration).clientY)) { + if (targetArea.clientRect.contains(e.clientX, e.clientY)) { return targetArea.component; } } @@ -1614,11 +1609,11 @@ export class WorkspaceSvg extends Workspace implements IASTNodeLocationSvg { } /** - * Handle a mouse-down on SVG drawing surface. + * Handle a pointerdown on SVG drawing surface. * - * @param e Mouse down event. + * @param e Pointer down event. */ - private onMouseDown_(e: MouseEvent) { + private onMouseDown_(e: PointerEvent) { const gesture = this.getGesture(e); if (gesture) { gesture.handleWsStart(e, this); @@ -1628,10 +1623,10 @@ export class WorkspaceSvg extends Workspace implements IASTNodeLocationSvg { /** * Start tracking a drag of an object on this workspace. * - * @param e Mouse down event. + * @param e Pointer down event. * @param xy Starting location of object. */ - startDrag(e: MouseEvent, xy: Coordinate) { + startDrag(e: PointerEvent, xy: Coordinate) { // Record the starting offset between the bubble's location and the mouse. const point = browserEvents.mouseToSvg( e, this.getParentSvg(), this.getInverseScreenCTM()); @@ -1644,10 +1639,10 @@ export class WorkspaceSvg extends Workspace implements IASTNodeLocationSvg { /** * Track a drag of an object on this workspace. * - * @param e Mouse move event. + * @param e Pointer move event. * @returns New location of object. */ - moveDrag(e: MouseEvent): Coordinate { + moveDrag(e: PointerEvent): Coordinate { const point = browserEvents.mouseToSvg( e, this.getParentSvg(), this.getInverseScreenCTM()); // Fix scale of mouse event. @@ -2473,14 +2468,13 @@ export class WorkspaceSvg extends Workspace implements IASTNodeLocationSvg { * Look up the gesture that is tracking this touch stream on this workspace. * May create a new gesture. * - * @param e Mouse event or touch event. + * @param e Pointer event. * @returns The gesture that is tracking this touch stream, or null if no * valid gesture exists. * @internal */ - getGesture(e: Event): TouchGesture|null { - const isStart = e.type === 'mousedown' || e.type === 'touchstart' || - e.type === 'pointerdown'; + getGesture(e: PointerEvent): Gesture|null { + const isStart = e.type === 'pointerdown'; const gesture = this.currentGesture_; if (gesture) { @@ -2497,7 +2491,7 @@ export class WorkspaceSvg extends Workspace implements IASTNodeLocationSvg { // No gesture existed on this workspace, but this looks like the start of a // new gesture. if (isStart) { - this.currentGesture_ = new TouchGesture(e, this); + this.currentGesture_ = new Gesture(e, this); return this.currentGesture_; } // No gesture existed and this event couldn't be the start of a new gesture. diff --git a/core/zoom_controls.ts b/core/zoom_controls.ts index 6b4f6f4b2..b25ff4a85 100644 --- a/core/zoom_controls.ts +++ b/core/zoom_controls.ts @@ -276,7 +276,7 @@ export class ZoomControls implements IPositionable { // Attach listener. this.onZoomOutWrapper = browserEvents.conditionalBind( - this.zoomOutGroup, 'mousedown', null, this.zoom.bind(this, -1)); + this.zoomOutGroup, 'pointerdown', null, this.zoom.bind(this, -1)); } /** @@ -322,7 +322,7 @@ export class ZoomControls implements IPositionable { // Attach listener. this.onZoomInWrapper = browserEvents.conditionalBind( - this.zoomInGroup, 'mousedown', null, this.zoom.bind(this, 1)); + this.zoomInGroup, 'pointerdown', null, this.zoom.bind(this, 1)); } /** @@ -333,7 +333,7 @@ export class ZoomControls implements IPositionable { * positive amount values zoom in. * @param e A mouse down event. */ - private zoom(amount: number, e: Event) { + private zoom(amount: number, e: PointerEvent) { this.workspace.markFocused(); this.workspace.zoomCenter(amount); this.fireZoomEvent(); @@ -380,7 +380,7 @@ export class ZoomControls implements IPositionable { // Attach event listeners. this.onZoomResetWrapper = browserEvents.conditionalBind( - this.zoomResetGroup, 'mousedown', null, this.resetZoom.bind(this)); + this.zoomResetGroup, 'pointerdown', null, this.resetZoom.bind(this)); } /** @@ -388,7 +388,7 @@ export class ZoomControls implements IPositionable { * * @param e A mouse down event. */ - private resetZoom(e: Event) { + private resetZoom(e: PointerEvent) { this.workspace.markFocused(); // zoom is passed amount and computes the new scale using the formula: diff --git a/gulpfile.js b/gulpfile.js index 9ac75c91a..e2e41762f 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -41,7 +41,6 @@ module.exports = { gitUpdateGithubPages: gitTasks.updateGithubPages, // Manually-invokable targets, with prequisites where required. - prepare: buildTasks.prepare, format: buildTasks.format, messages: buildTasks.messages, // Generate msg/json/en.json et al. sortRequires: cleanupTasks.sortRequires, @@ -52,9 +51,6 @@ module.exports = { buildAdvancedCompilationTest: buildTasks.buildAdvancedCompilationTest, gitCreateRC: gitTasks.createRC, docs: docsTasks.docs, - - // Targets intended only for invocation by scripts; may omit prerequisites. - onlyBuildAdvancedCompilationTest: buildTasks.onlyBuildAdvancedCompilationTest, // Legacy targets, to be deleted. recompile: releaseTasks.recompile, diff --git a/msg/json/README.md b/msg/json/README.md new file mode 100644 index 000000000..e2b891e7e --- /dev/null +++ b/msg/json/README.md @@ -0,0 +1,33 @@ +# Blockly + +## Messages + +This directory contains "messages" files, which are JSON-format files +containing human-translated strings that are needed by Blockly. + +### Translating + +**We do not accept pull requests for files in this directory**. +Instead, we use [Translatewiki](https://translatewiki.net/) to manage +translations for Blockly. Please refer to [the detailed instructions +on how to help us translate Blockly]( +https://developers.google.com/blockly/guides/contribute/core/translating) +on the Blockly Developers site. + +There is one notable exception: because the language is not supported +by Translatewiki, contributors to the [Klingon translation]( +https://developers.google.com/blockly/guides/contribute/core/klingon) +may submit PRs making changes to [`tlh.json`](tlh.json) directly. + +### Building + +Blockly cannot use the files in this directory directly. Instead, +they must first be converted into executable `.js` files we call +"langfiles". This is done automatically as needed by the build +system, but you can also run this build step manually by invoking `npm +run langfiles`; the output will be found in `build/msg/`. + +## Additional Information + +For more information about Blockly, see [the main Blockly README]( +../../README.md). diff --git a/msg/json/bs.json b/msg/json/bs.json index 3f97c4ce3..ba09f5324 100644 --- a/msg/json/bs.json +++ b/msg/json/bs.json @@ -73,11 +73,17 @@ "CONTROLS_FLOW_STATEMENTS_WARNING": "Upozorenje: Ovaj blok se moลพe koristiti samo unutar petlje.", "CONTROLS_IF_TOOLTIP_1": "Ako je vrijednost taฤna, izvrลกava neke naredbe.", "CONTROLS_IF_TOOLTIP_2": "Ako je vrijednost taฤna, izvrลกava neke naredbe. U suprotnom, izvrลกava drugi blok naredbi.", + "CONTROLS_IF_TOOLTIP_3": "Ako je prva vrijednost taฤna, onda izvrลกi prvi blok naredbi. U suprotnom, ako je druga vrijednost taฤna, izvrลกi drugi blok naredbi.", + "CONTROLS_IF_TOOLTIP_4": "Ako je prva vrijednost taฤna, onda izvrลกi prvi blok naredbi. U suprotnom, ako je druga vrijednost taฤna, izvrลกi drugi blok naredbi. Ako nijedna od vrijednosti nije taฤna, izvrลกi posljednji blok naredbi.", "CONTROLS_IF_MSG_IF": "ako", "CONTROLS_IF_MSG_ELSEIF": "inaฤe ako", "CONTROLS_IF_MSG_ELSE": "inaฤe", "CONTROLS_IF_ELSEIF_TOOLTIP": "Dodajte uslov bloku \"ako\".", "LOGIC_COMPARE_HELPURL": "https://bs.wikipedia.org/wiki/Nejednakost", + "LOGIC_COMPARE_TOOLTIP_EQ": "Vraฤ‡a taฤno ako su oba ulaza jednaka jedan drugom.", + "LOGIC_COMPARE_TOOLTIP_LT": "Vraฤ‡a taฤno ako je prvi ulaz manji od drugog ulaza.", + "LOGIC_COMPARE_TOOLTIP_GT": "Vraฤ‡a taฤno ako je prvi ulaz veฤ‡i od drugog ulaza.", + "LOGIC_OPERATION_TOOLTIP_AND": "Vraฤ‡a taฤno ako su oba ulaza taฤna.", "LOGIC_OPERATION_AND": "i", "LOGIC_OPERATION_OR": "ili", "LOGIC_NEGATE_TITLE": "nije %1", @@ -91,6 +97,12 @@ "LOGIC_TERNARY_IF_FALSE": "ako je netaฤno", "MATH_NUMBER_HELPURL": "https://bs.wikipedia.org/wiki/Broj", "MATH_NUMBER_TOOLTIP": "Broj.", + "MATH_TRIG_SIN": "sin", + "MATH_TRIG_COS": "cos", + "MATH_TRIG_TAN": "tan", + "MATH_TRIG_ASIN": "asin", + "MATH_TRIG_ACOS": "acos", + "MATH_TRIG_ATAN": "atan", "MATH_ARITHMETIC_HELPURL": "https://bs.wikipedia.org/wiki/Aritmetika", "MATH_ARITHMETIC_TOOLTIP_ADD": "Vraฤ‡a zbir dva broja.", "MATH_ARITHMETIC_TOOLTIP_MINUS": "Vraฤ‡a razliku dva broja.", diff --git a/msg/json/de.json b/msg/json/de.json index bc2edc511..8d1d0d631 100644 --- a/msg/json/de.json +++ b/msg/json/de.json @@ -5,6 +5,7 @@ "Brettchenweber", "Cvanca", "Dan-yell", + "Justman10000", "M165437", "Metalhead64", "MrFraggle", @@ -124,6 +125,12 @@ "LOGIC_TERNARY_TOOLTIP": "รœberprรผft eine Bedingung \"prรผfe\". Falls die Bedingung wahr ist, wird der \"falls wahr\"-Wert zurรผckgegeben, andernfalls der \"falls unwahr\"-Wert", "MATH_NUMBER_HELPURL": "https://de.wikipedia.org/wiki/Zahl", "MATH_NUMBER_TOOLTIP": "Eine Zahl.", + "MATH_TRIG_SIN": "sin", + "MATH_TRIG_COS": "cos", + "MATH_TRIG_TAN": "tan", + "MATH_TRIG_ASIN": "asin", + "MATH_TRIG_ACOS": "acos", + "MATH_TRIG_ATAN": "atan", "MATH_ARITHMETIC_HELPURL": "https://de.wikipedia.org/wiki/Grundrechenart", "MATH_ARITHMETIC_TOOLTIP_ADD": "Ist die Summe zweier Zahlen.", "MATH_ARITHMETIC_TOOLTIP_MINUS": "Ist die Differenz zweier Zahlen.", diff --git a/msg/json/diq.json b/msg/json/diq.json index b3b0dcad5..666b4cb44 100644 --- a/msg/json/diq.json +++ b/msg/json/diq.json @@ -93,6 +93,12 @@ "LOGIC_TERNARY_TOOLTIP": "ลžerta'test'i test keno. Eger ke ลŸert raลŸta se erca 'raลŸt'i รงarneno, รงepo se erca 'รงep' รงarneno.", "MATH_NUMBER_HELPURL": "https://diq.wikipedia.org/wiki/Numre", "MATH_NUMBER_TOOLTIP": "Yew numre.", + "MATH_TRIG_SIN": "sin", + "MATH_TRIG_COS": "cos", + "MATH_TRIG_TAN": "tan", + "MATH_TRIG_ASIN": "arcsin", + "MATH_TRIG_ACOS": "arccos", + "MATH_TRIG_ATAN": "arctan", "MATH_ARITHMETIC_HELPURL": "https://en.wikipedia.org/wiki/Aritmetik", "MATH_ARITHMETIC_TOOLTIP_ADD": "ArรชdayฤฑลŸรช dฤฑ amara tadรช", "MATH_ARITHMETIC_TOOLTIP_MINUS": "Ferqรช dฤฑ amara tadรช", diff --git a/msg/json/es.json b/msg/json/es.json index c45cf4e4c..d3b4e28fb 100644 --- a/msg/json/es.json +++ b/msg/json/es.json @@ -14,12 +14,13 @@ "Martineduardo", "Rubentl134", "Ryo567", + "SpikeShroom", "VegaDark", "WeSiToS" ] }, "VARIABLES_DEFAULT_NAME": "elemento", - "UNNAMED_KEY": "Sin nombre", + "UNNAMED_KEY": "sin nombre", "TODAY": "Hoy", "DUPLICATE_BLOCK": "Duplicar", "ADD_COMMENT": "Aรฑadir comentario", @@ -41,19 +42,19 @@ "UNDO": "Deshacer", "REDO": "Rehacer", "CHANGE_VALUE_TITLE": "Cambiar el valor:", - "RENAME_VARIABLE": "Cambiar nombre de variableโ€ฆ", - "RENAME_VARIABLE_TITLE": "Renombrar todas las variables ยซ%1ยป a:", - "NEW_VARIABLE": "Crear variableโ€ฆ", - "NEW_STRING_VARIABLE": "Crear una cadena variable...", + "RENAME_VARIABLE": "Renombrar variable...", + "RENAME_VARIABLE_TITLE": "Renombrar todas las variables '%1' a:", + "NEW_VARIABLE": "Crear variable...", + "NEW_STRING_VARIABLE": "Crear una variable de cadena...", "NEW_NUMBER_VARIABLE": "Crear una variable de nรบmero...", "NEW_COLOUR_VARIABLE": "Crear una variable de color...", "NEW_VARIABLE_TYPE_TITLE": "Nuevo tipo de variable:", "NEW_VARIABLE_TITLE": "Nombre de variable nueva:", - "VARIABLE_ALREADY_EXISTS": "Ya existe una variable llamada '%1'.", + "VARIABLE_ALREADY_EXISTS": "Ya existe una variable nombrada '%1'.", "VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE": "Ya existe una variable nombrada '%1' para otra variable del tipo: '%2'.", "DELETE_VARIABLE_CONFIRMATION": "ยฟBorrar %1 usos de la variable '%2'?", "CANNOT_DELETE_VARIABLE_PROCEDURE": "No se puede eliminar la variable '%1' porque es parte de la definiciรณn de la funciรณn '%2'", - "DELETE_VARIABLE": "Borrar la variable \"%1\"", + "DELETE_VARIABLE": "Borrar la variable '%1'", "COLOUR_PICKER_HELPURL": "https://es.wikipedia.org/wiki/Color", "COLOUR_PICKER_TOOLTIP": "Elige un color de la paleta.", "COLOUR_RANDOM_TITLE": "color aleatorio", @@ -67,7 +68,7 @@ "COLOUR_BLEND_COLOUR1": "color 1", "COLOUR_BLEND_COLOUR2": "color 2", "COLOUR_BLEND_RATIO": "proporciรณn", - "COLOUR_BLEND_TOOLTIP": "Combina dos colores con una proporciรณn determinada (0,0-1,0).", + "COLOUR_BLEND_TOOLTIP": "Combina dos colores con una proporciรณn determinada (0,0 - 1,0).", "CONTROLS_REPEAT_HELPURL": "https://es.wikipedia.org/wiki/Bucle_for", "CONTROLS_REPEAT_TITLE": "repetir %1 veces", "CONTROLS_REPEAT_INPUT_DO": "hacer", @@ -120,6 +121,12 @@ "LOGIC_TERNARY_TOOLTIP": "Comprueba la condiciรณn en \"prueba\". Si la condiciรณn es verdadera, devuelve el valor \"si es verdadero\"; de lo contrario, devuelve el valor \"si es falso\".", "MATH_NUMBER_HELPURL": "https://es.wikipedia.org/wiki/Nรบmero", "MATH_NUMBER_TOOLTIP": "Un nรบmero.", + "MATH_TRIG_SIN": "sin", + "MATH_TRIG_COS": "cos", + "MATH_TRIG_TAN": "tan", + "MATH_TRIG_ASIN": "asin", + "MATH_TRIG_ACOS": "acos", + "MATH_TRIG_ATAN": "atan", "MATH_ARITHMETIC_HELPURL": "https://es.wikipedia.org/wiki/Aritmรฉtica", "MATH_ARITHMETIC_TOOLTIP_ADD": "Devuelve la suma de ambos nรบmeros.", "MATH_ARITHMETIC_TOOLTIP_MINUS": "Devuelve la diferencia de ambos nรบmeros.", @@ -261,6 +268,7 @@ "LISTS_GET_INDEX_GET": "obtener", "LISTS_GET_INDEX_GET_REMOVE": "obtener y eliminar", "LISTS_GET_INDEX_REMOVE": "eliminar", + "LISTS_GET_INDEX_FROM_START": "#", "LISTS_GET_INDEX_FROM_END": "# del final", "LISTS_GET_INDEX_FIRST": "primero", "LISTS_GET_INDEX_LAST": "รบltimo", diff --git a/msg/json/fr.json b/msg/json/fr.json index 60a422eae..6cc6a37b6 100644 --- a/msg/json/fr.json +++ b/msg/json/fr.json @@ -213,7 +213,7 @@ "TEXT_TEXT_HELPURL": "https://fr.wikipedia.org/wiki/Cha%C3%AEne_de_caract%C3%A8res", "TEXT_TEXT_TOOLTIP": "Une lettre, un mot ou une ligne de texte.", "TEXT_JOIN_TITLE_CREATEWITH": "crรฉer un texte avec", - "TEXT_JOIN_TOOLTIP": "Crรฉer un morceau de texte en joignant bout ร  bout et successivement un nombre quelconque dโ€™รฉlรฉments dans le mรชme ordre.", + "TEXT_JOIN_TOOLTIP": "Crรฉer un morceau de texte en joignant bout ร  bout un nombre quelconque dโ€™รฉlรฉments dans lโ€™ordre indiquรฉ.", "TEXT_CREATE_JOIN_TITLE_JOIN": "joindre", "TEXT_CREATE_JOIN_TOOLTIP": "Ajouter, supprimer, ou rรฉordonner des sections pour reconfigurer ce bloc de texte.", "TEXT_CREATE_JOIN_ITEM_TOOLTIP": "Ajouter un รฉlรฉment au texte.", @@ -281,7 +281,7 @@ "LISTS_INDEX_OF_TOOLTIP": "Renvoie lโ€™index de la premiรจre/derniรจre occurrence de lโ€™รฉlรฉment dans la liste. Renvoie %1 si lโ€™รฉlรฉment nโ€™est pas trouvรฉ.", "LISTS_GET_INDEX_GET": "obtenir", "LISTS_GET_INDEX_GET_REMOVE": "obtenir et supprimer", - "LISTS_GET_INDEX_REMOVE": "supprimer", + "LISTS_GET_INDEX_REMOVE": "retirer", "LISTS_GET_INDEX_FROM_START": "nยบ", "LISTS_GET_INDEX_FROM_END": "nยฐ depuis la fin", "LISTS_GET_INDEX_FIRST": "premier", diff --git a/msg/json/he.json b/msg/json/he.json index 00826635c..d869c21f9 100644 --- a/msg/json/he.json +++ b/msg/json/he.json @@ -24,7 +24,7 @@ "TODAY": "ื”ื™ื•ื", "DUPLICATE_BLOCK": "ืฉื›ืคืœ", "ADD_COMMENT": "ื”ื•ืกืฃ ืชื’ื•ื‘ื”", - "REMOVE_COMMENT": "ื”ืกืจ ืชื’ื•ื‘ื”", + "REMOVE_COMMENT": "ื”ืกืจืช ืชื’ื•ื‘ื”", "DUPLICATE_COMMENT": "ืฉื›ืคื•ืœ ื”ื”ืขืจื”", "EXTERNAL_INPUTS": "ืงืœื˜ื™ื ื—ื™ืฆื•ื ื™ื™ื", "INLINE_INPUTS": "ืงืœื˜ื™ื ืคื ื™ืžื™ื™ื", diff --git a/msg/json/hy.json b/msg/json/hy.json index 1094bff29..8f34c7312 100644 --- a/msg/json/hy.json +++ b/msg/json/hy.json @@ -6,53 +6,55 @@ "Armenoid", "Kareyac", "Nona", - "Xelgen" + "Xelgen", + "ีีฅึ€ีฃีฅีต ีีกึ†ีกึ€ีตีกีถ" ] }, "VARIABLES_DEFAULT_NAME": "ีฟีกึ€ึ€", - "UNNAMED_KEY": "ีกีถีกีถีธึ‚ีถ", + "UNNAMED_KEY": "ีกีผีกีถึ ีกีถีพีกีถีดีกีถ", "TODAY": "ิฑีตีฝึ…ึ€", - "DUPLICATE_BLOCK": "ีŠีกีฟีณีฅีถีฅีฌ", - "ADD_COMMENT": "ิฑีพีฅีฌีกึีถีฅีฌ ีดีฅีฏีถีกีขีกีถีธึ‚ีฉีตีธึ‚ีถ", + "DUPLICATE_BLOCK": "ิฟึ€ีฏีถึ…ึ€ีซีถีกีฏีฅีฌ", + "ADD_COMMENT": "ี„ีฅีฏีถีกีขีกีถีธึ‚ีฉีตีธึ‚ีถ ีกีพีฅีฌีกึีถีฅีฌ", "REMOVE_COMMENT": "ี€ีฅีผีกึีถีฅีฌ ีดีฅีฏีถีกีขีกีถีธึ‚ีฉีตีธึ‚ีถีจ", "DUPLICATE_COMMENT": "ิฟึ€ีฏีถึ…ึ€ีซีถีกีฏีฅีฌ ีดีฅีฏีถีกีขีกีถีธึ‚ีฉีตีธึ‚ีถีจ", - "EXTERNAL_INPUTS": "ิฑึ€ีฟีกึ„ีซีถ ีดีธึ‚ีฟึ„ีฅึ€", - "INLINE_INPUTS": "ิณีฎีกีตีซีถ ีดีธึ‚ีฟึ„", + "EXTERNAL_INPUTS": "ิฑึ€ีฟีกึ„ีซีถ ีถีฅึ€ีกีฎีธึ‚ีดีถีฅึ€", + "INLINE_INPUTS": "ี†ีฅึ€ึ„ีซีถ ีถีฅึ€ีกีฎีธึ‚ีดีถีฅึ€", "DELETE_BLOCK": "ี‹ีถีปีฅีฌ ีขีฌีธีฏีจ", "DELETE_X_BLOCKS": "ี‹ีถีปีฅีฌ %1 ีขีฌีธีฏ", - "DELETE_ALL_BLOCKS": "ี‹ีถีปีฅีžีฌ ีขีธีฌีธึ€ %1 ีขีฌีธีฏีถีฅึ€ีจ:", + "DELETE_ALL_BLOCKS": "ี‹ีถีปีฅีžีฌ ีขีธีฌีธึ€ %1 ีขีฌีธีฏีถีฅึ€ีจึ‰", "CLEAN_UP": "ี„ีกึ„ึ€ีฅีฌ ีขีฌีธีฏีถีฅึ€ีจ", - "COLLAPSE_BLOCK": "ิฟึ€ีณีกีฟีฅีฌ ีขีฌีธีฏีจ", - "COLLAPSE_ALL": "ี”ีกีถีคีฅีฌ ีขีฌีธีฏีถีฅึ€ีจ", - "EXPAND_BLOCK": "ิฒีกึีฅีฌ ีขีฌีธีฏีจ", - "EXPAND_ALL": "ิฒีกึีฅีฌ ีขีฌีธีฏีถีฅึ€ีจ", + "COLLAPSE_BLOCK": "ิพีกีฌีฅีฌ ีขีฌีธีฏีจ", + "COLLAPSE_ALL": "ิพีกีฌีฅีฌ ีขีฌีธีฏีถีฅึ€ีจ", + "EXPAND_BLOCK": "ิธีถีคีกึ€ีฑีกีฏีฅีฌ ีขีฌีธีฏีจ", + "EXPAND_ALL": "ิธีถีคีกึ€ีฑีกีฏีฅีฌ ีขีฌีธีฏีถีฅึ€ีจ", "DISABLE_BLOCK": "ิฑีถีปีกีฟีฅีฌ ีขีฌีธีฏีจ", "ENABLE_BLOCK": "ี„ีซีกึีถีฅีฌ ีขีฌีธีฏีจ", "HELP": "ี•ีฃีถีธึ‚ีฉีตีธึ‚ีถ", - "UNDO": "ี€ีฅีฟ ีทึ€ีปีฅีฌ", - "REDO": "ิฟึ€ีฏีซีถ ีกีถีฅีฌ", - "CHANGE_VALUE_TITLE": "ี“ีธีญีฅีฌ ีถีทีกีถีกีฏีธึ‚ีฉีตีธึ‚ีถ:", + "UNDO": "ี€ีฅีฟีกึ€ีฏีฅีฌ", + "REDO": "ิฟึ€ีฏีถีฅีฌ", + "CHANGE_VALUE_TITLE": "ี“ีธีญีฅึ„ ีกึ€ีชีฅึ„ีจี", "RENAME_VARIABLE": "ีŽีฅึ€ีกีถีพีกีถีฅีฌ ึƒีธึƒีธีญีกีฏีกีถีจ...", + "RENAME_VARIABLE_TITLE": "ิฒีธีฌีธึ€ ยซ%1ยป ึƒีธึƒีธีญีกีฏีกีถีถีฅึ€ีจ ีพีฅึ€ีกีถีพีกีถีฅีฌี", "NEW_VARIABLE": "ีีฟีฅีฒีฎีฅีฌ ึƒีธึƒีธีญีกีฏีกีถ...", - "NEW_STRING_VARIABLE": "ีีฟีฅีฒีฎีฅีฌ ีฟีฅึ„ีฝีฟีกีตีซีถ ึƒีธึƒีธีญีกีฏีกีถ", - "NEW_NUMBER_VARIABLE": "ีีฟีฅีฒีฎีฅีฌ ีฉีพีกีตีซีถ ึƒีธึƒีธีญีกีฏีกีถ", - "NEW_COLOUR_VARIABLE": "ีีฟีฅีฒีฎีฅีฌ ีฃีธึ‚ีตีถีซ ึƒีธึƒีธีญีกีฏีกีถ", - "NEW_VARIABLE_TYPE_TITLE": "ี“ีธึƒีธีญีกีฏีกีถีซ ีถีธึ€ ีฟีซีบ", + "NEW_STRING_VARIABLE": "ีีธีฒีกีตีซีถ ึƒีธึƒีธีญีกีฏีกีถ ีฝีฟีฅีฒีฎีฅีฌ...", + "NEW_NUMBER_VARIABLE": "ินีพีกีตีซีถ ึƒีธึƒีธีญีกีฏีกีถ ีฝีฟีฅีฒีฎีฅีฌ...", + "NEW_COLOUR_VARIABLE": "ิณีธึ‚ีตีถีซ ึƒีธึƒีธีญีกีฏีกีถ ีฝีฟีฅีฒีฎีฅีฌ...", + "NEW_VARIABLE_TYPE_TITLE": "ี“ีธึƒีธีญีกีฏีกีถีซ ีถีธึ€ ีฟีฅีฝีกีฏี", "NEW_VARIABLE_TITLE": "ี†ีธึ€ ึƒีธึƒีธีญีกีฏีกีถีซ ีกีถีธึ‚ีถีจี", - "VARIABLE_ALREADY_EXISTS": "'%1' ีกีถีธึ‚ีถีธีพ ึƒีธึƒีธีญีกีฏีกีถ ีกึ€ีคีฅีถ ีฃีธีตีธึ‚ีฉีตีธึ‚ีถ ีธึ‚ีถีซ", - "VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE": "'%1' ีกีถีธึ‚ีถีธีพ ึƒีธึƒีธีญีกีฏีกีถ ีกึ€ีคีฅีถ ีฃีธีตีธึ‚ีฉีตีธึ‚ีถ ีธึ‚ีถีซ ีกีตีฌ ีฟีซีบีซ ีฐีกีดีกึ€: '%2'.", - "DELETE_VARIABLE_CONFIRMATION": "ี‹ีถีปีฅีžีฌ '%2' ึƒีธึƒีธีญีกีฏีกีถีซ %1 ีฏีซึ€ีกีผีธึ‚ีฉีตีธึ‚ีถีถีฅึ€ีจ", - "CANNOT_DELETE_VARIABLE_PROCEDURE": "ี€ีถีกึ€ีกีพีธึ€ ีนีซ ีปีถีปีฅีฌ %1 ึƒีธึƒีธีญีกีฏีกีถีจ, ีธึ€ีธีพีฐีฅีฟึ‡ ีกีตีถ '%2' ึ†ีธึ‚ีถีฏึีซีกีตีซ ีฐีกีตีฟีกึ€ีกึ€ีดีกีถ ีดีกีฝีถ ีง", - "DELETE_VARIABLE": "ี€ีฅีผีกึีถีฅีฌ '%1' ึƒีธึƒีธีญีกีฏีกีถีจ", + "VARIABLE_ALREADY_EXISTS": "ยซ%1ยป ีกีถีธึ‚ีถีธีพ ึƒีธึƒีธีญีกีฏีกีถ ีกึ€ีคีฅีถ ีฃีธีตีธึ‚ีฉีตีธึ‚ีถ ีธึ‚ีถีซึ‰", + "VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE": "ยซ%1ยป ีกีถีธึ‚ีถีธีพ ึƒีธึƒีธีญีกีฏีกีถ ีกึ€ีคีฅีถ ีฃีธีตีธึ‚ีฉีตีธึ‚ีถ ีธึ‚ีถีซ ีดีฅีฏ ีกีตีฌ ีฟีฅีฝีกีฏีซ ีฐีกีดีกึ€ี ยซ%2ยปึ‰", + "DELETE_VARIABLE_CONFIRMATION": "ี‹ีถีปีฅีžีฌ ยซ%2ยป ึƒีธึƒีธีญีกีฏีกีถีซ %1 ึ…ีฃีฟีกีฃีธึ€ีฎีธึ‚ีดีจึ‰", + "CANNOT_DELETE_VARIABLE_PROCEDURE": "ี€ีถีกึ€ีกีพีธึ€ ีนีซ ีปีถีปีฅีฌ ยซ%1ยป ึƒีธึƒีธีญีกีฏีกีถีจ, ึ„ีกีถีซ ีธึ€ ีกีตีถ ยซ%2ยป ีฃีธึ€ีฎีกีผีธึ‚ีตีฉีซ ีฝีกีฐีดีกีถีดีกีถ ีดีกีฝีถ ีง", + "DELETE_VARIABLE": "ี‹ีถีปีฅีฌ ยซ%1ยป ึƒีธึƒีธีญีกีฏีกีถีจ", "COLOUR_PICKER_HELPURL": "https://hy.wikipedia.org/wiki/ิณีธึ‚ีตีถ", - "COLOUR_PICKER_TOOLTIP": "ิธีถีฟึ€ีซึ€ ีฃีธึ‚ีตีถ ีถีฅึ€ีฏีกีบีถีกีฏีซึ:", + "COLOUR_PICKER_TOOLTIP": "ิณีธึ‚ีตีถ ีจีถีฟึ€ีฅึ„ ีถีฅึ€ีฏีกีบีถีกีฏีซึึ‰", "COLOUR_RANDOM_TITLE": "ีบีกีฟีกีฐีกีฏีกีถ ีฃีธึ‚ีตีถ", - "COLOUR_RANDOM_TOOLTIP": "ิธีถีฟึ€ีธึ‚ีด ีง ีฃีธึ‚ีตีถ ีบีกีฟีกีฐีกีฏีกีถีธึ‚ีฉีตีกีถ ีฝีฏีฆีขีธึ‚ีถึ„ีธีพ:", - "COLOUR_RGB_TITLE": "ีฃีธึ‚ีตีถีจ", - "COLOUR_RGB_RED": "ีฏีกึ€ีดีซึ€", - "COLOUR_RGB_GREEN": "ีฏีกีถีกีน", - "COLOUR_RGB_BLUE": "ีฏีกีบีธึ‚ีตีฟ", - "COLOUR_RGB_TOOLTIP": "ีีฟีฅีฒีฎีธึ‚ีด ีง ีฃีธึ‚ีตีถ ีฏีกึ€ีดีซึ€ีซ, ีฏีกีถีกีนีซ ึ‡ ีฏีกีบีธึ‚ีตีฟีซ ีถีทีพีกีฎ ึ„ีกีถีกีฏีธึ‚ีฉีตีธึ‚ีถีถีฅึ€ีธีพ: ิฒีธีฌีธึ€ ีกึ€ีชีฅึ„ีถีฅึ€ีจ ีบีฅีฟึ„ ีง ีฌีซีถีฅีถ 0-ีซ ึ‡ 100-ีซ ีดีซีปึ‡:", + "COLOUR_RANDOM_TOOLTIP": "ิณีธึ‚ีตีถ ีง ีจีถีฟึ€ีธึ‚ีด ีบีกีฟีกีฐีกีฏีกีถีธึ‚ีฉีตีกีถ ีฝีฏีฆีขีธึ‚ีถึ„ีธีพึ‰", + "COLOUR_RGB_TITLE": "ีฃีธึ‚ีตีถ", + "COLOUR_RGB_RED": "ีฏีกึ€ีดึ€ีซึ", + "COLOUR_RGB_GREEN": "ีฏีกีถีกีนีซึ", + "COLOUR_RGB_BLUE": "ีฏีกีบีธึ‚ีตีฟีซึ", + "COLOUR_RGB_TOOLTIP": "ิณีธึ‚ีตีถ ีง ีฝีฟีฅีฒีฎีธึ‚ีด ีฏีกึ€ีดีซึ€ีซ, ีฏีกีถีกีนีซ ึ‡ ีฏีกีบีธึ‚ีตีฟีซ ีถีทีพีกีฎ ึ„ีกีถีกีฏีธึ‚ีฉีตีธึ‚ีถีถีฅึ€ีธีพึ‰ ิฒีธีฌีธึ€ ีกึ€ีชีฅึ„ีถีฅึ€ีจ ีบีซีฟีซ ีฌีซีถีฅีถ 0-ีซ ึ‡ 100-ีซ ีดีซีปึ‡:", "COLOUR_BLEND_TITLE": "ีญีกีผีถีฅีฌ", "COLOUR_BLEND_COLOUR1": "ีฃีธึ‚ีตีถ 1", "COLOUR_BLEND_COLOUR2": "ีฃีธึ‚ีตีถ 2", @@ -65,9 +67,9 @@ "CONTROLS_WHILEUNTIL_OPERATOR_UNTIL": "ีฏึ€ีฏีถีฅีฌ, ึ„ีกีถีซ ีคีฅีผ ีนีซ", "CONTROLS_WHILEUNTIL_TOOLTIP_WHILE": "ี”ีกีถีซ ีคีฅีผ ีกึ€ีชีฅึ„ีจ ีณีทีดีกึ€ีซีฟ ีง, ีฏีกีฟีกึ€ีธึ‚ีด ีง ีฐึ€ีกีฐีกีถีฃีถีฅึ€ีจ:", "CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL": "ี”ีกีถีซ ีคีฅีผ ีกึ€ีชีฅึ„ีจ ีฏีฅีฒีฎ ีง, ีฏีกีฟีกึ€ีธึ‚ีด ีง ีธึ€ีธีทีกีฏีซ ีฐึ€ีกีฐีกีถีฃีถีฅึ€:", - "CONTROLS_FOR_TOOLTIP": "'%1' ึƒีธึƒีธีญีกีฏีกีถีซีถ ีพีฅึ€ีกีฃึ€ีธึ‚ีด ีง ีกึ€ีชีฅึ„ีถีฅึ€, ีฝีฏีฝีฅีฌีธีพ ีถีกีญีถีกีฏีกีถ ีกึ€ีชีฅึ„ีซึ, ีฟึ€ีพีกีฎ ึ„ีกีตีฌีธีพ ึ‡ ีฏีกีฟีกึ€ีธึ‚ีด ีง ีถีทีพีกีฎ ีฐึ€ีกีดีกีถีถีฅึ€ีจ", - "CONTROLS_FOR_TITLE": "ีฐีกีทีพีฅีฌ %1-ีจ, %2ึŠีซึ ีดีซีถีนึ‡ %3, ึ„ีกีตีฌีจ %4", - "CONTROLS_FOREACH_TITLE": "ีตีธึ‚ึ€ีกึ„ีกีถีนีตีธึ‚ึ€ %1 ีงีฌีฅีดีฅีถีฟีซ ีฐีกีดีกึ€ %2 ึีกีถีฏีซึ", + "CONTROLS_FOR_TOOLTIP": "ยซ%1ยป ึƒีธึƒีธีญีกีฏีกีถีซีถ ีฝีกีฐีดีกีถีพีกีฎ ึ„ีกีตีฌีธีพ ีพีฅึ€ีกีฃึ€ีธึ‚ีด ีง ีถีกีญีถีกีฏีกีถีซึ ีฝีฏีฝีกีฎ ีดีซีถีนึ‡ ีพีฅึ€ีปีถีกีฏีกีถ ีกึ€ีชีฅึ„ีจ ึ‡ ีฏีกีฟีกึ€ีธึ‚ีด ีง ีถีทีพีกีฎ ีฐึ€ีกีดีกีถีถีฅึ€ีจึ‰", + "CONTROLS_FOR_TITLE": "ีฐีกีทีพีฅีฌ %1-ีธีพ %2-ีซึ ีดีซีถีนึ‡ %3-ีจ %4 ึ„ีกีตีฌีธีพ", + "CONTROLS_FOREACH_TITLE": "ีกีดีฅีถ ีดีซ %1 ีฟีกึ€ึ€ีซ ีฐีกีดีกึ€ %2 ึีกีถีฏีซึ", "CONTROLS_FOREACH_TOOLTIP": "ี‘ีกีถีฏีซ ีตีธึ‚ึ€ีกึ„ีกีถีนีตีธึ‚ึ€ ีกีถีคีกีดีซ ีกึ€ีชีฅึ„ีจ ีพีฅึ€ีกีฃึ€ีธึ‚ีด ีง '%1' ึƒีธึƒีธีญีกีฏีกีถีซีถ ึ‡ ีฏีกีฟีกึ€ีธึ‚ีด ีถีทีพีกีฎ ีฐึ€ีกีดีกีถีถีฅึ€ีจึ‰", "CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK": "ีคีธึ‚ึ€ีฝ ีฃีกีฌ ึีซีฏีฌีซึ", "CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE": "ีกีถึีถีฅีฌ ีฏึ€ีฏีถีธึ‚ีฉีตีกีถ ีฐีกีปีธึ€ีค ีฏีกีฟีกึ€ีดีกีถีจ", @@ -108,6 +110,12 @@ "LOGIC_TERNARY_TOOLTIP": "ีีฟีธึ‚ีฃีธึ‚ีด ีง ีจีถีฟึ€ีธึ‚ีฉีตีกีถ ีบีกีตีดีกีถีจึ‰ ิตีฉีฅ ีกีตีถ ีณีทีดีกึ€ีซีฟ ีง, ีพีฅึ€ีกีคีกึ€ีฑีถีธึ‚ีด ีง ีกีผีกีปีซีถ ีกึ€ีชีฅึ„ีจ, ีฐีกีฏีกีผีกีฏ ีคีฅีบึ„ีธึ‚ีด ี ีฅึ€ีฏึ€ีธึ€ีคีจึ‰", "MATH_NUMBER_HELPURL": "https://hy.wikipedia.org/wiki/ินีซีพ", "MATH_NUMBER_TOOLTIP": "ินีซีพ", + "MATH_TRIG_SIN": "sin", + "MATH_TRIG_COS": "cos", + "MATH_TRIG_TAN": "tan", + "MATH_TRIG_ASIN": "arcsin", + "MATH_TRIG_ACOS": "arccos", + "MATH_TRIG_ATAN": "arctan", "MATH_ARITHMETIC_HELPURL": "https://hy.wikipedia.org/wiki/ินีพีกีขีกีถีธึ‚ีฉีตีธึ‚ีถ", "MATH_ARITHMETIC_TOOLTIP_ADD": "ีŽีฅึ€ีกีคีกึ€ีฑีถีธึ‚ีด ีง ีฅึ€ีฏีธึ‚ ีฉีพีฅึ€ีซ ีฃีธึ‚ีดีกึ€ีจ:", "MATH_ARITHMETIC_TOOLTIP_MINUS": "ีŽีฅึ€ีกีคีกึ€ีฑีถีธึ‚ีด ีง ีฅึ€ีฏีธึ‚ ีฉีพีฅึ€ีซ ีฟีกึ€ีขีฅึ€ีธึ‚ีฉีตีธึ‚ีถีจ:", @@ -245,6 +253,7 @@ "LISTS_GET_INDEX_GET": "ีพีฅึ€ึีถีฅีฌ", "LISTS_GET_INDEX_GET_REMOVE": "ีพีฅึ€ึีถีฅีฌ ึ‡ ีฐีฅีผีกึีถีฅีฌ", "LISTS_GET_INDEX_REMOVE": "ีฐีฅีผีกึีถีฅีฌ", + "LISTS_GET_INDEX_FROM_START": "โ„–", "LISTS_GET_INDEX_FROM_END": "โ„– ีพีฅึ€ีปีซึ", "LISTS_GET_INDEX_FIRST": "ีกีผีกีปีซีถีจ", "LISTS_GET_INDEX_LAST": "ีพีฅึ€ีปีซีถีจ", @@ -305,7 +314,7 @@ "PROCEDURES_BEFORE_PARAMS": "ีบีกึ€ีกีดีฅีฟึ€ีฅึ€ีซ ึีกีถีฏี", "PROCEDURES_CALL_BEFORE_PARAMS": "ีบีกึ€ีกีดีฅีฟึ€ีฅึ€ีซ ึีกีถีฏี", "PROCEDURES_DEFNORETURN_TOOLTIP": "ีีฟีฅีฒีฎีธึ‚ีด ีง ึ†ีธึ‚ีถีฏึีซีก, ีธึ€ีจ ีกึ€ีชีฅึ„ ีนีซ ีพีฅึ€ีกีคีกึ€ีฑีถีธึ‚ีด:", - "PROCEDURES_DEFNORETURN_COMMENT": "ี†ีฏีกึ€ีกีฃึ€ีซึ€ ีกีตีฝ ึ†ีธึ‚ีถีฏึีซีกีถ...", + "PROCEDURES_DEFNORETURN_COMMENT": "ี†ีฏีกึ€ีกีฃึ€ีฅึ„ ีกีตีฝ ีฃีธึ€ีฎีกีผีธึ‚ีตีฉีจ...", "PROCEDURES_DEFRETURN_RETURN": "ีพีฅึ€ีกีคีกึ€ีฑีถีฅีฌ", "PROCEDURES_DEFRETURN_TOOLTIP": "ีีฟีฅีฒีฎีธึ‚ีด ีง ึ†ีธึ‚ีถีฏึีซีก, ีธึ€ีจ ีพีฅึ€ีกีคีกึ€ีฑีถีธึ‚ีด ีง ีกึ€ีชีฅึ„:", "PROCEDURES_ALLOW_STATEMENTS": "ีฉีธึ‚ีตีฌีกีฟึ€ีฅีฌ ีกึ€ีฟีกีฐีกีตีฟีธึ‚ีฉีตีธึ‚ีถีถีฅึ€ีจ", @@ -321,6 +330,8 @@ "PROCEDURES_IFRETURN_TOOLTIP": "ิตีฉีฅ ีกึ€ีชีฅึ„ีจ ีณีทีดีกึ€ีซีฟ ีง, ีพีฅึ€ีกีคีกึ€ีฑีถีธึ‚ีด ีง ีฅึ€ีฏีธึ€ีค ีกึ€ีชีฅึ„ีจ:", "PROCEDURES_IFRETURN_WARNING": "ิถีฃีธึ‚ีทีกึีธึ‚ีด. ิฑีตีฝ ีขีฌีธีฏีจ ีฏีกึ€ีธีฒ ีง ึ…ีฃีฟีกีฃีธึ€ีฎีพีฅีฌ ีดีซีกีตีถ ึ†ีธึ‚ีถีฏึีซีกีตีซ ีฝีกีฐีดีกีถีดีกีถ ีถีฅึ€ีฝีธึ‚ีด:", "WORKSPACE_COMMENT_DEFAULT_TEXT": "ี„ีซ ีขีกีถ ีกีฝีก โ€คโ€คโ€ค", + "WORKSPACE_ARIA_LABEL": "Blockly ีกีทีญีกีฟีกีฟีกึ€ีกีฎึ„", + "COLLAPSED_WARNINGS_WARNING": "ิพีกีฌีพีกีฎ ีขีฌีธีฏีถีฅึ€ีจ ีฆีฃีธึ‚ีทีกึีธึ‚ีดีถีฅึ€ ีฅีถ ีบีกึ€ีธึ‚ีถีกีฏีธึ‚ีดึ‰", "DIALOG_OK": "ิผีกีพ", "DIALOG_CANCEL": "ี‰ีฅีฒีกึ€ีฏีฅีฌ" } diff --git a/msg/json/is.json b/msg/json/is.json index 1bdf6e1e6..13949d8f8 100644 --- a/msg/json/is.json +++ b/msg/json/is.json @@ -13,8 +13,8 @@ "UNNAMED_KEY": "รณnefnt", "TODAY": "ร dag", "DUPLICATE_BLOCK": "Afrita", - "ADD_COMMENT": "Skrifa skรฝringu", - "REMOVE_COMMENT": "Fjarlรฆgja skรฝringu", + "ADD_COMMENT": "Bรฆta viรฐ athugasemd", + "REMOVE_COMMENT": "Fjarlรฆgja athugasemd", "DUPLICATE_COMMENT": "Tvรญtaka athugasemd", "EXTERNAL_INPUTS": "Ytri inntรถk", "INLINE_INPUTS": "Innri inntรถk", @@ -26,7 +26,7 @@ "COLLAPSE_ALL": "Loka kubbum", "EXPAND_BLOCK": "Opna kubb", "EXPAND_ALL": "Opna kubba", - "DISABLE_BLOCK": "ร“virkja kubb", + "DISABLE_BLOCK": "Gera kubb รณvirkan", "ENABLE_BLOCK": "Virkja kubb", "HELP": "Hjรกlp", "UNDO": "Afturkalla", @@ -46,7 +46,7 @@ "CANNOT_DELETE_VARIABLE_PROCEDURE": "Get ekki eytt breytunni '%1' vegna รพess aรฐ hรบn er hluti af skilgreiningu fallsins '%2'", "DELETE_VARIABLE": "Eyรฐa '%1' breytunni", "COLOUR_PICKER_TOOLTIP": "Velja lit รบr litakorti.", - "COLOUR_RANDOM_TITLE": "einhver litur", + "COLOUR_RANDOM_TITLE": "tilviljunarkenndur litur", "COLOUR_RANDOM_TOOLTIP": "Velja einhvern lit af handahรณfi.", "COLOUR_RGB_TITLE": "litur", "COLOUR_RGB_RED": "rauรฐur", @@ -81,9 +81,9 @@ "CONTROLS_IF_MSG_IF": "ef", "CONTROLS_IF_MSG_ELSEIF": "annars ef", "CONTROLS_IF_MSG_ELSE": "annars", - "CONTROLS_IF_IF_TOOLTIP": "Bรฆta viรฐ, fjarlรฆgja eรฐa umraรฐa til aรฐ breyta skipan รพessa EF kubbs.", - "CONTROLS_IF_ELSEIF_TOOLTIP": "Bรฆta skilyrรฐi viรฐ EF kubbinn.", - "CONTROLS_IF_ELSE_TOOLTIP": "Bรฆta viรฐ hluta EF kubbs sem grรญpur รถll tilfelli sem uppfylla ekki hin skilyrรฐin.", + "CONTROLS_IF_IF_TOOLTIP": "Bรฆta viรฐ, fjarlรฆgja eรฐa umraรฐa til aรฐ breyta skipan รพessa 'ef'-kubbs.", + "CONTROLS_IF_ELSEIF_TOOLTIP": "Bรฆta skilyrรฐi viรฐ 'ef'-kubbinn.", + "CONTROLS_IF_ELSE_TOOLTIP": "Bรฆta viรฐ hluta 'ef'-kubbs sem grรญpur รถll tilfelli sem uppfylla ekki hin skilyrรฐin.", "LOGIC_COMPARE_TOOLTIP_EQ": "Skila sรถnnu ef inntรถkin eru jรถfn.", "LOGIC_COMPARE_TOOLTIP_NEQ": "Skila sรถnnu ef inntรถkin eru ekki jรถfn.", "LOGIC_COMPARE_TOOLTIP_LT": "Skila sรถnnu ef fyrra inntakiรฐ er minna en seinna inntakiรฐ.", @@ -106,6 +106,11 @@ "LOGIC_TERNARY_IF_FALSE": "ef รณsatt", "LOGIC_TERNARY_TOOLTIP": "Kanna skilyrรฐiรฐ รญ 'prรณfun'. Skilar 'ef satt' gildinu ef skilyrรฐiรฐ er satt, en skilar annars 'ef รณsatt' gildinu.", "MATH_NUMBER_TOOLTIP": "Tala.", + "MATH_ADDITION_SYMBOL": "+", + "MATH_SUBTRACTION_SYMBOL": "-", + "MATH_DIVISION_SYMBOL": "รท", + "MATH_MULTIPLICATION_SYMBOL": "ร—", + "MATH_POWER_SYMBOL": "^", "MATH_TRIG_SIN": "sin", "MATH_TRIG_COS": "cos", "MATH_TRIG_TAN": "tan", @@ -158,7 +163,7 @@ "MATH_ONLIST_OPERATOR_MEDIAN": "miรฐgildi lista", "MATH_ONLIST_TOOLTIP_MEDIAN": "Skila miรฐgildi listans.", "MATH_ONLIST_OPERATOR_MODE": "tรญรฐast รญ lista", - "MATH_ONLIST_TOOLTIP_MODE": "Skila lista yfir tรญรฐustu gildin รญ listanum.", + "MATH_ONLIST_TOOLTIP_MODE": "Skila lista yfir algengustu atriรฐin รญ listanum.", "MATH_ONLIST_OPERATOR_STD_DEV": "staรฐalfrรกvik lista", "MATH_ONLIST_TOOLTIP_STD_DEV": "Skila staรฐalfrรกviki lista.", "MATH_ONLIST_OPERATOR_RANDOM": "eitthvaรฐ รบr lista", @@ -172,6 +177,7 @@ "MATH_RANDOM_FLOAT_TITLE_RANDOM": "slembibrot", "MATH_RANDOM_FLOAT_TOOLTIP": "Skila broti sem er valiรฐ af handahรณfi รบr tรถlum รก bilinu frรก og meรฐ 0.0 til (en ekki meรฐ) 1.0.", "MATH_ATAN2_HELPURL": "https://en.wikipedia.org/wiki/Atan2 (EN)", + "MATH_ATAN2_TITLE": "atan2 af X:%1 Y:%2", "TEXT_TEXT_TOOLTIP": "Stafur, orรฐ eรฐa textalรญna.", "TEXT_JOIN_TITLE_CREATEWITH": "bรบa til texta meรฐ", "TEXT_JOIN_TOOLTIP": "Bรบa til texta meรฐ รพvรญ aรฐ tengja saman einhvern fjรถlda atriรฐa.", @@ -306,7 +312,7 @@ "PROCEDURES_DEFRETURN_RETURN": "skila", "PROCEDURES_DEFRETURN_TOOLTIP": "Bรฝr til fall sem skilar รบttaki.", "PROCEDURES_ALLOW_STATEMENTS": "leyfa setningar", - "PROCEDURES_DEF_DUPLICATE_WARNING": "Aรฐvรถrun: รžetta fall er meรฐ tvรญtekna stika.", + "PROCEDURES_DEF_DUPLICATE_WARNING": "Aรฐvรถrun: รžetta fall er meรฐ tvรญteknar breytur.", "PROCEDURES_CALLNORETURN_TOOLTIP": "Keyra heimatilbรบna falliรฐ '%1'.", "PROCEDURES_CALLRETURN_TOOLTIP": "Keyra heimatilbรบna falliรฐ '%1' og nota รบttak รพess.", "PROCEDURES_MUTATORCONTAINER_TITLE": "inntรถk", @@ -318,6 +324,8 @@ "PROCEDURES_IFRETURN_TOOLTIP": "Ef gildi er satt, skal skila รถรฐru gildi.", "PROCEDURES_IFRETURN_WARNING": "Aรฐvรถrun: รžennan kubb mรก aรฐeins nota รญ skilgreiningu falls.", "WORKSPACE_COMMENT_DEFAULT_TEXT": "Segรฐu eitthvaรฐ...", + "WORKSPACE_ARIA_LABEL": "Blockly-vinnusvรฆรฐiรฐ", + "COLLAPSED_WARNINGS_WARNING": "Samfallnir kubbar innihalda aรฐvaranir.", "DIALOG_OK": "ร lagi", "DIALOG_CANCEL": "Hรฆtta viรฐ" } diff --git a/msg/json/ja.json b/msg/json/ja.json index c57368ac8..4560bc130 100644 --- a/msg/json/ja.json +++ b/msg/json/ja.json @@ -15,6 +15,7 @@ "Suiato", "Sujiniku", "TAKAHASHI Shuuji", + "TaikonoHimazin", "Tokoroten", "ใ—ใƒ", "ใƒใ‚ค", @@ -45,7 +46,7 @@ "REDO": "ใ‚„ใ‚Š็›ดใ™", "CHANGE_VALUE_TITLE": "ๅ€คใ‚’ๅค‰ใˆใ‚‹๏ผš", "RENAME_VARIABLE": "ๅค‰ๆ•ฐใฎๅๅ‰ใ‚’ๅค‰ใˆใ‚‹โ€ฆ", - "RENAME_VARIABLE_TITLE": "้ธๆŠžใ—ใŸ%1ๅ€‹ใ™ในใฆใฎๅค‰ๆ•ฐใฎๅๅ‰ใ‚’ๅค‰ใˆใ‚‹๏ผš", + "RENAME_VARIABLE_TITLE": "ใ€Œ%1ใ€ใจใ„ใ†ๅๅ‰ใฎๅค‰ๆ•ฐๅใ‚’ใ™ในใฆๅค‰ใˆใ‚‹๏ผš", "NEW_VARIABLE": "ๅค‰ๆ•ฐใฎไฝœๆˆโ€ฆ", "NEW_STRING_VARIABLE": "ๆ–‡ๅญ—ๅˆ—ใฎๅค‰ๆ•ฐใ‚’ไฝœใ‚‹...", "NEW_NUMBER_VARIABLE": "ๆ•ฐใฎๅค‰ๆ•ฐใ‚’ไฝœใ‚‹...", diff --git a/msg/json/ko.json b/msg/json/ko.json index 9f8415ca2..7ac1a8aee 100644 --- a/msg/json/ko.json +++ b/msg/json/ko.json @@ -4,6 +4,7 @@ "Alex00728", "Amire80", "Codenstory", + "Delanoor", "Gongsoonyee", "Hym411", "JeonHK", @@ -78,10 +79,10 @@ "CONTROLS_WHILEUNTIL_HELPURL": "https://ko.wikipedia.org/wiki/While_%EB%A3%A8%ED%94%84", "CONTROLS_WHILEUNTIL_OPERATOR_WHILE": "๋™์•ˆ ๋ฐ˜๋ณต", "CONTROLS_WHILEUNTIL_OPERATOR_UNTIL": "๋‹ค์Œ๊นŒ์ง€ ๋ฐ˜๋ณต", - "CONTROLS_WHILEUNTIL_TOOLTIP_WHILE": "๊ฐ’์ด ์ฐธ์ผ ๋•Œ, ๋ช‡ ๊ฐ€์ง€ ์„ ์–ธ์„ ํ•ฉ๋‹ˆ๋‹ค.", - "CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL": "๊ฐ’์ด ๊ฑฐ์ง“์ผ ๋•Œ, ๋ช‡ ๊ฐ€์ง€ ์„ ์–ธ์„ ํ•ฉ๋‹ˆ๋‹ค.", + "CONTROLS_WHILEUNTIL_TOOLTIP_WHILE": "๊ฐ’์ด ์ฐธ์ผ ๋•Œ, ๋ช…๋ น๋“ค์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.", + "CONTROLS_WHILEUNTIL_TOOLTIP_UNTIL": "๊ฐ’์ด ๊ฑฐ์ง“์ธ ๋™์•ˆ ๋ช…๋ น๋ฌธ์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.", "CONTROLS_FOR_HELPURL": "https://ko.wikipedia.org/wiki/For_%EB%A3%A8%ED%94%84", - "CONTROLS_FOR_TOOLTIP": "๋ณ€์ˆ˜ \"%1\"์€ ์ง€์ •๋œ ๊ฐ„๊ฒฉ์œผ๋กœ ์‹œ์ž‘ ์ˆ˜์—์„œ ๋ ์ˆ˜๊นŒ์ง€๋ฅผ ์„ธ์–ด ์ง€์ •๋œ ๋ธ”๋ก์„ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.", + "CONTROLS_FOR_TOOLTIP": "๋ณ€์ˆ˜ '%1'์ด(๊ฐ€) ์ง€์ •๋œ ๊ฐ„๊ฒฉ์œผ๋กœ ์‹œ์ž‘ ๋ฒˆํ˜ธ์—์„œ ๋ ๋ฒˆํ˜ธ๊นŒ์ง€ ์„ธ๋Š” ๋™์‹œ์— ์ง€์ •๋œ ๋ธ”๋ก์„ ์‹คํ–‰ํ•˜๊ฒŒ ํ•˜์„ธ์š”.", "CONTROLS_FOR_TITLE": "์œผ๋กœ ๊ณ„์‚ฐ %1 %2์—์„œ %4์„ ์ด์šฉํ•˜์—ฌ %3๋กœ", "CONTROLS_FOREACH_HELPURL": "https://ko.wikipedia.org/wiki/For_%EB%A3%A8%ED%94%84#.EC.9E.84.EC.9D.98.EC.9D.98_.EC.A7.91.ED.95.A9", "CONTROLS_FOREACH_TITLE": "๊ฐ ํ•ญ๋ชฉ์— ๋Œ€ํ•ด %1 ๋ชฉ๋ก์œผ๋กœ %2", diff --git a/msg/json/nb.json b/msg/json/nb.json index 354b0a07e..53cb4d06b 100644 --- a/msg/json/nb.json +++ b/msg/json/nb.json @@ -9,6 +9,7 @@ ] }, "VARIABLES_DEFAULT_NAME": "element", + "UNNAMED_KEY": "navnlรธs", "TODAY": "I dag", "DUPLICATE_BLOCK": "duplikat", "ADD_COMMENT": "Legg til kommentar", diff --git a/msg/json/oc.json b/msg/json/oc.json index 2c6f6b508..0433d1d69 100644 --- a/msg/json/oc.json +++ b/msg/json/oc.json @@ -1,7 +1,8 @@ { "@metadata": { "authors": [ - "Cedric31" + "Cedric31", + "Unuaiga" ] }, "VARIABLES_DEFAULT_NAME": "element", @@ -9,6 +10,7 @@ "DUPLICATE_BLOCK": "Duplicar", "ADD_COMMENT": "Apondre un comentari", "REMOVE_COMMENT": "Suprimir un comentari", + "DUPLICATE_COMMENT": "Duplicar lo comentari", "EXTERNAL_INPUTS": "Entradas extรจrnas", "INLINE_INPUTS": "Entradas en linha", "DELETE_BLOCK": "Suprimir lo blรฒt", @@ -34,6 +36,7 @@ "NEW_VARIABLE_TYPE_TITLE": "Novรจl tipe de variabla :", "NEW_VARIABLE_TITLE": "Nom de la novรจla variabla :", "VARIABLE_ALREADY_EXISTS": "Existรญs ja una variabla nomenada \"%1\".", + "VARIABLE_ALREADY_EXISTS_FOR_ANOTHER_TYPE": "Una variabla nommada '%1' existรญs ja per un autre tipe ; '%2'.", "DELETE_VARIABLE": "Suprimir la variabla '%1'", "COLOUR_PICKER_HELPURL": "https://oc.wikipedia.org/wiki/Color", "COLOUR_PICKER_TOOLTIP": "Causir una color dins la paleta.", diff --git a/msg/json/smn.json b/msg/json/smn.json index ec88e16ca..f455c7771 100644 --- a/msg/json/smn.json +++ b/msg/json/smn.json @@ -1,7 +1,8 @@ { "@metadata": { "authors": [ - "Seipinne" + "Seipinne", + "Yupik" ] }, "VARIABLES_DEFAULT_NAME": "tiล‹gรข", @@ -13,6 +14,16 @@ "DUPLICATE_COMMENT": "Dublikist komment", "EXTERNAL_INPUTS": "Olgoldรขs fรกluseh", "INLINE_INPUTS": "Pyevti fรกlusijd", + "DELETE_BLOCK": "Siho loigรขttuv", + "DELETE_X_BLOCKS": "Siho %1 loigรขttuv", + "DELETE_ALL_BLOCKS": "Siho puoh %1 loigรขttuv?", + "CLEAN_UP": "ฤŒurgii loigรขttuvรขid", + "COLLAPSE_BLOCK": "Toopรข loigรขttuv", + "COLLAPSE_ALL": "Toopรข loigรขttuvรขid", + "EXPAND_BLOCK": "Viijฤ‘ed loigรขttuv", + "EXPAND_ALL": "Viijฤ‘ed loigรขttuvรขid", + "DISABLE_BLOCK": "ฤŒaskรขd loigรขttuv", + "ENABLE_BLOCK": "Piejรข oolรข loigรขttuv", "HELP": "Iลกe", "UNDO": "Koomeet", "REDO": "Rรครคhti uฤ‘ฤ‘รขsist", @@ -51,6 +62,7 @@ "CONTROLS_IF_MSG_IF": "jis", "CONTROLS_IF_MSG_ELSEIF": "mudoi jis", "CONTROLS_IF_MSG_ELSE": "mudoi", + "CONTROLS_IF_ELSEIF_TOOLTIP": "Lasseet iรคvtu \"jis\"-loigรขttรขhรขn.", "LOGIC_OPERATION_AND": "jรก", "LOGIC_OPERATION_OR": "teikkรข", "LOGIC_NEGATE_TITLE": "ij %1", @@ -61,6 +73,12 @@ "LOGIC_TERNARY_IF_TRUE": "jis tuotรข", "LOGIC_TERNARY_IF_FALSE": "jis epituotรข", "MATH_NUMBER_TOOLTIP": "Loho.", + "MATH_TRIG_SIN": "sin", + "MATH_TRIG_COS": "cos", + "MATH_TRIG_TAN": "tan", + "MATH_TRIG_ASIN": "asin", + "MATH_TRIG_ACOS": "acos", + "MATH_TRIG_ATAN": "atan", "MATH_SINGLE_OP_ROOT": "neljihรขลกruotรขs", "MATH_SINGLE_OP_ABSOLUTE": "jieลกรกrvu", "MATH_IS_EVEN": "lii parรขlรขลก", @@ -88,12 +106,18 @@ "MATH_ONLIST_OPERATOR_MEDIAN": "mediaan lovoin", "MATH_ONLIST_TOOLTIP_MEDIAN": "Maaccรขt adelum lovoi mediaan.", "TEXT_CREATE_JOIN_TITLE_JOIN": "labde", + "TEXT_PRINT_TITLE": "printtii %1", + "LISTS_CREATE_EMPTY_TITLE": "rรครคhti kuรกrus listo", + "LISTS_CREATE_WITH_INPUT_WITH": "rรครคhti listo", "LISTS_CREATE_WITH_CONTAINER_TITLE_ADD": "listo", + "LISTS_LENGTH_TITLE": "%1 kukkodรขh", + "LISTS_ISEMPTY_TITLE": "%1 lii kuรกrus", "LISTS_INLIST": "listoost", "LISTS_GET_INDEX_REMOVE": "siho", "LISTS_GET_INDEX_FIRST": "vuosmuลก", "LISTS_GET_INDEX_LAST": "majemuลก", "LISTS_GET_INDEX_RANDOM": "sรคtinรกlรกsรขลก", + "LISTS_SORT_TITLE": "ลกlajรขttรขl %1 %2 %3", "PROCEDURES_DEFNORETURN_PROCEDURE": "poorgรข maidnii", "PROCEDURES_BEFORE_PARAMS": "parameettereh:", "PROCEDURES_CALL_BEFORE_PARAMS": "parameettereh:", @@ -102,6 +126,7 @@ "PROCEDURES_DEFRETURN_RETURN": "maaccรขt", "PROCEDURES_MUTATORCONTAINER_TITLE": "fรกluseh", "PROCEDURES_MUTATORARG_TITLE": "fรกรกlus nommรข:", + "PROCEDURES_CREATE_DO": "Rรครคhti '%1'", "WORKSPACE_COMMENT_DEFAULT_TEXT": "Eeฤ‘รข maidnii...", "DIALOG_OK": "OK", "DIALOG_CANCEL": "Jooskรข" diff --git a/msg/json/zh-hant.json b/msg/json/zh-hant.json index b3dfbadab..2c5326e19 100644 --- a/msg/json/zh-hant.json +++ b/msg/json/zh-hant.json @@ -14,6 +14,7 @@ "Wehwei", "ๅˆ—็ปดๅŠณๅพท", "ๅ’Œๅนณ่‡ณไธŠ", + "ๆ็ฒต่€…", "ๆฒˆๆพ„ๅฟƒ" ] }, @@ -112,13 +113,13 @@ "LOGIC_BOOLEAN_TOOLTIP": "่ฟ”ๅ›ž็œŸๆˆ–ๅ‡ใ€‚", "LOGIC_NULL": "็ฉบ", "LOGIC_NULL_TOOLTIP": "่ฟ”ๅ›ž็ฉบๅ€ผใ€‚", - "LOGIC_TERNARY_HELPURL": "https://zh.wikipedia.org/wiki/ๆขไปถ้‹็ฎ—็ฌฆ", + "LOGIC_TERNARY_HELPURL": "https://en.wikipedia.org/wiki/%3F:", "LOGIC_TERNARY_CONDITION": "ๆธฌ่ฉฆ", "LOGIC_TERNARY_IF_TRUE": "ๅฆ‚ๆžœ็‚บ็œŸ", "LOGIC_TERNARY_IF_FALSE": "ๅฆ‚ๆžœ็‚บๅ‡", "LOGIC_TERNARY_TOOLTIP": "ๆชขๆŸฅใ€Œๆธฌ่ฉฆใ€ไธญ็š„ๆขไปถใ€‚ๅฆ‚ๆžœๆขไปถ็‚บ็œŸ๏ผŒๅฐ‡่ฟ”ๅ›žใ€Œๅฆ‚ๆžœ็‚บ็œŸใ€็š„ๅ€ผ๏ผ›ๅฆๅ‰‡๏ผŒ่ฟ”ๅ›žใ€Œๅฆ‚ๆžœ็‚บๅ‡ใ€็š„ๅ€ผใ€‚", "MATH_NUMBER_HELPURL": "https://zh.wikipedia.org/wiki/ๆ•ธ", - "MATH_NUMBER_TOOLTIP": "ไธ€ๅ€‹ๆ•ธๅญ—ใ€‚", + "MATH_NUMBER_TOOLTIP": "ๆ•ธๅญ—", "MATH_TRIG_SIN": "ๆญฃๅผฆ", "MATH_TRIG_COS": "้ค˜ๅผฆ", "MATH_TRIG_TAN": "ๆญฃๅˆ‡", @@ -127,9 +128,9 @@ "MATH_TRIG_ATAN": "ๅๆญฃๅˆ‡", "MATH_ARITHMETIC_HELPURL": "https://zh.wikipedia.org/wiki/็ฎ—่ก“", "MATH_ARITHMETIC_TOOLTIP_ADD": "่ฟ”ๅ›žๅ…ฉๅ€‹ๆ•ธๅญ—็š„็ธฝๅ’Œใ€‚", - "MATH_ARITHMETIC_TOOLTIP_MINUS": "่ฟ”ๅ›žๅ…ฉๅ€‹ๆ•ธๅญ—็š„ๅทฎใ€‚", + "MATH_ARITHMETIC_TOOLTIP_MINUS": "ๅ‚ณๅ›žๅ…ฉๆ•ธไน‹ๅทฎใ€‚", "MATH_ARITHMETIC_TOOLTIP_MULTIPLY": "่ฟ”ๅ›žๅ…ฉๅ€‹ๆ•ธๅญ—็š„ไน˜็ฉใ€‚", - "MATH_ARITHMETIC_TOOLTIP_DIVIDE": "่ฟ”ๅ›žๅ…ฉๅ€‹ๆ•ธๅญ—็š„ๅ•†ใ€‚", + "MATH_ARITHMETIC_TOOLTIP_DIVIDE": "ๅ‚ณๅ›žๅ…ฉๆ•ธไน‹ๅ•†ใ€‚", "MATH_ARITHMETIC_TOOLTIP_POWER": "่ฟ”ๅ›ž็ฌฌไบŒๅ€‹ๆ•ธๅญ—็š„ๆŒ‡ๆ•ธ็š„็ฌฌไธ€ๅ€‹ๆ•ธๅญ—ใ€‚", "MATH_SINGLE_HELPURL": "https://zh.wikipedia.org/wiki/ๅนณๆ–นๆ น", "MATH_SINGLE_OP_ROOT": "้–‹ๆ น่™Ÿ", @@ -197,7 +198,7 @@ "MATH_ATAN2_TITLE": "X:%1 Y:%2 ็š„ Atan2", "MATH_ATAN2_TOOLTIP": "ๅ›žๅ‚ณ้ปž๏ผˆX๏ผŒY๏ผ‰ๅพž -180 ่‡ณ 180 ๅบฆ็š„ๅๆญฃๅˆ‡ๅ€ผใ€‚", "TEXT_TEXT_HELPURL": "https://zh.wikipedia.org/wiki/ๅญ—ไธฒ", - "TEXT_TEXT_TOOLTIP": "ไธ€ๅ€‹ๅญ—ๅ…ƒใ€ไธ€ๅ€‹ๅ–ฎ่ฉž๏ผŒๆˆ–ไธ€ไธฒๆ–‡ๅญ—ใ€‚", + "TEXT_TEXT_TOOLTIP": "ไธ€็ฒ’ๅญ—ๅ…ƒใ€ไธ€ๅ€‹ๅญ—่ฉžๆˆ–ไธ€่กŒๅญ—", "TEXT_JOIN_TITLE_CREATEWITH": "ๅญ—ไธฒ็ต„ๅˆ", "TEXT_JOIN_TOOLTIP": "้€š้Ž้€ฃๆŽฅไปปๆ„ๆ•ธ้‡็š„้ …็›ฎไพ†ๅปบ็ซ‹ไธ€ไธฒๆ–‡ๅญ—ใ€‚", "TEXT_CREATE_JOIN_TITLE_JOIN": "ๅŠ ๅ…ฅ", @@ -215,8 +216,8 @@ "TEXT_INDEXOF_OPERATOR_LAST": "ๅพž ๆœ€ๅพŒ้ข ็ดขๅผ•ๅญ—ไธฒ", "TEXT_CHARAT_TITLE": "ๅœจๆ–‡ๅญ— %1 %2", "TEXT_CHARAT_FROM_START": "ๅ–ๅพ— ๅญ—ๅ…ƒ #", - "TEXT_CHARAT_FROM_END": "ๅ–ๅพ— ๅ€’ๆ•ธ็ฌฌ # ๅ€‹ๅญ—ๅ…ƒ", - "TEXT_CHARAT_FIRST": "ๅ–ๅพ— ็ฌฌไธ€ๅ€‹ๅญ—ๅ…ƒ", + "TEXT_CHARAT_FROM_END": "ๅ–ๅพ—ๅ€’ๆ•ธ็ฌฌ#ๅญ—ๅ…ƒ", + "TEXT_CHARAT_FIRST": "ๆ“ทๅ–้ฆ–ๅญ—ๅ…ƒ", "TEXT_CHARAT_LAST": "ๅ–ๅพ— ๆœ€ๅพŒไธ€ๅ€‹ๅญ—ๅ…ƒ", "TEXT_CHARAT_RANDOM": "ๅ–ๅพ— ไปปๆ„ๅญ—ๅ…ƒ", "TEXT_CHARAT_TOOLTIP": "่ฟ”ๅ›žไฝๆ–ผๆŒ‡ๅฎšไฝ็ฝฎ็š„ๅญ—ๅ…ƒใ€‚", @@ -224,10 +225,10 @@ "TEXT_GET_SUBSTRING_INPUT_IN_TEXT": "ๅœจๅญ—ไธฒ", "TEXT_GET_SUBSTRING_START_FROM_START": "ๅ–ๅพ— ๅญ—ๅ…ƒ #", "TEXT_GET_SUBSTRING_START_FROM_END": "ๅ–ๅพ— ๅ€’ๆ•ธ็ฌฌ # ๅ€‹ๅญ—ๅ…ƒ", - "TEXT_GET_SUBSTRING_START_FIRST": "ๅ–ๅพ— ็ฌฌไธ€ๅ€‹ๅญ—ๅ…ƒ", + "TEXT_GET_SUBSTRING_START_FIRST": "ๅ–ๅพ—้ฆ–ๅญ—ๅ…ƒ", "TEXT_GET_SUBSTRING_END_FROM_START": "ๅˆฐ ๅญ—ๅ…ƒ #", - "TEXT_GET_SUBSTRING_END_FROM_END": "ๅˆฐ ๅ€’ๆ•ธ็ฌฌ # ๅ€‹ๅญ—ๅ…ƒ", - "TEXT_GET_SUBSTRING_END_LAST": "ๅˆฐๆœ€ๅพŒไธ€ๅ€‹ๅญ—ๅ…ƒ", + "TEXT_GET_SUBSTRING_END_FROM_END": "ๅˆฐๅ€’ๆ•ธ็ฌฌ#ๅญ—ๅ…ƒ", + "TEXT_GET_SUBSTRING_END_LAST": "ๅˆฐๅฐพๅ€‹ๅญ—ๅ…ƒ", "TEXT_CHANGECASE_TOOLTIP": "ไฝฟ็”จไธๅŒ็š„ๅคงๅฐๅฏซ่ค‡่ฃฝ้€™ๆฎตๆ–‡ๅญ—ใ€‚", "TEXT_CHANGECASE_OPERATOR_UPPERCASE": "่ฝ‰ๆˆ่‹ฑๆ–‡ๅคงๅฏซ", "TEXT_CHANGECASE_OPERATOR_LOWERCASE": "่ฝ‰ๆˆ่‹ฑๆ–‡ๅฐๅฏซ", diff --git a/package-lock.json b/package-lock.json index 9e9520800..cf1184897 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,17 +10,18 @@ "hasInstallScript": true, "license": "Apache-2.0", "dependencies": { - "jsdom": "15.2.1" + "jsdom": "20.0.3" }, "devDependencies": { "@blockly/block-test": "^3.0.0", "@blockly/dev-tools": "^5.0.0", "@blockly/theme-modern": "^3.0.0", - "@hyperjump/json-schema": "^0.18.5", + "@hyperjump/json-schema": "^0.23.3", "@microsoft/api-documenter": "^7.19.16", "@microsoft/api-extractor": "^7.29.5", "@typescript-eslint/eslint-plugin": "^5.33.1", - "@wdio/selenium-standalone-service": "^7.10.1", + "@wdio/selenium-standalone-service": "^8.0.2", + "async-done": "^2.0.0", "chai": "^4.2.0", "clang-format": "^1.6.0", "closure-calculate-chunks": "^3.0.2", @@ -29,7 +30,7 @@ "eslint-config-google": "^0.14.0", "eslint-plugin-jsdoc": "^39.3.6", "google-closure-compiler": "^20221004.0.0", - "google-closure-deps": "^20221004.0.0", + "google-closure-deps": "^20221102.0.0", "gulp": "^4.0.2", "gulp-clang-format": "^1.0.27", "gulp-concat": "^2.6.1", @@ -53,7 +54,7 @@ "selenium-standalone": "^8.0.3", "through2": "^4.0.2", "typescript": "^4.3.2", - "webdriverio": "^7.0.3", + "webdriverio": "^8.0.5", "yargs": "^17.2.1" } }, @@ -176,16 +177,16 @@ } }, "node_modules/@blockly/dev-tools": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@blockly/dev-tools/-/dev-tools-5.0.0.tgz", - "integrity": "sha512-9GSH+Y8aU+KLcu3sFKkqr/sIz4RWDjmkzKgDI0ryiZiihR8LKIi/gxREc04ZnnLWZWMlXo/RyMoLNWyM7YW36g==", + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/@blockly/dev-tools/-/dev-tools-5.0.2.tgz", + "integrity": "sha512-3h9nbpbrz8+YCbQlkpIJh1YXmlSmslxzibdPvc6VcgzXA+xzAc2a00Wy5f+ugQRq2394J8Cn/cKXqUKDLjykRA==", "dev": true, "dependencies": { - "@blockly/block-test": "^3.0.0", - "@blockly/theme-dark": "^4.0.0", - "@blockly/theme-deuteranopia": "^3.0.0", - "@blockly/theme-highcontrast": "^3.0.0", - "@blockly/theme-tritanopia": "^3.0.0", + "@blockly/block-test": "^3.0.1", + "@blockly/theme-dark": "^4.0.1", + "@blockly/theme-deuteranopia": "^3.0.1", + "@blockly/theme-highcontrast": "^3.0.1", + "@blockly/theme-tritanopia": "^3.0.2", "chai": "^4.2.0", "dat.gui": "^0.7.7", "lodash.assign": "^4.2.0", @@ -201,9 +202,9 @@ } }, "node_modules/@blockly/theme-dark": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@blockly/theme-dark/-/theme-dark-4.0.0.tgz", - "integrity": "sha512-JCah9PULu/K4E8485CzvWTpWMDB8zAsqKxLtAGu106eSUKgaOrB6WR3nzoA10nmoUcZdh/fk/UPcHUB/XsHkhg==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@blockly/theme-dark/-/theme-dark-4.0.1.tgz", + "integrity": "sha512-OIfdnt3kvPnEW/TmfLPUftcekwoQGmxg/12LajYUdW9aOLMQaen16Vw0+BB8Q8zKInpxT6JCBYECilYRLY+RpA==", "dev": true, "engines": { "node": ">=8.17.0" @@ -213,9 +214,9 @@ } }, "node_modules/@blockly/theme-deuteranopia": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@blockly/theme-deuteranopia/-/theme-deuteranopia-3.0.0.tgz", - "integrity": "sha512-1m8aEZw4tA7LwKWXyIU5IU1pO2iDgrJGYTHn3/N5+GPRIQzuHqxGM62QcP3wTMYPqj8TX1Rs3xR0OPVZW2CgGw==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@blockly/theme-deuteranopia/-/theme-deuteranopia-3.0.1.tgz", + "integrity": "sha512-3zmkD3ERGAuKQjAeFFoNNAhfwmxFncXd3Mw5tHn64MlxguMJCKt7C4Siu6gRXGYpvukkpMUlbgklWyNz2okHng==", "dev": true, "engines": { "node": ">=8.17.0" @@ -225,9 +226,9 @@ } }, "node_modules/@blockly/theme-highcontrast": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@blockly/theme-highcontrast/-/theme-highcontrast-3.0.0.tgz", - "integrity": "sha512-4egNcV/Dl2pDcWBdS1199HUAI/hrlwAjwq7B2cf52A0O2ek/qfdrHxB2jm+6ez+giQFvrnFVjvCL9DptuKfNIg==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@blockly/theme-highcontrast/-/theme-highcontrast-3.0.1.tgz", + "integrity": "sha512-HuEHKq7n2zTV1gb19SGjyKlCYjZeZSITWPIQeD5wfEVleOOy8z6zjLRZ9D7QoiL4ooFefWkx1kauVsWbaTqN5g==", "dev": true, "engines": { "node": ">=8.17.0" @@ -249,9 +250,9 @@ } }, "node_modules/@blockly/theme-tritanopia": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@blockly/theme-tritanopia/-/theme-tritanopia-3.0.0.tgz", - "integrity": "sha512-kwV01Wt57ktzqcu3yWb7FPHsXd0ZLz6ApvX0AWCuNJ+64+AxezBG+WOigD0/JzyIz7U6VFjHsecX+MIKmxaPgw==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@blockly/theme-tritanopia/-/theme-tritanopia-3.0.2.tgz", + "integrity": "sha512-soKspGnVLk+EVuWm8HfRSmZoK5NoThpgIS9uvctSNUaEB3Ritvf/feuqu4AFBEjwAUUgkY1SfW70200ZIXRY8g==", "dev": true, "engines": { "node": ">=8.17.0" @@ -261,9 +262,9 @@ } }, "node_modules/@es-joy/jsdoccomment": { - "version": "0.31.0", - "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.31.0.tgz", - "integrity": "sha512-tc1/iuQcnaiSIUVad72PBierDFpsxdUHtEF/OrfqvM1CBAsIoMP51j52jTMb3dXriwhieTo289InzZj72jL3EQ==", + "version": "0.36.1", + "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.36.1.tgz", + "integrity": "sha512-922xqFsTpHs6D0BUiG4toiyPOMc8/jafnWKxz1KWgS4XzKPy2qXf1Pe6UFuNSCQqt6tOuhAWXBNuuyUhJmw9Vg==", "dev": true, "dependencies": { "comment-parser": "1.3.1", @@ -271,7 +272,7 @@ "jsdoc-type-pratt-parser": "~3.1.0" }, "engines": { - "node": "^14 || ^16 || ^17 || ^18" + "node": "^14 || ^16 || ^17 || ^18 || ^19" } }, "node_modules/@eslint/eslintrc": { @@ -297,18 +298,6 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/@eslint/eslintrc/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, "node_modules/@gulp-sourcemaps/identity-map": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/@gulp-sourcemaps/identity-map/-/identity-map-2.0.1.tgz", @@ -392,14 +381,14 @@ } }, "node_modules/@humanwhocodes/config-array": { - "version": "0.10.5", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.10.5.tgz", - "integrity": "sha512-XVVDtp+dVvRxMoxSiSfasYaG02VEe1qH5cKgMQJWhol6HwzbcqoCMJi8dAGoYAO57jhUyhI6cWuRiTcRaDaYug==", + "version": "0.11.7", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.7.tgz", + "integrity": "sha512-kBbPWzN8oVMLb0hOUYXhmxggL/1cJE6ydvjDIGi9EnAGUyA7cLVKQg+d/Dsm+KZwx2czGHrCmMVLiyg8s5JPKw==", "dev": true, "dependencies": { "@humanwhocodes/object-schema": "^1.2.1", "debug": "^4.1.1", - "minimatch": "^3.0.4" + "minimatch": "^3.0.5" }, "engines": { "node": ">=10.10.0" @@ -424,6 +413,20 @@ "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", "dev": true }, + "node_modules/@hyperjump/json": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@hyperjump/json/-/json-0.1.0.tgz", + "integrity": "sha512-jWsAOHjweWhi0UEBCN57YZzyTt76Z6Fm/OJXOfNBJbEZt569AcTRsjv6Dqj5t4gQhW9td72oquiyaVp9oHbhBQ==", + "dev": true, + "dependencies": { + "@hyperjump/json-pointer": "^0.9.2", + "moo": "^0.5.1" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/jdesrosiers" + } + }, "node_modules/@hyperjump/json-pointer": { "version": "0.9.6", "resolved": "https://registry.npmjs.org/@hyperjump/json-pointer/-/json-pointer-0.9.6.tgz", @@ -439,13 +442,13 @@ } }, "node_modules/@hyperjump/json-schema": { - "version": "0.18.5", - "resolved": "https://registry.npmjs.org/@hyperjump/json-schema/-/json-schema-0.18.5.tgz", - "integrity": "sha512-O4+E8BqwzkhPm6BEkswaExIqtrtznpVQjyllA3Q3rB0VQZ4YWW7L5AtaqIiL0XtxpnuCiPKqb73BBGdyycLL6g==", + "version": "0.23.3", + "resolved": "https://registry.npmjs.org/@hyperjump/json-schema/-/json-schema-0.23.3.tgz", + "integrity": "sha512-3YqAQpYY1U16SeP+LfMzBySqW5FHF9gZcOMKeeRywJkowsZ1JuOOiYCmYXptlRwXSB1jVa9ITC0lvfO84OaSQQ==", "dev": true, "hasInstallScript": true, "dependencies": { - "@hyperjump/json-schema-core": "^0.23.4", + "@hyperjump/json-schema-core": "^0.28.0", "fastest-stable-stringify": "^2.0.2" }, "funding": { @@ -454,18 +457,19 @@ } }, "node_modules/@hyperjump/json-schema-core": { - "version": "0.23.7", - "resolved": "https://registry.npmjs.org/@hyperjump/json-schema-core/-/json-schema-core-0.23.7.tgz", - "integrity": "sha512-64gBteTl+zAvI1D68l/+gH7ncuM+Cf0rGdm/YwtsYZlNfbybgFD5R5uuJCsPGJDm5ZYqqWMdPIq6Nh5jDENYRw==", + "version": "0.28.5", + "resolved": "https://registry.npmjs.org/@hyperjump/json-schema-core/-/json-schema-core-0.28.5.tgz", + "integrity": "sha512-+f5P3oHYCQru3s+Ha+E10rIyEvyK0Hfa2oj3+cDoGaVMbT4Jg5TgCoIM7B5rl3t3KRA7EOmrLjKFGeLi5yd1pg==", "dev": true, "hasInstallScript": true, "dependencies": { - "@hyperjump/json-pointer": "^0.9.1", - "@hyperjump/pact": "^0.2.0", + "@hyperjump/json": "^0.1.0", + "@hyperjump/json-pointer": "^0.9.4", + "@hyperjump/pact": "^0.2.3", "content-type": "^1.0.4", "node-fetch": "^2.6.5", - "pubsub-js": "^1.9.1", - "url-resolve-browser": "^1.2.0" + "pubsub-js": "^1.9.4", + "uri-js": "^4.4.1" }, "funding": { "type": "github", @@ -492,10 +496,54 @@ "integrity": "sha512-Q8206k8pTY7krW32cdmPsP+DqqLgWx/hYPSj9/+7SYqSqz7UuwPbfSe07lQtvuuaVyiSJveXk0E5RydOuWwsEg==", "dev": true }, + "node_modules/@jest/expect-utils": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.3.1.tgz", + "integrity": "sha512-wlrznINZI5sMjwvUoLVk617ll/UYfGIZNxmbU+Pa7wmkL4vYzhV9R2pwVqUh4NWWuLQWkI8+8mOkxs//prKQ3g==", + "dev": true, + "optional": true, + "dependencies": { + "jest-get-type": "^29.2.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/schemas": { + "version": "29.0.0", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.0.0.tgz", + "integrity": "sha512-3Ab5HgYIIAnS0HjqJHQYZS+zXc4tUmTmBH3z83ajI6afXp8X3ZtdLX+nXx+I7LNkJD7uN9LAVhgnjDgZa2z0kA==", + "dev": true, + "optional": true, + "dependencies": { + "@sinclair/typebox": "^0.24.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/types": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.3.1.tgz", + "integrity": "sha512-d0S0jmmTpjnhCmNpApgX3jrUZgZ22ivKJRvL2lli5hpCRoNnp1f85r2/wpKfXuYu8E7Jjh1hGfhPyup1NM5AmA==", + "dev": true, + "optional": true, + "dependencies": { + "@jest/schemas": "^29.0.0", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, "node_modules/@microsoft/api-documenter": { - "version": "7.19.24", - "resolved": "https://registry.npmjs.org/@microsoft/api-documenter/-/api-documenter-7.19.24.tgz", - "integrity": "sha512-XSjN07jsBusRDEqazbadGp6e0hds7GZGjdNGWmaQop32f7BxNv81NqE3H/OLONCZSklm/0fzJy8g14xZmByFtQ==", + "version": "7.19.25", + "resolved": "https://registry.npmjs.org/@microsoft/api-documenter/-/api-documenter-7.19.25.tgz", + "integrity": "sha512-/yC6cG7QpjkDqHvoXt5SJJdB0Mdj0oYpaWgxdOV8uHRniZ9kZwxAEResswdS6QDCYoyqDD6jlh008HwXIcmXjA==", "dev": true, "dependencies": { "@microsoft/api-extractor-model": "7.25.2", @@ -510,35 +558,6 @@ "api-documenter": "bin/api-documenter" } }, - "node_modules/@microsoft/api-documenter/node_modules/@microsoft/api-extractor-model": { - "version": "7.25.2", - "resolved": "https://registry.npmjs.org/@microsoft/api-extractor-model/-/api-extractor-model-7.25.2.tgz", - "integrity": "sha512-+h1uCrLQXFAKMUdghhdDcnniDB+6UA/lS9ArlB4QZQ34UbLuXNy2oQ6fafFK8cKXU4mUPTF/yGRjv7JKD5L7eg==", - "dev": true, - "dependencies": { - "@microsoft/tsdoc": "0.14.2", - "@microsoft/tsdoc-config": "~0.16.1", - "@rushstack/node-core-library": "3.53.2" - } - }, - "node_modules/@microsoft/api-documenter/node_modules/@microsoft/tsdoc": { - "version": "0.14.2", - "resolved": "https://registry.npmjs.org/@microsoft/tsdoc/-/tsdoc-0.14.2.tgz", - "integrity": "sha512-9b8mPpKrfeGRuhFH5iO1iwCLeIIsV6+H1sRfxbkoGXIyQE2BTsPd9zqSqQJ+pv5sJ/hT5M1zvOFL02MnEezFug==", - "dev": true - }, - "node_modules/@microsoft/api-documenter/node_modules/@rushstack/ts-command-line": { - "version": "4.13.1", - "resolved": "https://registry.npmjs.org/@rushstack/ts-command-line/-/ts-command-line-4.13.1.tgz", - "integrity": "sha512-UTQMRyy/jH1IS2U+6pyzyn9xQ2iMcoUKkTcZUzOP/aaMiKlWLwCTDiBVwhw/M1crDx6apF9CwyjuWO9r1SBdJQ==", - "dev": true, - "dependencies": { - "@types/argparse": "1.0.38", - "argparse": "~1.0.9", - "colors": "~1.2.1", - "string-argv": "~0.3.1" - } - }, "node_modules/@microsoft/api-documenter/node_modules/argparse": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", @@ -574,17 +593,17 @@ } }, "node_modules/@microsoft/api-extractor": { - "version": "7.33.4", - "resolved": "https://registry.npmjs.org/@microsoft/api-extractor/-/api-extractor-7.33.4.tgz", - "integrity": "sha512-uZG4CHxVcQNpXBC77GwHaKFwGI9vAnzORY4fFN5JuTnQQDKS0vi4BazP4pmYYwbb8IdH4ocQSwOA3j9Ul/sWmg==", + "version": "7.33.7", + "resolved": "https://registry.npmjs.org/@microsoft/api-extractor/-/api-extractor-7.33.7.tgz", + "integrity": "sha512-fQT2v/j/55DhvMFiopLtth66E7xTFNhnumMKgKY14SaG6qU/V1W0e4nOAgbA+SmLakQjAd1Evu06ofaVaxBPbA==", "dev": true, "dependencies": { - "@microsoft/api-extractor-model": "7.25.1", - "@microsoft/tsdoc": "0.14.1", + "@microsoft/api-extractor-model": "7.25.3", + "@microsoft/tsdoc": "0.14.2", "@microsoft/tsdoc-config": "~0.16.1", - "@rushstack/node-core-library": "3.53.2", + "@rushstack/node-core-library": "3.53.3", "@rushstack/rig-package": "0.3.17", - "@rushstack/ts-command-line": "4.13.0", + "@rushstack/ts-command-line": "4.13.1", "colors": "~1.2.1", "lodash": "~4.17.15", "resolve": "~1.17.0", @@ -597,16 +616,72 @@ } }, "node_modules/@microsoft/api-extractor-model": { - "version": "7.25.1", - "resolved": "https://registry.npmjs.org/@microsoft/api-extractor-model/-/api-extractor-model-7.25.1.tgz", - "integrity": "sha512-AaZ0ohCGLRjWiZviM+0p/DaxgMhbawS183LW2+CSqyEBh6wZks7NjoyhzhibAYapS4omnrmv96+0V/2wBvnIZQ==", + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@microsoft/api-extractor-model/-/api-extractor-model-7.25.2.tgz", + "integrity": "sha512-+h1uCrLQXFAKMUdghhdDcnniDB+6UA/lS9ArlB4QZQ34UbLuXNy2oQ6fafFK8cKXU4mUPTF/yGRjv7JKD5L7eg==", "dev": true, "dependencies": { - "@microsoft/tsdoc": "0.14.1", + "@microsoft/tsdoc": "0.14.2", "@microsoft/tsdoc-config": "~0.16.1", "@rushstack/node-core-library": "3.53.2" } }, + "node_modules/@microsoft/api-extractor/node_modules/@microsoft/api-extractor-model": { + "version": "7.25.3", + "resolved": "https://registry.npmjs.org/@microsoft/api-extractor-model/-/api-extractor-model-7.25.3.tgz", + "integrity": "sha512-WWxBUq77p2iZ+5VF7Nmrm3y/UtqCh5bYV8ii3khwq3w99+fXWpvfsAhgSLsC7k8XDQc6De4ssMxH6He/qe1pzg==", + "dev": true, + "dependencies": { + "@microsoft/tsdoc": "0.14.2", + "@microsoft/tsdoc-config": "~0.16.1", + "@rushstack/node-core-library": "3.53.3" + } + }, + "node_modules/@microsoft/api-extractor/node_modules/@rushstack/node-core-library": { + "version": "3.53.3", + "resolved": "https://registry.npmjs.org/@rushstack/node-core-library/-/node-core-library-3.53.3.tgz", + "integrity": "sha512-H0+T5koi5MFhJUd5ND3dI3bwLhvlABetARl78L3lWftJVQEPyzcgTStvTTRiIM5mCltyTM8VYm6BuCtNUuxD0Q==", + "dev": true, + "dependencies": { + "@types/node": "12.20.24", + "colors": "~1.2.1", + "fs-extra": "~7.0.1", + "import-lazy": "~4.0.0", + "jju": "~1.4.0", + "resolve": "~1.17.0", + "semver": "~7.3.0", + "z-schema": "~5.0.2" + } + }, + "node_modules/@microsoft/api-extractor/node_modules/@types/node": { + "version": "12.20.24", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.24.tgz", + "integrity": "sha512-yxDeaQIAJlMav7fH5AQqPH1u8YIuhYJXYBzxaQ4PifsU0GDO38MSdmEDeRlIxrKbC6NbEaaEHDanWb+y30U8SQ==", + "dev": true + }, + "node_modules/@microsoft/api-extractor/node_modules/fs-extra": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/@microsoft/api-extractor/node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "dev": true, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, "node_modules/@microsoft/api-extractor/node_modules/resolve": { "version": "1.17.0", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", @@ -628,10 +703,32 @@ "node": ">=0.10.0" } }, + "node_modules/@microsoft/api-extractor/node_modules/typescript": { + "version": "4.8.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.8.4.tgz", + "integrity": "sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "node_modules/@microsoft/api-extractor/node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true, + "engines": { + "node": ">= 4.0.0" + } + }, "node_modules/@microsoft/tsdoc": { - "version": "0.14.1", - "resolved": "https://registry.npmjs.org/@microsoft/tsdoc/-/tsdoc-0.14.1.tgz", - "integrity": "sha512-6Wci+Tp3CgPt/B9B0a3J4s3yMgLNSku6w5TV6mN+61C71UqsRBv2FUibBf3tPGlNxebgPHMEUzKpb1ggE8KCKw==", + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/@microsoft/tsdoc/-/tsdoc-0.14.2.tgz", + "integrity": "sha512-9b8mPpKrfeGRuhFH5iO1iwCLeIIsV6+H1sRfxbkoGXIyQE2BTsPd9zqSqQJ+pv5sJ/hT5M1zvOFL02MnEezFug==", "dev": true }, "node_modules/@microsoft/tsdoc-config": { @@ -646,12 +743,6 @@ "resolve": "~1.19.0" } }, - "node_modules/@microsoft/tsdoc-config/node_modules/@microsoft/tsdoc": { - "version": "0.14.2", - "resolved": "https://registry.npmjs.org/@microsoft/tsdoc/-/tsdoc-0.14.2.tgz", - "integrity": "sha512-9b8mPpKrfeGRuhFH5iO1iwCLeIIsV6+H1sRfxbkoGXIyQE2BTsPd9zqSqQJ+pv5sJ/hT5M1zvOFL02MnEezFug==", - "dev": true - }, "node_modules/@microsoft/tsdoc-config/node_modules/resolve": { "version": "1.19.0", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.19.0.tgz", @@ -789,9 +880,9 @@ } }, "node_modules/@rushstack/ts-command-line": { - "version": "4.13.0", - "resolved": "https://registry.npmjs.org/@rushstack/ts-command-line/-/ts-command-line-4.13.0.tgz", - "integrity": "sha512-crLT31kl+qilz0eBRjqqYO06CqwbElc0EvzS6jI69B9Ikt1SkkSzIZ2iDP7zt/rd1ZYipKIS9hf9CQR9swDIKg==", + "version": "4.13.1", + "resolved": "https://registry.npmjs.org/@rushstack/ts-command-line/-/ts-command-line-4.13.1.tgz", + "integrity": "sha512-UTQMRyy/jH1IS2U+6pyzyn9xQ2iMcoUKkTcZUzOP/aaMiKlWLwCTDiBVwhw/M1crDx6apF9CwyjuWO9r1SBdJQ==", "dev": true, "dependencies": { "@types/argparse": "1.0.38", @@ -809,6 +900,13 @@ "sprintf-js": "~1.0.2" } }, + "node_modules/@sinclair/typebox": { + "version": "0.24.51", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.24.51.tgz", + "integrity": "sha512-1P1OROm/rdubP5aFDSZQILU0vrLCJ4fvHt6EoqHEM+2D/G5MK3bIaymUKLit8Js9gbns5UyJnkP/TZROLw4tUA==", + "dev": true, + "optional": true + }, "node_modules/@sindresorhus/is": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.2.0.tgz", @@ -868,6 +966,14 @@ "node": ">=10" } }, + "node_modules/@tootallnate/once": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", + "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", + "engines": { + "node": ">= 10" + } + }, "node_modules/@ts-stack/markdown": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/@ts-stack/markdown/-/markdown-1.4.0.tgz", @@ -907,42 +1013,43 @@ "@types/responselike": "*" } }, - "node_modules/@types/ejs": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@types/ejs/-/ejs-3.1.0.tgz", - "integrity": "sha512-DCg+Ka+uDQ31lJ/UtEXVlaeV3d6t81gifaVWKJy4MYVVgvJttyX/viREy+If7fz+tK/gVxTGMtyrFPnm4gjrVA==", - "dev": true, - "peer": true - }, "node_modules/@types/expect": { "version": "1.20.4", "resolved": "https://registry.npmjs.org/@types/expect/-/expect-1.20.4.tgz", "integrity": "sha512-Q5Vn3yjTDyCMV50TB6VRIbQNxSE4OmZR86VSbGaNpfUolm0iePBB4KdEEHmxoY5sT2+2DIvXW0rvMDP2nHZ4Mg==", "dev": true }, - "node_modules/@types/fs-extra": { - "version": "9.0.13", - "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-9.0.13.tgz", - "integrity": "sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, "node_modules/@types/http-cache-semantics": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz", "integrity": "sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==", "dev": true }, - "node_modules/@types/inquirer": { - "version": "8.2.4", - "resolved": "https://registry.npmjs.org/@types/inquirer/-/inquirer-8.2.4.tgz", - "integrity": "sha512-Pxxx3i3AyK7vKAj3LRM/vF7ETcHKiLJ/u5CnNgbz/eYj/vB3xGAYtRxI5IKtq0hpe5iFHD22BKV3n6WHUu0k4Q==", + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", + "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==", "dev": true, - "peer": true, + "optional": true + }, + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", + "dev": true, + "optional": true, "dependencies": { - "@types/through": "*" + "@types/istanbul-lib-coverage": "*" + } + }, + "node_modules/@types/istanbul-reports": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", + "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", + "dev": true, + "optional": true, + "dependencies": { + "@types/istanbul-lib-report": "*" } }, "node_modules/@types/json-schema": { @@ -960,43 +1067,6 @@ "@types/node": "*" } }, - "node_modules/@types/lodash": { - "version": "4.14.178", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.178.tgz", - "integrity": "sha512-0d5Wd09ItQWH1qFbEyQ7oTQ3GZrMfth5JkbN3EvTKLXcHLRDSXeLnlvlOn0wvxVIwK5o2M8JzP/OWz7T3NRsbw==", - "dev": true, - "peer": true - }, - "node_modules/@types/lodash.flattendeep": { - "version": "4.4.6", - "resolved": "https://registry.npmjs.org/@types/lodash.flattendeep/-/lodash.flattendeep-4.4.6.tgz", - "integrity": "sha512-uLm2MaRVlqJSGsMK0RZpP5T3KqReq+9WbYDHCUhBhp98v56hMG/Yht52bsoTSui9xz2mUvQ9NfG3LrNGDL92Ng==", - "dev": true, - "peer": true, - "dependencies": { - "@types/lodash": "*" - } - }, - "node_modules/@types/lodash.pickby": { - "version": "4.6.6", - "resolved": "https://registry.npmjs.org/@types/lodash.pickby/-/lodash.pickby-4.6.6.tgz", - "integrity": "sha512-NFa13XxlMd9eFi0UFZFWIztpMpXhozbijrx3Yb1viYZphT7jyopIFVoIRF4eYMjruWNEG1rnyrRmg/8ej9T8Iw==", - "dev": true, - "peer": true, - "dependencies": { - "@types/lodash": "*" - } - }, - "node_modules/@types/lodash.union": { - "version": "4.6.6", - "resolved": "https://registry.npmjs.org/@types/lodash.union/-/lodash.union-4.6.6.tgz", - "integrity": "sha512-Wu0ZEVNcyCz8eAn6TlUbYWZoGbH9E+iOHxAZbwUoCEXdUiy6qpcz5o44mMXViM4vlPLLCPlkAubEP1gokoSZaw==", - "dev": true, - "peer": true, - "dependencies": { - "@types/lodash": "*" - } - }, "node_modules/@types/minimist": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.2.tgz", @@ -1004,9 +1074,9 @@ "dev": true }, "node_modules/@types/node": { - "version": "16.11.12", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.12.tgz", - "integrity": "sha512-+2Iggwg7PxoO5Kyhvsq9VarmPbIelXP070HMImEpbtGCoyWNINQj4wzjbQCXzdHTRXnqufutJb5KAURZANNBAw==", + "version": "18.11.10", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.10.tgz", + "integrity": "sha512-juG3RWMBOqcOuXC643OAdSA525V44cVgGV6dUDuiFtss+8Fk5x1hI93Rsld43VeJVIeqlP9I7Fn9/qaVqoEAuQ==", "dev": true }, "node_modules/@types/normalize-package-data": { @@ -1015,16 +1085,6 @@ "integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==", "dev": true }, - "node_modules/@types/recursive-readdir": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@types/recursive-readdir/-/recursive-readdir-2.2.0.tgz", - "integrity": "sha512-HGk753KRu2N4mWduovY4BLjYq4jTOL29gV2OfGdGxHcPSWGFkC5RRIdk+VTs5XmYd7MVAD+JwKrcb5+5Y7FOCg==", - "dev": true, - "peer": true, - "dependencies": { - "@types/node": "*" - } - }, "node_modules/@types/responselike": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.0.tgz", @@ -1049,15 +1109,12 @@ "integrity": "sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==", "dev": true }, - "node_modules/@types/through": { - "version": "0.0.30", - "resolved": "https://registry.npmjs.org/@types/through/-/through-0.0.30.tgz", - "integrity": "sha512-FvnCJljyxhPM3gkRgWmxmDZyAQSiBQQWLI0A0VFL0K7W1oRUrPJSqNO0NvTnLkBcotdlp3lKvaT0JrnyRDkzOg==", + "node_modules/@types/stack-utils": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz", + "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==", "dev": true, - "peer": true, - "dependencies": { - "@types/node": "*" - } + "optional": true }, "node_modules/@types/ua-parser-js": { "version": "0.7.36", @@ -1081,10 +1138,36 @@ "integrity": "sha512-8oDqyLC7eD4HM307boe2QWKyuzdzWBj56xI/imSl2cpL+U3tCMaTAkMJ4ee5JBZ/FsOJlvRGeIShiZDAl1qERA==", "dev": true }, + "node_modules/@types/ws": { + "version": "8.5.3", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.3.tgz", + "integrity": "sha512-6YOoWjruKj1uLf3INHH7D3qTXwFfEsg1kf3c0uDdSBJwfa/llkwIjrAGV7j7mVgGNbzTQ3HiHKKDXl6bJPD97w==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/yargs": { + "version": "17.0.17", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.17.tgz", + "integrity": "sha512-72bWxFKTK6uwWJAVT+3rF6Jo6RTojiJ27FQo8Rf60AL+VZbzoVPnMFhKsUnbjR8A3BTCYQ7Mv3hnl8T0A+CX9g==", + "dev": true, + "optional": true, + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@types/yargs-parser": { + "version": "21.0.0", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz", + "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==", + "dev": true, + "optional": true + }, "node_modules/@types/yauzl": { - "version": "2.9.2", - "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.9.2.tgz", - "integrity": "sha512-8uALY5LTvSuHgloDVUvWP3pIauILm+8/0pDMokuDYIoNsOkSwd5AiHBTSEJjKTDcZr5z8UpgOWZkxBF4iJftoA==", + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha512-Cn6WYCm0tXv8p6k+A8PvbDG763EDpBoTzHdA+Q/MF6H3sapGjCm9NzoaJncJS9tUKSuCoDs9XHxYYsQDgxR6kw==", "dev": true, "optional": true, "dependencies": { @@ -1092,14 +1175,14 @@ } }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "5.42.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.42.0.tgz", - "integrity": "sha512-5TJh2AgL6+wpL8H/GTSjNb4WrjKoR2rqvFxR/DDTqYNk6uXn8BJMEcncLSpMbf/XV1aS0jAjYwn98uvVCiAywQ==", + "version": "5.46.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.46.0.tgz", + "integrity": "sha512-QrZqaIOzJAjv0sfjY4EjbXUi3ZOFpKfzntx22gPGr9pmFcTjcFw/1sS1LJhEubfAGwuLjNrPV0rH+D1/XZFy7Q==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "5.42.0", - "@typescript-eslint/type-utils": "5.42.0", - "@typescript-eslint/utils": "5.42.0", + "@typescript-eslint/scope-manager": "5.46.0", + "@typescript-eslint/type-utils": "5.46.0", + "@typescript-eslint/utils": "5.46.0", "debug": "^4.3.4", "ignore": "^5.2.0", "natural-compare-lite": "^1.4.0", @@ -1125,13 +1208,13 @@ } }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/scope-manager": { - "version": "5.42.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.42.0.tgz", - "integrity": "sha512-l5/3IBHLH0Bv04y+H+zlcLiEMEMjWGaCX6WyHE5Uk2YkSGAMlgdUPsT/ywTSKgu9D1dmmKMYgYZijObfA39Wow==", + "version": "5.46.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.46.0.tgz", + "integrity": "sha512-7wWBq9d/GbPiIM6SqPK9tfynNxVbfpihoY5cSFMer19OYUA3l4powA2uv0AV2eAZV6KoAh6lkzxv4PoxOLh1oA==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.42.0", - "@typescript-eslint/visitor-keys": "5.42.0" + "@typescript-eslint/types": "5.46.0", + "@typescript-eslint/visitor-keys": "5.46.0" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -1142,9 +1225,9 @@ } }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/types": { - "version": "5.42.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.42.0.tgz", - "integrity": "sha512-t4lzO9ZOAUcHY6bXQYRuu+3SSYdD9TS8ooApZft4WARt4/f2Cj/YpvbTe8A4GuhT4bNW72goDMOy7SW71mZwGw==", + "version": "5.46.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.46.0.tgz", + "integrity": "sha512-wHWgQHFB+qh6bu0IAPAJCdeCdI0wwzZnnWThlmHNY01XJ9Z97oKqKOzWYpR2I83QmshhQJl6LDM9TqMiMwJBTw==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -1155,12 +1238,12 @@ } }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/visitor-keys": { - "version": "5.42.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.42.0.tgz", - "integrity": "sha512-QHbu5Hf/2lOEOwy+IUw0GoSCuAzByTAWWrOTKzTzsotiUnWFpuKnXcAhC9YztAf2EElQ0VvIK+pHJUPkM0q7jg==", + "version": "5.46.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.46.0.tgz", + "integrity": "sha512-E13gBoIXmaNhwjipuvQg1ByqSAu/GbEpP/qzFihugJ+MomtoJtFAJG/+2DRPByf57B863m0/q7Zt16V9ohhANw==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.42.0", + "@typescript-eslint/types": "5.46.0", "eslint-visitor-keys": "^3.3.0" }, "engines": { @@ -1218,13 +1301,13 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "5.42.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.42.0.tgz", - "integrity": "sha512-HW14TXC45dFVZxnVW8rnUGnvYyRC0E/vxXShFCthcC9VhVTmjqOmtqj6H5rm9Zxv+ORxKA/1aLGD7vmlLsdlOg==", + "version": "5.46.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.46.0.tgz", + "integrity": "sha512-dwv4nimVIAsVS2dTA0MekkWaRnoYNXY26dKz8AN5W3cBFYwYGFQEqm/cG+TOoooKlncJS4RTbFKgcFY/pOiBCg==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "5.42.0", - "@typescript-eslint/utils": "5.42.0", + "@typescript-eslint/typescript-estree": "5.46.0", + "@typescript-eslint/utils": "5.46.0", "debug": "^4.3.4", "tsutils": "^3.21.0" }, @@ -1245,9 +1328,9 @@ } }, "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/types": { - "version": "5.42.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.42.0.tgz", - "integrity": "sha512-t4lzO9ZOAUcHY6bXQYRuu+3SSYdD9TS8ooApZft4WARt4/f2Cj/YpvbTe8A4GuhT4bNW72goDMOy7SW71mZwGw==", + "version": "5.46.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.46.0.tgz", + "integrity": "sha512-wHWgQHFB+qh6bu0IAPAJCdeCdI0wwzZnnWThlmHNY01XJ9Z97oKqKOzWYpR2I83QmshhQJl6LDM9TqMiMwJBTw==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -1258,13 +1341,13 @@ } }, "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/typescript-estree": { - "version": "5.42.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.42.0.tgz", - "integrity": "sha512-2O3vSq794x3kZGtV7i4SCWZWCwjEtkWfVqX4m5fbUBomOsEOyd6OAD1qU2lbvV5S8tgy/luJnOYluNyYVeOTTg==", + "version": "5.46.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.46.0.tgz", + "integrity": "sha512-kDLNn/tQP+Yp8Ro2dUpyyVV0Ksn2rmpPpB0/3MO874RNmXtypMwSeazjEN/Q6CTp8D7ExXAAekPEcCEB/vtJkw==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.42.0", - "@typescript-eslint/visitor-keys": "5.42.0", + "@typescript-eslint/types": "5.46.0", + "@typescript-eslint/visitor-keys": "5.46.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -1285,12 +1368,12 @@ } }, "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/visitor-keys": { - "version": "5.42.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.42.0.tgz", - "integrity": "sha512-QHbu5Hf/2lOEOwy+IUw0GoSCuAzByTAWWrOTKzTzsotiUnWFpuKnXcAhC9YztAf2EElQ0VvIK+pHJUPkM0q7jg==", + "version": "5.46.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.46.0.tgz", + "integrity": "sha512-E13gBoIXmaNhwjipuvQg1ByqSAu/GbEpP/qzFihugJ+MomtoJtFAJG/+2DRPByf57B863m0/q7Zt16V9ohhANw==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.42.0", + "@typescript-eslint/types": "5.46.0", "eslint-visitor-keys": "^3.3.0" }, "engines": { @@ -1344,16 +1427,16 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "5.42.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.42.0.tgz", - "integrity": "sha512-JZ++3+h1vbeG1NUECXQZE3hg0kias9kOtcQr3+JVQ3whnjvKuMyktJAAIj6743OeNPnGBmjj7KEmiDL7qsdnCQ==", + "version": "5.46.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.46.0.tgz", + "integrity": "sha512-4O+Ps1CRDw+D+R40JYh5GlKLQERXRKW5yIQoNDpmXPJ+C7kaPF9R7GWl+PxGgXjB3PQCqsaaZUpZ9dG4U6DO7g==", "dev": true, "dependencies": { "@types/json-schema": "^7.0.9", "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.42.0", - "@typescript-eslint/types": "5.42.0", - "@typescript-eslint/typescript-estree": "5.42.0", + "@typescript-eslint/scope-manager": "5.46.0", + "@typescript-eslint/types": "5.46.0", + "@typescript-eslint/typescript-estree": "5.46.0", "eslint-scope": "^5.1.1", "eslint-utils": "^3.0.0", "semver": "^7.3.7" @@ -1370,13 +1453,13 @@ } }, "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/scope-manager": { - "version": "5.42.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.42.0.tgz", - "integrity": "sha512-l5/3IBHLH0Bv04y+H+zlcLiEMEMjWGaCX6WyHE5Uk2YkSGAMlgdUPsT/ywTSKgu9D1dmmKMYgYZijObfA39Wow==", + "version": "5.46.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.46.0.tgz", + "integrity": "sha512-7wWBq9d/GbPiIM6SqPK9tfynNxVbfpihoY5cSFMer19OYUA3l4powA2uv0AV2eAZV6KoAh6lkzxv4PoxOLh1oA==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.42.0", - "@typescript-eslint/visitor-keys": "5.42.0" + "@typescript-eslint/types": "5.46.0", + "@typescript-eslint/visitor-keys": "5.46.0" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -1387,9 +1470,9 @@ } }, "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/types": { - "version": "5.42.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.42.0.tgz", - "integrity": "sha512-t4lzO9ZOAUcHY6bXQYRuu+3SSYdD9TS8ooApZft4WARt4/f2Cj/YpvbTe8A4GuhT4bNW72goDMOy7SW71mZwGw==", + "version": "5.46.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.46.0.tgz", + "integrity": "sha512-wHWgQHFB+qh6bu0IAPAJCdeCdI0wwzZnnWThlmHNY01XJ9Z97oKqKOzWYpR2I83QmshhQJl6LDM9TqMiMwJBTw==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -1400,13 +1483,13 @@ } }, "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/typescript-estree": { - "version": "5.42.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.42.0.tgz", - "integrity": "sha512-2O3vSq794x3kZGtV7i4SCWZWCwjEtkWfVqX4m5fbUBomOsEOyd6OAD1qU2lbvV5S8tgy/luJnOYluNyYVeOTTg==", + "version": "5.46.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.46.0.tgz", + "integrity": "sha512-kDLNn/tQP+Yp8Ro2dUpyyVV0Ksn2rmpPpB0/3MO874RNmXtypMwSeazjEN/Q6CTp8D7ExXAAekPEcCEB/vtJkw==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.42.0", - "@typescript-eslint/visitor-keys": "5.42.0", + "@typescript-eslint/types": "5.46.0", + "@typescript-eslint/visitor-keys": "5.46.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -1427,12 +1510,12 @@ } }, "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/visitor-keys": { - "version": "5.42.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.42.0.tgz", - "integrity": "sha512-QHbu5Hf/2lOEOwy+IUw0GoSCuAzByTAWWrOTKzTzsotiUnWFpuKnXcAhC9YztAf2EElQ0VvIK+pHJUPkM0q7jg==", + "version": "5.46.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.46.0.tgz", + "integrity": "sha512-E13gBoIXmaNhwjipuvQg1ByqSAu/GbEpP/qzFihugJ+MomtoJtFAJG/+2DRPByf57B863m0/q7Zt16V9ohhANw==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.42.0", + "@typescript-eslint/types": "5.46.0", "eslint-visitor-keys": "^3.3.0" }, "engines": { @@ -1474,475 +1557,121 @@ "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@wdio/cli": { - "version": "7.16.10", - "resolved": "https://registry.npmjs.org/@wdio/cli/-/cli-7.16.10.tgz", - "integrity": "sha512-VYip4i1SKRwsTiLd9I5EaHP7l+5F4jStQ5JulejEbYDHor6NEcakGsF+m6JAzHZgxs9QcskNxLr8tBveXM/b7w==", + "node_modules/@wdio/globals": { + "version": "8.0.12", + "resolved": "https://registry.npmjs.org/@wdio/globals/-/globals-8.0.12.tgz", + "integrity": "sha512-6D/ZXBxHbANOfs1OKtk9g4O6xeGhAMvzvZnwtfkXQ+ywozfdv1oOzqZ/01wQwrRbmVlfLfIoMy9/kcXjtKP13A==", "dev": true, - "peer": true, - "dependencies": { - "@types/ejs": "^3.0.5", - "@types/fs-extra": "^9.0.4", - "@types/inquirer": "^8.1.2", - "@types/lodash.flattendeep": "^4.4.6", - "@types/lodash.pickby": "^4.6.6", - "@types/lodash.union": "^4.6.6", - "@types/node": "^16.11.1", - "@types/recursive-readdir": "^2.2.0", - "@wdio/config": "7.16.3", - "@wdio/logger": "7.16.0", - "@wdio/types": "7.16.3", - "@wdio/utils": "7.16.3", - "async-exit-hook": "^2.0.1", - "chalk": "^4.0.0", - "chokidar": "^3.0.0", - "cli-spinners": "^2.1.0", - "ejs": "^3.0.1", - "fs-extra": "^10.0.0", - "inquirer": "8.1.5", - "lodash.flattendeep": "^4.4.0", - "lodash.pickby": "^4.6.0", - "lodash.union": "^4.6.0", - "mkdirp": "^1.0.4", - "recursive-readdir": "^2.2.2", - "webdriverio": "7.16.10", - "yargs": "^17.0.0", - "yarn-install": "^1.0.0" - }, - "bin": { - "wdio": "bin/wdio.js" - }, "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/@wdio/cli/node_modules/@wdio/repl": { - "version": "7.16.3", - "resolved": "https://registry.npmjs.org/@wdio/repl/-/repl-7.16.3.tgz", - "integrity": "sha512-aFpWyAIuPo6VVmkotZDWXMzd4qw3gD+xAhB6blNrMCZKWnz9+HqZnuGGc6pmiyuc5yFzb9wF22tnIxuyTyH7yA==", - "dev": true, - "peer": true, - "dependencies": { - "@wdio/utils": "7.16.3" + "node": "^16.13 || >=18" }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/@wdio/cli/node_modules/debug": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", - "dev": true, - "peer": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/@wdio/cli/node_modules/devtools": { - "version": "7.16.10", - "resolved": "https://registry.npmjs.org/devtools/-/devtools-7.16.10.tgz", - "integrity": "sha512-43uB3t6uNjWsqiQKRLY7axFLuMdKqlQxq6N3FWCfBKl9We1oygkGkE7Scnushdbc4lk7QwGXBC1DQ83dCgA5Gw==", - "dev": true, - "peer": true, - "dependencies": { - "@types/node": "^16.11.1", - "@types/ua-parser-js": "^0.7.33", - "@wdio/config": "7.16.3", - "@wdio/logger": "7.16.0", - "@wdio/protocols": "7.16.7", - "@wdio/types": "7.16.3", - "@wdio/utils": "7.16.3", - "chrome-launcher": "^0.15.0", - "edge-paths": "^2.1.0", - "puppeteer-core": "^11.0.0", - "query-selector-shadow-dom": "^1.0.0", - "ua-parser-js": "^1.0.1", - "uuid": "^8.0.0" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/@wdio/cli/node_modules/devtools-protocol": { - "version": "0.0.944179", - "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.944179.tgz", - "integrity": "sha512-oqBbLKuCAkEqqsWn0rsfkjy79F0/QTQR/rlijZzeHInJfDRPYwP0D04NiQX9MQmucrAyRWGseY0b/ff0yhQdXg==", - "dev": true, - "peer": true - }, - "node_modules/@wdio/cli/node_modules/node-fetch": { - "version": "2.6.5", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.5.tgz", - "integrity": "sha512-mmlIVHJEu5rnIxgEgez6b9GgWXbkZj5YZ7fx+2r94a2E+Uirsp6HsPTPlomfdHtpt/B0cdKviwkoaM6pyvUOpQ==", - "dev": true, - "peer": true, - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - } - }, - "node_modules/@wdio/cli/node_modules/puppeteer-core": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-11.0.0.tgz", - "integrity": "sha512-hfQ39KNP0qKplQ86iaCNXHH9zpWlV01UFdggt2qffgWeCBF9KMavwP/k/iK/JidPPWfOnKZhDLSHZVSUr73DtA==", - "dev": true, - "peer": true, - "dependencies": { - "debug": "4.3.2", - "devtools-protocol": "0.0.901419", - "extract-zip": "2.0.1", - "https-proxy-agent": "5.0.0", - "node-fetch": "2.6.5", - "pkg-dir": "4.2.0", - "progress": "2.0.3", - "proxy-from-env": "1.1.0", - "rimraf": "3.0.2", - "tar-fs": "2.1.1", - "unbzip2-stream": "1.4.3", - "ws": "8.2.3" - }, - "engines": { - "node": ">=10.18.1" - } - }, - "node_modules/@wdio/cli/node_modules/puppeteer-core/node_modules/devtools-protocol": { - "version": "0.0.901419", - "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.901419.tgz", - "integrity": "sha512-4INMPwNm9XRpBukhNbF7OB6fNTTCaI8pzy/fXg0xQzAy5h3zL1P8xT3QazgKqBrb/hAYwIBizqDBZ7GtJE74QQ==", - "dev": true, - "peer": true - }, - "node_modules/@wdio/cli/node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=", - "dev": true, - "peer": true - }, - "node_modules/@wdio/cli/node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "dev": true, - "peer": true, - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/@wdio/cli/node_modules/webdriver": { - "version": "7.16.9", - "resolved": "https://registry.npmjs.org/webdriver/-/webdriver-7.16.9.tgz", - "integrity": "sha512-6bpiyE3/1ncgyNM/RwzEWjpxu2NLYyeYNu/97OMEwFMDV8EqvlZh3wFnODi6tY0K5t4dEryIPiyjF3MDVySRAg==", - "dev": true, - "peer": true, - "dependencies": { - "@types/node": "^16.11.1", - "@wdio/config": "7.16.3", - "@wdio/logger": "7.16.0", - "@wdio/protocols": "7.16.7", - "@wdio/types": "7.16.3", - "@wdio/utils": "7.16.3", - "got": "^11.0.2", - "ky": "^0.28.5", - "lodash.merge": "^4.6.1" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/@wdio/cli/node_modules/webdriverio": { - "version": "7.16.10", - "resolved": "https://registry.npmjs.org/webdriverio/-/webdriverio-7.16.10.tgz", - "integrity": "sha512-Idsn0084HqcqHa5/BW/75dwFEitSDi/hhXk+GRA0wZkVU7woE8ZKACsMS270kOADgXYU9XJBT8jo6YM3R3Sa+Q==", - "dev": true, - "peer": true, - "dependencies": { - "@types/aria-query": "^5.0.0", - "@types/node": "^16.11.1", - "@wdio/config": "7.16.3", - "@wdio/logger": "7.16.0", - "@wdio/protocols": "7.16.7", - "@wdio/repl": "7.16.3", - "@wdio/types": "7.16.3", - "@wdio/utils": "7.16.3", - "archiver": "^5.0.0", - "aria-query": "^5.0.0", - "css-shorthand-properties": "^1.1.1", - "css-value": "^0.0.1", - "devtools": "7.16.10", - "devtools-protocol": "^0.0.944179", - "fs-extra": "^10.0.0", - "get-port": "^5.1.1", - "grapheme-splitter": "^1.0.2", - "lodash.clonedeep": "^4.5.0", - "lodash.isobject": "^3.0.2", - "lodash.isplainobject": "^4.0.6", - "lodash.zip": "^4.2.0", - "minimatch": "^3.0.4", - "puppeteer-core": "^11.0.0", - "query-selector-shadow-dom": "^1.0.0", - "resq": "^1.9.1", - "rgb2hex": "0.2.5", - "serialize-error": "^8.0.0", - "webdriver": "7.16.9" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/@wdio/cli/node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=", - "dev": true, - "peer": true - }, - "node_modules/@wdio/cli/node_modules/whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=", - "dev": true, - "peer": true, - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, - "node_modules/@wdio/cli/node_modules/ws": { - "version": "8.2.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.2.3.tgz", - "integrity": "sha512-wBuoj1BDpC6ZQ1B7DWQBYVLphPWkm8i9Y0/3YdHjHKHiohOJ1ws+3OccDWtH+PoC9DZD5WOTrJvNbWvjS6JWaA==", - "dev": true, - "peer": true, - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/@wdio/config": { - "version": "7.16.3", - "resolved": "https://registry.npmjs.org/@wdio/config/-/config-7.16.3.tgz", - "integrity": "sha512-YbpeZAeEncyJrsKxfAwjhNbDUf/ZrMB2Io3PYnH3RQjEEo5lYlO15aUt9uJx09W5h8hBPcrj7CfUC5yNkFZJhw==", - "dev": true, - "peer": true, - "dependencies": { - "@wdio/logger": "7.16.0", - "@wdio/types": "7.16.3", - "deepmerge": "^4.0.0", - "glob": "^7.1.2" - }, - "engines": { - "node": ">=12.0.0" + "optionalDependencies": { + "expect-webdriverio": "^4.0.1", + "webdriverio": "8.0.12" } }, "node_modules/@wdio/logger": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@wdio/logger/-/logger-7.16.0.tgz", - "integrity": "sha512-/6lOGb2Iow5eSsy7RJOl1kCwsP4eMlG+/QKro5zUJsuyNJSQXf2ejhpkzyKWLgQbHu83WX6cM1014AZuLkzoQg==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@wdio/logger/-/logger-8.0.0.tgz", + "integrity": "sha512-QEBPZoFQhWqqIYmhp8Wa+HhvMrH2Yy0xbD3MPOibkFwp9Tn8Si7oDxbnWqzcPiukLWcb4E/QlgE5f3IM5BrAPQ==", "dev": true, - "peer": true, "dependencies": { - "chalk": "^4.0.0", + "chalk": "^5.1.2", "loglevel": "^1.6.0", "loglevel-plugin-prefix": "^0.8.4", "strip-ansi": "^6.0.0" }, "engines": { - "node": ">=12.0.0" + "node": "^16.13 || >=18" + } + }, + "node_modules/@wdio/logger/node_modules/chalk": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.1.2.tgz", + "integrity": "sha512-E5CkT4jWURs1Vy5qGJye+XwCkNj7Od3Af7CP6SujMetSMkLs8Do2RWJK5yx1wamHV/op8Rz+9rltjaTQWDnEFQ==", + "dev": true, + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, "node_modules/@wdio/protocols": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@wdio/protocols/-/protocols-7.16.7.tgz", - "integrity": "sha512-Wv40pNQcLiPzQ3o98Mv4A8T1EBQ6k4khglz/e2r16CTm+F3DDYh8eLMAsU5cgnmuwwDKX1EyOiFwieykBn5MCg==", - "dev": true, - "peer": true, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/@wdio/repl": { - "version": "7.25.1", - "resolved": "https://registry.npmjs.org/@wdio/repl/-/repl-7.25.1.tgz", - "integrity": "sha512-3DUtOrLi5thba22IBn/XQ7caFrbXtYOg3750UtXxUuxXU4QHkKq1AN8+WXr4Rq2EnXfB2G9t9pEdqjZSv9oPAw==", - "dev": true, - "dependencies": { - "@wdio/utils": "7.25.1" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/@wdio/repl/node_modules/@types/node": { - "version": "18.8.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.8.0.tgz", - "integrity": "sha512-u+h43R6U8xXDt2vzUaVP3VwjjLyOJk6uEciZS8OSyziUQGOwmk+l+4drxcsDboHXwyTaqS1INebghmWMRxq3LA==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@wdio/protocols/-/protocols-8.0.0.tgz", + "integrity": "sha512-iTfYOcli/98ubeTqxyP9+OBPQxfbB5cPK6Zv61C9Rr4qQkzx4GPQjn/AlK0r6Bn0dRy/9lGyb2Q3UBRCx85RSQ==", "dev": true }, - "node_modules/@wdio/repl/node_modules/@wdio/logger": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@wdio/logger/-/logger-7.19.0.tgz", - "integrity": "sha512-xR7SN/kGei1QJD1aagzxs3KMuzNxdT/7LYYx+lt6BII49+fqL/SO+5X0FDCZD0Ds93AuQvvz9eGyzrBI2FFXmQ==", + "node_modules/@wdio/repl": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@wdio/repl/-/repl-8.0.0.tgz", + "integrity": "sha512-Qys/t/NioO+LlcDcD+4Agn0JJjIiO6fkqOJJDxv3QulGPCmQ5SaYX+BQyz1o9sGscfr8s/435d+3dkBSO1+3tQ==", "dev": true, - "dependencies": { - "chalk": "^4.0.0", - "loglevel": "^1.6.0", - "loglevel-plugin-prefix": "^0.8.4", - "strip-ansi": "^6.0.0" - }, "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/@wdio/repl/node_modules/@wdio/types": { - "version": "7.25.1", - "resolved": "https://registry.npmjs.org/@wdio/types/-/types-7.25.1.tgz", - "integrity": "sha512-9Xt2U0YXYxRW4UvMFwjt+44UkfhwrI1gPhW+y56SubpyKaUfdNGberteboQoR/7Os1SVtJry4FohEZNmFzPK6g==", - "dev": true, - "dependencies": { - "@types/node": "^18.0.0", - "got": "^11.8.1" - }, - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "typescript": "^4.6.2" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@wdio/repl/node_modules/@wdio/utils": { - "version": "7.25.1", - "resolved": "https://registry.npmjs.org/@wdio/utils/-/utils-7.25.1.tgz", - "integrity": "sha512-DL+nDRVgzruJLhedBUQEMUcojLoGwsjCQCYWram4NfwAIIkxcAX/5Y4vHSut3OoW2bEHl3R8/FQ4B/ivIr2EoQ==", - "dev": true, - "dependencies": { - "@wdio/logger": "7.19.0", - "@wdio/types": "7.25.1", - "p-iteration": "^1.1.8" - }, - "engines": { - "node": ">=12.0.0" + "node": "^16.13 || >=18" } }, "node_modules/@wdio/selenium-standalone-service": { - "version": "7.25.1", - "resolved": "https://registry.npmjs.org/@wdio/selenium-standalone-service/-/selenium-standalone-service-7.25.1.tgz", - "integrity": "sha512-TRD4hAxdHuZ0z414eDayE6q2gEmyAg7YdMrF+CJHWbjZKhJG4cqTSpV04zgMfQmTov5Y2+WtasdlGnqV5AXfMg==", + "version": "8.0.11", + "resolved": "https://registry.npmjs.org/@wdio/selenium-standalone-service/-/selenium-standalone-service-8.0.11.tgz", + "integrity": "sha512-k2dT4AEmqVjYv1UmqoQHdQHqHJq+qkZfXyCKo7MeyG4XZ423ioo+otztATu0NiNT7UNSmBbunBis9nUBGWaoUg==", "dev": true, "dependencies": { - "@types/fs-extra": "^9.0.1", - "@types/node": "^18.0.0", "@types/selenium-standalone": "^7.0.0", - "@wdio/config": "7.25.1", - "@wdio/logger": "7.19.0", - "@wdio/types": "7.25.1", - "fs-extra": "^10.0.0", - "selenium-standalone": "^8.0.3" + "@wdio/config": "8.0.11", + "@wdio/logger": "8.0.0", + "@wdio/types": "8.0.11", + "selenium-standalone": "^8.2.1" }, "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "@wdio/cli": "^7.0.0" + "node": "^16.13 || >=18" } }, - "node_modules/@wdio/selenium-standalone-service/node_modules/@types/node": { - "version": "18.8.2", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.8.2.tgz", - "integrity": "sha512-cRMwIgdDN43GO4xMWAfJAecYn8wV4JbsOGHNfNUIDiuYkUYAR5ec4Rj7IO2SAhFPEfpPtLtUTbbny/TCT7aDwA==", - "dev": true - }, "node_modules/@wdio/selenium-standalone-service/node_modules/@wdio/config": { - "version": "7.25.1", - "resolved": "https://registry.npmjs.org/@wdio/config/-/config-7.25.1.tgz", - "integrity": "sha512-7I3L+TE75gvh8jiv8cE/Ch9S9erDgrZG9o5587OlNKfpgFciT7DH7/efPXzYwh8YPFV3grFaydxaaoYzDv6PDA==", + "version": "8.0.11", + "resolved": "https://registry.npmjs.org/@wdio/config/-/config-8.0.11.tgz", + "integrity": "sha512-LR8n6TJfDzVtDmuge4EjOHiJKae73ZyvEwTQq3tokovRIbIMaVkfsRV9iqEZiRgohy14ehAREwNgn67j77ucYA==", "dev": true, "dependencies": { - "@wdio/logger": "7.19.0", - "@wdio/types": "7.25.1", - "@wdio/utils": "7.25.1", - "deepmerge": "^4.0.0", - "glob": "^8.0.3" + "@wdio/logger": "8.0.0", + "@wdio/types": "8.0.11", + "@wdio/utils": "8.0.11", + "decamelize": "^6.0.0", + "deepmerge-ts": "^4.2.2", + "glob": "^8.0.3", + "import-meta-resolve": "^2.1.0", + "read-pkg-up": "^9.1.0" }, "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/@wdio/selenium-standalone-service/node_modules/@wdio/logger": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@wdio/logger/-/logger-7.19.0.tgz", - "integrity": "sha512-xR7SN/kGei1QJD1aagzxs3KMuzNxdT/7LYYx+lt6BII49+fqL/SO+5X0FDCZD0Ds93AuQvvz9eGyzrBI2FFXmQ==", - "dev": true, - "dependencies": { - "chalk": "^4.0.0", - "loglevel": "^1.6.0", - "loglevel-plugin-prefix": "^0.8.4", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=12.0.0" + "node": "^16.13 || >=18" } }, "node_modules/@wdio/selenium-standalone-service/node_modules/@wdio/types": { - "version": "7.25.1", - "resolved": "https://registry.npmjs.org/@wdio/types/-/types-7.25.1.tgz", - "integrity": "sha512-9Xt2U0YXYxRW4UvMFwjt+44UkfhwrI1gPhW+y56SubpyKaUfdNGberteboQoR/7Os1SVtJry4FohEZNmFzPK6g==", + "version": "8.0.11", + "resolved": "https://registry.npmjs.org/@wdio/types/-/types-8.0.11.tgz", + "integrity": "sha512-54xbajB7tqWmYPXFI0ALupPauwLyVtPSZSG/R/DPlY25p+Ygw4jwH64s+Jh1V3TZYnktfv4cIt1Bw/M35cBgOQ==", "dev": true, "dependencies": { - "@types/node": "^18.0.0", - "got": "^11.8.1" + "@types/node": "^18.0.0" }, "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "typescript": "^4.6.2" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "node": "^16.13 || >=18" } }, "node_modules/@wdio/selenium-standalone-service/node_modules/@wdio/utils": { - "version": "7.25.1", - "resolved": "https://registry.npmjs.org/@wdio/utils/-/utils-7.25.1.tgz", - "integrity": "sha512-DL+nDRVgzruJLhedBUQEMUcojLoGwsjCQCYWram4NfwAIIkxcAX/5Y4vHSut3OoW2bEHl3R8/FQ4B/ivIr2EoQ==", + "version": "8.0.11", + "resolved": "https://registry.npmjs.org/@wdio/utils/-/utils-8.0.11.tgz", + "integrity": "sha512-4nIYt1KP4IVIYfnld+Kbh/l85o7VK4roAEIfiHV374utPpspzV+eli4ANX2fEOGVUVJMVNBCN/sCsL8u3DsPpw==", "dev": true, "dependencies": { - "@wdio/logger": "7.19.0", - "@wdio/types": "7.25.1", + "@wdio/logger": "8.0.0", + "@wdio/types": "8.0.11", + "import-meta-resolve": "^2.2.0", "p-iteration": "^1.1.8" }, "engines": { - "node": ">=12.0.0" + "node": "^16.13 || >=18" } }, "node_modules/@wdio/selenium-standalone-service/node_modules/brace-expansion": { @@ -1954,6 +1683,34 @@ "balanced-match": "^1.0.0" } }, + "node_modules/@wdio/selenium-standalone-service/node_modules/decamelize": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-6.0.0.tgz", + "integrity": "sha512-Fv96DCsdOgB6mdGl67MT5JaTNKRzrzill5OH5s8bjYJXVlcXyPYGyPsUkWyGV5p1TXI5esYIYMMeDJL0hEIwaA==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@wdio/selenium-standalone-service/node_modules/find-up": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz", + "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==", + "dev": true, + "dependencies": { + "locate-path": "^7.1.0", + "path-exists": "^5.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/@wdio/selenium-standalone-service/node_modules/glob": { "version": "8.0.3", "resolved": "https://registry.npmjs.org/glob/-/glob-8.0.3.tgz", @@ -1973,10 +1730,25 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/@wdio/selenium-standalone-service/node_modules/locate-path": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.1.1.tgz", + "integrity": "sha512-vJXaRMJgRVD3+cUZs3Mncj2mxpt5mP0EmNOsxRSZRMlbqjvxzDEOIUWXGmavo0ZC9+tNZCBLQ66reA11nbpHZg==", + "dev": true, + "dependencies": { + "p-locate": "^6.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/@wdio/selenium-standalone-service/node_modules/minimatch": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.0.tgz", - "integrity": "sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.1.tgz", + "integrity": "sha512-362NP+zlprccbEt/SkxKfRMHnNY85V74mVnpUpNyr3F35covl09Kec7/sEFLt3RA4oXmewtoaanoIf67SE5Y5g==", "dev": true, "dependencies": { "brace-expansion": "^2.0.1" @@ -1985,33 +1757,90 @@ "node": ">=10" } }, - "node_modules/@wdio/types": { - "version": "7.16.3", - "resolved": "https://registry.npmjs.org/@wdio/types/-/types-7.16.3.tgz", - "integrity": "sha512-iJLtJrOJZSJrXR1zseCkVWUFs477FngjWz2HTMfGHR69LzfmxC0RNagemjZuLTfhTqWp/FBbqaA/F+7xJdNKag==", + "node_modules/@wdio/selenium-standalone-service/node_modules/p-limit": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", + "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", "dev": true, - "peer": true, "dependencies": { - "@types/node": "^16.11.1", - "got": "^11.8.1" + "yocto-queue": "^1.0.0" }, "engines": { - "node": ">=12.0.0" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@wdio/utils": { - "version": "7.16.3", - "resolved": "https://registry.npmjs.org/@wdio/utils/-/utils-7.16.3.tgz", - "integrity": "sha512-/662h5Z7B5TejHN6GiW96PAKuTPi/xcAGmtjA9ozRBI2/0eHSccDfNEaBgTTjLqqEgGAXylHcOuxHOrKx2ddJw==", + "node_modules/@wdio/selenium-standalone-service/node_modules/p-locate": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", + "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", "dev": true, - "peer": true, "dependencies": { - "@wdio/logger": "7.16.0", - "@wdio/types": "7.16.3", - "p-iteration": "^1.1.8" + "p-limit": "^4.0.0" }, "engines": { - "node": ">=12.0.0" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@wdio/selenium-standalone-service/node_modules/path-exists": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", + "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, + "node_modules/@wdio/selenium-standalone-service/node_modules/read-pkg": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-7.1.0.tgz", + "integrity": "sha512-5iOehe+WF75IccPc30bWTbpdDQLOCc3Uu8bi3Dte3Eueij81yx1Mrufk8qBx/YAbR4uL1FdUr+7BKXDwEtisXg==", + "dev": true, + "dependencies": { + "@types/normalize-package-data": "^2.4.1", + "normalize-package-data": "^3.0.2", + "parse-json": "^5.2.0", + "type-fest": "^2.0.0" + }, + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@wdio/selenium-standalone-service/node_modules/read-pkg-up": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-9.1.0.tgz", + "integrity": "sha512-vaMRR1AC1nrd5CQM0PhlRsO5oc2AAigqr7cCrZ/MW/Rsaflz4RlgzkpL4qoU/z1F6wrbd85iFv1OQj/y5RdGvg==", + "dev": true, + "dependencies": { + "find-up": "^6.3.0", + "read-pkg": "^7.1.0", + "type-fest": "^2.5.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@wdio/selenium-standalone-service/node_modules/yocto-queue": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", + "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", + "dev": true, + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/@yarnpkg/lockfile": { @@ -2021,9 +1850,9 @@ "dev": true }, "node_modules/abab": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.5.tgz", - "integrity": "sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q==" + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", + "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==" }, "node_modules/abort-controller": { "version": "3.0.0", @@ -2038,10 +1867,9 @@ } }, "node_modules/acorn": { - "version": "8.8.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.0.tgz", - "integrity": "sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==", - "dev": true, + "version": "8.8.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.1.tgz", + "integrity": "sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==", "bin": { "acorn": "bin/acorn" }, @@ -2050,31 +1878,12 @@ } }, "node_modules/acorn-globals": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-4.3.4.tgz", - "integrity": "sha512-clfQEh21R+D0leSbUdWf3OcfqyaCSAQ8Ryq00bofSekfr9W8u1jyYZo6ir0xu9Gtcf7BjcHJpnbZH7JOCpP60A==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-7.0.1.tgz", + "integrity": "sha512-umOSDSDrfHbTNPuNpC2NSnnA3LUrqpevPb4T9jRx4MagXNS0rs+gwiTcAvqCRmsD6utzsrzNt+ebm00SNWiC3Q==", "dependencies": { - "acorn": "^6.0.1", - "acorn-walk": "^6.0.1" - } - }, - "node_modules/acorn-globals/node_modules/acorn": { - "version": "6.4.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz", - "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-globals/node_modules/acorn-walk": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-6.2.0.tgz", - "integrity": "sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA==", - "engines": { - "node": ">=0.4.0" + "acorn": "^8.1.0", + "acorn-walk": "^8.0.2" } }, "node_modules/acorn-jsx": { @@ -2090,7 +1899,6 @@ "version": "8.2.0", "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", - "dev": true, "engines": { "node": ">=0.4.0" } @@ -2099,7 +1907,6 @@ "version": "6.0.2", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "dev": true, "dependencies": { "debug": "4" }, @@ -2111,6 +1918,7 @@ "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -2131,22 +1939,6 @@ "node": ">=6" } }, - "node_modules/ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "dev": true, - "peer": true, - "dependencies": { - "type-fest": "^0.21.3" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/ansi-gray": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/ansi-gray/-/ansi-gray-0.1.1.tgz", @@ -2369,7 +2161,9 @@ "node_modules/array-equal": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/array-equal/-/array-equal-1.0.0.tgz", - "integrity": "sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM=" + "integrity": "sha512-H3LU5RLiSsGXPhN+Nipar0iR0IofH+8r89G2y1tBKxQ/agagKyAjhkAFDRBfodP2caPrNKHpAWNIM/c9yeL7uA==", + "dev": true, + "peer": true }, "node_modules/array-find-index": { "version": "1.0.2", @@ -2486,6 +2280,8 @@ "version": "0.2.6", "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", + "dev": true, + "peer": true, "dependencies": { "safer-buffer": "~2.1.0" } @@ -2493,7 +2289,9 @@ "node_modules/assert-plus": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", + "dev": true, + "peer": true, "engines": { "node": ">=0.8" } @@ -2523,6 +2321,38 @@ "dev": true }, "node_modules/async-done": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/async-done/-/async-done-2.0.0.tgz", + "integrity": "sha512-j0s3bzYq9yKIVLKGE/tWlCpa3PfFLcrDZLTSVdnnCTGagXuXBJO4SsY9Xdk/fQBirCkH4evW5xOeJXqlAQFdsw==", + "dev": true, + "dependencies": { + "end-of-stream": "^1.4.4", + "once": "^1.4.0", + "stream-exhaust": "^1.0.2" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/async-each": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", + "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==", + "dev": true + }, + "node_modules/async-settle": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/async-settle/-/async-settle-1.0.0.tgz", + "integrity": "sha1-HQqRS7Aldb7IqPOnTlCA9yssDGs=", + "dev": true, + "dependencies": { + "async-done": "^1.2.2" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/async-settle/node_modules/async-done": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/async-done/-/async-done-1.3.2.tgz", "integrity": "sha512-uYkTP8dw2og1tu1nmza1n1CMW0qb8gWWlwqMmLb7MhBVs4BXrFziT6HXUd+/RlRA/i4H9AkofYloUbs1fwMqlw==", @@ -2537,38 +2367,10 @@ "node": ">= 0.10" } }, - "node_modules/async-each": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", - "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==", - "dev": true - }, - "node_modules/async-exit-hook": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/async-exit-hook/-/async-exit-hook-2.0.1.tgz", - "integrity": "sha512-NW2cX8m1Q7KPA7a5M2ULQeZ2wR5qI5PAbw5L0UOMxdioVk9PMZ0h1TmyZEkPYrCvYjDlFICusOu1dlEKAAeXBw==", - "dev": true, - "peer": true, - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/async-settle": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/async-settle/-/async-settle-1.0.0.tgz", - "integrity": "sha1-HQqRS7Aldb7IqPOnTlCA9yssDGs=", - "dev": true, - "dependencies": { - "async-done": "^1.2.2" - }, - "engines": { - "node": ">= 0.10" - } - }, "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" }, "node_modules/atob": { "version": "2.1.2", @@ -2585,7 +2387,9 @@ "node_modules/aws-sign2": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", + "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==", + "dev": true, + "peer": true, "engines": { "node": "*" } @@ -2593,7 +2397,9 @@ "node_modules/aws4": { "version": "1.11.0", "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", - "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==" + "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==", + "dev": true, + "peer": true }, "node_modules/bach": { "version": "1.2.0", @@ -2615,6 +2421,21 @@ "node": ">= 0.10" } }, + "node_modules/bach/node_modules/async-done": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/async-done/-/async-done-1.3.2.tgz", + "integrity": "sha512-uYkTP8dw2og1tu1nmza1n1CMW0qb8gWWlwqMmLb7MhBVs4BXrFziT6HXUd+/RlRA/i4H9AkofYloUbs1fwMqlw==", + "dev": true, + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.2", + "process-nextick-args": "^2.0.0", + "stream-exhaust": "^1.0.1" + }, + "engines": { + "node": ">= 0.10" + } + }, "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", @@ -2686,7 +2507,9 @@ "node_modules/bcrypt-pbkdf": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", + "dev": true, + "peer": true, "dependencies": { "tweetnacl": "^0.14.3" } @@ -2766,6 +2589,349 @@ "jsdom": "15.2.1" } }, + "node_modules/blockly/node_modules/acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true, + "peer": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/blockly/node_modules/acorn-globals": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-4.3.4.tgz", + "integrity": "sha512-clfQEh21R+D0leSbUdWf3OcfqyaCSAQ8Ryq00bofSekfr9W8u1jyYZo6ir0xu9Gtcf7BjcHJpnbZH7JOCpP60A==", + "dev": true, + "peer": true, + "dependencies": { + "acorn": "^6.0.1", + "acorn-walk": "^6.0.1" + } + }, + "node_modules/blockly/node_modules/acorn-globals/node_modules/acorn": { + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz", + "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==", + "dev": true, + "peer": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/blockly/node_modules/acorn-walk": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-6.2.0.tgz", + "integrity": "sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA==", + "dev": true, + "peer": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/blockly/node_modules/cssom": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", + "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==", + "dev": true, + "peer": true + }, + "node_modules/blockly/node_modules/data-urls": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-1.1.0.tgz", + "integrity": "sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ==", + "dev": true, + "peer": true, + "dependencies": { + "abab": "^2.0.0", + "whatwg-mimetype": "^2.2.0", + "whatwg-url": "^7.0.0" + } + }, + "node_modules/blockly/node_modules/domexception": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/domexception/-/domexception-1.0.1.tgz", + "integrity": "sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug==", + "dev": true, + "peer": true, + "dependencies": { + "webidl-conversions": "^4.0.2" + } + }, + "node_modules/blockly/node_modules/escodegen": { + "version": "1.14.3", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz", + "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==", + "dev": true, + "peer": true, + "dependencies": { + "esprima": "^4.0.1", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=4.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" + } + }, + "node_modules/blockly/node_modules/html-encoding-sniffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz", + "integrity": "sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw==", + "dev": true, + "peer": true, + "dependencies": { + "whatwg-encoding": "^1.0.1" + } + }, + "node_modules/blockly/node_modules/jsdom": { + "version": "15.2.1", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-15.2.1.tgz", + "integrity": "sha512-fAl1W0/7T2G5vURSyxBzrJ1LSdQn6Tr5UX/xD4PXDx/PDgwygedfW6El/KIj3xJ7FU61TTYnc/l/B7P49Eqt6g==", + "dev": true, + "peer": true, + "dependencies": { + "abab": "^2.0.0", + "acorn": "^7.1.0", + "acorn-globals": "^4.3.2", + "array-equal": "^1.0.0", + "cssom": "^0.4.1", + "cssstyle": "^2.0.0", + "data-urls": "^1.1.0", + "domexception": "^1.0.1", + "escodegen": "^1.11.1", + "html-encoding-sniffer": "^1.0.2", + "nwsapi": "^2.2.0", + "parse5": "5.1.0", + "pn": "^1.1.0", + "request": "^2.88.0", + "request-promise-native": "^1.0.7", + "saxes": "^3.1.9", + "symbol-tree": "^3.2.2", + "tough-cookie": "^3.0.1", + "w3c-hr-time": "^1.0.1", + "w3c-xmlserializer": "^1.1.2", + "webidl-conversions": "^4.0.2", + "whatwg-encoding": "^1.0.5", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^7.0.0", + "ws": "^7.0.0", + "xml-name-validator": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "peerDependencies": { + "canvas": "^2.5.0" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } + } + }, + "node_modules/blockly/node_modules/levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", + "dev": true, + "peer": true, + "dependencies": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/blockly/node_modules/optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "dev": true, + "peer": true, + "dependencies": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/blockly/node_modules/parse5": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.0.tgz", + "integrity": "sha512-fxNG2sQjHvlVAYmzBZS9YlDp6PTSSDwa98vkD4QgVDDCAo84z5X1t5XyJQ62ImdLXx5NdIIfihey6xpum9/gRQ==", + "dev": true, + "peer": true + }, + "node_modules/blockly/node_modules/prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", + "dev": true, + "peer": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/blockly/node_modules/saxes": { + "version": "3.1.11", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-3.1.11.tgz", + "integrity": "sha512-Ydydq3zC+WYDJK1+gRxRapLIED9PWeSuuS41wqyoRmzvhhh9nc+QQrVMKJYzJFULazeGhzSV0QleN2wD3boh2g==", + "dev": true, + "peer": true, + "dependencies": { + "xmlchars": "^2.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/blockly/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "optional": true, + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/blockly/node_modules/tough-cookie": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-3.0.1.tgz", + "integrity": "sha512-yQyJ0u4pZsv9D4clxO69OEjLWYw+jbgspjTue4lTQZLfV0c5l1VmK2y1JK8E9ahdpltPOaAThPcp5nKPUgSnsg==", + "dev": true, + "peer": true, + "dependencies": { + "ip-regex": "^2.1.0", + "psl": "^1.1.28", + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/blockly/node_modules/tr46": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", + "integrity": "sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==", + "dev": true, + "peer": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/blockly/node_modules/type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", + "dev": true, + "peer": true, + "dependencies": { + "prelude-ls": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/blockly/node_modules/w3c-xmlserializer": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-1.1.2.tgz", + "integrity": "sha512-p10l/ayESzrBMYWRID6xbuCKh2Fp77+sA0doRuGn4tTIMrrZVeqfpKjXHY+oDh3K4nLdPgNwMTVP6Vp4pvqbNg==", + "dev": true, + "peer": true, + "dependencies": { + "domexception": "^1.0.1", + "webidl-conversions": "^4.0.2", + "xml-name-validator": "^3.0.0" + } + }, + "node_modules/blockly/node_modules/webidl-conversions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", + "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", + "dev": true, + "peer": true + }, + "node_modules/blockly/node_modules/whatwg-encoding": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", + "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", + "dev": true, + "peer": true, + "dependencies": { + "iconv-lite": "0.4.24" + } + }, + "node_modules/blockly/node_modules/whatwg-mimetype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", + "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==", + "dev": true, + "peer": true + }, + "node_modules/blockly/node_modules/whatwg-url": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", + "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", + "dev": true, + "peer": true, + "dependencies": { + "lodash.sortby": "^4.7.0", + "tr46": "^1.0.1", + "webidl-conversions": "^4.0.2" + } + }, + "node_modules/blockly/node_modules/ws": { + "version": "7.5.9", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", + "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", + "dev": true, + "peer": true, + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/blockly/node_modules/xml-name-validator": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", + "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==", + "dev": true, + "peer": true + }, "node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -2791,7 +2957,9 @@ "node_modules/browser-process-hrtime": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", - "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==" + "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==", + "dev": true, + "peer": true }, "node_modules/browser-stdout": { "version": "1.3.1", @@ -2862,215 +3030,6 @@ "node": ">= 0.8" } }, - "node_modules/cac": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/cac/-/cac-3.0.4.tgz", - "integrity": "sha1-bSTO7Dcu/lybeYgIvH9JtHJCpO8=", - "dev": true, - "peer": true, - "dependencies": { - "camelcase-keys": "^3.0.0", - "chalk": "^1.1.3", - "indent-string": "^3.0.0", - "minimist": "^1.2.0", - "read-pkg-up": "^1.0.1", - "suffix": "^0.1.0", - "text-table": "^0.2.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/cac/node_modules/ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true, - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/cac/node_modules/camelcase": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", - "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", - "dev": true, - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/cac/node_modules/camelcase-keys": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-3.0.0.tgz", - "integrity": "sha1-/AxsNgNj9zd+N5O5oWvM8QcMHKQ=", - "dev": true, - "peer": true, - "dependencies": { - "camelcase": "^3.0.0", - "map-obj": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/cac/node_modules/chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "peer": true, - "dependencies": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/cac/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true, - "peer": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/cac/node_modules/find-up": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", - "dev": true, - "peer": true, - "dependencies": { - "path-exists": "^2.0.0", - "pinkie-promise": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/cac/node_modules/hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "dev": true, - "peer": true - }, - "node_modules/cac/node_modules/indent-string": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz", - "integrity": "sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=", - "dev": true, - "peer": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/cac/node_modules/map-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", - "dev": true, - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/cac/node_modules/normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "dev": true, - "peer": true, - "dependencies": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "node_modules/cac/node_modules/path-exists": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", - "dev": true, - "peer": true, - "dependencies": { - "pinkie-promise": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/cac/node_modules/read-pkg": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", - "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", - "dev": true, - "peer": true, - "dependencies": { - "load-json-file": "^1.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/cac/node_modules/read-pkg-up": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", - "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", - "dev": true, - "peer": true, - "dependencies": { - "find-up": "^1.0.0", - "read-pkg": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/cac/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true, - "peer": true, - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/cac/node_modules/strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "peer": true, - "dependencies": { - "ansi-regex": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/cac/node_modules/supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true, - "peer": true, - "engines": { - "node": ">=0.8.0" - } - }, "node_modules/cache-base": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", @@ -3178,17 +3137,19 @@ "node_modules/caseless": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==", + "dev": true, + "peer": true }, "node_modules/chai": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.6.tgz", - "integrity": "sha512-bbcp3YfHCUzMOvKqsztczerVgBKSsEijCySNlHHbX3VG1nskvqjz5Rfso1gGwD6w6oOV3eI60pKuMOV5MV7p3Q==", + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.7.tgz", + "integrity": "sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A==", "dev": true, "dependencies": { "assertion-error": "^1.1.0", "check-error": "^1.0.2", - "deep-eql": "^3.0.1", + "deep-eql": "^4.1.2", "get-func-name": "^2.0.0", "loupe": "^2.3.1", "pathval": "^1.1.1", @@ -3214,13 +3175,6 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/chardet": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", - "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", - "dev": true, - "peer": true - }, "node_modules/check-error": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", @@ -3264,9 +3218,9 @@ "dev": true }, "node_modules/chrome-launcher": { - "version": "0.15.0", - "resolved": "https://registry.npmjs.org/chrome-launcher/-/chrome-launcher-0.15.0.tgz", - "integrity": "sha512-ZQqX5kb9H0+jy1OqLnWampfocrtSZaGl7Ny3F9GRha85o4odbL8x55paUzh51UC7cEmZ5obp3H2Mm70uC2PpRA==", + "version": "0.15.1", + "resolved": "https://registry.npmjs.org/chrome-launcher/-/chrome-launcher-0.15.1.tgz", + "integrity": "sha512-UugC8u59/w2AyX5sHLZUHoxBAiSiunUhZa3zZwMH6zPVis0C3dDKiRWyUGIo14tTbZHGVviWxv3PQWZ7taZ4fg==", "dev": true, "dependencies": { "@types/node": "*", @@ -3406,42 +3360,6 @@ "timers-ext": "^0.1.5" } }, - "node_modules/cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", - "dev": true, - "peer": true, - "dependencies": { - "restore-cursor": "^3.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cli-spinners": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.6.1.tgz", - "integrity": "sha512-x/5fWmGMnbKQAaNwN+UZlV79qBLM9JFnJuJ03gIi5whrob0xV0ofNVHy9DhwGdsMJQc2OKv0oGmLzvaqvAVv+g==", - "dev": true, - "peer": true, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cli-width": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", - "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", - "dev": true, - "peer": true, - "engines": { - "node": ">= 10" - } - }, "node_modules/cliui": { "version": "7.0.4", "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", @@ -3722,9 +3640,9 @@ } }, "node_modules/concurrently": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-7.4.0.tgz", - "integrity": "sha512-M6AfrueDt/GEna/Vg9BqQ+93yuvzkSKmoTixnwEJkH0LlcGrRC2eCmjeG1tLLHIYfpYJABokqSGyMcXjm96AFA==", + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-7.6.0.tgz", + "integrity": "sha512-BKtRgvcJGeZ4XttiDiNcFiRlxoAeZOseqUvyYRUp/Vtd+9p1ULmeoSqGsDA+2ivdeDFpqrJvGvmI+StKfKl5hw==", "dev": true, "dependencies": { "chalk": "^4.1.0", @@ -3914,9 +3832,9 @@ } }, "node_modules/cssom": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", - "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==" + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.5.0.tgz", + "integrity": "sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==" }, "node_modules/cssstyle": { "version": "2.3.0", @@ -3947,7 +3865,9 @@ "node_modules/dashdash": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", + "dev": true, + "peer": true, "dependencies": { "assert-plus": "^1.0.0" }, @@ -3962,13 +3882,16 @@ "dev": true }, "node_modules/data-urls": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-1.1.0.tgz", - "integrity": "sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-3.0.2.tgz", + "integrity": "sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ==", "dependencies": { - "abab": "^2.0.0", - "whatwg-mimetype": "^2.2.0", - "whatwg-url": "^7.0.0" + "abab": "^2.0.6", + "whatwg-mimetype": "^3.0.0", + "whatwg-url": "^11.0.0" + }, + "engines": { + "node": ">=12" } }, "node_modules/date-fns": { @@ -3997,7 +3920,6 @@ "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, "dependencies": { "ms": "2.1.2" }, @@ -4061,10 +3983,15 @@ "node": ">=0.10.0" } }, + "node_modules/decimal.js": { + "version": "10.4.2", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.2.tgz", + "integrity": "sha512-ic1yEvwT6GuvaYwBLLY6/aFFgjZdySKTE8en/fkU3QICTmRtgtSlFn0u0BXN06InZwtfCelR7j8LRiDI/02iGA==" + }, "node_modules/decode-uri-component": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", - "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz", + "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==", "dev": true, "engines": { "node": ">=0.10" @@ -4098,15 +4025,15 @@ } }, "node_modules/deep-eql": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", - "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.2.tgz", + "integrity": "sha512-gT18+YW4CcW/DBNTwAmqTtkJh7f9qqScu2qFVlx7kCoeY9tlBu9cUcr7+I+Z/noG8INehS3xQgLpTtd/QUTn4w==", "dev": true, "dependencies": { "type-detect": "^4.0.0" }, "engines": { - "node": ">=0.12" + "node": ">=6" } }, "node_modules/deep-extend": { @@ -4123,13 +4050,13 @@ "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==" }, - "node_modules/deepmerge": { + "node_modules/deepmerge-ts": { "version": "4.2.2", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", - "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", + "resolved": "https://registry.npmjs.org/deepmerge-ts/-/deepmerge-ts-4.2.2.tgz", + "integrity": "sha512-Ka3Kb21tiWjvQvS9U+1Dx+aqFAHsdTnMdYptLTmC2VAmDFMugWMY1e15aTODstipmCun8iNuqeSfcx6rsUUk0Q==", "dev": true, "engines": { - "node": ">=0.10.0" + "node": ">=12.4.0" } }, "node_modules/default-compare": { @@ -4153,26 +4080,6 @@ "node": ">= 0.10" } }, - "node_modules/defaults": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", - "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=", - "dev": true, - "peer": true, - "dependencies": { - "clone": "^1.0.2" - } - }, - "node_modules/defaults/node_modules/clone": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", - "dev": true, - "peer": true, - "engines": { - "node": ">=0.8" - } - }, "node_modules/defer-to-connect": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", @@ -4210,7 +4117,7 @@ "node_modules/delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", "engines": { "node": ">=0.4.0" } @@ -4234,114 +4141,80 @@ } }, "node_modules/devtools": { - "version": "7.25.1", - "resolved": "https://registry.npmjs.org/devtools/-/devtools-7.25.1.tgz", - "integrity": "sha512-01T8QZeiD92MpI/7rP8kUflN3XcMqv2moa07123OjjENuuOhYxRWmJ7xj94txnF5PJp1Cv8/jvK8EUbnEHf6MQ==", + "version": "8.0.11", + "resolved": "https://registry.npmjs.org/devtools/-/devtools-8.0.11.tgz", + "integrity": "sha512-qDe9RBgbDQNhVCE2GgNFUYeOQ9BDrTz3HxMVhv/1djyILkBd/dRoYUVgPsiIIWwtsoe/8gAh05sbYkwL1uTJvQ==", "dev": true, "dependencies": { - "@types/node": "^18.0.0", "@types/ua-parser-js": "^0.7.33", - "@wdio/config": "7.25.1", - "@wdio/logger": "7.19.0", - "@wdio/protocols": "7.22.0", - "@wdio/types": "7.25.1", - "@wdio/utils": "7.25.1", + "@wdio/config": "8.0.11", + "@wdio/logger": "8.0.0", + "@wdio/protocols": "8.0.0", + "@wdio/types": "8.0.11", + "@wdio/utils": "8.0.11", "chrome-launcher": "^0.15.0", "edge-paths": "^2.1.0", - "puppeteer-core": "^13.1.3", + "import-meta-resolve": "^2.1.0", + "puppeteer-core": "19.4.0", "query-selector-shadow-dom": "^1.0.0", "ua-parser-js": "^1.0.1", - "uuid": "^9.0.0" + "uuid": "^9.0.0", + "which": "^3.0.0" }, "engines": { - "node": ">=12.0.0" + "node": "^16.13 || >=18" } }, "node_modules/devtools-protocol": { - "version": "0.0.1056733", - "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1056733.tgz", - "integrity": "sha512-CmTu6SQx2g3TbZzDCAV58+LTxVdKplS7xip0g5oDXpZ+isr0rv5dDP8ToyVRywzPHkCCPKgKgScEcwz4uPWDIA==", - "dev": true - }, - "node_modules/devtools/node_modules/@types/node": { - "version": "18.8.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.8.0.tgz", - "integrity": "sha512-u+h43R6U8xXDt2vzUaVP3VwjjLyOJk6uEciZS8OSyziUQGOwmk+l+4drxcsDboHXwyTaqS1INebghmWMRxq3LA==", + "version": "0.0.1078443", + "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1078443.tgz", + "integrity": "sha512-a/rOMs0PrCtcJ6RKPSK5JdFqQoitF5ZeKr+YscKYpuwkzPoFr470CU8+jrej0hpVgRpqg+K0wfAkWiGB7MkhHg==", "dev": true }, "node_modules/devtools/node_modules/@wdio/config": { - "version": "7.25.1", - "resolved": "https://registry.npmjs.org/@wdio/config/-/config-7.25.1.tgz", - "integrity": "sha512-7I3L+TE75gvh8jiv8cE/Ch9S9erDgrZG9o5587OlNKfpgFciT7DH7/efPXzYwh8YPFV3grFaydxaaoYzDv6PDA==", + "version": "8.0.11", + "resolved": "https://registry.npmjs.org/@wdio/config/-/config-8.0.11.tgz", + "integrity": "sha512-LR8n6TJfDzVtDmuge4EjOHiJKae73ZyvEwTQq3tokovRIbIMaVkfsRV9iqEZiRgohy14ehAREwNgn67j77ucYA==", "dev": true, "dependencies": { - "@wdio/logger": "7.19.0", - "@wdio/types": "7.25.1", - "@wdio/utils": "7.25.1", - "deepmerge": "^4.0.0", - "glob": "^8.0.3" + "@wdio/logger": "8.0.0", + "@wdio/types": "8.0.11", + "@wdio/utils": "8.0.11", + "decamelize": "^6.0.0", + "deepmerge-ts": "^4.2.2", + "glob": "^8.0.3", + "import-meta-resolve": "^2.1.0", + "read-pkg-up": "^9.1.0" }, "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/devtools/node_modules/@wdio/logger": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@wdio/logger/-/logger-7.19.0.tgz", - "integrity": "sha512-xR7SN/kGei1QJD1aagzxs3KMuzNxdT/7LYYx+lt6BII49+fqL/SO+5X0FDCZD0Ds93AuQvvz9eGyzrBI2FFXmQ==", - "dev": true, - "dependencies": { - "chalk": "^4.0.0", - "loglevel": "^1.6.0", - "loglevel-plugin-prefix": "^0.8.4", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/devtools/node_modules/@wdio/protocols": { - "version": "7.22.0", - "resolved": "https://registry.npmjs.org/@wdio/protocols/-/protocols-7.22.0.tgz", - "integrity": "sha512-8EXRR+Ymdwousm/VGtW3H1hwxZ/1g1H99A1lF0U4GuJ5cFWHCd0IVE5H31Z52i8ZruouW8jueMkGZPSo2IIUSQ==", - "dev": true, - "engines": { - "node": ">=12.0.0" + "node": "^16.13 || >=18" } }, "node_modules/devtools/node_modules/@wdio/types": { - "version": "7.25.1", - "resolved": "https://registry.npmjs.org/@wdio/types/-/types-7.25.1.tgz", - "integrity": "sha512-9Xt2U0YXYxRW4UvMFwjt+44UkfhwrI1gPhW+y56SubpyKaUfdNGberteboQoR/7Os1SVtJry4FohEZNmFzPK6g==", + "version": "8.0.11", + "resolved": "https://registry.npmjs.org/@wdio/types/-/types-8.0.11.tgz", + "integrity": "sha512-54xbajB7tqWmYPXFI0ALupPauwLyVtPSZSG/R/DPlY25p+Ygw4jwH64s+Jh1V3TZYnktfv4cIt1Bw/M35cBgOQ==", "dev": true, "dependencies": { - "@types/node": "^18.0.0", - "got": "^11.8.1" + "@types/node": "^18.0.0" }, "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "typescript": "^4.6.2" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "node": "^16.13 || >=18" } }, "node_modules/devtools/node_modules/@wdio/utils": { - "version": "7.25.1", - "resolved": "https://registry.npmjs.org/@wdio/utils/-/utils-7.25.1.tgz", - "integrity": "sha512-DL+nDRVgzruJLhedBUQEMUcojLoGwsjCQCYWram4NfwAIIkxcAX/5Y4vHSut3OoW2bEHl3R8/FQ4B/ivIr2EoQ==", + "version": "8.0.11", + "resolved": "https://registry.npmjs.org/@wdio/utils/-/utils-8.0.11.tgz", + "integrity": "sha512-4nIYt1KP4IVIYfnld+Kbh/l85o7VK4roAEIfiHV374utPpspzV+eli4ANX2fEOGVUVJMVNBCN/sCsL8u3DsPpw==", "dev": true, "dependencies": { - "@wdio/logger": "7.19.0", - "@wdio/types": "7.25.1", + "@wdio/logger": "8.0.0", + "@wdio/types": "8.0.11", + "import-meta-resolve": "^2.2.0", "p-iteration": "^1.1.8" }, "engines": { - "node": ">=12.0.0" + "node": "^16.13 || >=18" } }, "node_modules/devtools/node_modules/brace-expansion": { @@ -4353,6 +4226,34 @@ "balanced-match": "^1.0.0" } }, + "node_modules/devtools/node_modules/decamelize": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-6.0.0.tgz", + "integrity": "sha512-Fv96DCsdOgB6mdGl67MT5JaTNKRzrzill5OH5s8bjYJXVlcXyPYGyPsUkWyGV5p1TXI5esYIYMMeDJL0hEIwaA==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/devtools/node_modules/find-up": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz", + "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==", + "dev": true, + "dependencies": { + "locate-path": "^7.1.0", + "path-exists": "^5.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/devtools/node_modules/glob": { "version": "8.0.3", "resolved": "https://registry.npmjs.org/glob/-/glob-8.0.3.tgz", @@ -4372,10 +4273,25 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/devtools/node_modules/locate-path": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.1.1.tgz", + "integrity": "sha512-vJXaRMJgRVD3+cUZs3Mncj2mxpt5mP0EmNOsxRSZRMlbqjvxzDEOIUWXGmavo0ZC9+tNZCBLQ66reA11nbpHZg==", + "dev": true, + "dependencies": { + "p-locate": "^6.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/devtools/node_modules/minimatch": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.0.tgz", - "integrity": "sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.1.tgz", + "integrity": "sha512-362NP+zlprccbEt/SkxKfRMHnNY85V74mVnpUpNyr3F35covl09Kec7/sEFLt3RA4oXmewtoaanoIf67SE5Y5g==", "dev": true, "dependencies": { "brace-expansion": "^2.0.1" @@ -4384,6 +4300,80 @@ "node": ">=10" } }, + "node_modules/devtools/node_modules/p-limit": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", + "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^1.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/devtools/node_modules/p-locate": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", + "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", + "dev": true, + "dependencies": { + "p-limit": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/devtools/node_modules/path-exists": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", + "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, + "node_modules/devtools/node_modules/read-pkg": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-7.1.0.tgz", + "integrity": "sha512-5iOehe+WF75IccPc30bWTbpdDQLOCc3Uu8bi3Dte3Eueij81yx1Mrufk8qBx/YAbR4uL1FdUr+7BKXDwEtisXg==", + "dev": true, + "dependencies": { + "@types/normalize-package-data": "^2.4.1", + "normalize-package-data": "^3.0.2", + "parse-json": "^5.2.0", + "type-fest": "^2.0.0" + }, + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/devtools/node_modules/read-pkg-up": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-9.1.0.tgz", + "integrity": "sha512-vaMRR1AC1nrd5CQM0PhlRsO5oc2AAigqr7cCrZ/MW/Rsaflz4RlgzkpL4qoU/z1F6wrbd85iFv1OQj/y5RdGvg==", + "dev": true, + "dependencies": { + "find-up": "^6.3.0", + "read-pkg": "^7.1.0", + "type-fest": "^2.5.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/devtools/node_modules/uuid": { "version": "9.0.0", "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz", @@ -4393,6 +4383,43 @@ "uuid": "dist/bin/uuid" } }, + "node_modules/devtools/node_modules/which": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/which/-/which-3.0.0.tgz", + "integrity": "sha512-nla//68K9NU6yRiwDY/Q8aU6siKlSs64aEC7+IV56QoAuyQT2ovsJcgGYGyqMOmI/CGN1BOR6mM5EN0FBO+zyQ==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/devtools/node_modules/yocto-queue": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", + "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", + "dev": true, + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/diff-sequences": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.3.1.tgz", + "integrity": "sha512-hlM3QR272NXCi4pq+N4Kok4kOp6EsgOM3ZSpJI7Da3UAs+Ttsi8MRmB6trM/lhyzUxGfOgnpkHtgqm5Q/CTcfQ==", + "dev": true, + "optional": true, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, "node_modules/dir-glob": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", @@ -4427,11 +4454,14 @@ } }, "node_modules/domexception": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/domexception/-/domexception-1.0.1.tgz", - "integrity": "sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/domexception/-/domexception-4.0.0.tgz", + "integrity": "sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw==", "dependencies": { - "webidl-conversions": "^4.0.2" + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=12" } }, "node_modules/duplexer": { @@ -4516,7 +4546,9 @@ "node_modules/ecc-jsbn": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", + "dev": true, + "peer": true, "dependencies": { "jsbn": "~0.1.0", "safer-buffer": "^2.1.0" @@ -4532,22 +4564,6 @@ "which": "^2.0.2" } }, - "node_modules/ejs": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.6.tgz", - "integrity": "sha512-9lt9Zse4hPucPkoP7FHDF0LQAlGyF9JVpnClFLFH3aSSbxmyoqINRpp/9wePWJTUl4KOQwRL72Iw3InHPDkoGw==", - "dev": true, - "peer": true, - "dependencies": { - "jake": "^10.6.1" - }, - "bin": { - "ejs": "bin/cli.js" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", @@ -4563,6 +4579,17 @@ "once": "^1.4.0" } }, + "node_modules/entities": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.4.0.tgz", + "integrity": "sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA==", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, "node_modules/error-ex": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", @@ -4638,12 +4665,12 @@ } }, "node_modules/escodegen": { - "version": "1.14.3", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz", - "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.0.0.tgz", + "integrity": "sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==", "dependencies": { "esprima": "^4.0.1", - "estraverse": "^4.2.0", + "estraverse": "^5.2.0", "esutils": "^2.0.2", "optionator": "^0.8.1" }, @@ -4652,16 +4679,24 @@ "esgenerate": "bin/esgenerate.js" }, "engines": { - "node": ">=4.0" + "node": ">=6.0" }, "optionalDependencies": { "source-map": "~0.6.1" } }, + "node_modules/escodegen/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "engines": { + "node": ">=4.0" + } + }, "node_modules/escodegen/node_modules/levn": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", "dependencies": { "prelude-ls": "~1.1.2", "type-check": "~0.3.2" @@ -4689,7 +4724,7 @@ "node_modules/escodegen/node_modules/prelude-ls": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", + "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", "engines": { "node": ">= 0.8.0" } @@ -4706,7 +4741,7 @@ "node_modules/escodegen/node_modules/type-check": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", "dependencies": { "prelude-ls": "~1.1.2" }, @@ -4715,14 +4750,15 @@ } }, "node_modules/eslint": { - "version": "8.25.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.25.0.tgz", - "integrity": "sha512-DVlJOZ4Pn50zcKW5bYH7GQK/9MsoQG2d5eDH0ebEkE8PbgzTTmtt/VTH9GGJ4BfeZCpBLqFfvsjX35UacUL83A==", + "version": "8.29.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.29.0.tgz", + "integrity": "sha512-isQ4EEiyUjZFbEKvEGJKKGBwXtvXX+zJbkVKCgTuB9t/+jUBcy8avhkEwWJecI15BkRkOYmvIM5ynbhRjEkoeg==", "dev": true, "dependencies": { "@eslint/eslintrc": "^1.3.3", - "@humanwhocodes/config-array": "^0.10.5", + "@humanwhocodes/config-array": "^0.11.6", "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", "ajv": "^6.10.0", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", @@ -4738,14 +4774,14 @@ "fast-deep-equal": "^3.1.3", "file-entry-cache": "^6.0.1", "find-up": "^5.0.0", - "glob-parent": "^6.0.1", + "glob-parent": "^6.0.2", "globals": "^13.15.0", - "globby": "^11.1.0", "grapheme-splitter": "^1.0.4", "ignore": "^5.2.0", "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", "js-sdsl": "^4.1.4", "js-yaml": "^4.1.0", "json-stable-stringify-without-jsonify": "^1.0.1", @@ -4782,21 +4818,21 @@ } }, "node_modules/eslint-plugin-jsdoc": { - "version": "39.3.6", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-39.3.6.tgz", - "integrity": "sha512-R6dZ4t83qPdMhIOGr7g2QII2pwCjYyKP+z0tPOfO1bbAbQyKC20Y2Rd6z1te86Lq3T7uM8bNo+VD9YFpE8HU/g==", + "version": "39.6.4", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-39.6.4.tgz", + "integrity": "sha512-fskvdLCfwmPjHb6e+xNGDtGgbF8X7cDwMtVLAP2WwSf9Htrx68OAx31BESBM1FAwsN2HTQyYQq7m4aW4Q4Nlag==", "dev": true, "dependencies": { - "@es-joy/jsdoccomment": "~0.31.0", + "@es-joy/jsdoccomment": "~0.36.1", "comment-parser": "1.3.1", "debug": "^4.3.4", "escape-string-regexp": "^4.0.0", "esquery": "^1.4.0", - "semver": "^7.3.7", + "semver": "^7.3.8", "spdx-expression-parse": "^3.0.1" }, "engines": { - "node": "^14 || ^16 || ^17 || ^18" + "node": "^14 || ^16 || ^17 || ^18 || ^19" }, "peerDependencies": { "eslint": "^7.0.0 || ^8.0.0" @@ -4872,18 +4908,6 @@ "node": ">=10.13.0" } }, - "node_modules/eslint/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, "node_modules/espree": { "version": "9.4.0", "resolved": "https://registry.npmjs.org/espree/-/espree-9.4.0.tgz", @@ -4959,6 +4983,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, "engines": { "node": ">=4.0" } @@ -5160,6 +5185,41 @@ "node": ">=0.10.0" } }, + "node_modules/expect": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/expect/-/expect-29.3.1.tgz", + "integrity": "sha512-gGb1yTgU30Q0O/tQq+z30KBWv24ApkMgFUpvKBkyLUBL68Wv8dHdJxTBZFl/iT8K/bqDHvUYRH6IIN3rToopPA==", + "dev": true, + "optional": true, + "dependencies": { + "@jest/expect-utils": "^29.3.1", + "jest-get-type": "^29.2.0", + "jest-matcher-utils": "^29.3.1", + "jest-message-util": "^29.3.1", + "jest-util": "^29.3.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/expect-webdriverio": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/expect-webdriverio/-/expect-webdriverio-4.0.1.tgz", + "integrity": "sha512-+FhdO0w/HI0ur4OnVphuGPU/E3rXlLqfSjiABfMgd1jw+X2tQxGU63bCUA2GlocWl5/ZuVmV/ulEd8pYgniWYg==", + "dev": true, + "optional": true, + "dependencies": { + "expect": "^29.3.1", + "jest-matcher-utils": "^29.3.1" + }, + "engines": { + "node": ">=16 || >=18 || >=20" + }, + "optionalDependencies": { + "@wdio/globals": "^8.0.0-alpha.505", + "webdriverio": "^8.0.0-alpha.505" + } + }, "node_modules/ext": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/ext/-/ext-1.6.0.tgz", @@ -5178,7 +5238,8 @@ "node_modules/extend": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true }, "node_modules/extend-shallow": { "version": "3.0.2", @@ -5193,21 +5254,6 @@ "node": ">=0.10.0" } }, - "node_modules/external-editor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", - "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", - "dev": true, - "peer": true, - "dependencies": { - "chardet": "^0.7.0", - "iconv-lite": "^0.4.24", - "tmp": "^0.0.33" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/extglob": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", @@ -5283,10 +5329,12 @@ "node_modules/extsprintf": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", + "dev": true, "engines": [ "node >=0.6.0" - ] + ], + "peer": true }, "node_modules/fancy-log": { "version": "1.3.3", @@ -5306,7 +5354,8 @@ "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true }, "node_modules/fast-glob": { "version": "3.2.11", @@ -5340,7 +5389,8 @@ "node_modules/fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true }, "node_modules/fast-levenshtein": { "version": "2.0.6", @@ -5371,32 +5421,6 @@ "pend": "~1.2.0" } }, - "node_modules/figures": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", - "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", - "dev": true, - "peer": true, - "dependencies": { - "escape-string-regexp": "^1.0.5" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/figures/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true, - "peer": true, - "engines": { - "node": ">=0.8.0" - } - }, "node_modules/file-entry-cache": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", @@ -5416,16 +5440,6 @@ "dev": true, "optional": true }, - "node_modules/filelist": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.2.tgz", - "integrity": "sha512-z7O0IS8Plc39rTCq6i6iHxk43duYOn8uFJiWSewIq0Bww1RNybVHSCjahmcC87ZqAm4OTvFzlzeGu3XAzG1ctQ==", - "dev": true, - "peer": true, - "dependencies": { - "minimatch": "^3.0.4" - } - }, "node_modules/fill-range": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", @@ -5610,22 +5624,33 @@ "node_modules/forever-agent": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", + "dev": true, + "peer": true, "engines": { "node": "*" } }, "node_modules/form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", "dependencies": { "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", + "combined-stream": "^1.0.8", "mime-types": "^2.1.12" }, "engines": { - "node": ">= 0.12" + "node": ">= 6" + } + }, + "node_modules/form-data-encoder": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-2.1.4.tgz", + "integrity": "sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw==", + "dev": true, + "engines": { + "node": ">= 14.17" } }, "node_modules/fragment-cache": { @@ -5763,19 +5788,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/get-port": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/get-port/-/get-port-5.1.1.tgz", - "integrity": "sha512-g/Q1aTSDOxFpchXC4i8ZWvxA1lnPqx/JHqcpIw0/LX9T8x/GBbi6YnlN5nhaKIFkT8oFsscUKgDJYxfwfS6QsQ==", - "dev": true, - "peer": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/get-stream": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", @@ -5803,7 +5815,9 @@ "node_modules/getpass": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", + "dev": true, + "peer": true, "dependencies": { "assert-plus": "^1.0.0" } @@ -5923,6 +5937,21 @@ "node": ">=0.10.0" } }, + "node_modules/glob-watcher/node_modules/async-done": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/async-done/-/async-done-1.3.2.tgz", + "integrity": "sha512-uYkTP8dw2og1tu1nmza1n1CMW0qb8gWWlwqMmLb7MhBVs4BXrFziT6HXUd+/RlRA/i4H9AkofYloUbs1fwMqlw==", + "dev": true, + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.2", + "process-nextick-args": "^2.0.0", + "stream-exhaust": "^1.0.1" + }, + "engines": { + "node": ">= 0.10" + } + }, "node_modules/glob-watcher/node_modules/binary-extensions": { "version": "1.13.1", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", @@ -6267,9 +6296,9 @@ ] }, "node_modules/google-closure-deps": { - "version": "20221004.0.0", - "resolved": "https://registry.npmjs.org/google-closure-deps/-/google-closure-deps-20221004.0.0.tgz", - "integrity": "sha512-lbbhlL4/UMOSSzm91v9/pK3/wHBnzZ4rs8n38L8YybS9E5+3uJJ350oTVaj5qEfv3B+JEMvngOuA+spsEaMIdg==", + "version": "20221102.0.0", + "resolved": "https://registry.npmjs.org/google-closure-deps/-/google-closure-deps-20221102.0.0.tgz", + "integrity": "sha512-6AOcHk8u5DNY/uhJLyHj0M4GLTkqAhscH7iH66QUxSiUlrg55PWdyaWQa4Jg15p4xUWNPf8NFBe6vIdwzwi0Hw==", "dev": true, "dependencies": { "minimatch": "^3.0.4", @@ -6333,9 +6362,9 @@ } }, "node_modules/graceful-fs": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz", - "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==", + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", "dev": true }, "node_modules/grapheme-splitter": { @@ -7109,7 +7138,9 @@ "node_modules/har-schema": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", + "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==", + "dev": true, + "peer": true, "engines": { "node": ">=4" } @@ -7119,6 +7150,8 @@ "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", "deprecated": "this library is no longer supported", + "dev": true, + "peer": true, "dependencies": { "ajv": "^6.12.3", "har-schema": "^2.0.0" @@ -7269,7 +7302,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz", "integrity": "sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==", - "dev": true, "dependencies": { "whatwg-encoding": "^2.0.0" }, @@ -7297,6 +7329,19 @@ "node": ">=8.0.0" } }, + "node_modules/http-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", + "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", + "dependencies": { + "@tootallnate/once": "2", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/http-server": { "version": "14.1.1", "resolved": "https://registry.npmjs.org/http-server/-/http-server-14.1.1.tgz", @@ -7327,7 +7372,9 @@ "node_modules/http-signature": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==", + "dev": true, + "peer": true, "dependencies": { "assert-plus": "^1.0.0", "jsprim": "^1.2.2", @@ -7352,10 +7399,9 @@ } }, "node_modules/https-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", - "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", - "dev": true, + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", "dependencies": { "agent-base": "6", "debug": "4" @@ -7368,6 +7414,8 @@ "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "peer": true, "dependencies": { "safer-buffer": ">= 2.1.2 < 3" }, @@ -7429,6 +7477,16 @@ "node": ">=8" } }, + "node_modules/import-meta-resolve": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-2.2.0.tgz", + "integrity": "sha512-CpPOtiCHxP9HdtDM5F45tNiAe66Cqlv3f5uHoJjt+KlaLrUh9/Wz9vepADZ78SlqEo62aDWZtj9ydMGXV+CPnw==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", @@ -7469,32 +7527,6 @@ "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", "dev": true }, - "node_modules/inquirer": { - "version": "8.1.5", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.1.5.tgz", - "integrity": "sha512-G6/9xUqmt/r+UvufSyrPpt84NYwhKZ9jLsgMbQzlx804XErNupor8WQdBnBRrXmBfTPpuwf1sV+ss2ovjgdXIg==", - "dev": true, - "peer": true, - "dependencies": { - "ansi-escapes": "^4.2.1", - "chalk": "^4.1.1", - "cli-cursor": "^3.1.0", - "cli-width": "^3.0.0", - "external-editor": "^3.0.3", - "figures": "^3.0.0", - "lodash": "^4.17.21", - "mute-stream": "0.0.8", - "ora": "^5.4.1", - "run-async": "^2.4.0", - "rxjs": "^7.2.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0", - "through": "^2.3.6" - }, - "engines": { - "node": ">=8.0.0" - } - }, "node_modules/interpret": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", @@ -7516,7 +7548,9 @@ "node_modules/ip-regex": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", - "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=", + "integrity": "sha512-58yWmlHpp7VYfcdTwMTvwMmqx/Elfxjd9RXTDyMsbL7lLWmhMylLEqiYVLKuLzOZqVgiWXD9MfR62Vv89VRxkw==", + "dev": true, + "peer": true, "engines": { "node": ">=4" } @@ -7716,16 +7750,6 @@ "node": ">=0.10.0" } }, - "node_modules/is-interactive": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", - "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", - "dev": true, - "peer": true, - "engines": { - "node": ">=8" - } - }, "node_modules/is-negated-glob": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-negated-glob/-/is-negated-glob-1.0.0.tgz", @@ -7759,6 +7783,15 @@ "node": ">=0.10.0" } }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/is-plain-obj": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", @@ -7786,6 +7819,11 @@ "node": ">=8" } }, + "node_modules/is-potential-custom-element-name": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", + "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==" + }, "node_modules/is-promise": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz", @@ -7819,7 +7857,9 @@ "node_modules/is-typedarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", + "dev": true, + "peer": true }, "node_modules/is-unc-path": { "version": "1.0.0", @@ -7905,7 +7945,9 @@ "node_modules/isstream": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" + "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==", + "dev": true, + "peer": true }, "node_modules/istextorbinary": { "version": "3.3.0", @@ -7923,108 +7965,109 @@ "url": "https://bevry.me/fund" } }, - "node_modules/jake": { - "version": "10.8.2", - "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.2.tgz", - "integrity": "sha512-eLpKyrfG3mzvGE2Du8VoPbeSkRry093+tyNjdYaBbJS9v17knImYGNXQCUV0gLxQtF82m3E8iRb/wdSQZLoq7A==", + "node_modules/jest-diff": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.3.1.tgz", + "integrity": "sha512-vU8vyiO7568tmin2lA3r2DP8oRvzhvRcD4DjpXc6uGveQodyk7CKLhQlCSiwgx3g0pFaE88/KLZ0yaTWMc4Uiw==", "dev": true, - "peer": true, + "optional": true, "dependencies": { - "async": "0.9.x", - "chalk": "^2.4.2", - "filelist": "^1.0.1", - "minimatch": "^3.0.4" - }, - "bin": { - "jake": "bin/cli.js" + "chalk": "^4.0.0", + "diff-sequences": "^29.3.1", + "jest-get-type": "^29.2.0", + "pretty-format": "^29.3.1" }, "engines": { - "node": "*" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jake/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "node_modules/jest-get-type": { + "version": "29.2.0", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.2.0.tgz", + "integrity": "sha512-uXNJlg8hKFEnDgFsrCjznB+sTxdkuqiCL6zMgA75qEbAJjJYTs9XPrvDctrEig2GDow22T/LvHgO57iJhXB/UA==", "dev": true, - "peer": true, + "optional": true, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-matcher-utils": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.3.1.tgz", + "integrity": "sha512-fkRMZUAScup3txIKfMe3AIZZmPEjWEdsPJFK3AIy5qRohWqQFg1qrmKfYXR9qEkNc7OdAu2N4KPHibEmy4HPeQ==", + "dev": true, + "optional": true, "dependencies": { - "color-convert": "^1.9.0" + "chalk": "^4.0.0", + "jest-diff": "^29.3.1", + "jest-get-type": "^29.2.0", + "pretty-format": "^29.3.1" }, "engines": { - "node": ">=4" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jake/node_modules/async": { - "version": "0.9.2", - "resolved": "https://registry.npmjs.org/async/-/async-0.9.2.tgz", - "integrity": "sha512-l6ToIJIotphWahxxHyzK9bnLR6kM4jJIIgLShZeqLY7iboHoGkdgFl7W2/Ivi4SkMJYGKqW8vSuk0uKUj6qsSw==", + "node_modules/jest-message-util": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.3.1.tgz", + "integrity": "sha512-lMJTbgNcDm5z+6KDxWtqOFWlGQxD6XaYwBqHR8kmpkP+WWWG90I35kdtQHY67Ay5CSuydkTBbJG+tH9JShFCyA==", "dev": true, - "peer": true - }, - "node_modules/jake/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "peer": true, + "optional": true, "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "@babel/code-frame": "^7.12.13", + "@jest/types": "^29.3.1", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^29.3.1", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" }, "engines": { - "node": ">=4" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jake/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "node_modules/jest-message-util/node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", "dev": true, - "peer": true, + "optional": true, "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/jake/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true, - "peer": true - }, - "node_modules/jake/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true, - "peer": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/jake/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true, - "peer": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/jake/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "peer": true, - "dependencies": { - "has-flag": "^3.0.0" + "braces": "^3.0.2", + "picomatch": "^2.3.1" }, "engines": { - "node": ">=4" + "node": ">=8.6" + } + }, + "node_modules/jest-util": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.3.1.tgz", + "integrity": "sha512-7YOVZaiX7RJLv76ZfHt4nbNEzzTRiMW/IiOG7ZOKmTXmoGBxUDefgMAxQubu6WPVqP5zSzAdZG0FfLcC7HOIFQ==", + "dev": true, + "optional": true, + "dependencies": { + "@jest/types": "^29.3.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-util/node_modules/ci-info": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.7.0.tgz", + "integrity": "sha512-2CpRNYmImPx+RXKLq6jko/L07phmS9I02TyqkcNU20GCF/GgaWvc58hPtjxDX8lPpkdwc9sNh72V9k00S7ezog==", + "dev": true, + "optional": true, + "engines": { + "node": ">=8" } }, "node_modules/jju": { @@ -8082,7 +8125,9 @@ "node_modules/jsbn": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" + "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==", + "dev": true, + "peer": true }, "node_modules/jsdoc-type-pratt-parser": { "version": "3.1.0", @@ -8094,39 +8139,39 @@ } }, "node_modules/jsdom": { - "version": "15.2.1", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-15.2.1.tgz", - "integrity": "sha512-fAl1W0/7T2G5vURSyxBzrJ1LSdQn6Tr5UX/xD4PXDx/PDgwygedfW6El/KIj3xJ7FU61TTYnc/l/B7P49Eqt6g==", + "version": "20.0.3", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-20.0.3.tgz", + "integrity": "sha512-SYhBvTh89tTfCD/CRdSOm13mOBa42iTaTyfyEWBdKcGdPxPtLFBXuHR8XHb33YNYaP+lLbmSvBTsnoesCNJEsQ==", "dependencies": { - "abab": "^2.0.0", - "acorn": "^7.1.0", - "acorn-globals": "^4.3.2", - "array-equal": "^1.0.0", - "cssom": "^0.4.1", - "cssstyle": "^2.0.0", - "data-urls": "^1.1.0", - "domexception": "^1.0.1", - "escodegen": "^1.11.1", - "html-encoding-sniffer": "^1.0.2", - "nwsapi": "^2.2.0", - "parse5": "5.1.0", - "pn": "^1.1.0", - "request": "^2.88.0", - "request-promise-native": "^1.0.7", - "saxes": "^3.1.9", - "symbol-tree": "^3.2.2", - "tough-cookie": "^3.0.1", - "w3c-hr-time": "^1.0.1", - "w3c-xmlserializer": "^1.1.2", - "webidl-conversions": "^4.0.2", - "whatwg-encoding": "^1.0.5", - "whatwg-mimetype": "^2.3.0", - "whatwg-url": "^7.0.0", - "ws": "^7.0.0", - "xml-name-validator": "^3.0.0" + "abab": "^2.0.6", + "acorn": "^8.8.1", + "acorn-globals": "^7.0.0", + "cssom": "^0.5.0", + "cssstyle": "^2.3.0", + "data-urls": "^3.0.2", + "decimal.js": "^10.4.2", + "domexception": "^4.0.0", + "escodegen": "^2.0.0", + "form-data": "^4.0.0", + "html-encoding-sniffer": "^3.0.0", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.1", + "is-potential-custom-element-name": "^1.0.1", + "nwsapi": "^2.2.2", + "parse5": "^7.1.1", + "saxes": "^6.0.0", + "symbol-tree": "^3.2.4", + "tough-cookie": "^4.1.2", + "w3c-xmlserializer": "^4.0.0", + "webidl-conversions": "^7.0.0", + "whatwg-encoding": "^2.0.0", + "whatwg-mimetype": "^3.0.0", + "whatwg-url": "^11.0.0", + "ws": "^8.11.0", + "xml-name-validator": "^4.0.0" }, "engines": { - "node": ">=8" + "node": ">=14" }, "peerDependencies": { "canvas": "^2.5.0" @@ -8137,33 +8182,6 @@ } } }, - "node_modules/jsdom/node_modules/acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/jsdom/node_modules/html-encoding-sniffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz", - "integrity": "sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw==", - "dependencies": { - "whatwg-encoding": "^1.0.1" - } - }, - "node_modules/jsdom/node_modules/whatwg-encoding": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", - "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", - "dependencies": { - "iconv-lite": "0.4.24" - } - }, "node_modules/json-buffer": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", @@ -8179,12 +8197,15 @@ "node_modules/json-schema": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", - "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==" + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", + "dev": true, + "peer": true }, "node_modules/json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true }, "node_modules/json-stable-stringify-without-jsonify": { "version": "1.0.1", @@ -8195,7 +8216,9 @@ "node_modules/json-stringify-safe": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", + "dev": true, + "peer": true }, "node_modules/json5": { "version": "2.2.1", @@ -8225,6 +8248,8 @@ "version": "1.4.2", "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", + "dev": true, + "peer": true, "dependencies": { "assert-plus": "1.0.0", "extsprintf": "1.3.0", @@ -8254,9 +8279,9 @@ "dev": true }, "node_modules/keyv": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.0.4.tgz", - "integrity": "sha512-vqNHbAc8BBsxk+7QBYLW0Y219rWcClspR6WSeoHYKG5mnsSoOH+BL1pWq02DDCVdvvuUny5rkBlzMRzoqc+GIg==", + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.2.tgz", + "integrity": "sha512-5MHbFaKn8cNSmVW7BYnijeAVlE4cYA/SVkifVgrh7yotnfhKmjuXpDKjrABLnT0SfHWV21P8ow07OGfRrNDg8g==", "dev": true, "dependencies": { "json-buffer": "3.0.1" @@ -8281,13 +8306,12 @@ } }, "node_modules/ky": { - "version": "0.28.7", - "resolved": "https://registry.npmjs.org/ky/-/ky-0.28.7.tgz", - "integrity": "sha512-a23i6qSr/ep15vdtw/zyEQIDLoUaKDg9Jf04CYl/0ns/wXNYna26zJpI+MeIFaPeDvkrjLPrKtKOiiI3IE53RQ==", + "version": "0.32.2", + "resolved": "https://registry.npmjs.org/ky/-/ky-0.32.2.tgz", + "integrity": "sha512-eBJeF6IXNwX5rksdwBrE2rIJrU2d84GoTvdM7OmmTIwUVXEMd72wIwvT+nyhrqtv7AzbSNsWz7yRsHgVhj1uog==", "dev": true, - "peer": true, "engines": { - "node": ">=12" + "node": ">=14.16" }, "funding": { "url": "https://github.com/sindresorhus/ky?sponsor=1" @@ -8408,7 +8432,7 @@ "node_modules/lighthouse-logger/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true }, "node_modules/lines-and-columns": { @@ -8463,7 +8487,8 @@ "node_modules/lodash": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true }, "node_modules/lodash._basecopy": { "version": "3.0.1", @@ -8558,13 +8583,6 @@ "integrity": "sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8=", "dev": true }, - "node_modules/lodash.flattendeep": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", - "integrity": "sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI=", - "dev": true, - "peer": true - }, "node_modules/lodash.get": { "version": "4.4.2", "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", @@ -8589,12 +8607,6 @@ "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==", "dev": true }, - "node_modules/lodash.isobject": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/lodash.isobject/-/lodash.isobject-3.0.2.tgz", - "integrity": "sha1-PI+41bW/S/kK4G4U8qUwpO2TXh0=", - "dev": true - }, "node_modules/lodash.isplainobject": { "version": "4.0.6", "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", @@ -8624,13 +8636,6 @@ "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", "dev": true }, - "node_modules/lodash.pickby": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.pickby/-/lodash.pickby-4.6.0.tgz", - "integrity": "sha1-feoh2MGNdwOifHBMFdO4SmfjOv8=", - "dev": true, - "peer": true - }, "node_modules/lodash.restparam": { "version": "3.6.1", "resolved": "https://registry.npmjs.org/lodash.restparam/-/lodash.restparam-3.6.1.tgz", @@ -8640,7 +8645,9 @@ "node_modules/lodash.sortby": { "version": "4.7.0", "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", - "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=" + "integrity": "sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==", + "dev": true, + "peer": true }, "node_modules/lodash.template": { "version": "4.5.0", @@ -8817,9 +8824,9 @@ } }, "node_modules/marky": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/marky/-/marky-1.2.2.tgz", - "integrity": "sha512-k1dB2HNeaNyORco8ulVEhctyEGkKHb2YWAhDsxeFlW2nROIirsctBYzKwwS3Vza+sKTS1zO4Z+n9/+9WbGLIxQ==", + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/marky/-/marky-1.2.5.tgz", + "integrity": "sha512-q9JtQJKjpsVxCRVgQ+WapguSbKC3SQ5HEzFGPAJMStgh3QjCawp00UKv3MTTAArTmGmmPUvllHZoNbZ3gs0I+Q==", "dev": true }, "node_modules/matchdep": { @@ -9070,34 +9077,24 @@ } }, "node_modules/mime-db": { - "version": "1.51.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz", - "integrity": "sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==", + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", "engines": { "node": ">= 0.6" } }, "node_modules/mime-types": { - "version": "2.1.34", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.34.tgz", - "integrity": "sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A==", + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "dependencies": { - "mime-db": "1.51.0" + "mime-db": "1.52.0" }, "engines": { "node": ">= 0.6" } }, - "node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true, - "peer": true, - "engines": { - "node": ">=6" - } - }, "node_modules/mimic-response": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", @@ -9117,9 +9114,9 @@ } }, "node_modules/minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, "dependencies": { "brace-expansion": "^1.1.7" @@ -9312,11 +9309,16 @@ "integrity": "sha512-hkvf4EtPJRMQlPC3UbMoRs0vTAFAYdzFQ+gpMb8A+9znae1c43q8Mab9iVsgTcg/4PNiLGGn3SlDIa8uvK1FIQ==", "dev": true }, + "node_modules/moo": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/moo/-/moo-0.5.2.tgz", + "integrity": "sha512-iSAJLHYKnX41mKcJKjqvnAN9sf0LMDTXDEvFv+ffuRR9a1MIuXLjMNL6EsnDHSkKLTWNqQQ5uo61P4EbU4NU+Q==", + "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==", - "dev": true + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "node_modules/multipipe": { "version": "0.1.2", @@ -9336,13 +9338,6 @@ "node": ">= 0.10" } }, - "node_modules/mute-stream": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", - "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", - "dev": true, - "peer": true - }, "node_modules/nan": { "version": "2.15.0", "resolved": "https://registry.npmjs.org/nan/-/nan-2.15.0.tgz", @@ -9544,14 +9539,16 @@ } }, "node_modules/nwsapi": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz", - "integrity": "sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==" + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.2.tgz", + "integrity": "sha512-90yv+6538zuvUMnN+zCr8LuV6bPFdq50304114vJYJ8RDyK8D5O9Phpbd6SZWgI7PwzmmfN1upeOJlvybDSgCw==" }, "node_modules/oauth-sign": { "version": "0.9.0", "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "dev": true, + "peer": true, "engines": { "node": "*" } @@ -9751,22 +9748,6 @@ "wrappy": "1" } }, - "node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, - "peer": true, - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/open": { "version": "7.4.2", "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz", @@ -9809,30 +9790,6 @@ "node": ">= 0.8.0" } }, - "node_modules/ora": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", - "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", - "dev": true, - "peer": true, - "dependencies": { - "bl": "^4.1.0", - "chalk": "^4.1.0", - "cli-cursor": "^3.1.0", - "cli-spinners": "^2.5.0", - "is-interactive": "^1.0.0", - "is-unicode-supported": "^0.1.0", - "log-symbols": "^4.1.0", - "strip-ansi": "^6.0.0", - "wcwidth": "^1.0.1" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/ordered-read-streams": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-1.0.1.tgz", @@ -10158,9 +10115,15 @@ } }, "node_modules/parse5": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.0.tgz", - "integrity": "sha512-fxNG2sQjHvlVAYmzBZS9YlDp6PTSSDwa98vkD4QgVDDCAo84z5X1t5XyJQ62ImdLXx5NdIIfihey6xpum9/gRQ==" + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.1.tgz", + "integrity": "sha512-kwpuwzB+px5WUg9pyK0IcK/shltJN5/OVhQagxhCQNtT9Y9QRZqNY2e1cmbu/paRh5LMnz/oVTVLBpjFmMZhSg==", + "dependencies": { + "entities": "^4.4.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } }, "node_modules/pascalcase": { "version": "0.1.1", @@ -10436,7 +10399,9 @@ "node_modules/performance-now": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" + "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==", + "dev": true, + "peer": true }, "node_modules/picocolors": { "version": "0.2.1", @@ -10486,70 +10451,6 @@ "node": ">=0.10.0" } }, - "node_modules/pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, - "dependencies": { - "find-up": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pkg-dir/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pkg-dir/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pkg-dir/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pkg-dir/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/plugin-error": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-1.0.1.tgz", @@ -10580,7 +10481,9 @@ "node_modules/pn": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/pn/-/pn-1.1.0.tgz", - "integrity": "sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA==" + "integrity": "sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA==", + "dev": true, + "peer": true }, "node_modules/portfinder": { "version": "1.0.28", @@ -10679,6 +10582,34 @@ "node": ">=4" } }, + "node_modules/pretty-format": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.3.1.tgz", + "integrity": "sha512-FyLnmb1cYJV8biEIiRyzRFvs2lry7PPIvOqKVe1GCUEYg4YGmlx1qG9EJNMxArYm7piII4qb8UV1Pncq5dxmcg==", + "dev": true, + "optional": true, + "dependencies": { + "@jest/schemas": "^29.0.0", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "optional": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, "node_modules/pretty-hrtime": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", @@ -10721,17 +10652,10 @@ "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", "dev": true }, - "node_modules/pseudomap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", - "dev": true, - "peer": true - }, "node_modules/psl": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", - "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==" + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", + "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==" }, "node_modules/pubsub-js": { "version": "1.9.4", @@ -10779,51 +10703,36 @@ } }, "node_modules/puppeteer-core": { - "version": "13.7.0", - "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-13.7.0.tgz", - "integrity": "sha512-rXja4vcnAzFAP1OVLq/5dWNfwBGuzcOARJ6qGV7oAZhnLmVRU8G5MsdeQEAOy332ZhkIOnn9jp15R89LKHyp2Q==", + "version": "19.4.0", + "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-19.4.0.tgz", + "integrity": "sha512-gG/jxseleZStinBn86x8r7trjcE4jcjx1hIQWOpACQhquHYMuKnrWxkzg+EDn8sN3wUtF/Ry9mtJgjM49oUOFQ==", "dev": true, "dependencies": { "cross-fetch": "3.1.5", "debug": "4.3.4", - "devtools-protocol": "0.0.981744", + "devtools-protocol": "0.0.1068969", "extract-zip": "2.0.1", "https-proxy-agent": "5.0.1", - "pkg-dir": "4.2.0", - "progress": "2.0.3", "proxy-from-env": "1.1.0", "rimraf": "3.0.2", "tar-fs": "2.1.1", "unbzip2-stream": "1.4.3", - "ws": "8.5.0" + "ws": "8.10.0" }, "engines": { - "node": ">=10.18.1" + "node": ">=14.1.0" } }, "node_modules/puppeteer-core/node_modules/devtools-protocol": { - "version": "0.0.981744", - "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.981744.tgz", - "integrity": "sha512-0cuGS8+jhR67Fy7qG3i3Pc7Aw494sb9yG9QgpG97SFVWwolgYjlhJg7n+UaHxOQT30d1TYu/EYe9k01ivLErIg==", + "version": "0.0.1068969", + "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1068969.tgz", + "integrity": "sha512-ATFTrPbY1dKYhPPvpjtwWKSK2mIwGmRwX54UASn9THEuIZCe2n9k3vVuMmt6jWeL+e5QaaguEv/pMyR+JQB7VQ==", "dev": true }, - "node_modules/puppeteer-core/node_modules/https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", - "dev": true, - "dependencies": { - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/puppeteer-core/node_modules/ws": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.5.0.tgz", - "integrity": "sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg==", + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.10.0.tgz", + "integrity": "sha512-+s49uSmZpvtAsd2h37vIPy1RBusaLawVe8of+GyEPsaJTCMpj/2v8NpeK1SHXjBlQ95lQTmQofOJnFiLoaN3yw==", "dev": true, "engines": { "node": ">=10.0.0" @@ -10842,19 +10751,25 @@ } }, "node_modules/qs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", + "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", + "dev": true, "engines": { "node": ">=0.6" } }, "node_modules/query-selector-shadow-dom": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/query-selector-shadow-dom/-/query-selector-shadow-dom-1.0.0.tgz", - "integrity": "sha512-bK0/0cCI+R8ZmOF1QjT7HupDUYCxbf/9TJgAmSXQxZpftXmTAeil9DRoCnTDkWbvOyZzhcMBwKpptWcdkGFIMg==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/query-selector-shadow-dom/-/query-selector-shadow-dom-1.0.1.tgz", + "integrity": "sha512-lT5yCqEBgfoMYpf3F2xQRK7zEr1rhIIZuceDK6+xRkJQ4NMbHTwXqk4NkwDwQMNqXgG9r9fyHnzwNVs6zV5KRw==", "dev": true }, + "node_modules/querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==" + }, "node_modules/queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", @@ -10920,6 +10835,13 @@ "node": ">=0.10.0" } }, + "node_modules/react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", + "dev": true, + "optional": true + }, "node_modules/read-pkg": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", @@ -11106,19 +11028,6 @@ "node": ">= 0.10" } }, - "node_modules/recursive-readdir": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.2.tgz", - "integrity": "sha512-nRCcW9Sj7NuZwa2XvH9co8NPeXUBhZP7CRKJtU+cS6PW9FpCIFoI5ib0NT1ZrbNuPoRy0ylyCaUL8Gih4LSyFg==", - "dev": true, - "peer": true, - "dependencies": { - "minimatch": "3.0.4" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/redent": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", @@ -11290,6 +11199,8 @@ "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142", + "dev": true, + "peer": true, "dependencies": { "aws-sign2": "~0.7.0", "aws4": "^1.8.0", @@ -11320,6 +11231,8 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.4.tgz", "integrity": "sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw==", + "dev": true, + "peer": true, "dependencies": { "lodash": "^4.17.19" }, @@ -11335,6 +11248,8 @@ "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.9.tgz", "integrity": "sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g==", "deprecated": "request-promise-native has been deprecated because it extends the now deprecated request package, see https://github.com/request/request/issues/3142", + "dev": true, + "peer": true, "dependencies": { "request-promise-core": "1.1.4", "stealthy-require": "^1.1.1", @@ -11351,6 +11266,8 @@ "version": "2.5.0", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "dev": true, + "peer": true, "dependencies": { "psl": "^1.1.28", "punycode": "^2.1.1" @@ -11359,10 +11276,27 @@ "node": ">=0.8" } }, + "node_modules/request/node_modules/form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "dev": true, + "peer": true, + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 0.12" + } + }, "node_modules/request/node_modules/tough-cookie": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "dev": true, + "peer": true, "dependencies": { "psl": "^1.1.28", "punycode": "^2.1.1" @@ -11389,8 +11323,7 @@ "node_modules/requires-port": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", - "dev": true + "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=" }, "node_modules/resolve": { "version": "1.20.0", @@ -11476,20 +11409,6 @@ "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", "dev": true }, - "node_modules/restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", - "dev": true, - "peer": true, - "dependencies": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/ret": { "version": "0.1.15", "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", @@ -11530,16 +11449,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/run-async": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", - "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", - "dev": true, - "peer": true, - "engines": { - "node": ">=0.12.0" - } - }, "node_modules/run-parallel": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", @@ -11581,7 +11490,8 @@ "node_modules/safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true }, "node_modules/safe-regex": { "version": "1.1.0", @@ -11598,14 +11508,14 @@ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, "node_modules/saxes": { - "version": "3.1.11", - "resolved": "https://registry.npmjs.org/saxes/-/saxes-3.1.11.tgz", - "integrity": "sha512-Ydydq3zC+WYDJK1+gRxRapLIED9PWeSuuS41wqyoRmzvhhh9nc+QQrVMKJYzJFULazeGhzSV0QleN2wD3boh2g==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz", + "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==", "dependencies": { - "xmlchars": "^2.1.1" + "xmlchars": "^2.2.0" }, "engines": { - "node": ">=8" + "node": ">=v12.22.7" } }, "node_modules/secure-compare": { @@ -11615,9 +11525,9 @@ "dev": true }, "node_modules/selenium-standalone": { - "version": "8.2.2", - "resolved": "https://registry.npmjs.org/selenium-standalone/-/selenium-standalone-8.2.2.tgz", - "integrity": "sha512-CdfN5WnX0mzrjeCTFnvnsjsXEsQwgepLIvrA6OamrKT29gD8mufemwM3v9VG4grQDFHZZy7Ma1giw232x4eGmw==", + "version": "8.2.4", + "resolved": "https://registry.npmjs.org/selenium-standalone/-/selenium-standalone-8.2.4.tgz", + "integrity": "sha512-VXkiQFAmXGlcE6X5A9dakXbXuxJONqG/t39Cw4ylk7J+hxIYBk/yfJ0Tkh2P0X9QGRpcUfr0hgE0PHDil0nFiA==", "dev": true, "dependencies": { "commander": "^9.0.0", @@ -11644,9 +11554,9 @@ } }, "node_modules/semver": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", - "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", "dev": true, "dependencies": { "lru-cache": "^6.0.0" @@ -11793,13 +11703,6 @@ "integrity": "sha512-9Z0m1pssXv6sndPMvOzXnM1mVO73YCWDE6X5bKxJyG+9J0B9zJkgtgoBM7cnxEaJMzmrbxPceKTVpwF7cS/xqA==", "dev": true }, - "node_modules/signal-exit": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.6.tgz", - "integrity": "sha512-sDl4qMFpijcGw22U5w63KmD3cZJfBuFlVNbVMKje2keoKML7X2UzWbc4XrmEbDwg0NXJc3yv4/ox7b+JWb57kQ==", - "dev": true, - "peer": true - }, "node_modules/sinon": { "version": "9.2.4", "resolved": "https://registry.npmjs.org/sinon/-/sinon-9.2.4.tgz", @@ -12159,9 +12062,11 @@ "dev": true }, "node_modules/sshpk": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", - "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz", + "integrity": "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==", + "dev": true, + "peer": true, "dependencies": { "asn1": "~0.2.3", "assert-plus": "^1.0.0", @@ -12191,6 +12096,29 @@ "node": "*" } }, + "node_modules/stack-utils": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", + "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", + "dev": true, + "optional": true, + "dependencies": { + "escape-string-regexp": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/stack-utils/node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true, + "optional": true, + "engines": { + "node": ">=8" + } + }, "node_modules/static-extend": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", @@ -12281,7 +12209,9 @@ "node_modules/stealthy-require": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", - "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=", + "integrity": "sha512-ZnWpYnYugiOVEY5GkcuJK1io5V8QmNYChG62gSit9pQVGErXtrKuPC55ITaVSukmMta5qpMU7vqLt2Lnni4f/g==", + "dev": true, + "peer": true, "engines": { "node": ">=0.10.0" } @@ -12470,16 +12400,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/suffix": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/suffix/-/suffix-0.1.1.tgz", - "integrity": "sha1-zFgjFkag7xEC95R47zqSSP2chC8=", - "dev": true, - "peer": true, - "engines": { - "node": ">=4" - } - }, "node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -12789,24 +12709,36 @@ } }, "node_modules/tough-cookie": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-3.0.1.tgz", - "integrity": "sha512-yQyJ0u4pZsv9D4clxO69OEjLWYw+jbgspjTue4lTQZLfV0c5l1VmK2y1JK8E9ahdpltPOaAThPcp5nKPUgSnsg==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.2.tgz", + "integrity": "sha512-G9fqXWoYFZgTc2z8Q5zaHy/vJMjm+WV0AkAeHxVCQiEB1b+dGvWzFW6QV07cY5jQ5gRkeid2qIkzkxUnmoQZUQ==", "dependencies": { - "ip-regex": "^2.1.0", - "psl": "^1.1.28", - "punycode": "^2.1.1" + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.2.0", + "url-parse": "^1.5.3" }, "engines": { "node": ">=6" } }, + "node_modules/tough-cookie/node_modules/universalify": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", + "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", + "engines": { + "node": ">= 4.0.0" + } + }, "node_modules/tr46": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", - "integrity": "sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz", + "integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==", "dependencies": { - "punycode": "^2.1.0" + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=12" } }, "node_modules/tree-kill": { @@ -12851,7 +12783,9 @@ "node_modules/tunnel-agent": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", + "dev": true, + "peer": true, "dependencies": { "safe-buffer": "^5.0.1" }, @@ -12862,7 +12796,9 @@ "node_modules/tweetnacl": { "version": "0.14.5", "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" + "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==", + "dev": true, + "peer": true }, "node_modules/type": { "version": "1.2.0", @@ -12892,13 +12828,12 @@ } }, "node_modules/type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", + "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", "dev": true, - "peer": true, "engines": { - "node": ">=10" + "node": ">=12.20" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -12911,9 +12846,9 @@ "dev": true }, "node_modules/typescript": { - "version": "4.8.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.8.4.tgz", - "integrity": "sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ==", + "version": "4.9.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.4.tgz", + "integrity": "sha512-Uz+dTXYzxXXbsFpM86Wh3dKCxrQqUcVMxwU54orwlJjOpO3ao8L7j5lH+dWfTwgCwIuM9GQ2kvVotzYJMXTBZg==", "dev": true, "bin": { "tsc": "bin/tsc", @@ -12924,9 +12859,9 @@ } }, "node_modules/ua-parser-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-1.0.2.tgz", - "integrity": "sha512-00y/AXhx0/SsnI51fTc0rLRmafiGOM4/O+ny10Ps7f+j/b8p/ZY11ytMgznXkOVo4GQ+KwQG5UQLkLGirsACRg==", + "version": "1.0.32", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-1.0.32.tgz", + "integrity": "sha512-dXVsz3M4j+5tTiovFVyVqssXBu5HM47//YSOeZ9fQkdDKkfzv2v3PP1jmH6FUyPW+yCSn7aBVK1fGGKNhowdDA==", "dev": true, "funding": [ { @@ -13114,6 +13049,7 @@ "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, "dependencies": { "punycode": "^2.1.0" } @@ -13131,6 +13067,15 @@ "integrity": "sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==", "dev": true }, + "node_modules/url-parse": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", + "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", + "dependencies": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, "node_modules/url-parse-lax": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", @@ -13143,12 +13088,6 @@ "node": ">=4" } }, - "node_modules/url-resolve-browser": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/url-resolve-browser/-/url-resolve-browser-1.2.0.tgz", - "integrity": "sha512-L9PBPnlKNDFzt9ElK4br8I8Tufdm1xgv1GhMeiP7ZC87x0b7mr+4vSh13kmPq5km80JKX+UD2BeEFTCrFZ6xDA==", - "dev": true - }, "node_modules/use": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", @@ -13169,6 +13108,8 @@ "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", + "dev": true, + "peer": true, "bin": { "uuid": "bin/uuid" } @@ -13225,10 +13166,12 @@ "node_modules/verror": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", + "dev": true, "engines": [ "node >=0.6.0" ], + "peer": true, "dependencies": { "assert-plus": "^1.0.0", "core-util-is": "1.0.2", @@ -13238,7 +13181,9 @@ "node_modules/verror/node_modules/core-util-is": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==", + "dev": true, + "peer": true }, "node_modules/vinyl": { "version": "2.2.1", @@ -13347,129 +13292,114 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", + "deprecated": "Use your platform's native performance.now() and performance.timeOrigin.", + "dev": true, + "peer": true, "dependencies": { "browser-process-hrtime": "^1.0.0" } }, "node_modules/w3c-xmlserializer": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-1.1.2.tgz", - "integrity": "sha512-p10l/ayESzrBMYWRID6xbuCKh2Fp77+sA0doRuGn4tTIMrrZVeqfpKjXHY+oDh3K4nLdPgNwMTVP6Vp4pvqbNg==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-4.0.0.tgz", + "integrity": "sha512-d+BFHzbiCx6zGfz0HyQ6Rg69w9k19nviJspaj4yNscGjrHu94sVP+aRm75yEbCh+r2/yR+7q6hux9LVtbuTGBw==", "dependencies": { - "domexception": "^1.0.1", - "webidl-conversions": "^4.0.2", - "xml-name-validator": "^3.0.0" - } - }, - "node_modules/wcwidth": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", - "integrity": "sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=", - "dev": true, - "peer": true, - "dependencies": { - "defaults": "^1.0.3" + "xml-name-validator": "^4.0.0" + }, + "engines": { + "node": ">=14" } }, "node_modules/webdriver": { - "version": "7.25.1", - "resolved": "https://registry.npmjs.org/webdriver/-/webdriver-7.25.1.tgz", - "integrity": "sha512-BmR5RT37EGNJj/O/GTCqBKXV/Jr9V4oQTTDaurZixVKW0ubG7uyfrhiklzuWUtmES9VualTKgQumhGhchBTC6g==", + "version": "8.0.11", + "resolved": "https://registry.npmjs.org/webdriver/-/webdriver-8.0.11.tgz", + "integrity": "sha512-UK1iLpNltIzOEScd45GOQ4qFTVFMmUwMYDNtVMhX6ASB9yl4Ir3Do66BZ7fyk5+NBvn2VnIx7qrap6FutSbxhQ==", "dev": true, "dependencies": { "@types/node": "^18.0.0", - "@wdio/config": "7.25.1", - "@wdio/logger": "7.19.0", - "@wdio/protocols": "7.22.0", - "@wdio/types": "7.25.1", - "@wdio/utils": "7.25.1", - "got": "^11.0.2", - "ky": "0.30.0", - "lodash.merge": "^4.6.1" + "@types/ws": "^8.5.3", + "@wdio/config": "8.0.11", + "@wdio/logger": "8.0.0", + "@wdio/protocols": "8.0.0", + "@wdio/types": "8.0.11", + "@wdio/utils": "8.0.11", + "deepmerge-ts": "^4.2.2", + "got": "^12.1.0", + "ky": "^0.32.1", + "ws": "^8.8.0" }, "engines": { - "node": ">=12.0.0" + "node": "^16.13 || >=18" } }, - "node_modules/webdriver/node_modules/@types/node": { - "version": "18.8.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.8.0.tgz", - "integrity": "sha512-u+h43R6U8xXDt2vzUaVP3VwjjLyOJk6uEciZS8OSyziUQGOwmk+l+4drxcsDboHXwyTaqS1INebghmWMRxq3LA==", - "dev": true + "node_modules/webdriver/node_modules/@sindresorhus/is": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-5.3.0.tgz", + "integrity": "sha512-CX6t4SYQ37lzxicAqsBtxA3OseeoVrh9cSJ5PFYam0GksYlupRfy1A+Q4aYD3zvcfECLc0zO2u+ZnR2UYKvCrw==", + "dev": true, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sindresorhus/is?sponsor=1" + } + }, + "node_modules/webdriver/node_modules/@szmarczak/http-timer": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-5.0.1.tgz", + "integrity": "sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==", + "dev": true, + "dependencies": { + "defer-to-connect": "^2.0.1" + }, + "engines": { + "node": ">=14.16" + } }, "node_modules/webdriver/node_modules/@wdio/config": { - "version": "7.25.1", - "resolved": "https://registry.npmjs.org/@wdio/config/-/config-7.25.1.tgz", - "integrity": "sha512-7I3L+TE75gvh8jiv8cE/Ch9S9erDgrZG9o5587OlNKfpgFciT7DH7/efPXzYwh8YPFV3grFaydxaaoYzDv6PDA==", + "version": "8.0.11", + "resolved": "https://registry.npmjs.org/@wdio/config/-/config-8.0.11.tgz", + "integrity": "sha512-LR8n6TJfDzVtDmuge4EjOHiJKae73ZyvEwTQq3tokovRIbIMaVkfsRV9iqEZiRgohy14ehAREwNgn67j77ucYA==", "dev": true, "dependencies": { - "@wdio/logger": "7.19.0", - "@wdio/types": "7.25.1", - "@wdio/utils": "7.25.1", - "deepmerge": "^4.0.0", - "glob": "^8.0.3" + "@wdio/logger": "8.0.0", + "@wdio/types": "8.0.11", + "@wdio/utils": "8.0.11", + "decamelize": "^6.0.0", + "deepmerge-ts": "^4.2.2", + "glob": "^8.0.3", + "import-meta-resolve": "^2.1.0", + "read-pkg-up": "^9.1.0" }, "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/webdriver/node_modules/@wdio/logger": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@wdio/logger/-/logger-7.19.0.tgz", - "integrity": "sha512-xR7SN/kGei1QJD1aagzxs3KMuzNxdT/7LYYx+lt6BII49+fqL/SO+5X0FDCZD0Ds93AuQvvz9eGyzrBI2FFXmQ==", - "dev": true, - "dependencies": { - "chalk": "^4.0.0", - "loglevel": "^1.6.0", - "loglevel-plugin-prefix": "^0.8.4", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/webdriver/node_modules/@wdio/protocols": { - "version": "7.22.0", - "resolved": "https://registry.npmjs.org/@wdio/protocols/-/protocols-7.22.0.tgz", - "integrity": "sha512-8EXRR+Ymdwousm/VGtW3H1hwxZ/1g1H99A1lF0U4GuJ5cFWHCd0IVE5H31Z52i8ZruouW8jueMkGZPSo2IIUSQ==", - "dev": true, - "engines": { - "node": ">=12.0.0" + "node": "^16.13 || >=18" } }, "node_modules/webdriver/node_modules/@wdio/types": { - "version": "7.25.1", - "resolved": "https://registry.npmjs.org/@wdio/types/-/types-7.25.1.tgz", - "integrity": "sha512-9Xt2U0YXYxRW4UvMFwjt+44UkfhwrI1gPhW+y56SubpyKaUfdNGberteboQoR/7Os1SVtJry4FohEZNmFzPK6g==", + "version": "8.0.11", + "resolved": "https://registry.npmjs.org/@wdio/types/-/types-8.0.11.tgz", + "integrity": "sha512-54xbajB7tqWmYPXFI0ALupPauwLyVtPSZSG/R/DPlY25p+Ygw4jwH64s+Jh1V3TZYnktfv4cIt1Bw/M35cBgOQ==", "dev": true, "dependencies": { - "@types/node": "^18.0.0", - "got": "^11.8.1" + "@types/node": "^18.0.0" }, "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "typescript": "^4.6.2" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "node": "^16.13 || >=18" } }, "node_modules/webdriver/node_modules/@wdio/utils": { - "version": "7.25.1", - "resolved": "https://registry.npmjs.org/@wdio/utils/-/utils-7.25.1.tgz", - "integrity": "sha512-DL+nDRVgzruJLhedBUQEMUcojLoGwsjCQCYWram4NfwAIIkxcAX/5Y4vHSut3OoW2bEHl3R8/FQ4B/ivIr2EoQ==", + "version": "8.0.11", + "resolved": "https://registry.npmjs.org/@wdio/utils/-/utils-8.0.11.tgz", + "integrity": "sha512-4nIYt1KP4IVIYfnld+Kbh/l85o7VK4roAEIfiHV374utPpspzV+eli4ANX2fEOGVUVJMVNBCN/sCsL8u3DsPpw==", "dev": true, "dependencies": { - "@wdio/logger": "7.19.0", - "@wdio/types": "7.25.1", + "@wdio/logger": "8.0.0", + "@wdio/types": "8.0.11", + "import-meta-resolve": "^2.2.0", "p-iteration": "^1.1.8" }, "engines": { - "node": ">=12.0.0" + "node": "^16.13 || >=18" } }, "node_modules/webdriver/node_modules/brace-expansion": { @@ -13481,6 +13411,73 @@ "balanced-match": "^1.0.0" } }, + "node_modules/webdriver/node_modules/cacheable-lookup": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-7.0.0.tgz", + "integrity": "sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==", + "dev": true, + "engines": { + "node": ">=14.16" + } + }, + "node_modules/webdriver/node_modules/cacheable-request": { + "version": "10.2.3", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-10.2.3.tgz", + "integrity": "sha512-6BehRBOs7iurNjAYN9iPazTwFDaMQavJO8W1MEm3s2pH8q/tkPTtLDRUZaweWK87WFGf2Y5wLAlaCJlR5kOz3w==", + "dev": true, + "dependencies": { + "@types/http-cache-semantics": "^4.0.1", + "get-stream": "^6.0.1", + "http-cache-semantics": "^4.1.0", + "keyv": "^4.5.2", + "mimic-response": "^4.0.0", + "normalize-url": "^8.0.0", + "responselike": "^3.0.0" + }, + "engines": { + "node": ">=14.16" + } + }, + "node_modules/webdriver/node_modules/decamelize": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-6.0.0.tgz", + "integrity": "sha512-Fv96DCsdOgB6mdGl67MT5JaTNKRzrzill5OH5s8bjYJXVlcXyPYGyPsUkWyGV5p1TXI5esYIYMMeDJL0hEIwaA==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/webdriver/node_modules/find-up": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz", + "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==", + "dev": true, + "dependencies": { + "locate-path": "^7.1.0", + "path-exists": "^5.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/webdriver/node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/webdriver/node_modules/glob": { "version": "8.0.3", "resolved": "https://registry.npmjs.org/glob/-/glob-8.0.3.tgz", @@ -13500,22 +13497,87 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/webdriver/node_modules/ky": { - "version": "0.30.0", - "resolved": "https://registry.npmjs.org/ky/-/ky-0.30.0.tgz", - "integrity": "sha512-X/u76z4JtDVq10u1JA5UQfatPxgPaVDMYTrgHyiTpGN2z4TMEJkIHsoSBBSg9SWZEIXTKsi9kHgiQ9o3Y/4yog==", + "node_modules/webdriver/node_modules/got": { + "version": "12.5.3", + "resolved": "https://registry.npmjs.org/got/-/got-12.5.3.tgz", + "integrity": "sha512-8wKnb9MGU8IPGRIo+/ukTy9XLJBwDiCpIf5TVzQ9Cpol50eMTpBq2GAuDsuDIz7hTYmZgMgC1e9ydr6kSDWs3w==", "dev": true, + "dependencies": { + "@sindresorhus/is": "^5.2.0", + "@szmarczak/http-timer": "^5.0.1", + "cacheable-lookup": "^7.0.0", + "cacheable-request": "^10.2.1", + "decompress-response": "^6.0.0", + "form-data-encoder": "^2.1.2", + "get-stream": "^6.0.1", + "http2-wrapper": "^2.1.10", + "lowercase-keys": "^3.0.0", + "p-cancelable": "^3.0.0", + "responselike": "^3.0.0" + }, "engines": { - "node": ">=12" + "node": ">=14.16" }, "funding": { - "url": "https://github.com/sindresorhus/ky?sponsor=1" + "url": "https://github.com/sindresorhus/got?sponsor=1" + } + }, + "node_modules/webdriver/node_modules/http2-wrapper": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-2.2.0.tgz", + "integrity": "sha512-kZB0wxMo0sh1PehyjJUWRFEd99KC5TLjZ2cULC4f9iqJBAmKQQXEICjxl5iPJRwP40dpeHFqqhm7tYCvODpqpQ==", + "dev": true, + "dependencies": { + "quick-lru": "^5.1.1", + "resolve-alpn": "^1.2.0" + }, + "engines": { + "node": ">=10.19.0" + } + }, + "node_modules/webdriver/node_modules/locate-path": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.1.1.tgz", + "integrity": "sha512-vJXaRMJgRVD3+cUZs3Mncj2mxpt5mP0EmNOsxRSZRMlbqjvxzDEOIUWXGmavo0ZC9+tNZCBLQ66reA11nbpHZg==", + "dev": true, + "dependencies": { + "p-locate": "^6.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/webdriver/node_modules/lowercase-keys": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-3.0.0.tgz", + "integrity": "sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/webdriver/node_modules/mimic-response": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-4.0.0.tgz", + "integrity": "sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/webdriver/node_modules/minimatch": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.0.tgz", - "integrity": "sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.1.tgz", + "integrity": "sha512-362NP+zlprccbEt/SkxKfRMHnNY85V74mVnpUpNyr3F35covl09Kec7/sEFLt3RA4oXmewtoaanoIf67SE5Y5g==", "dev": true, "dependencies": { "brace-expansion": "^2.0.1" @@ -13524,123 +13586,210 @@ "node": ">=10" } }, + "node_modules/webdriver/node_modules/normalize-url": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-8.0.0.tgz", + "integrity": "sha512-uVFpKhj5MheNBJRTiMZ9pE/7hD1QTeEvugSJW/OmLzAp78PB5O6adfMNTvmfKhXBkvCzC+rqifWcVYpGFwTjnw==", + "dev": true, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/webdriver/node_modules/p-cancelable": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-3.0.0.tgz", + "integrity": "sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==", + "dev": true, + "engines": { + "node": ">=12.20" + } + }, + "node_modules/webdriver/node_modules/p-limit": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", + "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^1.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/webdriver/node_modules/p-locate": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", + "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", + "dev": true, + "dependencies": { + "p-limit": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/webdriver/node_modules/path-exists": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", + "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, + "node_modules/webdriver/node_modules/read-pkg": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-7.1.0.tgz", + "integrity": "sha512-5iOehe+WF75IccPc30bWTbpdDQLOCc3Uu8bi3Dte3Eueij81yx1Mrufk8qBx/YAbR4uL1FdUr+7BKXDwEtisXg==", + "dev": true, + "dependencies": { + "@types/normalize-package-data": "^2.4.1", + "normalize-package-data": "^3.0.2", + "parse-json": "^5.2.0", + "type-fest": "^2.0.0" + }, + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/webdriver/node_modules/read-pkg-up": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-9.1.0.tgz", + "integrity": "sha512-vaMRR1AC1nrd5CQM0PhlRsO5oc2AAigqr7cCrZ/MW/Rsaflz4RlgzkpL4qoU/z1F6wrbd85iFv1OQj/y5RdGvg==", + "dev": true, + "dependencies": { + "find-up": "^6.3.0", + "read-pkg": "^7.1.0", + "type-fest": "^2.5.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/webdriver/node_modules/responselike": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-3.0.0.tgz", + "integrity": "sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==", + "dev": true, + "dependencies": { + "lowercase-keys": "^3.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/webdriver/node_modules/yocto-queue": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", + "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", + "dev": true, + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/webdriverio": { - "version": "7.25.2", - "resolved": "https://registry.npmjs.org/webdriverio/-/webdriverio-7.25.2.tgz", - "integrity": "sha512-lZwHh1G2Zxg4LmVQZZZNhKAqjGoSxoDaqlAf0ojh/3DcWVxMpFtaj0mksrqCyVhObudb2dopOX26beWPyKwL4A==", + "version": "8.0.12", + "resolved": "https://registry.npmjs.org/webdriverio/-/webdriverio-8.0.12.tgz", + "integrity": "sha512-KCQ+ePhbNTvKP635bz11ADuq9oMjU99tUCgst6difwFPYUg43HYyx5b5CTGl9LrTMqwoJ5UWoIBxjtyS216n6w==", "dev": true, "dependencies": { "@types/aria-query": "^5.0.0", "@types/node": "^18.0.0", - "@wdio/config": "7.25.1", - "@wdio/logger": "7.19.0", - "@wdio/protocols": "7.22.0", - "@wdio/repl": "7.25.1", - "@wdio/types": "7.25.1", - "@wdio/utils": "7.25.1", + "@wdio/config": "8.0.11", + "@wdio/globals": "8.0.12", + "@wdio/logger": "8.0.0", + "@wdio/protocols": "8.0.0", + "@wdio/repl": "8.0.0", + "@wdio/types": "8.0.11", + "@wdio/utils": "8.0.11", "archiver": "^5.0.0", "aria-query": "^5.0.0", "css-shorthand-properties": "^1.1.1", "css-value": "^0.0.1", - "devtools": "7.25.1", - "devtools-protocol": "^0.0.1056733", - "fs-extra": "^10.0.0", + "devtools": "8.0.11", + "devtools-protocol": "^0.0.1078443", "grapheme-splitter": "^1.0.2", + "import-meta-resolve": "^2.1.0", + "is-plain-obj": "^4.1.0", "lodash.clonedeep": "^4.5.0", - "lodash.isobject": "^3.0.2", - "lodash.isplainobject": "^4.0.6", "lodash.zip": "^4.2.0", "minimatch": "^5.0.0", - "puppeteer-core": "^13.1.3", + "puppeteer-core": "19.4.0", "query-selector-shadow-dom": "^1.0.0", "resq": "^1.9.1", "rgb2hex": "0.2.5", "serialize-error": "^8.0.0", - "webdriver": "7.25.1" + "webdriver": "8.0.11" }, "engines": { - "node": ">=12.0.0" + "node": "^16.13 || >=18" } }, - "node_modules/webdriverio/node_modules/@types/node": { - "version": "18.8.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.8.0.tgz", - "integrity": "sha512-u+h43R6U8xXDt2vzUaVP3VwjjLyOJk6uEciZS8OSyziUQGOwmk+l+4drxcsDboHXwyTaqS1INebghmWMRxq3LA==", - "dev": true - }, "node_modules/webdriverio/node_modules/@wdio/config": { - "version": "7.25.1", - "resolved": "https://registry.npmjs.org/@wdio/config/-/config-7.25.1.tgz", - "integrity": "sha512-7I3L+TE75gvh8jiv8cE/Ch9S9erDgrZG9o5587OlNKfpgFciT7DH7/efPXzYwh8YPFV3grFaydxaaoYzDv6PDA==", + "version": "8.0.11", + "resolved": "https://registry.npmjs.org/@wdio/config/-/config-8.0.11.tgz", + "integrity": "sha512-LR8n6TJfDzVtDmuge4EjOHiJKae73ZyvEwTQq3tokovRIbIMaVkfsRV9iqEZiRgohy14ehAREwNgn67j77ucYA==", "dev": true, "dependencies": { - "@wdio/logger": "7.19.0", - "@wdio/types": "7.25.1", - "@wdio/utils": "7.25.1", - "deepmerge": "^4.0.0", - "glob": "^8.0.3" + "@wdio/logger": "8.0.0", + "@wdio/types": "8.0.11", + "@wdio/utils": "8.0.11", + "decamelize": "^6.0.0", + "deepmerge-ts": "^4.2.2", + "glob": "^8.0.3", + "import-meta-resolve": "^2.1.0", + "read-pkg-up": "^9.1.0" }, "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/webdriverio/node_modules/@wdio/logger": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@wdio/logger/-/logger-7.19.0.tgz", - "integrity": "sha512-xR7SN/kGei1QJD1aagzxs3KMuzNxdT/7LYYx+lt6BII49+fqL/SO+5X0FDCZD0Ds93AuQvvz9eGyzrBI2FFXmQ==", - "dev": true, - "dependencies": { - "chalk": "^4.0.0", - "loglevel": "^1.6.0", - "loglevel-plugin-prefix": "^0.8.4", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/webdriverio/node_modules/@wdio/protocols": { - "version": "7.22.0", - "resolved": "https://registry.npmjs.org/@wdio/protocols/-/protocols-7.22.0.tgz", - "integrity": "sha512-8EXRR+Ymdwousm/VGtW3H1hwxZ/1g1H99A1lF0U4GuJ5cFWHCd0IVE5H31Z52i8ZruouW8jueMkGZPSo2IIUSQ==", - "dev": true, - "engines": { - "node": ">=12.0.0" + "node": "^16.13 || >=18" } }, "node_modules/webdriverio/node_modules/@wdio/types": { - "version": "7.25.1", - "resolved": "https://registry.npmjs.org/@wdio/types/-/types-7.25.1.tgz", - "integrity": "sha512-9Xt2U0YXYxRW4UvMFwjt+44UkfhwrI1gPhW+y56SubpyKaUfdNGberteboQoR/7Os1SVtJry4FohEZNmFzPK6g==", + "version": "8.0.11", + "resolved": "https://registry.npmjs.org/@wdio/types/-/types-8.0.11.tgz", + "integrity": "sha512-54xbajB7tqWmYPXFI0ALupPauwLyVtPSZSG/R/DPlY25p+Ygw4jwH64s+Jh1V3TZYnktfv4cIt1Bw/M35cBgOQ==", "dev": true, "dependencies": { - "@types/node": "^18.0.0", - "got": "^11.8.1" + "@types/node": "^18.0.0" }, "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "typescript": "^4.6.2" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "node": "^16.13 || >=18" } }, "node_modules/webdriverio/node_modules/@wdio/utils": { - "version": "7.25.1", - "resolved": "https://registry.npmjs.org/@wdio/utils/-/utils-7.25.1.tgz", - "integrity": "sha512-DL+nDRVgzruJLhedBUQEMUcojLoGwsjCQCYWram4NfwAIIkxcAX/5Y4vHSut3OoW2bEHl3R8/FQ4B/ivIr2EoQ==", + "version": "8.0.11", + "resolved": "https://registry.npmjs.org/@wdio/utils/-/utils-8.0.11.tgz", + "integrity": "sha512-4nIYt1KP4IVIYfnld+Kbh/l85o7VK4roAEIfiHV374utPpspzV+eli4ANX2fEOGVUVJMVNBCN/sCsL8u3DsPpw==", "dev": true, "dependencies": { - "@wdio/logger": "7.19.0", - "@wdio/types": "7.25.1", + "@wdio/logger": "8.0.0", + "@wdio/types": "8.0.11", + "import-meta-resolve": "^2.2.0", "p-iteration": "^1.1.8" }, "engines": { - "node": ">=12.0.0" + "node": "^16.13 || >=18" } }, "node_modules/webdriverio/node_modules/brace-expansion": { @@ -13652,6 +13801,34 @@ "balanced-match": "^1.0.0" } }, + "node_modules/webdriverio/node_modules/decamelize": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-6.0.0.tgz", + "integrity": "sha512-Fv96DCsdOgB6mdGl67MT5JaTNKRzrzill5OH5s8bjYJXVlcXyPYGyPsUkWyGV5p1TXI5esYIYMMeDJL0hEIwaA==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/webdriverio/node_modules/find-up": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz", + "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==", + "dev": true, + "dependencies": { + "locate-path": "^7.1.0", + "path-exists": "^5.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/webdriverio/node_modules/glob": { "version": "8.0.3", "resolved": "https://registry.npmjs.org/glob/-/glob-8.0.3.tgz", @@ -13671,10 +13848,37 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/webdriverio/node_modules/is-plain-obj": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", + "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/webdriverio/node_modules/locate-path": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.1.1.tgz", + "integrity": "sha512-vJXaRMJgRVD3+cUZs3Mncj2mxpt5mP0EmNOsxRSZRMlbqjvxzDEOIUWXGmavo0ZC9+tNZCBLQ66reA11nbpHZg==", + "dev": true, + "dependencies": { + "p-locate": "^6.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/webdriverio/node_modules/minimatch": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.0.tgz", - "integrity": "sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.1.tgz", + "integrity": "sha512-362NP+zlprccbEt/SkxKfRMHnNY85V74mVnpUpNyr3F35covl09Kec7/sEFLt3RA4oXmewtoaanoIf67SE5Y5g==", "dev": true, "dependencies": { "brace-expansion": "^2.0.1" @@ -13683,16 +13887,104 @@ "node": ">=10" } }, + "node_modules/webdriverio/node_modules/p-limit": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", + "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^1.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/webdriverio/node_modules/p-locate": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", + "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", + "dev": true, + "dependencies": { + "p-limit": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/webdriverio/node_modules/path-exists": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", + "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, + "node_modules/webdriverio/node_modules/read-pkg": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-7.1.0.tgz", + "integrity": "sha512-5iOehe+WF75IccPc30bWTbpdDQLOCc3Uu8bi3Dte3Eueij81yx1Mrufk8qBx/YAbR4uL1FdUr+7BKXDwEtisXg==", + "dev": true, + "dependencies": { + "@types/normalize-package-data": "^2.4.1", + "normalize-package-data": "^3.0.2", + "parse-json": "^5.2.0", + "type-fest": "^2.0.0" + }, + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/webdriverio/node_modules/read-pkg-up": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-9.1.0.tgz", + "integrity": "sha512-vaMRR1AC1nrd5CQM0PhlRsO5oc2AAigqr7cCrZ/MW/Rsaflz4RlgzkpL4qoU/z1F6wrbd85iFv1OQj/y5RdGvg==", + "dev": true, + "dependencies": { + "find-up": "^6.3.0", + "read-pkg": "^7.1.0", + "type-fest": "^2.5.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/webdriverio/node_modules/yocto-queue": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", + "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", + "dev": true, + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/webidl-conversions": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", - "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==" + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", + "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", + "engines": { + "node": ">=12" + } }, "node_modules/whatwg-encoding": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz", "integrity": "sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==", - "dev": true, "dependencies": { "iconv-lite": "0.6.3" }, @@ -13704,7 +13996,6 @@ "version": "0.6.3", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "dev": true, "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" }, @@ -13713,18 +14004,23 @@ } }, "node_modules/whatwg-mimetype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", - "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==" + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz", + "integrity": "sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==", + "engines": { + "node": ">=12" + } }, "node_modules/whatwg-url": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", - "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-11.0.0.tgz", + "integrity": "sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==", "dependencies": { - "lodash.sortby": "^4.7.0", - "tr46": "^1.0.1", - "webidl-conversions": "^4.0.2" + "tr46": "^3.0.0", + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=12" } }, "node_modules/which": { @@ -13786,11 +14082,11 @@ "dev": true }, "node_modules/ws": { - "version": "7.5.6", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.6.tgz", - "integrity": "sha512-6GLgCqo2cy2A2rjCNFlxQS6ZljG/coZfZXclldI8FB/1G3CCI36Zd8xy2HrFVACi8tfk5XrgLQEk+P0Tnz9UcA==", + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz", + "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==", "engines": { - "node": ">=8.3.0" + "node": ">=10.0.0" }, "peerDependencies": { "bufferutil": "^4.0.1", @@ -13806,9 +14102,12 @@ } }, "node_modules/xml-name-validator": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", - "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==" + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz", + "integrity": "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==", + "engines": { + "node": ">=12" + } }, "node_modules/xmlchars": { "version": "2.2.0", @@ -13849,9 +14148,9 @@ } }, "node_modules/yargs": { - "version": "17.6.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.6.0.tgz", - "integrity": "sha512-8H/wTDqlSwoSnScvV2N/JHfLWOKuh5MVla9hqLjK3nsfyy6Y4kDSYSvkU5YCUEPOSnRXfIyx3Sq+B/IWudTo4g==", + "version": "17.6.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.6.2.tgz", + "integrity": "sha512-1/9UrdHjDZc0eOU0HxOHoS78C69UD3JRMvzlJ7S79S2nTaWRA/whGCTV8o9e/N/1Va9YIV7Q4sOxD8VV4pCWOw==", "dev": true, "dependencies": { "cliui": "^8.0.1", @@ -13860,16 +14159,16 @@ "require-directory": "^2.1.1", "string-width": "^4.2.3", "y18n": "^5.0.5", - "yargs-parser": "^21.0.0" + "yargs-parser": "^21.1.1" }, "engines": { "node": ">=12" } }, "node_modules/yargs-parser": { - "version": "21.0.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.0.0.tgz", - "integrity": "sha512-z9kApYUOCwoeZ78rfRYYWdiU/iNL6mwwYlkkZfJoyMR1xps+NEBX5X7XmRpxkZHhXJ6+Ey00IwKxBBSW9FIjyA==", + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", "dev": true, "engines": { "node": ">=12" @@ -13937,127 +14236,6 @@ "node": ">=12" } }, - "node_modules/yarn-install": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/yarn-install/-/yarn-install-1.0.0.tgz", - "integrity": "sha1-V/RQULgu/VcYKzlzxUqgXLXSUjA=", - "dev": true, - "peer": true, - "dependencies": { - "cac": "^3.0.3", - "chalk": "^1.1.3", - "cross-spawn": "^4.0.2" - }, - "bin": { - "yarn-install": "bin/yarn-install.js", - "yarn-remove": "bin/yarn-remove.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/yarn-install/node_modules/ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true, - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/yarn-install/node_modules/chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "peer": true, - "dependencies": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/yarn-install/node_modules/cross-spawn": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-4.0.2.tgz", - "integrity": "sha1-e5JHYhwjrf3ThWAEqCPL45dCTUE=", - "dev": true, - "peer": true, - "dependencies": { - "lru-cache": "^4.0.1", - "which": "^1.2.9" - } - }, - "node_modules/yarn-install/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true, - "peer": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/yarn-install/node_modules/lru-cache": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", - "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", - "dev": true, - "peer": true, - "dependencies": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" - } - }, - "node_modules/yarn-install/node_modules/strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "peer": true, - "dependencies": { - "ansi-regex": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/yarn-install/node_modules/supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true, - "peer": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/yarn-install/node_modules/which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "peer": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "which": "bin/which" - } - }, - "node_modules/yarn-install/node_modules/yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", - "dev": true, - "peer": true - }, "node_modules/yauzl": { "version": "2.10.0", "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", @@ -14229,16 +14407,16 @@ "requires": {} }, "@blockly/dev-tools": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@blockly/dev-tools/-/dev-tools-5.0.0.tgz", - "integrity": "sha512-9GSH+Y8aU+KLcu3sFKkqr/sIz4RWDjmkzKgDI0ryiZiihR8LKIi/gxREc04ZnnLWZWMlXo/RyMoLNWyM7YW36g==", + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/@blockly/dev-tools/-/dev-tools-5.0.2.tgz", + "integrity": "sha512-3h9nbpbrz8+YCbQlkpIJh1YXmlSmslxzibdPvc6VcgzXA+xzAc2a00Wy5f+ugQRq2394J8Cn/cKXqUKDLjykRA==", "dev": true, "requires": { - "@blockly/block-test": "^3.0.0", - "@blockly/theme-dark": "^4.0.0", - "@blockly/theme-deuteranopia": "^3.0.0", - "@blockly/theme-highcontrast": "^3.0.0", - "@blockly/theme-tritanopia": "^3.0.0", + "@blockly/block-test": "^3.0.1", + "@blockly/theme-dark": "^4.0.1", + "@blockly/theme-deuteranopia": "^3.0.1", + "@blockly/theme-highcontrast": "^3.0.1", + "@blockly/theme-tritanopia": "^3.0.2", "chai": "^4.2.0", "dat.gui": "^0.7.7", "lodash.assign": "^4.2.0", @@ -14248,23 +14426,23 @@ } }, "@blockly/theme-dark": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@blockly/theme-dark/-/theme-dark-4.0.0.tgz", - "integrity": "sha512-JCah9PULu/K4E8485CzvWTpWMDB8zAsqKxLtAGu106eSUKgaOrB6WR3nzoA10nmoUcZdh/fk/UPcHUB/XsHkhg==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@blockly/theme-dark/-/theme-dark-4.0.1.tgz", + "integrity": "sha512-OIfdnt3kvPnEW/TmfLPUftcekwoQGmxg/12LajYUdW9aOLMQaen16Vw0+BB8Q8zKInpxT6JCBYECilYRLY+RpA==", "dev": true, "requires": {} }, "@blockly/theme-deuteranopia": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@blockly/theme-deuteranopia/-/theme-deuteranopia-3.0.0.tgz", - "integrity": "sha512-1m8aEZw4tA7LwKWXyIU5IU1pO2iDgrJGYTHn3/N5+GPRIQzuHqxGM62QcP3wTMYPqj8TX1Rs3xR0OPVZW2CgGw==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@blockly/theme-deuteranopia/-/theme-deuteranopia-3.0.1.tgz", + "integrity": "sha512-3zmkD3ERGAuKQjAeFFoNNAhfwmxFncXd3Mw5tHn64MlxguMJCKt7C4Siu6gRXGYpvukkpMUlbgklWyNz2okHng==", "dev": true, "requires": {} }, "@blockly/theme-highcontrast": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@blockly/theme-highcontrast/-/theme-highcontrast-3.0.0.tgz", - "integrity": "sha512-4egNcV/Dl2pDcWBdS1199HUAI/hrlwAjwq7B2cf52A0O2ek/qfdrHxB2jm+6ez+giQFvrnFVjvCL9DptuKfNIg==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@blockly/theme-highcontrast/-/theme-highcontrast-3.0.1.tgz", + "integrity": "sha512-HuEHKq7n2zTV1gb19SGjyKlCYjZeZSITWPIQeD5wfEVleOOy8z6zjLRZ9D7QoiL4ooFefWkx1kauVsWbaTqN5g==", "dev": true, "requires": {} }, @@ -14276,16 +14454,16 @@ "requires": {} }, "@blockly/theme-tritanopia": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@blockly/theme-tritanopia/-/theme-tritanopia-3.0.0.tgz", - "integrity": "sha512-kwV01Wt57ktzqcu3yWb7FPHsXd0ZLz6ApvX0AWCuNJ+64+AxezBG+WOigD0/JzyIz7U6VFjHsecX+MIKmxaPgw==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@blockly/theme-tritanopia/-/theme-tritanopia-3.0.2.tgz", + "integrity": "sha512-soKspGnVLk+EVuWm8HfRSmZoK5NoThpgIS9uvctSNUaEB3Ritvf/feuqu4AFBEjwAUUgkY1SfW70200ZIXRY8g==", "dev": true, "requires": {} }, "@es-joy/jsdoccomment": { - "version": "0.31.0", - "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.31.0.tgz", - "integrity": "sha512-tc1/iuQcnaiSIUVad72PBierDFpsxdUHtEF/OrfqvM1CBAsIoMP51j52jTMb3dXriwhieTo289InzZj72jL3EQ==", + "version": "0.36.1", + "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.36.1.tgz", + "integrity": "sha512-922xqFsTpHs6D0BUiG4toiyPOMc8/jafnWKxz1KWgS4XzKPy2qXf1Pe6UFuNSCQqt6tOuhAWXBNuuyUhJmw9Vg==", "dev": true, "requires": { "comment-parser": "1.3.1", @@ -14308,17 +14486,6 @@ "js-yaml": "^4.1.0", "minimatch": "^3.1.2", "strip-json-comments": "^3.1.1" - }, - "dependencies": { - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - } } }, "@gulp-sourcemaps/identity-map": { @@ -14390,14 +14557,14 @@ } }, "@humanwhocodes/config-array": { - "version": "0.10.5", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.10.5.tgz", - "integrity": "sha512-XVVDtp+dVvRxMoxSiSfasYaG02VEe1qH5cKgMQJWhol6HwzbcqoCMJi8dAGoYAO57jhUyhI6cWuRiTcRaDaYug==", + "version": "0.11.7", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.7.tgz", + "integrity": "sha512-kBbPWzN8oVMLb0hOUYXhmxggL/1cJE6ydvjDIGi9EnAGUyA7cLVKQg+d/Dsm+KZwx2czGHrCmMVLiyg8s5JPKw==", "dev": true, "requires": { "@humanwhocodes/object-schema": "^1.2.1", "debug": "^4.1.1", - "minimatch": "^3.0.4" + "minimatch": "^3.0.5" } }, "@humanwhocodes/module-importer": { @@ -14412,6 +14579,16 @@ "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", "dev": true }, + "@hyperjump/json": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@hyperjump/json/-/json-0.1.0.tgz", + "integrity": "sha512-jWsAOHjweWhi0UEBCN57YZzyTt76Z6Fm/OJXOfNBJbEZt569AcTRsjv6Dqj5t4gQhW9td72oquiyaVp9oHbhBQ==", + "dev": true, + "requires": { + "@hyperjump/json-pointer": "^0.9.2", + "moo": "^0.5.1" + } + }, "@hyperjump/json-pointer": { "version": "0.9.6", "resolved": "https://registry.npmjs.org/@hyperjump/json-pointer/-/json-pointer-0.9.6.tgz", @@ -14422,27 +14599,28 @@ } }, "@hyperjump/json-schema": { - "version": "0.18.5", - "resolved": "https://registry.npmjs.org/@hyperjump/json-schema/-/json-schema-0.18.5.tgz", - "integrity": "sha512-O4+E8BqwzkhPm6BEkswaExIqtrtznpVQjyllA3Q3rB0VQZ4YWW7L5AtaqIiL0XtxpnuCiPKqb73BBGdyycLL6g==", + "version": "0.23.3", + "resolved": "https://registry.npmjs.org/@hyperjump/json-schema/-/json-schema-0.23.3.tgz", + "integrity": "sha512-3YqAQpYY1U16SeP+LfMzBySqW5FHF9gZcOMKeeRywJkowsZ1JuOOiYCmYXptlRwXSB1jVa9ITC0lvfO84OaSQQ==", "dev": true, "requires": { - "@hyperjump/json-schema-core": "^0.23.4", + "@hyperjump/json-schema-core": "^0.28.0", "fastest-stable-stringify": "^2.0.2" } }, "@hyperjump/json-schema-core": { - "version": "0.23.7", - "resolved": "https://registry.npmjs.org/@hyperjump/json-schema-core/-/json-schema-core-0.23.7.tgz", - "integrity": "sha512-64gBteTl+zAvI1D68l/+gH7ncuM+Cf0rGdm/YwtsYZlNfbybgFD5R5uuJCsPGJDm5ZYqqWMdPIq6Nh5jDENYRw==", + "version": "0.28.5", + "resolved": "https://registry.npmjs.org/@hyperjump/json-schema-core/-/json-schema-core-0.28.5.tgz", + "integrity": "sha512-+f5P3oHYCQru3s+Ha+E10rIyEvyK0Hfa2oj3+cDoGaVMbT4Jg5TgCoIM7B5rl3t3KRA7EOmrLjKFGeLi5yd1pg==", "dev": true, "requires": { - "@hyperjump/json-pointer": "^0.9.1", - "@hyperjump/pact": "^0.2.0", + "@hyperjump/json": "^0.1.0", + "@hyperjump/json-pointer": "^0.9.4", + "@hyperjump/pact": "^0.2.3", "content-type": "^1.0.4", "node-fetch": "^2.6.5", - "pubsub-js": "^1.9.1", - "url-resolve-browser": "^1.2.0" + "pubsub-js": "^1.9.4", + "uri-js": "^4.4.1" } }, "@hyperjump/pact": { @@ -14462,10 +14640,45 @@ } } }, + "@jest/expect-utils": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.3.1.tgz", + "integrity": "sha512-wlrznINZI5sMjwvUoLVk617ll/UYfGIZNxmbU+Pa7wmkL4vYzhV9R2pwVqUh4NWWuLQWkI8+8mOkxs//prKQ3g==", + "dev": true, + "optional": true, + "requires": { + "jest-get-type": "^29.2.0" + } + }, + "@jest/schemas": { + "version": "29.0.0", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.0.0.tgz", + "integrity": "sha512-3Ab5HgYIIAnS0HjqJHQYZS+zXc4tUmTmBH3z83ajI6afXp8X3ZtdLX+nXx+I7LNkJD7uN9LAVhgnjDgZa2z0kA==", + "dev": true, + "optional": true, + "requires": { + "@sinclair/typebox": "^0.24.1" + } + }, + "@jest/types": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.3.1.tgz", + "integrity": "sha512-d0S0jmmTpjnhCmNpApgX3jrUZgZ22ivKJRvL2lli5hpCRoNnp1f85r2/wpKfXuYu8E7Jjh1hGfhPyup1NM5AmA==", + "dev": true, + "optional": true, + "requires": { + "@jest/schemas": "^29.0.0", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + } + }, "@microsoft/api-documenter": { - "version": "7.19.24", - "resolved": "https://registry.npmjs.org/@microsoft/api-documenter/-/api-documenter-7.19.24.tgz", - "integrity": "sha512-XSjN07jsBusRDEqazbadGp6e0hds7GZGjdNGWmaQop32f7BxNv81NqE3H/OLONCZSklm/0fzJy8g14xZmByFtQ==", + "version": "7.19.25", + "resolved": "https://registry.npmjs.org/@microsoft/api-documenter/-/api-documenter-7.19.25.tgz", + "integrity": "sha512-/yC6cG7QpjkDqHvoXt5SJJdB0Mdj0oYpaWgxdOV8uHRniZ9kZwxAEResswdS6QDCYoyqDD6jlh008HwXIcmXjA==", "dev": true, "requires": { "@microsoft/api-extractor-model": "7.25.2", @@ -14477,35 +14690,6 @@ "resolve": "~1.17.0" }, "dependencies": { - "@microsoft/api-extractor-model": { - "version": "7.25.2", - "resolved": "https://registry.npmjs.org/@microsoft/api-extractor-model/-/api-extractor-model-7.25.2.tgz", - "integrity": "sha512-+h1uCrLQXFAKMUdghhdDcnniDB+6UA/lS9ArlB4QZQ34UbLuXNy2oQ6fafFK8cKXU4mUPTF/yGRjv7JKD5L7eg==", - "dev": true, - "requires": { - "@microsoft/tsdoc": "0.14.2", - "@microsoft/tsdoc-config": "~0.16.1", - "@rushstack/node-core-library": "3.53.2" - } - }, - "@microsoft/tsdoc": { - "version": "0.14.2", - "resolved": "https://registry.npmjs.org/@microsoft/tsdoc/-/tsdoc-0.14.2.tgz", - "integrity": "sha512-9b8mPpKrfeGRuhFH5iO1iwCLeIIsV6+H1sRfxbkoGXIyQE2BTsPd9zqSqQJ+pv5sJ/hT5M1zvOFL02MnEezFug==", - "dev": true - }, - "@rushstack/ts-command-line": { - "version": "4.13.1", - "resolved": "https://registry.npmjs.org/@rushstack/ts-command-line/-/ts-command-line-4.13.1.tgz", - "integrity": "sha512-UTQMRyy/jH1IS2U+6pyzyn9xQ2iMcoUKkTcZUzOP/aaMiKlWLwCTDiBVwhw/M1crDx6apF9CwyjuWO9r1SBdJQ==", - "dev": true, - "requires": { - "@types/argparse": "1.0.38", - "argparse": "~1.0.9", - "colors": "~1.2.1", - "string-argv": "~0.3.1" - } - }, "argparse": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", @@ -14537,17 +14721,17 @@ } }, "@microsoft/api-extractor": { - "version": "7.33.4", - "resolved": "https://registry.npmjs.org/@microsoft/api-extractor/-/api-extractor-7.33.4.tgz", - "integrity": "sha512-uZG4CHxVcQNpXBC77GwHaKFwGI9vAnzORY4fFN5JuTnQQDKS0vi4BazP4pmYYwbb8IdH4ocQSwOA3j9Ul/sWmg==", + "version": "7.33.7", + "resolved": "https://registry.npmjs.org/@microsoft/api-extractor/-/api-extractor-7.33.7.tgz", + "integrity": "sha512-fQT2v/j/55DhvMFiopLtth66E7xTFNhnumMKgKY14SaG6qU/V1W0e4nOAgbA+SmLakQjAd1Evu06ofaVaxBPbA==", "dev": true, "requires": { - "@microsoft/api-extractor-model": "7.25.1", - "@microsoft/tsdoc": "0.14.1", + "@microsoft/api-extractor-model": "7.25.3", + "@microsoft/tsdoc": "0.14.2", "@microsoft/tsdoc-config": "~0.16.1", - "@rushstack/node-core-library": "3.53.2", + "@rushstack/node-core-library": "3.53.3", "@rushstack/rig-package": "0.3.17", - "@rushstack/ts-command-line": "4.13.0", + "@rushstack/ts-command-line": "4.13.1", "colors": "~1.2.1", "lodash": "~4.17.15", "resolve": "~1.17.0", @@ -14556,6 +14740,59 @@ "typescript": "~4.8.4" }, "dependencies": { + "@microsoft/api-extractor-model": { + "version": "7.25.3", + "resolved": "https://registry.npmjs.org/@microsoft/api-extractor-model/-/api-extractor-model-7.25.3.tgz", + "integrity": "sha512-WWxBUq77p2iZ+5VF7Nmrm3y/UtqCh5bYV8ii3khwq3w99+fXWpvfsAhgSLsC7k8XDQc6De4ssMxH6He/qe1pzg==", + "dev": true, + "requires": { + "@microsoft/tsdoc": "0.14.2", + "@microsoft/tsdoc-config": "~0.16.1", + "@rushstack/node-core-library": "3.53.3" + } + }, + "@rushstack/node-core-library": { + "version": "3.53.3", + "resolved": "https://registry.npmjs.org/@rushstack/node-core-library/-/node-core-library-3.53.3.tgz", + "integrity": "sha512-H0+T5koi5MFhJUd5ND3dI3bwLhvlABetARl78L3lWftJVQEPyzcgTStvTTRiIM5mCltyTM8VYm6BuCtNUuxD0Q==", + "dev": true, + "requires": { + "@types/node": "12.20.24", + "colors": "~1.2.1", + "fs-extra": "~7.0.1", + "import-lazy": "~4.0.0", + "jju": "~1.4.0", + "resolve": "~1.17.0", + "semver": "~7.3.0", + "z-schema": "~5.0.2" + } + }, + "@types/node": { + "version": "12.20.24", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.24.tgz", + "integrity": "sha512-yxDeaQIAJlMav7fH5AQqPH1u8YIuhYJXYBzxaQ4PifsU0GDO38MSdmEDeRlIxrKbC6NbEaaEHDanWb+y30U8SQ==", + "dev": true + }, + "fs-extra": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6" + } + }, "resolve": { "version": "1.17.0", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", @@ -14570,24 +14807,36 @@ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true + }, + "typescript": { + "version": "4.8.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.8.4.tgz", + "integrity": "sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ==", + "dev": true + }, + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true } } }, "@microsoft/api-extractor-model": { - "version": "7.25.1", - "resolved": "https://registry.npmjs.org/@microsoft/api-extractor-model/-/api-extractor-model-7.25.1.tgz", - "integrity": "sha512-AaZ0ohCGLRjWiZviM+0p/DaxgMhbawS183LW2+CSqyEBh6wZks7NjoyhzhibAYapS4omnrmv96+0V/2wBvnIZQ==", + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@microsoft/api-extractor-model/-/api-extractor-model-7.25.2.tgz", + "integrity": "sha512-+h1uCrLQXFAKMUdghhdDcnniDB+6UA/lS9ArlB4QZQ34UbLuXNy2oQ6fafFK8cKXU4mUPTF/yGRjv7JKD5L7eg==", "dev": true, "requires": { - "@microsoft/tsdoc": "0.14.1", + "@microsoft/tsdoc": "0.14.2", "@microsoft/tsdoc-config": "~0.16.1", "@rushstack/node-core-library": "3.53.2" } }, "@microsoft/tsdoc": { - "version": "0.14.1", - "resolved": "https://registry.npmjs.org/@microsoft/tsdoc/-/tsdoc-0.14.1.tgz", - "integrity": "sha512-6Wci+Tp3CgPt/B9B0a3J4s3yMgLNSku6w5TV6mN+61C71UqsRBv2FUibBf3tPGlNxebgPHMEUzKpb1ggE8KCKw==", + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/@microsoft/tsdoc/-/tsdoc-0.14.2.tgz", + "integrity": "sha512-9b8mPpKrfeGRuhFH5iO1iwCLeIIsV6+H1sRfxbkoGXIyQE2BTsPd9zqSqQJ+pv5sJ/hT5M1zvOFL02MnEezFug==", "dev": true }, "@microsoft/tsdoc-config": { @@ -14602,12 +14851,6 @@ "resolve": "~1.19.0" }, "dependencies": { - "@microsoft/tsdoc": { - "version": "0.14.2", - "resolved": "https://registry.npmjs.org/@microsoft/tsdoc/-/tsdoc-0.14.2.tgz", - "integrity": "sha512-9b8mPpKrfeGRuhFH5iO1iwCLeIIsV6+H1sRfxbkoGXIyQE2BTsPd9zqSqQJ+pv5sJ/hT5M1zvOFL02MnEezFug==", - "dev": true - }, "resolve": { "version": "1.19.0", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.19.0.tgz", @@ -14727,9 +14970,9 @@ } }, "@rushstack/ts-command-line": { - "version": "4.13.0", - "resolved": "https://registry.npmjs.org/@rushstack/ts-command-line/-/ts-command-line-4.13.0.tgz", - "integrity": "sha512-crLT31kl+qilz0eBRjqqYO06CqwbElc0EvzS6jI69B9Ikt1SkkSzIZ2iDP7zt/rd1ZYipKIS9hf9CQR9swDIKg==", + "version": "4.13.1", + "resolved": "https://registry.npmjs.org/@rushstack/ts-command-line/-/ts-command-line-4.13.1.tgz", + "integrity": "sha512-UTQMRyy/jH1IS2U+6pyzyn9xQ2iMcoUKkTcZUzOP/aaMiKlWLwCTDiBVwhw/M1crDx6apF9CwyjuWO9r1SBdJQ==", "dev": true, "requires": { "@types/argparse": "1.0.38", @@ -14749,6 +14992,13 @@ } } }, + "@sinclair/typebox": { + "version": "0.24.51", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.24.51.tgz", + "integrity": "sha512-1P1OROm/rdubP5aFDSZQILU0vrLCJ4fvHt6EoqHEM+2D/G5MK3bIaymUKLit8Js9gbns5UyJnkP/TZROLw4tUA==", + "dev": true, + "optional": true + }, "@sindresorhus/is": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.2.0.tgz", @@ -14799,6 +15049,11 @@ "defer-to-connect": "^2.0.0" } }, + "@tootallnate/once": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", + "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==" + }, "@ts-stack/markdown": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/@ts-stack/markdown/-/markdown-1.4.0.tgz", @@ -14840,42 +15095,43 @@ "@types/responselike": "*" } }, - "@types/ejs": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@types/ejs/-/ejs-3.1.0.tgz", - "integrity": "sha512-DCg+Ka+uDQ31lJ/UtEXVlaeV3d6t81gifaVWKJy4MYVVgvJttyX/viREy+If7fz+tK/gVxTGMtyrFPnm4gjrVA==", - "dev": true, - "peer": true - }, "@types/expect": { "version": "1.20.4", "resolved": "https://registry.npmjs.org/@types/expect/-/expect-1.20.4.tgz", "integrity": "sha512-Q5Vn3yjTDyCMV50TB6VRIbQNxSE4OmZR86VSbGaNpfUolm0iePBB4KdEEHmxoY5sT2+2DIvXW0rvMDP2nHZ4Mg==", "dev": true }, - "@types/fs-extra": { - "version": "9.0.13", - "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-9.0.13.tgz", - "integrity": "sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, "@types/http-cache-semantics": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz", "integrity": "sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==", "dev": true }, - "@types/inquirer": { - "version": "8.2.4", - "resolved": "https://registry.npmjs.org/@types/inquirer/-/inquirer-8.2.4.tgz", - "integrity": "sha512-Pxxx3i3AyK7vKAj3LRM/vF7ETcHKiLJ/u5CnNgbz/eYj/vB3xGAYtRxI5IKtq0hpe5iFHD22BKV3n6WHUu0k4Q==", + "@types/istanbul-lib-coverage": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", + "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==", "dev": true, - "peer": true, + "optional": true + }, + "@types/istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", + "dev": true, + "optional": true, "requires": { - "@types/through": "*" + "@types/istanbul-lib-coverage": "*" + } + }, + "@types/istanbul-reports": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", + "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", + "dev": true, + "optional": true, + "requires": { + "@types/istanbul-lib-report": "*" } }, "@types/json-schema": { @@ -14893,43 +15149,6 @@ "@types/node": "*" } }, - "@types/lodash": { - "version": "4.14.178", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.178.tgz", - "integrity": "sha512-0d5Wd09ItQWH1qFbEyQ7oTQ3GZrMfth5JkbN3EvTKLXcHLRDSXeLnlvlOn0wvxVIwK5o2M8JzP/OWz7T3NRsbw==", - "dev": true, - "peer": true - }, - "@types/lodash.flattendeep": { - "version": "4.4.6", - "resolved": "https://registry.npmjs.org/@types/lodash.flattendeep/-/lodash.flattendeep-4.4.6.tgz", - "integrity": "sha512-uLm2MaRVlqJSGsMK0RZpP5T3KqReq+9WbYDHCUhBhp98v56hMG/Yht52bsoTSui9xz2mUvQ9NfG3LrNGDL92Ng==", - "dev": true, - "peer": true, - "requires": { - "@types/lodash": "*" - } - }, - "@types/lodash.pickby": { - "version": "4.6.6", - "resolved": "https://registry.npmjs.org/@types/lodash.pickby/-/lodash.pickby-4.6.6.tgz", - "integrity": "sha512-NFa13XxlMd9eFi0UFZFWIztpMpXhozbijrx3Yb1viYZphT7jyopIFVoIRF4eYMjruWNEG1rnyrRmg/8ej9T8Iw==", - "dev": true, - "peer": true, - "requires": { - "@types/lodash": "*" - } - }, - "@types/lodash.union": { - "version": "4.6.6", - "resolved": "https://registry.npmjs.org/@types/lodash.union/-/lodash.union-4.6.6.tgz", - "integrity": "sha512-Wu0ZEVNcyCz8eAn6TlUbYWZoGbH9E+iOHxAZbwUoCEXdUiy6qpcz5o44mMXViM4vlPLLCPlkAubEP1gokoSZaw==", - "dev": true, - "peer": true, - "requires": { - "@types/lodash": "*" - } - }, "@types/minimist": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.2.tgz", @@ -14937,9 +15156,9 @@ "dev": true }, "@types/node": { - "version": "16.11.12", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.12.tgz", - "integrity": "sha512-+2Iggwg7PxoO5Kyhvsq9VarmPbIelXP070HMImEpbtGCoyWNINQj4wzjbQCXzdHTRXnqufutJb5KAURZANNBAw==", + "version": "18.11.10", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.10.tgz", + "integrity": "sha512-juG3RWMBOqcOuXC643OAdSA525V44cVgGV6dUDuiFtss+8Fk5x1hI93Rsld43VeJVIeqlP9I7Fn9/qaVqoEAuQ==", "dev": true }, "@types/normalize-package-data": { @@ -14948,16 +15167,6 @@ "integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==", "dev": true }, - "@types/recursive-readdir": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@types/recursive-readdir/-/recursive-readdir-2.2.0.tgz", - "integrity": "sha512-HGk753KRu2N4mWduovY4BLjYq4jTOL29gV2OfGdGxHcPSWGFkC5RRIdk+VTs5XmYd7MVAD+JwKrcb5+5Y7FOCg==", - "dev": true, - "peer": true, - "requires": { - "@types/node": "*" - } - }, "@types/responselike": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.0.tgz", @@ -14982,15 +15191,12 @@ "integrity": "sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==", "dev": true }, - "@types/through": { - "version": "0.0.30", - "resolved": "https://registry.npmjs.org/@types/through/-/through-0.0.30.tgz", - "integrity": "sha512-FvnCJljyxhPM3gkRgWmxmDZyAQSiBQQWLI0A0VFL0K7W1oRUrPJSqNO0NvTnLkBcotdlp3lKvaT0JrnyRDkzOg==", + "@types/stack-utils": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz", + "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==", "dev": true, - "peer": true, - "requires": { - "@types/node": "*" - } + "optional": true }, "@types/ua-parser-js": { "version": "0.7.36", @@ -15014,10 +15220,36 @@ "integrity": "sha512-8oDqyLC7eD4HM307boe2QWKyuzdzWBj56xI/imSl2cpL+U3tCMaTAkMJ4ee5JBZ/FsOJlvRGeIShiZDAl1qERA==", "dev": true }, + "@types/ws": { + "version": "8.5.3", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.3.tgz", + "integrity": "sha512-6YOoWjruKj1uLf3INHH7D3qTXwFfEsg1kf3c0uDdSBJwfa/llkwIjrAGV7j7mVgGNbzTQ3HiHKKDXl6bJPD97w==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/yargs": { + "version": "17.0.17", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.17.tgz", + "integrity": "sha512-72bWxFKTK6uwWJAVT+3rF6Jo6RTojiJ27FQo8Rf60AL+VZbzoVPnMFhKsUnbjR8A3BTCYQ7Mv3hnl8T0A+CX9g==", + "dev": true, + "optional": true, + "requires": { + "@types/yargs-parser": "*" + } + }, + "@types/yargs-parser": { + "version": "21.0.0", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz", + "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==", + "dev": true, + "optional": true + }, "@types/yauzl": { - "version": "2.9.2", - "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.9.2.tgz", - "integrity": "sha512-8uALY5LTvSuHgloDVUvWP3pIauILm+8/0pDMokuDYIoNsOkSwd5AiHBTSEJjKTDcZr5z8UpgOWZkxBF4iJftoA==", + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha512-Cn6WYCm0tXv8p6k+A8PvbDG763EDpBoTzHdA+Q/MF6H3sapGjCm9NzoaJncJS9tUKSuCoDs9XHxYYsQDgxR6kw==", "dev": true, "optional": true, "requires": { @@ -15025,14 +15257,14 @@ } }, "@typescript-eslint/eslint-plugin": { - "version": "5.42.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.42.0.tgz", - "integrity": "sha512-5TJh2AgL6+wpL8H/GTSjNb4WrjKoR2rqvFxR/DDTqYNk6uXn8BJMEcncLSpMbf/XV1aS0jAjYwn98uvVCiAywQ==", + "version": "5.46.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.46.0.tgz", + "integrity": "sha512-QrZqaIOzJAjv0sfjY4EjbXUi3ZOFpKfzntx22gPGr9pmFcTjcFw/1sS1LJhEubfAGwuLjNrPV0rH+D1/XZFy7Q==", "dev": true, "requires": { - "@typescript-eslint/scope-manager": "5.42.0", - "@typescript-eslint/type-utils": "5.42.0", - "@typescript-eslint/utils": "5.42.0", + "@typescript-eslint/scope-manager": "5.46.0", + "@typescript-eslint/type-utils": "5.46.0", + "@typescript-eslint/utils": "5.46.0", "debug": "^4.3.4", "ignore": "^5.2.0", "natural-compare-lite": "^1.4.0", @@ -15042,28 +15274,28 @@ }, "dependencies": { "@typescript-eslint/scope-manager": { - "version": "5.42.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.42.0.tgz", - "integrity": "sha512-l5/3IBHLH0Bv04y+H+zlcLiEMEMjWGaCX6WyHE5Uk2YkSGAMlgdUPsT/ywTSKgu9D1dmmKMYgYZijObfA39Wow==", + "version": "5.46.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.46.0.tgz", + "integrity": "sha512-7wWBq9d/GbPiIM6SqPK9tfynNxVbfpihoY5cSFMer19OYUA3l4powA2uv0AV2eAZV6KoAh6lkzxv4PoxOLh1oA==", "dev": true, "requires": { - "@typescript-eslint/types": "5.42.0", - "@typescript-eslint/visitor-keys": "5.42.0" + "@typescript-eslint/types": "5.46.0", + "@typescript-eslint/visitor-keys": "5.46.0" } }, "@typescript-eslint/types": { - "version": "5.42.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.42.0.tgz", - "integrity": "sha512-t4lzO9ZOAUcHY6bXQYRuu+3SSYdD9TS8ooApZft4WARt4/f2Cj/YpvbTe8A4GuhT4bNW72goDMOy7SW71mZwGw==", + "version": "5.46.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.46.0.tgz", + "integrity": "sha512-wHWgQHFB+qh6bu0IAPAJCdeCdI0wwzZnnWThlmHNY01XJ9Z97oKqKOzWYpR2I83QmshhQJl6LDM9TqMiMwJBTw==", "dev": true }, "@typescript-eslint/visitor-keys": { - "version": "5.42.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.42.0.tgz", - "integrity": "sha512-QHbu5Hf/2lOEOwy+IUw0GoSCuAzByTAWWrOTKzTzsotiUnWFpuKnXcAhC9YztAf2EElQ0VvIK+pHJUPkM0q7jg==", + "version": "5.46.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.46.0.tgz", + "integrity": "sha512-E13gBoIXmaNhwjipuvQg1ByqSAu/GbEpP/qzFihugJ+MomtoJtFAJG/+2DRPByf57B863m0/q7Zt16V9ohhANw==", "dev": true, "requires": { - "@typescript-eslint/types": "5.42.0", + "@typescript-eslint/types": "5.46.0", "eslint-visitor-keys": "^3.3.0" } } @@ -15094,31 +15326,31 @@ } }, "@typescript-eslint/type-utils": { - "version": "5.42.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.42.0.tgz", - "integrity": "sha512-HW14TXC45dFVZxnVW8rnUGnvYyRC0E/vxXShFCthcC9VhVTmjqOmtqj6H5rm9Zxv+ORxKA/1aLGD7vmlLsdlOg==", + "version": "5.46.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.46.0.tgz", + "integrity": "sha512-dwv4nimVIAsVS2dTA0MekkWaRnoYNXY26dKz8AN5W3cBFYwYGFQEqm/cG+TOoooKlncJS4RTbFKgcFY/pOiBCg==", "dev": true, "requires": { - "@typescript-eslint/typescript-estree": "5.42.0", - "@typescript-eslint/utils": "5.42.0", + "@typescript-eslint/typescript-estree": "5.46.0", + "@typescript-eslint/utils": "5.46.0", "debug": "^4.3.4", "tsutils": "^3.21.0" }, "dependencies": { "@typescript-eslint/types": { - "version": "5.42.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.42.0.tgz", - "integrity": "sha512-t4lzO9ZOAUcHY6bXQYRuu+3SSYdD9TS8ooApZft4WARt4/f2Cj/YpvbTe8A4GuhT4bNW72goDMOy7SW71mZwGw==", + "version": "5.46.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.46.0.tgz", + "integrity": "sha512-wHWgQHFB+qh6bu0IAPAJCdeCdI0wwzZnnWThlmHNY01XJ9Z97oKqKOzWYpR2I83QmshhQJl6LDM9TqMiMwJBTw==", "dev": true }, "@typescript-eslint/typescript-estree": { - "version": "5.42.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.42.0.tgz", - "integrity": "sha512-2O3vSq794x3kZGtV7i4SCWZWCwjEtkWfVqX4m5fbUBomOsEOyd6OAD1qU2lbvV5S8tgy/luJnOYluNyYVeOTTg==", + "version": "5.46.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.46.0.tgz", + "integrity": "sha512-kDLNn/tQP+Yp8Ro2dUpyyVV0Ksn2rmpPpB0/3MO874RNmXtypMwSeazjEN/Q6CTp8D7ExXAAekPEcCEB/vtJkw==", "dev": true, "requires": { - "@typescript-eslint/types": "5.42.0", - "@typescript-eslint/visitor-keys": "5.42.0", + "@typescript-eslint/types": "5.46.0", + "@typescript-eslint/visitor-keys": "5.46.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -15127,12 +15359,12 @@ } }, "@typescript-eslint/visitor-keys": { - "version": "5.42.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.42.0.tgz", - "integrity": "sha512-QHbu5Hf/2lOEOwy+IUw0GoSCuAzByTAWWrOTKzTzsotiUnWFpuKnXcAhC9YztAf2EElQ0VvIK+pHJUPkM0q7jg==", + "version": "5.46.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.46.0.tgz", + "integrity": "sha512-E13gBoIXmaNhwjipuvQg1ByqSAu/GbEpP/qzFihugJ+MomtoJtFAJG/+2DRPByf57B863m0/q7Zt16V9ohhANw==", "dev": true, "requires": { - "@typescript-eslint/types": "5.42.0", + "@typescript-eslint/types": "5.46.0", "eslint-visitor-keys": "^3.3.0" } } @@ -15162,45 +15394,45 @@ } }, "@typescript-eslint/utils": { - "version": "5.42.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.42.0.tgz", - "integrity": "sha512-JZ++3+h1vbeG1NUECXQZE3hg0kias9kOtcQr3+JVQ3whnjvKuMyktJAAIj6743OeNPnGBmjj7KEmiDL7qsdnCQ==", + "version": "5.46.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.46.0.tgz", + "integrity": "sha512-4O+Ps1CRDw+D+R40JYh5GlKLQERXRKW5yIQoNDpmXPJ+C7kaPF9R7GWl+PxGgXjB3PQCqsaaZUpZ9dG4U6DO7g==", "dev": true, "requires": { "@types/json-schema": "^7.0.9", "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.42.0", - "@typescript-eslint/types": "5.42.0", - "@typescript-eslint/typescript-estree": "5.42.0", + "@typescript-eslint/scope-manager": "5.46.0", + "@typescript-eslint/types": "5.46.0", + "@typescript-eslint/typescript-estree": "5.46.0", "eslint-scope": "^5.1.1", "eslint-utils": "^3.0.0", "semver": "^7.3.7" }, "dependencies": { "@typescript-eslint/scope-manager": { - "version": "5.42.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.42.0.tgz", - "integrity": "sha512-l5/3IBHLH0Bv04y+H+zlcLiEMEMjWGaCX6WyHE5Uk2YkSGAMlgdUPsT/ywTSKgu9D1dmmKMYgYZijObfA39Wow==", + "version": "5.46.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.46.0.tgz", + "integrity": "sha512-7wWBq9d/GbPiIM6SqPK9tfynNxVbfpihoY5cSFMer19OYUA3l4powA2uv0AV2eAZV6KoAh6lkzxv4PoxOLh1oA==", "dev": true, "requires": { - "@typescript-eslint/types": "5.42.0", - "@typescript-eslint/visitor-keys": "5.42.0" + "@typescript-eslint/types": "5.46.0", + "@typescript-eslint/visitor-keys": "5.46.0" } }, "@typescript-eslint/types": { - "version": "5.42.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.42.0.tgz", - "integrity": "sha512-t4lzO9ZOAUcHY6bXQYRuu+3SSYdD9TS8ooApZft4WARt4/f2Cj/YpvbTe8A4GuhT4bNW72goDMOy7SW71mZwGw==", + "version": "5.46.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.46.0.tgz", + "integrity": "sha512-wHWgQHFB+qh6bu0IAPAJCdeCdI0wwzZnnWThlmHNY01XJ9Z97oKqKOzWYpR2I83QmshhQJl6LDM9TqMiMwJBTw==", "dev": true }, "@typescript-eslint/typescript-estree": { - "version": "5.42.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.42.0.tgz", - "integrity": "sha512-2O3vSq794x3kZGtV7i4SCWZWCwjEtkWfVqX4m5fbUBomOsEOyd6OAD1qU2lbvV5S8tgy/luJnOYluNyYVeOTTg==", + "version": "5.46.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.46.0.tgz", + "integrity": "sha512-kDLNn/tQP+Yp8Ro2dUpyyVV0Ksn2rmpPpB0/3MO874RNmXtypMwSeazjEN/Q6CTp8D7ExXAAekPEcCEB/vtJkw==", "dev": true, "requires": { - "@typescript-eslint/types": "5.42.0", - "@typescript-eslint/visitor-keys": "5.42.0", + "@typescript-eslint/types": "5.46.0", + "@typescript-eslint/visitor-keys": "5.46.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -15209,12 +15441,12 @@ } }, "@typescript-eslint/visitor-keys": { - "version": "5.42.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.42.0.tgz", - "integrity": "sha512-QHbu5Hf/2lOEOwy+IUw0GoSCuAzByTAWWrOTKzTzsotiUnWFpuKnXcAhC9YztAf2EElQ0VvIK+pHJUPkM0q7jg==", + "version": "5.46.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.46.0.tgz", + "integrity": "sha512-E13gBoIXmaNhwjipuvQg1ByqSAu/GbEpP/qzFihugJ+MomtoJtFAJG/+2DRPByf57B863m0/q7Zt16V9ohhANw==", "dev": true, "requires": { - "@typescript-eslint/types": "5.42.0", + "@typescript-eslint/types": "5.46.0", "eslint-visitor-keys": "^3.3.0" } }, @@ -15241,376 +15473,95 @@ "eslint-visitor-keys": "^3.3.0" } }, - "@wdio/cli": { - "version": "7.16.10", - "resolved": "https://registry.npmjs.org/@wdio/cli/-/cli-7.16.10.tgz", - "integrity": "sha512-VYip4i1SKRwsTiLd9I5EaHP7l+5F4jStQ5JulejEbYDHor6NEcakGsF+m6JAzHZgxs9QcskNxLr8tBveXM/b7w==", + "@wdio/globals": { + "version": "8.0.12", + "resolved": "https://registry.npmjs.org/@wdio/globals/-/globals-8.0.12.tgz", + "integrity": "sha512-6D/ZXBxHbANOfs1OKtk9g4O6xeGhAMvzvZnwtfkXQ+ywozfdv1oOzqZ/01wQwrRbmVlfLfIoMy9/kcXjtKP13A==", "dev": true, - "peer": true, "requires": { - "@types/ejs": "^3.0.5", - "@types/fs-extra": "^9.0.4", - "@types/inquirer": "^8.1.2", - "@types/lodash.flattendeep": "^4.4.6", - "@types/lodash.pickby": "^4.6.6", - "@types/lodash.union": "^4.6.6", - "@types/node": "^16.11.1", - "@types/recursive-readdir": "^2.2.0", - "@wdio/config": "7.16.3", - "@wdio/logger": "7.16.0", - "@wdio/types": "7.16.3", - "@wdio/utils": "7.16.3", - "async-exit-hook": "^2.0.1", - "chalk": "^4.0.0", - "chokidar": "^3.0.0", - "cli-spinners": "^2.1.0", - "ejs": "^3.0.1", - "fs-extra": "^10.0.0", - "inquirer": "8.1.5", - "lodash.flattendeep": "^4.4.0", - "lodash.pickby": "^4.6.0", - "lodash.union": "^4.6.0", - "mkdirp": "^1.0.4", - "recursive-readdir": "^2.2.2", - "webdriverio": "7.16.10", - "yargs": "^17.0.0", - "yarn-install": "^1.0.0" - }, - "dependencies": { - "@wdio/repl": { - "version": "7.16.3", - "resolved": "https://registry.npmjs.org/@wdio/repl/-/repl-7.16.3.tgz", - "integrity": "sha512-aFpWyAIuPo6VVmkotZDWXMzd4qw3gD+xAhB6blNrMCZKWnz9+HqZnuGGc6pmiyuc5yFzb9wF22tnIxuyTyH7yA==", - "dev": true, - "peer": true, - "requires": { - "@wdio/utils": "7.16.3" - } - }, - "debug": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", - "dev": true, - "peer": true, - "requires": { - "ms": "2.1.2" - } - }, - "devtools": { - "version": "7.16.10", - "resolved": "https://registry.npmjs.org/devtools/-/devtools-7.16.10.tgz", - "integrity": "sha512-43uB3t6uNjWsqiQKRLY7axFLuMdKqlQxq6N3FWCfBKl9We1oygkGkE7Scnushdbc4lk7QwGXBC1DQ83dCgA5Gw==", - "dev": true, - "peer": true, - "requires": { - "@types/node": "^16.11.1", - "@types/ua-parser-js": "^0.7.33", - "@wdio/config": "7.16.3", - "@wdio/logger": "7.16.0", - "@wdio/protocols": "7.16.7", - "@wdio/types": "7.16.3", - "@wdio/utils": "7.16.3", - "chrome-launcher": "^0.15.0", - "edge-paths": "^2.1.0", - "puppeteer-core": "^11.0.0", - "query-selector-shadow-dom": "^1.0.0", - "ua-parser-js": "^1.0.1", - "uuid": "^8.0.0" - } - }, - "devtools-protocol": { - "version": "0.0.944179", - "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.944179.tgz", - "integrity": "sha512-oqBbLKuCAkEqqsWn0rsfkjy79F0/QTQR/rlijZzeHInJfDRPYwP0D04NiQX9MQmucrAyRWGseY0b/ff0yhQdXg==", - "dev": true, - "peer": true - }, - "node-fetch": { - "version": "2.6.5", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.5.tgz", - "integrity": "sha512-mmlIVHJEu5rnIxgEgez6b9GgWXbkZj5YZ7fx+2r94a2E+Uirsp6HsPTPlomfdHtpt/B0cdKviwkoaM6pyvUOpQ==", - "dev": true, - "peer": true, - "requires": { - "whatwg-url": "^5.0.0" - } - }, - "puppeteer-core": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-11.0.0.tgz", - "integrity": "sha512-hfQ39KNP0qKplQ86iaCNXHH9zpWlV01UFdggt2qffgWeCBF9KMavwP/k/iK/JidPPWfOnKZhDLSHZVSUr73DtA==", - "dev": true, - "peer": true, - "requires": { - "debug": "4.3.2", - "devtools-protocol": "0.0.901419", - "extract-zip": "2.0.1", - "https-proxy-agent": "5.0.0", - "node-fetch": "2.6.5", - "pkg-dir": "4.2.0", - "progress": "2.0.3", - "proxy-from-env": "1.1.0", - "rimraf": "3.0.2", - "tar-fs": "2.1.1", - "unbzip2-stream": "1.4.3", - "ws": "8.2.3" - }, - "dependencies": { - "devtools-protocol": { - "version": "0.0.901419", - "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.901419.tgz", - "integrity": "sha512-4INMPwNm9XRpBukhNbF7OB6fNTTCaI8pzy/fXg0xQzAy5h3zL1P8xT3QazgKqBrb/hAYwIBizqDBZ7GtJE74QQ==", - "dev": true, - "peer": true - } - } - }, - "tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=", - "dev": true, - "peer": true - }, - "uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "dev": true, - "peer": true - }, - "webdriver": { - "version": "7.16.9", - "resolved": "https://registry.npmjs.org/webdriver/-/webdriver-7.16.9.tgz", - "integrity": "sha512-6bpiyE3/1ncgyNM/RwzEWjpxu2NLYyeYNu/97OMEwFMDV8EqvlZh3wFnODi6tY0K5t4dEryIPiyjF3MDVySRAg==", - "dev": true, - "peer": true, - "requires": { - "@types/node": "^16.11.1", - "@wdio/config": "7.16.3", - "@wdio/logger": "7.16.0", - "@wdio/protocols": "7.16.7", - "@wdio/types": "7.16.3", - "@wdio/utils": "7.16.3", - "got": "^11.0.2", - "ky": "^0.28.5", - "lodash.merge": "^4.6.1" - } - }, - "webdriverio": { - "version": "7.16.10", - "resolved": "https://registry.npmjs.org/webdriverio/-/webdriverio-7.16.10.tgz", - "integrity": "sha512-Idsn0084HqcqHa5/BW/75dwFEitSDi/hhXk+GRA0wZkVU7woE8ZKACsMS270kOADgXYU9XJBT8jo6YM3R3Sa+Q==", - "dev": true, - "peer": true, - "requires": { - "@types/aria-query": "^5.0.0", - "@types/node": "^16.11.1", - "@wdio/config": "7.16.3", - "@wdio/logger": "7.16.0", - "@wdio/protocols": "7.16.7", - "@wdio/repl": "7.16.3", - "@wdio/types": "7.16.3", - "@wdio/utils": "7.16.3", - "archiver": "^5.0.0", - "aria-query": "^5.0.0", - "css-shorthand-properties": "^1.1.1", - "css-value": "^0.0.1", - "devtools": "7.16.10", - "devtools-protocol": "^0.0.944179", - "fs-extra": "^10.0.0", - "get-port": "^5.1.1", - "grapheme-splitter": "^1.0.2", - "lodash.clonedeep": "^4.5.0", - "lodash.isobject": "^3.0.2", - "lodash.isplainobject": "^4.0.6", - "lodash.zip": "^4.2.0", - "minimatch": "^3.0.4", - "puppeteer-core": "^11.0.0", - "query-selector-shadow-dom": "^1.0.0", - "resq": "^1.9.1", - "rgb2hex": "0.2.5", - "serialize-error": "^8.0.0", - "webdriver": "7.16.9" - } - }, - "webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=", - "dev": true, - "peer": true - }, - "whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=", - "dev": true, - "peer": true, - "requires": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, - "ws": { - "version": "8.2.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.2.3.tgz", - "integrity": "sha512-wBuoj1BDpC6ZQ1B7DWQBYVLphPWkm8i9Y0/3YdHjHKHiohOJ1ws+3OccDWtH+PoC9DZD5WOTrJvNbWvjS6JWaA==", - "dev": true, - "peer": true, - "requires": {} - } - } - }, - "@wdio/config": { - "version": "7.16.3", - "resolved": "https://registry.npmjs.org/@wdio/config/-/config-7.16.3.tgz", - "integrity": "sha512-YbpeZAeEncyJrsKxfAwjhNbDUf/ZrMB2Io3PYnH3RQjEEo5lYlO15aUt9uJx09W5h8hBPcrj7CfUC5yNkFZJhw==", - "dev": true, - "peer": true, - "requires": { - "@wdio/logger": "7.16.0", - "@wdio/types": "7.16.3", - "deepmerge": "^4.0.0", - "glob": "^7.1.2" + "expect-webdriverio": "^4.0.1", + "webdriverio": "8.0.12" } }, "@wdio/logger": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@wdio/logger/-/logger-7.16.0.tgz", - "integrity": "sha512-/6lOGb2Iow5eSsy7RJOl1kCwsP4eMlG+/QKro5zUJsuyNJSQXf2ejhpkzyKWLgQbHu83WX6cM1014AZuLkzoQg==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@wdio/logger/-/logger-8.0.0.tgz", + "integrity": "sha512-QEBPZoFQhWqqIYmhp8Wa+HhvMrH2Yy0xbD3MPOibkFwp9Tn8Si7oDxbnWqzcPiukLWcb4E/QlgE5f3IM5BrAPQ==", "dev": true, - "peer": true, "requires": { - "chalk": "^4.0.0", + "chalk": "^5.1.2", "loglevel": "^1.6.0", "loglevel-plugin-prefix": "^0.8.4", "strip-ansi": "^6.0.0" - } - }, - "@wdio/protocols": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@wdio/protocols/-/protocols-7.16.7.tgz", - "integrity": "sha512-Wv40pNQcLiPzQ3o98Mv4A8T1EBQ6k4khglz/e2r16CTm+F3DDYh8eLMAsU5cgnmuwwDKX1EyOiFwieykBn5MCg==", - "dev": true, - "peer": true - }, - "@wdio/repl": { - "version": "7.25.1", - "resolved": "https://registry.npmjs.org/@wdio/repl/-/repl-7.25.1.tgz", - "integrity": "sha512-3DUtOrLi5thba22IBn/XQ7caFrbXtYOg3750UtXxUuxXU4QHkKq1AN8+WXr4Rq2EnXfB2G9t9pEdqjZSv9oPAw==", - "dev": true, - "requires": { - "@wdio/utils": "7.25.1" }, "dependencies": { - "@types/node": { - "version": "18.8.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.8.0.tgz", - "integrity": "sha512-u+h43R6U8xXDt2vzUaVP3VwjjLyOJk6uEciZS8OSyziUQGOwmk+l+4drxcsDboHXwyTaqS1INebghmWMRxq3LA==", + "chalk": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.1.2.tgz", + "integrity": "sha512-E5CkT4jWURs1Vy5qGJye+XwCkNj7Od3Af7CP6SujMetSMkLs8Do2RWJK5yx1wamHV/op8Rz+9rltjaTQWDnEFQ==", "dev": true - }, - "@wdio/logger": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@wdio/logger/-/logger-7.19.0.tgz", - "integrity": "sha512-xR7SN/kGei1QJD1aagzxs3KMuzNxdT/7LYYx+lt6BII49+fqL/SO+5X0FDCZD0Ds93AuQvvz9eGyzrBI2FFXmQ==", - "dev": true, - "requires": { - "chalk": "^4.0.0", - "loglevel": "^1.6.0", - "loglevel-plugin-prefix": "^0.8.4", - "strip-ansi": "^6.0.0" - } - }, - "@wdio/types": { - "version": "7.25.1", - "resolved": "https://registry.npmjs.org/@wdio/types/-/types-7.25.1.tgz", - "integrity": "sha512-9Xt2U0YXYxRW4UvMFwjt+44UkfhwrI1gPhW+y56SubpyKaUfdNGberteboQoR/7Os1SVtJry4FohEZNmFzPK6g==", - "dev": true, - "requires": { - "@types/node": "^18.0.0", - "got": "^11.8.1" - } - }, - "@wdio/utils": { - "version": "7.25.1", - "resolved": "https://registry.npmjs.org/@wdio/utils/-/utils-7.25.1.tgz", - "integrity": "sha512-DL+nDRVgzruJLhedBUQEMUcojLoGwsjCQCYWram4NfwAIIkxcAX/5Y4vHSut3OoW2bEHl3R8/FQ4B/ivIr2EoQ==", - "dev": true, - "requires": { - "@wdio/logger": "7.19.0", - "@wdio/types": "7.25.1", - "p-iteration": "^1.1.8" - } } } }, + "@wdio/protocols": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@wdio/protocols/-/protocols-8.0.0.tgz", + "integrity": "sha512-iTfYOcli/98ubeTqxyP9+OBPQxfbB5cPK6Zv61C9Rr4qQkzx4GPQjn/AlK0r6Bn0dRy/9lGyb2Q3UBRCx85RSQ==", + "dev": true + }, + "@wdio/repl": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@wdio/repl/-/repl-8.0.0.tgz", + "integrity": "sha512-Qys/t/NioO+LlcDcD+4Agn0JJjIiO6fkqOJJDxv3QulGPCmQ5SaYX+BQyz1o9sGscfr8s/435d+3dkBSO1+3tQ==", + "dev": true + }, "@wdio/selenium-standalone-service": { - "version": "7.25.1", - "resolved": "https://registry.npmjs.org/@wdio/selenium-standalone-service/-/selenium-standalone-service-7.25.1.tgz", - "integrity": "sha512-TRD4hAxdHuZ0z414eDayE6q2gEmyAg7YdMrF+CJHWbjZKhJG4cqTSpV04zgMfQmTov5Y2+WtasdlGnqV5AXfMg==", + "version": "8.0.11", + "resolved": "https://registry.npmjs.org/@wdio/selenium-standalone-service/-/selenium-standalone-service-8.0.11.tgz", + "integrity": "sha512-k2dT4AEmqVjYv1UmqoQHdQHqHJq+qkZfXyCKo7MeyG4XZ423ioo+otztATu0NiNT7UNSmBbunBis9nUBGWaoUg==", "dev": true, "requires": { - "@types/fs-extra": "^9.0.1", - "@types/node": "^18.0.0", "@types/selenium-standalone": "^7.0.0", - "@wdio/config": "7.25.1", - "@wdio/logger": "7.19.0", - "@wdio/types": "7.25.1", - "fs-extra": "^10.0.0", - "selenium-standalone": "^8.0.3" + "@wdio/config": "8.0.11", + "@wdio/logger": "8.0.0", + "@wdio/types": "8.0.11", + "selenium-standalone": "^8.2.1" }, "dependencies": { - "@types/node": { - "version": "18.8.2", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.8.2.tgz", - "integrity": "sha512-cRMwIgdDN43GO4xMWAfJAecYn8wV4JbsOGHNfNUIDiuYkUYAR5ec4Rj7IO2SAhFPEfpPtLtUTbbny/TCT7aDwA==", - "dev": true - }, "@wdio/config": { - "version": "7.25.1", - "resolved": "https://registry.npmjs.org/@wdio/config/-/config-7.25.1.tgz", - "integrity": "sha512-7I3L+TE75gvh8jiv8cE/Ch9S9erDgrZG9o5587OlNKfpgFciT7DH7/efPXzYwh8YPFV3grFaydxaaoYzDv6PDA==", + "version": "8.0.11", + "resolved": "https://registry.npmjs.org/@wdio/config/-/config-8.0.11.tgz", + "integrity": "sha512-LR8n6TJfDzVtDmuge4EjOHiJKae73ZyvEwTQq3tokovRIbIMaVkfsRV9iqEZiRgohy14ehAREwNgn67j77ucYA==", "dev": true, "requires": { - "@wdio/logger": "7.19.0", - "@wdio/types": "7.25.1", - "@wdio/utils": "7.25.1", - "deepmerge": "^4.0.0", - "glob": "^8.0.3" - } - }, - "@wdio/logger": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@wdio/logger/-/logger-7.19.0.tgz", - "integrity": "sha512-xR7SN/kGei1QJD1aagzxs3KMuzNxdT/7LYYx+lt6BII49+fqL/SO+5X0FDCZD0Ds93AuQvvz9eGyzrBI2FFXmQ==", - "dev": true, - "requires": { - "chalk": "^4.0.0", - "loglevel": "^1.6.0", - "loglevel-plugin-prefix": "^0.8.4", - "strip-ansi": "^6.0.0" + "@wdio/logger": "8.0.0", + "@wdio/types": "8.0.11", + "@wdio/utils": "8.0.11", + "decamelize": "^6.0.0", + "deepmerge-ts": "^4.2.2", + "glob": "^8.0.3", + "import-meta-resolve": "^2.1.0", + "read-pkg-up": "^9.1.0" } }, "@wdio/types": { - "version": "7.25.1", - "resolved": "https://registry.npmjs.org/@wdio/types/-/types-7.25.1.tgz", - "integrity": "sha512-9Xt2U0YXYxRW4UvMFwjt+44UkfhwrI1gPhW+y56SubpyKaUfdNGberteboQoR/7Os1SVtJry4FohEZNmFzPK6g==", + "version": "8.0.11", + "resolved": "https://registry.npmjs.org/@wdio/types/-/types-8.0.11.tgz", + "integrity": "sha512-54xbajB7tqWmYPXFI0ALupPauwLyVtPSZSG/R/DPlY25p+Ygw4jwH64s+Jh1V3TZYnktfv4cIt1Bw/M35cBgOQ==", "dev": true, "requires": { - "@types/node": "^18.0.0", - "got": "^11.8.1" + "@types/node": "^18.0.0" } }, "@wdio/utils": { - "version": "7.25.1", - "resolved": "https://registry.npmjs.org/@wdio/utils/-/utils-7.25.1.tgz", - "integrity": "sha512-DL+nDRVgzruJLhedBUQEMUcojLoGwsjCQCYWram4NfwAIIkxcAX/5Y4vHSut3OoW2bEHl3R8/FQ4B/ivIr2EoQ==", + "version": "8.0.11", + "resolved": "https://registry.npmjs.org/@wdio/utils/-/utils-8.0.11.tgz", + "integrity": "sha512-4nIYt1KP4IVIYfnld+Kbh/l85o7VK4roAEIfiHV374utPpspzV+eli4ANX2fEOGVUVJMVNBCN/sCsL8u3DsPpw==", "dev": true, "requires": { - "@wdio/logger": "7.19.0", - "@wdio/types": "7.25.1", + "@wdio/logger": "8.0.0", + "@wdio/types": "8.0.11", + "import-meta-resolve": "^2.2.0", "p-iteration": "^1.1.8" } }, @@ -15623,6 +15574,22 @@ "balanced-match": "^1.0.0" } }, + "decamelize": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-6.0.0.tgz", + "integrity": "sha512-Fv96DCsdOgB6mdGl67MT5JaTNKRzrzill5OH5s8bjYJXVlcXyPYGyPsUkWyGV5p1TXI5esYIYMMeDJL0hEIwaA==", + "dev": true + }, + "find-up": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz", + "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==", + "dev": true, + "requires": { + "locate-path": "^7.1.0", + "path-exists": "^5.0.0" + } + }, "glob": { "version": "8.0.3", "resolved": "https://registry.npmjs.org/glob/-/glob-8.0.3.tgz", @@ -15636,40 +15603,79 @@ "once": "^1.3.0" } }, + "locate-path": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.1.1.tgz", + "integrity": "sha512-vJXaRMJgRVD3+cUZs3Mncj2mxpt5mP0EmNOsxRSZRMlbqjvxzDEOIUWXGmavo0ZC9+tNZCBLQ66reA11nbpHZg==", + "dev": true, + "requires": { + "p-locate": "^6.0.0" + } + }, "minimatch": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.0.tgz", - "integrity": "sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.1.tgz", + "integrity": "sha512-362NP+zlprccbEt/SkxKfRMHnNY85V74mVnpUpNyr3F35covl09Kec7/sEFLt3RA4oXmewtoaanoIf67SE5Y5g==", "dev": true, "requires": { "brace-expansion": "^2.0.1" } + }, + "p-limit": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", + "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", + "dev": true, + "requires": { + "yocto-queue": "^1.0.0" + } + }, + "p-locate": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", + "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", + "dev": true, + "requires": { + "p-limit": "^4.0.0" + } + }, + "path-exists": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", + "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", + "dev": true + }, + "read-pkg": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-7.1.0.tgz", + "integrity": "sha512-5iOehe+WF75IccPc30bWTbpdDQLOCc3Uu8bi3Dte3Eueij81yx1Mrufk8qBx/YAbR4uL1FdUr+7BKXDwEtisXg==", + "dev": true, + "requires": { + "@types/normalize-package-data": "^2.4.1", + "normalize-package-data": "^3.0.2", + "parse-json": "^5.2.0", + "type-fest": "^2.0.0" + } + }, + "read-pkg-up": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-9.1.0.tgz", + "integrity": "sha512-vaMRR1AC1nrd5CQM0PhlRsO5oc2AAigqr7cCrZ/MW/Rsaflz4RlgzkpL4qoU/z1F6wrbd85iFv1OQj/y5RdGvg==", + "dev": true, + "requires": { + "find-up": "^6.3.0", + "read-pkg": "^7.1.0", + "type-fest": "^2.5.0" + } + }, + "yocto-queue": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", + "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", + "dev": true } } }, - "@wdio/types": { - "version": "7.16.3", - "resolved": "https://registry.npmjs.org/@wdio/types/-/types-7.16.3.tgz", - "integrity": "sha512-iJLtJrOJZSJrXR1zseCkVWUFs477FngjWz2HTMfGHR69LzfmxC0RNagemjZuLTfhTqWp/FBbqaA/F+7xJdNKag==", - "dev": true, - "peer": true, - "requires": { - "@types/node": "^16.11.1", - "got": "^11.8.1" - } - }, - "@wdio/utils": { - "version": "7.16.3", - "resolved": "https://registry.npmjs.org/@wdio/utils/-/utils-7.16.3.tgz", - "integrity": "sha512-/662h5Z7B5TejHN6GiW96PAKuTPi/xcAGmtjA9ozRBI2/0eHSccDfNEaBgTTjLqqEgGAXylHcOuxHOrKx2ddJw==", - "dev": true, - "peer": true, - "requires": { - "@wdio/logger": "7.16.0", - "@wdio/types": "7.16.3", - "p-iteration": "^1.1.8" - } - }, "@yarnpkg/lockfile": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz", @@ -15677,9 +15683,9 @@ "dev": true }, "abab": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.5.tgz", - "integrity": "sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q==" + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", + "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==" }, "abort-controller": { "version": "3.0.0", @@ -15691,30 +15697,17 @@ } }, "acorn": { - "version": "8.8.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.0.tgz", - "integrity": "sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==", - "dev": true + "version": "8.8.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.1.tgz", + "integrity": "sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==" }, "acorn-globals": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-4.3.4.tgz", - "integrity": "sha512-clfQEh21R+D0leSbUdWf3OcfqyaCSAQ8Ryq00bofSekfr9W8u1jyYZo6ir0xu9Gtcf7BjcHJpnbZH7JOCpP60A==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-7.0.1.tgz", + "integrity": "sha512-umOSDSDrfHbTNPuNpC2NSnnA3LUrqpevPb4T9jRx4MagXNS0rs+gwiTcAvqCRmsD6utzsrzNt+ebm00SNWiC3Q==", "requires": { - "acorn": "^6.0.1", - "acorn-walk": "^6.0.1" - }, - "dependencies": { - "acorn": { - "version": "6.4.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz", - "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==" - }, - "acorn-walk": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-6.2.0.tgz", - "integrity": "sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA==" - } + "acorn": "^8.1.0", + "acorn-walk": "^8.0.2" } }, "acorn-jsx": { @@ -15727,14 +15720,12 @@ "acorn-walk": { "version": "8.2.0", "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", - "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", - "dev": true + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==" }, "agent-base": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "dev": true, "requires": { "debug": "4" } @@ -15743,6 +15734,7 @@ "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, "requires": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -15756,16 +15748,6 @@ "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", "dev": true }, - "ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "dev": true, - "peer": true, - "requires": { - "type-fest": "^0.21.3" - } - }, "ansi-gray": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/ansi-gray/-/ansi-gray-0.1.1.tgz", @@ -15936,7 +15918,9 @@ "array-equal": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/array-equal/-/array-equal-1.0.0.tgz", - "integrity": "sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM=" + "integrity": "sha512-H3LU5RLiSsGXPhN+Nipar0iR0IofH+8r89G2y1tBKxQ/agagKyAjhkAFDRBfodP2caPrNKHpAWNIM/c9yeL7uA==", + "dev": true, + "peer": true }, "array-find-index": { "version": "1.0.2", @@ -16024,6 +16008,8 @@ "version": "0.2.6", "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", + "dev": true, + "peer": true, "requires": { "safer-buffer": "~2.1.0" } @@ -16031,7 +16017,9 @@ "assert-plus": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" + "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", + "dev": true, + "peer": true }, "assertion-error": { "version": "1.1.0", @@ -16052,15 +16040,14 @@ "dev": true }, "async-done": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/async-done/-/async-done-1.3.2.tgz", - "integrity": "sha512-uYkTP8dw2og1tu1nmza1n1CMW0qb8gWWlwqMmLb7MhBVs4BXrFziT6HXUd+/RlRA/i4H9AkofYloUbs1fwMqlw==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/async-done/-/async-done-2.0.0.tgz", + "integrity": "sha512-j0s3bzYq9yKIVLKGE/tWlCpa3PfFLcrDZLTSVdnnCTGagXuXBJO4SsY9Xdk/fQBirCkH4evW5xOeJXqlAQFdsw==", "dev": true, "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.2", - "process-nextick-args": "^2.0.0", - "stream-exhaust": "^1.0.1" + "end-of-stream": "^1.4.4", + "once": "^1.4.0", + "stream-exhaust": "^1.0.2" } }, "async-each": { @@ -16069,13 +16056,6 @@ "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==", "dev": true }, - "async-exit-hook": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/async-exit-hook/-/async-exit-hook-2.0.1.tgz", - "integrity": "sha512-NW2cX8m1Q7KPA7a5M2ULQeZ2wR5qI5PAbw5L0UOMxdioVk9PMZ0h1TmyZEkPYrCvYjDlFICusOu1dlEKAAeXBw==", - "dev": true, - "peer": true - }, "async-settle": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/async-settle/-/async-settle-1.0.0.tgz", @@ -16083,12 +16063,26 @@ "dev": true, "requires": { "async-done": "^1.2.2" + }, + "dependencies": { + "async-done": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/async-done/-/async-done-1.3.2.tgz", + "integrity": "sha512-uYkTP8dw2og1tu1nmza1n1CMW0qb8gWWlwqMmLb7MhBVs4BXrFziT6HXUd+/RlRA/i4H9AkofYloUbs1fwMqlw==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.2", + "process-nextick-args": "^2.0.0", + "stream-exhaust": "^1.0.1" + } + } } }, "asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" }, "atob": { "version": "2.1.2", @@ -16099,12 +16093,16 @@ "aws-sign2": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" + "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==", + "dev": true, + "peer": true }, "aws4": { "version": "1.11.0", "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", - "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==" + "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==", + "dev": true, + "peer": true }, "bach": { "version": "1.2.0", @@ -16121,6 +16119,20 @@ "async-done": "^1.2.2", "async-settle": "^1.0.0", "now-and-later": "^2.0.0" + }, + "dependencies": { + "async-done": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/async-done/-/async-done-1.3.2.tgz", + "integrity": "sha512-uYkTP8dw2og1tu1nmza1n1CMW0qb8gWWlwqMmLb7MhBVs4BXrFziT6HXUd+/RlRA/i4H9AkofYloUbs1fwMqlw==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.2", + "process-nextick-args": "^2.0.0", + "stream-exhaust": "^1.0.1" + } + } } }, "balanced-match": { @@ -16173,7 +16185,9 @@ "bcrypt-pbkdf": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", + "dev": true, + "peer": true, "requires": { "tweetnacl": "^0.14.3" } @@ -16238,6 +16252,283 @@ "peer": true, "requires": { "jsdom": "15.2.1" + }, + "dependencies": { + "acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true, + "peer": true + }, + "acorn-globals": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-4.3.4.tgz", + "integrity": "sha512-clfQEh21R+D0leSbUdWf3OcfqyaCSAQ8Ryq00bofSekfr9W8u1jyYZo6ir0xu9Gtcf7BjcHJpnbZH7JOCpP60A==", + "dev": true, + "peer": true, + "requires": { + "acorn": "^6.0.1", + "acorn-walk": "^6.0.1" + }, + "dependencies": { + "acorn": { + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz", + "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==", + "dev": true, + "peer": true + } + } + }, + "acorn-walk": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-6.2.0.tgz", + "integrity": "sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA==", + "dev": true, + "peer": true + }, + "cssom": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", + "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==", + "dev": true, + "peer": true + }, + "data-urls": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-1.1.0.tgz", + "integrity": "sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ==", + "dev": true, + "peer": true, + "requires": { + "abab": "^2.0.0", + "whatwg-mimetype": "^2.2.0", + "whatwg-url": "^7.0.0" + } + }, + "domexception": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/domexception/-/domexception-1.0.1.tgz", + "integrity": "sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug==", + "dev": true, + "peer": true, + "requires": { + "webidl-conversions": "^4.0.2" + } + }, + "escodegen": { + "version": "1.14.3", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz", + "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==", + "dev": true, + "peer": true, + "requires": { + "esprima": "^4.0.1", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1", + "source-map": "~0.6.1" + } + }, + "html-encoding-sniffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz", + "integrity": "sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw==", + "dev": true, + "peer": true, + "requires": { + "whatwg-encoding": "^1.0.1" + } + }, + "jsdom": { + "version": "15.2.1", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-15.2.1.tgz", + "integrity": "sha512-fAl1W0/7T2G5vURSyxBzrJ1LSdQn6Tr5UX/xD4PXDx/PDgwygedfW6El/KIj3xJ7FU61TTYnc/l/B7P49Eqt6g==", + "dev": true, + "peer": true, + "requires": { + "abab": "^2.0.0", + "acorn": "^7.1.0", + "acorn-globals": "^4.3.2", + "array-equal": "^1.0.0", + "cssom": "^0.4.1", + "cssstyle": "^2.0.0", + "data-urls": "^1.1.0", + "domexception": "^1.0.1", + "escodegen": "^1.11.1", + "html-encoding-sniffer": "^1.0.2", + "nwsapi": "^2.2.0", + "parse5": "5.1.0", + "pn": "^1.1.0", + "request": "^2.88.0", + "request-promise-native": "^1.0.7", + "saxes": "^3.1.9", + "symbol-tree": "^3.2.2", + "tough-cookie": "^3.0.1", + "w3c-hr-time": "^1.0.1", + "w3c-xmlserializer": "^1.1.2", + "webidl-conversions": "^4.0.2", + "whatwg-encoding": "^1.0.5", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^7.0.0", + "ws": "^7.0.0", + "xml-name-validator": "^3.0.0" + } + }, + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", + "dev": true, + "peer": true, + "requires": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + } + }, + "optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "dev": true, + "peer": true, + "requires": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + } + }, + "parse5": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.0.tgz", + "integrity": "sha512-fxNG2sQjHvlVAYmzBZS9YlDp6PTSSDwa98vkD4QgVDDCAo84z5X1t5XyJQ62ImdLXx5NdIIfihey6xpum9/gRQ==", + "dev": true, + "peer": true + }, + "prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", + "dev": true, + "peer": true + }, + "saxes": { + "version": "3.1.11", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-3.1.11.tgz", + "integrity": "sha512-Ydydq3zC+WYDJK1+gRxRapLIED9PWeSuuS41wqyoRmzvhhh9nc+QQrVMKJYzJFULazeGhzSV0QleN2wD3boh2g==", + "dev": true, + "peer": true, + "requires": { + "xmlchars": "^2.1.1" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "optional": true, + "peer": true + }, + "tough-cookie": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-3.0.1.tgz", + "integrity": "sha512-yQyJ0u4pZsv9D4clxO69OEjLWYw+jbgspjTue4lTQZLfV0c5l1VmK2y1JK8E9ahdpltPOaAThPcp5nKPUgSnsg==", + "dev": true, + "peer": true, + "requires": { + "ip-regex": "^2.1.0", + "psl": "^1.1.28", + "punycode": "^2.1.1" + } + }, + "tr46": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", + "integrity": "sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==", + "dev": true, + "peer": true, + "requires": { + "punycode": "^2.1.0" + } + }, + "type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", + "dev": true, + "peer": true, + "requires": { + "prelude-ls": "~1.1.2" + } + }, + "w3c-xmlserializer": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-1.1.2.tgz", + "integrity": "sha512-p10l/ayESzrBMYWRID6xbuCKh2Fp77+sA0doRuGn4tTIMrrZVeqfpKjXHY+oDh3K4nLdPgNwMTVP6Vp4pvqbNg==", + "dev": true, + "peer": true, + "requires": { + "domexception": "^1.0.1", + "webidl-conversions": "^4.0.2", + "xml-name-validator": "^3.0.0" + } + }, + "webidl-conversions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", + "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", + "dev": true, + "peer": true + }, + "whatwg-encoding": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", + "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", + "dev": true, + "peer": true, + "requires": { + "iconv-lite": "0.4.24" + } + }, + "whatwg-mimetype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", + "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==", + "dev": true, + "peer": true + }, + "whatwg-url": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", + "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", + "dev": true, + "peer": true, + "requires": { + "lodash.sortby": "^4.7.0", + "tr46": "^1.0.1", + "webidl-conversions": "^4.0.2" + } + }, + "ws": { + "version": "7.5.9", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", + "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", + "dev": true, + "peer": true, + "requires": {} + }, + "xml-name-validator": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", + "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==", + "dev": true, + "peer": true + } } }, "brace-expansion": { @@ -16262,7 +16553,9 @@ "browser-process-hrtime": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", - "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==" + "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==", + "dev": true, + "peer": true }, "browser-stdout": { "version": "1.3.1", @@ -16310,172 +16603,6 @@ "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", "dev": true }, - "cac": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/cac/-/cac-3.0.4.tgz", - "integrity": "sha1-bSTO7Dcu/lybeYgIvH9JtHJCpO8=", - "dev": true, - "peer": true, - "requires": { - "camelcase-keys": "^3.0.0", - "chalk": "^1.1.3", - "indent-string": "^3.0.0", - "minimist": "^1.2.0", - "read-pkg-up": "^1.0.1", - "suffix": "^0.1.0", - "text-table": "^0.2.0" - }, - "dependencies": { - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true, - "peer": true - }, - "camelcase": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", - "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", - "dev": true, - "peer": true - }, - "camelcase-keys": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-3.0.0.tgz", - "integrity": "sha1-/AxsNgNj9zd+N5O5oWvM8QcMHKQ=", - "dev": true, - "peer": true, - "requires": { - "camelcase": "^3.0.0", - "map-obj": "^1.0.0" - } - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "peer": true, - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - } - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true, - "peer": true - }, - "find-up": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", - "dev": true, - "peer": true, - "requires": { - "path-exists": "^2.0.0", - "pinkie-promise": "^2.0.0" - } - }, - "hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "dev": true, - "peer": true - }, - "indent-string": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz", - "integrity": "sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=", - "dev": true, - "peer": true - }, - "map-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", - "dev": true, - "peer": true - }, - "normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "dev": true, - "peer": true, - "requires": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "path-exists": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", - "dev": true, - "peer": true, - "requires": { - "pinkie-promise": "^2.0.0" - } - }, - "read-pkg": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", - "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", - "dev": true, - "peer": true, - "requires": { - "load-json-file": "^1.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^1.0.0" - } - }, - "read-pkg-up": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", - "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", - "dev": true, - "peer": true, - "requires": { - "find-up": "^1.0.0", - "read-pkg": "^1.0.0" - } - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true, - "peer": true - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "peer": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true, - "peer": true - } - } - }, "cache-base": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", @@ -16558,17 +16685,19 @@ "caseless": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==", + "dev": true, + "peer": true }, "chai": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.6.tgz", - "integrity": "sha512-bbcp3YfHCUzMOvKqsztczerVgBKSsEijCySNlHHbX3VG1nskvqjz5Rfso1gGwD6w6oOV3eI60pKuMOV5MV7p3Q==", + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.7.tgz", + "integrity": "sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A==", "dev": true, "requires": { "assertion-error": "^1.1.0", "check-error": "^1.0.2", - "deep-eql": "^3.0.1", + "deep-eql": "^4.1.2", "get-func-name": "^2.0.0", "loupe": "^2.3.1", "pathval": "^1.1.1", @@ -16585,13 +16714,6 @@ "supports-color": "^7.1.0" } }, - "chardet": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", - "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", - "dev": true, - "peer": true - }, "check-error": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", @@ -16621,9 +16743,9 @@ "dev": true }, "chrome-launcher": { - "version": "0.15.0", - "resolved": "https://registry.npmjs.org/chrome-launcher/-/chrome-launcher-0.15.0.tgz", - "integrity": "sha512-ZQqX5kb9H0+jy1OqLnWampfocrtSZaGl7Ny3F9GRha85o4odbL8x55paUzh51UC7cEmZ5obp3H2Mm70uC2PpRA==", + "version": "0.15.1", + "resolved": "https://registry.npmjs.org/chrome-launcher/-/chrome-launcher-0.15.1.tgz", + "integrity": "sha512-UugC8u59/w2AyX5sHLZUHoxBAiSiunUhZa3zZwMH6zPVis0C3dDKiRWyUGIo14tTbZHGVviWxv3PQWZ7taZ4fg==", "dev": true, "requires": { "@types/node": "*", @@ -16737,30 +16859,6 @@ "timers-ext": "^0.1.5" } }, - "cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", - "dev": true, - "peer": true, - "requires": { - "restore-cursor": "^3.1.0" - } - }, - "cli-spinners": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.6.1.tgz", - "integrity": "sha512-x/5fWmGMnbKQAaNwN+UZlV79qBLM9JFnJuJ03gIi5whrob0xV0ofNVHy9DhwGdsMJQc2OKv0oGmLzvaqvAVv+g==", - "dev": true, - "peer": true - }, - "cli-width": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", - "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", - "dev": true, - "peer": true - }, "cliui": { "version": "7.0.4", "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", @@ -16990,9 +17088,9 @@ } }, "concurrently": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-7.4.0.tgz", - "integrity": "sha512-M6AfrueDt/GEna/Vg9BqQ+93yuvzkSKmoTixnwEJkH0LlcGrRC2eCmjeG1tLLHIYfpYJABokqSGyMcXjm96AFA==", + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-7.6.0.tgz", + "integrity": "sha512-BKtRgvcJGeZ4XttiDiNcFiRlxoAeZOseqUvyYRUp/Vtd+9p1ULmeoSqGsDA+2ivdeDFpqrJvGvmI+StKfKl5hw==", "dev": true, "requires": { "chalk": "^4.1.0", @@ -17145,9 +17243,9 @@ "dev": true }, "cssom": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", - "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==" + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.5.0.tgz", + "integrity": "sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==" }, "cssstyle": { "version": "2.3.0", @@ -17177,7 +17275,9 @@ "dashdash": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", + "dev": true, + "peer": true, "requires": { "assert-plus": "^1.0.0" } @@ -17189,13 +17289,13 @@ "dev": true }, "data-urls": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-1.1.0.tgz", - "integrity": "sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-3.0.2.tgz", + "integrity": "sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ==", "requires": { - "abab": "^2.0.0", - "whatwg-mimetype": "^2.2.0", - "whatwg-url": "^7.0.0" + "abab": "^2.0.6", + "whatwg-mimetype": "^3.0.0", + "whatwg-url": "^11.0.0" } }, "date-fns": { @@ -17214,7 +17314,6 @@ "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, "requires": { "ms": "2.1.2" } @@ -17265,10 +17364,15 @@ } } }, + "decimal.js": { + "version": "10.4.2", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.2.tgz", + "integrity": "sha512-ic1yEvwT6GuvaYwBLLY6/aFFgjZdySKTE8en/fkU3QICTmRtgtSlFn0u0BXN06InZwtfCelR7j8LRiDI/02iGA==" + }, "decode-uri-component": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", - "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz", + "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==", "dev": true }, "decompress-response": { @@ -17289,9 +17393,9 @@ } }, "deep-eql": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", - "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.2.tgz", + "integrity": "sha512-gT18+YW4CcW/DBNTwAmqTtkJh7f9qqScu2qFVlx7kCoeY9tlBu9cUcr7+I+Z/noG8INehS3xQgLpTtd/QUTn4w==", "dev": true, "requires": { "type-detect": "^4.0.0" @@ -17308,10 +17412,10 @@ "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==" }, - "deepmerge": { + "deepmerge-ts": { "version": "4.2.2", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", - "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", + "resolved": "https://registry.npmjs.org/deepmerge-ts/-/deepmerge-ts-4.2.2.tgz", + "integrity": "sha512-Ka3Kb21tiWjvQvS9U+1Dx+aqFAHsdTnMdYptLTmC2VAmDFMugWMY1e15aTODstipmCun8iNuqeSfcx6rsUUk0Q==", "dev": true }, "default-compare": { @@ -17329,25 +17433,6 @@ "integrity": "sha1-vLgrqnKtebQmp2cy8aga1t8m1oQ=", "dev": true }, - "defaults": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", - "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=", - "dev": true, - "peer": true, - "requires": { - "clone": "^1.0.2" - }, - "dependencies": { - "clone": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", - "dev": true, - "peer": true - } - } - }, "defer-to-connect": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", @@ -17376,7 +17461,7 @@ "delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" }, "detect-file": { "version": "1.0.0", @@ -17391,81 +17476,61 @@ "dev": true }, "devtools": { - "version": "7.25.1", - "resolved": "https://registry.npmjs.org/devtools/-/devtools-7.25.1.tgz", - "integrity": "sha512-01T8QZeiD92MpI/7rP8kUflN3XcMqv2moa07123OjjENuuOhYxRWmJ7xj94txnF5PJp1Cv8/jvK8EUbnEHf6MQ==", + "version": "8.0.11", + "resolved": "https://registry.npmjs.org/devtools/-/devtools-8.0.11.tgz", + "integrity": "sha512-qDe9RBgbDQNhVCE2GgNFUYeOQ9BDrTz3HxMVhv/1djyILkBd/dRoYUVgPsiIIWwtsoe/8gAh05sbYkwL1uTJvQ==", "dev": true, "requires": { - "@types/node": "^18.0.0", "@types/ua-parser-js": "^0.7.33", - "@wdio/config": "7.25.1", - "@wdio/logger": "7.19.0", - "@wdio/protocols": "7.22.0", - "@wdio/types": "7.25.1", - "@wdio/utils": "7.25.1", + "@wdio/config": "8.0.11", + "@wdio/logger": "8.0.0", + "@wdio/protocols": "8.0.0", + "@wdio/types": "8.0.11", + "@wdio/utils": "8.0.11", "chrome-launcher": "^0.15.0", "edge-paths": "^2.1.0", - "puppeteer-core": "^13.1.3", + "import-meta-resolve": "^2.1.0", + "puppeteer-core": "19.4.0", "query-selector-shadow-dom": "^1.0.0", "ua-parser-js": "^1.0.1", - "uuid": "^9.0.0" + "uuid": "^9.0.0", + "which": "^3.0.0" }, "dependencies": { - "@types/node": { - "version": "18.8.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.8.0.tgz", - "integrity": "sha512-u+h43R6U8xXDt2vzUaVP3VwjjLyOJk6uEciZS8OSyziUQGOwmk+l+4drxcsDboHXwyTaqS1INebghmWMRxq3LA==", - "dev": true - }, "@wdio/config": { - "version": "7.25.1", - "resolved": "https://registry.npmjs.org/@wdio/config/-/config-7.25.1.tgz", - "integrity": "sha512-7I3L+TE75gvh8jiv8cE/Ch9S9erDgrZG9o5587OlNKfpgFciT7DH7/efPXzYwh8YPFV3grFaydxaaoYzDv6PDA==", + "version": "8.0.11", + "resolved": "https://registry.npmjs.org/@wdio/config/-/config-8.0.11.tgz", + "integrity": "sha512-LR8n6TJfDzVtDmuge4EjOHiJKae73ZyvEwTQq3tokovRIbIMaVkfsRV9iqEZiRgohy14ehAREwNgn67j77ucYA==", "dev": true, "requires": { - "@wdio/logger": "7.19.0", - "@wdio/types": "7.25.1", - "@wdio/utils": "7.25.1", - "deepmerge": "^4.0.0", - "glob": "^8.0.3" + "@wdio/logger": "8.0.0", + "@wdio/types": "8.0.11", + "@wdio/utils": "8.0.11", + "decamelize": "^6.0.0", + "deepmerge-ts": "^4.2.2", + "glob": "^8.0.3", + "import-meta-resolve": "^2.1.0", + "read-pkg-up": "^9.1.0" } }, - "@wdio/logger": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@wdio/logger/-/logger-7.19.0.tgz", - "integrity": "sha512-xR7SN/kGei1QJD1aagzxs3KMuzNxdT/7LYYx+lt6BII49+fqL/SO+5X0FDCZD0Ds93AuQvvz9eGyzrBI2FFXmQ==", - "dev": true, - "requires": { - "chalk": "^4.0.0", - "loglevel": "^1.6.0", - "loglevel-plugin-prefix": "^0.8.4", - "strip-ansi": "^6.0.0" - } - }, - "@wdio/protocols": { - "version": "7.22.0", - "resolved": "https://registry.npmjs.org/@wdio/protocols/-/protocols-7.22.0.tgz", - "integrity": "sha512-8EXRR+Ymdwousm/VGtW3H1hwxZ/1g1H99A1lF0U4GuJ5cFWHCd0IVE5H31Z52i8ZruouW8jueMkGZPSo2IIUSQ==", - "dev": true - }, "@wdio/types": { - "version": "7.25.1", - "resolved": "https://registry.npmjs.org/@wdio/types/-/types-7.25.1.tgz", - "integrity": "sha512-9Xt2U0YXYxRW4UvMFwjt+44UkfhwrI1gPhW+y56SubpyKaUfdNGberteboQoR/7Os1SVtJry4FohEZNmFzPK6g==", + "version": "8.0.11", + "resolved": "https://registry.npmjs.org/@wdio/types/-/types-8.0.11.tgz", + "integrity": "sha512-54xbajB7tqWmYPXFI0ALupPauwLyVtPSZSG/R/DPlY25p+Ygw4jwH64s+Jh1V3TZYnktfv4cIt1Bw/M35cBgOQ==", "dev": true, "requires": { - "@types/node": "^18.0.0", - "got": "^11.8.1" + "@types/node": "^18.0.0" } }, "@wdio/utils": { - "version": "7.25.1", - "resolved": "https://registry.npmjs.org/@wdio/utils/-/utils-7.25.1.tgz", - "integrity": "sha512-DL+nDRVgzruJLhedBUQEMUcojLoGwsjCQCYWram4NfwAIIkxcAX/5Y4vHSut3OoW2bEHl3R8/FQ4B/ivIr2EoQ==", + "version": "8.0.11", + "resolved": "https://registry.npmjs.org/@wdio/utils/-/utils-8.0.11.tgz", + "integrity": "sha512-4nIYt1KP4IVIYfnld+Kbh/l85o7VK4roAEIfiHV374utPpspzV+eli4ANX2fEOGVUVJMVNBCN/sCsL8u3DsPpw==", "dev": true, "requires": { - "@wdio/logger": "7.19.0", - "@wdio/types": "7.25.1", + "@wdio/logger": "8.0.0", + "@wdio/types": "8.0.11", + "import-meta-resolve": "^2.2.0", "p-iteration": "^1.1.8" } }, @@ -17478,6 +17543,22 @@ "balanced-match": "^1.0.0" } }, + "decamelize": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-6.0.0.tgz", + "integrity": "sha512-Fv96DCsdOgB6mdGl67MT5JaTNKRzrzill5OH5s8bjYJXVlcXyPYGyPsUkWyGV5p1TXI5esYIYMMeDJL0hEIwaA==", + "dev": true + }, + "find-up": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz", + "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==", + "dev": true, + "requires": { + "locate-path": "^7.1.0", + "path-exists": "^5.0.0" + } + }, "glob": { "version": "8.0.3", "resolved": "https://registry.npmjs.org/glob/-/glob-8.0.3.tgz", @@ -17491,29 +17572,107 @@ "once": "^1.3.0" } }, + "locate-path": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.1.1.tgz", + "integrity": "sha512-vJXaRMJgRVD3+cUZs3Mncj2mxpt5mP0EmNOsxRSZRMlbqjvxzDEOIUWXGmavo0ZC9+tNZCBLQ66reA11nbpHZg==", + "dev": true, + "requires": { + "p-locate": "^6.0.0" + } + }, "minimatch": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.0.tgz", - "integrity": "sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.1.tgz", + "integrity": "sha512-362NP+zlprccbEt/SkxKfRMHnNY85V74mVnpUpNyr3F35covl09Kec7/sEFLt3RA4oXmewtoaanoIf67SE5Y5g==", "dev": true, "requires": { "brace-expansion": "^2.0.1" } }, + "p-limit": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", + "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", + "dev": true, + "requires": { + "yocto-queue": "^1.0.0" + } + }, + "p-locate": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", + "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", + "dev": true, + "requires": { + "p-limit": "^4.0.0" + } + }, + "path-exists": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", + "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", + "dev": true + }, + "read-pkg": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-7.1.0.tgz", + "integrity": "sha512-5iOehe+WF75IccPc30bWTbpdDQLOCc3Uu8bi3Dte3Eueij81yx1Mrufk8qBx/YAbR4uL1FdUr+7BKXDwEtisXg==", + "dev": true, + "requires": { + "@types/normalize-package-data": "^2.4.1", + "normalize-package-data": "^3.0.2", + "parse-json": "^5.2.0", + "type-fest": "^2.0.0" + } + }, + "read-pkg-up": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-9.1.0.tgz", + "integrity": "sha512-vaMRR1AC1nrd5CQM0PhlRsO5oc2AAigqr7cCrZ/MW/Rsaflz4RlgzkpL4qoU/z1F6wrbd85iFv1OQj/y5RdGvg==", + "dev": true, + "requires": { + "find-up": "^6.3.0", + "read-pkg": "^7.1.0", + "type-fest": "^2.5.0" + } + }, "uuid": { "version": "9.0.0", "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz", "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==", "dev": true + }, + "which": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/which/-/which-3.0.0.tgz", + "integrity": "sha512-nla//68K9NU6yRiwDY/Q8aU6siKlSs64aEC7+IV56QoAuyQT2ovsJcgGYGyqMOmI/CGN1BOR6mM5EN0FBO+zyQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "yocto-queue": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", + "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", + "dev": true } } }, "devtools-protocol": { - "version": "0.0.1056733", - "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1056733.tgz", - "integrity": "sha512-CmTu6SQx2g3TbZzDCAV58+LTxVdKplS7xip0g5oDXpZ+isr0rv5dDP8ToyVRywzPHkCCPKgKgScEcwz4uPWDIA==", + "version": "0.0.1078443", + "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1078443.tgz", + "integrity": "sha512-a/rOMs0PrCtcJ6RKPSK5JdFqQoitF5ZeKr+YscKYpuwkzPoFr470CU8+jrej0hpVgRpqg+K0wfAkWiGB7MkhHg==", "dev": true }, + "diff-sequences": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.3.1.tgz", + "integrity": "sha512-hlM3QR272NXCi4pq+N4Kok4kOp6EsgOM3ZSpJI7Da3UAs+Ttsi8MRmB6trM/lhyzUxGfOgnpkHtgqm5Q/CTcfQ==", + "dev": true, + "optional": true + }, "dir-glob": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", @@ -17541,11 +17700,11 @@ } }, "domexception": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/domexception/-/domexception-1.0.1.tgz", - "integrity": "sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/domexception/-/domexception-4.0.0.tgz", + "integrity": "sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw==", "requires": { - "webidl-conversions": "^4.0.2" + "webidl-conversions": "^7.0.0" } }, "duplexer": { @@ -17631,7 +17790,9 @@ "ecc-jsbn": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", + "dev": true, + "peer": true, "requires": { "jsbn": "~0.1.0", "safer-buffer": "^2.1.0" @@ -17647,16 +17808,6 @@ "which": "^2.0.2" } }, - "ejs": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.6.tgz", - "integrity": "sha512-9lt9Zse4hPucPkoP7FHDF0LQAlGyF9JVpnClFLFH3aSSbxmyoqINRpp/9wePWJTUl4KOQwRL72Iw3InHPDkoGw==", - "dev": true, - "peer": true, - "requires": { - "jake": "^10.6.1" - } - }, "emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", @@ -17672,6 +17823,11 @@ "once": "^1.4.0" } }, + "entities": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.4.0.tgz", + "integrity": "sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA==" + }, "error-ex": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", @@ -17738,21 +17894,26 @@ "dev": true }, "escodegen": { - "version": "1.14.3", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz", - "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.0.0.tgz", + "integrity": "sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==", "requires": { "esprima": "^4.0.1", - "estraverse": "^4.2.0", + "estraverse": "^5.2.0", "esutils": "^2.0.2", "optionator": "^0.8.1", "source-map": "~0.6.1" }, "dependencies": { + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==" + }, "levn": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", "requires": { "prelude-ls": "~1.1.2", "type-check": "~0.3.2" @@ -17774,7 +17935,7 @@ "prelude-ls": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=" + "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==" }, "source-map": { "version": "0.6.1", @@ -17785,7 +17946,7 @@ "type-check": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", "requires": { "prelude-ls": "~1.1.2" } @@ -17793,14 +17954,15 @@ } }, "eslint": { - "version": "8.25.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.25.0.tgz", - "integrity": "sha512-DVlJOZ4Pn50zcKW5bYH7GQK/9MsoQG2d5eDH0ebEkE8PbgzTTmtt/VTH9GGJ4BfeZCpBLqFfvsjX35UacUL83A==", + "version": "8.29.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.29.0.tgz", + "integrity": "sha512-isQ4EEiyUjZFbEKvEGJKKGBwXtvXX+zJbkVKCgTuB9t/+jUBcy8avhkEwWJecI15BkRkOYmvIM5ynbhRjEkoeg==", "dev": true, "requires": { "@eslint/eslintrc": "^1.3.3", - "@humanwhocodes/config-array": "^0.10.5", + "@humanwhocodes/config-array": "^0.11.6", "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", "ajv": "^6.10.0", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", @@ -17816,14 +17978,14 @@ "fast-deep-equal": "^3.1.3", "file-entry-cache": "^6.0.1", "find-up": "^5.0.0", - "glob-parent": "^6.0.1", + "glob-parent": "^6.0.2", "globals": "^13.15.0", - "globby": "^11.1.0", "grapheme-splitter": "^1.0.4", "ignore": "^5.2.0", "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", "js-sdsl": "^4.1.4", "js-yaml": "^4.1.0", "json-stable-stringify-without-jsonify": "^1.0.1", @@ -17846,15 +18008,6 @@ "requires": { "is-glob": "^4.0.3" } - }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } } } }, @@ -17866,17 +18019,17 @@ "requires": {} }, "eslint-plugin-jsdoc": { - "version": "39.3.6", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-39.3.6.tgz", - "integrity": "sha512-R6dZ4t83qPdMhIOGr7g2QII2pwCjYyKP+z0tPOfO1bbAbQyKC20Y2Rd6z1te86Lq3T7uM8bNo+VD9YFpE8HU/g==", + "version": "39.6.4", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-39.6.4.tgz", + "integrity": "sha512-fskvdLCfwmPjHb6e+xNGDtGgbF8X7cDwMtVLAP2WwSf9Htrx68OAx31BESBM1FAwsN2HTQyYQq7m4aW4Q4Nlag==", "dev": true, "requires": { - "@es-joy/jsdoccomment": "~0.31.0", + "@es-joy/jsdoccomment": "~0.36.1", "comment-parser": "1.3.1", "debug": "^4.3.4", "escape-string-regexp": "^4.0.0", "esquery": "^1.4.0", - "semver": "^7.3.7", + "semver": "^7.3.8", "spdx-expression-parse": "^3.0.1" } }, @@ -17974,7 +18127,8 @@ "estraverse": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==" + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true }, "esutils": { "version": "2.0.3", @@ -18140,6 +18294,33 @@ "homedir-polyfill": "^1.0.1" } }, + "expect": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/expect/-/expect-29.3.1.tgz", + "integrity": "sha512-gGb1yTgU30Q0O/tQq+z30KBWv24ApkMgFUpvKBkyLUBL68Wv8dHdJxTBZFl/iT8K/bqDHvUYRH6IIN3rToopPA==", + "dev": true, + "optional": true, + "requires": { + "@jest/expect-utils": "^29.3.1", + "jest-get-type": "^29.2.0", + "jest-matcher-utils": "^29.3.1", + "jest-message-util": "^29.3.1", + "jest-util": "^29.3.1" + } + }, + "expect-webdriverio": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/expect-webdriverio/-/expect-webdriverio-4.0.1.tgz", + "integrity": "sha512-+FhdO0w/HI0ur4OnVphuGPU/E3rXlLqfSjiABfMgd1jw+X2tQxGU63bCUA2GlocWl5/ZuVmV/ulEd8pYgniWYg==", + "dev": true, + "optional": true, + "requires": { + "@wdio/globals": "^8.0.0-alpha.505", + "expect": "^29.3.1", + "jest-matcher-utils": "^29.3.1", + "webdriverio": "^8.0.0-alpha.505" + } + }, "ext": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/ext/-/ext-1.6.0.tgz", @@ -18160,7 +18341,8 @@ "extend": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true }, "extend-shallow": { "version": "3.0.2", @@ -18172,18 +18354,6 @@ "is-extendable": "^1.0.1" } }, - "external-editor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", - "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", - "dev": true, - "peer": true, - "requires": { - "chardet": "^0.7.0", - "iconv-lite": "^0.4.24", - "tmp": "^0.0.33" - } - }, "extglob": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", @@ -18241,7 +18411,9 @@ "extsprintf": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" + "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", + "dev": true, + "peer": true }, "fancy-log": { "version": "1.3.3", @@ -18258,7 +18430,8 @@ "fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true }, "fast-glob": { "version": "3.2.11", @@ -18288,7 +18461,8 @@ "fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true }, "fast-levenshtein": { "version": "2.0.6", @@ -18319,25 +18493,6 @@ "pend": "~1.2.0" } }, - "figures": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", - "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", - "dev": true, - "peer": true, - "requires": { - "escape-string-regexp": "^1.0.5" - }, - "dependencies": { - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true, - "peer": true - } - } - }, "file-entry-cache": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", @@ -18354,16 +18509,6 @@ "dev": true, "optional": true }, - "filelist": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.2.tgz", - "integrity": "sha512-z7O0IS8Plc39rTCq6i6iHxk43duYOn8uFJiWSewIq0Bww1RNybVHSCjahmcC87ZqAm4OTvFzlzeGu3XAzG1ctQ==", - "dev": true, - "peer": true, - "requires": { - "minimatch": "^3.0.4" - } - }, "fill-range": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", @@ -18502,18 +18647,26 @@ "forever-agent": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" + "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", + "dev": true, + "peer": true }, "form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", "requires": { "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", + "combined-stream": "^1.0.8", "mime-types": "^2.1.12" } }, + "form-data-encoder": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-2.1.4.tgz", + "integrity": "sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw==", + "dev": true + }, "fragment-cache": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", @@ -18623,13 +18776,6 @@ "has-symbols": "^1.0.1" } }, - "get-port": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/get-port/-/get-port-5.1.1.tgz", - "integrity": "sha512-g/Q1aTSDOxFpchXC4i8ZWvxA1lnPqx/JHqcpIw0/LX9T8x/GBbi6YnlN5nhaKIFkT8oFsscUKgDJYxfwfS6QsQ==", - "dev": true, - "peer": true - }, "get-stream": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", @@ -18648,7 +18794,9 @@ "getpass": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", + "dev": true, + "peer": true, "requires": { "assert-plus": "^1.0.0" } @@ -18751,6 +18899,18 @@ } } }, + "async-done": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/async-done/-/async-done-1.3.2.tgz", + "integrity": "sha512-uYkTP8dw2og1tu1nmza1n1CMW0qb8gWWlwqMmLb7MhBVs4BXrFziT6HXUd+/RlRA/i4H9AkofYloUbs1fwMqlw==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.2", + "process-nextick-args": "^2.0.0", + "stream-exhaust": "^1.0.1" + } + }, "binary-extensions": { "version": "1.13.1", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", @@ -19005,9 +19165,9 @@ "optional": true }, "google-closure-deps": { - "version": "20221004.0.0", - "resolved": "https://registry.npmjs.org/google-closure-deps/-/google-closure-deps-20221004.0.0.tgz", - "integrity": "sha512-lbbhlL4/UMOSSzm91v9/pK3/wHBnzZ4rs8n38L8YybS9E5+3uJJ350oTVaj5qEfv3B+JEMvngOuA+spsEaMIdg==", + "version": "20221102.0.0", + "resolved": "https://registry.npmjs.org/google-closure-deps/-/google-closure-deps-20221102.0.0.tgz", + "integrity": "sha512-6AOcHk8u5DNY/uhJLyHj0M4GLTkqAhscH7iH66QUxSiUlrg55PWdyaWQa4Jg15p4xUWNPf8NFBe6vIdwzwi0Hw==", "dev": true, "requires": { "minimatch": "^3.0.4", @@ -19057,9 +19217,9 @@ } }, "graceful-fs": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz", - "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==", + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", "dev": true }, "grapheme-splitter": { @@ -19745,12 +19905,16 @@ "har-schema": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" + "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==", + "dev": true, + "peer": true }, "har-validator": { "version": "5.1.5", "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", + "dev": true, + "peer": true, "requires": { "ajv": "^6.12.3", "har-schema": "^2.0.0" @@ -19861,7 +20025,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz", "integrity": "sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==", - "dev": true, "requires": { "whatwg-encoding": "^2.0.0" } @@ -19883,6 +20046,16 @@ "requires-port": "^1.0.0" } }, + "http-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", + "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", + "requires": { + "@tootallnate/once": "2", + "agent-base": "6", + "debug": "4" + } + }, "http-server": { "version": "14.1.1", "resolved": "https://registry.npmjs.org/http-server/-/http-server-14.1.1.tgz", @@ -19907,7 +20080,9 @@ "http-signature": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==", + "dev": true, + "peer": true, "requires": { "assert-plus": "^1.0.0", "jsprim": "^1.2.2", @@ -19925,10 +20100,9 @@ } }, "https-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", - "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", - "dev": true, + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", "requires": { "agent-base": "6", "debug": "4" @@ -19938,6 +20112,8 @@ "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "peer": true, "requires": { "safer-buffer": ">= 2.1.2 < 3" } @@ -19970,6 +20146,12 @@ "integrity": "sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==", "dev": true }, + "import-meta-resolve": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-2.2.0.tgz", + "integrity": "sha512-CpPOtiCHxP9HdtDM5F45tNiAe66Cqlv3f5uHoJjt+KlaLrUh9/Wz9vepADZ78SlqEo62aDWZtj9ydMGXV+CPnw==", + "dev": true + }, "imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", @@ -20004,29 +20186,6 @@ "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", "dev": true }, - "inquirer": { - "version": "8.1.5", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.1.5.tgz", - "integrity": "sha512-G6/9xUqmt/r+UvufSyrPpt84NYwhKZ9jLsgMbQzlx804XErNupor8WQdBnBRrXmBfTPpuwf1sV+ss2ovjgdXIg==", - "dev": true, - "peer": true, - "requires": { - "ansi-escapes": "^4.2.1", - "chalk": "^4.1.1", - "cli-cursor": "^3.1.0", - "cli-width": "^3.0.0", - "external-editor": "^3.0.3", - "figures": "^3.0.0", - "lodash": "^4.17.21", - "mute-stream": "0.0.8", - "ora": "^5.4.1", - "run-async": "^2.4.0", - "rxjs": "^7.2.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0", - "through": "^2.3.6" - } - }, "interpret": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", @@ -20042,7 +20201,9 @@ "ip-regex": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", - "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=" + "integrity": "sha512-58yWmlHpp7VYfcdTwMTvwMmqx/Elfxjd9RXTDyMsbL7lLWmhMylLEqiYVLKuLzOZqVgiWXD9MfR62Vv89VRxkw==", + "dev": true, + "peer": true }, "is-absolute": { "version": "1.0.0", @@ -20193,13 +20354,6 @@ "is-extglob": "^2.1.1" } }, - "is-interactive": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", - "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", - "dev": true, - "peer": true - }, "is-negated-glob": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-negated-glob/-/is-negated-glob-1.0.0.tgz", @@ -20226,6 +20380,12 @@ } } }, + "is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true + }, "is-plain-obj": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", @@ -20244,6 +20404,11 @@ "integrity": "sha512-vjc0SSRNZ32s9SbZBzGaiP6YVB+xglLShhgZD/FHMZUXBvQWaV9CtzgeVhjccFJrI6RAMV+LX7NYxueW/A8W5A==", "dev": true }, + "is-potential-custom-element-name": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", + "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==" + }, "is-promise": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz", @@ -20268,7 +20433,9 @@ "is-typedarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", + "dev": true, + "peer": true }, "is-unc-path": { "version": "1.0.0", @@ -20333,7 +20500,9 @@ "isstream": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" + "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==", + "dev": true, + "peer": true }, "istextorbinary": { "version": "3.3.0", @@ -20345,88 +20514,91 @@ "textextensions": "^3.2.0" } }, - "jake": { - "version": "10.8.2", - "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.2.tgz", - "integrity": "sha512-eLpKyrfG3mzvGE2Du8VoPbeSkRry093+tyNjdYaBbJS9v17knImYGNXQCUV0gLxQtF82m3E8iRb/wdSQZLoq7A==", + "jest-diff": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.3.1.tgz", + "integrity": "sha512-vU8vyiO7568tmin2lA3r2DP8oRvzhvRcD4DjpXc6uGveQodyk7CKLhQlCSiwgx3g0pFaE88/KLZ0yaTWMc4Uiw==", "dev": true, - "peer": true, + "optional": true, "requires": { - "async": "0.9.x", - "chalk": "^2.4.2", - "filelist": "^1.0.1", - "minimatch": "^3.0.4" + "chalk": "^4.0.0", + "diff-sequences": "^29.3.1", + "jest-get-type": "^29.2.0", + "pretty-format": "^29.3.1" + } + }, + "jest-get-type": { + "version": "29.2.0", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.2.0.tgz", + "integrity": "sha512-uXNJlg8hKFEnDgFsrCjznB+sTxdkuqiCL6zMgA75qEbAJjJYTs9XPrvDctrEig2GDow22T/LvHgO57iJhXB/UA==", + "dev": true, + "optional": true + }, + "jest-matcher-utils": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.3.1.tgz", + "integrity": "sha512-fkRMZUAScup3txIKfMe3AIZZmPEjWEdsPJFK3AIy5qRohWqQFg1qrmKfYXR9qEkNc7OdAu2N4KPHibEmy4HPeQ==", + "dev": true, + "optional": true, + "requires": { + "chalk": "^4.0.0", + "jest-diff": "^29.3.1", + "jest-get-type": "^29.2.0", + "pretty-format": "^29.3.1" + } + }, + "jest-message-util": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.3.1.tgz", + "integrity": "sha512-lMJTbgNcDm5z+6KDxWtqOFWlGQxD6XaYwBqHR8kmpkP+WWWG90I35kdtQHY67Ay5CSuydkTBbJG+tH9JShFCyA==", + "dev": true, + "optional": true, + "requires": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^29.3.1", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^29.3.1", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" }, "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", "dev": true, - "peer": true, + "optional": true, "requires": { - "color-convert": "^1.9.0" + "braces": "^3.0.2", + "picomatch": "^2.3.1" } - }, - "async": { - "version": "0.9.2", - "resolved": "https://registry.npmjs.org/async/-/async-0.9.2.tgz", - "integrity": "sha512-l6ToIJIotphWahxxHyzK9bnLR6kM4jJIIgLShZeqLY7iboHoGkdgFl7W2/Ivi4SkMJYGKqW8vSuk0uKUj6qsSw==", + } + } + }, + "jest-util": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.3.1.tgz", + "integrity": "sha512-7YOVZaiX7RJLv76ZfHt4nbNEzzTRiMW/IiOG7ZOKmTXmoGBxUDefgMAxQubu6WPVqP5zSzAdZG0FfLcC7HOIFQ==", + "dev": true, + "optional": true, + "requires": { + "@jest/types": "^29.3.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "dependencies": { + "ci-info": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.7.0.tgz", + "integrity": "sha512-2CpRNYmImPx+RXKLq6jko/L07phmS9I02TyqkcNU20GCF/GgaWvc58hPtjxDX8lPpkdwc9sNh72V9k00S7ezog==", "dev": true, - "peer": true - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "peer": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "peer": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true, - "peer": true - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true, - "peer": true - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true, - "peer": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "peer": true, - "requires": { - "has-flag": "^3.0.0" - } + "optional": true } } }, @@ -20476,7 +20648,9 @@ "jsbn": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" + "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==", + "dev": true, + "peer": true }, "jsdoc-type-pratt-parser": { "version": "3.1.0", @@ -20485,59 +20659,36 @@ "dev": true }, "jsdom": { - "version": "15.2.1", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-15.2.1.tgz", - "integrity": "sha512-fAl1W0/7T2G5vURSyxBzrJ1LSdQn6Tr5UX/xD4PXDx/PDgwygedfW6El/KIj3xJ7FU61TTYnc/l/B7P49Eqt6g==", + "version": "20.0.3", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-20.0.3.tgz", + "integrity": "sha512-SYhBvTh89tTfCD/CRdSOm13mOBa42iTaTyfyEWBdKcGdPxPtLFBXuHR8XHb33YNYaP+lLbmSvBTsnoesCNJEsQ==", "requires": { - "abab": "^2.0.0", - "acorn": "^7.1.0", - "acorn-globals": "^4.3.2", - "array-equal": "^1.0.0", - "cssom": "^0.4.1", - "cssstyle": "^2.0.0", - "data-urls": "^1.1.0", - "domexception": "^1.0.1", - "escodegen": "^1.11.1", - "html-encoding-sniffer": "^1.0.2", - "nwsapi": "^2.2.0", - "parse5": "5.1.0", - "pn": "^1.1.0", - "request": "^2.88.0", - "request-promise-native": "^1.0.7", - "saxes": "^3.1.9", - "symbol-tree": "^3.2.2", - "tough-cookie": "^3.0.1", - "w3c-hr-time": "^1.0.1", - "w3c-xmlserializer": "^1.1.2", - "webidl-conversions": "^4.0.2", - "whatwg-encoding": "^1.0.5", - "whatwg-mimetype": "^2.3.0", - "whatwg-url": "^7.0.0", - "ws": "^7.0.0", - "xml-name-validator": "^3.0.0" - }, - "dependencies": { - "acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==" - }, - "html-encoding-sniffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz", - "integrity": "sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw==", - "requires": { - "whatwg-encoding": "^1.0.1" - } - }, - "whatwg-encoding": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", - "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", - "requires": { - "iconv-lite": "0.4.24" - } - } + "abab": "^2.0.6", + "acorn": "^8.8.1", + "acorn-globals": "^7.0.0", + "cssom": "^0.5.0", + "cssstyle": "^2.3.0", + "data-urls": "^3.0.2", + "decimal.js": "^10.4.2", + "domexception": "^4.0.0", + "escodegen": "^2.0.0", + "form-data": "^4.0.0", + "html-encoding-sniffer": "^3.0.0", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.1", + "is-potential-custom-element-name": "^1.0.1", + "nwsapi": "^2.2.2", + "parse5": "^7.1.1", + "saxes": "^6.0.0", + "symbol-tree": "^3.2.4", + "tough-cookie": "^4.1.2", + "w3c-xmlserializer": "^4.0.0", + "webidl-conversions": "^7.0.0", + "whatwg-encoding": "^2.0.0", + "whatwg-mimetype": "^3.0.0", + "whatwg-url": "^11.0.0", + "ws": "^8.11.0", + "xml-name-validator": "^4.0.0" } }, "json-buffer": { @@ -20555,12 +20706,15 @@ "json-schema": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", - "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==" + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", + "dev": true, + "peer": true }, "json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true }, "json-stable-stringify-without-jsonify": { "version": "1.0.1", @@ -20571,7 +20725,9 @@ "json-stringify-safe": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", + "dev": true, + "peer": true }, "json5": { "version": "2.2.1", @@ -20593,6 +20749,8 @@ "version": "1.4.2", "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", + "dev": true, + "peer": true, "requires": { "assert-plus": "1.0.0", "extsprintf": "1.3.0", @@ -20619,9 +20777,9 @@ "dev": true }, "keyv": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.0.4.tgz", - "integrity": "sha512-vqNHbAc8BBsxk+7QBYLW0Y219rWcClspR6WSeoHYKG5mnsSoOH+BL1pWq02DDCVdvvuUny5rkBlzMRzoqc+GIg==", + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.2.tgz", + "integrity": "sha512-5MHbFaKn8cNSmVW7BYnijeAVlE4cYA/SVkifVgrh7yotnfhKmjuXpDKjrABLnT0SfHWV21P8ow07OGfRrNDg8g==", "dev": true, "requires": { "json-buffer": "3.0.1" @@ -20643,11 +20801,10 @@ } }, "ky": { - "version": "0.28.7", - "resolved": "https://registry.npmjs.org/ky/-/ky-0.28.7.tgz", - "integrity": "sha512-a23i6qSr/ep15vdtw/zyEQIDLoUaKDg9Jf04CYl/0ns/wXNYna26zJpI+MeIFaPeDvkrjLPrKtKOiiI3IE53RQ==", - "dev": true, - "peer": true + "version": "0.32.2", + "resolved": "https://registry.npmjs.org/ky/-/ky-0.32.2.tgz", + "integrity": "sha512-eBJeF6IXNwX5rksdwBrE2rIJrU2d84GoTvdM7OmmTIwUVXEMd72wIwvT+nyhrqtv7AzbSNsWz7yRsHgVhj1uog==", + "dev": true }, "last-run": { "version": "1.1.1", @@ -20745,7 +20902,7 @@ "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true } } @@ -20792,7 +20949,8 @@ "lodash": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true }, "lodash._basecopy": { "version": "3.0.1", @@ -20887,13 +21045,6 @@ "integrity": "sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8=", "dev": true }, - "lodash.flattendeep": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", - "integrity": "sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI=", - "dev": true, - "peer": true - }, "lodash.get": { "version": "4.4.2", "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", @@ -20918,12 +21069,6 @@ "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==", "dev": true }, - "lodash.isobject": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/lodash.isobject/-/lodash.isobject-3.0.2.tgz", - "integrity": "sha1-PI+41bW/S/kK4G4U8qUwpO2TXh0=", - "dev": true - }, "lodash.isplainobject": { "version": "4.0.6", "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", @@ -20953,13 +21098,6 @@ "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", "dev": true }, - "lodash.pickby": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.pickby/-/lodash.pickby-4.6.0.tgz", - "integrity": "sha1-feoh2MGNdwOifHBMFdO4SmfjOv8=", - "dev": true, - "peer": true - }, "lodash.restparam": { "version": "3.6.1", "resolved": "https://registry.npmjs.org/lodash.restparam/-/lodash.restparam-3.6.1.tgz", @@ -20969,7 +21107,9 @@ "lodash.sortby": { "version": "4.7.0", "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", - "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=" + "integrity": "sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==", + "dev": true, + "peer": true }, "lodash.template": { "version": "4.5.0", @@ -21111,9 +21251,9 @@ } }, "marky": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/marky/-/marky-1.2.2.tgz", - "integrity": "sha512-k1dB2HNeaNyORco8ulVEhctyEGkKHb2YWAhDsxeFlW2nROIirsctBYzKwwS3Vza+sKTS1zO4Z+n9/+9WbGLIxQ==", + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/marky/-/marky-1.2.5.tgz", + "integrity": "sha512-q9JtQJKjpsVxCRVgQ+WapguSbKC3SQ5HEzFGPAJMStgh3QjCawp00UKv3MTTAArTmGmmPUvllHZoNbZ3gs0I+Q==", "dev": true }, "matchdep": { @@ -21319,25 +21459,18 @@ "dev": true }, "mime-db": { - "version": "1.51.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz", - "integrity": "sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==" + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" }, "mime-types": { - "version": "2.1.34", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.34.tgz", - "integrity": "sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A==", + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "requires": { - "mime-db": "1.51.0" + "mime-db": "1.52.0" } }, - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true, - "peer": true - }, "mimic-response": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", @@ -21351,9 +21484,9 @@ "dev": true }, "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, "requires": { "brace-expansion": "^1.1.7" @@ -21503,11 +21636,16 @@ "integrity": "sha512-hkvf4EtPJRMQlPC3UbMoRs0vTAFAYdzFQ+gpMb8A+9znae1c43q8Mab9iVsgTcg/4PNiLGGn3SlDIa8uvK1FIQ==", "dev": true }, + "moo": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/moo/-/moo-0.5.2.tgz", + "integrity": "sha512-iSAJLHYKnX41mKcJKjqvnAN9sf0LMDTXDEvFv+ffuRR9a1MIuXLjMNL6EsnDHSkKLTWNqQQ5uo61P4EbU4NU+Q==", + "dev": true + }, "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "multipipe": { "version": "0.1.2", @@ -21524,13 +21662,6 @@ "integrity": "sha512-kDcwXR4PS7caBpuRYYBUz9iVixUk3anO3f5OYFiIPwK/20vCzKCHyKoulbiDY1S53zD2bxUpxN/IJ+TnXjfvxg==", "dev": true }, - "mute-stream": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", - "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", - "dev": true, - "peer": true - }, "nan": { "version": "2.15.0", "resolved": "https://registry.npmjs.org/nan/-/nan-2.15.0.tgz", @@ -21692,14 +21823,16 @@ "dev": true }, "nwsapi": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz", - "integrity": "sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==" + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.2.tgz", + "integrity": "sha512-90yv+6538zuvUMnN+zCr8LuV6bPFdq50304114vJYJ8RDyK8D5O9Phpbd6SZWgI7PwzmmfN1upeOJlvybDSgCw==" }, "oauth-sign": { "version": "0.9.0", "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "dev": true, + "peer": true }, "object-assign": { "version": "4.1.1", @@ -21852,16 +21985,6 @@ "wrappy": "1" } }, - "onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, - "peer": true, - "requires": { - "mimic-fn": "^2.1.0" - } - }, "open": { "version": "7.4.2", "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz", @@ -21892,24 +22015,6 @@ "word-wrap": "^1.2.3" } }, - "ora": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", - "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", - "dev": true, - "peer": true, - "requires": { - "bl": "^4.1.0", - "chalk": "^4.1.0", - "cli-cursor": "^3.1.0", - "cli-spinners": "^2.5.0", - "is-interactive": "^1.0.0", - "is-unicode-supported": "^0.1.0", - "log-symbols": "^4.1.0", - "strip-ansi": "^6.0.0", - "wcwidth": "^1.0.1" - } - }, "ordered-read-streams": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-1.0.1.tgz", @@ -22160,9 +22265,12 @@ "dev": true }, "parse5": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.0.tgz", - "integrity": "sha512-fxNG2sQjHvlVAYmzBZS9YlDp6PTSSDwa98vkD4QgVDDCAo84z5X1t5XyJQ62ImdLXx5NdIIfihey6xpum9/gRQ==" + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.1.tgz", + "integrity": "sha512-kwpuwzB+px5WUg9pyK0IcK/shltJN5/OVhQagxhCQNtT9Y9QRZqNY2e1cmbu/paRh5LMnz/oVTVLBpjFmMZhSg==", + "requires": { + "entities": "^4.4.0" + } }, "pascalcase": { "version": "0.1.1", @@ -22381,7 +22489,9 @@ "performance-now": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" + "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==", + "dev": true, + "peer": true }, "picocolors": { "version": "0.2.1", @@ -22416,54 +22526,6 @@ "pinkie": "^2.0.0" } }, - "pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, - "requires": { - "find-up": "^4.0.0" - }, - "dependencies": { - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } - } - } - }, "plugin-error": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-1.0.1.tgz", @@ -22490,7 +22552,9 @@ "pn": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/pn/-/pn-1.1.0.tgz", - "integrity": "sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA==" + "integrity": "sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA==", + "dev": true, + "peer": true }, "portfinder": { "version": "1.0.28", @@ -22568,6 +22632,27 @@ "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=", "dev": true }, + "pretty-format": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.3.1.tgz", + "integrity": "sha512-FyLnmb1cYJV8biEIiRyzRFvs2lry7PPIvOqKVe1GCUEYg4YGmlx1qG9EJNMxArYm7piII4qb8UV1Pncq5dxmcg==", + "dev": true, + "optional": true, + "requires": { + "@jest/schemas": "^29.0.0", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "optional": true + } + } + }, "pretty-hrtime": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", @@ -22598,17 +22683,10 @@ "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", "dev": true }, - "pseudomap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", - "dev": true, - "peer": true - }, "psl": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", - "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==" + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", + "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==" }, "pubsub-js": { "version": "1.9.4", @@ -22655,61 +22733,55 @@ "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" }, "puppeteer-core": { - "version": "13.7.0", - "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-13.7.0.tgz", - "integrity": "sha512-rXja4vcnAzFAP1OVLq/5dWNfwBGuzcOARJ6qGV7oAZhnLmVRU8G5MsdeQEAOy332ZhkIOnn9jp15R89LKHyp2Q==", + "version": "19.4.0", + "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-19.4.0.tgz", + "integrity": "sha512-gG/jxseleZStinBn86x8r7trjcE4jcjx1hIQWOpACQhquHYMuKnrWxkzg+EDn8sN3wUtF/Ry9mtJgjM49oUOFQ==", "dev": true, "requires": { "cross-fetch": "3.1.5", "debug": "4.3.4", - "devtools-protocol": "0.0.981744", + "devtools-protocol": "0.0.1068969", "extract-zip": "2.0.1", "https-proxy-agent": "5.0.1", - "pkg-dir": "4.2.0", - "progress": "2.0.3", "proxy-from-env": "1.1.0", "rimraf": "3.0.2", "tar-fs": "2.1.1", "unbzip2-stream": "1.4.3", - "ws": "8.5.0" + "ws": "8.10.0" }, "dependencies": { "devtools-protocol": { - "version": "0.0.981744", - "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.981744.tgz", - "integrity": "sha512-0cuGS8+jhR67Fy7qG3i3Pc7Aw494sb9yG9QgpG97SFVWwolgYjlhJg7n+UaHxOQT30d1TYu/EYe9k01ivLErIg==", + "version": "0.0.1068969", + "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1068969.tgz", + "integrity": "sha512-ATFTrPbY1dKYhPPvpjtwWKSK2mIwGmRwX54UASn9THEuIZCe2n9k3vVuMmt6jWeL+e5QaaguEv/pMyR+JQB7VQ==", "dev": true }, - "https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", - "dev": true, - "requires": { - "agent-base": "6", - "debug": "4" - } - }, "ws": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.5.0.tgz", - "integrity": "sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg==", + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.10.0.tgz", + "integrity": "sha512-+s49uSmZpvtAsd2h37vIPy1RBusaLawVe8of+GyEPsaJTCMpj/2v8NpeK1SHXjBlQ95lQTmQofOJnFiLoaN3yw==", "dev": true, "requires": {} } } }, "qs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", + "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", + "dev": true }, "query-selector-shadow-dom": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/query-selector-shadow-dom/-/query-selector-shadow-dom-1.0.0.tgz", - "integrity": "sha512-bK0/0cCI+R8ZmOF1QjT7HupDUYCxbf/9TJgAmSXQxZpftXmTAeil9DRoCnTDkWbvOyZzhcMBwKpptWcdkGFIMg==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/query-selector-shadow-dom/-/query-selector-shadow-dom-1.0.1.tgz", + "integrity": "sha512-lT5yCqEBgfoMYpf3F2xQRK7zEr1rhIIZuceDK6+xRkJQ4NMbHTwXqk4NkwDwQMNqXgG9r9fyHnzwNVs6zV5KRw==", "dev": true }, + "querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==" + }, "queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", @@ -22751,6 +22823,13 @@ } } }, + "react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", + "dev": true, + "optional": true + }, "read-pkg": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", @@ -22899,16 +22978,6 @@ "resolve": "^1.1.6" } }, - "recursive-readdir": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.2.tgz", - "integrity": "sha512-nRCcW9Sj7NuZwa2XvH9co8NPeXUBhZP7CRKJtU+cS6PW9FpCIFoI5ib0NT1ZrbNuPoRy0ylyCaUL8Gih4LSyFg==", - "dev": true, - "peer": true, - "requires": { - "minimatch": "3.0.4" - } - }, "redent": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", @@ -23044,6 +23113,8 @@ "version": "2.88.2", "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "dev": true, + "peer": true, "requires": { "aws-sign2": "~0.7.0", "aws4": "^1.8.0", @@ -23067,10 +23138,24 @@ "uuid": "^3.3.2" }, "dependencies": { + "form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "dev": true, + "peer": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, "tough-cookie": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "dev": true, + "peer": true, "requires": { "psl": "^1.1.28", "punycode": "^2.1.1" @@ -23082,6 +23167,8 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.4.tgz", "integrity": "sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw==", + "dev": true, + "peer": true, "requires": { "lodash": "^4.17.19" } @@ -23090,6 +23177,8 @@ "version": "1.0.9", "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.9.tgz", "integrity": "sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g==", + "dev": true, + "peer": true, "requires": { "request-promise-core": "1.1.4", "stealthy-require": "^1.1.1", @@ -23100,6 +23189,8 @@ "version": "2.5.0", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "dev": true, + "peer": true, "requires": { "psl": "^1.1.28", "punycode": "^2.1.1" @@ -23122,8 +23213,7 @@ "requires-port": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", - "dev": true + "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=" }, "resolve": { "version": "1.20.0", @@ -23198,17 +23288,6 @@ } } }, - "restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", - "dev": true, - "peer": true, - "requires": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - } - }, "ret": { "version": "0.1.15", "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", @@ -23236,13 +23315,6 @@ "glob": "^7.1.3" } }, - "run-async": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", - "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", - "dev": true, - "peer": true - }, "run-parallel": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", @@ -23272,7 +23344,8 @@ "safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true }, "safe-regex": { "version": "1.1.0", @@ -23289,11 +23362,11 @@ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, "saxes": { - "version": "3.1.11", - "resolved": "https://registry.npmjs.org/saxes/-/saxes-3.1.11.tgz", - "integrity": "sha512-Ydydq3zC+WYDJK1+gRxRapLIED9PWeSuuS41wqyoRmzvhhh9nc+QQrVMKJYzJFULazeGhzSV0QleN2wD3boh2g==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz", + "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==", "requires": { - "xmlchars": "^2.1.1" + "xmlchars": "^2.2.0" } }, "secure-compare": { @@ -23303,9 +23376,9 @@ "dev": true }, "selenium-standalone": { - "version": "8.2.2", - "resolved": "https://registry.npmjs.org/selenium-standalone/-/selenium-standalone-8.2.2.tgz", - "integrity": "sha512-CdfN5WnX0mzrjeCTFnvnsjsXEsQwgepLIvrA6OamrKT29gD8mufemwM3v9VG4grQDFHZZy7Ma1giw232x4eGmw==", + "version": "8.2.4", + "resolved": "https://registry.npmjs.org/selenium-standalone/-/selenium-standalone-8.2.4.tgz", + "integrity": "sha512-VXkiQFAmXGlcE6X5A9dakXbXuxJONqG/t39Cw4ylk7J+hxIYBk/yfJ0Tkh2P0X9QGRpcUfr0hgE0PHDil0nFiA==", "dev": true, "requires": { "commander": "^9.0.0", @@ -23325,9 +23398,9 @@ } }, "semver": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", - "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", "dev": true, "requires": { "lru-cache": "^6.0.0" @@ -23439,13 +23512,6 @@ "integrity": "sha512-9Z0m1pssXv6sndPMvOzXnM1mVO73YCWDE6X5bKxJyG+9J0B9zJkgtgoBM7cnxEaJMzmrbxPceKTVpwF7cS/xqA==", "dev": true }, - "signal-exit": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.6.tgz", - "integrity": "sha512-sDl4qMFpijcGw22U5w63KmD3cZJfBuFlVNbVMKje2keoKML7X2UzWbc4XrmEbDwg0NXJc3yv4/ox7b+JWb57kQ==", - "dev": true, - "peer": true - }, "sinon": { "version": "9.2.4", "resolved": "https://registry.npmjs.org/sinon/-/sinon-9.2.4.tgz", @@ -23756,9 +23822,11 @@ "dev": true }, "sshpk": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", - "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz", + "integrity": "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==", + "dev": true, + "peer": true, "requires": { "asn1": "~0.2.3", "assert-plus": "^1.0.0", @@ -23777,6 +23845,25 @@ "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=", "dev": true }, + "stack-utils": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", + "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", + "dev": true, + "optional": true, + "requires": { + "escape-string-regexp": "^2.0.0" + }, + "dependencies": { + "escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true, + "optional": true + } + } + }, "static-extend": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", @@ -23852,7 +23939,9 @@ "stealthy-require": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", - "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=" + "integrity": "sha512-ZnWpYnYugiOVEY5GkcuJK1io5V8QmNYChG62gSit9pQVGErXtrKuPC55ITaVSukmMta5qpMU7vqLt2Lnni4f/g==", + "dev": true, + "peer": true }, "stream-combiner": { "version": "0.2.2", @@ -24014,13 +24103,6 @@ "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", "dev": true }, - "suffix": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/suffix/-/suffix-0.1.1.tgz", - "integrity": "sha1-zFgjFkag7xEC95R47zqSSP2chC8=", - "dev": true, - "peer": true - }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -24287,21 +24369,29 @@ } }, "tough-cookie": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-3.0.1.tgz", - "integrity": "sha512-yQyJ0u4pZsv9D4clxO69OEjLWYw+jbgspjTue4lTQZLfV0c5l1VmK2y1JK8E9ahdpltPOaAThPcp5nKPUgSnsg==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.2.tgz", + "integrity": "sha512-G9fqXWoYFZgTc2z8Q5zaHy/vJMjm+WV0AkAeHxVCQiEB1b+dGvWzFW6QV07cY5jQ5gRkeid2qIkzkxUnmoQZUQ==", "requires": { - "ip-regex": "^2.1.0", - "psl": "^1.1.28", - "punycode": "^2.1.1" + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.2.0", + "url-parse": "^1.5.3" + }, + "dependencies": { + "universalify": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", + "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==" + } } }, "tr46": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", - "integrity": "sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz", + "integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==", "requires": { - "punycode": "^2.1.0" + "punycode": "^2.1.1" } }, "tree-kill": { @@ -24334,7 +24424,9 @@ "tunnel-agent": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", + "dev": true, + "peer": true, "requires": { "safe-buffer": "^5.0.1" } @@ -24342,7 +24434,9 @@ "tweetnacl": { "version": "0.14.5", "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" + "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==", + "dev": true, + "peer": true }, "type": { "version": "1.2.0", @@ -24366,11 +24460,10 @@ "dev": true }, "type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "dev": true, - "peer": true + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", + "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", + "dev": true }, "typedarray": { "version": "0.0.6", @@ -24379,15 +24472,15 @@ "dev": true }, "typescript": { - "version": "4.8.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.8.4.tgz", - "integrity": "sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ==", + "version": "4.9.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.4.tgz", + "integrity": "sha512-Uz+dTXYzxXXbsFpM86Wh3dKCxrQqUcVMxwU54orwlJjOpO3ao8L7j5lH+dWfTwgCwIuM9GQ2kvVotzYJMXTBZg==", "dev": true }, "ua-parser-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-1.0.2.tgz", - "integrity": "sha512-00y/AXhx0/SsnI51fTc0rLRmafiGOM4/O+ny10Ps7f+j/b8p/ZY11ytMgznXkOVo4GQ+KwQG5UQLkLGirsACRg==", + "version": "1.0.32", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-1.0.32.tgz", + "integrity": "sha512-dXVsz3M4j+5tTiovFVyVqssXBu5HM47//YSOeZ9fQkdDKkfzv2v3PP1jmH6FUyPW+yCSn7aBVK1fGGKNhowdDA==", "dev": true }, "unbzip2-stream": { @@ -24533,6 +24626,7 @@ "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, "requires": { "punycode": "^2.1.0" } @@ -24549,6 +24643,15 @@ "integrity": "sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==", "dev": true }, + "url-parse": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", + "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", + "requires": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, "url-parse-lax": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", @@ -24558,12 +24661,6 @@ "prepend-http": "^2.0.0" } }, - "url-resolve-browser": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/url-resolve-browser/-/url-resolve-browser-1.2.0.tgz", - "integrity": "sha512-L9PBPnlKNDFzt9ElK4br8I8Tufdm1xgv1GhMeiP7ZC87x0b7mr+4vSh13kmPq5km80JKX+UD2BeEFTCrFZ6xDA==", - "dev": true - }, "use": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", @@ -24579,7 +24676,9 @@ "uuid": { "version": "3.4.0", "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "dev": true, + "peer": true }, "v8flags": { "version": "3.2.0", @@ -24624,7 +24723,9 @@ "verror": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", + "dev": true, + "peer": true, "requires": { "assert-plus": "^1.0.0", "core-util-is": "1.0.2", @@ -24634,7 +24735,9 @@ "core-util-is": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==", + "dev": true, + "peer": true } } }, @@ -24736,102 +24839,88 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", + "dev": true, + "peer": true, "requires": { "browser-process-hrtime": "^1.0.0" } }, "w3c-xmlserializer": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-1.1.2.tgz", - "integrity": "sha512-p10l/ayESzrBMYWRID6xbuCKh2Fp77+sA0doRuGn4tTIMrrZVeqfpKjXHY+oDh3K4nLdPgNwMTVP6Vp4pvqbNg==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-4.0.0.tgz", + "integrity": "sha512-d+BFHzbiCx6zGfz0HyQ6Rg69w9k19nviJspaj4yNscGjrHu94sVP+aRm75yEbCh+r2/yR+7q6hux9LVtbuTGBw==", "requires": { - "domexception": "^1.0.1", - "webidl-conversions": "^4.0.2", - "xml-name-validator": "^3.0.0" - } - }, - "wcwidth": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", - "integrity": "sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=", - "dev": true, - "peer": true, - "requires": { - "defaults": "^1.0.3" + "xml-name-validator": "^4.0.0" } }, "webdriver": { - "version": "7.25.1", - "resolved": "https://registry.npmjs.org/webdriver/-/webdriver-7.25.1.tgz", - "integrity": "sha512-BmR5RT37EGNJj/O/GTCqBKXV/Jr9V4oQTTDaurZixVKW0ubG7uyfrhiklzuWUtmES9VualTKgQumhGhchBTC6g==", + "version": "8.0.11", + "resolved": "https://registry.npmjs.org/webdriver/-/webdriver-8.0.11.tgz", + "integrity": "sha512-UK1iLpNltIzOEScd45GOQ4qFTVFMmUwMYDNtVMhX6ASB9yl4Ir3Do66BZ7fyk5+NBvn2VnIx7qrap6FutSbxhQ==", "dev": true, "requires": { "@types/node": "^18.0.0", - "@wdio/config": "7.25.1", - "@wdio/logger": "7.19.0", - "@wdio/protocols": "7.22.0", - "@wdio/types": "7.25.1", - "@wdio/utils": "7.25.1", - "got": "^11.0.2", - "ky": "0.30.0", - "lodash.merge": "^4.6.1" + "@types/ws": "^8.5.3", + "@wdio/config": "8.0.11", + "@wdio/logger": "8.0.0", + "@wdio/protocols": "8.0.0", + "@wdio/types": "8.0.11", + "@wdio/utils": "8.0.11", + "deepmerge-ts": "^4.2.2", + "got": "^12.1.0", + "ky": "^0.32.1", + "ws": "^8.8.0" }, "dependencies": { - "@types/node": { - "version": "18.8.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.8.0.tgz", - "integrity": "sha512-u+h43R6U8xXDt2vzUaVP3VwjjLyOJk6uEciZS8OSyziUQGOwmk+l+4drxcsDboHXwyTaqS1INebghmWMRxq3LA==", + "@sindresorhus/is": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-5.3.0.tgz", + "integrity": "sha512-CX6t4SYQ37lzxicAqsBtxA3OseeoVrh9cSJ5PFYam0GksYlupRfy1A+Q4aYD3zvcfECLc0zO2u+ZnR2UYKvCrw==", "dev": true }, + "@szmarczak/http-timer": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-5.0.1.tgz", + "integrity": "sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==", + "dev": true, + "requires": { + "defer-to-connect": "^2.0.1" + } + }, "@wdio/config": { - "version": "7.25.1", - "resolved": "https://registry.npmjs.org/@wdio/config/-/config-7.25.1.tgz", - "integrity": "sha512-7I3L+TE75gvh8jiv8cE/Ch9S9erDgrZG9o5587OlNKfpgFciT7DH7/efPXzYwh8YPFV3grFaydxaaoYzDv6PDA==", + "version": "8.0.11", + "resolved": "https://registry.npmjs.org/@wdio/config/-/config-8.0.11.tgz", + "integrity": "sha512-LR8n6TJfDzVtDmuge4EjOHiJKae73ZyvEwTQq3tokovRIbIMaVkfsRV9iqEZiRgohy14ehAREwNgn67j77ucYA==", "dev": true, "requires": { - "@wdio/logger": "7.19.0", - "@wdio/types": "7.25.1", - "@wdio/utils": "7.25.1", - "deepmerge": "^4.0.0", - "glob": "^8.0.3" + "@wdio/logger": "8.0.0", + "@wdio/types": "8.0.11", + "@wdio/utils": "8.0.11", + "decamelize": "^6.0.0", + "deepmerge-ts": "^4.2.2", + "glob": "^8.0.3", + "import-meta-resolve": "^2.1.0", + "read-pkg-up": "^9.1.0" } }, - "@wdio/logger": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@wdio/logger/-/logger-7.19.0.tgz", - "integrity": "sha512-xR7SN/kGei1QJD1aagzxs3KMuzNxdT/7LYYx+lt6BII49+fqL/SO+5X0FDCZD0Ds93AuQvvz9eGyzrBI2FFXmQ==", - "dev": true, - "requires": { - "chalk": "^4.0.0", - "loglevel": "^1.6.0", - "loglevel-plugin-prefix": "^0.8.4", - "strip-ansi": "^6.0.0" - } - }, - "@wdio/protocols": { - "version": "7.22.0", - "resolved": "https://registry.npmjs.org/@wdio/protocols/-/protocols-7.22.0.tgz", - "integrity": "sha512-8EXRR+Ymdwousm/VGtW3H1hwxZ/1g1H99A1lF0U4GuJ5cFWHCd0IVE5H31Z52i8ZruouW8jueMkGZPSo2IIUSQ==", - "dev": true - }, "@wdio/types": { - "version": "7.25.1", - "resolved": "https://registry.npmjs.org/@wdio/types/-/types-7.25.1.tgz", - "integrity": "sha512-9Xt2U0YXYxRW4UvMFwjt+44UkfhwrI1gPhW+y56SubpyKaUfdNGberteboQoR/7Os1SVtJry4FohEZNmFzPK6g==", + "version": "8.0.11", + "resolved": "https://registry.npmjs.org/@wdio/types/-/types-8.0.11.tgz", + "integrity": "sha512-54xbajB7tqWmYPXFI0ALupPauwLyVtPSZSG/R/DPlY25p+Ygw4jwH64s+Jh1V3TZYnktfv4cIt1Bw/M35cBgOQ==", "dev": true, "requires": { - "@types/node": "^18.0.0", - "got": "^11.8.1" + "@types/node": "^18.0.0" } }, "@wdio/utils": { - "version": "7.25.1", - "resolved": "https://registry.npmjs.org/@wdio/utils/-/utils-7.25.1.tgz", - "integrity": "sha512-DL+nDRVgzruJLhedBUQEMUcojLoGwsjCQCYWram4NfwAIIkxcAX/5Y4vHSut3OoW2bEHl3R8/FQ4B/ivIr2EoQ==", + "version": "8.0.11", + "resolved": "https://registry.npmjs.org/@wdio/utils/-/utils-8.0.11.tgz", + "integrity": "sha512-4nIYt1KP4IVIYfnld+Kbh/l85o7VK4roAEIfiHV374utPpspzV+eli4ANX2fEOGVUVJMVNBCN/sCsL8u3DsPpw==", "dev": true, "requires": { - "@wdio/logger": "7.19.0", - "@wdio/types": "7.25.1", + "@wdio/logger": "8.0.0", + "@wdio/types": "8.0.11", + "import-meta-resolve": "^2.2.0", "p-iteration": "^1.1.8" } }, @@ -24844,6 +24933,49 @@ "balanced-match": "^1.0.0" } }, + "cacheable-lookup": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-7.0.0.tgz", + "integrity": "sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==", + "dev": true + }, + "cacheable-request": { + "version": "10.2.3", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-10.2.3.tgz", + "integrity": "sha512-6BehRBOs7iurNjAYN9iPazTwFDaMQavJO8W1MEm3s2pH8q/tkPTtLDRUZaweWK87WFGf2Y5wLAlaCJlR5kOz3w==", + "dev": true, + "requires": { + "@types/http-cache-semantics": "^4.0.1", + "get-stream": "^6.0.1", + "http-cache-semantics": "^4.1.0", + "keyv": "^4.5.2", + "mimic-response": "^4.0.0", + "normalize-url": "^8.0.0", + "responselike": "^3.0.0" + } + }, + "decamelize": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-6.0.0.tgz", + "integrity": "sha512-Fv96DCsdOgB6mdGl67MT5JaTNKRzrzill5OH5s8bjYJXVlcXyPYGyPsUkWyGV5p1TXI5esYIYMMeDJL0hEIwaA==", + "dev": true + }, + "find-up": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz", + "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==", + "dev": true, + "requires": { + "locate-path": "^7.1.0", + "path-exists": "^5.0.0" + } + }, + "get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true + }, "glob": { "version": "8.0.3", "resolved": "https://registry.npmjs.org/glob/-/glob-8.0.3.tgz", @@ -24857,113 +24989,210 @@ "once": "^1.3.0" } }, - "ky": { - "version": "0.30.0", - "resolved": "https://registry.npmjs.org/ky/-/ky-0.30.0.tgz", - "integrity": "sha512-X/u76z4JtDVq10u1JA5UQfatPxgPaVDMYTrgHyiTpGN2z4TMEJkIHsoSBBSg9SWZEIXTKsi9kHgiQ9o3Y/4yog==", + "got": { + "version": "12.5.3", + "resolved": "https://registry.npmjs.org/got/-/got-12.5.3.tgz", + "integrity": "sha512-8wKnb9MGU8IPGRIo+/ukTy9XLJBwDiCpIf5TVzQ9Cpol50eMTpBq2GAuDsuDIz7hTYmZgMgC1e9ydr6kSDWs3w==", + "dev": true, + "requires": { + "@sindresorhus/is": "^5.2.0", + "@szmarczak/http-timer": "^5.0.1", + "cacheable-lookup": "^7.0.0", + "cacheable-request": "^10.2.1", + "decompress-response": "^6.0.0", + "form-data-encoder": "^2.1.2", + "get-stream": "^6.0.1", + "http2-wrapper": "^2.1.10", + "lowercase-keys": "^3.0.0", + "p-cancelable": "^3.0.0", + "responselike": "^3.0.0" + } + }, + "http2-wrapper": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-2.2.0.tgz", + "integrity": "sha512-kZB0wxMo0sh1PehyjJUWRFEd99KC5TLjZ2cULC4f9iqJBAmKQQXEICjxl5iPJRwP40dpeHFqqhm7tYCvODpqpQ==", + "dev": true, + "requires": { + "quick-lru": "^5.1.1", + "resolve-alpn": "^1.2.0" + } + }, + "locate-path": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.1.1.tgz", + "integrity": "sha512-vJXaRMJgRVD3+cUZs3Mncj2mxpt5mP0EmNOsxRSZRMlbqjvxzDEOIUWXGmavo0ZC9+tNZCBLQ66reA11nbpHZg==", + "dev": true, + "requires": { + "p-locate": "^6.0.0" + } + }, + "lowercase-keys": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-3.0.0.tgz", + "integrity": "sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==", + "dev": true + }, + "mimic-response": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-4.0.0.tgz", + "integrity": "sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==", "dev": true }, "minimatch": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.0.tgz", - "integrity": "sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.1.tgz", + "integrity": "sha512-362NP+zlprccbEt/SkxKfRMHnNY85V74mVnpUpNyr3F35covl09Kec7/sEFLt3RA4oXmewtoaanoIf67SE5Y5g==", "dev": true, "requires": { "brace-expansion": "^2.0.1" } + }, + "normalize-url": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-8.0.0.tgz", + "integrity": "sha512-uVFpKhj5MheNBJRTiMZ9pE/7hD1QTeEvugSJW/OmLzAp78PB5O6adfMNTvmfKhXBkvCzC+rqifWcVYpGFwTjnw==", + "dev": true + }, + "p-cancelable": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-3.0.0.tgz", + "integrity": "sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==", + "dev": true + }, + "p-limit": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", + "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", + "dev": true, + "requires": { + "yocto-queue": "^1.0.0" + } + }, + "p-locate": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", + "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", + "dev": true, + "requires": { + "p-limit": "^4.0.0" + } + }, + "path-exists": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", + "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", + "dev": true + }, + "read-pkg": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-7.1.0.tgz", + "integrity": "sha512-5iOehe+WF75IccPc30bWTbpdDQLOCc3Uu8bi3Dte3Eueij81yx1Mrufk8qBx/YAbR4uL1FdUr+7BKXDwEtisXg==", + "dev": true, + "requires": { + "@types/normalize-package-data": "^2.4.1", + "normalize-package-data": "^3.0.2", + "parse-json": "^5.2.0", + "type-fest": "^2.0.0" + } + }, + "read-pkg-up": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-9.1.0.tgz", + "integrity": "sha512-vaMRR1AC1nrd5CQM0PhlRsO5oc2AAigqr7cCrZ/MW/Rsaflz4RlgzkpL4qoU/z1F6wrbd85iFv1OQj/y5RdGvg==", + "dev": true, + "requires": { + "find-up": "^6.3.0", + "read-pkg": "^7.1.0", + "type-fest": "^2.5.0" + } + }, + "responselike": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-3.0.0.tgz", + "integrity": "sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==", + "dev": true, + "requires": { + "lowercase-keys": "^3.0.0" + } + }, + "yocto-queue": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", + "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", + "dev": true } } }, "webdriverio": { - "version": "7.25.2", - "resolved": "https://registry.npmjs.org/webdriverio/-/webdriverio-7.25.2.tgz", - "integrity": "sha512-lZwHh1G2Zxg4LmVQZZZNhKAqjGoSxoDaqlAf0ojh/3DcWVxMpFtaj0mksrqCyVhObudb2dopOX26beWPyKwL4A==", + "version": "8.0.12", + "resolved": "https://registry.npmjs.org/webdriverio/-/webdriverio-8.0.12.tgz", + "integrity": "sha512-KCQ+ePhbNTvKP635bz11ADuq9oMjU99tUCgst6difwFPYUg43HYyx5b5CTGl9LrTMqwoJ5UWoIBxjtyS216n6w==", "dev": true, "requires": { "@types/aria-query": "^5.0.0", "@types/node": "^18.0.0", - "@wdio/config": "7.25.1", - "@wdio/logger": "7.19.0", - "@wdio/protocols": "7.22.0", - "@wdio/repl": "7.25.1", - "@wdio/types": "7.25.1", - "@wdio/utils": "7.25.1", + "@wdio/config": "8.0.11", + "@wdio/globals": "8.0.12", + "@wdio/logger": "8.0.0", + "@wdio/protocols": "8.0.0", + "@wdio/repl": "8.0.0", + "@wdio/types": "8.0.11", + "@wdio/utils": "8.0.11", "archiver": "^5.0.0", "aria-query": "^5.0.0", "css-shorthand-properties": "^1.1.1", "css-value": "^0.0.1", - "devtools": "7.25.1", - "devtools-protocol": "^0.0.1056733", - "fs-extra": "^10.0.0", + "devtools": "8.0.11", + "devtools-protocol": "^0.0.1078443", "grapheme-splitter": "^1.0.2", + "import-meta-resolve": "^2.1.0", + "is-plain-obj": "^4.1.0", "lodash.clonedeep": "^4.5.0", - "lodash.isobject": "^3.0.2", - "lodash.isplainobject": "^4.0.6", "lodash.zip": "^4.2.0", "minimatch": "^5.0.0", - "puppeteer-core": "^13.1.3", + "puppeteer-core": "19.4.0", "query-selector-shadow-dom": "^1.0.0", "resq": "^1.9.1", "rgb2hex": "0.2.5", "serialize-error": "^8.0.0", - "webdriver": "7.25.1" + "webdriver": "8.0.11" }, "dependencies": { - "@types/node": { - "version": "18.8.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.8.0.tgz", - "integrity": "sha512-u+h43R6U8xXDt2vzUaVP3VwjjLyOJk6uEciZS8OSyziUQGOwmk+l+4drxcsDboHXwyTaqS1INebghmWMRxq3LA==", - "dev": true - }, "@wdio/config": { - "version": "7.25.1", - "resolved": "https://registry.npmjs.org/@wdio/config/-/config-7.25.1.tgz", - "integrity": "sha512-7I3L+TE75gvh8jiv8cE/Ch9S9erDgrZG9o5587OlNKfpgFciT7DH7/efPXzYwh8YPFV3grFaydxaaoYzDv6PDA==", + "version": "8.0.11", + "resolved": "https://registry.npmjs.org/@wdio/config/-/config-8.0.11.tgz", + "integrity": "sha512-LR8n6TJfDzVtDmuge4EjOHiJKae73ZyvEwTQq3tokovRIbIMaVkfsRV9iqEZiRgohy14ehAREwNgn67j77ucYA==", "dev": true, "requires": { - "@wdio/logger": "7.19.0", - "@wdio/types": "7.25.1", - "@wdio/utils": "7.25.1", - "deepmerge": "^4.0.0", - "glob": "^8.0.3" + "@wdio/logger": "8.0.0", + "@wdio/types": "8.0.11", + "@wdio/utils": "8.0.11", + "decamelize": "^6.0.0", + "deepmerge-ts": "^4.2.2", + "glob": "^8.0.3", + "import-meta-resolve": "^2.1.0", + "read-pkg-up": "^9.1.0" } }, - "@wdio/logger": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@wdio/logger/-/logger-7.19.0.tgz", - "integrity": "sha512-xR7SN/kGei1QJD1aagzxs3KMuzNxdT/7LYYx+lt6BII49+fqL/SO+5X0FDCZD0Ds93AuQvvz9eGyzrBI2FFXmQ==", - "dev": true, - "requires": { - "chalk": "^4.0.0", - "loglevel": "^1.6.0", - "loglevel-plugin-prefix": "^0.8.4", - "strip-ansi": "^6.0.0" - } - }, - "@wdio/protocols": { - "version": "7.22.0", - "resolved": "https://registry.npmjs.org/@wdio/protocols/-/protocols-7.22.0.tgz", - "integrity": "sha512-8EXRR+Ymdwousm/VGtW3H1hwxZ/1g1H99A1lF0U4GuJ5cFWHCd0IVE5H31Z52i8ZruouW8jueMkGZPSo2IIUSQ==", - "dev": true - }, "@wdio/types": { - "version": "7.25.1", - "resolved": "https://registry.npmjs.org/@wdio/types/-/types-7.25.1.tgz", - "integrity": "sha512-9Xt2U0YXYxRW4UvMFwjt+44UkfhwrI1gPhW+y56SubpyKaUfdNGberteboQoR/7Os1SVtJry4FohEZNmFzPK6g==", + "version": "8.0.11", + "resolved": "https://registry.npmjs.org/@wdio/types/-/types-8.0.11.tgz", + "integrity": "sha512-54xbajB7tqWmYPXFI0ALupPauwLyVtPSZSG/R/DPlY25p+Ygw4jwH64s+Jh1V3TZYnktfv4cIt1Bw/M35cBgOQ==", "dev": true, "requires": { - "@types/node": "^18.0.0", - "got": "^11.8.1" + "@types/node": "^18.0.0" } }, "@wdio/utils": { - "version": "7.25.1", - "resolved": "https://registry.npmjs.org/@wdio/utils/-/utils-7.25.1.tgz", - "integrity": "sha512-DL+nDRVgzruJLhedBUQEMUcojLoGwsjCQCYWram4NfwAIIkxcAX/5Y4vHSut3OoW2bEHl3R8/FQ4B/ivIr2EoQ==", + "version": "8.0.11", + "resolved": "https://registry.npmjs.org/@wdio/utils/-/utils-8.0.11.tgz", + "integrity": "sha512-4nIYt1KP4IVIYfnld+Kbh/l85o7VK4roAEIfiHV374utPpspzV+eli4ANX2fEOGVUVJMVNBCN/sCsL8u3DsPpw==", "dev": true, "requires": { - "@wdio/logger": "7.19.0", - "@wdio/types": "7.25.1", + "@wdio/logger": "8.0.0", + "@wdio/types": "8.0.11", + "import-meta-resolve": "^2.2.0", "p-iteration": "^1.1.8" } }, @@ -24976,6 +25205,22 @@ "balanced-match": "^1.0.0" } }, + "decamelize": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-6.0.0.tgz", + "integrity": "sha512-Fv96DCsdOgB6mdGl67MT5JaTNKRzrzill5OH5s8bjYJXVlcXyPYGyPsUkWyGV5p1TXI5esYIYMMeDJL0hEIwaA==", + "dev": true + }, + "find-up": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz", + "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==", + "dev": true, + "requires": { + "locate-path": "^7.1.0", + "path-exists": "^5.0.0" + } + }, "glob": { "version": "8.0.3", "resolved": "https://registry.npmjs.org/glob/-/glob-8.0.3.tgz", @@ -24989,27 +25234,94 @@ "once": "^1.3.0" } }, + "is-plain-obj": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", + "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", + "dev": true + }, + "locate-path": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.1.1.tgz", + "integrity": "sha512-vJXaRMJgRVD3+cUZs3Mncj2mxpt5mP0EmNOsxRSZRMlbqjvxzDEOIUWXGmavo0ZC9+tNZCBLQ66reA11nbpHZg==", + "dev": true, + "requires": { + "p-locate": "^6.0.0" + } + }, "minimatch": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.0.tgz", - "integrity": "sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.1.tgz", + "integrity": "sha512-362NP+zlprccbEt/SkxKfRMHnNY85V74mVnpUpNyr3F35covl09Kec7/sEFLt3RA4oXmewtoaanoIf67SE5Y5g==", "dev": true, "requires": { "brace-expansion": "^2.0.1" } + }, + "p-limit": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", + "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", + "dev": true, + "requires": { + "yocto-queue": "^1.0.0" + } + }, + "p-locate": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", + "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", + "dev": true, + "requires": { + "p-limit": "^4.0.0" + } + }, + "path-exists": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", + "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", + "dev": true + }, + "read-pkg": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-7.1.0.tgz", + "integrity": "sha512-5iOehe+WF75IccPc30bWTbpdDQLOCc3Uu8bi3Dte3Eueij81yx1Mrufk8qBx/YAbR4uL1FdUr+7BKXDwEtisXg==", + "dev": true, + "requires": { + "@types/normalize-package-data": "^2.4.1", + "normalize-package-data": "^3.0.2", + "parse-json": "^5.2.0", + "type-fest": "^2.0.0" + } + }, + "read-pkg-up": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-9.1.0.tgz", + "integrity": "sha512-vaMRR1AC1nrd5CQM0PhlRsO5oc2AAigqr7cCrZ/MW/Rsaflz4RlgzkpL4qoU/z1F6wrbd85iFv1OQj/y5RdGvg==", + "dev": true, + "requires": { + "find-up": "^6.3.0", + "read-pkg": "^7.1.0", + "type-fest": "^2.5.0" + } + }, + "yocto-queue": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", + "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", + "dev": true } } }, "webidl-conversions": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", - "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==" + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", + "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==" }, "whatwg-encoding": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz", "integrity": "sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==", - "dev": true, "requires": { "iconv-lite": "0.6.3" }, @@ -25018,7 +25330,6 @@ "version": "0.6.3", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "dev": true, "requires": { "safer-buffer": ">= 2.1.2 < 3.0.0" } @@ -25026,18 +25337,17 @@ } }, "whatwg-mimetype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", - "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==" + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz", + "integrity": "sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==" }, "whatwg-url": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", - "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-11.0.0.tgz", + "integrity": "sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==", "requires": { - "lodash.sortby": "^4.7.0", - "tr46": "^1.0.1", - "webidl-conversions": "^4.0.2" + "tr46": "^3.0.0", + "webidl-conversions": "^7.0.0" } }, "which": { @@ -25084,15 +25394,15 @@ "dev": true }, "ws": { - "version": "7.5.6", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.6.tgz", - "integrity": "sha512-6GLgCqo2cy2A2rjCNFlxQS6ZljG/coZfZXclldI8FB/1G3CCI36Zd8xy2HrFVACi8tfk5XrgLQEk+P0Tnz9UcA==", + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz", + "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==", "requires": {} }, "xml-name-validator": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", - "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==" + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz", + "integrity": "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==" }, "xmlchars": { "version": "2.2.0", @@ -25124,9 +25434,9 @@ "dev": true }, "yargs": { - "version": "17.6.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.6.0.tgz", - "integrity": "sha512-8H/wTDqlSwoSnScvV2N/JHfLWOKuh5MVla9hqLjK3nsfyy6Y4kDSYSvkU5YCUEPOSnRXfIyx3Sq+B/IWudTo4g==", + "version": "17.6.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.6.2.tgz", + "integrity": "sha512-1/9UrdHjDZc0eOU0HxOHoS78C69UD3JRMvzlJ7S79S2nTaWRA/whGCTV8o9e/N/1Va9YIV7Q4sOxD8VV4pCWOw==", "dev": true, "requires": { "cliui": "^8.0.1", @@ -25135,7 +25445,7 @@ "require-directory": "^2.1.1", "string-width": "^4.2.3", "y18n": "^5.0.5", - "yargs-parser": "^21.0.0" + "yargs-parser": "^21.1.1" }, "dependencies": { "cliui": { @@ -25152,9 +25462,9 @@ } }, "yargs-parser": { - "version": "21.0.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.0.0.tgz", - "integrity": "sha512-z9kApYUOCwoeZ78rfRYYWdiU/iNL6mwwYlkkZfJoyMR1xps+NEBX5X7XmRpxkZHhXJ6+Ey00IwKxBBSW9FIjyA==", + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", "dev": true }, "yargs-unparser": { @@ -25189,104 +25499,6 @@ } } }, - "yarn-install": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/yarn-install/-/yarn-install-1.0.0.tgz", - "integrity": "sha1-V/RQULgu/VcYKzlzxUqgXLXSUjA=", - "dev": true, - "peer": true, - "requires": { - "cac": "^3.0.3", - "chalk": "^1.1.3", - "cross-spawn": "^4.0.2" - }, - "dependencies": { - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true, - "peer": true - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "peer": true, - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - } - }, - "cross-spawn": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-4.0.2.tgz", - "integrity": "sha1-e5JHYhwjrf3ThWAEqCPL45dCTUE=", - "dev": true, - "peer": true, - "requires": { - "lru-cache": "^4.0.1", - "which": "^1.2.9" - } - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true, - "peer": true - }, - "lru-cache": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", - "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", - "dev": true, - "peer": true, - "requires": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "peer": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true, - "peer": true - }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "peer": true, - "requires": { - "isexe": "^2.0.0" - } - }, - "yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", - "dev": true, - "peer": true - } - } - }, "yauzl": { "version": "2.10.0", "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", diff --git a/package.json b/package.json index fa40dd440..aabe95be4 100644 --- a/package.json +++ b/package.json @@ -42,19 +42,17 @@ "lint:fix": "eslint . --fix", "langfiles": "gulp langfiles", "minify": "gulp minify", - "only:compile:advanced": "gulp onlyBuildAdvancedCompilationTest --debug", "package": "gulp package", "postinstall": "patch-package", - "prepare": "gulp prepare", "prepareDemos": "gulp prepareDemos", "publish": "npm ci && gulp publish", "publish:beta": "npm ci && gulp publishBeta", "recompile": "gulp recompile", "release": "gulp gitCreateRC", - "start": "concurrently -n tsc,server \"tsc --watch --preserveWatchOutput --outDir 'build/src' --declarationDir 'build/declarations'\" \"http-server ./ -s -o /tests/playground.html -c-1\"", + "start": "npm run deps && concurrently -n tsc,server \"tsc --watch --preserveWatchOutput --outDir 'build/src' --declarationDir 'build/declarations'\" \"http-server ./ -s -o /tests/playground.html -c-1\"", "tsc": "gulp tsc", - "test": "gulp --silent test", - "test:generators": "gulp --silent testGenerators", + "test": "gulp test", + "test:generators": "gulp testGenerators", "test:mocha:interactive": "http-server ./ -o /tests/mocha/index.html -c-1", "test:compile:advanced": "gulp buildAdvancedCompilationTest --debug", "updateGithubPages": "npm ci && gulp gitUpdateGithubPages" @@ -73,11 +71,12 @@ "@blockly/block-test": "^3.0.0", "@blockly/dev-tools": "^5.0.0", "@blockly/theme-modern": "^3.0.0", - "@hyperjump/json-schema": "^0.18.5", + "@hyperjump/json-schema": "^0.23.3", "@microsoft/api-documenter": "^7.19.16", "@microsoft/api-extractor": "^7.29.5", "@typescript-eslint/eslint-plugin": "^5.33.1", - "@wdio/selenium-standalone-service": "^7.10.1", + "@wdio/selenium-standalone-service": "^8.0.2", + "async-done": "^2.0.0", "chai": "^4.2.0", "clang-format": "^1.6.0", "closure-calculate-chunks": "^3.0.2", @@ -86,7 +85,7 @@ "eslint-config-google": "^0.14.0", "eslint-plugin-jsdoc": "^39.3.6", "google-closure-compiler": "^20221004.0.0", - "google-closure-deps": "^20221004.0.0", + "google-closure-deps": "^20221102.0.0", "gulp": "^4.0.2", "gulp-clang-format": "^1.0.27", "gulp-concat": "^2.6.1", @@ -110,10 +109,10 @@ "selenium-standalone": "^8.0.3", "through2": "^4.0.2", "typescript": "^4.3.2", - "webdriverio": "^7.0.3", + "webdriverio": "^8.0.5", "yargs": "^17.2.1" }, "dependencies": { - "jsdom": "15.2.1" + "jsdom": "20.0.3" } } diff --git a/scripts/gulpfiles/appengine_tasks.js b/scripts/gulpfiles/appengine_tasks.js index 88e0ba145..5e9f9e871 100644 --- a/scripts/gulpfiles/appengine_tasks.js +++ b/scripts/gulpfiles/appengine_tasks.js @@ -8,16 +8,16 @@ * @fileoverview Gulp script to deploy Blockly demos on appengine. */ -var gulp = require('gulp'); +const gulp = require('gulp'); -var fs = require('fs'); -var rimraf = require('rimraf'); -var path = require('path'); -var execSync = require('child_process').execSync; +const fs = require('fs'); +const rimraf = require('rimraf'); +const path = require('path'); +const execSync = require('child_process').execSync; const buildTasks = require('./build_tasks.js'); const packageTasks = require('./package_tasks.js'); -var packageJson = require('../../package.json'); +const packageJson = require('../../package.json'); const demoTmpDir = '../_deploy'; const demoStaticTmpDir = '../_deploy/static'; @@ -51,10 +51,34 @@ function copyStaticSrc(done) { * Prerequisite: clean, build. */ function copyBuilt(done) { - return gulp.src(['build/msg/**/*', 'dist/*_compressed.js*'], {base: '.'}) + return gulp.src(['build/msg/*', 'dist/*_compressed.js*'], {base: '.'}) .pipe(gulp.dest(demoStaticTmpDir)); } +/** + * Copies compressed files into the places they used to be used from, for the + * benefit of our Developers site and (for now) any other websites that + * hotlink them. Delete this once devsite is fixed. + * + * Prerequisite: clean, build. + */ +function copyCompressedToOldLocation(done) { + return gulp.src(['dist/*_compressed.js*']) + .pipe(gulp.dest(demoStaticTmpDir)); +} + +/** + * Copies messages files into the places they used to be used from, for the + * benefit of our Developers site and (for now) any other websites that + * hotlink them. Delete this once devsite is fixed. + * + * Prerequisite: clean, build. + */ +function copyMessagesToOldLocation(done) { + return gulp.src(['build/msg/*']) + .pipe(gulp.dest(demoStaticTmpDir + '/msg/js')); +} + /** * Copies appengine files into deploy directory. */ @@ -121,10 +145,10 @@ function deployAndClean(done) { * Constructs a beta demo version name based on the current date. */ function getDemosBetaVersion() { - var date = new Date(); - var mm = date.getMonth() + 1; // Month, 0-11 - var dd = date.getDate(); // Day of the month, 1-31 - var yyyy = date.getFullYear(); + const date = new Date(); + const mm = date.getMonth() + 1; // Month, 0-11 + const dd = date.getDate(); // Day of the month, 1-31 + const yyyy = date.getFullYear(); return `${yyyy}${mm < 10 ? '0' + mm : mm}${dd}-beta`; } @@ -140,7 +164,7 @@ function deployBetaAndClean(done) { /** * Prepares demos. - * + * * Prerequisites (invoked): clean, build */ const prepareDemos = gulp.series( @@ -153,7 +177,9 @@ const prepareDemos = gulp.series( gulp.parallel(buildTasks.cleanBuildDir, packageTasks.cleanReleaseDir), buildTasks.build, - copyBuilt), + gulp.parallel(copyBuilt, + copyCompressedToOldLocation, + copyMessagesToOldLocation)), copyPlaygroundDeps)); /** diff --git a/scripts/gulpfiles/build_tasks.js b/scripts/gulpfiles/build_tasks.js index fa1d962f3..5538abc92 100644 --- a/scripts/gulpfiles/build_tasks.js +++ b/scripts/gulpfiles/build_tasks.js @@ -8,27 +8,27 @@ * @fileoverview Gulp script to build Blockly for Node & NPM. */ -var gulp = require('gulp'); +const gulp = require('gulp'); gulp.replace = require('gulp-replace'); gulp.rename = require('gulp-rename'); gulp.sourcemaps = require('gulp-sourcemaps'); -var path = require('path'); -var fs = require('fs'); +const path = require('path'); +const fs = require('fs'); const {exec, execSync} = require('child_process'); -var through2 = require('through2'); +const through2 = require('through2'); const clangFormat = require('clang-format'); const clangFormatter = require('gulp-clang-format'); -var closureCompiler = require('google-closure-compiler').gulp(); -var closureDeps = require('google-closure-deps'); -var argv = require('yargs').argv; -var rimraf = require('rimraf'); +const closureCompiler = require('google-closure-compiler').gulp(); +const closureDeps = require('google-closure-deps'); +const argv = require('yargs').argv; +const rimraf = require('rimraf'); -var {BUILD_DIR, DEPS_FILE, RELEASE_DIR, TEST_DEPS_FILE, TSC_OUTPUT_DIR, TYPINGS_BUILD_DIR} = require('./config'); -var {getPackageJson} = require('./helper_tasks'); +const {BUILD_DIR, DEPS_FILE, RELEASE_DIR, TEST_DEPS_FILE, TSC_OUTPUT_DIR, TYPINGS_BUILD_DIR} = require('./config'); +const {getPackageJson} = require('./helper_tasks'); -var {posixPath} = require('../helpers'); +const {posixPath} = require('../helpers'); //////////////////////////////////////////////////////////// // Build // @@ -168,14 +168,14 @@ function stripApacheLicense() { // Closure Compiler preserves dozens of Apache licences in the Blockly code. // Remove these if they belong to Google or MIT. // MIT's permission to do this is logged in Blockly issue #2412. - return gulp.replace(new RegExp(licenseRegex, "g"), '\n\n\n\n'); + return gulp.replace(new RegExp(licenseRegex, 'g'), '\n\n\n\n'); // Replace with the same number of lines so that source-maps are not affected. } /** - * Closure compiler diagnostic groups we want to be treated as errors. + * Closure Compiler diagnostic groups we want to be treated as errors. * These are effected when the --debug or --strict flags are passed. - * For a full list of closure compiler groups, consult the output of + * For a full list of Closure Compiler groups, consult the output of * google-closure-compiler --help or look in the source here: * https://github.com/google/closure-compiler/blob/master/src/com/google/javascript/jscomp/DiagnosticGroups.java#L117 * @@ -185,7 +185,7 @@ function stripApacheLicense() { * appearing on any list will default to setting provided by the * compiler, which may vary depending on compilation level. */ -var JSCOMP_ERROR = [ +const JSCOMP_ERROR = [ // 'accessControls', // Deprecated; means same as visibility. // 'checkPrototypalTypes', // override annotations are stripped by tsc. 'checkRegExp', @@ -235,25 +235,25 @@ var JSCOMP_ERROR = [ ]; /** - * Closure compiler diagnostic groups we want to be treated as warnings. + * Closure Compiler diagnostic groups we want to be treated as warnings. * These are effected when the --debug or --strict flags are passed. * * For most (all?) diagnostic groups this is the default level, so * it's generally sufficient to remove them from JSCOMP_ERROR. */ -var JSCOMP_WARNING = [ +const JSCOMP_WARNING = [ ]; /** - * Closure compiler diagnostic groups we want to be ignored. These + * Closure Compiler diagnostic groups we want to be ignored. These * suppressions are always effected by default. * * Make sure that anything added here is commented out of JSCOMP_ERROR * above, as that takes precedence.) */ -var JSCOMP_OFF = [ +const JSCOMP_OFF = [ /* The removal of Closure type system types from our JSDoc - * annotations means that the closure compiler now generates certain + * annotations means that the Closure Compiler now generates certain * diagnostics because it no longer has enough information to be * sure that the input code is correct. The following diagnostic * groups are turned off to suppress such errors. @@ -288,25 +288,6 @@ var JSCOMP_OFF = [ 'visibility', ]; -/** - * The npm prepare script, run by npm install after installing modules - * and as part of the packaging process. - * - * This does just enough of the build that npm start should work. - * - * Exception: when running in the CI environment, we don't build - * anything. We don't need to, because npm test will build everything - * needed, and we don't want to, because a tsc error would prevent - * other workflows (like lint and format) from completing. - */ -function prepare(done) { - if (process.env.CI) { - done(); - return; - } - return exports.deps(done); -} - /** * Builds Blockly as a JS program, by running tsc on all the files in * the core directory. @@ -315,6 +296,7 @@ function buildJavaScript(done) { execSync( `tsc -outDir "${TSC_OUTPUT_DIR}" -declarationDir "${TYPINGS_BUILD_DIR}"`, {stdio: 'inherit'}); + execSync(`node scripts/tsick.js "${TSC_OUTPUT_DIR}"`, {stdio: 'inherit'}); done(); } @@ -405,7 +387,7 @@ function generateMessages(done) { --input_file ${path.join('msg', 'messages.js')} \ --output_dir ${path.join('msg', 'json')} \ --quiet`; - execSync(jsToJsonCmd, { stdio: 'inherit' }); + execSync(jsToJsonCmd, {stdio: 'inherit'}); console.log(` Regenerated several flies in msg/json/. Now run @@ -452,7 +434,7 @@ function buildLangfiles(done) { } /** - * A helper method to return an closure compiler chunk wrapper that + * A helper method to return an Closure Compiler chunk wrapper that * wraps the compiler output for the given chunk in a Universal Module * Definition. */ @@ -609,10 +591,10 @@ function getChunkOptions() { /** * RegExp that globally matches path.sep (i.e., "/" or "\"). */ -const pathSepRegExp = new RegExp(path.sep.replace(/\\/, '\\\\'), "g"); +const pathSepRegExp = new RegExp(path.sep.replace(/\\/, '\\\\'), 'g'); /** - * Helper method for calling the Closure compiler, establishing + * Helper method for calling the Closure Compiler, establishing * default options (that can be overridden by the caller). * @param {*} options Caller-supplied options that will override the * defaultOptions. @@ -663,7 +645,7 @@ function buildCompiled() { const packageJson = getPackageJson(); // For version number. const options = { // The documentation for @define claims you can't use it on a - // non-global, but the closure compiler turns everything in to a + // non-global, but the Closure Compiler turns everything in to a // global - you just have to know what the new name is! With // declareLegacyNamespace this was very straightforward. Without // it, we have to rely on implmentation details. See @@ -688,11 +670,19 @@ function buildCompiled() { /** * This task builds Blockly core, blocks and generators together and uses - * closure compiler's ADVANCED_COMPILATION mode. + * Closure Compiler's ADVANCED_COMPILATION mode. * * Prerequisite: buildDeps. */ function buildAdvancedCompilationTest() { + // If main_compressed.js exists (from a previous run) delete it so that + // a later browser-based test won't check it should the compile fail. + try { + fs.unlinkSync('./tests/compile/main_compressed.js'); + } catch (_e) { + // Probably it didn't exist. + } + const srcs = [ TSC_OUTPUT_DIR + '/closure/goog/base_minimal.js', TSC_OUTPUT_DIR + '/closure/goog/goog.js', @@ -751,7 +741,6 @@ exports.minify = gulp.series(exports.deps, buildCompiled); exports.build = gulp.parallel(exports.minify, exports.langfiles); // Manually-invokable targets, with prequisites where required. -exports.prepare = prepare; exports.format = format; exports.messages = generateMessages; // Generate msg/json/en.json et al. exports.buildAdvancedCompilationTest = diff --git a/scripts/gulpfiles/config.js b/scripts/gulpfiles/config.js index 200d6ac45..5f3cad99d 100644 --- a/scripts/gulpfiles/config.js +++ b/scripts/gulpfiles/config.js @@ -8,7 +8,7 @@ * @fileoverview Common configuration for Gulp scripts. */ -var path = require('path'); +const path = require('path'); // Paths are all relative to the repository root. Do not include // trailing slash. diff --git a/scripts/gulpfiles/git_tasks.js b/scripts/gulpfiles/git_tasks.js index 0f1413350..eb3a825c0 100644 --- a/scripts/gulpfiles/git_tasks.js +++ b/scripts/gulpfiles/git_tasks.js @@ -8,10 +8,10 @@ * @fileoverview Git-related gulp tasks for Blockly. */ -var gulp = require('gulp'); -var execSync = require('child_process').execSync; +const gulp = require('gulp'); +const execSync = require('child_process').execSync; -var buildTasks = require('./build_tasks'); +const buildTasks = require('./build_tasks'); const packageTasks = require('./package_tasks'); const upstream_url = "https://github.com/google/blockly.git"; @@ -41,18 +41,18 @@ function syncMaster() { // Helper function: get a name for a rebuild branch. Format: rebuild_mm_dd_yyyy. function getRebuildBranchName() { - var date = new Date(); - var mm = date.getMonth() + 1; // Month, 0-11 - var dd = date.getDate(); // Day of the month, 1-31 - var yyyy = date.getFullYear(); + const date = new Date(); + const mm = date.getMonth() + 1; // Month, 0-11 + const dd = date.getDate(); // Day of the month, 1-31 + const yyyy = date.getFullYear(); return 'rebuild_' + mm + '_' + dd + '_' + yyyy; }; // Helper function: get a name for a rebuild branch. Format: rebuild_yyyy_mm. function getRCBranchName() { - var date = new Date(); - var mm = date.getMonth() + 1; // Month, 0-11 - var yyyy = date.getFullYear(); + const date = new Date(); + const mm = date.getMonth() + 1; // Month, 0-11 + const yyyy = date.getFullYear(); return 'rc_' + yyyy + '_' + mm; }; @@ -68,7 +68,7 @@ function checkoutBranch(branchName) { const createRC = gulp.series( syncDevelop(), function(done) { - var branchName = getRCBranchName(); + const branchName = getRCBranchName(); execSync('git checkout -b ' + branchName, { stdio: 'inherit' }); execSync('git push ' + upstream_url + ' ' + branchName, { stdio: 'inherit' }); @@ -78,7 +78,7 @@ const createRC = gulp.series( // Create the rebuild branch. function createRebuildBranch(done) { - var branchName = getRebuildBranchName(); + const branchName = getRebuildBranchName(); console.log('make-rebuild-branch: creating branch ' + branchName); execSync('git checkout -b ' + branchName, { stdio: 'inherit' }); done(); @@ -88,7 +88,7 @@ function createRebuildBranch(done) { function pushRebuildBranch(done) { console.log('push-rebuild-branch: committing rebuild'); execSync('git commit -am "Rebuild"', { stdio: 'inherit' }); - var branchName = getRebuildBranchName(); + const branchName = getRebuildBranchName(); execSync('git push origin ' + branchName, { stdio: 'inherit' }); console.log('Branch ' + branchName + ' pushed to GitHub.'); console.log('Next step: create a pull request against develop.'); diff --git a/scripts/gulpfiles/package_tasks.js b/scripts/gulpfiles/package_tasks.js index 2408641f7..d5fba6258 100644 --- a/scripts/gulpfiles/package_tasks.js +++ b/scripts/gulpfiles/package_tasks.js @@ -8,7 +8,7 @@ * @fileoverview Gulp tasks to package Blockly for distribution on NPM. */ -var gulp = require('gulp'); +const gulp = require('gulp'); gulp.concat = require('gulp-concat'); gulp.replace = require('gulp-replace'); gulp.rename = require('gulp-rename'); @@ -16,12 +16,12 @@ gulp.insert = require('gulp-insert'); gulp.umd = require('gulp-umd'); gulp.replace = require('gulp-replace'); -var path = require('path'); -var fs = require('fs'); -var rimraf = require('rimraf'); -var build = require('./build_tasks'); -var {getPackageJson} = require('./helper_tasks'); -var {BUILD_DIR, RELEASE_DIR, TYPINGS_BUILD_DIR} = require('./config'); +const path = require('path'); +const fs = require('fs'); +const rimraf = require('rimraf'); +const build = require('./build_tasks'); +const {getPackageJson} = require('./helper_tasks'); +const {BUILD_DIR, RELEASE_DIR, TYPINGS_BUILD_DIR} = require('./config'); // Path to template files for gulp-umd. const TEMPLATE_DIR = 'scripts/package/templates'; @@ -290,7 +290,7 @@ function packageLocales() { * @example */ function packageUMDBundle() { - var srcs = [ + const srcs = [ `${RELEASE_DIR}/blockly_compressed.js`, `${RELEASE_DIR}/msg/en.js`, `${RELEASE_DIR}/blocks_compressed.js`, diff --git a/scripts/gulpfiles/release_tasks.js b/scripts/gulpfiles/release_tasks.js index 4a387705f..58717985c 100644 --- a/scripts/gulpfiles/release_tasks.js +++ b/scripts/gulpfiles/release_tasks.js @@ -8,22 +8,22 @@ * @fileoverview Gulp scripts for releasing Blockly. */ -var execSync = require('child_process').execSync; -var fs = require('fs'); -var gulp = require('gulp'); -var readlineSync = require('readline-sync'); +const execSync = require('child_process').execSync; +const fs = require('fs'); +const gulp = require('gulp'); +const readlineSync = require('readline-sync'); -var gitTasks = require('./git_tasks'); -var packageTasks = require('./package_tasks'); -var {getPackageJson} = require('./helper_tasks'); -var {RELEASE_DIR} = require('./config'); +const gitTasks = require('./git_tasks'); +const packageTasks = require('./package_tasks'); +const {getPackageJson} = require('./helper_tasks'); +const {RELEASE_DIR} = require('./config'); // Gets the current major version. function getMajorVersion() { - var { version } = getPackageJson(); - var re = new RegExp(/^(\d)./); - var match = re.exec(version); + const { version } = getPackageJson(); + const re = new RegExp(/^(\d)./); + const match = re.exec(version); if (!match[0]) { return null; } @@ -33,7 +33,7 @@ function getMajorVersion() { // Updates the version depending on user input. function updateVersion(done, updateType) { - var majorVersion = getMajorVersion(); + const majorVersion = getMajorVersion(); if (!majorVersion) { done(new Error('Something went wrong when getting the major version number.')); } else if (!updateType) { @@ -62,14 +62,14 @@ function updateVersion(done, updateType) { // Prompt the user to figure out what kind of version update we should do. function updateVersionPrompt(done) { - var releaseTypes = ['Major', 'Minor', 'Patch']; - var index = readlineSync.keyInSelect(releaseTypes, 'Which version type?'); + const releaseTypes = ['Major', 'Minor', 'Patch']; + const index = readlineSync.keyInSelect(releaseTypes, 'Which version type?'); updateVersion(done, releaseTypes[index]); } // Checks with the user that they are on the correct git branch. function checkBranch(done) { - var gitBranchName = execSync('git rev-parse --abbrev-ref HEAD').toString(); + const gitBranchName = execSync('git rev-parse --abbrev-ref HEAD').toString(); if (readlineSync.keyInYN(`You are on '${gitBranchName.trim()}'. Is this the correct branch?`)) { done(); } else { @@ -101,7 +101,7 @@ function checkReleaseDir(done) { // Check with the user that the version number is correct, then login and publish to npm. function loginAndPublish_(done, isBeta) { - var { version } = getPackageJson(); + const { version } = getPackageJson(); if(readlineSync.keyInYN(`You are about to publish blockly with the version number:${version}. Do you want to continue?`)) { execSync(`npm login --registry https://wombat-dressing-room.appspot.com`, {stdio: 'inherit'}); execSync(`npm publish --registry https://wombat-dressing-room.appspot.com ${isBeta ? '--tag beta' : ''}`, {cwd: RELEASE_DIR, stdio: 'inherit'}); @@ -124,15 +124,15 @@ function loginAndPublishBeta(done) { // Repeatedly prompts the user for a beta version number until a valid one is given. // A valid version number must have '-beta.x' and can not have already been used to publish to npm. function updateBetaVersion(done) { - var isValid = false; - var newVersion = null; - var blocklyVersions = JSON.parse(execSync('npm view blockly versions --json').toString()); - var re = new RegExp(/-beta\.(\d)/); - var latestBetaVersion = execSync('npm show blockly version --tag beta').toString().trim(); + let isValid = false; + let newVersion = null; + const blocklyVersions = JSON.parse(execSync('npm view blockly versions --json').toString()); + const re = new RegExp(/-beta\.(\d)/); + const latestBetaVersion = execSync('npm show blockly version --tag beta').toString().trim(); while(!isValid) { newVersion = readlineSync.question(`What is the new beta version? (latest beta version: ${latestBetaVersion})`); - var existsOnNpm = blocklyVersions.indexOf(newVersion) > -1; - var isFormatted = newVersion.search(re) > -1; + const existsOnNpm = blocklyVersions.indexOf(newVersion) > -1; + const isFormatted = newVersion.search(re) > -1; if (!existsOnNpm && isFormatted) { isValid = true; } else if (existsOnNpm) { diff --git a/scripts/gulpfiles/test_tasks.js b/scripts/gulpfiles/test_tasks.js index e3da00df4..68fb63963 100644 --- a/scripts/gulpfiles/test_tasks.js +++ b/scripts/gulpfiles/test_tasks.js @@ -9,6 +9,7 @@ */ /* eslint-env node */ +const asyncDone = require('async-done'); const gulp = require('gulp'); const gzip = require('gulp-gzip'); const fs = require('fs'); @@ -16,13 +17,12 @@ const path = require('path'); const {execSync} = require('child_process'); const rimraf = require('rimraf'); +const buildTasks = require('./build_tasks'); const {BUILD_DIR, RELEASE_DIR} = require('./config'); -const runMochaTestsInBrowser = - require('../../tests/mocha/run_mocha_tests_in_browser.js'); - -const runGeneratorsInBrowser = - require('../../tests/generators/run_generators_in_browser.js'); +const {runMochaTestsInBrowser} = require('../../tests/mocha/webdriver.js'); +const {runGeneratorsInBrowser} = require('../../tests/generators/webdriver.js'); +const {runCompileCheckInBrowser} = require('../../tests/compile/webdriver.js'); const OUTPUT_DIR = 'build/generators'; const GOLDEN_DIR = 'tests/generators/golden'; @@ -31,91 +31,128 @@ const BOLD_GREEN = '\x1b[1;32m'; const BOLD_RED = '\x1b[1;31m'; const ANSI_RESET = '\x1b[0m'; -let failerCount = 0; +class Tester { + constructor(tasks = []) { + this.successCount = 0; + this.failCount = 0; + this.tasks = tasks; + } -/** - * Helper method for running test code block. - * @param {string} id test id - * @param {function} block test code block - * @return {Promise} asynchronous result - */ -function runTestBlock(id, block) { - return new Promise((resolve) => { + /** + * Run all tests in sequence. + */ + async runAll() { + for (const task of this.tasks) { + await this.runTestTask(task) + } + this.reportTestResult(); + } + + /** + * Create a Gulp task to run all tests. + */ + asTask() { + return this.runAll.bind(this); + } + + /** + * Run an arbitrary Gulp task as a test. + * @param {function} task Any Gulp task. + * @return {Promise} Asynchronous result. + */ + async runTestTask(task) { + const id = task.name; console.log('======================================='); console.log(`== ${id}`); if (process.env.CI) console.log('::group::'); - block() - .then((result) => { + + try { + try { + await new Promise((resolve, reject) => { + asyncDone(task, (error, result) => { + if (error) reject(error); + resolve(result); + }); + }); + } finally { if (process.env.CI) console.log('::endgroup::'); - console.log(`${BOLD_GREEN}SUCCESS:${ANSI_RESET} ${id}`); - resolve(result); - }) - .catch((err) => { - failerCount++; - console.error(err.message); - if (process.env.CI) console.log('::endgroup::'); - console.log(`${BOLD_RED}FAILED:${ANSI_RESET} ${id}`); - // Always continue. - resolve(err); - }); - }); -} + } + this.successCount++; + console.log(`${BOLD_GREEN}SUCCESS:${ANSI_RESET} ${id}`); + } catch (error) { + this.failCount++; + console.error(error.message); + console.log(`${BOLD_RED}FAILED:${ANSI_RESET} ${id}`); + } + } + + /** + * Print test results. + */ + reportTestResult() { + console.log('======================================='); + // Check result. + if (this.failCount === 0) { + console.log( + `${BOLD_GREEN}All ${this.successCount} tests passed.${ANSI_RESET}`); + } else { + console.log( + `${BOLD_RED}Failures in ${this.failCount} test groups.${ANSI_RESET}`); + } + } +}; /** * Helper method for running test command. - * @param {string} id test id - * @param {string} command command line to run - * @return {Promise} asynchronous result + * @param {string} command Command line to run. + * @return {Promise} Asynchronous result. */ -function runTestCommand(id, command) { - return runTestBlock(id, async() => { - return execSync(command, {stdio: 'inherit'}); - }, false); +async function runTestCommand(command) { + execSync(command, {stdio: 'inherit'}); } /** * Lint the codebase. * Skip for CI environments, because linting is run separately. - * @return {Promise} asynchronous result + * @return {Promise} Asynchronous result. */ function eslint() { if (process.env.CI) { console.log('Skip linting.'); return Promise.resolve(); } - return runTestCommand('eslint', 'eslint .'); + return runTestCommand('eslint .'); } /** * Run the full usual build and package process, checking to ensure - * there are no closure compiler warnings / errors. - * @return {Promise} asynchronous result + * there are no Closure Compiler warnings / errors. + * @return {Promise} Asynchronous result. */ function build() { - return runTestCommand('build + package', - 'npm run package -- --verbose --debug'); + return runTestCommand('npm run package -- --verbose --debug'); } /** * Run renaming validation test. - * @return {Promise} asynchronous result + * @return {Promise} Asynchronous result. */ function renamings() { - return runTestCommand('renamings', 'node tests/migration/validate-renamings.js'); + return runTestCommand('node tests/migration/validate-renamings.js'); } /** * Helper method for gzipping file. - * @param {string} file target file - * @return {Promise} asynchronous result + * @param {string} file Target file. + * @return {Promise} Asynchronous result. */ function gzipFile(file) { return new Promise((resolve) => { const name = path.posix.join(RELEASE_DIR, file); const stream = gulp.src(name) - .pipe(gzip()) - .pipe(gulp.dest(RELEASE_DIR)); + .pipe(gzip()) + .pipe(gulp.dest(RELEASE_DIR)); stream.on('end', () => { resolve(); @@ -125,9 +162,9 @@ function gzipFile(file) { /** * Helper method for comparing file size. - * @param {string} file target file - * @param {number} expected expected size - * @return {number} 0: success / 1: failed + * @param {string} file Target file. + * @param {number} expected Expected size. + * @return {number} 0: success / 1: failed. */ function compareSize(file, expected) { const name = path.posix.join(RELEASE_DIR, file); @@ -137,12 +174,12 @@ function compareSize(file, expected) { if (size > compare) { const message = `Failed: ` + - `Size of ${name} has grown more than 10%. ${size} vs ${expected} `; + `Size of ${name} has grown more than 10%. ${size} vs ${expected}`; console.log(`${BOLD_RED}${message}${ANSI_RESET}`); return 1; } else { const message = - `Size of ${name} at ${size} compared to previous ${expected}`; + `Size of ${name} at ${size} compared to previous ${expected}`; console.log(`${BOLD_GREEN}${message}${ANSI_RESET}`); return 0; } @@ -150,7 +187,7 @@ function compareSize(file, expected) { /** * Helper method for zipping the compressed files. - * @return {Promise} asynchronous result + * @return {Promise} Asynchronous result. */ function zippingFiles() { // GZip them for additional size comparisons (keep originals, force @@ -163,59 +200,55 @@ function zippingFiles() { /** * Check the sizes of built files for unexpected growth. - * @return {Promise} asynchronous result + * @return {Promise} Asynchronous result. */ -function metadata() { - return runTestBlock('metadata', async() => { - // Zipping the compressed files. - await zippingFiles(); - // Read expected size from script. - const contents = fs.readFileSync('tests/scripts/check_metadata.sh') +async function metadata() { + // Zipping the compressed files. + await zippingFiles(); + // Read expected size from script. + const contents = fs.readFileSync('tests/scripts/check_metadata.sh') .toString(); - const pattern = /^readonly (?[A-Z_]+)=(?\d+)$/gm; - const matches = contents.matchAll(pattern); - const expected = {}; - for (const match of matches) { - expected[match.groups.key] = match.groups.value; - } + const pattern = /^readonly (?[A-Z_]+)=(?\d+)$/gm; + const matches = contents.matchAll(pattern); + const expected = {}; + for (const match of matches) { + expected[match.groups.key] = match.groups.value; + } - // Check the sizes of the files. - let failed = 0; - failed += compareSize('blockly_compressed.js', - expected.BLOCKLY_SIZE_EXPECTED); - failed += compareSize('blocks_compressed.js', - expected.BLOCKS_SIZE_EXPECTED); - failed += compareSize('blockly_compressed.js.gz', - expected.BLOCKLY_GZ_SIZE_EXPECTED); - failed += compareSize('blocks_compressed.js.gz', - expected.BLOCKS_GZ_SIZE_EXPECTED); - if (failed > 0) { - throw new Error('Unexpected growth was detected.'); - } - }); + // Check the sizes of the files. + let failed = 0; + failed += compareSize('blockly_compressed.js', + expected.BLOCKLY_SIZE_EXPECTED); + failed += compareSize('blocks_compressed.js', + expected.BLOCKS_SIZE_EXPECTED); + failed += compareSize('blockly_compressed.js.gz', + expected.BLOCKLY_GZ_SIZE_EXPECTED); + failed += compareSize('blocks_compressed.js.gz', + expected.BLOCKS_GZ_SIZE_EXPECTED); + if (failed > 0) { + throw new Error('Unexpected growth was detected.'); + } } /** * Run Mocha tests inside a browser. - * @return {Promise} asynchronous result + * @return {Promise} Asynchronous result. */ -function mocha() { - return runTestBlock('mocha', async() => { - const result = await runMochaTestsInBrowser().catch(e => { - throw e; - }); - if (result) { - throw new Error('Mocha tests failed'); - } - console.log('Mocha tests passed'); +async function mocha() { + const result = await runMochaTestsInBrowser().catch(e => { + throw e; }); + if (result) { + throw new Error('Mocha tests failed'); + } + console.log('Mocha tests passed'); } /** * Helper method for comparison file. - * @param {string} file1 first target file - * @param {string} file2 second target file - * @return {boolean} comparison result (true: same / false: different) + * @param {string} file1 First target file. + * @param {string} file2 Second target file. + * @return {boolean} Comparison result (true: same / false: different). */ function compareFile(file1, file2) { const buf1 = fs.readFileSync(file1); @@ -223,14 +256,13 @@ function compareFile(file1, file2) { // Normalize the line feed. const code1 = buf1.toString().replace(/(?:\r\n|\r|\n)/g, '\n'); const code2 = buf2.toString().replace(/(?:\r\n|\r|\n)/g, '\n'); - const result = (code1 === code2); - return result; + return code1 === code2; } /** * Helper method for checking the result of generator. - * @param {string} suffix target suffix - * @return {number} check result (0: success / 1: failed) + * @param {string} suffix Target suffix. + * @return {number} Check result (0: success / 1: failed). */ function checkResult(suffix) { const fileName = `generated.${suffix}`; @@ -244,12 +276,12 @@ function checkResult(suffix) { if (fs.existsSync(goldenFileName)) { if (compareFile(resultFileName, goldenFileName)) { console.log(`${SUCCESS_PREFIX} ${suffix}: ` + - `${resultFileName} matches ${goldenFileName}`); + `${resultFileName} matches ${goldenFileName}`); return 0; } else { console.log( - `${FAILURE_PREFIX} ${suffix}: ` + - `${resultFileName} does not match ${goldenFileName}`); + `${FAILURE_PREFIX} ${suffix}: ` + + `${resultFileName} does not match ${goldenFileName}`); } } else { console.log(`File ${goldenFileName} not found!`); @@ -262,66 +294,49 @@ function checkResult(suffix) { /** * Run generator tests inside a browser and check the results. - * @return {Promise} asynchronous result + * @return {Promise} Asynchronous result. */ -function generators() { - return runTestBlock('generators', async() => { - // Clean up. - rimraf.sync(OUTPUT_DIR); - fs.mkdirSync(OUTPUT_DIR); +async function generators() { + // Clean up. + rimraf.sync(OUTPUT_DIR); + fs.mkdirSync(OUTPUT_DIR); - await runGeneratorsInBrowser(OUTPUT_DIR).catch(() => {}); + await runGeneratorsInBrowser(OUTPUT_DIR).catch(() => {}); - const generatorSuffixes = ['js', 'py', 'dart', 'lua', 'php']; - let failed = 0; - generatorSuffixes.forEach((suffix) => { - failed += checkResult(suffix); - }); - - if (failed === 0) { - console.log(`${BOLD_GREEN}All generator tests passed.${ANSI_RESET}`); - } else { - console.log( - `${BOLD_RED}Failures in ${failed} generator tests.${ANSI_RESET}`); - throw new Error('Generator tests failed.'); - } + const generatorSuffixes = ['js', 'py', 'dart', 'lua', 'php']; + let failed = 0; + generatorSuffixes.forEach((suffix) => { + failed += checkResult(suffix); }); + + if (failed === 0) { + console.log(`${BOLD_GREEN}All generator tests passed.${ANSI_RESET}`); + } else { + console.log( + `${BOLD_RED}Failures in ${failed} generator tests.${ANSI_RESET}`); + throw new Error('Generator tests failed.'); + } } /** * Run Node tests. - * @return {Promise} asynchronous result + * @return {Promise} Asynchronous result. */ function node() { - return runTestCommand('node', 'mocha tests/node --config tests/node/.mocharc.js'); + return runTestCommand('mocha tests/node --config tests/node/.mocharc.js'); } /** * Attempt advanced compilation of a Blockly app. - * @return {Promise} asynchronous result + * @return {Promise} Asynchronous result. */ function advancedCompile() { - return runTestCommand('advanced_compile', 'npm run only:compile:advanced'); + const compilePromise = runTestCommand('npm run test:compile:advanced'); + return compilePromise.then(runCompileCheckInBrowser); } -/** - * Report test result. - * @return {Promise} asynchronous result - */ -function reportTestResult() { - console.log('======================================='); - // Check result. - if (failerCount === 0) { - console.log(`${BOLD_GREEN}All tests passed.${ANSI_RESET}`); - return Promise.resolve(); - } else { - console.log(`${BOLD_RED}Failures in ${failerCount} test groups.${ANSI_RESET}`); - return Promise.reject(); - } -} - -// Indivisual tasks. -const testTasks = [ +// Run all tests in sequence. +const test = new Tester([ eslint, build, renamings, @@ -330,11 +345,8 @@ const testTasks = [ generators, node, advancedCompile, - reportTestResult, -]; +]).asTask(); -// Run all tests in sequence. -const test = gulp.series(...testTasks); module.exports = { test, diff --git a/scripts/migration/renamings.json5 b/scripts/migration/renamings.json5 index 540fd08e5..2c33d67ef 100644 --- a/scripts/migration/renamings.json5 +++ b/scripts/migration/renamings.json5 @@ -1339,8 +1339,13 @@ '9.0.0': [ { - 'oldName': 'Blockly.utils.global', - 'newPath': 'globalThis', + oldName: 'Blockly.utils.global', + exports: { + globalThis: { + oldPath: 'Blockly.utils.global', + newPath: 'globalThis', + } + } }, { oldName: 'Blockly.Dart', @@ -1366,7 +1371,7 @@ oldName: 'Blockly.Python', newExport: 'pythonGenerator', newPath: 'Blockly.Python', - 'oldName': 'Blockly.ContextMenuRegistry', + oldName: 'Blockly.ContextMenuRegistry', exports: { 'ContextMenuRegistry.ScopeType': { oldPath: 'Blockly.ContextMenuRegistry.ScopeType', @@ -1396,7 +1401,7 @@ }, }, { - 'oldName': 'Blockly.Input', + oldName: 'Blockly.Input', exports: { 'Input.Align': { oldPath: 'Blockly.Input.Align', @@ -1406,7 +1411,7 @@ }, }, { - 'oldName': 'Blockly.Names', + oldName: 'Blockly.Names', exports: { 'Names.NameType': { oldPath: 'Blockly.Names.NameType', @@ -1419,5 +1424,9 @@ 'develop': [ // New renamings go here! + { + oldName: 'Blockly.TouchGesture', + newName: 'Blockly.Gesture', + }, ] } diff --git a/scripts/package/node/core.js b/scripts/package/node/core.js index 11e77b5b6..28c1b3c90 100644 --- a/scripts/package/node/core.js +++ b/scripts/package/node/core.js @@ -16,9 +16,10 @@ // Override textToDomDocument and provide Node.js alternatives to DOMParser and // XMLSerializer. if (typeof globalThis.document !== 'object') { - const jsdom = require('jsdom/lib/jsdom/living'); - globalThis.DOMParser = jsdom.DOMParser; - globalThis.XMLSerializer = jsdom.XMLSerializer; + const {JSDOM} = require('jsdom'); + const {window} = new JSDOM(``); + globalThis.DOMParser = window.DOMParser; + globalThis.XMLSerializer = window.XMLSerializer; const xmlDocument = Blockly.utils.xml.textToDomDocument( ``); Blockly.utils.xml.setDocument(xmlDocument); diff --git a/scripts/tsick.js b/scripts/tsick.js new file mode 100644 index 000000000..cfe5eaf72 --- /dev/null +++ b/scripts/tsick.js @@ -0,0 +1,83 @@ +/** + * @license + * Copyright 2022 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Lightweight conversion from tsc ouptut to Closure Compiler + * compatible input. + */ +'use strict'; + +// eslint-disable-next-line no-undef +const fs = require('fs'); + +// eslint-disable-next-line no-undef +const DIR = process.argv[2]; + +// Number of files rewritten. +let fileCount = 0; + +/** + * Recursively spider the given directory and rewrite any JS files found. + * @param {string} dir Directory path to start from. + */ +function spider(dir) { + if (!dir.endsWith('/')) { + dir += '/'; + } + const entries = fs.readdirSync(dir, {withFileTypes: true}); + for (const entry of entries) { + if (entry.isDirectory()) { + spider(dir + entry.name + '/'); + } else if (entry.name.endsWith('.js')) { + rewriteFile(dir + entry.name); + } + } +} + +/** + * Given a file, rewrite it if it contains problematic patterns. + * @param {string} path Path of file to potentially rewrite. + */ +function rewriteFile(path) { + const oldCode = fs.readFileSync(path, 'utf8'); + const newCode = rewriteEnum(oldCode); + if (newCode !== oldCode) { + fileCount++; + fs.writeFileSync(path, newCode); + } +} + +/** + * Unquote enum definitions in the given code string. + * @param {string} code Original code generated by tsc. + * @return {string} Rewritten code for Closure Compiler. + */ +function rewriteEnum(code) { + // Find all enum definitions. They look like this: + // (function (names) { + // ... + // })(names || (names = {})); + const enumDefs = code.match(/\s+\(function \((\w+)\) \{\n[^}]*\}\)\(\1 [^)]+\1 = \{\}\)\);/g) || []; + for (const oldEnumDef of enumDefs) { + // enumDef looks like a bunch of lines in one of these two formats: + // ScopeType["BLOCK"] = "block"; + // KeyCodes[KeyCodes["TAB"] = 9] = "TAB"; + // We need to unquote them to look like one of these two formats: + // ScopeType.BLOCK = "block"; + // KeyCodes[KeyCodes.TAB = 9] = "TAB"; + let newEnumDef = oldEnumDef.replace(/\["(\w+)"\]/g, '.$1'); + newEnumDef = newEnumDef.replace(') {', ') { // Converted by tsick.'); + code = code.replace(oldEnumDef, newEnumDef); + } + return code; +} + +if (DIR) { + spider(DIR); + console.log(`Unquoted enums in ${fileCount} files.`); +} else { + throw Error('No source directory specified'); +} diff --git a/tests/bootstrap.js b/tests/bootstrap.js index 7d3549101..d872ab269 100644 --- a/tests/bootstrap.js +++ b/tests/bootstrap.js @@ -92,6 +92,34 @@ 'dist/python_compressed.js', ], + // List of imports to give global names to. The keys are the + // global variable names, the values are goog.module IDs to name, + // or (when loading in compressed mode) the paths within the + // Blockly namespace at which the corresponding chunk is loaded by + // its UMD wrapper. Note that entries in this map are ignored if + // the corresponding goog.module has not been loaded via an entry + // in requires or compressedScripts. + namedImports: { + Blockly: 'Blockly', + libraryBlocks: 'Blockly.libraryBlocks', + }, + + // List of destructured imports. As for namedImports, but only + // the named export corresponding to the mentioned global variable + // will be imported. + // + // Exception: in compressed mode, the UMD wrapeprs generated by + // chunkWrapper() in scripts/gulpfiles/build_tasks.js already pull + // out the desired named export - so in that case the entries here + // are treated identically to those in namedImports. + destructuredImports: { + dartGenerator: 'Blockly.Dart', + javascriptGenerator: 'Blockly.JavaScript', + luaGenerator: 'Blockly.Lua', + phpGenerator: 'Blockly.PHP', + pythonGenerator: 'Blockly.Python', + }, + // Additional scripts to be loaded after Blockly is loaded, // whether Blockly is loaded from compressed or uncompressed. // Paths relative to root. @@ -117,6 +145,8 @@ window.bootstrapInfo = { /** boolean */ compressed: options.loadCompressed, /** ?Array */ requires: null, + /** Object */ namedImports: options.namedImports, + /** Object */ destructuredImports: options.destructuredImports, /** ?Promise */ done: null, }; @@ -188,8 +218,11 @@ } else { // We need to load Blockly in compressed mode. Load // blockly_compressed.js et al. using `); } diff --git a/tests/bootstrap_helper.js b/tests/bootstrap_helper.js index e9e7cd68a..4a22dadcb 100644 --- a/tests/bootstrap_helper.js +++ b/tests/bootstrap_helper.js @@ -14,30 +14,60 @@ * undeclared dependencies on them. */ -/* eslint-disable-next-line no-undef */ -for (const require of window.bootstrapInfo.requires) { - goog.require(require); +(function() { + const info = window.bootstrapInfo; - // If require is a top-level chunk, create a global variable for it. - // This replaces the goog.module.declareLegacyNamespace calls that - // previously existed in each chunk entrypoint. - const exportName = { - 'Blockly.Dart': 'dartGenerator', - 'Blockly.Dart.all': 'dartGenerator', - 'Blockly.JavaScript': 'javascriptGenerator', - 'Blockly.JavaScript.all': 'javascriptGenerator', - 'Blockly.Lua': 'luaGenerator', - 'Blockly.Lua.all': 'luaGenerator', - 'Blockly.PHP': 'phpGenerator', - 'Blockly.PHP.all': 'phpGenerator', - 'Blockly.Python': 'pythonGenerator', - 'Blockly.Python.all': 'pythonGenerator', - }[require]; - if (exportName) { - window[exportName] = goog.module.get(require)[exportName]; - } else if (require === 'Blockly') { - window.Blockly = goog.module.get(require); - } else if (require === 'Blockly.libraryBlocks') { - window.libraryBlocks = goog.module.get(require); + if (!info.compressed) { + // Force debug module loader to finish loading all modules. + for (const require of info.requires) { + goog.require(require); + + // This is a kludge to work around an issue where attempting to + // load Blockly.libraryBlocks (blocks/blocks.js) fails if the + // Blockly global variable is not defined. + // + // This is apparently because the debug module loader fails to + // load Blockly.libraryBlocks.lists (blocks/lists.js) and + // .procedures (blocks/procedures.js) first, despite they both + // being required from blocks.js, and that is apparently because + // they both depend on Blockly.Xml which the debug loader seems + // to think has not been loaded yet even though it has. + if (require === 'Blockly') { + window.Blockly = goog.module.get('Blockly'); + } + } } -} + + // Create global names for named and destructured imports. + for (const varName in info.namedImports) { + const id = info.namedImports[varName]; + const value = info.compressed ? get(id) : goog.module.get(id); + if (value) { + window[varName] = value; + } + } + for (const varName in info.destructuredImports) { + const id = info.destructuredImports[varName]; + const value = info.compressed ? get(id) : goog.module.get(id)[varName]; + if (value) { + window[varName] = value; + } + } + + return; // All done. Only helper functions after this point. + + /** + * Get the object referred to by a doted-itentifier path + * (e.g. foo.bar.baz). + * @param {string} path The path referring to the object. + * @return {string|null} The object, or null if not found. + */ + function get(path) { + let obj = window; + for (const part of path.split('.')) { + obj = obj[part]; + if (!obj) return null; + } + return obj; + } +})(); diff --git a/tests/compile/main.js b/tests/compile/main.js index 9e4aad1d7..c34f1bf1c 100644 --- a/tests/compile/main.js +++ b/tests/compile/main.js @@ -12,10 +12,13 @@ goog.module('Main'); // TODO: I think we need to make sure these get exported? // const {BlocklyOptions} = goog.requireType('Blockly.BlocklyOptions'); const {inject} = goog.require('Blockly.inject'); +const {getMainWorkspace} = goog.require('Blockly.common'); +const {Msg} = goog.require('Blockly.Msg'); /** @suppress {extraRequire} */ goog.require('Blockly.geras.Renderer'); /** @suppress {extraRequire} */ goog.require('Blockly.VerticalFlyout'); + // Blocks /** @suppress {extraRequire} */ goog.require('Blockly.libraryBlocks.logic'); @@ -30,8 +33,25 @@ goog.require('testBlocks'); function init() { + Object.assign(Msg, window['Blockly']['Msg']); inject('blocklyDiv', /** @type {BlocklyOptions} */ ({ 'toolbox': document.getElementById('toolbox') })); -}; +} window.addEventListener('load', init); + + +// Called externally from our test driver to see if Blockly loaded more or less +// correctly. This is not a comprehensive test, but it will catch catastrophic +// fails (by far the most common cases). +window['healthCheck'] = function() { + // Just check that we have a reasonable number of blocks in the flyout. + // Expecting 8 blocks, but leave a wide margin. + try { + const blockCount = + getMainWorkspace().getFlyout().getWorkspace().getTopBlocks().length; + return (blockCount > 5 && blockCount < 100); + } catch (_e) { + return false; + } +}; diff --git a/tests/compile/webdriver.js b/tests/compile/webdriver.js new file mode 100644 index 000000000..50084c73b --- /dev/null +++ b/tests/compile/webdriver.js @@ -0,0 +1,82 @@ +/** + * @license + * Copyright 2022 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * @fileoverview Node.js script to check the health of the compile test in + * Chrome, via webdriver. + */ +const webdriverio = require('webdriverio'); + + +/** + * Run the generator for a given language and save the results to a file. + * @param {Thenable} browser A Thenable managing the processing of the browser + * tests. + */ +async function runHealthCheckInBrowser(browser) { + const result = await browser.execute(() => { + return healthCheck(); + }) + if (!result) throw Error('Health check failed in advanced compilation test.'); + console.log('Health check completed successfully.'); +} + +/** + * Runs the generator tests in Chrome. It uses webdriverio to + * launch Chrome and load index.html. Outputs a summary of the test results + * to the console and outputs files for later validation. + * @return the Thenable managing the processing of the browser tests. + */ +async function runCompileCheckInBrowser() { + const options = { + capabilities: { + browserName: 'chrome', + }, + logLevel: 'warn', + services: ['selenium-standalone'] + }; + // Run in headless mode on Github Actions. + if (process.env.CI) { + options.capabilities['goog:chromeOptions'] = { + args: ['--headless', '--no-sandbox', '--disable-dev-shm-usage'] + }; + } else { + // --disable-gpu is needed to prevent Chrome from hanging on Linux with + // NVIDIA drivers older than v295.20. See + // https://github.com/google/blockly/issues/5345 for details. + options.capabilities['goog:chromeOptions'] = { + args: ['--disable-gpu'] + }; + } + + const url = 'file://' + __dirname + '/index.html'; + + console.log('Starting webdriverio...'); + const browser = await webdriverio.remote(options); + console.log('Loading url: ' + url); + await browser.url(url); + + await runHealthCheckInBrowser(browser); + + await browser.deleteSession(); +} + +if (require.main === module) { + runCompileCheckInBrowser().catch(e => { + console.error(e); + process.exit(1); + }).then(function(result) { + if (result) { + console.log('Compile test failed'); + process.exit(1); + } else { + console.log('Compile test passed'); + process.exit(0); + } + }); +} + +module.exports = {runCompileCheckInBrowser}; diff --git a/tests/generators/index.html b/tests/generators/index.html index 3b1088677..c93e966d9 100644 --- a/tests/generators/index.html +++ b/tests/generators/index.html @@ -19,7 +19,6 @@ - @@ -50,9 +50,6 @@ // Test modules. 'Blockly.test.astNode', - 'Blockly.test.blockChangeEvent', - 'Blockly.test.blockDeleteEvent', - 'Blockly.test.blockCreateEvent', 'Blockly.test.blockJson', 'Blockly.test.blocks', 'Blockly.test.comments', @@ -64,6 +61,34 @@ 'Blockly.test.cursor', 'Blockly.test.dropdown', 'Blockly.test.event', + 'Blockly.test.eventBlockChange', + 'Blockly.test.eventBlockCreate', + 'Blockly.test.eventBlockDelete', + 'Blockly.test.eventBlockDrag', + 'Blockly.test.eventBlockMove', + 'Blockly.test.eventBubbleOpen', + 'Blockly.test.eventClick', + 'Blockly.test.eventCommentChange', + 'Blockly.test.eventCommentCreate', + 'Blockly.test.eventCommentDelete', + 'Blockly.test.eventCommentMove', + 'Blockly.test.eventMarkerMove', + 'Blockly.test.eventProcedureCreate', + 'Blockly.test.eventProcedureDelete', + 'Blockly.test.eventProcedureRename', + 'Blockly.test.eventProcedureEnable', + 'Blockly.test.eventProcedureChangeReturn', + 'Blockly.test.eventProcedureParameterCreate', + 'Blockly.test.eventProcedureParameterDelete', + 'Blockly.test.eventProcedureParameterRename', + 'Blockly.test.eventSelected', + 'Blockly.test.eventThemeChange', + 'Blockly.test.eventToolboxItemSelect', + 'Blockly.test.eventTrashcanOpen', + 'Blockly.test.eventVarCreate', + 'Blockly.test.eventVarDelete', + 'Blockly.test.eventVarRename', + 'Blockly.test.eventViewportChange', 'Blockly.test.extensions', 'Blockly.test.fieldAngle', 'Blockly.test.fieldCheckbox', diff --git a/tests/mocha/insertion_marker_manager_test.js b/tests/mocha/insertion_marker_manager_test.js index 211bf3518..009f88da1 100644 --- a/tests/mocha/insertion_marker_manager_test.js +++ b/tests/mocha/insertion_marker_manager_test.js @@ -205,7 +205,7 @@ suite('Insertion marker manager', function() { id: 'fakeDragTarget', }; this.manager.update(this.dxy, fakeDragTarget); - chai.assert.isTrue(this.manager.wouldDeleteBlock()); + chai.assert.isTrue(this.manager.wouldDeleteBlock); }); test('Over delete area and rejected would not delete', function() { @@ -218,7 +218,7 @@ suite('Insertion marker manager', function() { id: 'fakeDragTarget', }; this.manager.update(this.dxy, fakeDragTarget); - chai.assert.isFalse(this.manager.wouldDeleteBlock()); + chai.assert.isFalse(this.manager.wouldDeleteBlock); }); test('Drag target is not a delete area would not delete', function() { @@ -231,12 +231,12 @@ suite('Insertion marker manager', function() { id: 'fakeDragTarget', }; this.manager.update(this.dxy, fakeDragTarget); - chai.assert.isFalse(this.manager.wouldDeleteBlock()); + chai.assert.isFalse(this.manager.wouldDeleteBlock); }); test('Not over drag target would not delete', function() { this.manager.update(this.dxy, null); - chai.assert.isFalse(this.manager.wouldDeleteBlock()); + chai.assert.isFalse(this.manager.wouldDeleteBlock); }); }); diff --git a/tests/mocha/mutator_test.js b/tests/mocha/mutator_test.js index ea8ef4489..003a8d0c5 100644 --- a/tests/mocha/mutator_test.js +++ b/tests/mocha/mutator_test.js @@ -67,4 +67,3 @@ suite('Mutator', function() { }); }); }); - diff --git a/tests/mocha/procedure_map_test.js b/tests/mocha/procedure_map_test.js index 38e5dd43b..80e3a37f1 100644 --- a/tests/mocha/procedure_map_test.js +++ b/tests/mocha/procedure_map_test.js @@ -5,7 +5,7 @@ */ import {sharedTestSetup, sharedTestTeardown} from './test_helpers/setup_teardown.js'; -import {assertEventFired, assertEventNotFired, createChangeListenerSpy} from './test_helpers/events.js'; +import {assertEventFiredShallow, assertEventNotFired, createChangeListenerSpy} from './test_helpers/events.js'; goog.declareModuleId('Blockly.test.procedureMap'); @@ -201,7 +201,7 @@ suite('Procedure Map', function() { }); }); - suite.skip('event firing', function() { + suite('event firing', function() { setup(function() { this.eventSpy = createChangeListenerSpy(this.workspace); }); @@ -210,485 +210,539 @@ suite('Procedure Map', function() { this.workspace.removeChangeListener(this.eventSpy); }); - test('create events are fired when a procedure is inserted', function() { - const procedureModel = - new Blockly.procedures.ObservableProcedureModel(this.workspace); - this.procedureMap.set(procedureModel.getId(), procedureModel); - - assertEventFired( - this.eventSpy, - Blockly.Events.ProcedureCreate, - {model: procedureModel}, - this.workspace.id); + suite('procedure create', function() { + test('create events are fired when a procedure is inserted', function() { + const procedureModel = + new Blockly.procedures.ObservableProcedureModel(this.workspace); + this.procedureMap.set(procedureModel.getId(), procedureModel); + + assertEventFiredShallow( + this.eventSpy, + Blockly.Events.ProcedureCreate, + {model: procedureModel}, + this.workspace.id); + }); + + test( + 'create events are not fired if a procedure is already inserted', + function() { + const procedureModel = + new Blockly.procedures.ObservableProcedureModel(this.workspace); + this.procedureMap.set(procedureModel.getId(), procedureModel); + + this.eventSpy.resetHistory(); + this.procedureMap.set(procedureModel.getId(), procedureModel); + + assertEventNotFired( + this.eventSpy, + Blockly.Events.ProcedureCreate, + {}, + this.workspace.id); + }); + + test('create events are fired when a procedure is added', function() { + const procedureModel = + new Blockly.procedures.ObservableProcedureModel(this.workspace); + this.procedureMap.add(procedureModel); + + assertEventFiredShallow( + this.eventSpy, + Blockly.Events.ProcedureCreate, + {model: procedureModel}, + this.workspace.id); + }); + + test( + 'create events are not fired if a procedure is already added', + function() { + const procedureModel = + new Blockly.procedures.ObservableProcedureModel(this.workspace); + this.procedureMap.add(procedureModel); + + this.eventSpy.resetHistory(); + this.procedureMap.add(procedureModel); + + assertEventNotFired( + this.eventSpy, + Blockly.Events.ProcedureCreate, + {}, + this.workspace.id); + }); }); - test( - 'create events are not fired if a procedure is already inserted', - function() { - const procedureModel = - new Blockly.procedures.ObservableProcedureModel(this.workspace); - this.procedureMap.set(procedureModel.getId(), procedureModel); - - this.eventSpy.resetHistory(); - this.procedureMap.set(procedureModel.getId(), procedureModel); - - assertEventNotFired( - this.eventSpy, - Blockly.Events.ProcedureCreate, - {}, - this.workspace.id); - }); - - test('create events are fired when a procedure is added', function() { - const procedureModel = - new Blockly.procedures.ObservableProcedureModel(this.workspace); - this.procedureMap.add(procedureModel); - - assertEventFired( - this.eventSpy, - Blockly.Events.ProcedureCreate, - {model: procedureModel}, - this.workspace.id); - }); - - test( - 'create events are not fired if a procedure is already added', - function() { - const procedureModel = - new Blockly.procedures.ObservableProcedureModel(this.workspace); - this.procedureMap.add(procedureModel); - - this.eventSpy.resetHistory(); - this.procedureMap.add(procedureModel); - - assertEventNotFired( - this.eventSpy, - Blockly.Events.ProcedureCreate, - {}, - this.workspace.id); - }); - - test('delete events are fired when a procedure is deleted', function() { - const procedureModel = - new Blockly.procedures.ObservableProcedureModel(this.workspace); - this.procedureMap.add(procedureModel); - this.procedureMap.delete(procedureModel.getId()); - - assertEventFired( - this.eventSpy, - Blockly.Events.ProcedureDelete, - {model: procedureModel}, - this.workspace.id); - }); - - test( - 'delete events are not fired if a procedure does not exist', - function() { - const procedureModel = - new Blockly.procedures.ObservableProcedureModel(this.workspace); - this.procedureMap.delete(procedureModel.getId()); - - assertEventNotFired( - this.eventSpy, - Blockly.Events.ProcedureDelete, - {}, - this.workspace.id); - }); - - test( - 'delete events are fired when the procedure map is cleared', - function() { + suite('procedure delete', function() { + test('delete events are fired when a procedure is deleted', function() { + const procedureModel = + new Blockly.procedures.ObservableProcedureModel(this.workspace); + this.procedureMap.add(procedureModel); + this.procedureMap.delete(procedureModel.getId()); + + assertEventFiredShallow( + this.eventSpy, + Blockly.Events.ProcedureDelete, + {model: procedureModel}, + this.workspace.id); + }); + + test( + 'delete events are not fired if a procedure does not exist', + function() { + const procedureModel = + new Blockly.procedures.ObservableProcedureModel(this.workspace); + this.procedureMap.delete(procedureModel.getId()); + + assertEventNotFired( + this.eventSpy, + Blockly.Events.ProcedureDelete, + {}, + this.workspace.id); + }); + + test( + 'delete events are fired when the procedure map is cleared', + function() { const procedureModel1 = - new Blockly.procedures.ObservableProcedureModel(this.workspace); - const procedureModel2 = - new Blockly.procedures.ObservableProcedureModel(this.workspace); - const procedureModel3 = - new Blockly.procedures.ObservableProcedureModel(this.workspace); - this.procedureMap.add(procedureModel1); - this.procedureMap.add(procedureModel2); - this.procedureMap.add(procedureModel3); - this.procedureMap.clear(); - - assertEventFired( - this.eventSpy, - Blockly.Events.ProcedureDelete, - {model: procedureModel1}, - this.workspace.id); - assertEventFired( - this.eventSpy, - Blockly.Events.ProcedureDelete, - {model: procedureModel2}, - this.workspace.id); - assertEventFired( - this.eventSpy, - Blockly.Events.ProcedureDelete, - {model: procedureModel3}, - this.workspace.id); - }); - - test('rename events are fired when a procedure is renamed', function() { - const procedureModel = - new Blockly.procedures.ObservableProcedureModel(this.workspace) - .setName('test name'); - this.procedureMap.add(procedureModel); - procedureModel.setName('new name'); - - assertEventFired( - this.eventSpy, - Blockly.Events.ProcedureRename, - { - model: procedureModel, - oldName: 'test name', - }, - this.workspace.id); + new Blockly.procedures.ObservableProcedureModel(this.workspace); + const procedureModel2 = + new Blockly.procedures.ObservableProcedureModel(this.workspace); + const procedureModel3 = + new Blockly.procedures.ObservableProcedureModel(this.workspace); + this.procedureMap.add(procedureModel1); + this.procedureMap.add(procedureModel2); + this.procedureMap.add(procedureModel3); + this.procedureMap.clear(); + + assertEventFiredShallow( + this.eventSpy, + Blockly.Events.ProcedureDelete, + {model: procedureModel1}, + this.workspace.id); + assertEventFiredShallow( + this.eventSpy, + Blockly.Events.ProcedureDelete, + {model: procedureModel2}, + this.workspace.id); + assertEventFiredShallow( + this.eventSpy, + Blockly.Events.ProcedureDelete, + {model: procedureModel3}, + this.workspace.id); + }); }); - test('rename events are not fired if the rename is noop', function() { - const procedureModel = - new Blockly.procedures.ObservableProcedureModel(this.workspace) - .setName('test name'); - this.procedureMap.add(procedureModel); - procedureModel.setName('test name'); - - assertEventNotFired( - this.eventSpy, - Blockly.Events.ProcedureRename, - {}, - this.workspace.id); + suite('procedure rename', function() { + test('rename events are fired when a procedure is renamed', function() { + const procedureModel = + new Blockly.procedures.ObservableProcedureModel(this.workspace) + .setName('test name'); + this.procedureMap.add(procedureModel); + procedureModel.setName('new name'); + + assertEventFiredShallow( + this.eventSpy, + Blockly.Events.ProcedureRename, + { + model: procedureModel, + oldName: 'test name', + }, + this.workspace.id); + }); + + test('rename events are not fired if the rename is noop', function() { + const procedureModel = + new Blockly.procedures.ObservableProcedureModel(this.workspace) + .setName('test name'); + this.procedureMap.add(procedureModel); + procedureModel.setName('test name'); + + assertEventNotFired( + this.eventSpy, + Blockly.Events.ProcedureRename, + {}, + this.workspace.id); + }); + + test( + 'rename events are not fired if the procedure is not in the map', + function() { + const procedureModel = + new Blockly.procedures.ObservableProcedureModel(this.workspace) + .setName('test name'); + procedureModel.setName('new name'); + + assertEventNotFired( + this.eventSpy, + Blockly.Events.ProcedureRename, + {}, + this.workspace.id); + }); }); - test( - 'rename events are not fired if the procedure is not in the map', - function() { - const procedureModel = - new Blockly.procedures.ObservableProcedureModel(this.workspace) - .setName('test name'); - procedureModel.setName('new name'); - - assertEventNotFired( - this.eventSpy, - Blockly.Events.ProcedureRename, - {}, - this.workspace.id); - }); - - test('enable events are fired when a procedure is enabled', function() { - const procedureModel = - new Blockly.procedures.ObservableProcedureModel(this.workspace) - .setEnabled(false); - this.procedureMap.add(procedureModel); - procedureModel.setEnabled(true); - - assertEventFired( - this.eventSpy, - Blockly.Events.ProcedureEnable, - {model: procedureModel}, - this.workspace.id); + suite('procedure enable', function() { + test('enable events are fired when a procedure is enabled', function() { + const procedureModel = + new Blockly.procedures.ObservableProcedureModel(this.workspace) + .setEnabled(false); + this.procedureMap.add(procedureModel); + procedureModel.setEnabled(true); + + assertEventFiredShallow( + this.eventSpy, + Blockly.Events.ProcedureEnable, + {model: procedureModel}, + this.workspace.id); + }); + + test('enable events are fired when a procedure is disabled', function() { + const procedureModel = + new Blockly.procedures.ObservableProcedureModel(this.workspace); + this.procedureMap.add(procedureModel); + procedureModel.setEnabled(false); + + assertEventFiredShallow( + this.eventSpy, + Blockly.Events.ProcedureEnable, + {model: procedureModel}, + this.workspace.id); + }); + + test('enable events are not fired if enabling is noop', function() { + const procedureModel = + new Blockly.procedures.ObservableProcedureModel(this.workspace); + this.procedureMap.add(procedureModel); + procedureModel.setEnabled(true); + + assertEventNotFired( + this.eventSpy, + Blockly.Events.ProcedureEnable, + {}, + this.workspace.id); + }); + + test('enable events are not fired if disabling is noop', function() { + const procedureModel = + new Blockly.procedures.ObservableProcedureModel(this.workspace) + .setEnabled(false); + this.procedureMap.add(procedureModel); + procedureModel.setEnabled(false); + + assertEventNotFired( + this.eventSpy, + Blockly.Events.ProcedureEnable, + {}, + this.workspace.id); + }); + + test( + 'enable events are not fired if the procedure is not in the map', + function() { + const procedureModel = + new Blockly.procedures.ObservableProcedureModel(this.workspace) + .setEnabled(false); + procedureModel.setEnabled(true); + + assertEventNotFired( + this.eventSpy, + Blockly.Events.ProcedureEnable, + {}, + this.workspace.id); + }); }); - test('enable events are fired when a procedure is disabled', function() { - const procedureModel = - new Blockly.procedures.ObservableProcedureModel(this.workspace); - this.procedureMap.add(procedureModel); - procedureModel.setEnabled(false); - - assertEventFired( - this.eventSpy, - Blockly.Events.ProcedureEnable, - {model: procedureModel}, - this.workspace.id); + suite('parameter create', function() { + test( + 'parameter create events are fired when a parameter is inserted', + function() { + const procedureModel = + new Blockly.procedures.ObservableProcedureModel(this.workspace); + this.procedureMap.add(procedureModel); + const parameterModel = + new Blockly.procedures.ObservableParameterModel( + this.workspace, 'test name'); + procedureModel.insertParameter(parameterModel, 0); + + assertEventFiredShallow( + this.eventSpy, + Blockly.Events.ProcedureParameterCreate, + { + model: procedureModel, + parameter: parameterModel, + index: 0, + }, + this.workspace.id); + }); + + test( + 'parameter create events are not fired if the parameter is ' + + 'already inserted', + function() { + const procedureModel = + new Blockly.procedures.ObservableProcedureModel(this.workspace); + this.procedureMap.add(procedureModel); + const parameterModel = + new Blockly.procedures.ObservableParameterModel( + this.workspace, 'test name'); + procedureModel.insertParameter(parameterModel, 0); + + this.eventSpy.resetHistory(); + procedureModel.insertParameter(parameterModel, 0); + + assertEventNotFired( + this.eventSpy, + Blockly.Events.ProcedureParameterCreate, + {}, + this.workspace.id); + }); + + test( + 'parameter create events are not fired if the procedure is ' + + 'not in the map', + function() { + const procedureModel = + new Blockly.procedures.ObservableProcedureModel(this.workspace); + procedureModel.insertParameter( + new Blockly.procedures.ObservableParameterModel( + this.workspace, 'test name'), + 0); + + assertEventNotFired( + this.eventSpy, + Blockly.Events.ProcedureParameterCreate, + {}, + this.workspace.id); + }); }); - test('enable events are not fired if enabling is noop', function() { - const procedureModel = - new Blockly.procedures.ObservableProcedureModel(this.workspace); - this.procedureMap.add(procedureModel); - procedureModel.setEnabled(true); - - assertEventNotFired( - this.eventSpy, - Blockly.Events.ProcedureEnable, - {}, - this.workspace.id); + suite('parameter delete', function() { + test( + 'parameter delete events are fired when a parameter is deleted', + function() { + const procedureModel = + new Blockly.procedures.ObservableProcedureModel(this.workspace); + this.procedureMap.add(procedureModel); + const parameterModel = + new Blockly.procedures.ObservableParameterModel( + this.workspace, 'test name'); + procedureModel.insertParameter(parameterModel, 0); + procedureModel.deleteParameter(0); + + assertEventFiredShallow( + this.eventSpy, + Blockly.Events.ProcedureParameterDelete, + { + model: procedureModel, + parameter: parameterModel, + index: 0, + }, + this.workspace.id); + }); + + test( + 'parameter delete events are not fired if the parameter does not exist', + function() { + const procedureModel = + new Blockly.procedures.ObservableProcedureModel(this.workspace); + this.procedureMap.add(procedureModel); + procedureModel.deleteParameter(0); + + assertEventNotFired( + this.eventSpy, + Blockly.Events.ProcedureParameterDelete, + {}, + this.workspace.id); + }); + + test( + 'parameter delete events are not fired if the procedure is ' + + 'not in the map', + function() { + const procedureModel = + new Blockly.procedures.ObservableProcedureModel(this.workspace) + .insertParameter( + new Blockly.procedures.ObservableParameterModel( + this.workspace, 'test name'), + 0); + procedureModel.deleteParameter(0); + + assertEventNotFired( + this.eventSpy, + Blockly.Events.ProcedureParameterDelete, + {}, + this.workspace.id); + }); }); - test('enable events are not fired if disabling is noop', function() { - const procedureModel = - new Blockly.procedures.ObservableProcedureModel(this.workspace) - .setEnabled(false); - this.procedureMap.add(procedureModel); - procedureModel.setEnabled(false); - - assertEventNotFired( - this.eventSpy, - Blockly.Events.ProcedureEnable, - {}, - this.workspace.id); + suite('parameter rename', function() { + test( + 'parameter rename events are fired when a parameter is renamed', + function() { + const procedureModel = + new Blockly.procedures.ObservableProcedureModel(this.workspace); + this.procedureMap.add(procedureModel); + const parameterModel = + new Blockly.procedures.ObservableParameterModel( + this.workspace, 'test name'); + procedureModel.insertParameter(parameterModel, 0); + + parameterModel.setName('new name'); + + assertEventFiredShallow( + this.eventSpy, + Blockly.Events.ProcedureParameterRename, + { + model: procedureModel, + parameter: parameterModel, + oldName: 'test name', + }, + this.workspace.id); + }); + + test( + 'parameter rename events are not fired if the rename is noop', + function() { + const procedureModel = + new Blockly.procedures.ObservableProcedureModel(this.workspace); + this.procedureMap.add(procedureModel); + const parameterModel = + new Blockly.procedures.ObservableParameterModel( + this.workspace, 'test name'); + procedureModel.insertParameter(parameterModel, 0); + + parameterModel.setName('test name'); + + assertEventNotFired( + this.eventSpy, + Blockly.Events.ProcedureParameterRename, + {}, + this.workspace.id); + }); + + test( + 'parameter rename events are not fired if the procedure is ' + + 'not in the map', + function() { + const parameterModel = + new Blockly.procedures.ObservableParameterModel( + this.workspace, 'test name'); + new Blockly.procedures.ObservableProcedureModel(this.workspace) + .insertParameter(parameterModel, 0); + + parameterModel.setName('new name'); + + assertEventNotFired( + this.eventSpy, + Blockly.Events.ProcedureParameterRename, + {}, + this.workspace.id); + }); + + test( + 'parameter rename events are not fired if the parameter is ' + + 'not in a procedure', + function() { + const parameterModel = + new Blockly.procedures.ObservableParameterModel( + this.workspace, 'test name'); + + parameterModel.setName('new name'); + + assertEventNotFired( + this.eventSpy, + Blockly.Events.ProcedureParameterRename, + {}, + this.workspace.id); + }); }); - test( - 'enable events are not fired if the procedure is not in the map', - function() { - const procedureModel = - new Blockly.procedures.ObservableProcedureModel(this.workspace) - .setEnabled(false); - procedureModel.setEnabled(true); - - assertEventNotFired( - this.eventSpy, - Blockly.Events.ProcedureEnable, - {}, - this.workspace.id); - }); - - test( - 'parameter create events are fired when a parameter is inserted', - function() { - const procedureModel = - new Blockly.procedures.ObservableProcedureModel(this.workspace); - this.procedureMap.add(procedureModel); - const parameterModel = - new Blockly.procedures.ObservableParameterModel( - this.workspace, 'test name'); - procedureModel.insertParameter(0, parameterModel); - - assertEventFired( - this.eventSpy, - Blockly.Events.ProcedureParameterCreate, - { - model: procedureModel, - parameter: parameterModel, - index: 0, - }, - this.workspace.id); - }); - - test( - 'parameter create events are not fired if the procedure is ' + - 'not in the map', - function() { - const procedureModel = - new Blockly.procedures.ObservableProcedureModel(this.workspace); - procedureModel.insertParameter( - 0, - new Blockly.procedures.ObservableParameterModel( - this.workspace, 'test name')); - - assertEventNotFired( - this.eventSpy, - Blockly.Events.ProcedureParameterCreate, - {}, - this.workspace.id); - }); - - test( - 'parameter delete events are fired when a parameter is deleted', - function() { - const procedureModel = - new Blockly.procedures.ObservableProcedureModel(this.workspace); - this.procedureMap.add(procedureModel); - const parameterModel = - new Blockly.procedures.ObservableParameterModel( - this.workspace, 'test name'); - procedureModel.insertParameter(0, parameterModel); - procedureModel.deleteParameter(0); - - assertEventFired( - this.eventSpy, - Blockly.Events.ProcedureParameterDelete, - { - model: procedureModel, - parameter: parameterModel, - index: 0, - }, - this.workspace.id); - }); - - test( - 'parameter delete events are not fired if the procedure is ' + - 'not in the map', - function() { - const procedureModel = - new Blockly.procedures.ObservableProcedureModel(this.workspace) - .insertParameter( - 0, - new Blockly.procedures.ObservableParameterModel( - this.workspace, 'test name')); - procedureModel.deleteParameter(0); - - assertEventNotFired( - this.eventSpy, - Blockly.Events.ProcedureParameterDelete, - {}, - this.workspace.id); - }); - - test( - 'parameter rename events are fired when a parameter is renamed', - function() { - const procedureModel = - new Blockly.procedures.ObservableProcedureModel(this.workspace); - this.procedureMap.add(procedureModel); - const parameterModel = - new Blockly.procedures.ObservableParameterModel( - this.workspace, 'test name'); - procedureModel.insertParameter(0, parameterModel); - - parameterModel.setName('new name'); - - assertEventFired( - this.eventSpy, - Blockly.Events.ProcedureParameterRename, - { - model: procedureModel, - parameter: parameterModel, - oldName: 'test name', - }, - this.workspace.id); - }); - - test( - 'parameter rename events are not fired if the rename is noop', - function() { - const procedureModel = - new Blockly.procedures.ObservableProcedureModel(this.workspace); - this.procedureMap.add(procedureModel); - const parameterModel = - new Blockly.procedures.ObservableParameterModel( - this.workspace, 'test name'); - procedureModel.insertParameter(0, parameterModel); - - parameterModel.setName('test name'); - - assertEventNotFired( - this.eventSpy, - Blockly.Events.ProcedureParameterRename, - {}, - this.workspace.id); - }); - - test( - 'parameter rename events are not fired if the procedure is ' + - 'not in the map', - function() { - const parameterModel = - new Blockly.procedures.ObservableParameterModel( - this.workspace, 'test name'); - new Blockly.procedures.ObservableProcedureModel(this.workspace) - .insertParameter(0, parameterModel); - - parameterModel.setName('new name'); - - assertEventNotFired( - this.eventSpy, - Blockly.Events.ProcedureParameterRename, - {}, - this.workspace.id); - }); - - test( - 'parameter rename events are not fired if the parameter is ' + - 'not in a procedure', - function() { - const parameterModel = - new Blockly.procedures.ObservableParameterModel( - this.workspace, 'test name'); - - parameterModel.setName('new name'); - - assertEventNotFired( - this.eventSpy, - Blockly.Events.ProcedureParameterRename, - {}, - this.workspace.id); - }); - - test( - 'return type change events are fired when the return is added', - function() { - const procedureModel = - new Blockly.procedures.ObservableProcedureModel(this.workspace) - .setReturnTypes(null); - this.procedureMap.add(procedureModel); - procedureModel.setReturnTypes([]); - - assertEventFired( - this.eventSpy, - Blockly.Events.ProcedureChangeReturn, - { - model: procedureModel, - oldTypes: null, - }, - this.workspace.id); - }); - - test( - 'return type change events are fired when the return is removed', - function() { - const procedureModel = - new Blockly.procedures.ObservableProcedureModel(this.workspace) - .setReturnTypes([]); - this.procedureMap.add(procedureModel); - procedureModel.setReturnTypes(null); - - assertEventFired( - this.eventSpy, - Blockly.Events.ProcedureChangeReturn, - { - model: procedureModel, - oldTypes: [], - }, - this.workspace.id); - }); - - test( - 'return type change events are not fired if adding is noop', - function() { - const procedureModel = - new Blockly.procedures.ObservableProcedureModel(this.workspace) - .setReturnTypes([]); - this.procedureMap.add(procedureModel); - procedureModel.setReturnTypes([]); - - assertEventNotFired( - this.eventSpy, - Blockly.Events.ProcedureChangeReturn, - {}, - this.workspace.id); - }); - - test( - 'return type change events are not fired if removing is noop', - function() { - const procedureModel = - new Blockly.procedures.ObservableProcedureModel(this.workspace) - .setReturnTypes(null); - this.procedureMap.add(procedureModel); - procedureModel.setReturnTypes(null); - - assertEventNotFired( - this.eventSpy, - Blockly.Events.ProcedureChangeReturn, - {}, - this.workspace.id); - }); - - test( - 'return type change events are not fired if the procedure is ' + - 'not in the map', - function() { - const procedureModel = - new Blockly.procedures.ObservableProcedureModel(this.workspace) - .setReturnTypes(null); - - procedureModel.setReturnTypes([]); - - assertEventNotFired( - this.eventSpy, - Blockly.Events.ProcedureChangeReturn, - {}, - this.workspace.id); - }); + suite('procedure change return', function() { + test( + 'return type change events are fired when the return is added', + function() { + const procedureModel = + new Blockly.procedures.ObservableProcedureModel(this.workspace) + .setReturnTypes(null); + this.procedureMap.add(procedureModel); + procedureModel.setReturnTypes([]); + + assertEventFiredShallow( + this.eventSpy, + Blockly.Events.ProcedureChangeReturn, + { + model: procedureModel, + oldTypes: null, + }, + this.workspace.id); + }); + + test( + 'return type change events are fired when the return is removed', + function() { + const types = []; + const procedureModel = + new Blockly.procedures.ObservableProcedureModel(this.workspace) + .setReturnTypes(types); + this.procedureMap.add(procedureModel); + procedureModel.setReturnTypes(null); + + assertEventFiredShallow( + this.eventSpy, + Blockly.Events.ProcedureChangeReturn, + { + model: procedureModel, + oldTypes: types, + }, + this.workspace.id); + }); + + test( + 'return type change events are not fired if adding is noop', + function() { + const procedureModel = + new Blockly.procedures.ObservableProcedureModel(this.workspace) + .setReturnTypes([]); + this.procedureMap.add(procedureModel); + procedureModel.setReturnTypes([]); + + assertEventNotFired( + this.eventSpy, + Blockly.Events.ProcedureChangeReturn, + {}, + this.workspace.id); + }); + + test( + 'return type change events are not fired if removing is noop', + function() { + const procedureModel = + new Blockly.procedures.ObservableProcedureModel(this.workspace) + .setReturnTypes(null); + this.procedureMap.add(procedureModel); + procedureModel.setReturnTypes(null); + + assertEventNotFired( + this.eventSpy, + Blockly.Events.ProcedureChangeReturn, + {}, + this.workspace.id); + }); + + test( + 'return type change events are not fired if the procedure is ' + + 'not in the map', + function() { + const procedureModel = + new Blockly.procedures.ObservableProcedureModel(this.workspace) + .setReturnTypes(null); + + procedureModel.setReturnTypes([]); + + assertEventNotFired( + this.eventSpy, + Blockly.Events.ProcedureChangeReturn, + {}, + this.workspace.id); + }); + }); }); suite('backing variable to parameters', function() { diff --git a/tests/mocha/test_helpers/events.js b/tests/mocha/test_helpers/events.js index ba1b3f4f8..c5fb38028 100644 --- a/tests/mocha/test_helpers/events.js +++ b/tests/mocha/test_helpers/events.js @@ -13,8 +13,22 @@ goog.declareModuleId('Blockly.test.helpers.events'); * calls on. * @return {!SinonSpy} The created spy. */ -export function createFireChangeListenerSpy(workspace) { - return sinon.spy(workspace, 'fireChangeListener'); +export function createChangeListenerSpy(workspace) { + const spy = sinon.spy(); + workspace.addChangeListener(spy); + return spy; +} + +/** + * Creates a mock event for testing if arbitrary events get fired/received. + * @param {!Blockly.Workspace} workspace The workspace to create the mock in. + * @return {!Object} A mock event that can be fired via Blockly.Events.fire + */ +export function createMockEvent(workspace) { + return { + isNull: () => false, + workspaceId: workspace.id, + }; } /** @@ -128,6 +142,49 @@ export function assertEventFired(spy, instanceType, expectedProperties, sinon.assert.calledWith(spy, expectedEvent); } +/** + * Returns a matcher that asserts that the actual object has the same properties + * and values (shallowly equated) as the expected object. + * @param {!Object} expected The expected set of properties we expect the + * actual object to have. + * @return {function(*): boolean} A matcher that returns true if the `actual` + * object has all of the properties of the `expected` param, with the same + * values. + */ +function shallowMatch(expected) { + return (actual) => { + for (const key in expected) { + if (actual[key] !== expected[key]) { + return false; + } + } + return true; + }; +} + +/** + * Asserts that an event with the given values (shallowly evaluated) was fired. + * @param {!SinonSpy|!SinonSpyCall} spy The spy or spy call to use. + * @param {function(new:Blockly.Events.Abstract)} instanceType Expected instance + * type of event fired. + * @param {!Object} expectedProperties Map of of expected properties + * to check on fired event. + * @param {string} expectedWorkspaceId Expected workspace id of event fired. + * @param {?string=} expectedBlockId Expected block id of event fired. + */ +export function assertEventFiredShallow( + spy, instanceType, expectedProperties, expectedWorkspaceId, expectedBlockId) { + const properties = { + ...expectedProperties, + workspaceId: expectedWorkspaceId, + blockId: expectedBlockId, + }; + sinon.assert.calledWith( + spy, + sinon.match.instanceOf(instanceType) + .and(shallowMatch(properties))); +} + /** * Asserts that an event with the given values was not fired. * @param {!SpyCall} spy The spy to use. @@ -140,7 +197,6 @@ export function assertEventFired(spy, instanceType, expectedProperties, */ export function assertEventNotFired(spy, instanceType, expectedProperties, expectedWorkspaceId, expectedBlockId) { - expectedProperties.type = instanceType.prototype.type; if (expectedWorkspaceId !== undefined) { expectedProperties.workspaceId = expectedWorkspaceId; } diff --git a/tests/mocha/test_helpers/setup_teardown.js b/tests/mocha/test_helpers/setup_teardown.js index 669c6564b..f77d9d4d7 100644 --- a/tests/mocha/test_helpers/setup_teardown.js +++ b/tests/mocha/test_helpers/setup_teardown.js @@ -105,6 +105,8 @@ function wrapDefineBlocksWithJsonArrayWithCleanup_(sharedCleanupObj) { * * @param {Object} options Options to enable/disable setup * of certain stubs. + * @return {{clock: *}} The fake clock (as part of an object to make refactoring + * easier). */ export function sharedTestSetup(options = {}) { this.sharedSetupCalled_ = true; @@ -122,6 +124,9 @@ export function sharedTestSetup(options = {}) { this.blockTypesCleanup_ = this.sharedCleanup.blockTypesCleanup_; this.messagesCleanup_ = this.sharedCleanup.messagesCleanup_; wrapDefineBlocksWithJsonArrayWithCleanup_(this.sharedCleanup); + return { + clock: this.clock, + }; } /** diff --git a/tests/mocha/toolbox_test.js b/tests/mocha/toolbox_test.js index 45dfe0b85..067ff4275 100644 --- a/tests/mocha/toolbox_test.js +++ b/tests/mocha/toolbox_test.js @@ -163,7 +163,7 @@ suite('Toolbox', function() { test('Toolbox clicked -> Should close flyout', function() { const hideChaffStub = sinon.stub( Blockly.WorkspaceSvg.prototype, "hideChaff"); - const evt = new MouseEvent('click', {}); + const evt = new PointerEvent('pointerdown', {}); this.toolbox.HtmlDiv.dispatchEvent(evt); sinon.assert.calledOnce(hideChaffStub); }); diff --git a/tests/mocha/tooltip_test.js b/tests/mocha/tooltip_test.js index 3d3755aa0..c5f851d7b 100644 --- a/tests/mocha/tooltip_test.js +++ b/tests/mocha/tooltip_test.js @@ -55,13 +55,9 @@ suite('Tooltip', function() { this.block.setTooltip('Test Tooltip'); // Fire pointer events directly on the relevant SVG. - // Note the 'pointerover', due to the events registered through - // Blockly.browserEvents.bind being registered as pointer events rather - // than mouse events. Mousemove event is registered directly on the - // element rather than through browserEvents. this.block.pathObject.svgPath.dispatchEvent( - new MouseEvent('pointerover')); - this.block.pathObject.svgPath.dispatchEvent(new MouseEvent('mousemove')); + new PointerEvent('pointerover')); + this.block.pathObject.svgPath.dispatchEvent(new PointerEvent('pointermove')); this.clock.runAll(); chai.assert.isTrue( diff --git a/tests/mocha/touch_test.js b/tests/mocha/touch_test.js index 77f4fb841..4afc7d802 100644 --- a/tests/mocha/touch_test.js +++ b/tests/mocha/touch_test.js @@ -19,29 +19,29 @@ }); suite('shouldHandleTouch', function() { - test('handles mousedown event', function() { - const mouseEvent = new MouseEvent('mousedown'); - chai.assert.isTrue(Blockly.Touch.shouldHandleEvent(mouseEvent)); + test('handles pointerdown event', function() { + const pointerEvent = new PointerEvent('pointerdown'); + chai.assert.isTrue(Blockly.Touch.shouldHandleEvent(pointerEvent)); }); - test('handles multiple mousedown events', function() { - const mouseEvent1 = new MouseEvent('mousedown'); - const mouseEvent2 = new MouseEvent('mousedown'); - Blockly.Touch.shouldHandleEvent(mouseEvent1); - chai.assert.isTrue(Blockly.Touch.shouldHandleEvent(mouseEvent2)); + test('handles multiple pointerdown events', function() { + const pointerEvent1 = new PointerEvent('pointerdown'); + const pointerEvent2 = new PointerEvent('pointerdown'); + Blockly.Touch.shouldHandleEvent(pointerEvent1); + chai.assert.isTrue(Blockly.Touch.shouldHandleEvent(pointerEvent2)); }); - test('does not handle mouseup if not tracking touch', function() { - const mouseEvent = new MouseEvent('mouseup'); - chai.assert.isFalse(Blockly.Touch.shouldHandleEvent(mouseEvent)); + test('does not handle pointerup if not tracking touch', function() { + const pointerEvent = new PointerEvent('pointerup'); + chai.assert.isFalse(Blockly.Touch.shouldHandleEvent(pointerEvent)); }); - test('handles mouseup if already tracking a touch', function() { - const mousedown = new MouseEvent('mousedown'); - const mouseup = new MouseEvent('mouseup'); - // Register the mousedown event first - Blockly.Touch.shouldHandleEvent(mousedown); - chai.assert.isTrue(Blockly.Touch.shouldHandleEvent(mouseup)); + test('handles pointerup if already tracking a touch', function() { + const pointerdown = new PointerEvent('pointerdown'); + const pointerup = new PointerEvent('pointerup'); + // Register the pointerdown event first + Blockly.Touch.shouldHandleEvent(pointerdown); + chai.assert.isTrue(Blockly.Touch.shouldHandleEvent(pointerup)); }); test('handles pointerdown if this is a new touch', function() { @@ -56,13 +56,6 @@ chai.assert.isFalse(Blockly.Touch.shouldHandleEvent(pointerdown2)); }); - test('does not handle pointerdown after a mousedown', function() { - const mouseEvent = new MouseEvent('mousedown'); - const pointerdown = new PointerEvent('pointerdown', {pointerId: 1, pointerType: 'touch'}); - Blockly.Touch.shouldHandleEvent(mouseEvent); - chai.assert.isFalse(Blockly.Touch.shouldHandleEvent(pointerdown)); - }); - test('does not handle pointerup if not tracking touch', function() { const pointerup = new PointerEvent('pointerup', {pointerId: 1, pointerType: 'touch'}); chai.assert.isFalse(Blockly.Touch.shouldHandleEvent(pointerup)); @@ -77,11 +70,6 @@ }); suite('getTouchIdentifierFromEvent', function() { - test('is mouse for MouseEvents', function() { - const mousedown = new MouseEvent('mousedown'); - chai.assert.equal(Blockly.Touch.getTouchIdentifierFromEvent(mousedown), 'mouse'); - }); - test('is pointerId for mouse PointerEvents', function() { const pointerdown = new PointerEvent('pointerdown', {pointerId: 7, pointerType: 'mouse'}); chai.assert.equal(Blockly.Touch.getTouchIdentifierFromEvent(pointerdown), 7); diff --git a/tests/mocha/variable_map_test.js b/tests/mocha/variable_map_test.js index a8bec4a1f..2efb3afbd 100644 --- a/tests/mocha/variable_map_test.js +++ b/tests/mocha/variable_map_test.js @@ -8,6 +8,7 @@ goog.declareModuleId('Blockly.test.variableMap'); import {assertVariableValues} from './test_helpers/variables.js'; import {createGenUidStubWithReturns, sharedTestSetup, sharedTestTeardown} from './test_helpers/setup_teardown.js'; +import {assertEventFired, assertEventNotFired, createChangeListenerSpy} from './test_helpers/events.js'; suite('Variable Map', function() { @@ -253,4 +254,203 @@ suite('Variable Map', function() { chai.assert.deepEqual(resultArray, []); }); }); + + suite('event firing', function() { + setup(function() { + this.eventSpy = createChangeListenerSpy(this.workspace); + }); + + teardown(function() { + this.workspace.removeChangeListener(this.eventSpy); + }); + + suite('variable create events', function() { + test('create events are fired when a variable is created', function() { + this.variableMap.createVariable('test name', 'test type', 'test id'); + + assertEventFired( + this.eventSpy, + Blockly.Events.VarCreate, + { + varType: 'test type', + varName: 'test name', + varId: 'test id', + }, + this.workspace.id); + }); + + test( + 'create events are not fired if a variable is already exists', + function() { + this.variableMap.createVariable('test name', 'test type', 'test id'); + + this.eventSpy.resetHistory(); + this.variableMap.createVariable('test name', 'test type', 'test id'); + + assertEventNotFired( + this.eventSpy, + Blockly.Events.VarCreate, + {}, + this.workspace.id); + }); + }); + + suite('variable delete events', function() { + suite('deleting with a variable', function() { + test('delete events are fired when a variable is deleted', function() { + const variable = + this.variableMap.createVariable('test name', 'test type', 'test id'); + this.variableMap.deleteVariable(variable); + + assertEventFired( + this.eventSpy, + Blockly.Events.VarDelete, + { + varType: 'test type', + varName: 'test name', + varId: 'test id', + }, + this.workspace.id); + }); + + test( + 'delete events are not fired when a variable does not exist', + function() { + const variable = + new Blockly.VariableModel( + this.workspace, 'test name', 'test type', 'test id'); + this.variableMap.deleteVariable(variable); + + assertEventNotFired( + this.eventSpy, + Blockly.Events.VarDelete, + {}, + this.workspace.id); + }); + }); + + suite('deleting by ID', function() { + test( + 'delete events are fired when a variable is deleted', + function() { + this.variableMap.createVariable('test name', 'test type', 'test id'); + this.variableMap.deleteVariableById('test id'); + + assertEventFired( + this.eventSpy, + Blockly.Events.VarDelete, + { + varType: 'test type', + varName: 'test name', + varId: 'test id', + }, + this.workspace.id); + }); + + test( + 'delete events are not fired when a variable does not exist', + function() { + this.variableMap.deleteVariableById('test id'); + + assertEventNotFired( + this.eventSpy, + Blockly.Events.VarDelete, + {}, + this.workspace.id); + }); + }); + }); + + suite('variable rename events', function() { + suite('renaming with variable', function() { + test('rename events are fired when a variable is renamed', function() { + const variable = + this.variableMap.createVariable( + 'test name', 'test type', 'test id'); + this.variableMap.renameVariable(variable, 'new test name'); + + assertEventFired( + this.eventSpy, + Blockly.Events.VarRename, + { + oldName: 'test name', + newName: 'new test name', + varId: 'test id', + }, + this.workspace.id); + }); + + test( + 'rename events are not fired if the variable name already matches', + function() { + const variable = + this.variableMap.createVariable( + 'test name', 'test type', 'test id'); + this.variableMap.renameVariable(variable, 'test name'); + + assertEventNotFired( + this.eventSpy, + Blockly.Events.VarRename, + {}, + this.workspace.id); + }); + + test( + 'rename events are not fired if the variable does not exist', + function() { + const variable = + new Blockly.VariableModel( + 'test name', 'test type', 'test id'); + this.variableMap.renameVariable(variable, 'test name'); + + assertEventNotFired( + this.eventSpy, + Blockly.Events.VarRename, + {}, + this.workspace.id); + }); + }); + + suite('renaming by ID', function() { + test('rename events are fired when a variable is renamed', function() { + this.variableMap.createVariable('test name', 'test type', 'test id'); + this.variableMap.renameVariableById('test id', 'new test name'); + + assertEventFired( + this.eventSpy, + Blockly.Events.VarRename, + { + oldName: 'test name', + newName: 'new test name', + varId: 'test id', + }, + this.workspace.id); + }); + + test( + 'rename events are not fired if the variable name already matches', + function() { + this.variableMap.createVariable( + 'test name', 'test type', 'test id'); + this.variableMap.renameVariableById('test id', 'test name'); + + assertEventNotFired( + this.eventSpy, + Blockly.Events.VarRename, + {}, + this.workspace.id); + }); + + test( + 'renaming throws if the variable does not exist', + function() { + // Not sure why this throws when the other one doesn't but might + // as well test it. + chai.assert.throws(() => { + this.variableMap.renameVariableById('test id', 'test name'); + }, `Tried to rename a variable that didn't exist`); + }); + }); + }); + }); }); diff --git a/tests/mocha/run_mocha_tests_in_browser.js b/tests/mocha/webdriver.js similarity index 70% rename from tests/mocha/run_mocha_tests_in_browser.js rename to tests/mocha/webdriver.js index f2d7f4a8b..e7eb99bc7 100644 --- a/tests/mocha/run_mocha_tests_in_browser.js +++ b/tests/mocha/webdriver.js @@ -7,10 +7,9 @@ /** * @fileoverview Node.js script to run Mocha tests in Chrome, via webdriver. */ -var webdriverio = require('webdriverio'); -var {posixPath} = require('../../scripts/helpers'); +const webdriverio = require('webdriverio'); +const {posixPath} = require('../../scripts/helpers'); -module.exports = runMochaTestsInBrowser; /** * Runs the Mocha tests in this directory in Chrome. It uses webdriverio to @@ -19,56 +18,54 @@ module.exports = runMochaTestsInBrowser; * @return {number} 0 on success, 1 on failure. */ async function runMochaTestsInBrowser() { - var options = { + const options = { capabilities: { - browserName: 'chrome' + browserName: 'chrome', + 'goog:chromeOptions': { + args: ['--allow-file-access-from-files'], + }, }, services: [ - ['selenium-standalone'] + ['selenium-standalone'], ], - logLevel: 'warn' + logLevel: 'warn', }; + // Run in headless mode on Github Actions. if (process.env.CI) { - options.capabilities['goog:chromeOptions'] = { - args: [ - '--headless', '--no-sandbox', '--disable-dev-shm-usage', - '--allow-file-access-from-files', - ] - }; + options.capabilities['goog:chromeOptions'].args.push( + '--headless', '--no-sandbox', '--disable-dev-shm-usage',); } else { // --disable-gpu is needed to prevent Chrome from hanging on Linux with // NVIDIA drivers older than v295.20. See // https://github.com/google/blockly/issues/5345 for details. - options.capabilities['goog:chromeOptions'] = { - args: ['--allow-file-access-from-files', '--disable-gpu'] - }; + options.capabilities['goog:chromeOptions'].args.push('--disable-gpu'); } - var url = 'file://' + posixPath(__dirname) + '/index.html'; + const url = 'file://' + posixPath(__dirname) + '/index.html'; console.log('Starting webdriverio...'); const browser = await webdriverio.remote(options); - console.log('Initialized.\nLoading url: ' + url); + console.log('Loading URL: ' + url); await browser.url(url); - await browser.waitUntil(async () => { - var elem = await browser.$('#failureCount'); - var text = await elem.getAttribute('tests_failed'); - return text != 'unset'; + await browser.waitUntil(async() => { + const elem = await browser.$('#failureCount'); + const text = await elem.getAttribute('tests_failed'); + return text !== 'unset'; }, { - timeout: 50000 + timeout: 50000, }); const elem = await browser.$('#failureCount'); const numOfFailure = await elem.getAttribute('tests_failed'); if (numOfFailure > 0) { - console.log('============Blockly Mocha Test Failures================') + console.log('============Blockly Mocha Test Failures================'); const failureMessagesEls = await browser.$$('#failureMessages p'); if (!failureMessagesEls.length) { console.log('There is at least one test failure, but no messages reported. Mocha may be failing because no tests are being run.'); } - for (let el of failureMessagesEls) { + for (const el of failureMessagesEls) { console.log(await el.getText()); } } @@ -84,7 +81,7 @@ async function runMochaTestsInBrowser() { } if (require.main === module) { - runMochaTestsInBrowser().catch(e => { + runMochaTestsInBrowser().catch((e) => { console.error(e); process.exit(1); }).then(function(result) { @@ -97,3 +94,5 @@ if (require.main === module) { } }); } + +module.exports = {runMochaTestsInBrowser}; diff --git a/tests/mocha/workspace_svg_test.js b/tests/mocha/workspace_svg_test.js index 49cbad0e1..cea36e100 100644 --- a/tests/mocha/workspace_svg_test.js +++ b/tests/mocha/workspace_svg_test.js @@ -6,7 +6,7 @@ goog.declareModuleId('Blockly.test.workspaceSvg'); -import {assertEventFired, assertEventNotFired, createFireChangeListenerSpy} from './test_helpers/events.js'; +import {assertEventFired, assertEventNotFired, createChangeListenerSpy} from './test_helpers/events.js'; import {assertVariableValues} from './test_helpers/variables.js'; import {defineStackBlock} from './test_helpers/block_definitions.js'; import * as eventUtils from '../../build/src/core/events/utils.js'; @@ -163,7 +163,7 @@ suite('WorkspaceSvg', function() { } setup(function() { defineStackBlock(); - this.changeListenerSpy = createFireChangeListenerSpy(this.workspace); + this.changeListenerSpy = createChangeListenerSpy(this.workspace); }); teardown(function() { delete Blockly.Blocks['stack_block']; diff --git a/tests/run_all_tests.sh b/tests/run_all_tests.sh deleted file mode 100755 index 2f09dc7dd..000000000 --- a/tests/run_all_tests.sh +++ /dev/null @@ -1,88 +0,0 @@ -#!/bin/bash - -if [ ! -z $CI ]; then echo "Executing run_all_tests.sh from $(pwd)"; fi - -# ANSI colors -BOLD_GREEN='\033[1;32m' -BOLD_RED='\033[1;31m' -ANSI_RESET='\033[0m' - -gh_actions_fold () { - local startOrEnd=$1 # Either "start" or "end" - - if [ ! -z $CI ]; then - echo "::$startOrEnd::" - fi -} - -# Find the Blockly project root if pwd is the root -# or if pwd is the directory containing this script. -if [ -f ./run_all_tests.js ]; then - BLOCKLY_ROOT=".." -elif [ -f tests/run_all_tests.sh ]; then - BLOCKLY_ROOT="." -else - echo -e "${BOLD_RED}ERROR: Cannot determine BLOCKLY_ROOT${ANSI_RESET}" 1>&2; - exit 1 -fi -pushd $BLOCKLY_ROOT -echo "pwd: $(pwd)" - -FAILURE_COUNT=0 - -run_test_command () { - local test_id=$1 # The id to use for folds and similar. No spaces. - local command=$2 # The command to run. - - echo "=======================================" - echo "== $test_id" - gh_actions_fold group - $command - local test_result=$? - gh_actions_fold endgroup - if [ $test_result -eq 0 ]; then - echo -e "${BOLD_GREEN}SUCCESS:${ANSI_RESET} ${test_id}" - else - echo -e "${BOLD_RED}FAILED:${ANSI_RESET} ${test_id}" - FAILURE_COUNT=$((FAILURE_COUNT+1)) - fi -} - -# Lint the codebase. -# Skip for CI environments, because linting is run separately. -if [ -z $CI ]; then - run_test_command "eslint" "eslint ." -fi - -# Run the full usual build process, checking to ensure there are no -# closure compiler warnings / errors. -run_test_command "build + package" "npm run package -- --verbose --debug" - -# Run renaming validation test. -run_test_command "renamings" "tests/migration/validate-renamings.js" - -# Check the sizes of built files for unexpected growth. -run_test_command "metadata" "tests/scripts/check_metadata.sh" - -# Run Mocha tests inside a browser. -run_test_command "mocha" "node tests/mocha/run_mocha_tests_in_browser.js" - -# Run generator tests inside a browser and check the results. -run_test_command "generators" "tests/scripts/run_generators.sh" - -# Run Node tests. -run_test_command "node" "./node_modules/.bin/mocha tests/node --config tests/node/.mocharc.js" - -# Attempt advanced compilation of a Blockly app. -run_test_command "advanced_compile" "npm run only:compile:advanced" - -# End of tests. -popd -echo "=======================================" -if [ "$FAILURE_COUNT" -eq "0" ]; then - echo -e "${BOLD_GREEN}All tests passed.${ANSI_RESET}" - exit 0 -else - echo -e "${BOLD_RED}Failures in ${FAILURE_COUNT} test groups.${ANSI_RESET}" - exit 1 -fi diff --git a/tests/scripts/check_metadata.sh b/tests/scripts/check_metadata.sh index d12b41c02..35dd8232e 100755 --- a/tests/scripts/check_metadata.sh +++ b/tests/scripts/check_metadata.sh @@ -32,7 +32,8 @@ readonly RELEASE_DIR='dist' # Q2 2022 8.0.0 928056 # Q3 2022 8.0.0 1040413 (mid-quarter typescript conversion) # Q4 2022 8.0.0 870104 -readonly BLOCKLY_SIZE_EXPECTED=870104 +# Q4 2022 9.1.1 903357 +readonly BLOCKLY_SIZE_EXPECTED= 903357 # Size of blocks_compressed.js # Q2 2019 2.20190722.0 75618 @@ -50,7 +51,8 @@ readonly BLOCKLY_SIZE_EXPECTED=870104 # Q2 2022 8.0.0 90769 # Q3 2022 8.0.0 102176 (mid-quarter typescript conversion) # Q4 2022 8.0.0 102213 -readonly BLOCKS_SIZE_EXPECTED=102213 +# Q4 2022 9.1.1 102190 +readonly BLOCKS_SIZE_EXPECTED= 102190 # Size of blockly_compressed.js.gz # Q2 2019 2.20190722.0 180925 @@ -69,7 +71,8 @@ readonly BLOCKS_SIZE_EXPECTED=102213 # Q2 2022 8.0.0 173997 # Q3 2022 8.0.0 185766 (mid-quarter typescript conversion) # Q4 2022 8.0.0 175140 -readonly BLOCKLY_GZ_SIZE_EXPECTED=175140 +# Q4 2022 9.1.1 179306 +readonly BLOCKLY_GZ_SIZE_EXPECTED= 179306 # Size of blocks_compressed.js.gz # Q2 2019 2.20190722.0 14552 @@ -87,7 +90,8 @@ readonly BLOCKLY_GZ_SIZE_EXPECTED=175140 # Q2 2022 8.0.0 16192 # Q3 2022 8.0.0 17016 (mid-quarter typescript conversion) # Q4 2022 8.0.0 17188 -readonly BLOCKS_GZ_SIZE_EXPECTED=17188 +# Q4 2022 9.1.1 17182 +readonly BLOCKS_GZ_SIZE_EXPECTED= 17182 # ANSI colors readonly BOLD_GREEN='\033[1;32m' diff --git a/typings/README.md b/typings/README.md index df9268c43..f656d5424 100644 --- a/typings/README.md +++ b/typings/README.md @@ -1,13 +1,5 @@ -# blockly.d.ts +This directory contains hand-crafted typings for places where the Blockly +library isn't yet converted to typescript. -This ``blockly.d.ts`` file describes the TypeScript type definitions for Blockly. -If you consume Blockly through ``npm``, this file is already included in the ``npm`` package. -Otherwise, you can include a copy of this file with your sources and reference it through a [Triple-Slash directive](https://www.typescriptlang.org/docs/handbook/triple-slash-directives.html). - - -## Generating a new version - -To generate a new version of the Typings file, from the Blockly root directory run ``npm run typings``. -You will need to run ``npm install`` for this to work. - -Note: In order to check for errors in the typings file, run ``tsc`` in the ``typings/`` directory. +These are added to the generated typings as part of the package step. I.e. +`npm run package`.