From 92efdb91d12281a412aac4e87701471b80406393 Mon Sep 17 00:00:00 2001 From: Rachel Fenichel Date: Thu, 10 Nov 2022 09:32:27 -0800 Subject: [PATCH 01/73] chore: clean up insertion marker code (#6602) * chore: move comments * chore: remove underscores from private property names * chore: remove underscores from properties and methods in insertion marker manager * chore: format * chore: track closestConnection and localConnection as a single object * chore: format * chore: add comments and simplify shouldUpdatePreviews * chore(docs): add jsdoc for new params * chore: use destructuring assignments * chore: improve readability * chore: address review feedback * chore: respond to review feedback * chore: fix types in shouldDelete * chore: make wouldDeleteBlock a property * chore: format --- core/block_dragger.ts | 2 +- core/insertion_marker_manager.ts | 544 ++++++++----------- tests/mocha/insertion_marker_manager_test.js | 8 +- 3 files changed, 243 insertions(+), 311 deletions(-) diff --git a/core/block_dragger.ts b/core/block_dragger.ts index 33b0dcf83..0469a325a 100644 --- a/core/block_dragger.ts +++ b/core/block_dragger.ts @@ -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_(); 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/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); }); }); From 0532b5d1c097495f4fe7d68208c9d53d7e75722d Mon Sep 17 00:00:00 2001 From: Beka Westberg Date: Thu, 10 Nov 2022 16:38:32 -0800 Subject: [PATCH 02/73] feat: add firing of procedure events. (#6604) * feat: add empty implementations of events * chore: register all events * chore: change assertions to shallow match properties * feat: add firing events from the observable procedure map * fix: make event not fired assertions actually fail * chore: fixup typos in tests * feat: add firing procedure model events * feat: add firing parameter create and parameter delete events * chore: reorganize event tests into suites * feat: add firing parameter rename events * chore: format * chore: use tripple equals --- core/events/events.ts | 20 + core/events/events_procedure_base.ts | 19 + core/events/events_procedure_change_return.ts | 26 + core/events/events_procedure_create.ts | 16 + core/events/events_procedure_delete.ts | 17 + core/events/events_procedure_enable.ts | 17 + .../events/events_procedure_parameter_base.ts | 11 + .../events_procedure_parameter_create.ts | 27 + .../events_procedure_parameter_delete.ts | 27 + .../events_procedure_parameter_rename.ts | 27 + core/events/events_procedure_rename.ts | 26 + core/events/utils.ts | 24 + core/interfaces/i_observable.ts | 25 + core/interfaces/i_parameter_model.ts | 9 +- core/procedures/observable_parameter_model.ts | 40 +- core/procedures/observable_procedure_map.ts | 25 +- core/procedures/observable_procedure_model.ts | 81 +- tests/mocha/event_test.js | 6 +- tests/mocha/procedure_map_test.js | 1006 +++++++++-------- tests/mocha/test_helpers/events.js | 7 +- tests/mocha/workspace_svg_test.js | 4 +- 21 files changed, 968 insertions(+), 492 deletions(-) create mode 100644 core/events/events_procedure_base.ts create mode 100644 core/events/events_procedure_change_return.ts create mode 100644 core/events/events_procedure_create.ts create mode 100644 core/events/events_procedure_delete.ts create mode 100644 core/events/events_procedure_enable.ts create mode 100644 core/events/events_procedure_parameter_base.ts create mode 100644 core/events/events_procedure_parameter_create.ts create mode 100644 core/events/events_procedure_parameter_delete.ts create mode 100644 core/events/events_procedure_parameter_rename.ts create mode 100644 core/events/events_procedure_rename.ts create mode 100644 core/interfaces/i_observable.ts 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_procedure_base.ts b/core/events/events_procedure_base.ts new file mode 100644 index 000000000..dc3fca472 --- /dev/null +++ b/core/events/events_procedure_base.ts @@ -0,0 +1,19 @@ +/** + * @license + * Copyright 2022 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +import {Abstract as AbstractEvent} from './events_abstract.js'; +import type {IProcedureModel} from '../interfaces/i_procedure_model.js'; +import type {Workspace} from '../workspace.js'; + + +export class ProcedureBase extends AbstractEvent { + isBlank = false; + + constructor(workspace: Workspace, public readonly model: IProcedureModel) { + super(); + this.workspaceId = workspace.id; + } +} diff --git a/core/events/events_procedure_change_return.ts b/core/events/events_procedure_change_return.ts new file mode 100644 index 000000000..1f818b108 --- /dev/null +++ b/core/events/events_procedure_change_return.ts @@ -0,0 +1,26 @@ + +/** + * @license + * Copyright 2022 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +import {IProcedureModel} from '../interfaces/i_procedure_model.js'; +import * as registry from '../registry.js'; +import {Workspace} from '../workspace.js'; + +import {ProcedureBase} from './events_procedure_base.js'; +import * as eventUtils from './utils.js'; + + +export class ProcedureChangeReturn extends ProcedureBase { + constructor( + workpace: Workspace, model: IProcedureModel, + public readonly oldTypes: string[]|null) { + super(workpace, model); + } +} + +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..5f96db077 --- /dev/null +++ b/core/events/events_procedure_create.ts @@ -0,0 +1,16 @@ +/** + * @license + * Copyright 2022 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +import * as registry from '../registry.js'; + +import {ProcedureBase} from './events_procedure_base.js'; +import * as eventUtils from './utils.js'; + + +export class ProcedureCreate extends ProcedureBase {} + +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..0cb55319e --- /dev/null +++ b/core/events/events_procedure_delete.ts @@ -0,0 +1,17 @@ + +/** + * @license + * Copyright 2022 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +import * as registry from '../registry.js'; + +import {ProcedureBase} from './events_procedure_base.js'; +import * as eventUtils from './utils.js'; + + +export class ProcedureDelete extends ProcedureBase {} + +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..43ecd3fed --- /dev/null +++ b/core/events/events_procedure_enable.ts @@ -0,0 +1,17 @@ + +/** + * @license + * Copyright 2022 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +import * as registry from '../registry.js'; + +import {ProcedureBase} from './events_procedure_base.js'; +import * as eventUtils from './utils.js'; + + +export class ProcedureEnable extends ProcedureBase {} + +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..137769d75 --- /dev/null +++ b/core/events/events_procedure_parameter_base.ts @@ -0,0 +1,11 @@ + +/** + * @license + * Copyright 2022 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +import {ProcedureBase} from './events_procedure_base.js'; + + +export class ProcedureParameterBase extends ProcedureBase {} diff --git a/core/events/events_procedure_parameter_create.ts b/core/events/events_procedure_parameter_create.ts new file mode 100644 index 000000000..3c2f413b6 --- /dev/null +++ b/core/events/events_procedure_parameter_create.ts @@ -0,0 +1,27 @@ +/** + * @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 * as registry from '../registry.js'; +import {Workspace} from '../workspace.js'; + +import {ProcedureParameterBase} from './events_procedure_parameter_base.js'; +import * as eventUtils from './utils.js'; + + +export class ProcedureParameterCreate extends ProcedureParameterBase { + constructor( + workspace: Workspace, procedure: IProcedureModel, + public readonly parameter: IParameterModel, + public readonly index: number) { + super(workspace, procedure); + } +} + +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..82554ca46 --- /dev/null +++ b/core/events/events_procedure_parameter_delete.ts @@ -0,0 +1,27 @@ +/** + * @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 * as registry from '../registry.js'; +import {Workspace} from '../workspace.js'; + +import {ProcedureParameterBase} from './events_procedure_parameter_base.js'; +import * as eventUtils from './utils.js'; + + +export class ProcedureParameterDelete extends ProcedureParameterBase { + constructor( + workspace: Workspace, procedure: IProcedureModel, + public readonly parameter: IParameterModel, + public readonly index: number) { + super(workspace, procedure); + } +} + +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..d18f1679c --- /dev/null +++ b/core/events/events_procedure_parameter_rename.ts @@ -0,0 +1,27 @@ +/** + * @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 * as registry from '../registry.js'; +import {Workspace} from '../workspace.js'; + +import {ProcedureParameterBase} from './events_procedure_parameter_base.js'; +import * as eventUtils from './utils.js'; + + +export class ProcedureParameterRename extends ProcedureParameterBase { + constructor( + workspace: Workspace, procedure: IProcedureModel, + public readonly parameter: IParameterModel, + public readonly oldName: string) { + super(workspace, procedure); + } +} + +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..59a51964b --- /dev/null +++ b/core/events/events_procedure_rename.ts @@ -0,0 +1,26 @@ +/** + * @license + * Copyright 2022 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +import {IProcedureModel} from '../interfaces/i_procedure_model.js'; +import * as registry from '../registry.js'; +import {Workspace} from '../workspace.js'; + +import {ProcedureBase} from './events_procedure_base.js'; +import * as eventUtils from './utils.js'; + + +export class ProcedureRename extends ProcedureBase { + type = eventUtils.PROCEDURE_RENAME; + + constructor( + workspace: Workspace, model: IProcedureModel, + public readonly oldName: string) { + super(workspace, model); + } +} + +registry.register( + registry.Type.EVENT, eventUtils.PROCEDURE_RENAME, ProcedureRename); diff --git a/core/events/utils.ts b/core/events/utils.ts index 9938216ce..9bd4ea381 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. 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/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/tests/mocha/event_test.js b/tests/mocha/event_test.js index 9954225be..01a2f9317 100644 --- a/tests/mocha/event_test.js +++ b/tests/mocha/event_test.js @@ -8,7 +8,7 @@ goog.declareModuleId('Blockly.test.event'); import * as Blockly from '../../build/src/core/blockly.js'; import {ASTNode} from '../../build/src/core/keyboard_nav/ast_node.js'; -import {assertEventEquals, assertNthCallEventArgEquals, createFireChangeListenerSpy} from './test_helpers/events.js'; +import {assertEventEquals, assertNthCallEventArgEquals, createChangeListenerSpy} from './test_helpers/events.js'; import {assertVariableValues} from './test_helpers/variables.js'; import {createGenUidStubWithReturns, sharedTestSetup, sharedTestTeardown, workspaceTeardown} from './test_helpers/setup_teardown.js'; import * as eventUtils from '../../build/src/core/events/utils.js'; @@ -962,7 +962,7 @@ suite('Events', function() { suite('Firing', function() { setup(function() { - this.changeListenerSpy = createFireChangeListenerSpy(this.workspace); + this.changeListenerSpy = createChangeListenerSpy(this.workspace); }); test('Block dispose triggers Delete', function() { @@ -984,7 +984,7 @@ suite('Events', function() { this.clock.runAll(); this.eventsFireSpy.resetHistory(); - const changeListenerSpy = createFireChangeListenerSpy(workspaceSvg); + const changeListenerSpy = createChangeListenerSpy(workspaceSvg); block.dispose(); // Run all queued events. diff --git a/tests/mocha/procedure_map_test.js b/tests/mocha/procedure_map_test.js index 38e5dd43b..6d717a9db 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 {assertEventNotFired, createChangeListenerSpy} from './test_helpers/events.js'; goog.declareModuleId('Blockly.test.procedureMap'); @@ -201,7 +201,26 @@ suite('Procedure Map', function() { }); }); - suite.skip('event firing', function() { + suite('event firing', function() { + function shallowMatch(expected) { + return (actual) => { + for (const key in expected) { + if (actual[key] !== expected[key]) { + return false; + } + } + return true; + }; + } + + function assertEventFired(spy, instanceType, properties, workspace) { + properties = {...properties, workspaceId: workspace.id}; + sinon.assert.calledWith( + spy, + sinon.match.instanceOf(instanceType) + .and(shallowMatch(properties))); + } + setup(function() { this.eventSpy = createChangeListenerSpy(this.workspace); }); @@ -210,485 +229,540 @@ 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); + + assertEventFired( + this.eventSpy, + Blockly.Events.ProcedureCreate, + {model: procedureModel}, + this.workspace); + }); + + 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); + }); + + 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); + }); }); - 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()); + + assertEventFired( + this.eventSpy, + Blockly.Events.ProcedureDelete, + {model: procedureModel}, + this.workspace); + }); + + 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(); + + assertEventFired( + this.eventSpy, + Blockly.Events.ProcedureDelete, + {model: procedureModel1}, + this.workspace); + assertEventFired( + this.eventSpy, + Blockly.Events.ProcedureDelete, + {model: procedureModel2}, + this.workspace); + assertEventFired( + this.eventSpy, + Blockly.Events.ProcedureDelete, + {model: procedureModel3}, + this.workspace); + }); }); - 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'); + + assertEventFired( + this.eventSpy, + Blockly.Events.ProcedureRename, + { + model: procedureModel, + oldName: 'test name', + }, + this.workspace); + }); + + 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); + + assertEventFired( + this.eventSpy, + Blockly.Events.ProcedureEnable, + {model: procedureModel}, + this.workspace); + }); + + 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); + }); + + 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); + + assertEventFired( + this.eventSpy, + Blockly.Events.ProcedureParameterCreate, + { + model: procedureModel, + parameter: parameterModel, + index: 0, + }, + this.workspace); + }); + + 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); + + assertEventFired( + this.eventSpy, + Blockly.Events.ProcedureParameterDelete, + { + model: procedureModel, + parameter: parameterModel, + index: 0, + }, + this.workspace); + }); + + 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); + }); + + 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'); + + console.log(this.eventSpy.getCalls()); + assertEventFired( + this.eventSpy, + Blockly.Events.ProcedureParameterRename, + { + model: procedureModel, + parameter: parameterModel, + oldName: 'test name', + }, + this.workspace); + }); + + 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([]); + + assertEventFired( + this.eventSpy, + Blockly.Events.ProcedureChangeReturn, + { + model: procedureModel, + oldTypes: null, + }, + this.workspace); + }); + + 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); + + assertEventFired( + this.eventSpy, + Blockly.Events.ProcedureChangeReturn, + { + model: procedureModel, + oldTypes: types, + }, + this.workspace); + }); + + 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..0f5839d9b 100644 --- a/tests/mocha/test_helpers/events.js +++ b/tests/mocha/test_helpers/events.js @@ -13,8 +13,10 @@ 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; } /** @@ -140,7 +142,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/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']; From 79f620647f31e7800552c2b3363b911c55f5237b Mon Sep 17 00:00:00 2001 From: Blake Thomas Williams <49404493+btw17@users.noreply.github.com> Date: Fri, 11 Nov 2022 10:54:57 -0600 Subject: [PATCH 03/73] chore: add validator and field value types (#6603) * chore: add validator and field value types * chore/clean up unused default and unnecessary field type setting * chore: removed IRegisterableField and updated various Field instances * fix: remove unused field image validator function * chore: added pass-through constructor to field_textinput --- core/block.ts | 2 +- core/blockly.ts | 44 +- core/dropdowndiv.ts | 24 +- core/field.ts | 18 +- core/field_angle.ts | 11 +- core/field_checkbox.ts | 8 +- core/field_colour.ts | 7 +- core/field_dropdown.ts | 10 +- core/field_image.ts | 5 +- core/field_input.ts | 600 +++++++++++++++++++++++++ core/field_label.ts | 5 +- core/field_label_serializable.ts | 3 +- core/field_multilineinput.ts | 5 +- core/field_number.ts | 12 +- core/field_registry.ts | 18 +- core/field_textinput.ts | 571 +---------------------- core/field_variable.ts | 5 +- core/input.ts | 13 +- core/interfaces/i_registrable_field.ts | 29 -- 19 files changed, 714 insertions(+), 676 deletions(-) create mode 100644 core/field_input.ts delete mode 100644 core/interfaces/i_registrable_field.ts diff --git a/core/block.ts b/core/block.ts index caff93df2..ee81f1cf8 100644 --- a/core/block.ts +++ b/core/block.ts @@ -1817,7 +1817,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/blockly.ts b/core/blockly.ts index dcb1d8ba9..42c75ee79 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'; @@ -648,18 +647,24 @@ 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}; @@ -693,7 +698,6 @@ export {Input}; export {InsertionMarkerManager}; export {IPositionable}; export {IRegistrable}; -export {IRegistrableField}; export {ISelectable}; export {ISelectableToolboxItem}; export {IStyleable}; diff --git a/core/dropdowndiv.ts b/core/dropdowndiv.ts index 27e1d160d..8a5cceabf 100644 --- a/core/dropdowndiv.ts +++ b/core/dropdowndiv.ts @@ -194,11 +194,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 +213,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 +302,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 +542,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/field.ts b/core/field.ts index dc9010633..e89fac784 100644 --- a/core/field.ts +++ b/core/field.ts @@ -45,15 +45,17 @@ import * as WidgetDiv from './widgetdiv.js'; import type {WorkspaceSvg} from './workspace_svg.js'; import * as Xml from './xml.js'; +export type FieldValidator = (value: T) => void; /** * 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 { /** Non-breaking space. */ static readonly NBSP = '\u00A0'; @@ -69,10 +71,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,7 +183,7 @@ 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. @@ -597,7 +599,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; } @@ -1073,7 +1075,7 @@ export abstract class Field implements IASTNodeLocationSvg, } 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..4d9012b36 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,13 +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 { +export class FieldAngle extends FieldInput { /** The default value for this field. */ // protected override DEFAULT_VALUE = 0; @@ -135,7 +136,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); @@ -480,7 +481,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); @@ -541,7 +542,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..f42039855 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); diff --git a/core/field_colour.ts b/core/field_colour.ts index aa1a5b9f0..3964a6650 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); 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..183b2dd2e 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. diff --git a/core/field_input.ts b/core/field_input.ts new file mode 100644 index 000000000..fe58b91d3 --- /dev/null +++ b/core/field_input.ts @@ -0,0 +1,600 @@ +/** + * @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.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 = 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_); + 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; + } +} + +/** + * 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..34222afd0 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; 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..ea305f1e9 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; @@ -68,7 +69,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 +312,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( @@ -325,7 +327,7 @@ fieldRegistry.register('field_number', FieldNumber); /** * 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..0c2788a15 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); } /** @@ -612,16 +64,11 @@ 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; -} - /** * 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/input.ts b/core/input.ts index ed321a6ad..3cba37e69 100644 --- a/core/input.ts +++ b/core/input.ts @@ -75,7 +75,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 +90,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,9 +104,9 @@ 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_); @@ -121,7 +122,7 @@ 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. 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; -} From 78af46e72b35160f35c658d5e074f151b73d0c7c Mon Sep 17 00:00:00 2001 From: Rachel Fenichel Date: Fri, 11 Nov 2022 09:56:39 -0800 Subject: [PATCH 04/73] chore: removes underscores in input (#6612) --- core/input.ts | 44 +++++++++++++++++++++----------------------- 1 file changed, 21 insertions(+), 23 deletions(-) diff --git a/core/input.ts b/core/input.ts index 3cba37e69..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; } /** @@ -109,8 +107,8 @@ export class Input { })!; } - field.setSourceBlock(this.sourceBlock_); - if (this.sourceBlock_.rendered) { + field.setSourceBlock(this.sourceBlock); + if (this.sourceBlock.rendered) { field.init(); field.applyColour(); } @@ -129,10 +127,10 @@ export class Input { 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; } @@ -151,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; } @@ -171,7 +169,7 @@ export class Input { * @returns True if visible. */ isVisible(): boolean { - return this.visible_; + return this.visible; } /** @@ -187,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); @@ -246,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; @@ -281,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++) { From 6ce06e6982c48f301ee6f460a2c336bba75a9863 Mon Sep 17 00:00:00 2001 From: Blake Thomas Williams <49404493+btw17@users.noreply.github.com> Date: Fri, 11 Nov 2022 15:42:09 -0600 Subject: [PATCH 05/73] chore: clean up field default values (#6613) --- core/field.ts | 17 ++++++++++++++--- core/field_angle.ts | 5 +---- core/field_checkbox.ts | 2 +- core/field_colour.ts | 5 +---- core/field_image.ts | 2 +- core/field_label.ts | 2 +- core/field_number.ts | 2 +- core/field_textinput.ts | 2 +- 8 files changed, 21 insertions(+), 16 deletions(-) diff --git a/core/field.ts b/core/field.ts index e89fac784..815ee6f9e 100644 --- a/core/field.ts +++ b/core/field.ts @@ -56,6 +56,17 @@ 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'; @@ -189,9 +200,9 @@ export abstract class Field implements IASTNodeLocationSvg, * 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); diff --git a/core/field_angle.ts b/core/field_angle.ts index 4d9012b36..b44d3e327 100644 --- a/core/field_angle.ts +++ b/core/field_angle.ts @@ -35,9 +35,6 @@ export type FieldAngleValidator = FieldInputValidator; * @alias Blockly.FieldAngle */ export class FieldAngle extends FieldInput { - /** The default value for this field. */ - // protected override DEFAULT_VALUE = 0; - /** * The default amount to round angles to when using a mouse or keyboard nav * input. Must be a positive integer to support keyboard navigation. @@ -518,7 +515,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. diff --git a/core/field_checkbox.ts b/core/field_checkbox.ts index f42039855..1007e1884 100644 --- a/core/field_checkbox.ts +++ b/core/field_checkbox.ts @@ -238,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 3964a6650..3d7273b8b 100644 --- a/core/field_colour.ts +++ b/core/field_colour.ts @@ -589,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_image.ts b/core/field_image.ts index 183b2dd2e..728be7e94 100644 --- a/core/field_image.ts +++ b/core/field_image.ts @@ -268,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_label.ts b/core/field_label.ts index 34222afd0..2a4730ff2 100644 --- a/core/field_label.ts +++ b/core/field_label.ts @@ -129,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_number.ts b/core/field_number.ts index ea305f1e9..b3e23d07c 100644 --- a/core/field_number.ts +++ b/core/field_number.ts @@ -322,7 +322,7 @@ export class FieldNumber extends FieldInput { fieldRegistry.register('field_number', FieldNumber); -(FieldNumber.prototype as AnyDuringMigration).DEFAULT_VALUE = 0; +FieldNumber.prototype.DEFAULT_VALUE = 0; /** * Config options for the number field. diff --git a/core/field_textinput.ts b/core/field_textinput.ts index 0c2788a15..2a2f1c6db 100644 --- a/core/field_textinput.ts +++ b/core/field_textinput.ts @@ -62,7 +62,7 @@ export class FieldTextInput extends FieldInput { fieldRegistry.register('field_input', FieldTextInput); -(FieldTextInput.prototype as AnyDuringMigration).DEFAULT_VALUE = ''; +FieldTextInput.prototype.DEFAULT_VALUE = ''; /** * fromJson config options for the text input field. From a600ad868c390d827f0a847c201dc1aa029536f6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 14 Nov 2022 08:14:41 -0800 Subject: [PATCH 06/73] chore(deps): bump webdriverio from 7.25.2 to 7.26.0 (#6618) Bumps [webdriverio](https://github.com/webdriverio/webdriverio) from 7.25.2 to 7.26.0. - [Release notes](https://github.com/webdriverio/webdriverio/releases) - [Changelog](https://github.com/webdriverio/webdriverio/blob/v7.26.0/CHANGELOG.md) - [Commits](https://github.com/webdriverio/webdriverio/compare/v7.25.2...v7.26.0) --- updated-dependencies: - dependency-name: webdriverio dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 424 +++++++++++++++++++++++----------------------- 1 file changed, 212 insertions(+), 212 deletions(-) diff --git a/package-lock.json b/package-lock.json index d8c7e4b14..32a32d06c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1784,27 +1784,27 @@ } }, "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==", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@wdio/repl/-/repl-7.26.0.tgz", + "integrity": "sha512-2YxbXNfYVGVLrffUJzl/l5s8FziDPl917eLP62gkEH/H5IV27Pnwx3Iyu0KOEaBzgntnURANlwhCZFXQ4OPq8Q==", "dev": true, "dependencies": { - "@wdio/utils": "7.25.1" + "@wdio/utils": "7.26.0" }, "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": "18.11.9", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.9.tgz", + "integrity": "sha512-CRpX21/kGdzjOpFsZSkcrXMGIBWMGNIHXXBVFSH+ggkftxg+XYP20TESbh+zFvFj3EQOl5byk0HTRn1IL6hbqg==", "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==", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@wdio/logger/-/logger-7.26.0.tgz", + "integrity": "sha512-kQj9s5JudAG9qB+zAAcYGPHVfATl2oqKgqj47yjehOQ1zzG33xmtL1ArFbQKWhDG32y1A8sN6b0pIqBEIwgg8Q==", "dev": true, "dependencies": { "chalk": "^4.0.0", @@ -1817,9 +1817,9 @@ } }, "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==", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@wdio/types/-/types-7.26.0.tgz", + "integrity": "sha512-mOTfWAGQ+iT58iaZhJMwlUkdEn3XEWE4jthysMLXFnSuZ2eaODVAiK31SmlS/eUqgSIaupeGqYUrtCuSNbLefg==", "dev": true, "dependencies": { "@types/node": "^18.0.0", @@ -1838,13 +1838,13 @@ } }, "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==", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@wdio/utils/-/utils-7.26.0.tgz", + "integrity": "sha512-pVq2MPXZAYLkKGKIIHktHejnHqg4TYKoNYSi2EDv+I3GlT8VZKXHazKhci82ov0tD+GdF27+s4DWNDCfGYfBdQ==", "dev": true, "dependencies": { - "@wdio/logger": "7.19.0", - "@wdio/types": "7.25.1", + "@wdio/logger": "7.26.0", + "@wdio/types": "7.26.0", "p-iteration": "^1.1.8" }, "engines": { @@ -4234,18 +4234,18 @@ } }, "node_modules/devtools": { - "version": "7.25.1", - "resolved": "https://registry.npmjs.org/devtools/-/devtools-7.25.1.tgz", - "integrity": "sha512-01T8QZeiD92MpI/7rP8kUflN3XcMqv2moa07123OjjENuuOhYxRWmJ7xj94txnF5PJp1Cv8/jvK8EUbnEHf6MQ==", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/devtools/-/devtools-7.26.0.tgz", + "integrity": "sha512-+8HNbNpzgo4Sn+WcrvXuwsHW9XPJfLo4bs9lgs6DPJHIIDXYJXQGsd7940wMX0Rp0D2vHXA4ibK0oTI5rogM3Q==", "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/config": "7.26.0", + "@wdio/logger": "7.26.0", "@wdio/protocols": "7.22.0", - "@wdio/types": "7.25.1", - "@wdio/utils": "7.25.1", + "@wdio/types": "7.26.0", + "@wdio/utils": "7.26.0", "chrome-launcher": "^0.15.0", "edge-paths": "^2.1.0", "puppeteer-core": "^13.1.3", @@ -4258,26 +4258,26 @@ } }, "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==", + "version": "0.0.1069585", + "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1069585.tgz", + "integrity": "sha512-sHmkZB6immWQWU4Wx3ogXwxjQUvQc92MmUDL52+q1z2hQmvpOcvDmbsjwX7QZOPTA32dMV7fgT6zUytcpPzy4A==", "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": "18.11.9", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.9.tgz", + "integrity": "sha512-CRpX21/kGdzjOpFsZSkcrXMGIBWMGNIHXXBVFSH+ggkftxg+XYP20TESbh+zFvFj3EQOl5byk0HTRn1IL6hbqg==", "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": "7.26.0", + "resolved": "https://registry.npmjs.org/@wdio/config/-/config-7.26.0.tgz", + "integrity": "sha512-GO6kFGgFrx2Hiq+Ww6V9I7cZfShPjfPVhPy3uXnKN2B4FilX8ilLAp5cIFuMuHPeOQq0crYX9cnLYXka6dCGgg==", "dev": true, "dependencies": { - "@wdio/logger": "7.19.0", - "@wdio/types": "7.25.1", - "@wdio/utils": "7.25.1", + "@wdio/logger": "7.26.0", + "@wdio/types": "7.26.0", + "@wdio/utils": "7.26.0", "deepmerge": "^4.0.0", "glob": "^8.0.3" }, @@ -4286,9 +4286,9 @@ } }, "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==", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@wdio/logger/-/logger-7.26.0.tgz", + "integrity": "sha512-kQj9s5JudAG9qB+zAAcYGPHVfATl2oqKgqj47yjehOQ1zzG33xmtL1ArFbQKWhDG32y1A8sN6b0pIqBEIwgg8Q==", "dev": true, "dependencies": { "chalk": "^4.0.0", @@ -4310,9 +4310,9 @@ } }, "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": "7.26.0", + "resolved": "https://registry.npmjs.org/@wdio/types/-/types-7.26.0.tgz", + "integrity": "sha512-mOTfWAGQ+iT58iaZhJMwlUkdEn3XEWE4jthysMLXFnSuZ2eaODVAiK31SmlS/eUqgSIaupeGqYUrtCuSNbLefg==", "dev": true, "dependencies": { "@types/node": "^18.0.0", @@ -4331,13 +4331,13 @@ } }, "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": "7.26.0", + "resolved": "https://registry.npmjs.org/@wdio/utils/-/utils-7.26.0.tgz", + "integrity": "sha512-pVq2MPXZAYLkKGKIIHktHejnHqg4TYKoNYSi2EDv+I3GlT8VZKXHazKhci82ov0tD+GdF27+s4DWNDCfGYfBdQ==", "dev": true, "dependencies": { - "@wdio/logger": "7.19.0", - "@wdio/types": "7.25.1", + "@wdio/logger": "7.26.0", + "@wdio/types": "7.26.0", "p-iteration": "^1.1.8" }, "engines": { @@ -13372,17 +13372,17 @@ } }, "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": "7.26.0", + "resolved": "https://registry.npmjs.org/webdriver/-/webdriver-7.26.0.tgz", + "integrity": "sha512-T21T31wq29D/rmpFHcAahhdrvfsfXsLs/LBe2su7wL725ptOEoSssuDXjXMkwjf9MSUIXnTcUIz8oJGbKRUMwQ==", "dev": true, "dependencies": { "@types/node": "^18.0.0", - "@wdio/config": "7.25.1", - "@wdio/logger": "7.19.0", + "@wdio/config": "7.26.0", + "@wdio/logger": "7.26.0", "@wdio/protocols": "7.22.0", - "@wdio/types": "7.25.1", - "@wdio/utils": "7.25.1", + "@wdio/types": "7.26.0", + "@wdio/utils": "7.26.0", "got": "^11.0.2", "ky": "0.30.0", "lodash.merge": "^4.6.1" @@ -13392,20 +13392,20 @@ } }, "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==", + "version": "18.11.9", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.9.tgz", + "integrity": "sha512-CRpX21/kGdzjOpFsZSkcrXMGIBWMGNIHXXBVFSH+ggkftxg+XYP20TESbh+zFvFj3EQOl5byk0HTRn1IL6hbqg==", "dev": true }, "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": "7.26.0", + "resolved": "https://registry.npmjs.org/@wdio/config/-/config-7.26.0.tgz", + "integrity": "sha512-GO6kFGgFrx2Hiq+Ww6V9I7cZfShPjfPVhPy3uXnKN2B4FilX8ilLAp5cIFuMuHPeOQq0crYX9cnLYXka6dCGgg==", "dev": true, "dependencies": { - "@wdio/logger": "7.19.0", - "@wdio/types": "7.25.1", - "@wdio/utils": "7.25.1", + "@wdio/logger": "7.26.0", + "@wdio/types": "7.26.0", + "@wdio/utils": "7.26.0", "deepmerge": "^4.0.0", "glob": "^8.0.3" }, @@ -13414,9 +13414,9 @@ } }, "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==", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@wdio/logger/-/logger-7.26.0.tgz", + "integrity": "sha512-kQj9s5JudAG9qB+zAAcYGPHVfATl2oqKgqj47yjehOQ1zzG33xmtL1ArFbQKWhDG32y1A8sN6b0pIqBEIwgg8Q==", "dev": true, "dependencies": { "chalk": "^4.0.0", @@ -13438,9 +13438,9 @@ } }, "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": "7.26.0", + "resolved": "https://registry.npmjs.org/@wdio/types/-/types-7.26.0.tgz", + "integrity": "sha512-mOTfWAGQ+iT58iaZhJMwlUkdEn3XEWE4jthysMLXFnSuZ2eaODVAiK31SmlS/eUqgSIaupeGqYUrtCuSNbLefg==", "dev": true, "dependencies": { "@types/node": "^18.0.0", @@ -13459,13 +13459,13 @@ } }, "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": "7.26.0", + "resolved": "https://registry.npmjs.org/@wdio/utils/-/utils-7.26.0.tgz", + "integrity": "sha512-pVq2MPXZAYLkKGKIIHktHejnHqg4TYKoNYSi2EDv+I3GlT8VZKXHazKhci82ov0tD+GdF27+s4DWNDCfGYfBdQ==", "dev": true, "dependencies": { - "@wdio/logger": "7.19.0", - "@wdio/types": "7.25.1", + "@wdio/logger": "7.26.0", + "@wdio/types": "7.26.0", "p-iteration": "^1.1.8" }, "engines": { @@ -13525,25 +13525,25 @@ } }, "node_modules/webdriverio": { - "version": "7.25.2", - "resolved": "https://registry.npmjs.org/webdriverio/-/webdriverio-7.25.2.tgz", - "integrity": "sha512-lZwHh1G2Zxg4LmVQZZZNhKAqjGoSxoDaqlAf0ojh/3DcWVxMpFtaj0mksrqCyVhObudb2dopOX26beWPyKwL4A==", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/webdriverio/-/webdriverio-7.26.0.tgz", + "integrity": "sha512-7m9TeP871aYxZYKBI4GDh5aQZLN9Fd/PASu5K/jEIT65J4OBB6g5ZaycGFOmfNHCfjWKjwPXZuKiN1f2mcrcRg==", "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/config": "7.26.0", + "@wdio/logger": "7.26.0", "@wdio/protocols": "7.22.0", - "@wdio/repl": "7.25.1", - "@wdio/types": "7.25.1", - "@wdio/utils": "7.25.1", + "@wdio/repl": "7.26.0", + "@wdio/types": "7.26.0", + "@wdio/utils": "7.26.0", "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", + "devtools": "7.26.0", + "devtools-protocol": "^0.0.1069585", "fs-extra": "^10.0.0", "grapheme-splitter": "^1.0.2", "lodash.clonedeep": "^4.5.0", @@ -13556,27 +13556,27 @@ "resq": "^1.9.1", "rgb2hex": "0.2.5", "serialize-error": "^8.0.0", - "webdriver": "7.25.1" + "webdriver": "7.26.0" }, "engines": { "node": ">=12.0.0" } }, "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==", + "version": "18.11.9", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.9.tgz", + "integrity": "sha512-CRpX21/kGdzjOpFsZSkcrXMGIBWMGNIHXXBVFSH+ggkftxg+XYP20TESbh+zFvFj3EQOl5byk0HTRn1IL6hbqg==", "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": "7.26.0", + "resolved": "https://registry.npmjs.org/@wdio/config/-/config-7.26.0.tgz", + "integrity": "sha512-GO6kFGgFrx2Hiq+Ww6V9I7cZfShPjfPVhPy3uXnKN2B4FilX8ilLAp5cIFuMuHPeOQq0crYX9cnLYXka6dCGgg==", "dev": true, "dependencies": { - "@wdio/logger": "7.19.0", - "@wdio/types": "7.25.1", - "@wdio/utils": "7.25.1", + "@wdio/logger": "7.26.0", + "@wdio/types": "7.26.0", + "@wdio/utils": "7.26.0", "deepmerge": "^4.0.0", "glob": "^8.0.3" }, @@ -13585,9 +13585,9 @@ } }, "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==", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@wdio/logger/-/logger-7.26.0.tgz", + "integrity": "sha512-kQj9s5JudAG9qB+zAAcYGPHVfATl2oqKgqj47yjehOQ1zzG33xmtL1ArFbQKWhDG32y1A8sN6b0pIqBEIwgg8Q==", "dev": true, "dependencies": { "chalk": "^4.0.0", @@ -13609,9 +13609,9 @@ } }, "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": "7.26.0", + "resolved": "https://registry.npmjs.org/@wdio/types/-/types-7.26.0.tgz", + "integrity": "sha512-mOTfWAGQ+iT58iaZhJMwlUkdEn3XEWE4jthysMLXFnSuZ2eaODVAiK31SmlS/eUqgSIaupeGqYUrtCuSNbLefg==", "dev": true, "dependencies": { "@types/node": "^18.0.0", @@ -13630,13 +13630,13 @@ } }, "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": "7.26.0", + "resolved": "https://registry.npmjs.org/@wdio/utils/-/utils-7.26.0.tgz", + "integrity": "sha512-pVq2MPXZAYLkKGKIIHktHejnHqg4TYKoNYSi2EDv+I3GlT8VZKXHazKhci82ov0tD+GdF27+s4DWNDCfGYfBdQ==", "dev": true, "dependencies": { - "@wdio/logger": "7.19.0", - "@wdio/types": "7.25.1", + "@wdio/logger": "7.26.0", + "@wdio/types": "7.26.0", "p-iteration": "^1.1.8" }, "engines": { @@ -15497,24 +15497,24 @@ "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==", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@wdio/repl/-/repl-7.26.0.tgz", + "integrity": "sha512-2YxbXNfYVGVLrffUJzl/l5s8FziDPl917eLP62gkEH/H5IV27Pnwx3Iyu0KOEaBzgntnURANlwhCZFXQ4OPq8Q==", "dev": true, "requires": { - "@wdio/utils": "7.25.1" + "@wdio/utils": "7.26.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==", + "version": "18.11.9", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.9.tgz", + "integrity": "sha512-CRpX21/kGdzjOpFsZSkcrXMGIBWMGNIHXXBVFSH+ggkftxg+XYP20TESbh+zFvFj3EQOl5byk0HTRn1IL6hbqg==", "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==", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@wdio/logger/-/logger-7.26.0.tgz", + "integrity": "sha512-kQj9s5JudAG9qB+zAAcYGPHVfATl2oqKgqj47yjehOQ1zzG33xmtL1ArFbQKWhDG32y1A8sN6b0pIqBEIwgg8Q==", "dev": true, "requires": { "chalk": "^4.0.0", @@ -15524,9 +15524,9 @@ } }, "@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": "7.26.0", + "resolved": "https://registry.npmjs.org/@wdio/types/-/types-7.26.0.tgz", + "integrity": "sha512-mOTfWAGQ+iT58iaZhJMwlUkdEn3XEWE4jthysMLXFnSuZ2eaODVAiK31SmlS/eUqgSIaupeGqYUrtCuSNbLefg==", "dev": true, "requires": { "@types/node": "^18.0.0", @@ -15534,13 +15534,13 @@ } }, "@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": "7.26.0", + "resolved": "https://registry.npmjs.org/@wdio/utils/-/utils-7.26.0.tgz", + "integrity": "sha512-pVq2MPXZAYLkKGKIIHktHejnHqg4TYKoNYSi2EDv+I3GlT8VZKXHazKhci82ov0tD+GdF27+s4DWNDCfGYfBdQ==", "dev": true, "requires": { - "@wdio/logger": "7.19.0", - "@wdio/types": "7.25.1", + "@wdio/logger": "7.26.0", + "@wdio/types": "7.26.0", "p-iteration": "^1.1.8" } } @@ -17391,18 +17391,18 @@ "dev": true }, "devtools": { - "version": "7.25.1", - "resolved": "https://registry.npmjs.org/devtools/-/devtools-7.25.1.tgz", - "integrity": "sha512-01T8QZeiD92MpI/7rP8kUflN3XcMqv2moa07123OjjENuuOhYxRWmJ7xj94txnF5PJp1Cv8/jvK8EUbnEHf6MQ==", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/devtools/-/devtools-7.26.0.tgz", + "integrity": "sha512-+8HNbNpzgo4Sn+WcrvXuwsHW9XPJfLo4bs9lgs6DPJHIIDXYJXQGsd7940wMX0Rp0D2vHXA4ibK0oTI5rogM3Q==", "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/config": "7.26.0", + "@wdio/logger": "7.26.0", "@wdio/protocols": "7.22.0", - "@wdio/types": "7.25.1", - "@wdio/utils": "7.25.1", + "@wdio/types": "7.26.0", + "@wdio/utils": "7.26.0", "chrome-launcher": "^0.15.0", "edge-paths": "^2.1.0", "puppeteer-core": "^13.1.3", @@ -17412,28 +17412,28 @@ }, "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==", + "version": "18.11.9", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.9.tgz", + "integrity": "sha512-CRpX21/kGdzjOpFsZSkcrXMGIBWMGNIHXXBVFSH+ggkftxg+XYP20TESbh+zFvFj3EQOl5byk0HTRn1IL6hbqg==", "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": "7.26.0", + "resolved": "https://registry.npmjs.org/@wdio/config/-/config-7.26.0.tgz", + "integrity": "sha512-GO6kFGgFrx2Hiq+Ww6V9I7cZfShPjfPVhPy3uXnKN2B4FilX8ilLAp5cIFuMuHPeOQq0crYX9cnLYXka6dCGgg==", "dev": true, "requires": { - "@wdio/logger": "7.19.0", - "@wdio/types": "7.25.1", - "@wdio/utils": "7.25.1", + "@wdio/logger": "7.26.0", + "@wdio/types": "7.26.0", + "@wdio/utils": "7.26.0", "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==", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@wdio/logger/-/logger-7.26.0.tgz", + "integrity": "sha512-kQj9s5JudAG9qB+zAAcYGPHVfATl2oqKgqj47yjehOQ1zzG33xmtL1ArFbQKWhDG32y1A8sN6b0pIqBEIwgg8Q==", "dev": true, "requires": { "chalk": "^4.0.0", @@ -17449,9 +17449,9 @@ "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": "7.26.0", + "resolved": "https://registry.npmjs.org/@wdio/types/-/types-7.26.0.tgz", + "integrity": "sha512-mOTfWAGQ+iT58iaZhJMwlUkdEn3XEWE4jthysMLXFnSuZ2eaODVAiK31SmlS/eUqgSIaupeGqYUrtCuSNbLefg==", "dev": true, "requires": { "@types/node": "^18.0.0", @@ -17459,13 +17459,13 @@ } }, "@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": "7.26.0", + "resolved": "https://registry.npmjs.org/@wdio/utils/-/utils-7.26.0.tgz", + "integrity": "sha512-pVq2MPXZAYLkKGKIIHktHejnHqg4TYKoNYSi2EDv+I3GlT8VZKXHazKhci82ov0tD+GdF27+s4DWNDCfGYfBdQ==", "dev": true, "requires": { - "@wdio/logger": "7.19.0", - "@wdio/types": "7.25.1", + "@wdio/logger": "7.26.0", + "@wdio/types": "7.26.0", "p-iteration": "^1.1.8" } }, @@ -17509,9 +17509,9 @@ } }, "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.1069585", + "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1069585.tgz", + "integrity": "sha512-sHmkZB6immWQWU4Wx3ogXwxjQUvQc92MmUDL52+q1z2hQmvpOcvDmbsjwX7QZOPTA32dMV7fgT6zUytcpPzy4A==", "dev": true }, "dir-glob": { @@ -24761,45 +24761,45 @@ } }, "webdriver": { - "version": "7.25.1", - "resolved": "https://registry.npmjs.org/webdriver/-/webdriver-7.25.1.tgz", - "integrity": "sha512-BmR5RT37EGNJj/O/GTCqBKXV/Jr9V4oQTTDaurZixVKW0ubG7uyfrhiklzuWUtmES9VualTKgQumhGhchBTC6g==", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/webdriver/-/webdriver-7.26.0.tgz", + "integrity": "sha512-T21T31wq29D/rmpFHcAahhdrvfsfXsLs/LBe2su7wL725ptOEoSssuDXjXMkwjf9MSUIXnTcUIz8oJGbKRUMwQ==", "dev": true, "requires": { "@types/node": "^18.0.0", - "@wdio/config": "7.25.1", - "@wdio/logger": "7.19.0", + "@wdio/config": "7.26.0", + "@wdio/logger": "7.26.0", "@wdio/protocols": "7.22.0", - "@wdio/types": "7.25.1", - "@wdio/utils": "7.25.1", + "@wdio/types": "7.26.0", + "@wdio/utils": "7.26.0", "got": "^11.0.2", "ky": "0.30.0", "lodash.merge": "^4.6.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==", + "version": "18.11.9", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.9.tgz", + "integrity": "sha512-CRpX21/kGdzjOpFsZSkcrXMGIBWMGNIHXXBVFSH+ggkftxg+XYP20TESbh+zFvFj3EQOl5byk0HTRn1IL6hbqg==", "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": "7.26.0", + "resolved": "https://registry.npmjs.org/@wdio/config/-/config-7.26.0.tgz", + "integrity": "sha512-GO6kFGgFrx2Hiq+Ww6V9I7cZfShPjfPVhPy3uXnKN2B4FilX8ilLAp5cIFuMuHPeOQq0crYX9cnLYXka6dCGgg==", "dev": true, "requires": { - "@wdio/logger": "7.19.0", - "@wdio/types": "7.25.1", - "@wdio/utils": "7.25.1", + "@wdio/logger": "7.26.0", + "@wdio/types": "7.26.0", + "@wdio/utils": "7.26.0", "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==", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@wdio/logger/-/logger-7.26.0.tgz", + "integrity": "sha512-kQj9s5JudAG9qB+zAAcYGPHVfATl2oqKgqj47yjehOQ1zzG33xmtL1ArFbQKWhDG32y1A8sN6b0pIqBEIwgg8Q==", "dev": true, "requires": { "chalk": "^4.0.0", @@ -24815,9 +24815,9 @@ "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": "7.26.0", + "resolved": "https://registry.npmjs.org/@wdio/types/-/types-7.26.0.tgz", + "integrity": "sha512-mOTfWAGQ+iT58iaZhJMwlUkdEn3XEWE4jthysMLXFnSuZ2eaODVAiK31SmlS/eUqgSIaupeGqYUrtCuSNbLefg==", "dev": true, "requires": { "@types/node": "^18.0.0", @@ -24825,13 +24825,13 @@ } }, "@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": "7.26.0", + "resolved": "https://registry.npmjs.org/@wdio/utils/-/utils-7.26.0.tgz", + "integrity": "sha512-pVq2MPXZAYLkKGKIIHktHejnHqg4TYKoNYSi2EDv+I3GlT8VZKXHazKhci82ov0tD+GdF27+s4DWNDCfGYfBdQ==", "dev": true, "requires": { - "@wdio/logger": "7.19.0", - "@wdio/types": "7.25.1", + "@wdio/logger": "7.26.0", + "@wdio/types": "7.26.0", "p-iteration": "^1.1.8" } }, @@ -24875,25 +24875,25 @@ } }, "webdriverio": { - "version": "7.25.2", - "resolved": "https://registry.npmjs.org/webdriverio/-/webdriverio-7.25.2.tgz", - "integrity": "sha512-lZwHh1G2Zxg4LmVQZZZNhKAqjGoSxoDaqlAf0ojh/3DcWVxMpFtaj0mksrqCyVhObudb2dopOX26beWPyKwL4A==", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/webdriverio/-/webdriverio-7.26.0.tgz", + "integrity": "sha512-7m9TeP871aYxZYKBI4GDh5aQZLN9Fd/PASu5K/jEIT65J4OBB6g5ZaycGFOmfNHCfjWKjwPXZuKiN1f2mcrcRg==", "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/config": "7.26.0", + "@wdio/logger": "7.26.0", "@wdio/protocols": "7.22.0", - "@wdio/repl": "7.25.1", - "@wdio/types": "7.25.1", - "@wdio/utils": "7.25.1", + "@wdio/repl": "7.26.0", + "@wdio/types": "7.26.0", + "@wdio/utils": "7.26.0", "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", + "devtools": "7.26.0", + "devtools-protocol": "^0.0.1069585", "fs-extra": "^10.0.0", "grapheme-splitter": "^1.0.2", "lodash.clonedeep": "^4.5.0", @@ -24906,32 +24906,32 @@ "resq": "^1.9.1", "rgb2hex": "0.2.5", "serialize-error": "^8.0.0", - "webdriver": "7.25.1" + "webdriver": "7.26.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==", + "version": "18.11.9", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.9.tgz", + "integrity": "sha512-CRpX21/kGdzjOpFsZSkcrXMGIBWMGNIHXXBVFSH+ggkftxg+XYP20TESbh+zFvFj3EQOl5byk0HTRn1IL6hbqg==", "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": "7.26.0", + "resolved": "https://registry.npmjs.org/@wdio/config/-/config-7.26.0.tgz", + "integrity": "sha512-GO6kFGgFrx2Hiq+Ww6V9I7cZfShPjfPVhPy3uXnKN2B4FilX8ilLAp5cIFuMuHPeOQq0crYX9cnLYXka6dCGgg==", "dev": true, "requires": { - "@wdio/logger": "7.19.0", - "@wdio/types": "7.25.1", - "@wdio/utils": "7.25.1", + "@wdio/logger": "7.26.0", + "@wdio/types": "7.26.0", + "@wdio/utils": "7.26.0", "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==", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@wdio/logger/-/logger-7.26.0.tgz", + "integrity": "sha512-kQj9s5JudAG9qB+zAAcYGPHVfATl2oqKgqj47yjehOQ1zzG33xmtL1ArFbQKWhDG32y1A8sN6b0pIqBEIwgg8Q==", "dev": true, "requires": { "chalk": "^4.0.0", @@ -24947,9 +24947,9 @@ "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": "7.26.0", + "resolved": "https://registry.npmjs.org/@wdio/types/-/types-7.26.0.tgz", + "integrity": "sha512-mOTfWAGQ+iT58iaZhJMwlUkdEn3XEWE4jthysMLXFnSuZ2eaODVAiK31SmlS/eUqgSIaupeGqYUrtCuSNbLefg==", "dev": true, "requires": { "@types/node": "^18.0.0", @@ -24957,13 +24957,13 @@ } }, "@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": "7.26.0", + "resolved": "https://registry.npmjs.org/@wdio/utils/-/utils-7.26.0.tgz", + "integrity": "sha512-pVq2MPXZAYLkKGKIIHktHejnHqg4TYKoNYSi2EDv+I3GlT8VZKXHazKhci82ov0tD+GdF27+s4DWNDCfGYfBdQ==", "dev": true, "requires": { - "@wdio/logger": "7.19.0", - "@wdio/types": "7.25.1", + "@wdio/logger": "7.26.0", + "@wdio/types": "7.26.0", "p-iteration": "^1.1.8" } }, From 6122ab22c4207d30681dfb6a3a96588419a9b980 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 14 Nov 2022 08:15:03 -0800 Subject: [PATCH 07/73] chore(deps): bump selenium-standalone from 8.2.2 to 8.2.3 (#6617) Bumps [selenium-standalone](https://github.com/webdriverio/selenium-standalone) from 8.2.2 to 8.2.3. - [Release notes](https://github.com/webdriverio/selenium-standalone/releases) - [Changelog](https://github.com/webdriverio/selenium-standalone/blob/main/HISTORY.md) - [Commits](https://github.com/webdriverio/selenium-standalone/compare/v8.2.2...v8.2.3) --- updated-dependencies: - dependency-name: selenium-standalone dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index 32a32d06c..66d7665e3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11615,9 +11615,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.3", + "resolved": "https://registry.npmjs.org/selenium-standalone/-/selenium-standalone-8.2.3.tgz", + "integrity": "sha512-WNiVh6uNwgXjM04NzsDgm5hWJGSmAI7fU5vCMWmb9AslQaoFDhvFgLE8wfp+nhdizqCW1bDTCZl3BnNHdaZG8g==", "dev": true, "dependencies": { "commander": "^9.0.0", @@ -23303,9 +23303,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.3", + "resolved": "https://registry.npmjs.org/selenium-standalone/-/selenium-standalone-8.2.3.tgz", + "integrity": "sha512-WNiVh6uNwgXjM04NzsDgm5hWJGSmAI7fU5vCMWmb9AslQaoFDhvFgLE8wfp+nhdizqCW1bDTCZl3BnNHdaZG8g==", "dev": true, "requires": { "commander": "^9.0.0", From f64c934f04d7fed1f4dcd89bf528b95662ae59b3 Mon Sep 17 00:00:00 2001 From: Beka Westberg Date: Mon, 14 Nov 2022 11:07:36 -0800 Subject: [PATCH 08/73] feat: refactor event serialization to use static fromJson method (#6614) * feat: add new path for deserialization of events * chore: add tests for round-tripping events * chore: add static fromJson methods to all events * chore: add inline docs to new static methods * chore: add deprecation warnings * chore: cleanup * chore: add deprecation and docs to abstract * chore: format * chore: cleanup from rebase * chore: update docs comment --- core/events/events_abstract.ts | 32 +++++++++- core/events/events_block_base.ts | 26 +++++++- core/events/events_block_change.ts | 26 ++++++++ core/events/events_block_create.ts | 28 +++++++++ core/events/events_block_delete.ts | 30 +++++++++ core/events/events_block_drag.ts | 24 +++++++ core/events/events_block_move.ts | 51 +++++++++++++++ core/events/events_bubble_open.ts | 25 ++++++++ core/events/events_click.ts | 22 +++++++ core/events/events_comment_base.ts | 23 +++++++ core/events/events_comment_change.ts | 24 +++++++ core/events/events_comment_create.ts | 23 +++++++ core/events/events_comment_delete.ts | 42 ++++++++++++- core/events/events_comment_move.ts | 26 ++++++++ core/events/events_marker_move.ts | 25 ++++++++ core/events/events_selected.ts | 23 +++++++ core/events/events_theme_change.ts | 23 +++++++ core/events/events_toolbox_item_select.ts | 25 ++++++++ core/events/events_trashcan_open.ts | 23 +++++++ core/events/events_var_base.ts | 22 +++++++ core/events/events_var_create.ts | 23 +++++++ core/events/events_var_delete.ts | 23 +++++++ core/events/events_var_rename.ts | 23 +++++++ core/events/events_viewport.ts | 26 ++++++++ core/events/utils.ts | 22 ++++++- ...ent_test.js => event_block_change_test.js} | 26 +++++++- ...ent_test.js => event_block_create_test.js} | 34 ++++++---- ...ent_test.js => event_block_delete_test.js} | 18 +++++- tests/mocha/event_block_drag_test.js | 35 +++++++++++ tests/mocha/event_block_move_test.js | 38 ++++++++++++ tests/mocha/event_bubble_open_test.js | 39 ++++++++++++ tests/mocha/event_click_test.js | 37 +++++++++++ tests/mocha/event_comment_change_test.js | 35 +++++++++++ tests/mocha/event_comment_create_test.js | 37 +++++++++++ tests/mocha/event_comment_delete_test.js | 37 +++++++++++ tests/mocha/event_comment_move_test.js | 39 ++++++++++++ tests/mocha/event_marker_move_test.js | 39 ++++++++++++ tests/mocha/event_selected_test.js | 38 ++++++++++++ tests/mocha/event_test.js | 8 ++- tests/mocha/event_theme_change_test.js | 34 ++++++++++ tests/mocha/event_toolbox_item_select_test.js | 62 +++++++++++++++++++ tests/mocha/event_trashcan_open_test.js | 34 ++++++++++ tests/mocha/event_var_create_test.js | 35 +++++++++++ tests/mocha/event_var_delete_test.js | 34 ++++++++++ tests/mocha/event_var_rename_test.js | 34 ++++++++++ tests/mocha/event_viewport_test.js | 34 ++++++++++ tests/mocha/index.html | 23 ++++++- tests/mocha/mutator_test.js | 1 - 48 files changed, 1382 insertions(+), 29 deletions(-) rename tests/mocha/{block_change_event_test.js => event_block_change_test.js} (74%) rename tests/mocha/{block_create_event_test.js => event_block_create_test.js} (59%) rename tests/mocha/{block_delete_event_test.js => event_block_delete_test.js} (61%) create mode 100644 tests/mocha/event_block_drag_test.js create mode 100644 tests/mocha/event_block_move_test.js create mode 100644 tests/mocha/event_bubble_open_test.js create mode 100644 tests/mocha/event_click_test.js create mode 100644 tests/mocha/event_comment_change_test.js create mode 100644 tests/mocha/event_comment_create_test.js create mode 100644 tests/mocha/event_comment_delete_test.js create mode 100644 tests/mocha/event_comment_move_test.js create mode 100644 tests/mocha/event_marker_move_test.js create mode 100644 tests/mocha/event_selected_test.js create mode 100644 tests/mocha/event_theme_change_test.js create mode 100644 tests/mocha/event_toolbox_item_select_test.js create mode 100644 tests/mocha/event_trashcan_open_test.js create mode 100644 tests/mocha/event_var_create_test.js create mode 100644 tests/mocha/event_var_delete_test.js create mode 100644 tests/mocha/event_var_rename_test.js create mode 100644 tests/mocha/event_viewport_test.js diff --git a/core/events/events_abstract.ts b/core/events/events_abstract.ts index 78e4bd8b7..dab2c8c00 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. + } + /** * 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_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 9bd4ea381..9ac08b9fc 100644 --- a/core/events/utils.ts +++ b/core/events/utils.ts @@ -518,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/tests/mocha/block_change_event_test.js b/tests/mocha/event_block_change_test.js similarity index 74% rename from tests/mocha/block_change_event_test.js rename to tests/mocha/event_block_change_test.js index 8574c1f68..6b6ff89b1 100644 --- a/tests/mocha/block_change_event_test.js +++ b/tests/mocha/event_block_change_test.js @@ -4,7 +4,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -goog.declareModuleId('Blockly.test.blockChangeEvent'); +goog.declareModuleId('Blockly.test.eventBlockChange'); import {sharedTestSetup, sharedTestTeardown} from './test_helpers/setup_teardown.js'; import {defineMutatorBlocks} from './test_helpers/block_definitions.js'; @@ -71,4 +71,28 @@ suite('Block Change Event', function() { }); }); }); + + suite('Serialization', function() { + setup(function() { + defineMutatorBlocks(); + }); + + teardown(function() { + Blockly.Extensions.unregister('xml_mutator'); + Blockly.Extensions.unregister('jso_mutator'); + }); + + test('events round-trip through JSON', function() { + const block = this.workspace.newBlock('xml_block', 'block_id'); + block.domToMutation( + Blockly.Xml.textToDom('')); + const origEvent = new Blockly.Events.BlockChange( + block, 'mutation', null, '', ''); + + const json = origEvent.toJson(); + const newEvent = new Blockly.Events.fromJson(json, this.workspace); + + chai.assert.deepEqual(newEvent, origEvent); + }); + }); }); diff --git a/tests/mocha/block_create_event_test.js b/tests/mocha/event_block_create_test.js similarity index 59% rename from tests/mocha/block_create_event_test.js rename to tests/mocha/event_block_create_test.js index ddbb84d53..9c8ad524e 100644 --- a/tests/mocha/block_create_event_test.js +++ b/tests/mocha/event_block_create_test.js @@ -4,16 +4,18 @@ * SPDX-License-Identifier: Apache-2.0 */ -goog.declareModuleId('Blockly.test.blockCreateEvent'); +goog.declareModuleId('Blockly.test.eventBlockCreate'); import {assertEventFired} from './test_helpers/events.js'; import * as eventUtils from '../../build/src/core/events/utils.js'; import {sharedTestSetup, sharedTestTeardown} from './test_helpers/setup_teardown.js'; +import {defineRowBlock} from './test_helpers/block_definitions.js'; suite('Block Create Event', function() { setup(function() { sharedTestSetup.call(this); + defineRowBlock(); this.workspace = new Blockly.Workspace(); }); @@ -25,28 +27,22 @@ suite('Block Create Event', function() { Blockly.Events.disable(); const block = Blockly.serialization.blocks.append( { - "type": "text_print", + "type": "row_block", "inputs": { - "TEXT": { + "INPUT": { "shadow": { - "type": "text", + "type": "row_block", "id": "shadowId", - "fields": { - "TEXT": "abc", - }, }, "block": { - "type": "text", - "fields": { - "TEXT": "", - }, + "type": "row_block", }, }, }, }, this.workspace); Blockly.Events.enable(); - block.getInput('TEXT').connection.disconnect(); + block.getInput('INPUT').connection.disconnect(); assertEventFired( this.eventsFireStub, Blockly.Events.BlockCreate, @@ -57,4 +53,18 @@ suite('Block Create Event', function() { const event = calls[calls.length - 1].args[0]; chai.assert.equal(event.xml.tagName, 'shadow'); }); + + suite('Serialization', function() { + test('events round-trip through JSON', function() { + const block = this.workspace.newBlock('row_block', 'block_id'); + const origEvent = new Blockly.Events.BlockCreate(block); + + const json = origEvent.toJson(); + const newEvent = new Blockly.Events.fromJson(json, this.workspace); + delete origEvent.xml; // xml fails deep equals for some reason. + delete newEvent.xml; // xml fails deep equals for some reason. + + chai.assert.deepEqual(newEvent, origEvent); + }); + }); }); diff --git a/tests/mocha/block_delete_event_test.js b/tests/mocha/event_block_delete_test.js similarity index 61% rename from tests/mocha/block_delete_event_test.js rename to tests/mocha/event_block_delete_test.js index c4bef949d..4f03f6629 100644 --- a/tests/mocha/block_delete_event_test.js +++ b/tests/mocha/event_block_delete_test.js @@ -4,14 +4,16 @@ * SPDX-License-Identifier: Apache-2.0 */ -goog.declareModuleId('Blockly.test.blockDeleteEvent'); +goog.declareModuleId('Blockly.test.eventBlockDelete'); import * as eventUtils from '../../build/src/core/events/utils.js'; +import {defineRowBlock} from './test_helpers/block_definitions.js'; import {sharedTestSetup, sharedTestTeardown} from './test_helpers/setup_teardown.js'; suite('Block Delete Event', function() { setup(function() { sharedTestSetup.call(this); + defineRowBlock(); this.workspace = new Blockly.Workspace(); }); @@ -36,4 +38,18 @@ suite('Block Delete Event', function() { chai.assert.isTrue(spy.getCall(0).args[0] instanceof deleteClass); }); }); + + suite('Serialization', function() { + test('events round-trip through JSON', function() { + const block = this.workspace.newBlock('row_block', 'block_id'); + const origEvent = new Blockly.Events.BlockDelete(block); + + const json = origEvent.toJson(); + const newEvent = new Blockly.Events.fromJson(json, this.workspace); + delete origEvent.oldXml; // xml fails deep equals for some reason. + delete newEvent.oldXml; // xml fails deep equals for some reason. + + chai.assert.deepEqual(newEvent, origEvent); + }); + }); }); diff --git a/tests/mocha/event_block_drag_test.js b/tests/mocha/event_block_drag_test.js new file mode 100644 index 000000000..0e8b82bc9 --- /dev/null +++ b/tests/mocha/event_block_drag_test.js @@ -0,0 +1,35 @@ +/** + * @license + * Copyright 2022 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +goog.declareModuleId('Blockly.test.eventBlockDrag'); + +import {defineRowBlock} from './test_helpers/block_definitions.js'; +import {sharedTestSetup, sharedTestTeardown} from './test_helpers/setup_teardown.js'; + + +suite('Block Drag Event', function() { + setup(function() { + sharedTestSetup.call(this); + defineRowBlock(); + this.workspace = new Blockly.Workspace(); + }); + + teardown(function() { + sharedTestTeardown.call(this); + }); + + suite('Serialization', function() { + test('events round-trip through JSON', function() { + const block = this.workspace.newBlock('row_block', 'block_id'); + const origEvent = new Blockly.Events.BlockDrag(block, true, []); + + const json = origEvent.toJson(); + const newEvent = new Blockly.Events.fromJson(json, this.workspace); + + chai.assert.deepEqual(newEvent, origEvent); + }); + }); +}); diff --git a/tests/mocha/event_block_move_test.js b/tests/mocha/event_block_move_test.js new file mode 100644 index 000000000..6228e105e --- /dev/null +++ b/tests/mocha/event_block_move_test.js @@ -0,0 +1,38 @@ +/** + * @license + * Copyright 2022 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +goog.declareModuleId('Blockly.test.eventBlockMove'); + +import {defineRowBlock} from './test_helpers/block_definitions.js'; +import {sharedTestSetup, sharedTestTeardown} from './test_helpers/setup_teardown.js'; + + +suite('Block Move Event', function() { + setup(function() { + sharedTestSetup.call(this); + defineRowBlock(); + this.workspace = new Blockly.Workspace(); + }); + + teardown(function() { + sharedTestTeardown.call(this); + }); + + suite('Serialization', function() { + test('events round-trip through JSON', function() { + const block1 = this.workspace.newBlock('row_block', 'block_id'); + const block2 = this.workspace.newBlock('row_block', 'block_id'); + const origEvent = new Blockly.Events.BlockMove(block1); + block2.getInput('INPUT').connection.connect(block2.outputConnection); + origEvent.recordNew(); + + const json = origEvent.toJson(); + const newEvent = new Blockly.Events.fromJson(json, this.workspace); + + chai.assert.deepEqual(newEvent, origEvent); + }); + }); +}); diff --git a/tests/mocha/event_bubble_open_test.js b/tests/mocha/event_bubble_open_test.js new file mode 100644 index 000000000..599cdb830 --- /dev/null +++ b/tests/mocha/event_bubble_open_test.js @@ -0,0 +1,39 @@ +/** + * @license + * Copyright 2021 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +goog.declareModuleId('Blockly.test.eventBubbleOpen'); + +import {defineMutatorBlocks} from './test_helpers/block_definitions.js'; +import {sharedTestSetup, sharedTestTeardown} from './test_helpers/setup_teardown.js'; + + +suite('Bubble Open Event', function() { + setup(function() { + sharedTestSetup.call(this); + defineMutatorBlocks(); + this.workspace = new Blockly.Workspace(); + }); + + teardown(function() { + sharedTestTeardown.call(this); + Blockly.Extensions.unregister('xml_mutator'); + Blockly.Extensions.unregister('jso_mutator'); + }); + + suite('Serialization', function() { + test('events round-trip through JSON', function() { + const block = this.workspace.newBlock('jso_block', 'block_id'); + const origEvent = + new Blockly.Events.BubbleOpen( + block, true, Blockly.Events.BubbleType.MUTATOR); + + const json = origEvent.toJson(); + const newEvent = new Blockly.Events.fromJson(json, this.workspace); + + chai.assert.deepEqual(newEvent, origEvent); + }); + }); +}); diff --git a/tests/mocha/event_click_test.js b/tests/mocha/event_click_test.js new file mode 100644 index 000000000..3e8d56bcb --- /dev/null +++ b/tests/mocha/event_click_test.js @@ -0,0 +1,37 @@ +/** + * @license + * Copyright 2022 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +goog.declareModuleId('Blockly.test.eventClick'); + +import {defineRowBlock} from './test_helpers/block_definitions.js'; +import {sharedTestSetup, sharedTestTeardown} from './test_helpers/setup_teardown.js'; + + +suite('Click Event', function() { + setup(function() { + sharedTestSetup.call(this); + defineRowBlock(); + this.workspace = new Blockly.Workspace(); + }); + + teardown(function() { + sharedTestTeardown.call(this); + }); + + suite('Serialization', function() { + test('events round-trip through JSON', function() { + const block = this.workspace.newBlock('row_block', 'block_id'); + const origEvent = + new Blockly.Events.Click( + block, undefined, Blockly.Events.ClickTarget.BLOCK); + + const json = origEvent.toJson(); + const newEvent = new Blockly.Events.fromJson(json, this.workspace); + + chai.assert.deepEqual(newEvent, origEvent); + }); + }); +}); diff --git a/tests/mocha/event_comment_change_test.js b/tests/mocha/event_comment_change_test.js new file mode 100644 index 000000000..d662c4e2c --- /dev/null +++ b/tests/mocha/event_comment_change_test.js @@ -0,0 +1,35 @@ +/** + * @license + * Copyright 2022 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +goog.declareModuleId('Blockly.test.eventCommentChange'); + +import {sharedTestSetup, sharedTestTeardown} from './test_helpers/setup_teardown.js'; + + +suite('Comment Change Event', function() { + setup(function() { + sharedTestSetup.call(this); + this.workspace = new Blockly.Workspace(); + }); + + teardown(function() { + sharedTestTeardown.call(this); + }); + + suite('Serialization', function() { + test('events round-trip through JSON', function() { + const comment = + new Blockly.WorkspaceComment(this.workspace, 'old text', 10, 10); + const origEvent = + new Blockly.Events.CommentChange(comment, 'old text', 'new text'); + + const json = origEvent.toJson(); + const newEvent = new Blockly.Events.fromJson(json, this.workspace); + + chai.assert.deepEqual(newEvent, origEvent); + }); + }); +}); diff --git a/tests/mocha/event_comment_create_test.js b/tests/mocha/event_comment_create_test.js new file mode 100644 index 000000000..3beca5411 --- /dev/null +++ b/tests/mocha/event_comment_create_test.js @@ -0,0 +1,37 @@ + +/** + * @license + * Copyright 2022 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +goog.declareModuleId('Blockly.test.eventCommentCreate'); + +import {sharedTestSetup, sharedTestTeardown} from './test_helpers/setup_teardown.js'; + + +suite('Comment Create Event', function() { + setup(function() { + sharedTestSetup.call(this); + this.workspace = new Blockly.Workspace(); + }); + + teardown(function() { + sharedTestTeardown.call(this); + }); + + suite('Serialization', function() { + test('events round-trip through JSON', function() { + const comment = + new Blockly.WorkspaceComment(this.workspace, 'test text', 10, 10); + const origEvent = new Blockly.Events.CommentCreate(comment); + + const json = origEvent.toJson(); + const newEvent = new Blockly.Events.fromJson(json, this.workspace); + delete origEvent.xml; // xml fails deep equals for some reason. + delete newEvent.xml; // xml fails deep equals for some reason. + + chai.assert.deepEqual(newEvent, origEvent); + }); + }); +}); diff --git a/tests/mocha/event_comment_delete_test.js b/tests/mocha/event_comment_delete_test.js new file mode 100644 index 000000000..33c7c3363 --- /dev/null +++ b/tests/mocha/event_comment_delete_test.js @@ -0,0 +1,37 @@ + +/** + * @license + * Copyright 2022 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +goog.declareModuleId('Blockly.test.eventCommentDelete'); + +import {sharedTestSetup, sharedTestTeardown} from './test_helpers/setup_teardown.js'; + + +suite('Comment Delete Event', function() { + setup(function() { + sharedTestSetup.call(this); + this.workspace = new Blockly.Workspace(); + }); + + teardown(function() { + sharedTestTeardown.call(this); + }); + + suite('Serialization', function() { + test('events round-trip through JSON', function() { + const comment = + new Blockly.WorkspaceComment(this.workspace, 'test text', 10, 10); + const origEvent = new Blockly.Events.CommentDelete(comment); + + const json = origEvent.toJson(); + const newEvent = new Blockly.Events.fromJson(json, this.workspace); + delete origEvent.xml; // xml fails deep equals for some reason. + delete newEvent.xml; // xml fails deep equals for some reason. + + chai.assert.deepEqual(newEvent, origEvent); + }); + }); +}); diff --git a/tests/mocha/event_comment_move_test.js b/tests/mocha/event_comment_move_test.js new file mode 100644 index 000000000..2b726559e --- /dev/null +++ b/tests/mocha/event_comment_move_test.js @@ -0,0 +1,39 @@ + +/** + * @license + * Copyright 2022 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +goog.declareModuleId('Blockly.test.eventCommentMove'); + +import {sharedTestSetup, sharedTestTeardown} from './test_helpers/setup_teardown.js'; + + +suite('Comment Move Event', function() { + setup(function() { + sharedTestSetup.call(this); + this.workspace = new Blockly.Workspace(); + }); + + teardown(function() { + sharedTestTeardown.call(this); + }); + + suite('Serialization', function() { + test('events round-trip through JSON', function() { + const comment = + new Blockly.WorkspaceComment(this.workspace, 'test text', 10, 10); + const origEvent = new Blockly.Events.CommentMove(comment); + comment.moveBy(10, 10); + origEvent.recordNew(); + + const json = origEvent.toJson(); + const newEvent = new Blockly.Events.fromJson(json, this.workspace); + delete origEvent.comment_; // Ignore private properties. + delete newEvent.comment_; // Ignore private properties. + + chai.assert.deepEqual(newEvent, origEvent); + }); + }); +}); diff --git a/tests/mocha/event_marker_move_test.js b/tests/mocha/event_marker_move_test.js new file mode 100644 index 000000000..e7ddac2f8 --- /dev/null +++ b/tests/mocha/event_marker_move_test.js @@ -0,0 +1,39 @@ + +/** + * @license + * Copyright 2022 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +goog.declareModuleId('Blockly.test.eventMarkerMove'); + +import {defineRowBlock} from './test_helpers/block_definitions.js;'; +import {sharedTestSetup, sharedTestTeardown} from './test_helpers/setup_teardown.js'; + + +suite('Marker Move Event', function() { + setup(function() { + sharedTestSetup.call(this); + defineRowBlock(); + this.workspace = new Blockly.Workspace(); + }); + + teardown(function() { + sharedTestTeardown.call(this); + }); + + suite.only('Serialization', function() { + test('events round-trip through JSON', function() { + const block1 = this.workspace.newBlock('row_block', 'test_id1'); + const block2 = this.workspace.newBlock('row_block', 'test_id2'); + const node1 = new Blockly.ASTNode(Blockly.ASTNode.types.BLOCK, block1); + const node2 = new Blockly.ASTNode(Blockly.ASTNode.types.BLOCK, block2); + const origEvent = new Blockly.Events.MarkerMove(block2, false, node1, node2); + + const json = origEvent.toJson(); + const newEvent = new Blockly.Events.fromJson(json, this.workspace); + + chai.assert.deepEqual(newEvent, origEvent); + }); + }); +}); diff --git a/tests/mocha/event_selected_test.js b/tests/mocha/event_selected_test.js new file mode 100644 index 000000000..726aba93a --- /dev/null +++ b/tests/mocha/event_selected_test.js @@ -0,0 +1,38 @@ + +/** + * @license + * Copyright 2022 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +goog.declareModuleId('Blockly.test.eventSelected'); + +import {defineRowBlock} from './test_helpers/block_definitions.js;'; +import {sharedTestSetup, sharedTestTeardown} from './test_helpers/setup_teardown.js'; + + +suite('Selected Event', function() { + setup(function() { + sharedTestSetup.call(this); + defineRowBlock(); + this.workspace = new Blockly.Workspace(); + }); + + teardown(function() { + sharedTestTeardown.call(this); + }); + + suite.only('Serialization', function() { + test('events round-trip through JSON', function() { + const block1 = this.workspace.newBlock('row_block', 'test_id1'); + const block2 = this.workspace.newBlock('row_block', 'test_id2'); + const origEvent = + new Blockly.Events.Selected(block1.id, block2.id, this.workspace.id); + + const json = origEvent.toJson(); + const newEvent = new Blockly.Events.fromJson(json, this.workspace); + + chai.assert.deepEqual(newEvent, origEvent); + }); + }); +}); diff --git a/tests/mocha/event_test.js b/tests/mocha/event_test.js index 01a2f9317..b0a5df63c 100644 --- a/tests/mocha/event_test.js +++ b/tests/mocha/event_test.js @@ -547,6 +547,7 @@ suite('Events', function() { type: 'move', group: '', blockId: thisObj.block.id, + oldCoordinate: "0, 0", }), }, { @@ -557,6 +558,7 @@ suite('Events', function() { type: 'move', group: '', blockId: thisObj.shadowBlock.id, + oldCoordinate: "0, 0", recordUndo: false, }), }, @@ -581,7 +583,8 @@ suite('Events', function() { {title: 'Comment delete', class: Blockly.Events.CommentDelete, getArgs: (thisObj) => [thisObj.comment], getExpectedJson: (thisObj) => ({type: 'comment_delete', group: '', - commentId: thisObj.comment.id})}, + commentId: thisObj.comment.id, + xml: Blockly.Xml.domToText(thisObj.comment.toXmlWithXY())})}, // TODO(#4577) Test serialization of move event coordinate properties. ]; const testSuites = [ @@ -620,9 +623,8 @@ suite('Events', function() { testSuite.testCases.forEach((testCase) => { test(testCase.title, function() { const event = new testCase.class(...testCase.getArgs(this)); - const event2 = new testCase.class(); const json = event.toJson(); - event2.fromJson(json); + const event2 = Blockly.Events.fromJson(json, this.workspace); chai.assert.equal( safeStringify(event2.toJson()), safeStringify(json)); diff --git a/tests/mocha/event_theme_change_test.js b/tests/mocha/event_theme_change_test.js new file mode 100644 index 000000000..27762b073 --- /dev/null +++ b/tests/mocha/event_theme_change_test.js @@ -0,0 +1,34 @@ + +/** + * @license + * Copyright 2022 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +goog.declareModuleId('Blockly.test.eventThemeChange'); + +import {sharedTestSetup, sharedTestTeardown} from './test_helpers/setup_teardown.js'; + + +suite('Theme Change Event', function() { + setup(function() { + sharedTestSetup.call(this); + this.workspace = new Blockly.Workspace(); + }); + + teardown(function() { + sharedTestTeardown.call(this); + }); + + suite('Serialization', function() { + test('events round-trip through JSON', function() { + const origEvent = + new Blockly.Events.ThemeChange('new theme name', this.workspace.id); + + const json = origEvent.toJson(); + const newEvent = new Blockly.Events.fromJson(json, this.workspace); + + chai.assert.deepEqual(newEvent, origEvent); + }); + }); +}); diff --git a/tests/mocha/event_toolbox_item_select_test.js b/tests/mocha/event_toolbox_item_select_test.js new file mode 100644 index 000000000..6a0dcfcdb --- /dev/null +++ b/tests/mocha/event_toolbox_item_select_test.js @@ -0,0 +1,62 @@ + +/** + * @license + * Copyright 2022 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +goog.declareModuleId('Blockly.test.eventToolboxItemSelect'); + +import {sharedTestSetup, sharedTestTeardown} from './test_helpers/setup_teardown.js'; + + +suite('Toolbox Item Select Event', function() { + setup(function() { + sharedTestSetup.call(this); + this.workspace = Blockly.inject('blocklyDiv', { + toolbox: { + "kind": "categoryToolbox", + "contents": [ + { + "kind": "category", + "name": "Control", + "contents": [ + { + "kind": "block", + "type": "controls_if", + }, + ], + }, + { + "kind": "category", + "name": "Logic", + "contents": [ + { + "kind": "block", + "type": "logic_compare", + }, + ], + }, + ], + }, + }); + }); + + teardown(function() { + sharedTestTeardown.call(this); + }); + + suite('Serialization', function() { + test('events round-trip through JSON', function() { + const items = this.workspace.getToolbox().getToolboxItems(); + const origEvent = + new Blockly.Events.ToolboxItemSelect( + items[0].getName(), items[1].getName(), this.workspace.id); + + const json = origEvent.toJson(); + const newEvent = new Blockly.Events.fromJson(json, this.workspace); + + chai.assert.deepEqual(newEvent, origEvent); + }); + }); +}); diff --git a/tests/mocha/event_trashcan_open_test.js b/tests/mocha/event_trashcan_open_test.js new file mode 100644 index 000000000..d9a4f9e97 --- /dev/null +++ b/tests/mocha/event_trashcan_open_test.js @@ -0,0 +1,34 @@ + +/** + * @license + * Copyright 2022 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +goog.declareModuleId('Blockly.test.eventTrashcanOpen'); + +import {sharedTestSetup, sharedTestTeardown} from './test_helpers/setup_teardown.js'; + + +suite('Trashcan Open Event', function() { + setup(function() { + sharedTestSetup.call(this); + this.workspace = new Blockly.Workspace(); + }); + + teardown(function() { + sharedTestTeardown.call(this); + }); + + suite('Serialization', function() { + test('events round-trip through JSON', function() { + const origEvent = + new Blockly.Events.TrashcanOpen(true, this.workspace.id); + + const json = origEvent.toJson(); + const newEvent = new Blockly.Events.fromJson(json, this.workspace); + + chai.assert.deepEqual(newEvent, origEvent); + }); + }); +}); diff --git a/tests/mocha/event_var_create_test.js b/tests/mocha/event_var_create_test.js new file mode 100644 index 000000000..b90372e8f --- /dev/null +++ b/tests/mocha/event_var_create_test.js @@ -0,0 +1,35 @@ + +/** + * @license + * Copyright 2022 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +goog.declareModuleId('Blockly.test.eventVarCreate'); + +import {sharedTestSetup, sharedTestTeardown} from './test_helpers/setup_teardown.js'; + + +suite('Var Create Event', function() { + setup(function() { + sharedTestSetup.call(this); + this.workspace = new Blockly.Workspace(); + }); + + teardown(function() { + sharedTestTeardown.call(this); + }); + + suite('Serialization', function() { + test('events round-trip through JSON', function() { + const varModel = + new Blockly.VariableModel(this.workspace, 'name', 'type', 'id'); + const origEvent = new Blockly.Events.VarCreate(varModel); + + const json = origEvent.toJson(); + const newEvent = new Blockly.Events.fromJson(json, this.workspace); + + chai.assert.deepEqual(newEvent, origEvent); + }); + }); +}); diff --git a/tests/mocha/event_var_delete_test.js b/tests/mocha/event_var_delete_test.js new file mode 100644 index 000000000..f086873d3 --- /dev/null +++ b/tests/mocha/event_var_delete_test.js @@ -0,0 +1,34 @@ +/** + * @license + * Copyright 2022 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +goog.declareModuleId('Blockly.test.eventVarDelete'); + +import {sharedTestSetup, sharedTestTeardown} from './test_helpers/setup_teardown.js'; + + +suite('Var Delete Event', function() { + setup(function() { + sharedTestSetup.call(this); + this.workspace = new Blockly.Workspace(); + }); + + teardown(function() { + sharedTestTeardown.call(this); + }); + + suite('Serialization', function() { + test('events round-trip through JSON', function() { + const varModel = + new Blockly.VariableModel(this.workspace, 'name', 'type', 'id'); + const origEvent = new Blockly.Events.VarDelete(varModel); + + const json = origEvent.toJson(); + const newEvent = new Blockly.Events.fromJson(json, this.workspace); + + chai.assert.deepEqual(newEvent, origEvent); + }); + }); +}); diff --git a/tests/mocha/event_var_rename_test.js b/tests/mocha/event_var_rename_test.js new file mode 100644 index 000000000..be54e70c9 --- /dev/null +++ b/tests/mocha/event_var_rename_test.js @@ -0,0 +1,34 @@ +/** + * @license + * Copyright 2022 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +goog.declareModuleId('Blockly.test.eventVarRename'); + +import {sharedTestSetup, sharedTestTeardown} from './test_helpers/setup_teardown.js'; + + +suite('Var Rename Event', function() { + setup(function() { + sharedTestSetup.call(this); + this.workspace = new Blockly.Workspace(); + }); + + teardown(function() { + sharedTestTeardown.call(this); + }); + + suite('Serialization', function() { + test('events round-trip through JSON', function() { + const varModel = + new Blockly.VariableModel(this.workspace, 'old name', 'type', 'id'); + const origEvent = new Blockly.Events.VarRename(varModel, 'new name'); + + const json = origEvent.toJson(); + const newEvent = new Blockly.Events.fromJson(json, this.workspace); + + chai.assert.deepEqual(newEvent, origEvent); + }); + }); +}); diff --git a/tests/mocha/event_viewport_test.js b/tests/mocha/event_viewport_test.js new file mode 100644 index 000000000..9c03170fc --- /dev/null +++ b/tests/mocha/event_viewport_test.js @@ -0,0 +1,34 @@ + +/** + * @license + * Copyright 2022 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +goog.declareModuleId('Blockly.test.eventViewportChange'); + +import {sharedTestSetup, sharedTestTeardown} from './test_helpers/setup_teardown.js'; + + +suite('Viewport Change Event', function() { + setup(function() { + sharedTestSetup.call(this); + this.workspace = new Blockly.Workspace(); + }); + + teardown(function() { + sharedTestTeardown.call(this); + }); + + suite('Serialization', function() { + test('events round-trip through JSON', function() { + const origEvent = + new Blockly.Events.ViewportChange(10, 10, 1, this.workspace.id, .8); + + const json = origEvent.toJson(); + const newEvent = new Blockly.Events.fromJson(json, this.workspace); + + chai.assert.deepEqual(newEvent, origEvent); + }); + }); +}); diff --git a/tests/mocha/index.html b/tests/mocha/index.html index 62e249e2d..11640c37a 100644 --- a/tests/mocha/index.html +++ b/tests/mocha/index.html @@ -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,26 @@ '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.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/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() { }); }); }); - From 15b9cf61dffb9884854d181edfdbad9200a345e6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 14 Nov 2022 22:26:04 +0000 Subject: [PATCH 09/73] chore(deps): bump jsdom from 15.2.1 to 20.0.2 (#6591) * chore(deps): bump jsdom from 15.2.1 to 20.0.2 Bumps [jsdom](https://github.com/jsdom/jsdom) from 15.2.1 to 20.0.2. - [Release notes](https://github.com/jsdom/jsdom/releases) - [Changelog](https://github.com/jsdom/jsdom/blob/master/Changelog.md) - [Commits](https://github.com/jsdom/jsdom/compare/15.2.1...20.0.2) --- updated-dependencies: - dependency-name: jsdom dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] * fix(deps): Import jsdom correctly Use the JSDOM constructor to create a JSDOM instance and then obtain the needed polyfills from that instances .window property. * chore(tests): Revert "Updates dependabot to ignore jsdom changes (#4777)" This reverts commit be1dcb4b94bf99847f1277d281306c388f6ea275. Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Christopher Allen --- .github/dependabot.yml | 6 - package-lock.json | 1743 ++++++++++++++++++++++++++-------- package.json | 2 +- scripts/package/node/core.js | 7 +- 4 files changed, 1333 insertions(+), 425 deletions(-) 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/package-lock.json b/package-lock.json index 66d7665e3..b825d9f1f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,7 +10,7 @@ "hasInstallScript": true, "license": "Apache-2.0", "dependencies": { - "jsdom": "15.2.1" + "jsdom": "20.0.2" }, "devDependencies": { "@blockly/block-test": "^3.0.0", @@ -868,6 +868,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", @@ -2021,9 +2029,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", @@ -2041,7 +2049,6 @@ "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, "bin": { "acorn": "bin/acorn" }, @@ -2050,31 +2057,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 +2078,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 +2086,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 +2097,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", @@ -2369,7 +2356,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 +2475,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 +2484,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" } @@ -2568,7 +2561,7 @@ "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 +2578,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 +2588,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", @@ -2686,7 +2683,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 +2765,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 +3133,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", @@ -3178,7 +3522,9 @@ "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", @@ -3914,9 +4260,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 +4293,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 +4310,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 +4348,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,6 +4411,11 @@ "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", @@ -4210,7 +4565,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" } @@ -4427,11 +4782,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 +4874,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" @@ -4563,6 +4923,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 +5009,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 +5023,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 +5068,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 +5085,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" }, @@ -4959,6 +5338,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" } @@ -5178,7 +5558,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", @@ -5283,10 +5664,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 +5689,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 +5724,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", @@ -5610,22 +5995,24 @@ "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/fragment-cache": { @@ -5803,7 +6190,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" } @@ -7109,7 +7498,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 +7510,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 +7662,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 +7689,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 +7732,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", @@ -7368,6 +7775,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" }, @@ -7516,7 +7925,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" } @@ -7786,6 +8197,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 +8235,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 +8323,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", @@ -8082,7 +8502,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 +8516,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.2", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-20.0.2.tgz", + "integrity": "sha512-AHWa+QO/cgRg4N+DsmHg1Y7xnz+8KU3EflM0LVDTdmrYOc1WWTSkOjtpUveQH+1Bqd5rtcVnb/DuxV/UjDO4rA==", "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.0", + "acorn-globals": "^7.0.0", + "cssom": "^0.5.0", + "cssstyle": "^2.3.0", + "data-urls": "^3.0.2", + "decimal.js": "^10.4.1", + "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": "^3.0.0", + "webidl-conversions": "^7.0.0", + "whatwg-encoding": "^2.0.0", + "whatwg-mimetype": "^3.0.0", + "whatwg-url": "^11.0.0", + "ws": "^8.9.0", + "xml-name-validator": "^4.0.0" }, "engines": { - "node": ">=8" + "node": ">=14" }, "peerDependencies": { "canvas": "^2.5.0" @@ -8137,31 +8559,16 @@ } } }, - "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" + "node_modules/jsdom/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==", + "dependencies": { + "agent-base": "6", + "debug": "4" }, "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": ">= 6" } }, "node_modules/json-buffer": { @@ -8179,12 +8586,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 +8605,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 +8637,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", @@ -8463,7 +8877,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", @@ -8640,7 +9055,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", @@ -9070,19 +9487,19 @@ } }, "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" @@ -9315,8 +9732,7 @@ "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", @@ -9544,14 +9960,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": "*" } @@ -10158,9 +10576,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 +10860,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", @@ -10580,7 +11006,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", @@ -10729,9 +11157,9 @@ "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", @@ -10845,6 +11273,7 @@ "version": "6.5.2", "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", + "dev": true, "engines": { "node": ">=0.6" } @@ -10855,6 +11284,11 @@ "integrity": "sha512-bK0/0cCI+R8ZmOF1QjT7HupDUYCxbf/9TJgAmSXQxZpftXmTAeil9DRoCnTDkWbvOyZzhcMBwKpptWcdkGFIMg==", "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", @@ -11290,6 +11724,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 +11756,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 +11773,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 +11791,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 +11801,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 +11848,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", @@ -11581,7 +12039,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 +12057,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": { @@ -12159,9 +12618,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", @@ -12281,7 +12742,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" } @@ -12789,24 +13252,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 +13326,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 +13339,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", @@ -13114,6 +13593,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 +13611,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", @@ -13169,6 +13658,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 +13716,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 +13731,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,18 +13842,22 @@ "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": "3.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-3.0.0.tgz", + "integrity": "sha512-3WFqGEgSXIyGhOmAFtlicJNMjEps8b1MG31NCA0/vOF9+nKMUW1ckhi9cnNHmf88Rzw5V+dwIwsm2C7X8k9aQg==", "dependencies": { - "domexception": "^1.0.1", - "webidl-conversions": "^4.0.2", - "xml-name-validator": "^3.0.0" + "xml-name-validator": "^4.0.0" + }, + "engines": { + "node": ">=12" } }, "node_modules/wcwidth": { @@ -13684,15 +14183,17 @@ } }, "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 +14205,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 +14213,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 +14291,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 +14311,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", @@ -14799,6 +15307,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", @@ -15677,9 +16190,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", @@ -15693,28 +16206,15 @@ "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 + "integrity": "sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==" }, "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 +16227,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 +16241,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", @@ -15936,7 +16435,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 +16525,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 +16534,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", @@ -16088,7 +16593,7 @@ "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 +16604,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", @@ -16173,7 +16682,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 +16749,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 +17050,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", @@ -16558,7 +17348,9 @@ "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", @@ -17145,9 +17937,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 +17969,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 +17983,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 +18008,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,6 +18058,11 @@ } } }, + "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", @@ -17376,7 +18174,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", @@ -17541,11 +18339,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 +18429,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" @@ -17672,6 +18472,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 +18543,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 +18584,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 +18595,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" } @@ -17974,7 +18784,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", @@ -18160,7 +18971,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", @@ -18241,7 +19053,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 +19072,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 +19103,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", @@ -18502,15 +19318,17 @@ "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" } }, @@ -18648,7 +19466,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" } @@ -19745,12 +20565,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 +20685,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 +20706,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 +20740,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", @@ -19938,6 +20773,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" } @@ -20042,7 +20879,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", @@ -20244,6 +21083,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 +21112,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 +21179,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", @@ -20476,7 +21324,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,57 +21335,45 @@ "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.2", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-20.0.2.tgz", + "integrity": "sha512-AHWa+QO/cgRg4N+DsmHg1Y7xnz+8KU3EflM0LVDTdmrYOc1WWTSkOjtpUveQH+1Bqd5rtcVnb/DuxV/UjDO4rA==", "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" + "abab": "^2.0.6", + "acorn": "^8.8.0", + "acorn-globals": "^7.0.0", + "cssom": "^0.5.0", + "cssstyle": "^2.3.0", + "data-urls": "^3.0.2", + "decimal.js": "^10.4.1", + "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": "^3.0.0", + "webidl-conversions": "^7.0.0", + "whatwg-encoding": "^2.0.0", + "whatwg-mimetype": "^3.0.0", + "whatwg-url": "^11.0.0", + "ws": "^8.9.0", + "xml-name-validator": "^4.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==", + "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==", "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" + "agent-base": "6", + "debug": "4" } } } @@ -20555,12 +21393,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 +21412,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 +21436,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", @@ -20792,7 +21637,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", @@ -20969,7 +21815,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", @@ -21319,16 +22167,16 @@ "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": { @@ -21506,8 +22354,7 @@ "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", @@ -21692,14 +22539,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", @@ -22160,9 +23009,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 +23233,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", @@ -22490,7 +23344,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", @@ -22606,9 +23462,9 @@ "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", @@ -22702,7 +23558,8 @@ "qs": { "version": "6.5.2", "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", + "dev": true }, "query-selector-shadow-dom": { "version": "1.0.0", @@ -22710,6 +23567,11 @@ "integrity": "sha512-bK0/0cCI+R8ZmOF1QjT7HupDUYCxbf/9TJgAmSXQxZpftXmTAeil9DRoCnTDkWbvOyZzhcMBwKpptWcdkGFIMg==", "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", @@ -23044,6 +23906,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 +23931,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 +23960,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 +23970,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 +23982,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 +24006,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", @@ -23272,7 +24155,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 +24173,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": { @@ -23756,9 +24640,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", @@ -23852,7 +24738,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", @@ -24287,21 +25175,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 +25230,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 +25240,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", @@ -24533,6 +25433,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 +25450,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", @@ -24579,7 +25489,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 +25536,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 +25548,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,18 +25652,18 @@ "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": "3.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-3.0.0.tgz", + "integrity": "sha512-3WFqGEgSXIyGhOmAFtlicJNMjEps8b1MG31NCA0/vOF9+nKMUW1ckhi9cnNHmf88Rzw5V+dwIwsm2C7X8k9aQg==", "requires": { - "domexception": "^1.0.1", - "webidl-conversions": "^4.0.2", - "xml-name-validator": "^3.0.0" + "xml-name-validator": "^4.0.0" } }, "wcwidth": { @@ -25001,15 +25917,14 @@ } }, "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 +25933,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 +25940,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 +25997,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", diff --git a/package.json b/package.json index 36f2c88a5..87275b1af 100644 --- a/package.json +++ b/package.json @@ -114,6 +114,6 @@ "yargs": "^17.2.1" }, "dependencies": { - "jsdom": "15.2.1" + "jsdom": "20.0.2" } } 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); From 9145f513d6f186cd3d91653da41d73a4d71e8ee1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 14 Nov 2022 14:32:35 -0800 Subject: [PATCH 10/73] chore(deps): bump @blockly/dev-tools from 5.0.0 to 5.0.2 (#6620) Bumps [@blockly/dev-tools](https://github.com/google/blockly-samples/tree/HEAD/plugins/dev-tools) from 5.0.0 to 5.0.2. - [Release notes](https://github.com/google/blockly-samples/releases) - [Changelog](https://github.com/google/blockly-samples/blob/master/plugins/dev-tools/CHANGELOG.md) - [Commits](https://github.com/google/blockly-samples/commits/@blockly/dev-tools@5.0.2/plugins/dev-tools) --- updated-dependencies: - dependency-name: "@blockly/dev-tools" dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 80 +++++++++++++++++++++++------------------------ 1 file changed, 40 insertions(+), 40 deletions(-) diff --git a/package-lock.json b/package-lock.json index b825d9f1f..f2dcf219b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -176,16 +176,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 +201,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 +213,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 +225,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 +249,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" @@ -14737,16 +14737,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", @@ -14756,23 +14756,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": {} }, @@ -14784,9 +14784,9 @@ "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": {} }, From a81c6f847daacb3a55990a11663c8700e5164e87 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 14 Nov 2022 15:38:22 -0800 Subject: [PATCH 11/73] chore(deps): bump yargs from 17.6.0 to 17.6.2 (#6622) Bumps [yargs](https://github.com/yargs/yargs) from 17.6.0 to 17.6.2. - [Release notes](https://github.com/yargs/yargs/releases) - [Changelog](https://github.com/yargs/yargs/blob/main/CHANGELOG.md) - [Commits](https://github.com/yargs/yargs/compare/v17.6.0...v17.6.2) --- updated-dependencies: - dependency-name: yargs dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/package-lock.json b/package-lock.json index f2dcf219b..7b5597526 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14357,9 +14357,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", @@ -14368,16 +14368,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" @@ -26037,9 +26037,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", @@ -26048,7 +26048,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": { @@ -26065,9 +26065,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": { From 9292983571b068a6173205e69a5d759005a24257 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 14 Nov 2022 15:38:42 -0800 Subject: [PATCH 12/73] chore(deps): bump @microsoft/api-extractor from 7.33.4 to 7.33.6 (#6621) Bumps [@microsoft/api-extractor](https://github.com/microsoft/rushstack/tree/HEAD/apps/api-extractor) from 7.33.4 to 7.33.6. - [Release notes](https://github.com/microsoft/rushstack/releases) - [Changelog](https://github.com/microsoft/rushstack/blob/main/apps/api-extractor/CHANGELOG.md) - [Commits](https://github.com/microsoft/rushstack/commits/@microsoft/api-extractor_v7.33.6/apps/api-extractor) --- updated-dependencies: - dependency-name: "@microsoft/api-extractor" dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 134 +++++++++++----------------------------------- 1 file changed, 32 insertions(+), 102 deletions(-) diff --git a/package-lock.json b/package-lock.json index 7b5597526..5faed76ad 100644 --- a/package-lock.json +++ b/package-lock.json @@ -510,35 +510,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 +545,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.6", + "resolved": "https://registry.npmjs.org/@microsoft/api-extractor/-/api-extractor-7.33.6.tgz", + "integrity": "sha512-EYu1qWiMyvP/P+7na76PbE7+eOtvuYIvQa2DhZqkSQSLYP2sKLmZaSMK5Jvpgdr0fK/xLFujK5vLf3vpfcmC8g==", "dev": true, "dependencies": { - "@microsoft/api-extractor-model": "7.25.1", - "@microsoft/tsdoc": "0.14.1", + "@microsoft/api-extractor-model": "7.25.2", + "@microsoft/tsdoc": "0.14.2", "@microsoft/tsdoc-config": "~0.16.1", "@rushstack/node-core-library": "3.53.2", "@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,12 +568,12 @@ } }, "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" } @@ -629,9 +600,9 @@ } }, "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 +617,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 +754,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", @@ -14985,35 +14950,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", @@ -15045,17 +14981,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.6", + "resolved": "https://registry.npmjs.org/@microsoft/api-extractor/-/api-extractor-7.33.6.tgz", + "integrity": "sha512-EYu1qWiMyvP/P+7na76PbE7+eOtvuYIvQa2DhZqkSQSLYP2sKLmZaSMK5Jvpgdr0fK/xLFujK5vLf3vpfcmC8g==", "dev": true, "requires": { - "@microsoft/api-extractor-model": "7.25.1", - "@microsoft/tsdoc": "0.14.1", + "@microsoft/api-extractor-model": "7.25.2", + "@microsoft/tsdoc": "0.14.2", "@microsoft/tsdoc-config": "~0.16.1", "@rushstack/node-core-library": "3.53.2", "@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", @@ -15082,20 +15018,20 @@ } }, "@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": { @@ -15110,12 +15046,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", @@ -15235,9 +15165,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", From 2257b1da19f562fe427606f5e8793ab76cc34f25 Mon Sep 17 00:00:00 2001 From: Christopher Allen Date: Tue, 15 Nov 2022 16:56:00 +0000 Subject: [PATCH 13/73] fix(renamings): Small correction to renaming of Blockly.utils.global (#6599) It doesn't make any difference in practice to the behaviour of the renamings script, but this entry in renamings.json5 was slightly mis-specified, and only works properly because this former module had only a singe export. Also remove some unnecessary quoting of keywords. --- scripts/migration/renamings.json5 | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/scripts/migration/renamings.json5 b/scripts/migration/renamings.json5 index 540fd08e5..f5d0e858e 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', From d37223d8abe0b8afeac152092bdc6c1955bb53dd Mon Sep 17 00:00:00 2001 From: Beka Westberg Date: Tue, 15 Nov 2022 10:56:23 -0800 Subject: [PATCH 14/73] chore: add 'fixes' to PR template (#6628) --- .github/PULL_REQUEST_TEMPLATE.md | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index d26d698d7..0cf78b1ce 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -16,6 +16,7 @@ ### Resolves +Fixes ### Proposed Changes From 54670d534eab31cf2f8a720dbfe315d0c3544d73 Mon Sep 17 00:00:00 2001 From: Christopher Allen Date: Wed, 16 Nov 2022 18:17:54 +0000 Subject: [PATCH 15/73] feat(test): Miscellaneous improvements to `test_tasks.js` (#6615) * feat(tests): Make runTestBlock able to run any gulp task Modify runTestBlock so that it can run any async task, not just ones that return a Promise, by using the async-done package (part of Gulp, and already an indirect dependency) to detect task completion. Celebrate by renaming it to runTestTask. * refactor(tests): Create Tester class to encapsulate test infrastructure - Create Tester class to encapsulate the runTestTask, and reportTestResult and runAll functions. - Remove the unnecessary id parameter from runTestTask (code was already using the .name of the task function object). - Remove --silent flag from npm scripts so as not to suppress syntax error in gulpfiles. * refactor(tests): Invoke buildAdvancedCompilationTest task directly Have the test task invoke the buildAdvancedCompilationTest (via onlyBuildAdvancedCompilationTest, to skip already-run prerequisites) directly, rather than by running npm. --- gulpfile.js | 3 - package-lock.json | 114 +++++++++++++-- package.json | 6 +- scripts/gulpfiles/test_tasks.js | 243 ++++++++++++++++---------------- 4 files changed, 227 insertions(+), 139 deletions(-) diff --git a/gulpfile.js b/gulpfile.js index 9ac75c91a..80afbd800 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -52,9 +52,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/package-lock.json b/package-lock.json index 5faed76ad..c56737b77 100644 --- a/package-lock.json +++ b/package-lock.json @@ -21,6 +21,7 @@ "@microsoft/api-extractor": "^7.29.5", "@typescript-eslint/eslint-plugin": "^5.33.1", "@wdio/selenium-standalone-service": "^7.10.1", + "async-done": "^2.0.0", "chai": "^4.2.0", "clang-format": "^1.6.0", "closure-calculate-chunks": "^3.0.2", @@ -2481,18 +2482,17 @@ "dev": true }, "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==", + "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.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" }, "engines": { - "node": ">= 0.10" + "node": ">= 10.13.0" } }, "node_modules/async-each": { @@ -2523,6 +2523,21 @@ "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==", + "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/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", @@ -2577,6 +2592,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", @@ -6277,6 +6307,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", @@ -16487,15 +16532,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": { @@ -16518,6 +16562,20 @@ "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": { @@ -16560,6 +16618,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": { @@ -19501,6 +19573,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", diff --git a/package.json b/package.json index 87275b1af..3d1888aa3 100644 --- a/package.json +++ b/package.json @@ -42,7 +42,6 @@ "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", @@ -53,8 +52,8 @@ "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\"", "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" @@ -78,6 +77,7 @@ "@microsoft/api-extractor": "^7.29.5", "@typescript-eslint/eslint-plugin": "^5.33.1", "@wdio/selenium-standalone-service": "^7.10.1", + "async-done": "^2.0.0", "chai": "^4.2.0", "clang-format": "^1.6.0", "closure-calculate-chunks": "^3.0.2", diff --git a/scripts/gulpfiles/test_tasks.js b/scripts/gulpfiles/test_tasks.js index e3da00df4..0712278b3 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,6 +17,7 @@ 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 = @@ -31,46 +33,84 @@ 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; + } + + /** + * Run all tests in sequence. + */ + async runAll() { + for (const task of this.tasks) { + await this.runTestTask(task) + } + this.reportTestResult(); + } -/** - * 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) => { + /** + * 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 */ -function runTestCommand(id, command) { - return runTestBlock(id, async() => { - return execSync(command, {stdio: 'inherit'}); - }, false); +async function runTestCommand(command) { + execSync(command, {stdio: 'inherit'}); } /** @@ -83,7 +123,7 @@ function eslint() { console.log('Skip linting.'); return Promise.resolve(); } - return runTestCommand('eslint', 'eslint .'); + return runTestCommand('eslint .'); } /** @@ -92,8 +132,7 @@ function eslint() { * @return {Promise} asynchronous result */ function build() { - return runTestCommand('build + package', - 'npm run package -- --verbose --debug'); + return runTestCommand('npm run package -- --verbose --debug'); } /** @@ -101,7 +140,7 @@ function build() { * @return {Promise} asynchronous result */ function renamings() { - return runTestCommand('renamings', 'node tests/migration/validate-renamings.js'); + return runTestCommand('node tests/migration/validate-renamings.js'); } /** @@ -165,50 +204,46 @@ function zippingFiles() { * Check the sizes of built files for unexpected growth. * @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 */ -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'); } /** @@ -264,28 +299,26 @@ function checkResult(suffix) { * Run generator tests inside a browser and check the results. * @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.'); + } } /** @@ -293,35 +326,12 @@ function generators() { * @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 - */ -function advancedCompile() { - return runTestCommand('advanced_compile', 'npm run only:compile:advanced'); -} -/** - * 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, @@ -329,12 +339,9 @@ const testTasks = [ mocha, generators, node, - advancedCompile, - reportTestResult, -]; + buildTasks.onlyBuildAdvancedCompilationTest, +]).asTask(); -// Run all tests in sequence. -const test = gulp.series(...testTasks); module.exports = { test, From 6ef90b7c7e1fe82428d1878bff93edf2caba19d8 Mon Sep 17 00:00:00 2001 From: Christopher Allen Date: Fri, 18 Nov 2022 11:20:56 +0000 Subject: [PATCH 16/73] docs(messages): Add a msg/json/README.md (#6635) * docs(messages): Add a msg/json/README.md Add a README.md file to msg/json/ explaining the purpose of the files therein, mentioning that PRs are not accepted but that translation updates should be made via TranslateWiki, and with a short description of how to build the langfiles that are generated from them. * docs(messages): Add note about the Klingon exception --- msg/json/README.md | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 msg/json/README.md 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). From a1eb42307fa158c483e7d329a2e7b0ecb26bafb4 Mon Sep 17 00:00:00 2001 From: Rachel Fenichel Date: Fri, 18 Nov 2022 15:26:16 -0800 Subject: [PATCH 17/73] fix: make mutator workspace public (#6634) * fix: make mutator workspace public * fix: make workspace private again --- core/mutator.ts | 54 ++++++++++++++++++++++++++----------------------- 1 file changed, 29 insertions(+), 25 deletions(-) diff --git a/core/mutator.ts b/core/mutator.ts index 6cba64777..498608967 100644 --- a/core/mutator.ts +++ b/core/mutator.ts @@ -44,8 +44,12 @@ import type {WorkspaceSvg} from './workspace_svg.js'; export class Mutator extends Icon { private quarkNames: string[]; - /** Workspace in the mutator's bubble. */ - private workspace: WorkspaceSvg|null = null; + /** + * Workspace in the mutator's bubble. + * Due to legacy code in procedure block definitions, this name + * cannot change. + */ + private workspace_: WorkspaceSvg|null = null; /** Width of workspace. */ private workspaceWidth = 0; @@ -107,7 +111,7 @@ export class Mutator extends Icon { * @internal */ getWorkspace(): WorkspaceSvg|null { - return this.workspace; + return this.workspace_; } /** @@ -200,22 +204,22 @@ export class Mutator extends Icon { if (hasFlyout) { workspaceOptions.languageTree = toolbox.convertToolboxDefToJson(quarkXml); } - this.workspace = this.newWorkspaceSvg(workspaceOptions); - this.workspace.internalIsMutator = true; - this.workspace.addChangeListener(eventUtils.disableOrphans); + this.workspace_ = this.newWorkspaceSvg(workspaceOptions); + this.workspace_.internalIsMutator = true; + this.workspace_.addChangeListener(eventUtils.disableOrphans); // Mutator flyouts go inside the mutator workspace's rather than in // a top level SVG. Instead of handling scale themselves, mutators // inherit scale from the parent workspace. // To fix this, scale needs to be applied at a different level in the DOM. - const flyoutSvg = hasFlyout ? this.workspace.addFlyout(Svg.G) : null; - const background = this.workspace.createDom('blocklyMutatorBackground'); + const flyoutSvg = hasFlyout ? this.workspace_.addFlyout(Svg.G) : null; + const background = this.workspace_.createDom('blocklyMutatorBackground'); if (flyoutSvg) { // Insert the flyout after the but before the block canvas so that // the flyout is underneath in z-order. This makes blocks layering during // dragging work properly. - background.insertBefore(flyoutSvg, this.workspace.svgBlockCanvas_); + background.insertBefore(flyoutSvg, this.workspace_.svgBlockCanvas_); } this.svgDialog.appendChild(background); @@ -253,15 +257,15 @@ export class Mutator extends Icon { /** Resize the bubble to match the size of the workspace. */ private resizeBubble() { // If the bubble exists, the workspace also exists. - if (!this.workspace) { + if (!this.workspace_) { return; } const doubleBorderWidth = 2 * Bubble.BORDER_WIDTH; - const canvas = this.workspace.getCanvas(); + const canvas = this.workspace_.getCanvas(); const workspaceSize = canvas.getBBox(); let width = workspaceSize.width + workspaceSize.x; let height = workspaceSize.height + doubleBorderWidth * 3; - const flyout = this.workspace.getFlyout(); + const flyout = this.workspace_.getFlyout(); if (flyout) { const flyoutScrollMetrics = flyout.getWorkspace().getMetricsManager().getScrollMetrics(); @@ -285,20 +289,20 @@ export class Mutator extends Icon { width + doubleBorderWidth, height + doubleBorderWidth); this.svgDialog!.setAttribute('width', `${width}`); this.svgDialog!.setAttribute('height', `${height}`); - this.workspace.setCachedParentSvgSize(width, height); + this.workspace_.setCachedParentSvgSize(width, height); } if (isRtl) { // Scroll the workspace to always left-align. canvas.setAttribute('transform', `translate(${this.workspaceWidth}, 0)`); } - this.workspace.resize(); + this.workspace_.resize(); } /** A method handler for when the bubble is moved. */ private onBubbleMove() { - if (this.workspace) { - this.workspace.recordDragTargets(); + if (this.workspace_) { + this.workspace_.recordDragTargets(); } } @@ -321,7 +325,7 @@ export class Mutator extends Icon { block.workspace, this.createEditor(), block.pathObject.svgPath, (this.iconXY_ as Coordinate), null, null); // The workspace was created in createEditor. - const ws = this.workspace!; + const ws = this.workspace_!; // Expose this mutator's block's ID on its top-level SVG group. this.bubble_.setSvgId(block.id); this.bubble_.registerMoveEvent(this.onBubbleMove.bind(this)); @@ -374,8 +378,8 @@ export class Mutator extends Icon { } else { // Dispose of the bubble. this.svgDialog = null; - this.workspace!.dispose(); - this.workspace = null; + this.workspace_!.dispose(); + this.workspace_ = null; this.rootBlock = null; this.bubble_?.dispose(); this.bubble_ = null; @@ -420,8 +424,8 @@ export class Mutator extends Icon { * Bump down any block that's too high. */ private updateWorkspace() { - if (!this.workspace!.isDragging()) { - const blocks = this.workspace!.getTopBlocks(false); + if (!this.workspace_!.isDragging()) { + const blocks = this.workspace_!.getTopBlocks(false); const MARGIN = 20; for (let b = 0, block; block = blocks[b]; b++) { @@ -434,7 +438,7 @@ export class Mutator extends Icon { // Bump any block overlapping the flyout back inside. if (block.RTL) { let right = -MARGIN; - const flyout = this.workspace!.getFlyout(); + const flyout = this.workspace_!.getFlyout(); if (flyout) { right -= flyout.getWidth(); } @@ -448,7 +452,7 @@ export class Mutator extends Icon { } // When the mutator's workspace changes, update the source block. - if (this.rootBlock && this.rootBlock.workspace === this.workspace) { + if (this.rootBlock && this.rootBlock.workspace === this.workspace_) { const existingGroup = eventUtils.getGroup(); if (!existingGroup) { eventUtils.setGroup(true); @@ -488,7 +492,7 @@ export class Mutator extends Icon { // Don't update the bubble until the drag has ended, to avoid moving // blocks under the cursor. - if (!this.workspace!.isDragging()) { + if (!this.workspace_!.isDragging()) { setTimeout(() => this.resizeBubble(), 0); } eventUtils.setGroup(existingGroup); @@ -503,7 +507,7 @@ export class Mutator extends Icon { /** Update the styles on all blocks in the mutator. */ updateBlockStyle() { - const ws = this.workspace; + const ws = this.workspace_; if (ws && ws.getAllBlocks(false)) { const workspaceBlocks = ws.getAllBlocks(false); From 7b055dbc7e227b2aeb82a51bb7ac8d62e9cc9da6 Mon Sep 17 00:00:00 2001 From: Beka Westberg Date: Fri, 18 Nov 2022 16:01:41 -0800 Subject: [PATCH 18/73] chore(tests): test running procedure events (#6627) * chore: define necessary events * chore: cleanup test organization * chore: cleanup comment * chore: move assertEventFiredShallow to test helpers * chore: add tests for running the procedure change return events * chore: work on tests?? * chore: add tests for running the change return events * chore: add tests for running enable events * chore: add tests for procedure rename events * chore: add tests for renaming procedure parameters * chore: add tests for running procedure create events * chore: add tests for running procedure parameter create events * chore: add tests for running procedure delete events * chore: add tests for running procedure parameter delete events * chore: skip all tests for running procedure events --- core/events/events_abstract.ts | 4 +- .../event_procedure_change_return_test.js | 181 +++++++++++++++ tests/mocha/event_procedure_create_test.js | 155 +++++++++++++ tests/mocha/event_procedure_delete_test.js | 156 +++++++++++++ tests/mocha/event_procedure_enable_test.js | 175 +++++++++++++++ .../event_procedure_parameter_create_test.js | 200 +++++++++++++++++ .../event_procedure_parameter_delete_test.js | 200 +++++++++++++++++ .../event_procedure_parameter_rename_test.js | 206 ++++++++++++++++++ tests/mocha/event_procedure_rename_test.js | 170 +++++++++++++++ tests/mocha/index.html | 8 + tests/mocha/procedure_map_test.js | 82 +++---- tests/mocha/test_helpers/events.js | 43 ++++ 12 files changed, 1527 insertions(+), 53 deletions(-) create mode 100644 tests/mocha/event_procedure_change_return_test.js create mode 100644 tests/mocha/event_procedure_create_test.js create mode 100644 tests/mocha/event_procedure_delete_test.js create mode 100644 tests/mocha/event_procedure_enable_test.js create mode 100644 tests/mocha/event_procedure_parameter_create_test.js create mode 100644 tests/mocha/event_procedure_parameter_delete_test.js create mode 100644 tests/mocha/event_procedure_parameter_rename_test.js create mode 100644 tests/mocha/event_procedure_rename_test.js diff --git a/core/events/events_abstract.ts b/core/events/events_abstract.ts index dab2c8c00..39d01c040 100644 --- a/core/events/events_abstract.ts +++ b/core/events/events_abstract.ts @@ -113,10 +113,10 @@ export abstract class Abstract { * @param _forward True if run forward, false if run backward (undo). */ run(_forward: boolean) { - // Defined by subclasses. + // Defined by subclasses. Cannot be abstract b/c UI events do /not/ define + // this. } - /** * Get workspace the event belongs to. * diff --git a/tests/mocha/event_procedure_change_return_test.js b/tests/mocha/event_procedure_change_return_test.js new file mode 100644 index 000000000..b18e5d086 --- /dev/null +++ b/tests/mocha/event_procedure_change_return_test.js @@ -0,0 +1,181 @@ +/** + * @license + * Copyright 2022 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +goog.declareModuleId('Blockly.test.eventProcedureChangeReturn'); + +import {assertEventFiredShallow, assertEventNotFired, createChangeListenerSpy} from './test_helpers/events.js'; +import {sharedTestSetup, sharedTestTeardown} from './test_helpers/setup_teardown.js'; + + +// TODO (#6519): Unskip. +suite.skip('Procedure Change Return Event', function() { + setup(function() { + sharedTestSetup.call(this); + this.workspace = new Blockly.Workspace(); + this.procedureMap = this.workspace.getProcedureMap(); + this.eventSpy = createChangeListenerSpy(this.workspace); + }); + + teardown(function() { + sharedTestTeardown.call(this); + }); + + suite('running', function() { + const DEFAULT_TYPES = null; + const NON_DEFAULT_TYPES = []; + + setup(function() { + this.createProcedureModel = (id) => { + return new Blockly.procedures.ObservableProcedureModel( + this.workspace, 'test name', id); + }; + + this.createEventToState = (procedureModel) => { + return new Blockly.Events.ProcedureChangeReturn( + this.workspace, + procedureModel, + procedureModel.getReturnTypes()); + }; + }); + + suite('forward (redo)', function() { + test('the procedure with the matching ID has its return set', function() { + const initial = this.createProcedureModel('test id'); + const final = this.createProcedureModel('test id'); + final.setReturnTypes(NON_DEFAULT_TYPES); + const event = this.createEventToState(final); + this.procedureMap.add(initial); + + event.run(true /* forward */); + + chai.assert.equal( + initial.getReturnTypes(), + final.getReturnTypes(), + "Expected the procedure's return type to be toggled"); + }); + + test('changing the return fires a change return event', function() { + const initial = this.createProcedureModel('test id'); + const final = this.createProcedureModel('test id'); + final.setReturnTypes(NON_DEFAULT_TYPES); + const event = this.createEventToState(final); + this.procedureMap.add(initial); + + this.eventSpy.resetHistory(); + event.run(true /* forward */); + + assertEventFiredShallow( + this.eventSpy, + Blockly.Events.ProcedureChangeReturn, + { + model: initial, + oldTypes: DEFAULT_TYPES, + }, + this.workspace.id); + }); + + test('noop return changes do not fire change return events', function() { + const initial = this.createProcedureModel('test id'); + const final = this.createProcedureModel('test id'); + const event = this.createEventToState(final); + this.procedureMap.add(initial); + + this.eventSpy.resetHistory(); + event.run(true /* forward */); + + assertEventNotFired( + this.eventSpy, + Blockly.Events.ProcedureChangeReturn, + {}, + this.workspace.id); + }); + + test( + 'attempting to change the return of a procedure that ' + + 'does not exist in the map throws', + function() { + const initial = this.createProcedureModel('test id'); + const final = this.createProcedureModel('test id'); + const event = this.createEventToState(final); + + chai.assert.throws(() => { + event.run(true /* forward */); + }); + }); + }); + + suite('backward (undo)', function() { + test('the procedure with the matching ID has its return set', function() { + const initial = this.createProcedureModel('test id'); + const undoable = this.createProcedureModel('test id'); + initial.setReturnTypes(NON_DEFAULT_TYPES); + undoable.setReturnTypes(NON_DEFAULT_TYPES); + const event = this.createEventToState(undoable); + this.procedureMap.add(initial); + + event.run(false /* backward */); + + chai.assert.equal( + initial.getReturnTypes(), + DEFAULT_TYPES, + "Expected the procedure's return type to be toggled"); + }); + + test('changing the return fires a change return event', function() { + const initial = this.createProcedureModel('test id'); + const undoable = this.createProcedureModel('test id'); + initial.setReturnTypes(NON_DEFAULT_TYPES); + undoable.setReturnTypes(NON_DEFAULT_TYPES); + const event = this.createEventToState(undoable); + this.procedureMap.add(initial); + + this.eventSpy.resetHistory(); + event.run(false /* backward */); + + assertEventFiredShallow( + this.eventSpy, + Blockly.Events.ProcedureChangeReturn, + { + model: initial, + oldTypes: DEFAULT_TYPES, + }, + this.workspace.id); + }); + + test('noop return changes do not fire change return events', function() { + const initial = this.createProcedureModel('test id'); + const undoable = this.createProcedureModel('test id'); + undoable.setReturnTypes(NON_DEFAULT_TYPES); + const event = this.createEventToState(undoable); + this.procedureMap.add(initial); + + this.eventSpy.resetHistory(); + event.run(false /* backward */); + + assertEventNotFired( + this.eventSpy, + Blockly.Events.ProcedureChangeReturn, + {}, + this.workspace.id); + }); + + test( + 'attempting to change the return of a procedure that ' + + 'does not exist throws', + function() { + const initial = this.createProcedureModel('test id'); + const undoable = this.createProcedureModel('test id'); + initial.setReturnTypes(NON_DEFAULT_TYPES); + undoable.setReturnTypes(NON_DEFAULT_TYPES); + const event = this.createEventToState(undoable); + + chai.assert.throws(() => { + event.run(false /* backward */); + }); + }); + }); + }); +}); diff --git a/tests/mocha/event_procedure_create_test.js b/tests/mocha/event_procedure_create_test.js new file mode 100644 index 000000000..295d2eab2 --- /dev/null +++ b/tests/mocha/event_procedure_create_test.js @@ -0,0 +1,155 @@ +/** + * @license + * Copyright 2022 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +goog.declareModuleId('Blockly.test.eventProcedureCreate'); + +import {assertEventFiredShallow, assertEventNotFired, createChangeListenerSpy} from './test_helpers/events.js'; +import {sharedTestSetup, sharedTestTeardown} from './test_helpers/setup_teardown.js'; + + +// TODO (#6519): Unskip. +suite.skip('Procedure Create Event', function() { + setup(function() { + sharedTestSetup.call(this); + this.workspace = new Blockly.Workspace(); + this.procedureMap = this.workspace.getProcedureMap(); + this.eventSpy = createChangeListenerSpy(this.workspace); + }); + + teardown(function() { + sharedTestTeardown.call(this); + }); + + suite('running', function() { + setup(function() { + this.createProcedureModel = (name, id) => { + return new Blockly.procedures.ObservableProcedureModel( + this.workspace, name, id); + }; + + this.createEventToState = (procedureModel) => { + return new Blockly.Events.ProcedureCreate(this.workspace, procedureModel); + }; + }); + + suite('forward', function() { + test('a procedure model is created if it does not exist', function() { + const model = this.createProcedureModel('test name', 'test id'); + const event = this.createEventToState(model); + + event.run(true /* forward */); + + const createdProc = this.procedureMap.get('test id'); + chai.assert.isDefined(createdProc, 'Expected the procedure to exist'); + chai.assert.equal( + createdProc.getName(), + model.getName(), + "Expected the procedure's name to match the model"); + chai.assert.equal( + createdProc.getId(), + model.getId(), + "Expected the procedure's id to match the model"); + }); + + test('creating a procedure model fires a create event', function() { + const model = this.createProcedureModel('test name', 'test id'); + const event = this.createEventToState(model); + + this.eventSpy.resetHistory(); + event.run(true /* forward */); + + assertEventFiredShallow( + this.eventSpy, + Blockly.Events.ProcedureCreate, + {model: this.procedureMap.get('testid')}, + this.workspace.id); + }); + + test( + 'a procedure model is not created if a model with a ' + + 'matching ID exists', + function() { + const model = this.createProcedureModel('test name', 'test id'); + const event = this.createEventToState(model); + this.procedureMap.add(model); + + event.run(true /* forward */); + + chai.assert.equal( + this.procedureMap.get('test id'), + model, + 'Expected the model in the procedure map to be the same ' + + 'as the original model'); + }); + + test('not creating a model does not fire a create event', function() { + const model = this.createProcedureModel('test name', 'test id'); + const event = this.createEventToState(model); + this.procedureMap.add(model); + + this.eventSpy.resetHistory(); + event.run(true /* forward */); + + assertEventNotFired( + this.eventSpy, + Blockly.Events.ProcedureCreate, + {}, + this.workspace.id); + }); + }); + + suite('backward', function() { + test( + 'a procedure model is deleted if a model with a matching ID exists', + function() { + const model = this.createProcedureModel('test name', 'test id'); + const event = this.createEventToState(model); + this.procedureMap.add(model); + + event.run(false /* backward */); + + chai.assert.isUndefined( + this.procedureMap.get('test id'), + 'Expected the procedure to be deleted'); + }); + + test('deleting a model fires a delete event', function() { + const model = this.createProcedureModel('test name', 'test id'); + const event = this.createEventToState(model); + this.procedureMap.add(model); + + this.eventSpy.resetHistory(); + event.run(false /* backward */); + + assertEventFiredShallow( + this.eventSpy, + Blockly.Events.ProcedureDelete, + {model}, + this.workspace.id); + }); + + test.skip( + 'a model is not deleted if no model with a matching ID exists', + function() { + // TODO: Do we want this to throw? warn? do nothing? + }); + + test('not deleting a model does not fire a delete event', function() { + const model = this.createProcedureModel('test name', 'test id'); + const event = this.createEventToState(model); + + this.eventSpy.resetHistory(); + event.run(false /* backward */); + + assertEventNotFired( + this.eventSpy, + Blockly.Events.ProcedureDelete, + {}, + this.workspace.id); + }); + }); + }); +}); diff --git a/tests/mocha/event_procedure_delete_test.js b/tests/mocha/event_procedure_delete_test.js new file mode 100644 index 000000000..a4e8f397b --- /dev/null +++ b/tests/mocha/event_procedure_delete_test.js @@ -0,0 +1,156 @@ +/** + * @license + * Copyright 2022 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +goog.declareModuleId('Blockly.test.eventProcedureDelete'); + +import {assertEventFiredShallow, assertEventNotFired, createChangeListenerSpy} from './test_helpers/events.js'; +import {sharedTestSetup, sharedTestTeardown} from './test_helpers/setup_teardown.js'; + + +// TODO (#6519): Unskip. +suite.skip('Procedure Delete Event', function() { + setup(function() { + sharedTestSetup.call(this); + this.workspace = new Blockly.Workspace(); + this.procedureMap = this.workspace.getProcedureMap(); + this.eventSpy = createChangeListenerSpy(this.workspace); + }); + + teardown(function() { + sharedTestTeardown.call(this); + }); + + suite('running', function() { + setup(function() { + this.createProcedureModel = (name, id) => { + return new Blockly.procedures.ObservableProcedureModel( + this.workspace, name, id); + }; + + this.createEventToState = (procedureModel) => { + return new Blockly.Events.ProcedureDelete( + this.workspace, procedureModel); + }; + }); + + suite('forward', function() { + test( + 'a procedure model is deleted if a model with a matching ID exists', + function() { + const model = this.createProcedureModel('test name', 'test id'); + const event = this.createEventToState(model); + this.procedureMap.add(model); + + event.run(true /* forward */); + + chai.assert.isUndefined( + this.procedureMap.get('test id'), + 'Expected the procedure to be deleted'); + }); + + test('deleting a model fires a delete event', function() { + const model = this.createProcedureModel('test name', 'test id'); + const event = this.createEventToState(model); + this.procedureMap.add(model); + + this.eventSpy.resetHistory(); + event.run(true /* forward */); + + assertEventFiredShallow( + this.eventSpy, + Blockly.Events.ProcedureDelete, + {model}, + this.workspace.id); + }); + + test( + 'a model is not deleted if if nodel with a matching ID exists', + function() { + // TODO: Figure out what we want to do here. + }); + + test('not deleting a model does not fire a delete event', function() { + const model = this.createProcedureModel('test name', 'test id'); + const event = this.createEventToState(model); + + this.eventSpy.resetHistory(); + event.run(true /* forward */); + + assertEventNotFired( + this.eventSpy, + Blockly.Events.ProcedureDelete, + {}, + this.workspace.id); + }); + }); + + suite('backward', function() { + test('a procedure model is created if it does not exist', function() { + const model = this.createProcedureModel('test name', 'test id'); + const event = this.createEventToState(model); + + event.run(false /* backward */); + + const createdProc = this.procedureMap.get('test id'); + chai.assert.isDefined(createdProc, 'Expected the procedure to exist'); + chai.assert.equal( + createdProc.getName(), + model.getName(), + "Expected the procedure's name to match the model"); + chai.assert.equal( + createdProc.getId(), + model.getId(), + "Expected the procedure's id to match the model"); + }); + + test('creating a procedure model fires a create event', function() { + const model = this.createProcedureModel('test name', 'test id'); + const event = this.createEventToState(model); + + this.eventSpy.resetHistory(); + event.run(false /* backward */); + + assertEventFiredShallow( + this.eventSpy, + Blockly.Events.ProcedureCreate, + {model: this.procedureMap.get('testid')}, + this.workspace.id); + }); + + test( + 'a procedure model is not created if a model with a ' + + 'matching ID exists', + function() { + const model = this.createProcedureModel('test name', 'test id'); + const event = this.createEventToState(model); + this.procedureMap.add(model); + + event.run(false /* backward */); + + chai.assert.equal( + this.procedureMap.get('test id'), + model, + 'Expected the model in the procedure map to be the same ' + + 'as the original model'); + }); + + test('not creating a model does not fire a create event', function() { + const model = this.createProcedureModel('test name', 'test id'); + const event = this.createEventToState(model); + this.procedureMap.add(model); + + this.eventSpy.resetHistory(); + event.run(true /* forward */); + + assertEventNotFired( + this.eventSpy, + Blockly.Events.ProcedureCreate, + {}, + this.workspace.id); + }); + }); + }); +}); diff --git a/tests/mocha/event_procedure_enable_test.js b/tests/mocha/event_procedure_enable_test.js new file mode 100644 index 000000000..30c32b7ea --- /dev/null +++ b/tests/mocha/event_procedure_enable_test.js @@ -0,0 +1,175 @@ +/** + * @license + * Copyright 2022 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +goog.declareModuleId('Blockly.test.eventProcedureEnable'); + +import {assertEventFiredShallow, assertEventNotFired, createChangeListenerSpy} from './test_helpers/events.js'; +import {sharedTestSetup, sharedTestTeardown} from './test_helpers/setup_teardown.js'; + + +// TODO (#6519): Unskip. +suite.skip('Procedure Enable Event', function() { + setup(function() { + sharedTestSetup.call(this); + this.workspace = new Blockly.Workspace(); + this.procedureMap = this.workspace.getProcedureMap(); + this.eventSpy = createChangeListenerSpy(this.workspace); + }); + + teardown(function() { + sharedTestTeardown.call(this); + }); + + suite('running', function() { + setup(function() { + this.createProcedureModel = (id) => { + return new Blockly.procedures.ObservableProcedureModel( + this.workspace, 'test name'); + }; + + this.createEventToState = (procedureModel) => { + return new Blockly.Events.ProcedureEnable(procedureModel); + }; + }); + + suite('forward', function() { + test('the procedure with the matching ID is toggled', function() { + const initial = this.createProcedureModel('test id'); + const final = this.createProcedureModel('test id'); + final.setEnabled(!final.getEnabled()); // Set it to the non-default. + const event = this.createEventToState(final); + this.procedureMap.add(initial); + + event.run(true /* forward */); + + chai.assert.equal( + initial.getEnabled(), + final.getEnabled(), + "Expected the procedure's enabled state to be flipped"); + }); + + test('toggling a procedure fires an enable event', function() { + const initial = this.createProcedureModel('test id'); + const final = this.createProcedureModel('test id'); + final.setEnabled(!final.getEnabled()); // Set it to the non-default. + const event = this.createEventToState(final); + this.procedureMap.add(initial); + + this.eventSpy.resetHistory(); + event.run(true /* forward */); + + assertEventFiredShallow( + this.eventSpy, + Blockly.Events.ProcedureEnable, + {model: initial}, + this.workspace.id); + }); + + test('noop toggles do not fire enable events', function() { + const initial = this.createProcedureModel('test id'); + const final = this.createProcedureModel('test id'); + const event = this.createEventToState(final); + this.procedureMap.add(initial); + + this.eventSpy.resetHistory(); + event.run(true /* forward */); + + assertEventNotFired( + this.eventSpy, + Blockly.Events.ProcedureEnable, + this.workspace.id); + }); + + test( + 'attempting to toggle a procedure that does not exist throws', + function() { + const initial = this.createProcedureModel('test id'); + const final = this.createProcedureModel('test id'); + final.setEnabled(!final.getEnabled()); // Set it to the non-default. + const event = this.createEventToState(final); + + chai.assert.throws(() => { + event.run(true /* forward */); + }); + }); + }); + + suite('backward', function() { + test('the procedure with the matching ID is toggled', function() { + const initial = this.createProcedureModel('test id'); + const undoable = this.createProcedureModel('test id'); + // Set them to be non-default. + const defaultEnabled = initial.getEnabled(); + initial.setEnabled(!defaultEnabled); + undoable.setEnabled(!defaultEnabled); + const event = this.createEventToState(undoable); + this.procedureMap.add(initial); + + event.run(false /* backward */); + + chai.assert.equal( + initial.getEnabled(), + defaultEnabled, + "Expected the procedure's enabled state to be flipped"); + }); + + test('toggling a procedure fires an enable event', function() { + const initial = this.createProcedureModel('test id'); + const undoable = this.createProcedureModel('test id'); + // Set them to be non-default. + const defaultEnabled = initial.getEnabled(); + initial.setEnabled(!defaultEnabled); + undoable.setEnabled(!defaultEnabled); + const event = this.createEventToState(undoable); + this.procedureMap.add(initial); + + this.eventSpy.resetHistory(); + event.run(false /* backward */); + + assertEventFiredShallow( + this.eventSpy, + Blockly.Events.ProcedureEnable, + {model: initial}, + this.workspace.id); + }); + + test('noop toggles do not fire enable events', function() { + const initial = this.createProcedureModel('test id'); + const undoable = this.createProcedureModel('test id'); + // Set them to be non-default. + const defaultEnabled = initial.getEnabled(); + undoable.setEnabled(!defaultEnabled); + const event = this.createEventToState(undoable); + this.procedureMap.add(initial); + + this.eventSpy.resetHistory(); + event.run(false /* backward */); + + assertEventNotFired( + this.eventSpy, + Blockly.Events.ProcedureEnable, + {}, + this.workspace.id); + }); + + test( + 'attempting to toggle a procedure that does not exist throws', + function() { + const initial = this.createProcedureModel('test id'); + const undoable = this.createProcedureModel('test id'); + // Set them to be non-default. + const defaultEnabled = initial.getEnabled(); + initial.setEnabled(!defaultEnabled); + undoable.setEnabled(!defaultEnabled); + const event = this.createEventToState(undoable); + + chai.assert.throws(() => { + event.run(false /* backward */); + }); + }); + }); + }); +}); diff --git a/tests/mocha/event_procedure_parameter_create_test.js b/tests/mocha/event_procedure_parameter_create_test.js new file mode 100644 index 000000000..92348cf42 --- /dev/null +++ b/tests/mocha/event_procedure_parameter_create_test.js @@ -0,0 +1,200 @@ +/** + * @license + * Copyright 2022 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +goog.declareModuleId('Blockly.test.eventProcedureParameterCreate'); + +import {assertEventFiredShallow, assertEventNotFired, createChangeListenerSpy} from './test_helpers/events.js'; +import {sharedTestSetup, sharedTestTeardown} from './test_helpers/setup_teardown.js'; + + +// TODO (#6519): Unskip. +suite.skip('Procedure Parameter Create Event', function() { + setup(function() { + sharedTestSetup.call(this); + this.workspace = new Blockly.Workspace(); + this.procedureMap = this.workspace.getProcedureMap(); + this.eventSpy = createChangeListenerSpy(this.workspace); + }); + + teardown(function() { + sharedTestTeardown.call(this); + }); + + suite('running', function() { + setup(function() { + this.createProcedureModel = (name, id) => { + return new Blockly.procedures.ObservableProcedureModel( + this.workspace, name, id); + }; + + this.createProcedureAndParameter = + (procName, procId, paramName, paramId) => { + const param = new Blockly.procedures.ObservableParameterModel( + this.workspace, procName, paramId); + const proc = new Blockly.procedures.ObservableProcedureModel( + this.workspace, paramName, procId) + .insertParameter(param, 0); + return {param, proc}; + }; + + this.createEventToState = (procedureModel, parameterModel) => { + return new Blockly.Events.ProcedureParameterCreate( + this.workspace, procedureModel, parameterModel); + }; + }); + + suite('forward', function() { + test('a parameter is inserted if it does not exist', function() { + const {param: modelParam, proc: modelProc} = + this.createProcedureAndParameter( + 'test name', 'test id', 'test param name', 'test param id'); + const event = this.createEventToState(modelProc, modelParam); + const actualProc = this.createProcedureModel('test name', 'test id'); + this.procedureMap.add(actualProc); + + event.run(true /* forward */); + + const createdParam = actualProc.getParameter(0); + chai.assert.isDefined(createdParam, 'Expected the parameter to exist'); + chai.assert.equal( + createdParam.getName(), + modelParam.getName(), + "Expected the parameter's name to match the model"); + chai.assert.equal( + createdParam.getId(), + modelParam.getId(), + "Expected the parameter's id to match the model"); + }); + + test('inserting a parameter fires a create event', function() { + const {param: modelParam, proc: modelProc} = + this.createProcedureAndParameter( + 'test name', 'test id', 'test param name', 'test param id'); + const event = this.createEventToState(modelProc, modelParam); + const actualProc = this.createProcedureModel('test name', 'test id'); + this.procedureMap.add(actualProc); + + this.eventSpy.resetHistory(); + event.run(true /* forward */); + + assertEventFiredShallow( + this.eventSpy, + Blockly.Events.ProcedureParameterCreate, + { + model: actualProc, + parameter: actualProc.getParameter(0), + index: 0, + }, + this.workspace.id); + }); + + test( + 'a parameter is not created if a parameter with a ' + + 'matching ID and index already exists', + function() { + const {param: modelParam, proc: modelProc} = + this.createProcedureAndParameter( + 'test name', 'test id', 'test param name', 'test param id'); + const event = this.createEventToState(modelProc, modelParam); + this.procedureMap.add(modelProc); + + this.eventSpy.resetHistory(); + event.run(true /* forward */); + + const actualProc = this.procedureMap.get('test id'); + chai.assert.equal( + actualProc, + modelProc, + 'Expected the procedure in the procedure map to not have changed'); + chai.assert.equal( + actualProc.getParameter(0), + modelParam, + 'Expected the parameter to not have changed'); + }); + + test( + 'not creating a parameter model does not fire a create event', + function() { + const {param: modelParam, proc: modelProc} = + this.createProcedureAndParameter( + 'test name', 'test id', 'test param name', 'test param id'); + const event = this.createEventToState(modelProc, modelParam); + this.procedureMap.add(modelProc); + + this.eventSpy.resetHistory(); + event.run(true /* forward */); + + assertEventNotFired( + this.eventSpy, + Blockly.Events.ProcedureParameterCreate, + {}, + this.workspace.id); + }); + }); + + suite('backward', function() { + test('a parameter is removed if it exists', function() { + const {param, proc} = + this.createProcedureAndParameter( + 'test name', 'test id', 'test param name', 'test param id'); + const event = this.createEventToState(proc, param); + this.procedureMap.add(proc); + + event.run(false /* backward */); + + chai.assert.isUndefined( + proc.getParameter(0), + 'Expected the parameter to be deleted'); + }); + + test('removing a parameter fires a delete event', function() { + const {param, proc} = + this.createProcedureAndParameter( + 'test name', 'test id', 'test param name', 'test param id'); + const event = this.createEventToState(proc, param); + this.procedureMap.add(proc); + + this.eventSpy.resetHistory(); + event.run(false /* backward */); + + assertEventFiredShallow( + this.eventSpy, + Blockly.Events.ProcedureParameterDelete, + { + model: proc, + parameter: param, + index: 0, + }, + this.workspace.id); + }); + + test( + 'a parameter is not deleted if a parameter with a ' + + 'matching ID and index does not exist', + function() { + // TODO: Figure out what we want to do in this case. + }); + + test('not removing a parameter does not fire a delete event', function() { + const {param, proc} = + this.createProcedureAndParameter( + 'test name', 'test id', 'test param name', 'test param id'); + const event = this.createEventToState(proc, param); + this.procedureMap.add(proc); + proc.deleteParameter(0); + + this.eventSpy.resetHistory(); + event.run(false /* backward */); + + assertEventNotFired( + this.eventSpy, + Blockly.Events.ProcedureParameterDelete, + {}, + this.workspace.id); + }); + }); + }); +}); diff --git a/tests/mocha/event_procedure_parameter_delete_test.js b/tests/mocha/event_procedure_parameter_delete_test.js new file mode 100644 index 000000000..d3dcc9ca0 --- /dev/null +++ b/tests/mocha/event_procedure_parameter_delete_test.js @@ -0,0 +1,200 @@ +/** + * @license + * Copyright 2022 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +goog.declareModuleId('Blockly.test.eventProcedureParameterDelete'); + +import {assertEventFiredShallow, assertEventNotFired, createChangeListenerSpy} from './test_helpers/events.js'; +import {sharedTestSetup, sharedTestTeardown} from './test_helpers/setup_teardown.js'; + + +// TODO (#6519): Unskip. +suite.skip('Procedure Parameter Delete Event', function() { + setup(function() { + sharedTestSetup.call(this); + this.workspace = new Blockly.Workspace(); + this.procedureMap = this.workspace.getProcedureMap(); + this.eventSpy = createChangeListenerSpy(this.workspace); + }); + + teardown(function() { + sharedTestTeardown.call(this); + }); + + suite('running', function() { + setup(function() { + this.createProcedureModel = (name, id) => { + return new Blockly.procedures.ObservableProcedureModel( + this.workspace, name, id); + }; + + this.createProcedureAndParameter = + (procName, procId, paramName, paramId) => { + const param = new Blockly.procedures.ObservableParameterModel( + this.workspace, procName, paramId); + const proc = new Blockly.procedures.ObservableProcedureModel( + this.workspace, paramName, procId) + .insertParameter(param, 0); + return {param, proc}; + }; + + this.createEventToState = (procedureModel, parameterModel) => { + return new Blockly.Events.ProcedureParameterCreate( + this.workspace, procedureModel, parameterModel); + }; + }); + + suite('forward', function() { + test('a parameter is removed if it exists', function() { + const {param, proc} = + this.createProcedureAndParameter( + 'test name', 'test id', 'test param name', 'test param id'); + const event = this.createEventToState(proc, param); + this.procedureMap.add(proc); + + event.run(true /* forward */); + + chai.assert.isUndefined( + proc.getParameter(0), + 'Expected the parameter to be deleted'); + }); + + test('removing a parameter fires a delete event', function() { + const {param, proc} = + this.createProcedureAndParameter( + 'test name', 'test id', 'test param name', 'test param id'); + const event = this.createEventToState(proc, param); + this.procedureMap.add(proc); + + this.eventSpy.resetHistory(); + event.run(true /* forward */); + + assertEventFiredShallow( + this.eventSpy, + Blockly.Events.ProcedureParameterDelete, + { + model: proc, + parameter: param, + index: 0, + }, + this.workspace.id); + }); + + test( + 'a parameter is not deleted if a parameter with a ' + + 'matching ID and index does not exist', + function() { + // TODO: Figure out what we want to do in this case. + }); + + test('not removing a parameter does not fire a delete event', function() { + const {param, proc} = + this.createProcedureAndParameter( + 'test name', 'test id', 'test param name', 'test param id'); + const event = this.createEventToState(proc, param); + this.procedureMap.add(proc); + proc.deleteParameter(0); + + this.eventSpy.resetHistory(); + event.run(false /* backward */); + + assertEventNotFired( + this.eventSpy, + Blockly.Events.ProcedureParameterDelete, + {}, + this.workspace.id); + }); + }); + + suite('backward', function() { + test('a parameter is inserted if it does not exist', function() { + const {param: modelParam, proc: modelProc} = + this.createProcedureAndParameter( + 'test name', 'test id', 'test param name', 'test param id'); + const event = this.createEventToState(modelProc, modelParam); + const actualProc = this.createProcedureModel('test name', 'test id'); + this.procedureMap.add(actualProc); + + event.run(true /* forward */); + + const createdParam = actualProc.getParameter(0); + chai.assert.isDefined(createdParam, 'Expected the parameter to exist'); + chai.assert.equal( + createdParam.getName(), + modelParam.getName(), + "Expected the parameter's name to match the model"); + chai.assert.equal( + createdParam.getId(), + modelParam.getId(), + "Expected the parameter's id to match the model"); + }); + + test('inserting a parameter fires a create event', function() { + const {param: modelParam, proc: modelProc} = + this.createProcedureAndParameter( + 'test name', 'test id', 'test param name', 'test param id'); + const event = this.createEventToState(modelProc, modelParam); + const actualProc = this.createProcedureModel('test name', 'test id'); + this.procedureMap.add(actualProc); + + this.eventSpy.resetHistory(); + event.run(true /* forward */); + + assertEventFiredShallow( + this.eventSpy, + Blockly.Events.ProcedureParameterCreate, + { + model: actualProc, + parameter: actualProc.getParameter(0), + index: 0, + }, + this.workspace.id); + }); + + test( + 'a parameter is not created if a parameter with a ' + + 'matching ID and index already exists', + function() { + const {param: modelParam, proc: modelProc} = + this.createProcedureAndParameter( + 'test name', 'test id', 'test param name', 'test param id'); + const event = this.createEventToState(modelProc, modelParam); + this.procedureMap.add(modelProc); + + this.eventSpy.resetHistory(); + event.run(true /* forward */); + + const actualProc = this.procedureMap.get('test id'); + chai.assert.equal( + actualProc, + modelProc, + 'Expected the procedure in the procedure map to not have changed'); + chai.assert.equal( + actualProc.getParameter(0), + modelParam, + 'Expected the parameter to not have changed'); + }); + + test( + 'not creating a parameter model does not fire a create event', + function() { + const {param: modelParam, proc: modelProc} = + this.createProcedureAndParameter( + 'test name', 'test id', 'test param name', 'test param id'); + const event = this.createEventToState(modelProc, modelParam); + this.procedureMap.add(modelProc); + + this.eventSpy.resetHistory(); + event.run(true /* forward */); + + assertEventNotFired( + this.eventSpy, + Blockly.Events.ProcedureParameterCreate, + {}, + this.workspace.id); + }); + }); + }); +}); diff --git a/tests/mocha/event_procedure_parameter_rename_test.js b/tests/mocha/event_procedure_parameter_rename_test.js new file mode 100644 index 000000000..7bbaa2f3a --- /dev/null +++ b/tests/mocha/event_procedure_parameter_rename_test.js @@ -0,0 +1,206 @@ +/** + * @license + * Copyright 2022 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +goog.declareModuleId('Blockly.test.eventProcedureParameterRename'); + +import {assertEventFiredShallow, assertEventNotFired, createChangeListenerSpy} from './test_helpers/events.js'; +import {sharedTestSetup, sharedTestTeardown} from './test_helpers/setup_teardown.js'; + + +// TODO (#6519): Unskip. +suite.skip('Procedure Parameter Rename Event', function() { + setup(function() { + sharedTestSetup.call(this); + this.workspace = new Blockly.Workspace(); + this.procedureMap = this.workspace.getProcedureMap(); + this.eventSpy = createChangeListenerSpy(this.workspace); + }); + + teardown(function() { + sharedTestTeardown.call(this); + }); + + suite('running', function() { + const DEFAULT_NAME = 'default'; + const NON_DEFAULT_NAME = 'non-default'; + + setup(function() { + this.createProcedureAndParameter = (procId, paramId) => { + const param = new Blockly.procedures.ObservableParameterModel( + this.workspace, DEFAULT_NAME, paramId); + const proc = new Blockly.procedures.ObservableProcedureModel( + this.workspace, 'test name', procId) + .insertParameter(param, 0); + return {param, proc}; + }; + + this.createEventToState = (procedureModel, parameterModel) => { + return new Blockly.Events.ProcedureRename( + this.workspace, + procedureModel, + parameterModel, + parameterModel.getName()); + }; + }); + + suite('forward', function() { + test('the parameter with the matching ID and index is renamed', function() { + const {param: initialParam, proc: initialProc} = + this.createProcedureAndParameter('test procId', 'test paramId'); + const {param: finalParam, proc: finalProc} = + this.createProcedureAndParameter('test procId', 'test paramId'); + finalParam.setName(NON_DEFAULT_NAME); + const event = this.createEventToState(finalProc, finalParam); + this.procedureMap.add(initialProc); + + event.run(true /* forward */); + + chai.assert.equal( + initialParam.getName(), + finalParam.getName(), + "Expected the procedure parameter's name to be changed"); + }); + + test('renaming a parameter fires a rename event', function() { + const {param: initialParam, proc: initialProc} = + this.createProcedureAndParameter('test procId', 'test paramId'); + const {param: finalParam, proc: finalProc} = + this.createProcedureAndParameter('test procId', 'test paramId'); + finalParam.setName(NON_DEFAULT_NAME); + const event = this.createEventToState(finalProc, finalParam); + this.procedureMap.add(initialProc); + + this.eventSpy.resetHistory(); + event.run(true /* forward */); + + assertEventFiredShallow( + this.eventSpy, + Blockly.Events.ProcedureParameterRename, + { + model: initialProc, + parameter: initialParam, + oldName: DEFAULT_NAME, + }, + this.workspace.id); + }); + + test('noop renames do not fire rename events', function() { + const {param: initialParam, proc: initialProc} = + this.createProcedureAndParameter('test procId', 'test paramId'); + const {param: finalParam, proc: finalProc} = + this.createProcedureAndParameter('test procId', 'test paramId'); + const event = this.createEventToState(finalProc, finalParam); + this.procedureMap.add(initialProc); + + this.eventSpy.resetHistory(); + event.run(true /* forward */); + + assertEventNotFired( + this.eventSpy, + Blockly.Events.ProcedureParameterRename, + {}, + this.workspace.id); + }); + + test( + 'attempting to rename a parameter that does not exist throws', + function() { + const {param: initialParam, proc: initialProc} = + this.createProcedureAndParameter('test procId', 'test paramId'); + const {param: finalParam, proc: finalProc} = + this.createProcedureAndParameter('test procId', 'test paramId'); + finalParam.setName(NON_DEFAULT_NAME); + const event = this.createEventToState(finalProc, finalParam); + + chai.assert.throws(() => { + event.run(true /* forward */); + }); + }); + }); + + suite('backward', function() { + test('the parameter with the matching ID and index is renamed', function() { + const {param: initialParam, proc: initialProc} = + this.createProcedureAndParameter('test procId', 'test paramId'); + const {param: undoableParam, proc: undoableProc} = + this.createProcedureAndParameter('test procId', 'test paramId'); + initialParam.setName(NON_DEFAULT_NAME); + undoableParam.setName(NON_DEFAULT_NAME); + const event = this.createEventToState(undoableProc, undoableParam); + this.procedureMap.add(initialProc); + + this.eventSpy.resetHistory(); + event.run(false /* backward */); + + chai.assert.equal( + initialParam.getName(), + DEFAULT_NAME, + "Expected the procedure parameter's name to be changed"); + }); + + test('renaming a parameter fires a rename event', function() { + const {param: initialParam, proc: initialProc} = + this.createProcedureAndParameter('test procId', 'test paramId'); + const {param: undoableParam, proc: undoableProc} = + this.createProcedureAndParameter('test procId', 'test paramId'); + initialParam.setName(NON_DEFAULT_NAME); + undoableParam.setName(NON_DEFAULT_NAME); + const event = this.createEventToState(undoableProc, undoableParam); + this.procedureMap.add(initialProc); + + this.eventSpy.resetHistory(); + event.run(false /* backward */); + + + assertEventFiredShallow( + this.eventSpy, + Blockly.Events.ProcedureParameterRename, + { + model: initialProc, + parameter: initialParam, + oldName: NON_DEFAULT_NAME, + }, + this.workspace.id); + }); + + test('noop renames do not fire rename events', function() { + const {param: initialParam, proc: initialProc} = + this.createProcedureAndParameter('test procId', 'test paramId'); + const {param: undoableParam, proc: undoableProc} = + this.createProcedureAndParameter('test procId', 'test paramId'); + undoableParam.setName(NON_DEFAULT_NAME); + const event = this.createEventToState(undoableProc, undoableParam); + this.procedureMap.add(initialProc); + + event.run(false /* backward */); + + + assertEventNotFired( + this.eventSpy, + Blockly.Events.ProcedureParameterRename, + {}, + this.workspace.id); + }); + + test( + 'attempting to rename a parameter that does not exist throws', + function() { + const {param: initialParam, proc: initialProc} = + this.createProcedureAndParameter('test procId', 'test paramId'); + const {param: undoableParam, proc: undoableProc} = + this.createProcedureAndParameter('test procId', 'test paramId'); + initialParam.setName(NON_DEFAULT_NAME); + undoableParam.setName(NON_DEFAULT_NAME); + const event = this.createEventToState(undoableProc, undoableParam); + this.procedureMap.add(initialProc); + + chai.assert.throws(() => { + event.run(false /* backward */); + }); + }); + }); + }); +}); diff --git a/tests/mocha/event_procedure_rename_test.js b/tests/mocha/event_procedure_rename_test.js new file mode 100644 index 000000000..b034438f7 --- /dev/null +++ b/tests/mocha/event_procedure_rename_test.js @@ -0,0 +1,170 @@ +/** + * @license + * Copyright 2022 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +goog.declareModuleId('Blockly.test.eventProcedureRename'); + +import {assertEventFiredShallow, assertEventNotFired, createChangeListenerSpy} from './test_helpers/events.js'; +import {sharedTestSetup, sharedTestTeardown} from './test_helpers/setup_teardown.js'; + + +// TODO (#6519): Unskip. +suite.skip('Procedure Rename Event', function() { + setup(function() { + sharedTestSetup.call(this); + this.workspace = new Blockly.Workspace(); + this.procedureMap = this.workspace.getProcedureMap(); + this.eventSpy = createChangeListenerSpy(this.workspace); + }); + + teardown(function() { + sharedTestTeardown.call(this); + }); + + suite('running', function() { + const DEFAULT_NAME = 'default'; + const NON_DEFAULT_NAME = 'non-default'; + + setup(function() { + this.createProcedureModel = (id) => { + return new Blockly.procedures.ObservableProcedureModel( + this.workspace, DEFAULT_NAME, id); + }; + + this.createEventToState = (procedureModel) => { + return new Blockly.Events.ProcedureRename( + this.workspace, + procedureModel, + procedureModel.getName()); + }; + }); + + suite('forward', function() { + test('the procedure with the matching ID is renamed', function() { + const initial = this.createProcedureModel('test id'); + const final = this.createProcedureModel('test id'); + final.setName(NON_DEFAULT_NAME); + const event = this.createEventToState(final); + this.procedureMap.add(initial); + + event.run(true /* forward */); + + chai.assert.equal( + initial.getName(), + final.getName(), + "Expected the procedure's name to be changed"); + }); + + test('renaming a procedure fires a rename event', function() { + const initial = this.createProcedureModel('test id'); + const final = this.createProcedureModel('test id'); + final.setName(NON_DEFAULT_NAME); + const event = this.createEventToState(final); + this.procedureMap.add(initial); + + event.run(true /* forward */); + + assertEventFiredShallow( + this.eventSpy, + Blockly.Events.ProcedureRename, + {model: initial, oldName: DEFAULT_NAME}, + this.workspace.id); + }); + + test('noop renames do not fire rename events', function() { + const initial = this.createProcedureModel('test id'); + const final = this.createProcedureModel('test id'); + const event = this.createEventToState(final); + this.procedureMap.add(initial); + + event.run(true /* forward */); + + assertEventNotFired( + this.eventSpy, + Blockly.Events.ProcedureRename, + {}, + this.workspace.id); + }); + + test( + 'attempting to rename a procedure that does not exist throws', + function() { + const initial = this.createProcedureModel('test id'); + const final = this.createProcedureModel('test id'); + final.setName(NON_DEFAULT_NAME); + const event = this.createEventToState(final); + + chai.assert.throws(() => { + event.run(true /* forward */); + }); + }); + }); + + suite('backward', function() { + test('the procedure with the matching ID is renamed', function() { + const initial = this.createProcedureModel('test id'); + const undoable = this.createProcedureModel('test id'); + initial.setName(NON_DEFAULT_NAME); + undoable.setName(NON_DEFAULT_NAME); + const event = this.createEventToState(undoable); + this.procedureMap.add(initial); + + event.run(false /* backward */); + + chai.assert.equal( + initial.getName(), + DEFAULT_NAME, + "Expected the procedure's name to be changed"); + }); + + test('renaming a procedure fires a rename event', function() { + const initial = this.createProcedureModel('test id'); + const undoable = this.createProcedureModel('test id'); + initial.setName(NON_DEFAULT_NAME); + undoable.setName(NON_DEFAULT_NAME); + const event = this.createEventToState(undoable); + this.procedureMap.add(initial); + + event.run(false /* backward */); + + assertEventFiredShallow( + this.eventSpy, + Blockly.Events.ProcedureRename, + {model: initial, oldName: NON_DEFAULT_NAME}, + this.workspace.id); + }); + + test('noop renames do not fire rename events', function() { + const initial = this.createProcedureModel('test id'); + const undoable = this.createProcedureModel('test id'); + initial.setName(NON_DEFAULT_NAME); + const event = this.createEventToState(undoable); + this.procedureMap.add(initial); + + event.run(false /* backward */); + + assertEventNotFired( + this.eventSpy, + Blockly.Events.ProcedureRename, + {}, + this.workspace.id); + }); + + test( + 'attempting to rename a procedure that does not exist throws', + function() { + const initial = this.createProcedureModel('test id'); + const undoable = this.createProcedureModel('test id'); + initial.setName(NON_DEFAULT_NAME); + undoable.setName(NON_DEFAULT_NAME); + const event = this.createEventToState(undoable); + + chai.assert.throws(() => { + event.run(false /* backward */); + }); + }); + }); + }); +}); diff --git a/tests/mocha/index.html b/tests/mocha/index.html index 11640c37a..ce43ace99 100644 --- a/tests/mocha/index.html +++ b/tests/mocha/index.html @@ -73,6 +73,14 @@ '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', diff --git a/tests/mocha/procedure_map_test.js b/tests/mocha/procedure_map_test.js index 6d717a9db..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 {assertEventNotFired, createChangeListenerSpy} from './test_helpers/events.js'; +import {assertEventFiredShallow, assertEventNotFired, createChangeListenerSpy} from './test_helpers/events.js'; goog.declareModuleId('Blockly.test.procedureMap'); @@ -202,25 +202,6 @@ suite('Procedure Map', function() { }); suite('event firing', function() { - function shallowMatch(expected) { - return (actual) => { - for (const key in expected) { - if (actual[key] !== expected[key]) { - return false; - } - } - return true; - }; - } - - function assertEventFired(spy, instanceType, properties, workspace) { - properties = {...properties, workspaceId: workspace.id}; - sinon.assert.calledWith( - spy, - sinon.match.instanceOf(instanceType) - .and(shallowMatch(properties))); - } - setup(function() { this.eventSpy = createChangeListenerSpy(this.workspace); }); @@ -235,11 +216,11 @@ suite('Procedure Map', function() { new Blockly.procedures.ObservableProcedureModel(this.workspace); this.procedureMap.set(procedureModel.getId(), procedureModel); - assertEventFired( + assertEventFiredShallow( this.eventSpy, Blockly.Events.ProcedureCreate, {model: procedureModel}, - this.workspace); + this.workspace.id); }); test( @@ -264,11 +245,11 @@ suite('Procedure Map', function() { new Blockly.procedures.ObservableProcedureModel(this.workspace); this.procedureMap.add(procedureModel); - assertEventFired( + assertEventFiredShallow( this.eventSpy, Blockly.Events.ProcedureCreate, {model: procedureModel}, - this.workspace); + this.workspace.id); }); test( @@ -285,7 +266,7 @@ suite('Procedure Map', function() { this.eventSpy, Blockly.Events.ProcedureCreate, {}, - this.workspace); + this.workspace.id); }); }); @@ -296,11 +277,11 @@ suite('Procedure Map', function() { this.procedureMap.add(procedureModel); this.procedureMap.delete(procedureModel.getId()); - assertEventFired( + assertEventFiredShallow( this.eventSpy, Blockly.Events.ProcedureDelete, {model: procedureModel}, - this.workspace); + this.workspace.id); }); test( @@ -331,21 +312,21 @@ suite('Procedure Map', function() { this.procedureMap.add(procedureModel3); this.procedureMap.clear(); - assertEventFired( + assertEventFiredShallow( this.eventSpy, Blockly.Events.ProcedureDelete, {model: procedureModel1}, - this.workspace); - assertEventFired( + this.workspace.id); + assertEventFiredShallow( this.eventSpy, Blockly.Events.ProcedureDelete, {model: procedureModel2}, - this.workspace); - assertEventFired( + this.workspace.id); + assertEventFiredShallow( this.eventSpy, Blockly.Events.ProcedureDelete, {model: procedureModel3}, - this.workspace); + this.workspace.id); }); }); @@ -357,14 +338,14 @@ suite('Procedure Map', function() { this.procedureMap.add(procedureModel); procedureModel.setName('new name'); - assertEventFired( + assertEventFiredShallow( this.eventSpy, Blockly.Events.ProcedureRename, { model: procedureModel, oldName: 'test name', }, - this.workspace); + this.workspace.id); }); test('rename events are not fired if the rename is noop', function() { @@ -405,11 +386,11 @@ suite('Procedure Map', function() { this.procedureMap.add(procedureModel); procedureModel.setEnabled(true); - assertEventFired( + assertEventFiredShallow( this.eventSpy, Blockly.Events.ProcedureEnable, {model: procedureModel}, - this.workspace); + this.workspace.id); }); test('enable events are fired when a procedure is disabled', function() { @@ -418,11 +399,11 @@ suite('Procedure Map', function() { this.procedureMap.add(procedureModel); procedureModel.setEnabled(false); - assertEventFired( + assertEventFiredShallow( this.eventSpy, Blockly.Events.ProcedureEnable, {model: procedureModel}, - this.workspace); + this.workspace.id); }); test('enable events are not fired if enabling is noop', function() { @@ -480,7 +461,7 @@ suite('Procedure Map', function() { this.workspace, 'test name'); procedureModel.insertParameter(parameterModel, 0); - assertEventFired( + assertEventFiredShallow( this.eventSpy, Blockly.Events.ProcedureParameterCreate, { @@ -488,7 +469,7 @@ suite('Procedure Map', function() { parameter: parameterModel, index: 0, }, - this.workspace); + this.workspace.id); }); test( @@ -545,7 +526,7 @@ suite('Procedure Map', function() { procedureModel.insertParameter(parameterModel, 0); procedureModel.deleteParameter(0); - assertEventFired( + assertEventFiredShallow( this.eventSpy, Blockly.Events.ProcedureParameterDelete, { @@ -553,7 +534,7 @@ suite('Procedure Map', function() { parameter: parameterModel, index: 0, }, - this.workspace); + this.workspace.id); }); test( @@ -568,7 +549,7 @@ suite('Procedure Map', function() { this.eventSpy, Blockly.Events.ProcedureParameterDelete, {}, - this.workspace); + this.workspace.id); }); test( @@ -605,8 +586,7 @@ suite('Procedure Map', function() { parameterModel.setName('new name'); - console.log(this.eventSpy.getCalls()); - assertEventFired( + assertEventFiredShallow( this.eventSpy, Blockly.Events.ProcedureParameterRename, { @@ -614,7 +594,7 @@ suite('Procedure Map', function() { parameter: parameterModel, oldName: 'test name', }, - this.workspace); + this.workspace.id); }); test( @@ -684,14 +664,14 @@ suite('Procedure Map', function() { this.procedureMap.add(procedureModel); procedureModel.setReturnTypes([]); - assertEventFired( + assertEventFiredShallow( this.eventSpy, Blockly.Events.ProcedureChangeReturn, { model: procedureModel, oldTypes: null, }, - this.workspace); + this.workspace.id); }); test( @@ -704,14 +684,14 @@ suite('Procedure Map', function() { this.procedureMap.add(procedureModel); procedureModel.setReturnTypes(null); - assertEventFired( + assertEventFiredShallow( this.eventSpy, Blockly.Events.ProcedureChangeReturn, { model: procedureModel, oldTypes: types, }, - this.workspace); + this.workspace.id); }); test( diff --git a/tests/mocha/test_helpers/events.js b/tests/mocha/test_helpers/events.js index 0f5839d9b..52d2a2553 100644 --- a/tests/mocha/test_helpers/events.js +++ b/tests/mocha/test_helpers/events.js @@ -130,6 +130,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. From 7fc4b087acb5b27f71add9ed1afb9adb81f9b613 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 21 Nov 2022 08:22:46 -0800 Subject: [PATCH 19/73] chore(deps): bump google-closure-deps from 20221004.0.0 to 20221102.0.0 (#6645) Bumps [google-closure-deps](https://github.com/google/closure-library) from 20221004.0.0 to 20221102.0.0. - [Release notes](https://github.com/google/closure-library/releases) - [Commits](https://github.com/google/closure-library/compare/v20221004...v20221102) --- updated-dependencies: - dependency-name: google-closure-deps dependency-type: direct:development update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 14 +++++++------- package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index c56737b77..7ee229ed7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -30,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", @@ -6666,9 +6666,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", @@ -19839,9 +19839,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", diff --git a/package.json b/package.json index 3d1888aa3..a87564be7 100644 --- a/package.json +++ b/package.json @@ -86,7 +86,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", From cff831804abd7ab7770d6d6b170aa2b897771ec8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 21 Nov 2022 08:23:13 -0800 Subject: [PATCH 20/73] chore(deps): bump eslint-plugin-jsdoc from 39.3.6 to 39.6.2 (#6644) Bumps [eslint-plugin-jsdoc](https://github.com/gajus/eslint-plugin-jsdoc) from 39.3.6 to 39.6.2. - [Release notes](https://github.com/gajus/eslint-plugin-jsdoc/releases) - [Commits](https://github.com/gajus/eslint-plugin-jsdoc/compare/v39.3.6...v39.6.2) --- updated-dependencies: - dependency-name: eslint-plugin-jsdoc dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 48 +++++++++++++++++++++++------------------------ 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/package-lock.json b/package-lock.json index 7ee229ed7..a6e21caef 100644 --- a/package-lock.json +++ b/package-lock.json @@ -262,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.0", + "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.36.0.tgz", + "integrity": "sha512-u0XZyvUF6Urb2cSivSXA8qXIpT/CxkHcdtZKoWusAzgzmsTWpg0F2FpWXsolHmMUyVY3dLWaoy+0ccJ5uf2QjA==", "dev": true, "dependencies": { "comment-parser": "1.3.1", @@ -272,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": { @@ -5156,21 +5156,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.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-39.6.2.tgz", + "integrity": "sha512-dvgY/W7eUFoAIIiaWHERIMI61ZWqcz9YFjEeyTzdPlrZc3TY/3aZm5aB91NUoTLWYZmO/vFlYSuQi15tF7uE5A==", "dev": true, "dependencies": { - "@es-joy/jsdoccomment": "~0.31.0", + "@es-joy/jsdoccomment": "~0.36.0", "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" @@ -12113,9 +12113,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" @@ -14801,9 +14801,9 @@ "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.0", + "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.36.0.tgz", + "integrity": "sha512-u0XZyvUF6Urb2cSivSXA8qXIpT/CxkHcdtZKoWusAzgzmsTWpg0F2FpWXsolHmMUyVY3dLWaoy+0ccJ5uf2QjA==", "dev": true, "requires": { "comment-parser": "1.3.1", @@ -18678,17 +18678,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.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-39.6.2.tgz", + "integrity": "sha512-dvgY/W7eUFoAIIiaWHERIMI61ZWqcz9YFjEeyTzdPlrZc3TY/3aZm5aB91NUoTLWYZmO/vFlYSuQi15tF7uE5A==", "dev": true, "requires": { - "@es-joy/jsdoccomment": "~0.31.0", + "@es-joy/jsdoccomment": "~0.36.0", "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" } }, @@ -24223,9 +24223,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" From 2ed454ff914c2c265fb8a77d010d222bb3257665 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 21 Nov 2022 08:24:46 -0800 Subject: [PATCH 21/73] chore(deps): bump @wdio/selenium-standalone-service (#6642) Bumps [@wdio/selenium-standalone-service](https://github.com/webdriverio/webdriverio) from 7.25.1 to 7.26.0. - [Release notes](https://github.com/webdriverio/webdriverio/releases) - [Changelog](https://github.com/webdriverio/webdriverio/blob/v7.26.0/CHANGELOG.md) - [Commits](https://github.com/webdriverio/webdriverio/compare/v7.25.1...v7.26.0) --- updated-dependencies: - dependency-name: "@wdio/selenium-standalone-service" dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 104 +++++++++++++++++++++++----------------------- 1 file changed, 52 insertions(+), 52 deletions(-) diff --git a/package-lock.json b/package-lock.json index a6e21caef..7252039f3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1826,17 +1826,17 @@ } }, "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": "7.26.0", + "resolved": "https://registry.npmjs.org/@wdio/selenium-standalone-service/-/selenium-standalone-service-7.26.0.tgz", + "integrity": "sha512-bP79aBzRBvgNCaJihLaQT/Qxa604o8UsAv9Ce2tARlVb4jFjpGH0w/xkuxUTqSpeQy/Sj+3hLExhNh1YgLe/Bg==", "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", + "@wdio/config": "7.26.0", + "@wdio/logger": "7.26.0", + "@wdio/types": "7.26.0", "fs-extra": "^10.0.0", "selenium-standalone": "^8.0.3" }, @@ -1848,20 +1848,20 @@ } }, "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==", + "version": "18.11.9", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.9.tgz", + "integrity": "sha512-CRpX21/kGdzjOpFsZSkcrXMGIBWMGNIHXXBVFSH+ggkftxg+XYP20TESbh+zFvFj3EQOl5byk0HTRn1IL6hbqg==", "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": "7.26.0", + "resolved": "https://registry.npmjs.org/@wdio/config/-/config-7.26.0.tgz", + "integrity": "sha512-GO6kFGgFrx2Hiq+Ww6V9I7cZfShPjfPVhPy3uXnKN2B4FilX8ilLAp5cIFuMuHPeOQq0crYX9cnLYXka6dCGgg==", "dev": true, "dependencies": { - "@wdio/logger": "7.19.0", - "@wdio/types": "7.25.1", - "@wdio/utils": "7.25.1", + "@wdio/logger": "7.26.0", + "@wdio/types": "7.26.0", + "@wdio/utils": "7.26.0", "deepmerge": "^4.0.0", "glob": "^8.0.3" }, @@ -1870,9 +1870,9 @@ } }, "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==", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@wdio/logger/-/logger-7.26.0.tgz", + "integrity": "sha512-kQj9s5JudAG9qB+zAAcYGPHVfATl2oqKgqj47yjehOQ1zzG33xmtL1ArFbQKWhDG32y1A8sN6b0pIqBEIwgg8Q==", "dev": true, "dependencies": { "chalk": "^4.0.0", @@ -1885,9 +1885,9 @@ } }, "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": "7.26.0", + "resolved": "https://registry.npmjs.org/@wdio/types/-/types-7.26.0.tgz", + "integrity": "sha512-mOTfWAGQ+iT58iaZhJMwlUkdEn3XEWE4jthysMLXFnSuZ2eaODVAiK31SmlS/eUqgSIaupeGqYUrtCuSNbLefg==", "dev": true, "dependencies": { "@types/node": "^18.0.0", @@ -1906,13 +1906,13 @@ } }, "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": "7.26.0", + "resolved": "https://registry.npmjs.org/@wdio/utils/-/utils-7.26.0.tgz", + "integrity": "sha512-pVq2MPXZAYLkKGKIIHktHejnHqg4TYKoNYSi2EDv+I3GlT8VZKXHazKhci82ov0tD+GdF27+s4DWNDCfGYfBdQ==", "dev": true, "dependencies": { - "@wdio/logger": "7.19.0", - "@wdio/types": "7.25.1", + "@wdio/logger": "7.26.0", + "@wdio/types": "7.26.0", "p-iteration": "^1.1.8" }, "engines": { @@ -16035,44 +16035,44 @@ } }, "@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": "7.26.0", + "resolved": "https://registry.npmjs.org/@wdio/selenium-standalone-service/-/selenium-standalone-service-7.26.0.tgz", + "integrity": "sha512-bP79aBzRBvgNCaJihLaQT/Qxa604o8UsAv9Ce2tARlVb4jFjpGH0w/xkuxUTqSpeQy/Sj+3hLExhNh1YgLe/Bg==", "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", + "@wdio/config": "7.26.0", + "@wdio/logger": "7.26.0", + "@wdio/types": "7.26.0", "fs-extra": "^10.0.0", "selenium-standalone": "^8.0.3" }, "dependencies": { "@types/node": { - "version": "18.8.2", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.8.2.tgz", - "integrity": "sha512-cRMwIgdDN43GO4xMWAfJAecYn8wV4JbsOGHNfNUIDiuYkUYAR5ec4Rj7IO2SAhFPEfpPtLtUTbbny/TCT7aDwA==", + "version": "18.11.9", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.9.tgz", + "integrity": "sha512-CRpX21/kGdzjOpFsZSkcrXMGIBWMGNIHXXBVFSH+ggkftxg+XYP20TESbh+zFvFj3EQOl5byk0HTRn1IL6hbqg==", "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": "7.26.0", + "resolved": "https://registry.npmjs.org/@wdio/config/-/config-7.26.0.tgz", + "integrity": "sha512-GO6kFGgFrx2Hiq+Ww6V9I7cZfShPjfPVhPy3uXnKN2B4FilX8ilLAp5cIFuMuHPeOQq0crYX9cnLYXka6dCGgg==", "dev": true, "requires": { - "@wdio/logger": "7.19.0", - "@wdio/types": "7.25.1", - "@wdio/utils": "7.25.1", + "@wdio/logger": "7.26.0", + "@wdio/types": "7.26.0", + "@wdio/utils": "7.26.0", "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==", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@wdio/logger/-/logger-7.26.0.tgz", + "integrity": "sha512-kQj9s5JudAG9qB+zAAcYGPHVfATl2oqKgqj47yjehOQ1zzG33xmtL1ArFbQKWhDG32y1A8sN6b0pIqBEIwgg8Q==", "dev": true, "requires": { "chalk": "^4.0.0", @@ -16082,9 +16082,9 @@ } }, "@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": "7.26.0", + "resolved": "https://registry.npmjs.org/@wdio/types/-/types-7.26.0.tgz", + "integrity": "sha512-mOTfWAGQ+iT58iaZhJMwlUkdEn3XEWE4jthysMLXFnSuZ2eaODVAiK31SmlS/eUqgSIaupeGqYUrtCuSNbLefg==", "dev": true, "requires": { "@types/node": "^18.0.0", @@ -16092,13 +16092,13 @@ } }, "@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": "7.26.0", + "resolved": "https://registry.npmjs.org/@wdio/utils/-/utils-7.26.0.tgz", + "integrity": "sha512-pVq2MPXZAYLkKGKIIHktHejnHqg4TYKoNYSi2EDv+I3GlT8VZKXHazKhci82ov0tD+GdF27+s4DWNDCfGYfBdQ==", "dev": true, "requires": { - "@wdio/logger": "7.19.0", - "@wdio/types": "7.25.1", + "@wdio/logger": "7.26.0", + "@wdio/types": "7.26.0", "p-iteration": "^1.1.8" } }, From c9843ca32be2388ebcef1171a11de02df4c0089b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 21 Nov 2022 09:45:55 -0800 Subject: [PATCH 22/73] chore(deps): bump typescript from 4.8.4 to 4.9.3 (#6643) Bumps [typescript](https://github.com/Microsoft/TypeScript) from 4.8.4 to 4.9.3. - [Release notes](https://github.com/Microsoft/TypeScript/releases) - [Commits](https://github.com/Microsoft/TypeScript/compare/v4.8.4...v4.9.3) --- updated-dependencies: - dependency-name: typescript dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 31 +++++++++++++++++++++++++------ 1 file changed, 25 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index 7252039f3..d882f4837 100644 --- a/package-lock.json +++ b/package-lock.json @@ -600,6 +600,19 @@ "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/tsdoc": { "version": "0.14.2", "resolved": "https://registry.npmjs.org/@microsoft/tsdoc/-/tsdoc-0.14.2.tgz", @@ -13400,9 +13413,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.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.3.tgz", + "integrity": "sha512-CIfGzTelbKNEnLpLdGFgdyKhG23CKdKgQPOBc+OUNrkJ2vr+KSzsSV5kq5iWhEQbok+quxgGzrAtGWCyU7tHnA==", "dev": true, "bin": { "tsc": "bin/tsc", @@ -15059,6 +15072,12 @@ "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 } } }, @@ -25293,9 +25312,9 @@ "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.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.3.tgz", + "integrity": "sha512-CIfGzTelbKNEnLpLdGFgdyKhG23CKdKgQPOBc+OUNrkJ2vr+KSzsSV5kq5iWhEQbok+quxgGzrAtGWCyU7tHnA==", "dev": true }, "ua-parser-js": { From 0c81291188696432beb7af5e1f8f9c097c0fdeba Mon Sep 17 00:00:00 2001 From: Christopher Allen Date: Mon, 21 Nov 2022 19:57:26 +0000 Subject: [PATCH 23/73] chore(build): Re-delete tests/run_all_tests.js (#6636) The bash script tests/run_all_tests.sh was deleted in PR #6431, where it was replaced by scripts/gulpfiles/test_tasks.js, but it was inadvertently resurrected by PR #6475, apparently due to an error when manually resolving conflicts for merge commit 00676ed. Begone, undead script! --- tests/run_all_tests.sh | 88 ------------------------------------------ 1 file changed, 88 deletions(-) delete mode 100755 tests/run_all_tests.sh 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 From d80741ffcc3875193f0a3fdb90cb0653b7c6d12e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 21 Nov 2022 13:35:28 -0800 Subject: [PATCH 24/73] chore(deps): bump google-github-actions/deploy-appengine (#6647) Bumps [google-github-actions/deploy-appengine](https://github.com/google-github-actions/deploy-appengine) from 0.8.2 to 1.0.0. - [Release notes](https://github.com/google-github-actions/deploy-appengine/releases) - [Changelog](https://github.com/google-github-actions/deploy-appengine/blob/main/CHANGELOG.md) - [Commits](https://github.com/google-github-actions/deploy-appengine/compare/v0.8.2...v1.0.0) --- updated-dependencies: - dependency-name: google-github-actions/deploy-appengine dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/appengine_deploy.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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: From a7093bf9660a96916eb830a9ffa5d8270d14d209 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 21 Nov 2022 13:36:43 -0800 Subject: [PATCH 25/73] chore(deps): bump eslint from 8.25.0 to 8.28.0 (#6641) Bumps [eslint](https://github.com/eslint/eslint) from 8.25.0 to 8.28.0. - [Release notes](https://github.com/eslint/eslint/releases) - [Changelog](https://github.com/eslint/eslint/blob/main/CHANGELOG.md) - [Commits](https://github.com/eslint/eslint/compare/v8.25.0...v8.28.0) --- updated-dependencies: - dependency-name: eslint dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 80 +++++++++++++++++++++++++++++++++++------------ 1 file changed, 60 insertions(+), 20 deletions(-) diff --git a/package-lock.json b/package-lock.json index d882f4837..62c144fd3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -393,19 +393,31 @@ } }, "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" } }, + "node_modules/@humanwhocodes/config-array/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/@humanwhocodes/module-importer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", @@ -5102,14 +5114,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.28.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.28.0.tgz", + "integrity": "sha512-S27Di+EVyMxcHiwDrFzk8dJYAaD+/5SoWKxL1ri/71CRHsnJnRDPNt2Kzj24+MT9FDupf4aqqyqPrvI8MvQ4VQ==", "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", @@ -5125,14 +5138,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", @@ -8193,6 +8206,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", @@ -14921,14 +14943,25 @@ } }, "@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" + }, + "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" + } + } } }, "@humanwhocodes/module-importer": { @@ -18624,14 +18657,15 @@ } }, "eslint": { - "version": "8.25.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.25.0.tgz", - "integrity": "sha512-DVlJOZ4Pn50zcKW5bYH7GQK/9MsoQG2d5eDH0ebEkE8PbgzTTmtt/VTH9GGJ4BfeZCpBLqFfvsjX35UacUL83A==", + "version": "8.28.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.28.0.tgz", + "integrity": "sha512-S27Di+EVyMxcHiwDrFzk8dJYAaD+/5SoWKxL1ri/71CRHsnJnRDPNt2Kzj24+MT9FDupf4aqqyqPrvI8MvQ4VQ==", "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", @@ -18647,14 +18681,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", @@ -21098,6 +21132,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", From b5180cf07a302274a90a7636173cca7b56a107f9 Mon Sep 17 00:00:00 2001 From: Piotr Wysocki <86244209+piwysocki@users.noreply.github.com> Date: Mon, 21 Nov 2022 22:43:03 +0100 Subject: [PATCH 26/73] ci: clang format version bump (#6640) --- .github/workflows/check_clang_format.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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. From be4b8323c5a8049fadbaa0be5a59ee8a94832b54 Mon Sep 17 00:00:00 2001 From: Maribeth Bottorff Date: Tue, 22 Nov 2022 11:52:46 -0800 Subject: [PATCH 27/73] feat: add option to disable modal inputs on mobile (#6625) --- core/blockly_options.ts | 1 + core/field_input.ts | 10 +++++++--- core/options.ts | 7 +++++++ tests/mocha/field_textinput_test.js | 1 + 4 files changed, 16 insertions(+), 3 deletions(-) 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/field_input.ts b/core/field_input.ts index fe58b91d3..78fd63c7d 100644 --- a/core/field_input.ts +++ b/core/field_input.ts @@ -273,7 +273,10 @@ export abstract class FieldInput extends Field { } /** - * Show the inline free-text editor on top of the text. + * 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. @@ -283,7 +286,7 @@ export abstract class FieldInput extends Field { protected override showEditor_(_opt_e?: Event, opt_quietInput?: boolean) { this.workspace_ = (this.sourceBlock_ as BlockSvg).workspace; const quietInput = opt_quietInput || false; - if (!quietInput && + if (!quietInput && this.workspace_.options.modalInputs && (userAgent.MOBILE || userAgent.ANDROID || userAgent.IPAD)) { this.showPromptEditor_(); } else { @@ -293,7 +296,8 @@ export abstract class FieldInput extends Field { /** * 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). + * Mobile browsers may have issues with in-line textareas (focus and + * keyboards). */ private showPromptEditor_() { dialog.prompt( 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/tests/mocha/field_textinput_test.js b/tests/mocha/field_textinput_test.js index f37e6d885..cf5b9c26d 100644 --- a/tests/mocha/field_textinput_test.js +++ b/tests/mocha/field_textinput_test.js @@ -173,6 +173,7 @@ suite('Text Input Fields', function() { }; }, markFocused: function() {}, + options: {}, }; field.sourceBlock_ = { workspace: workspace, From 5a64a9a7f7974c7416d41b003779ee6d92ca5ebd Mon Sep 17 00:00:00 2001 From: Neil Fraser Date: Fri, 25 Nov 2022 20:45:00 +0100 Subject: [PATCH 28/73] fix: Fix the compiler test, and check if it worked. (#6638) * Add tsick.js to rewrite enums. tsc generates JavaScript which is incompatible with the Closure Compiler's advanced optimizations. * Remove unused 'outputCode' variable. * Rename 'run_X_in_browser.js' to 'webdriver.js' The Mocha and generator tests can both be run either manually or via our webdriver. In all cases they run in a browser. These two 'run_X_in_browser.js' files only apply to webdriver, thus they are confusingly named. Also delete completely unused (and broken) `run_all_tests.sh` * Linting improvements to mocha/webdriver.js Still not at 100%. Complains about require/module/process/__dirname not being defined in multiple places. * runTestBlock -> runTestFunction 'Block' means something very different in Blockly. * Removal of `var` from scripts. * Add webdriver test to verify compile test worked. * Resolve conficts with 'develop'. * Address PR comments. --- .eslintignore | 2 +- scripts/gulpfiles/appengine_tasks.js | 22 ++--- scripts/gulpfiles/build_tasks.js | 55 +++++++----- scripts/gulpfiles/config.js | 2 +- scripts/gulpfiles/git_tasks.js | 26 +++--- scripts/gulpfiles/package_tasks.js | 16 ++-- scripts/gulpfiles/release_tasks.js | 46 +++++----- scripts/gulpfiles/test_tasks.js | 89 ++++++++++--------- scripts/tsick.js | 83 +++++++++++++++++ tests/compile/main.js | 22 ++++- tests/compile/webdriver.js | 82 +++++++++++++++++ tests/generators/index.html | 8 +- ..._generators_in_browser.js => webdriver.js} | 11 +-- ...mocha_tests_in_browser.js => webdriver.js} | 39 ++++---- 14 files changed, 349 insertions(+), 154 deletions(-) create mode 100644 scripts/tsick.js create mode 100644 tests/compile/webdriver.js rename tests/generators/{run_generators_in_browser.js => webdriver.js} (91%) rename tests/mocha/{run_mocha_tests_in_browser.js => webdriver.js} (75%) 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/scripts/gulpfiles/appengine_tasks.js b/scripts/gulpfiles/appengine_tasks.js index ea5b6a53a..cb9ff8fed 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'; @@ -121,10 +121,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 +140,7 @@ function deployBetaAndClean(done) { /** * Prepares demos. - * + * * Prerequisites (invoked): clean, build */ const prepareDemos = gulp.series( diff --git a/scripts/gulpfiles/build_tasks.js b/scripts/gulpfiles/build_tasks.js index fa1d962f3..4358ad8e5 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 // @@ -173,9 +173,9 @@ function stripApacheLicense() { } /** - * 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. @@ -315,6 +315,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(); } @@ -452,7 +453,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. */ @@ -612,7 +613,7 @@ function getChunkOptions() { 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 +664,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 +689,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', 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 0712278b3..68fb63963 100644 --- a/scripts/gulpfiles/test_tasks.js +++ b/scripts/gulpfiles/test_tasks.js @@ -20,11 +20,9 @@ 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'; @@ -39,7 +37,7 @@ class Tester { this.failCount = 0; this.tasks = tasks; } - + /** * Run all tests in sequence. */ @@ -56,11 +54,11 @@ class Tester { asTask() { return this.runAll.bind(this); } - + /** * Run an arbitrary Gulp task as a test. - * @param {function} task Any gulp task - * @return {Promise} asynchronous result + * @param {function} task Any Gulp task. + * @return {Promise} Asynchronous result. */ async runTestTask(task) { const id = task.name; @@ -106,8 +104,8 @@ class Tester { /** * Helper method for running test command. - * @param {string} command command line to run - * @return {Promise} asynchronous result + * @param {string} command Command line to run. + * @return {Promise} Asynchronous result. */ async function runTestCommand(command) { execSync(command, {stdio: 'inherit'}); @@ -116,7 +114,7 @@ async function runTestCommand(command) { /** * 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) { @@ -128,8 +126,8 @@ function 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('npm run package -- --verbose --debug'); @@ -137,7 +135,7 @@ function build() { /** * Run renaming validation test. - * @return {Promise} asynchronous result + * @return {Promise} Asynchronous result. */ function renamings() { return runTestCommand('node tests/migration/validate-renamings.js'); @@ -145,16 +143,16 @@ function renamings() { /** * 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(); @@ -164,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); @@ -176,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; } @@ -189,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 @@ -202,7 +200,7 @@ function zippingFiles() { /** * Check the sizes of built files for unexpected growth. - * @return {Promise} asynchronous result + * @return {Promise} Asynchronous result. */ async function metadata() { // Zipping the compressed files. @@ -234,10 +232,10 @@ async function metadata() { /** * Run Mocha tests inside a browser. - * @return {Promise} asynchronous result + * @return {Promise} Asynchronous result. */ async function mocha() { - const result = await runMochaTestsInBrowser().catch(e => { + const result = await runMochaTestsInBrowser().catch(e => { throw e; }); if (result) { @@ -248,9 +246,9 @@ async function mocha() { /** * 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); @@ -258,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}`; @@ -279,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!`); @@ -297,7 +294,7 @@ function checkResult(suffix) { /** * Run generator tests inside a browser and check the results. - * @return {Promise} asynchronous result + * @return {Promise} Asynchronous result. */ async function generators() { // Clean up. @@ -311,7 +308,7 @@ async function generators() { generatorSuffixes.forEach((suffix) => { failed += checkResult(suffix); }); - + if (failed === 0) { console.log(`${BOLD_GREEN}All generator tests passed.${ANSI_RESET}`); } else { @@ -323,12 +320,20 @@ async function generators() { /** * Run Node tests. - * @return {Promise} asynchronous result + * @return {Promise} Asynchronous result. */ function node() { return runTestCommand('mocha tests/node --config tests/node/.mocharc.js'); } +/** + * Attempt advanced compilation of a Blockly app. + * @return {Promise} Asynchronous result. + */ +function advancedCompile() { + const compilePromise = runTestCommand('npm run test:compile:advanced'); + return compilePromise.then(runCompileCheckInBrowser); +} // Run all tests in sequence. const test = new Tester([ @@ -339,7 +344,7 @@ const test = new Tester([ mocha, generators, node, - buildTasks.onlyBuildAdvancedCompilationTest, + advancedCompile, ]).asTask(); 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/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 @@ - From fc2c10d0d0929d1cf6565edf1b6c057ff51573d1 Mon Sep 17 00:00:00 2001 From: Beka Westberg Date: Fri, 2 Dec 2022 08:10:41 -0800 Subject: [PATCH 42/73] feat: make the variable map return early for noops (#6674) * chore: add variable map tests * chore: move firing create events into the variable map * feat: add early returning in the case of noop renames * chore: format --- core/variable_map.ts | 3 + core/variable_model.ts | 3 - tests/mocha/variable_map_test.js | 200 +++++++++++++++++++++++++++++++ 3 files changed, 203 insertions(+), 3 deletions(-) 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/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`); + }); + }); + }); + }); }); From 1c768e812191219fdff5562e6ba3dcd804f44926 Mon Sep 17 00:00:00 2001 From: Neil Fraser Date: Fri, 2 Dec 2022 17:17:38 +0100 Subject: [PATCH 43/73] chore: stop linter from whining about no return (#6679) No functional change, just jumping through hoops due to tooling. "JSDoc @returns declaration present but return expression not available in function" --- core/variables.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) 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; } /** From b5eeaa352c82ee9f15cc658bf56fab53a5bebec7 Mon Sep 17 00:00:00 2001 From: Neil Fraser Date: Sun, 4 Dec 2022 20:30:36 +0100 Subject: [PATCH 44/73] docs: Add notice to use unpkg instead of demos. (#6667) Logs show about a dozen orgs actively using Blockly instances that are hot-linked to blockly-demo.appspot.com These files disappeared on 25 November 2022, breaking a bunch of people. This alert should point developers in the right direction. --- appengine/blockly_compressed.js | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 appengine/blockly_compressed.js 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. +} From e5cae5864cc3fe4b42ac6cde94691c9389347ad6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 5 Dec 2022 08:12:02 -0800 Subject: [PATCH 45/73] chore(deps): bump webdriverio from 7.26.0 to 8.0.5 (#6686) Bumps [webdriverio](https://github.com/webdriverio/webdriverio/tree/HEAD/packages/webdriverio) from 7.26.0 to 8.0.5. - [Release notes](https://github.com/webdriverio/webdriverio/releases) - [Changelog](https://github.com/webdriverio/webdriverio/blob/main/CHANGELOG.md) - [Commits](https://github.com/webdriverio/webdriverio/commits/v8.0.5/packages/webdriverio) --- updated-dependencies: - dependency-name: webdriverio dependency-type: direct:development update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 2543 ++++++++++++++++++++++++++++++++++++--------- package.json | 2 +- 2 files changed, 2065 insertions(+), 480 deletions(-) diff --git a/package-lock.json b/package-lock.json index a7c670dcf..39fe5bbf6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -54,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" } }, @@ -496,6 +496,50 @@ "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", @@ -791,6 +835,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", @@ -935,6 +986,33 @@ "@types/through": "*" } }, + "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, + "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/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": { "version": "7.0.11", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", @@ -1039,6 +1117,13 @@ "integrity": "sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==", "dev": true }, + "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, + "optional": true + }, "node_modules/@types/through": { "version": "0.0.30", "resolved": "https://registry.npmjs.org/@types/through/-/through-0.0.30.tgz", @@ -1071,6 +1156,32 @@ "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.15", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.15.tgz", + "integrity": "sha512-ZHc4W2dnEQPfhn06TBEdWaiUHEZAocYaiVMfwOipY5jcJt/251wVrKCBWBetGZWO5CF8tdb7L3DmdxVlZ2BOIg==", + "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", @@ -1747,6 +1858,19 @@ "node": ">=12.0.0" } }, + "node_modules/@wdio/globals": { + "version": "8.0.5", + "resolved": "https://registry.npmjs.org/@wdio/globals/-/globals-8.0.5.tgz", + "integrity": "sha512-SUjC6WuZZPrLz/xV1SwfleyttdcItbocVvGhnJ/lCtlgVxnXcJIF6Qz0D1Mc7C49DiceU35XpVbfv395SJei3Q==", + "dev": true, + "engines": { + "node": "^16.13 || >=18" + }, + "optionalDependencies": { + "expect-webdriverio": "^4.0.1", + "webdriverio": "8.0.5" + } + }, "node_modules/@wdio/logger": { "version": "7.16.0", "resolved": "https://registry.npmjs.org/@wdio/logger/-/logger-7.16.0.tgz", @@ -1774,71 +1898,12 @@ } }, "node_modules/@wdio/repl": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@wdio/repl/-/repl-7.26.0.tgz", - "integrity": "sha512-2YxbXNfYVGVLrffUJzl/l5s8FziDPl917eLP62gkEH/H5IV27Pnwx3Iyu0KOEaBzgntnURANlwhCZFXQ4OPq8Q==", + "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": { - "@wdio/utils": "7.26.0" - }, "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/@wdio/repl/node_modules/@types/node": { - "version": "18.11.9", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.9.tgz", - "integrity": "sha512-CRpX21/kGdzjOpFsZSkcrXMGIBWMGNIHXXBVFSH+ggkftxg+XYP20TESbh+zFvFj3EQOl5byk0HTRn1IL6hbqg==", - "dev": true - }, - "node_modules/@wdio/repl/node_modules/@wdio/logger": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@wdio/logger/-/logger-7.26.0.tgz", - "integrity": "sha512-kQj9s5JudAG9qB+zAAcYGPHVfATl2oqKgqj47yjehOQ1zzG33xmtL1ArFbQKWhDG32y1A8sN6b0pIqBEIwgg8Q==", - "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.26.0", - "resolved": "https://registry.npmjs.org/@wdio/types/-/types-7.26.0.tgz", - "integrity": "sha512-mOTfWAGQ+iT58iaZhJMwlUkdEn3XEWE4jthysMLXFnSuZ2eaODVAiK31SmlS/eUqgSIaupeGqYUrtCuSNbLefg==", - "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.26.0", - "resolved": "https://registry.npmjs.org/@wdio/utils/-/utils-7.26.0.tgz", - "integrity": "sha512-pVq2MPXZAYLkKGKIIHktHejnHqg4TYKoNYSi2EDv+I3GlT8VZKXHazKhci82ov0tD+GdF27+s4DWNDCfGYfBdQ==", - "dev": true, - "dependencies": { - "@wdio/logger": "7.26.0", - "@wdio/types": "7.26.0", - "p-iteration": "^1.1.8" - }, - "engines": { - "node": ">=12.0.0" + "node": "^16.13 || >=18" } }, "node_modules/@wdio/selenium-standalone-service": { @@ -4498,6 +4563,15 @@ "node": ">=0.10.0" } }, + "node_modules/deepmerge-ts": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/deepmerge-ts/-/deepmerge-ts-4.2.2.tgz", + "integrity": "sha512-Ka3Kb21tiWjvQvS9U+1Dx+aqFAHsdTnMdYptLTmC2VAmDFMugWMY1e15aTODstipmCun8iNuqeSfcx6rsUUk0Q==", + "dev": true, + "engines": { + "node": ">=12.4.0" + } + }, "node_modules/default-compare": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/default-compare/-/default-compare-1.0.0.tgz", @@ -4600,114 +4674,106 @@ } }, "node_modules/devtools": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/devtools/-/devtools-7.26.0.tgz", - "integrity": "sha512-+8HNbNpzgo4Sn+WcrvXuwsHW9XPJfLo4bs9lgs6DPJHIIDXYJXQGsd7940wMX0Rp0D2vHXA4ibK0oTI5rogM3Q==", + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/devtools/-/devtools-8.0.2.tgz", + "integrity": "sha512-hNUoAffjKB+H099+i4UeXP6aZ8wGMafwOab+3dpqh31ssZcNEau3ZGV+W0u8yQqjwqjY2mHSssWYERuh1B1/tQ==", "dev": true, "dependencies": { - "@types/node": "^18.0.0", "@types/ua-parser-js": "^0.7.33", - "@wdio/config": "7.26.0", - "@wdio/logger": "7.26.0", - "@wdio/protocols": "7.22.0", - "@wdio/types": "7.26.0", - "@wdio/utils": "7.26.0", + "@wdio/config": "8.0.2", + "@wdio/logger": "8.0.0", + "@wdio/protocols": "8.0.0", + "@wdio/types": "8.0.0", + "@wdio/utils": "8.0.2", "chrome-launcher": "^0.15.0", "edge-paths": "^2.1.0", - "puppeteer-core": "^13.1.3", + "import-meta-resolve": "^2.1.0", + "puppeteer-core": "19.3.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.1069585", - "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1069585.tgz", - "integrity": "sha512-sHmkZB6immWQWU4Wx3ogXwxjQUvQc92MmUDL52+q1z2hQmvpOcvDmbsjwX7QZOPTA32dMV7fgT6zUytcpPzy4A==", + "version": "0.0.1077862", + "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1077862.tgz", + "integrity": "sha512-4xhfUhjBf1rE3XD+/VYoKls2fxBE0rG3j1C4b1Ak6hnz9WiwzpMKX7edIfsiPIGRqVZfosu+igxnzVnDhe1T1w==", "dev": true }, "node_modules/devtools/node_modules/@types/node": { - "version": "18.11.9", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.9.tgz", - "integrity": "sha512-CRpX21/kGdzjOpFsZSkcrXMGIBWMGNIHXXBVFSH+ggkftxg+XYP20TESbh+zFvFj3EQOl5byk0HTRn1IL6hbqg==", + "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/devtools/node_modules/@wdio/config": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@wdio/config/-/config-7.26.0.tgz", - "integrity": "sha512-GO6kFGgFrx2Hiq+Ww6V9I7cZfShPjfPVhPy3uXnKN2B4FilX8ilLAp5cIFuMuHPeOQq0crYX9cnLYXka6dCGgg==", + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@wdio/config/-/config-8.0.2.tgz", + "integrity": "sha512-sLrNT6BXlWpfZS0FODxl628bCKtqHqD3TU31+6av3TnNfa142hQrbGf0u5birtU8c3Qacch4ycA3pmQ1xePGRA==", "dev": true, "dependencies": { - "@wdio/logger": "7.26.0", - "@wdio/types": "7.26.0", - "@wdio/utils": "7.26.0", - "deepmerge": "^4.0.0", - "glob": "^8.0.3" + "@wdio/logger": "8.0.0", + "@wdio/types": "8.0.0", + "@wdio/utils": "8.0.2", + "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": "^16.13 || >=18" } }, "node_modules/devtools/node_modules/@wdio/logger": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@wdio/logger/-/logger-7.26.0.tgz", - "integrity": "sha512-kQj9s5JudAG9qB+zAAcYGPHVfATl2oqKgqj47yjehOQ1zzG33xmtL1ArFbQKWhDG32y1A8sN6b0pIqBEIwgg8Q==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@wdio/logger/-/logger-8.0.0.tgz", + "integrity": "sha512-QEBPZoFQhWqqIYmhp8Wa+HhvMrH2Yy0xbD3MPOibkFwp9Tn8Si7oDxbnWqzcPiukLWcb4E/QlgE5f3IM5BrAPQ==", "dev": 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/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" - } + "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/devtools/node_modules/@wdio/types": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@wdio/types/-/types-7.26.0.tgz", - "integrity": "sha512-mOTfWAGQ+iT58iaZhJMwlUkdEn3XEWE4jthysMLXFnSuZ2eaODVAiK31SmlS/eUqgSIaupeGqYUrtCuSNbLefg==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@wdio/types/-/types-8.0.0.tgz", + "integrity": "sha512-6Qt4NmCJrxtbZLxCJBSW68Q4olvHGLoy5mOBaZhPC5FUEmxwhMAtq5e3zrAIpnHEMwl3RUDnMnSO9dApI7a7IQ==", "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.26.0", - "resolved": "https://registry.npmjs.org/@wdio/utils/-/utils-7.26.0.tgz", - "integrity": "sha512-pVq2MPXZAYLkKGKIIHktHejnHqg4TYKoNYSi2EDv+I3GlT8VZKXHazKhci82ov0tD+GdF27+s4DWNDCfGYfBdQ==", + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@wdio/utils/-/utils-8.0.2.tgz", + "integrity": "sha512-3AAShhA1uZV58E/eXRsyA0sHfwlAlmXKH5U202SYwFcYHV/c0zPu56p/ndohsyMmh+0UxgFpHEbTKiI4dhhf3A==", "dev": true, "dependencies": { - "@wdio/logger": "7.26.0", - "@wdio/types": "7.26.0", + "@wdio/logger": "8.0.0", + "@wdio/types": "8.0.0", "p-iteration": "^1.1.8" }, "engines": { - "node": ">=12.0.0" + "node": "^16.13 || >=18" } }, "node_modules/devtools/node_modules/brace-expansion": { @@ -4719,6 +4785,46 @@ "balanced-match": "^1.0.0" } }, + "node_modules/devtools/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/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", @@ -4738,10 +4844,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" @@ -4750,6 +4871,92 @@ "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/type-fest": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", + "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", + "dev": true, + "engines": { + "node": ">=12.20" + }, + "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", @@ -4759,6 +4966,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", @@ -5540,6 +5784,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", @@ -6015,6 +6294,15 @@ "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": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", @@ -6737,9 +7025,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": { @@ -7853,6 +8141,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", @@ -8471,6 +8769,111 @@ "node": ">=4" } }, + "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, + "optional": true, + "dependencies": { + "chalk": "^4.0.0", + "diff-sequences": "^29.3.1", + "jest-get-type": "^29.2.0", + "pretty-format": "^29.3.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "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, + "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": { + "chalk": "^4.0.0", + "jest-diff": "^29.3.1", + "jest-get-type": "^29.2.0", + "pretty-format": "^29.3.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "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, + "optional": true, + "dependencies": { + "@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": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "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, + "optional": true, + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "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": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/jju/-/jju-1.4.0.tgz", @@ -8692,9 +9095,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" @@ -9032,7 +9435,8 @@ "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 + "dev": true, + "peer": true }, "node_modules/lodash.isplainobject": { "version": "4.0.6", @@ -10947,6 +11351,7 @@ "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", "dev": true, + "peer": true, "dependencies": { "find-up": "^4.0.0" }, @@ -10959,6 +11364,7 @@ "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, + "peer": true, "dependencies": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" @@ -10972,6 +11378,7 @@ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, + "peer": true, "dependencies": { "p-locate": "^4.1.0" }, @@ -10984,6 +11391,7 @@ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, + "peer": true, "dependencies": { "p-try": "^2.0.0" }, @@ -10999,6 +11407,7 @@ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, + "peer": true, "dependencies": { "p-limit": "^2.2.0" }, @@ -11137,6 +11546,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", @@ -11237,32 +11674,30 @@ } }, "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.3.0", + "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-19.3.0.tgz", + "integrity": "sha512-P8VAAOBnBJo/7DKJnj1b0K9kZBF2D8lkdL94CjJ+DZKCp182LQqYemPI9omUSZkh4bgykzXjZhaVR1qtddTTQg==", "dev": true, "dependencies": { "cross-fetch": "3.1.5", "debug": "4.3.4", - "devtools-protocol": "0.0.981744", + "devtools-protocol": "0.0.1056733", "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.1056733", + "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1056733.tgz", + "integrity": "sha512-CmTu6SQx2g3TbZzDCAV58+LTxVdKplS7xip0g5oDXpZ+isr0rv5dDP8ToyVRywzPHkCCPKgKgScEcwz4uPWDIA==", "dev": true }, "node_modules/puppeteer-core/node_modules/https-proxy-agent": { @@ -11279,9 +11714,9 @@ } }, "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" @@ -11384,6 +11819,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", @@ -12682,6 +13124,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", @@ -13895,104 +14360,121 @@ } }, "node_modules/webdriver": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/webdriver/-/webdriver-7.26.0.tgz", - "integrity": "sha512-T21T31wq29D/rmpFHcAahhdrvfsfXsLs/LBe2su7wL725ptOEoSssuDXjXMkwjf9MSUIXnTcUIz8oJGbKRUMwQ==", + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/webdriver/-/webdriver-8.0.2.tgz", + "integrity": "sha512-tFp935CNs1pczjns26tsfBHhrpq6r9g9MrAIgzPvNfKZzNNpaiY2qXtq2OkPQQxjCZchitNcAmaTz2k251SSNA==", "dev": true, "dependencies": { "@types/node": "^18.0.0", - "@wdio/config": "7.26.0", - "@wdio/logger": "7.26.0", - "@wdio/protocols": "7.22.0", - "@wdio/types": "7.26.0", - "@wdio/utils": "7.26.0", - "got": "^11.0.2", - "ky": "0.30.0", - "lodash.merge": "^4.6.1" + "@types/ws": "^8.5.3", + "@wdio/config": "8.0.2", + "@wdio/logger": "8.0.0", + "@wdio/protocols": "8.0.0", + "@wdio/types": "8.0.0", + "@wdio/utils": "8.0.2", + "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/@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/@types/node": { - "version": "18.11.9", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.9.tgz", - "integrity": "sha512-CRpX21/kGdzjOpFsZSkcrXMGIBWMGNIHXXBVFSH+ggkftxg+XYP20TESbh+zFvFj3EQOl5byk0HTRn1IL6hbqg==", + "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/webdriver/node_modules/@wdio/config": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@wdio/config/-/config-7.26.0.tgz", - "integrity": "sha512-GO6kFGgFrx2Hiq+Ww6V9I7cZfShPjfPVhPy3uXnKN2B4FilX8ilLAp5cIFuMuHPeOQq0crYX9cnLYXka6dCGgg==", + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@wdio/config/-/config-8.0.2.tgz", + "integrity": "sha512-sLrNT6BXlWpfZS0FODxl628bCKtqHqD3TU31+6av3TnNfa142hQrbGf0u5birtU8c3Qacch4ycA3pmQ1xePGRA==", "dev": true, "dependencies": { - "@wdio/logger": "7.26.0", - "@wdio/types": "7.26.0", - "@wdio/utils": "7.26.0", - "deepmerge": "^4.0.0", - "glob": "^8.0.3" + "@wdio/logger": "8.0.0", + "@wdio/types": "8.0.0", + "@wdio/utils": "8.0.2", + "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": "^16.13 || >=18" } }, "node_modules/webdriver/node_modules/@wdio/logger": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@wdio/logger/-/logger-7.26.0.tgz", - "integrity": "sha512-kQj9s5JudAG9qB+zAAcYGPHVfATl2oqKgqj47yjehOQ1zzG33xmtL1ArFbQKWhDG32y1A8sN6b0pIqBEIwgg8Q==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@wdio/logger/-/logger-8.0.0.tgz", + "integrity": "sha512-QEBPZoFQhWqqIYmhp8Wa+HhvMrH2Yy0xbD3MPOibkFwp9Tn8Si7oDxbnWqzcPiukLWcb4E/QlgE5f3IM5BrAPQ==", "dev": 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/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" - } + "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/webdriver/node_modules/@wdio/types": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@wdio/types/-/types-7.26.0.tgz", - "integrity": "sha512-mOTfWAGQ+iT58iaZhJMwlUkdEn3XEWE4jthysMLXFnSuZ2eaODVAiK31SmlS/eUqgSIaupeGqYUrtCuSNbLefg==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@wdio/types/-/types-8.0.0.tgz", + "integrity": "sha512-6Qt4NmCJrxtbZLxCJBSW68Q4olvHGLoy5mOBaZhPC5FUEmxwhMAtq5e3zrAIpnHEMwl3RUDnMnSO9dApI7a7IQ==", "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.26.0", - "resolved": "https://registry.npmjs.org/@wdio/utils/-/utils-7.26.0.tgz", - "integrity": "sha512-pVq2MPXZAYLkKGKIIHktHejnHqg4TYKoNYSi2EDv+I3GlT8VZKXHazKhci82ov0tD+GdF27+s4DWNDCfGYfBdQ==", + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@wdio/utils/-/utils-8.0.2.tgz", + "integrity": "sha512-3AAShhA1uZV58E/eXRsyA0sHfwlAlmXKH5U202SYwFcYHV/c0zPu56p/ndohsyMmh+0UxgFpHEbTKiI4dhhf3A==", "dev": true, "dependencies": { - "@wdio/logger": "7.26.0", - "@wdio/types": "7.26.0", + "@wdio/logger": "8.0.0", + "@wdio/types": "8.0.0", "p-iteration": "^1.1.8" }, "engines": { - "node": ">=12.0.0" + "node": "^16.13 || >=18" } }, "node_modules/webdriver/node_modules/brace-expansion": { @@ -14004,6 +14486,85 @@ "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/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/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", @@ -14023,22 +14584,99 @@ "url": "https://github.com/sponsors/isaacs" } }, + "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": ">=14.16" + }, + "funding": { + "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/ky": { - "version": "0.30.0", - "resolved": "https://registry.npmjs.org/ky/-/ky-0.30.0.tgz", - "integrity": "sha512-X/u76z4JtDVq10u1JA5UQfatPxgPaVDMYTrgHyiTpGN2z4TMEJkIHsoSBBSg9SWZEIXTKsi9kHgiQ9o3Y/4yog==", + "version": "0.32.2", + "resolved": "https://registry.npmjs.org/ky/-/ky-0.32.2.tgz", + "integrity": "sha512-eBJeF6IXNwX5rksdwBrE2rIJrU2d84GoTvdM7OmmTIwUVXEMd72wIwvT+nyhrqtv7AzbSNsWz7yRsHgVhj1uog==", "dev": true, "engines": { - "node": ">=12" + "node": ">=14.16" }, "funding": { "url": "https://github.com/sindresorhus/ky?sponsor=1" } }, + "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" @@ -14047,123 +14685,248 @@ "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/type-fest": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", + "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", + "dev": true, + "engines": { + "node": ">=12.20" + }, + "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.26.0", - "resolved": "https://registry.npmjs.org/webdriverio/-/webdriverio-7.26.0.tgz", - "integrity": "sha512-7m9TeP871aYxZYKBI4GDh5aQZLN9Fd/PASu5K/jEIT65J4OBB6g5ZaycGFOmfNHCfjWKjwPXZuKiN1f2mcrcRg==", + "version": "8.0.5", + "resolved": "https://registry.npmjs.org/webdriverio/-/webdriverio-8.0.5.tgz", + "integrity": "sha512-UUP5yWrwPE9U737r+7H0vYWckIGk87VklhALpymVkg7DEmlHP2c7/EI3ZWRZnXqyP5bCOVImuOvxEjiNOH1f+g==", "dev": true, "dependencies": { "@types/aria-query": "^5.0.0", "@types/node": "^18.0.0", - "@wdio/config": "7.26.0", - "@wdio/logger": "7.26.0", - "@wdio/protocols": "7.22.0", - "@wdio/repl": "7.26.0", - "@wdio/types": "7.26.0", - "@wdio/utils": "7.26.0", + "@wdio/config": "8.0.2", + "@wdio/globals": "8.0.5", + "@wdio/logger": "8.0.0", + "@wdio/protocols": "8.0.0", + "@wdio/repl": "8.0.0", + "@wdio/types": "8.0.0", + "@wdio/utils": "8.0.2", "archiver": "^5.0.0", "aria-query": "^5.0.0", "css-shorthand-properties": "^1.1.1", "css-value": "^0.0.1", - "devtools": "7.26.0", - "devtools-protocol": "^0.0.1069585", - "fs-extra": "^10.0.0", + "devtools": "8.0.2", + "devtools-protocol": "^0.0.1077862", "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.3.0", "query-selector-shadow-dom": "^1.0.0", "resq": "^1.9.1", "rgb2hex": "0.2.5", "serialize-error": "^8.0.0", - "webdriver": "7.26.0" + "webdriver": "8.0.2" }, "engines": { - "node": ">=12.0.0" + "node": "^16.13 || >=18" } }, "node_modules/webdriverio/node_modules/@types/node": { - "version": "18.11.9", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.9.tgz", - "integrity": "sha512-CRpX21/kGdzjOpFsZSkcrXMGIBWMGNIHXXBVFSH+ggkftxg+XYP20TESbh+zFvFj3EQOl5byk0HTRn1IL6hbqg==", + "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/webdriverio/node_modules/@wdio/config": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@wdio/config/-/config-7.26.0.tgz", - "integrity": "sha512-GO6kFGgFrx2Hiq+Ww6V9I7cZfShPjfPVhPy3uXnKN2B4FilX8ilLAp5cIFuMuHPeOQq0crYX9cnLYXka6dCGgg==", + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@wdio/config/-/config-8.0.2.tgz", + "integrity": "sha512-sLrNT6BXlWpfZS0FODxl628bCKtqHqD3TU31+6av3TnNfa142hQrbGf0u5birtU8c3Qacch4ycA3pmQ1xePGRA==", "dev": true, "dependencies": { - "@wdio/logger": "7.26.0", - "@wdio/types": "7.26.0", - "@wdio/utils": "7.26.0", - "deepmerge": "^4.0.0", - "glob": "^8.0.3" + "@wdio/logger": "8.0.0", + "@wdio/types": "8.0.0", + "@wdio/utils": "8.0.2", + "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": "^16.13 || >=18" } }, "node_modules/webdriverio/node_modules/@wdio/logger": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@wdio/logger/-/logger-7.26.0.tgz", - "integrity": "sha512-kQj9s5JudAG9qB+zAAcYGPHVfATl2oqKgqj47yjehOQ1zzG33xmtL1ArFbQKWhDG32y1A8sN6b0pIqBEIwgg8Q==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@wdio/logger/-/logger-8.0.0.tgz", + "integrity": "sha512-QEBPZoFQhWqqIYmhp8Wa+HhvMrH2Yy0xbD3MPOibkFwp9Tn8Si7oDxbnWqzcPiukLWcb4E/QlgE5f3IM5BrAPQ==", "dev": 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/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" - } + "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/webdriverio/node_modules/@wdio/types": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@wdio/types/-/types-7.26.0.tgz", - "integrity": "sha512-mOTfWAGQ+iT58iaZhJMwlUkdEn3XEWE4jthysMLXFnSuZ2eaODVAiK31SmlS/eUqgSIaupeGqYUrtCuSNbLefg==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@wdio/types/-/types-8.0.0.tgz", + "integrity": "sha512-6Qt4NmCJrxtbZLxCJBSW68Q4olvHGLoy5mOBaZhPC5FUEmxwhMAtq5e3zrAIpnHEMwl3RUDnMnSO9dApI7a7IQ==", "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.26.0", - "resolved": "https://registry.npmjs.org/@wdio/utils/-/utils-7.26.0.tgz", - "integrity": "sha512-pVq2MPXZAYLkKGKIIHktHejnHqg4TYKoNYSi2EDv+I3GlT8VZKXHazKhci82ov0tD+GdF27+s4DWNDCfGYfBdQ==", + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@wdio/utils/-/utils-8.0.2.tgz", + "integrity": "sha512-3AAShhA1uZV58E/eXRsyA0sHfwlAlmXKH5U202SYwFcYHV/c0zPu56p/ndohsyMmh+0UxgFpHEbTKiI4dhhf3A==", "dev": true, "dependencies": { - "@wdio/logger": "7.26.0", - "@wdio/types": "7.26.0", + "@wdio/logger": "8.0.0", + "@wdio/types": "8.0.0", "p-iteration": "^1.1.8" }, "engines": { - "node": ">=12.0.0" + "node": "^16.13 || >=18" } }, "node_modules/webdriverio/node_modules/brace-expansion": { @@ -14175,6 +14938,46 @@ "balanced-match": "^1.0.0" } }, + "node_modules/webdriverio/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/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", @@ -14194,10 +14997,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" @@ -14206,6 +15036,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/type-fest": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", + "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", + "dev": true, + "engines": { + "node": ">=12.20" + }, + "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": "7.0.0", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", @@ -14994,6 +15922,41 @@ } } }, + "@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", @@ -15252,6 +16215,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", @@ -15386,6 +16356,33 @@ "@types/through": "*" } }, + "@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, + "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/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": { "version": "7.0.11", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", @@ -15490,6 +16487,13 @@ "integrity": "sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==", "dev": true }, + "@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, + "optional": true + }, "@types/through": { "version": "0.0.30", "resolved": "https://registry.npmjs.org/@types/through/-/through-0.0.30.tgz", @@ -15522,6 +16526,32 @@ "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.15", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.15.tgz", + "integrity": "sha512-ZHc4W2dnEQPfhn06TBEdWaiUHEZAocYaiVMfwOipY5jcJt/251wVrKCBWBetGZWO5CF8tdb7L3DmdxVlZ2BOIg==", + "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", @@ -15984,6 +17014,16 @@ "glob": "^7.1.2" } }, + "@wdio/globals": { + "version": "8.0.5", + "resolved": "https://registry.npmjs.org/@wdio/globals/-/globals-8.0.5.tgz", + "integrity": "sha512-SUjC6WuZZPrLz/xV1SwfleyttdcItbocVvGhnJ/lCtlgVxnXcJIF6Qz0D1Mc7C49DiceU35XpVbfv395SJei3Q==", + "dev": true, + "requires": { + "expect-webdriverio": "^4.0.1", + "webdriverio": "8.0.5" + } + }, "@wdio/logger": { "version": "7.16.0", "resolved": "https://registry.npmjs.org/@wdio/logger/-/logger-7.16.0.tgz", @@ -16005,54 +17045,10 @@ "peer": true }, "@wdio/repl": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@wdio/repl/-/repl-7.26.0.tgz", - "integrity": "sha512-2YxbXNfYVGVLrffUJzl/l5s8FziDPl917eLP62gkEH/H5IV27Pnwx3Iyu0KOEaBzgntnURANlwhCZFXQ4OPq8Q==", - "dev": true, - "requires": { - "@wdio/utils": "7.26.0" - }, - "dependencies": { - "@types/node": { - "version": "18.11.9", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.9.tgz", - "integrity": "sha512-CRpX21/kGdzjOpFsZSkcrXMGIBWMGNIHXXBVFSH+ggkftxg+XYP20TESbh+zFvFj3EQOl5byk0HTRn1IL6hbqg==", - "dev": true - }, - "@wdio/logger": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@wdio/logger/-/logger-7.26.0.tgz", - "integrity": "sha512-kQj9s5JudAG9qB+zAAcYGPHVfATl2oqKgqj47yjehOQ1zzG33xmtL1ArFbQKWhDG32y1A8sN6b0pIqBEIwgg8Q==", - "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.26.0", - "resolved": "https://registry.npmjs.org/@wdio/types/-/types-7.26.0.tgz", - "integrity": "sha512-mOTfWAGQ+iT58iaZhJMwlUkdEn3XEWE4jthysMLXFnSuZ2eaODVAiK31SmlS/eUqgSIaupeGqYUrtCuSNbLefg==", - "dev": true, - "requires": { - "@types/node": "^18.0.0", - "got": "^11.8.1" - } - }, - "@wdio/utils": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@wdio/utils/-/utils-7.26.0.tgz", - "integrity": "sha512-pVq2MPXZAYLkKGKIIHktHejnHqg4TYKoNYSi2EDv+I3GlT8VZKXHazKhci82ov0tD+GdF27+s4DWNDCfGYfBdQ==", - "dev": true, - "requires": { - "@wdio/logger": "7.26.0", - "@wdio/types": "7.26.0", - "p-iteration": "^1.1.8" - } - } - } + "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.26.0", @@ -18134,6 +19130,12 @@ "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", "dev": true }, + "deepmerge-ts": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/deepmerge-ts/-/deepmerge-ts-4.2.2.tgz", + "integrity": "sha512-Ka3Kb21tiWjvQvS9U+1Dx+aqFAHsdTnMdYptLTmC2VAmDFMugWMY1e15aTODstipmCun8iNuqeSfcx6rsUUk0Q==", + "dev": true + }, "default-compare": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/default-compare/-/default-compare-1.0.0.tgz", @@ -18211,81 +19213,84 @@ "dev": true }, "devtools": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/devtools/-/devtools-7.26.0.tgz", - "integrity": "sha512-+8HNbNpzgo4Sn+WcrvXuwsHW9XPJfLo4bs9lgs6DPJHIIDXYJXQGsd7940wMX0Rp0D2vHXA4ibK0oTI5rogM3Q==", + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/devtools/-/devtools-8.0.2.tgz", + "integrity": "sha512-hNUoAffjKB+H099+i4UeXP6aZ8wGMafwOab+3dpqh31ssZcNEau3ZGV+W0u8yQqjwqjY2mHSssWYERuh1B1/tQ==", "dev": true, "requires": { - "@types/node": "^18.0.0", "@types/ua-parser-js": "^0.7.33", - "@wdio/config": "7.26.0", - "@wdio/logger": "7.26.0", - "@wdio/protocols": "7.22.0", - "@wdio/types": "7.26.0", - "@wdio/utils": "7.26.0", + "@wdio/config": "8.0.2", + "@wdio/logger": "8.0.0", + "@wdio/protocols": "8.0.0", + "@wdio/types": "8.0.0", + "@wdio/utils": "8.0.2", "chrome-launcher": "^0.15.0", "edge-paths": "^2.1.0", - "puppeteer-core": "^13.1.3", + "import-meta-resolve": "^2.1.0", + "puppeteer-core": "19.3.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.11.9", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.9.tgz", - "integrity": "sha512-CRpX21/kGdzjOpFsZSkcrXMGIBWMGNIHXXBVFSH+ggkftxg+XYP20TESbh+zFvFj3EQOl5byk0HTRn1IL6hbqg==", + "version": "18.11.10", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.10.tgz", + "integrity": "sha512-juG3RWMBOqcOuXC643OAdSA525V44cVgGV6dUDuiFtss+8Fk5x1hI93Rsld43VeJVIeqlP9I7Fn9/qaVqoEAuQ==", "dev": true }, "@wdio/config": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@wdio/config/-/config-7.26.0.tgz", - "integrity": "sha512-GO6kFGgFrx2Hiq+Ww6V9I7cZfShPjfPVhPy3uXnKN2B4FilX8ilLAp5cIFuMuHPeOQq0crYX9cnLYXka6dCGgg==", + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@wdio/config/-/config-8.0.2.tgz", + "integrity": "sha512-sLrNT6BXlWpfZS0FODxl628bCKtqHqD3TU31+6av3TnNfa142hQrbGf0u5birtU8c3Qacch4ycA3pmQ1xePGRA==", "dev": true, "requires": { - "@wdio/logger": "7.26.0", - "@wdio/types": "7.26.0", - "@wdio/utils": "7.26.0", - "deepmerge": "^4.0.0", - "glob": "^8.0.3" + "@wdio/logger": "8.0.0", + "@wdio/types": "8.0.0", + "@wdio/utils": "8.0.2", + "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.26.0", - "resolved": "https://registry.npmjs.org/@wdio/logger/-/logger-7.26.0.tgz", - "integrity": "sha512-kQj9s5JudAG9qB+zAAcYGPHVfATl2oqKgqj47yjehOQ1zzG33xmtL1ArFbQKWhDG32y1A8sN6b0pIqBEIwgg8Q==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@wdio/logger/-/logger-8.0.0.tgz", + "integrity": "sha512-QEBPZoFQhWqqIYmhp8Wa+HhvMrH2Yy0xbD3MPOibkFwp9Tn8Si7oDxbnWqzcPiukLWcb4E/QlgE5f3IM5BrAPQ==", "dev": 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.22.0", - "resolved": "https://registry.npmjs.org/@wdio/protocols/-/protocols-7.22.0.tgz", - "integrity": "sha512-8EXRR+Ymdwousm/VGtW3H1hwxZ/1g1H99A1lF0U4GuJ5cFWHCd0IVE5H31Z52i8ZruouW8jueMkGZPSo2IIUSQ==", + "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/types": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@wdio/types/-/types-7.26.0.tgz", - "integrity": "sha512-mOTfWAGQ+iT58iaZhJMwlUkdEn3XEWE4jthysMLXFnSuZ2eaODVAiK31SmlS/eUqgSIaupeGqYUrtCuSNbLefg==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@wdio/types/-/types-8.0.0.tgz", + "integrity": "sha512-6Qt4NmCJrxtbZLxCJBSW68Q4olvHGLoy5mOBaZhPC5FUEmxwhMAtq5e3zrAIpnHEMwl3RUDnMnSO9dApI7a7IQ==", "dev": true, "requires": { - "@types/node": "^18.0.0", - "got": "^11.8.1" + "@types/node": "^18.0.0" } }, "@wdio/utils": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@wdio/utils/-/utils-7.26.0.tgz", - "integrity": "sha512-pVq2MPXZAYLkKGKIIHktHejnHqg4TYKoNYSi2EDv+I3GlT8VZKXHazKhci82ov0tD+GdF27+s4DWNDCfGYfBdQ==", + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@wdio/utils/-/utils-8.0.2.tgz", + "integrity": "sha512-3AAShhA1uZV58E/eXRsyA0sHfwlAlmXKH5U202SYwFcYHV/c0zPu56p/ndohsyMmh+0UxgFpHEbTKiI4dhhf3A==", "dev": true, "requires": { - "@wdio/logger": "7.26.0", - "@wdio/types": "7.26.0", + "@wdio/logger": "8.0.0", + "@wdio/types": "8.0.0", "p-iteration": "^1.1.8" } }, @@ -18298,6 +19303,28 @@ "balanced-match": "^1.0.0" } }, + "chalk": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.1.2.tgz", + "integrity": "sha512-E5CkT4jWURs1Vy5qGJye+XwCkNj7Od3Af7CP6SujMetSMkLs8Do2RWJK5yx1wamHV/op8Rz+9rltjaTQWDnEFQ==", + "dev": true + }, + "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", @@ -18311,29 +19338,113 @@ "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" + } + }, + "type-fest": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", + "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", + "dev": true + }, "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.1069585", - "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1069585.tgz", - "integrity": "sha512-sHmkZB6immWQWU4Wx3ogXwxjQUvQc92MmUDL52+q1z2hQmvpOcvDmbsjwX7QZOPTA32dMV7fgT6zUytcpPzy4A==", + "version": "0.0.1077862", + "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1077862.tgz", + "integrity": "sha512-4xhfUhjBf1rE3XD+/VYoKls2fxBE0rG3j1C4b1Ak6hnz9WiwzpMKX7edIfsiPIGRqVZfosu+igxnzVnDhe1T1w==", "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", @@ -18965,6 +20076,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", @@ -19346,6 +20484,12 @@ "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", @@ -19903,9 +21047,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": { @@ -20833,6 +21977,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", @@ -21310,6 +22460,94 @@ } } }, + "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, + "optional": true, + "requires": { + "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": { + "micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "optional": true, + "requires": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + } + } + } + }, + "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, + "optional": true + } + } + }, "jju": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/jju/-/jju-1.4.0.tgz", @@ -21496,9 +22734,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" @@ -21800,7 +23038,8 @@ "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 + "dev": true, + "peer": true }, "lodash.isplainobject": { "version": "4.0.6", @@ -23313,6 +24552,7 @@ "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", "dev": true, + "peer": true, "requires": { "find-up": "^4.0.0" }, @@ -23322,6 +24562,7 @@ "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, + "peer": true, "requires": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" @@ -23332,6 +24573,7 @@ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, + "peer": true, "requires": { "p-locate": "^4.1.0" } @@ -23341,6 +24583,7 @@ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, + "peer": true, "requires": { "p-try": "^2.0.0" } @@ -23350,6 +24593,7 @@ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, + "peer": true, "requires": { "p-limit": "^2.2.0" } @@ -23462,6 +24706,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", @@ -23549,29 +24814,27 @@ "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.3.0", + "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-19.3.0.tgz", + "integrity": "sha512-P8VAAOBnBJo/7DKJnj1b0K9kZBF2D8lkdL94CjJ+DZKCp182LQqYemPI9omUSZkh4bgykzXjZhaVR1qtddTTQg==", "dev": true, "requires": { "cross-fetch": "3.1.5", "debug": "4.3.4", - "devtools-protocol": "0.0.981744", + "devtools-protocol": "0.0.1056733", "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.1056733", + "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1056733.tgz", + "integrity": "sha512-CmTu6SQx2g3TbZzDCAV58+LTxVdKplS7xip0g5oDXpZ+isr0rv5dDP8ToyVRywzPHkCCPKgKgScEcwz4uPWDIA==", "dev": true }, "https-proxy-agent": { @@ -23585,9 +24848,9 @@ } }, "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": {} } @@ -23651,6 +24914,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", @@ -24701,6 +25971,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", @@ -25709,77 +26998,96 @@ } }, "webdriver": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/webdriver/-/webdriver-7.26.0.tgz", - "integrity": "sha512-T21T31wq29D/rmpFHcAahhdrvfsfXsLs/LBe2su7wL725ptOEoSssuDXjXMkwjf9MSUIXnTcUIz8oJGbKRUMwQ==", + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/webdriver/-/webdriver-8.0.2.tgz", + "integrity": "sha512-tFp935CNs1pczjns26tsfBHhrpq6r9g9MrAIgzPvNfKZzNNpaiY2qXtq2OkPQQxjCZchitNcAmaTz2k251SSNA==", "dev": true, "requires": { "@types/node": "^18.0.0", - "@wdio/config": "7.26.0", - "@wdio/logger": "7.26.0", - "@wdio/protocols": "7.22.0", - "@wdio/types": "7.26.0", - "@wdio/utils": "7.26.0", - "got": "^11.0.2", - "ky": "0.30.0", - "lodash.merge": "^4.6.1" + "@types/ws": "^8.5.3", + "@wdio/config": "8.0.2", + "@wdio/logger": "8.0.0", + "@wdio/protocols": "8.0.0", + "@wdio/types": "8.0.0", + "@wdio/utils": "8.0.2", + "deepmerge-ts": "^4.2.2", + "got": "^12.1.0", + "ky": "^0.32.1", + "ws": "^8.8.0" }, "dependencies": { + "@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" + } + }, "@types/node": { - "version": "18.11.9", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.9.tgz", - "integrity": "sha512-CRpX21/kGdzjOpFsZSkcrXMGIBWMGNIHXXBVFSH+ggkftxg+XYP20TESbh+zFvFj3EQOl5byk0HTRn1IL6hbqg==", + "version": "18.11.10", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.10.tgz", + "integrity": "sha512-juG3RWMBOqcOuXC643OAdSA525V44cVgGV6dUDuiFtss+8Fk5x1hI93Rsld43VeJVIeqlP9I7Fn9/qaVqoEAuQ==", "dev": true }, "@wdio/config": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@wdio/config/-/config-7.26.0.tgz", - "integrity": "sha512-GO6kFGgFrx2Hiq+Ww6V9I7cZfShPjfPVhPy3uXnKN2B4FilX8ilLAp5cIFuMuHPeOQq0crYX9cnLYXka6dCGgg==", + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@wdio/config/-/config-8.0.2.tgz", + "integrity": "sha512-sLrNT6BXlWpfZS0FODxl628bCKtqHqD3TU31+6av3TnNfa142hQrbGf0u5birtU8c3Qacch4ycA3pmQ1xePGRA==", "dev": true, "requires": { - "@wdio/logger": "7.26.0", - "@wdio/types": "7.26.0", - "@wdio/utils": "7.26.0", - "deepmerge": "^4.0.0", - "glob": "^8.0.3" + "@wdio/logger": "8.0.0", + "@wdio/types": "8.0.0", + "@wdio/utils": "8.0.2", + "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.26.0", - "resolved": "https://registry.npmjs.org/@wdio/logger/-/logger-7.26.0.tgz", - "integrity": "sha512-kQj9s5JudAG9qB+zAAcYGPHVfATl2oqKgqj47yjehOQ1zzG33xmtL1ArFbQKWhDG32y1A8sN6b0pIqBEIwgg8Q==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@wdio/logger/-/logger-8.0.0.tgz", + "integrity": "sha512-QEBPZoFQhWqqIYmhp8Wa+HhvMrH2Yy0xbD3MPOibkFwp9Tn8Si7oDxbnWqzcPiukLWcb4E/QlgE5f3IM5BrAPQ==", "dev": 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.22.0", - "resolved": "https://registry.npmjs.org/@wdio/protocols/-/protocols-7.22.0.tgz", - "integrity": "sha512-8EXRR+Ymdwousm/VGtW3H1hwxZ/1g1H99A1lF0U4GuJ5cFWHCd0IVE5H31Z52i8ZruouW8jueMkGZPSo2IIUSQ==", + "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/types": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@wdio/types/-/types-7.26.0.tgz", - "integrity": "sha512-mOTfWAGQ+iT58iaZhJMwlUkdEn3XEWE4jthysMLXFnSuZ2eaODVAiK31SmlS/eUqgSIaupeGqYUrtCuSNbLefg==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@wdio/types/-/types-8.0.0.tgz", + "integrity": "sha512-6Qt4NmCJrxtbZLxCJBSW68Q4olvHGLoy5mOBaZhPC5FUEmxwhMAtq5e3zrAIpnHEMwl3RUDnMnSO9dApI7a7IQ==", "dev": true, "requires": { - "@types/node": "^18.0.0", - "got": "^11.8.1" + "@types/node": "^18.0.0" } }, "@wdio/utils": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@wdio/utils/-/utils-7.26.0.tgz", - "integrity": "sha512-pVq2MPXZAYLkKGKIIHktHejnHqg4TYKoNYSi2EDv+I3GlT8VZKXHazKhci82ov0tD+GdF27+s4DWNDCfGYfBdQ==", + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@wdio/utils/-/utils-8.0.2.tgz", + "integrity": "sha512-3AAShhA1uZV58E/eXRsyA0sHfwlAlmXKH5U202SYwFcYHV/c0zPu56p/ndohsyMmh+0UxgFpHEbTKiI4dhhf3A==", "dev": true, "requires": { - "@wdio/logger": "7.26.0", - "@wdio/types": "7.26.0", + "@wdio/logger": "8.0.0", + "@wdio/types": "8.0.0", "p-iteration": "^1.1.8" } }, @@ -25792,6 +27100,55 @@ "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" + } + }, + "chalk": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.1.2.tgz", + "integrity": "sha512-E5CkT4jWURs1Vy5qGJye+XwCkNj7Od3Af7CP6SujMetSMkLs8Do2RWJK5yx1wamHV/op8Rz+9rltjaTQWDnEFQ==", + "dev": true + }, + "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", @@ -25805,113 +27162,245 @@ "once": "^1.3.0" } }, + "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" + } + }, "ky": { - "version": "0.30.0", - "resolved": "https://registry.npmjs.org/ky/-/ky-0.30.0.tgz", - "integrity": "sha512-X/u76z4JtDVq10u1JA5UQfatPxgPaVDMYTrgHyiTpGN2z4TMEJkIHsoSBBSg9SWZEIXTKsi9kHgiQ9o3Y/4yog==", + "version": "0.32.2", + "resolved": "https://registry.npmjs.org/ky/-/ky-0.32.2.tgz", + "integrity": "sha512-eBJeF6IXNwX5rksdwBrE2rIJrU2d84GoTvdM7OmmTIwUVXEMd72wIwvT+nyhrqtv7AzbSNsWz7yRsHgVhj1uog==", + "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" + } + }, + "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" + } + }, + "type-fest": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", + "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", + "dev": true + }, + "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.26.0", - "resolved": "https://registry.npmjs.org/webdriverio/-/webdriverio-7.26.0.tgz", - "integrity": "sha512-7m9TeP871aYxZYKBI4GDh5aQZLN9Fd/PASu5K/jEIT65J4OBB6g5ZaycGFOmfNHCfjWKjwPXZuKiN1f2mcrcRg==", + "version": "8.0.5", + "resolved": "https://registry.npmjs.org/webdriverio/-/webdriverio-8.0.5.tgz", + "integrity": "sha512-UUP5yWrwPE9U737r+7H0vYWckIGk87VklhALpymVkg7DEmlHP2c7/EI3ZWRZnXqyP5bCOVImuOvxEjiNOH1f+g==", "dev": true, "requires": { "@types/aria-query": "^5.0.0", "@types/node": "^18.0.0", - "@wdio/config": "7.26.0", - "@wdio/logger": "7.26.0", - "@wdio/protocols": "7.22.0", - "@wdio/repl": "7.26.0", - "@wdio/types": "7.26.0", - "@wdio/utils": "7.26.0", + "@wdio/config": "8.0.2", + "@wdio/globals": "8.0.5", + "@wdio/logger": "8.0.0", + "@wdio/protocols": "8.0.0", + "@wdio/repl": "8.0.0", + "@wdio/types": "8.0.0", + "@wdio/utils": "8.0.2", "archiver": "^5.0.0", "aria-query": "^5.0.0", "css-shorthand-properties": "^1.1.1", "css-value": "^0.0.1", - "devtools": "7.26.0", - "devtools-protocol": "^0.0.1069585", - "fs-extra": "^10.0.0", + "devtools": "8.0.2", + "devtools-protocol": "^0.0.1077862", "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.3.0", "query-selector-shadow-dom": "^1.0.0", "resq": "^1.9.1", "rgb2hex": "0.2.5", "serialize-error": "^8.0.0", - "webdriver": "7.26.0" + "webdriver": "8.0.2" }, "dependencies": { "@types/node": { - "version": "18.11.9", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.9.tgz", - "integrity": "sha512-CRpX21/kGdzjOpFsZSkcrXMGIBWMGNIHXXBVFSH+ggkftxg+XYP20TESbh+zFvFj3EQOl5byk0HTRn1IL6hbqg==", + "version": "18.11.10", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.10.tgz", + "integrity": "sha512-juG3RWMBOqcOuXC643OAdSA525V44cVgGV6dUDuiFtss+8Fk5x1hI93Rsld43VeJVIeqlP9I7Fn9/qaVqoEAuQ==", "dev": true }, "@wdio/config": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@wdio/config/-/config-7.26.0.tgz", - "integrity": "sha512-GO6kFGgFrx2Hiq+Ww6V9I7cZfShPjfPVhPy3uXnKN2B4FilX8ilLAp5cIFuMuHPeOQq0crYX9cnLYXka6dCGgg==", + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@wdio/config/-/config-8.0.2.tgz", + "integrity": "sha512-sLrNT6BXlWpfZS0FODxl628bCKtqHqD3TU31+6av3TnNfa142hQrbGf0u5birtU8c3Qacch4ycA3pmQ1xePGRA==", "dev": true, "requires": { - "@wdio/logger": "7.26.0", - "@wdio/types": "7.26.0", - "@wdio/utils": "7.26.0", - "deepmerge": "^4.0.0", - "glob": "^8.0.3" + "@wdio/logger": "8.0.0", + "@wdio/types": "8.0.0", + "@wdio/utils": "8.0.2", + "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.26.0", - "resolved": "https://registry.npmjs.org/@wdio/logger/-/logger-7.26.0.tgz", - "integrity": "sha512-kQj9s5JudAG9qB+zAAcYGPHVfATl2oqKgqj47yjehOQ1zzG33xmtL1ArFbQKWhDG32y1A8sN6b0pIqBEIwgg8Q==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@wdio/logger/-/logger-8.0.0.tgz", + "integrity": "sha512-QEBPZoFQhWqqIYmhp8Wa+HhvMrH2Yy0xbD3MPOibkFwp9Tn8Si7oDxbnWqzcPiukLWcb4E/QlgE5f3IM5BrAPQ==", "dev": 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.22.0", - "resolved": "https://registry.npmjs.org/@wdio/protocols/-/protocols-7.22.0.tgz", - "integrity": "sha512-8EXRR+Ymdwousm/VGtW3H1hwxZ/1g1H99A1lF0U4GuJ5cFWHCd0IVE5H31Z52i8ZruouW8jueMkGZPSo2IIUSQ==", + "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/types": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@wdio/types/-/types-7.26.0.tgz", - "integrity": "sha512-mOTfWAGQ+iT58iaZhJMwlUkdEn3XEWE4jthysMLXFnSuZ2eaODVAiK31SmlS/eUqgSIaupeGqYUrtCuSNbLefg==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@wdio/types/-/types-8.0.0.tgz", + "integrity": "sha512-6Qt4NmCJrxtbZLxCJBSW68Q4olvHGLoy5mOBaZhPC5FUEmxwhMAtq5e3zrAIpnHEMwl3RUDnMnSO9dApI7a7IQ==", "dev": true, "requires": { - "@types/node": "^18.0.0", - "got": "^11.8.1" + "@types/node": "^18.0.0" } }, "@wdio/utils": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@wdio/utils/-/utils-7.26.0.tgz", - "integrity": "sha512-pVq2MPXZAYLkKGKIIHktHejnHqg4TYKoNYSi2EDv+I3GlT8VZKXHazKhci82ov0tD+GdF27+s4DWNDCfGYfBdQ==", + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@wdio/utils/-/utils-8.0.2.tgz", + "integrity": "sha512-3AAShhA1uZV58E/eXRsyA0sHfwlAlmXKH5U202SYwFcYHV/c0zPu56p/ndohsyMmh+0UxgFpHEbTKiI4dhhf3A==", "dev": true, "requires": { - "@wdio/logger": "7.26.0", - "@wdio/types": "7.26.0", + "@wdio/logger": "8.0.0", + "@wdio/types": "8.0.0", "p-iteration": "^1.1.8" } }, @@ -25924,6 +27413,28 @@ "balanced-match": "^1.0.0" } }, + "chalk": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.1.2.tgz", + "integrity": "sha512-E5CkT4jWURs1Vy5qGJye+XwCkNj7Od3Af7CP6SujMetSMkLs8Do2RWJK5yx1wamHV/op8Rz+9rltjaTQWDnEFQ==", + "dev": true + }, + "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", @@ -25937,14 +27448,88 @@ "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" + } + }, + "type-fest": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", + "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", + "dev": true + }, + "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 } } }, diff --git a/package.json b/package.json index 2f36a3d48..a4266cf98 100644 --- a/package.json +++ b/package.json @@ -110,7 +110,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" }, "dependencies": { From ee602913e462afcf41b659282adbc2e4fbffaa96 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 5 Dec 2022 08:12:41 -0800 Subject: [PATCH 46/73] chore(deps): bump eslint from 8.28.0 to 8.29.0 (#6685) Bumps [eslint](https://github.com/eslint/eslint) from 8.28.0 to 8.29.0. - [Release notes](https://github.com/eslint/eslint/releases) - [Changelog](https://github.com/eslint/eslint/blob/main/CHANGELOG.md) - [Commits](https://github.com/eslint/eslint/compare/v8.28.0...v8.29.0) --- updated-dependencies: - dependency-name: eslint dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index 39fe5bbf6..ec572f9a3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5349,9 +5349,9 @@ } }, "node_modules/eslint": { - "version": "8.28.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.28.0.tgz", - "integrity": "sha512-S27Di+EVyMxcHiwDrFzk8dJYAaD+/5SoWKxL1ri/71CRHsnJnRDPNt2Kzj24+MT9FDupf4aqqyqPrvI8MvQ4VQ==", + "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", @@ -19736,9 +19736,9 @@ } }, "eslint": { - "version": "8.28.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.28.0.tgz", - "integrity": "sha512-S27Di+EVyMxcHiwDrFzk8dJYAaD+/5SoWKxL1ri/71CRHsnJnRDPNt2Kzj24+MT9FDupf4aqqyqPrvI8MvQ4VQ==", + "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", From adf1af3482681325b102b8286c204f544209d039 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 5 Dec 2022 08:14:01 -0800 Subject: [PATCH 47/73] chore(deps): bump @microsoft/api-documenter from 7.19.24 to 7.19.25 (#6682) Bumps [@microsoft/api-documenter](https://github.com/microsoft/rushstack/tree/HEAD/apps/api-documenter) from 7.19.24 to 7.19.25. - [Release notes](https://github.com/microsoft/rushstack/releases) - [Changelog](https://github.com/microsoft/rushstack/blob/main/apps/api-documenter/CHANGELOG.md) - [Commits](https://github.com/microsoft/rushstack/commits/@microsoft/api-documenter_v7.19.25/apps/api-documenter) --- updated-dependencies: - dependency-name: "@microsoft/api-documenter" dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index ec572f9a3..6d70c12c5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -541,9 +541,9 @@ } }, "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", @@ -15958,9 +15958,9 @@ } }, "@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", From 0fda9f0bf9dbb463d9767c21d0f7cbcf26baa8e8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 5 Dec 2022 08:15:14 -0800 Subject: [PATCH 48/73] chore(deps): bump decode-uri-component from 0.2.0 to 0.2.2 (#6681) Bumps [decode-uri-component](https://github.com/SamVerschueren/decode-uri-component) from 0.2.0 to 0.2.2. - [Release notes](https://github.com/SamVerschueren/decode-uri-component/releases) - [Commits](https://github.com/SamVerschueren/decode-uri-component/compare/v0.2.0...v0.2.2) --- updated-dependencies: - dependency-name: decode-uri-component dependency-type: indirect ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index 6d70c12c5..f63bdb398 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4493,9 +4493,9 @@ "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" @@ -19082,9 +19082,9 @@ "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": { From bb934cadbfdb79a1fe62c69533d577fd9b99a397 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 5 Dec 2022 08:17:43 -0800 Subject: [PATCH 49/73] chore(deps): bump @wdio/selenium-standalone-service from 7.26.0 to 8.0.2 (#6684) Bumps [@wdio/selenium-standalone-service](https://github.com/webdriverio/webdriverio/tree/HEAD/packages/wdio-seleniun-standalone-service) from 7.26.0 to 8.0.2. - [Release notes](https://github.com/webdriverio/webdriverio/releases) - [Commits](https://github.com/webdriverio/webdriverio/commits/v8.0.2/packages/wdio-seleniun-standalone-service) --- updated-dependencies: - dependency-name: "@wdio/selenium-standalone-service" dependency-type: direct:development update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 4194 +++++---------------------------------------- package.json | 2 +- 2 files changed, 390 insertions(+), 3806 deletions(-) diff --git a/package-lock.json b/package-lock.json index f63bdb398..5858a8480 100644 --- a/package-lock.json +++ b/package-lock.json @@ -20,7 +20,7 @@ "@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", @@ -948,44 +948,18 @@ "@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==", - "dev": true, - "peer": true, - "dependencies": { - "@types/through": "*" - } - }, "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", @@ -1028,43 +1002,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", @@ -1072,9 +1009,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": { @@ -1083,16 +1020,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", @@ -1124,16 +1051,6 @@ "dev": true, "optional": true }, - "node_modules/@types/through": { - "version": "0.0.30", - "resolved": "https://registry.npmjs.org/@types/through/-/through-0.0.30.tgz", - "integrity": "sha512-FvnCJljyxhPM3gkRgWmxmDZyAQSiBQQWLI0A0VFL0K7W1oRUrPJSqNO0NvTnLkBcotdlp3lKvaT0JrnyRDkzOg==", - "dev": true, - "peer": true, - "dependencies": { - "@types/node": "*" - } - }, "node_modules/@types/ua-parser-js": { "version": "0.7.36", "resolved": "https://registry.npmjs.org/@types/ua-parser-js/-/ua-parser-js-0.7.36.tgz", @@ -1575,432 +1492,26 @@ "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==", - "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" - }, - "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==", + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@wdio/config/-/config-8.0.2.tgz", + "integrity": "sha512-sLrNT6BXlWpfZS0FODxl628bCKtqHqD3TU31+6av3TnNfa142hQrbGf0u5birtU8c3Qacch4ycA3pmQ1xePGRA==", "dev": true, - "peer": true, "dependencies": { - "@wdio/logger": "7.16.0", - "@wdio/types": "7.16.3", - "deepmerge": "^4.0.0", - "glob": "^7.1.2" + "@wdio/logger": "8.0.0", + "@wdio/types": "8.0.0", + "@wdio/utils": "8.0.2", + "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/globals": { - "version": "8.0.5", - "resolved": "https://registry.npmjs.org/@wdio/globals/-/globals-8.0.5.tgz", - "integrity": "sha512-SUjC6WuZZPrLz/xV1SwfleyttdcItbocVvGhnJ/lCtlgVxnXcJIF6Qz0D1Mc7C49DiceU35XpVbfv395SJei3Q==", - "dev": true, - "engines": { - "node": "^16.13 || >=18" - }, - "optionalDependencies": { - "expect-webdriverio": "^4.0.1", - "webdriverio": "8.0.5" - } - }, - "node_modules/@wdio/logger": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@wdio/logger/-/logger-7.16.0.tgz", - "integrity": "sha512-/6lOGb2Iow5eSsy7RJOl1kCwsP4eMlG+/QKro5zUJsuyNJSQXf2ejhpkzyKWLgQbHu83WX6cM1014AZuLkzoQg==", - "dev": true, - "peer": 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/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": "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, "engines": { "node": "^16.13 || >=18" } }, - "node_modules/@wdio/selenium-standalone-service": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@wdio/selenium-standalone-service/-/selenium-standalone-service-7.26.0.tgz", - "integrity": "sha512-bP79aBzRBvgNCaJihLaQT/Qxa604o8UsAv9Ce2tARlVb4jFjpGH0w/xkuxUTqSpeQy/Sj+3hLExhNh1YgLe/Bg==", - "dev": true, - "dependencies": { - "@types/fs-extra": "^9.0.1", - "@types/node": "^18.0.0", - "@types/selenium-standalone": "^7.0.0", - "@wdio/config": "7.26.0", - "@wdio/logger": "7.26.0", - "@wdio/types": "7.26.0", - "fs-extra": "^10.0.0", - "selenium-standalone": "^8.0.3" - }, - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "@wdio/cli": "^7.0.0" - } - }, - "node_modules/@wdio/selenium-standalone-service/node_modules/@types/node": { - "version": "18.11.9", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.9.tgz", - "integrity": "sha512-CRpX21/kGdzjOpFsZSkcrXMGIBWMGNIHXXBVFSH+ggkftxg+XYP20TESbh+zFvFj3EQOl5byk0HTRn1IL6hbqg==", - "dev": true - }, - "node_modules/@wdio/selenium-standalone-service/node_modules/@wdio/config": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@wdio/config/-/config-7.26.0.tgz", - "integrity": "sha512-GO6kFGgFrx2Hiq+Ww6V9I7cZfShPjfPVhPy3uXnKN2B4FilX8ilLAp5cIFuMuHPeOQq0crYX9cnLYXka6dCGgg==", - "dev": true, - "dependencies": { - "@wdio/logger": "7.26.0", - "@wdio/types": "7.26.0", - "@wdio/utils": "7.26.0", - "deepmerge": "^4.0.0", - "glob": "^8.0.3" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/@wdio/selenium-standalone-service/node_modules/@wdio/logger": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@wdio/logger/-/logger-7.26.0.tgz", - "integrity": "sha512-kQj9s5JudAG9qB+zAAcYGPHVfATl2oqKgqj47yjehOQ1zzG33xmtL1ArFbQKWhDG32y1A8sN6b0pIqBEIwgg8Q==", - "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/selenium-standalone-service/node_modules/@wdio/types": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@wdio/types/-/types-7.26.0.tgz", - "integrity": "sha512-mOTfWAGQ+iT58iaZhJMwlUkdEn3XEWE4jthysMLXFnSuZ2eaODVAiK31SmlS/eUqgSIaupeGqYUrtCuSNbLefg==", - "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/selenium-standalone-service/node_modules/@wdio/utils": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@wdio/utils/-/utils-7.26.0.tgz", - "integrity": "sha512-pVq2MPXZAYLkKGKIIHktHejnHqg4TYKoNYSi2EDv+I3GlT8VZKXHazKhci82ov0tD+GdF27+s4DWNDCfGYfBdQ==", - "dev": true, - "dependencies": { - "@wdio/logger": "7.26.0", - "@wdio/types": "7.26.0", - "p-iteration": "^1.1.8" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/@wdio/selenium-standalone-service/node_modules/brace-expansion": { + "node_modules/@wdio/config/node_modules/brace-expansion": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", @@ -2009,7 +1520,35 @@ "balanced-match": "^1.0.0" } }, - "node_modules/@wdio/selenium-standalone-service/node_modules/glob": { + "node_modules/@wdio/config/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/config/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/config/node_modules/glob": { "version": "8.0.3", "resolved": "https://registry.npmjs.org/glob/-/glob-8.0.3.tgz", "integrity": "sha512-ull455NHSHI/Y1FqGaaYFaLGkNMMJbavMrEGFXG/PGrg6y7sutWHUHrz6gy6WEBH6akM1M414dWKCNs+IhKdiQ==", @@ -2028,10 +1567,25 @@ "url": "https://github.com/sponsors/isaacs" } }, - "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==", + "node_modules/@wdio/config/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/config/node_modules/minimatch": { + "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" @@ -2040,33 +1594,181 @@ "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/config/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/config/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/@wdio/config/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/config/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/config/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/config/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/@wdio/globals": { + "version": "8.0.5", + "resolved": "https://registry.npmjs.org/@wdio/globals/-/globals-8.0.5.tgz", + "integrity": "sha512-SUjC6WuZZPrLz/xV1SwfleyttdcItbocVvGhnJ/lCtlgVxnXcJIF6Qz0D1Mc7C49DiceU35XpVbfv395SJei3Q==", + "dev": true, + "engines": { + "node": "^16.13 || >=18" + }, + "optionalDependencies": { + "expect-webdriverio": "^4.0.1", + "webdriverio": "8.0.5" + } + }, + "node_modules/@wdio/logger": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@wdio/logger/-/logger-8.0.0.tgz", + "integrity": "sha512-QEBPZoFQhWqqIYmhp8Wa+HhvMrH2Yy0xbD3MPOibkFwp9Tn8Si7oDxbnWqzcPiukLWcb4E/QlgE5f3IM5BrAPQ==", + "dev": true, + "dependencies": { + "chalk": "^5.1.2", + "loglevel": "^1.6.0", + "loglevel-plugin-prefix": "^0.8.4", + "strip-ansi": "^6.0.0" + }, + "engines": { + "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/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, + "engines": { + "node": "^16.13 || >=18" + } + }, + "node_modules/@wdio/selenium-standalone-service": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@wdio/selenium-standalone-service/-/selenium-standalone-service-8.0.2.tgz", + "integrity": "sha512-C0JT4cG+HAj9Ubnpu/NC8MSr5i6p3/4aSUoeCfXQ2sR8ltDOUj1xt4SNTgMERM+guj0Rp5LUvpV/U5iy+jfgPQ==", + "dev": true, + "dependencies": { + "@types/selenium-standalone": "^7.0.0", + "@wdio/config": "8.0.2", + "@wdio/logger": "8.0.0", + "@wdio/types": "8.0.0", + "selenium-standalone": "^8.2.1" + }, + "engines": { + "node": "^16.13 || >=18" + } + }, + "node_modules/@wdio/types": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@wdio/types/-/types-8.0.0.tgz", + "integrity": "sha512-6Qt4NmCJrxtbZLxCJBSW68Q4olvHGLoy5mOBaZhPC5FUEmxwhMAtq5e3zrAIpnHEMwl3RUDnMnSO9dApI7a7IQ==", + "dev": true, + "dependencies": { + "@types/node": "^18.0.0" + }, + "engines": { + "node": "^16.13 || >=18" } }, "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==", + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@wdio/utils/-/utils-8.0.2.tgz", + "integrity": "sha512-3AAShhA1uZV58E/eXRsyA0sHfwlAlmXKH5U202SYwFcYHV/c0zPu56p/ndohsyMmh+0UxgFpHEbTKiI4dhhf3A==", "dev": true, - "peer": true, "dependencies": { - "@wdio/logger": "7.16.0", - "@wdio/types": "7.16.3", + "@wdio/logger": "8.0.0", + "@wdio/types": "8.0.0", "p-iteration": "^1.1.8" }, "engines": { - "node": ">=12.0.0" + "node": "^16.13 || >=18" } }, "node_modules/@yarnpkg/lockfile": { @@ -2165,22 +1867,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", @@ -2582,16 +2268,6 @@ "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", @@ -3282,215 +2958,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", @@ -3636,13 +3103,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", @@ -3828,42 +3288,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", @@ -4554,15 +3978,6 @@ "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": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", - "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/deepmerge-ts": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/deepmerge-ts/-/deepmerge-ts-4.2.2.tgz", @@ -4593,26 +4008,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", @@ -4704,259 +4099,12 @@ "integrity": "sha512-4xhfUhjBf1rE3XD+/VYoKls2fxBE0rG3j1C4b1Ak6hnz9WiwzpMKX7edIfsiPIGRqVZfosu+igxnzVnDhe1T1w==", "dev": true }, - "node_modules/devtools/node_modules/@types/node": { - "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/devtools/node_modules/@wdio/config": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@wdio/config/-/config-8.0.2.tgz", - "integrity": "sha512-sLrNT6BXlWpfZS0FODxl628bCKtqHqD3TU31+6av3TnNfa142hQrbGf0u5birtU8c3Qacch4ycA3pmQ1xePGRA==", - "dev": true, - "dependencies": { - "@wdio/logger": "8.0.0", - "@wdio/types": "8.0.0", - "@wdio/utils": "8.0.2", - "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": "^16.13 || >=18" - } - }, - "node_modules/devtools/node_modules/@wdio/logger": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@wdio/logger/-/logger-8.0.0.tgz", - "integrity": "sha512-QEBPZoFQhWqqIYmhp8Wa+HhvMrH2Yy0xbD3MPOibkFwp9Tn8Si7oDxbnWqzcPiukLWcb4E/QlgE5f3IM5BrAPQ==", - "dev": true, - "dependencies": { - "chalk": "^5.1.2", - "loglevel": "^1.6.0", - "loglevel-plugin-prefix": "^0.8.4", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": "^16.13 || >=18" - } - }, "node_modules/devtools/node_modules/@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 }, - "node_modules/devtools/node_modules/@wdio/types": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@wdio/types/-/types-8.0.0.tgz", - "integrity": "sha512-6Qt4NmCJrxtbZLxCJBSW68Q4olvHGLoy5mOBaZhPC5FUEmxwhMAtq5e3zrAIpnHEMwl3RUDnMnSO9dApI7a7IQ==", - "dev": true, - "dependencies": { - "@types/node": "^18.0.0" - }, - "engines": { - "node": "^16.13 || >=18" - } - }, - "node_modules/devtools/node_modules/@wdio/utils": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@wdio/utils/-/utils-8.0.2.tgz", - "integrity": "sha512-3AAShhA1uZV58E/eXRsyA0sHfwlAlmXKH5U202SYwFcYHV/c0zPu56p/ndohsyMmh+0UxgFpHEbTKiI4dhhf3A==", - "dev": true, - "dependencies": { - "@wdio/logger": "8.0.0", - "@wdio/types": "8.0.0", - "p-iteration": "^1.1.8" - }, - "engines": { - "node": "^16.13 || >=18" - } - }, - "node_modules/devtools/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/devtools/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/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", - "integrity": "sha512-ull455NHSHI/Y1FqGaaYFaLGkNMMJbavMrEGFXG/PGrg6y7sutWHUHrz6gy6WEBH6akM1M414dWKCNs+IhKdiQ==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^5.0.1", - "once": "^1.3.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "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.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" - }, - "engines": { - "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/type-fest": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", - "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", - "dev": true, - "engines": { - "node": ">=12.20" - }, - "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", @@ -4981,18 +4129,6 @@ "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", @@ -5147,22 +4283,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", @@ -5853,21 +4973,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", @@ -6035,32 +5140,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", @@ -6080,16 +5159,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", @@ -6438,19 +5507,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", @@ -8191,32 +7247,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", @@ -8440,16 +7470,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", @@ -8665,110 +7685,6 @@ "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==", - "dev": true, - "peer": true, - "dependencies": { - "async": "0.9.x", - "chalk": "^2.4.2", - "filelist": "^1.0.1", - "minimatch": "^3.0.4" - }, - "bin": { - "jake": "bin/cli.js" - }, - "engines": { - "node": "*" - } - }, - "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==", - "dev": true, - "peer": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "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==", - "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, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "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==", - "dev": true, - "peer": 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" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/jest-diff": { "version": "29.3.1", "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.3.1.tgz", @@ -9121,19 +8037,6 @@ "graceful-fs": "^4.1.11" } }, - "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==", - "dev": true, - "peer": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sindresorhus/ky?sponsor=1" - } - }, "node_modules/last-run": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/last-run/-/last-run-1.1.1.tgz", @@ -9400,13 +8303,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", @@ -9431,13 +8327,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, - "peer": true - }, "node_modules/lodash.isplainobject": { "version": "4.0.6", "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", @@ -9467,13 +8356,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", @@ -9933,16 +8815,6 @@ "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", @@ -10186,13 +9058,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", @@ -10603,22 +9468,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", @@ -10661,30 +9510,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", @@ -11346,75 +10171,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, - "peer": 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, - "peer": 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, - "peer": 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, - "peer": 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, - "peer": 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", @@ -11616,13 +10372,6 @@ "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.9.0", "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", @@ -12012,19 +10761,6 @@ "node": ">= 0.10" } }, - "node_modules/recursive-readdir": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.3.tgz", - "integrity": "sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA==", - "dev": true, - "peer": true, - "dependencies": { - "minimatch": "^3.0.5" - }, - "engines": { - "node": ">=6.0.0" - } - }, "node_modules/redent": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", @@ -12406,20 +11142,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", @@ -12460,16 +11182,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", @@ -12724,13 +11436,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", @@ -13428,16 +12133,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", @@ -13866,13 +12561,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" @@ -14349,16 +13043,6 @@ "node": ">=14" } }, - "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" - } - }, "node_modules/webdriver": { "version": "8.0.2", "resolved": "https://registry.npmjs.org/webdriver/-/webdriver-8.0.2.tgz", @@ -14405,87 +13089,12 @@ "node": ">=14.16" } }, - "node_modules/webdriver/node_modules/@types/node": { - "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/webdriver/node_modules/@wdio/config": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@wdio/config/-/config-8.0.2.tgz", - "integrity": "sha512-sLrNT6BXlWpfZS0FODxl628bCKtqHqD3TU31+6av3TnNfa142hQrbGf0u5birtU8c3Qacch4ycA3pmQ1xePGRA==", - "dev": true, - "dependencies": { - "@wdio/logger": "8.0.0", - "@wdio/types": "8.0.0", - "@wdio/utils": "8.0.2", - "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": "^16.13 || >=18" - } - }, - "node_modules/webdriver/node_modules/@wdio/logger": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@wdio/logger/-/logger-8.0.0.tgz", - "integrity": "sha512-QEBPZoFQhWqqIYmhp8Wa+HhvMrH2Yy0xbD3MPOibkFwp9Tn8Si7oDxbnWqzcPiukLWcb4E/QlgE5f3IM5BrAPQ==", - "dev": true, - "dependencies": { - "chalk": "^5.1.2", - "loglevel": "^1.6.0", - "loglevel-plugin-prefix": "^0.8.4", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": "^16.13 || >=18" - } - }, "node_modules/webdriver/node_modules/@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 }, - "node_modules/webdriver/node_modules/@wdio/types": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@wdio/types/-/types-8.0.0.tgz", - "integrity": "sha512-6Qt4NmCJrxtbZLxCJBSW68Q4olvHGLoy5mOBaZhPC5FUEmxwhMAtq5e3zrAIpnHEMwl3RUDnMnSO9dApI7a7IQ==", - "dev": true, - "dependencies": { - "@types/node": "^18.0.0" - }, - "engines": { - "node": "^16.13 || >=18" - } - }, - "node_modules/webdriver/node_modules/@wdio/utils": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@wdio/utils/-/utils-8.0.2.tgz", - "integrity": "sha512-3AAShhA1uZV58E/eXRsyA0sHfwlAlmXKH5U202SYwFcYHV/c0zPu56p/ndohsyMmh+0UxgFpHEbTKiI4dhhf3A==", - "dev": true, - "dependencies": { - "@wdio/logger": "8.0.0", - "@wdio/types": "8.0.0", - "p-iteration": "^1.1.8" - }, - "engines": { - "node": "^16.13 || >=18" - } - }, - "node_modules/webdriver/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "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", @@ -14513,46 +13122,6 @@ "node": ">=14.16" } }, - "node_modules/webdriver/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/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", @@ -14565,25 +13134,6 @@ "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", - "integrity": "sha512-ull455NHSHI/Y1FqGaaYFaLGkNMMJbavMrEGFXG/PGrg6y7sutWHUHrz6gy6WEBH6akM1M414dWKCNs+IhKdiQ==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^5.0.1", - "once": "^1.3.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/webdriver/node_modules/got": { "version": "12.5.3", "resolved": "https://registry.npmjs.org/got/-/got-12.5.3.tgz", @@ -14634,21 +13184,6 @@ "url": "https://github.com/sindresorhus/ky?sponsor=1" } }, - "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", @@ -14673,18 +13208,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/webdriver/node_modules/minimatch": { - "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" - }, - "engines": { - "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", @@ -14706,80 +13229,6 @@ "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", @@ -14795,30 +13244,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/webdriver/node_modules/type-fest": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", - "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", - "dev": true, - "engines": { - "node": ">=12.20" - }, - "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": "8.0.5", "resolved": "https://registry.npmjs.org/webdriverio/-/webdriverio-8.0.5.tgz", @@ -14857,78 +13282,12 @@ "node": "^16.13 || >=18" } }, - "node_modules/webdriverio/node_modules/@types/node": { - "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/webdriverio/node_modules/@wdio/config": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@wdio/config/-/config-8.0.2.tgz", - "integrity": "sha512-sLrNT6BXlWpfZS0FODxl628bCKtqHqD3TU31+6av3TnNfa142hQrbGf0u5birtU8c3Qacch4ycA3pmQ1xePGRA==", - "dev": true, - "dependencies": { - "@wdio/logger": "8.0.0", - "@wdio/types": "8.0.0", - "@wdio/utils": "8.0.2", - "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": "^16.13 || >=18" - } - }, - "node_modules/webdriverio/node_modules/@wdio/logger": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@wdio/logger/-/logger-8.0.0.tgz", - "integrity": "sha512-QEBPZoFQhWqqIYmhp8Wa+HhvMrH2Yy0xbD3MPOibkFwp9Tn8Si7oDxbnWqzcPiukLWcb4E/QlgE5f3IM5BrAPQ==", - "dev": true, - "dependencies": { - "chalk": "^5.1.2", - "loglevel": "^1.6.0", - "loglevel-plugin-prefix": "^0.8.4", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": "^16.13 || >=18" - } - }, "node_modules/webdriverio/node_modules/@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 }, - "node_modules/webdriverio/node_modules/@wdio/types": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@wdio/types/-/types-8.0.0.tgz", - "integrity": "sha512-6Qt4NmCJrxtbZLxCJBSW68Q4olvHGLoy5mOBaZhPC5FUEmxwhMAtq5e3zrAIpnHEMwl3RUDnMnSO9dApI7a7IQ==", - "dev": true, - "dependencies": { - "@types/node": "^18.0.0" - }, - "engines": { - "node": "^16.13 || >=18" - } - }, - "node_modules/webdriverio/node_modules/@wdio/utils": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@wdio/utils/-/utils-8.0.2.tgz", - "integrity": "sha512-3AAShhA1uZV58E/eXRsyA0sHfwlAlmXKH5U202SYwFcYHV/c0zPu56p/ndohsyMmh+0UxgFpHEbTKiI4dhhf3A==", - "dev": true, - "dependencies": { - "@wdio/logger": "8.0.0", - "@wdio/types": "8.0.0", - "p-iteration": "^1.1.8" - }, - "engines": { - "node": "^16.13 || >=18" - } - }, "node_modules/webdriverio/node_modules/brace-expansion": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", @@ -14938,65 +13297,6 @@ "balanced-match": "^1.0.0" } }, - "node_modules/webdriverio/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/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", - "integrity": "sha512-ull455NHSHI/Y1FqGaaYFaLGkNMMJbavMrEGFXG/PGrg6y7sutWHUHrz6gy6WEBH6akM1M414dWKCNs+IhKdiQ==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^5.0.1", - "once": "^1.3.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "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", @@ -15009,21 +13309,6 @@ "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.1", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.1.tgz", @@ -15036,104 +13321,6 @@ "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/type-fest": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", - "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", - "dev": true, - "engines": { - "node": ">=12.20" - }, - "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": "7.0.0", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", @@ -15397,127 +13584,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", @@ -16318,44 +14384,18 @@ "@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==", - "dev": true, - "peer": true, - "requires": { - "@types/through": "*" - } - }, "@types/istanbul-lib-coverage": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", @@ -16398,43 +14438,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", @@ -16442,9 +14445,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": { @@ -16453,16 +14456,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", @@ -16494,16 +14487,6 @@ "dev": true, "optional": true }, - "@types/through": { - "version": "0.0.30", - "resolved": "https://registry.npmjs.org/@types/through/-/through-0.0.30.tgz", - "integrity": "sha512-FvnCJljyxhPM3gkRgWmxmDZyAQSiBQQWLI0A0VFL0K7W1oRUrPJSqNO0NvTnLkBcotdlp3lKvaT0JrnyRDkzOg==", - "dev": true, - "peer": true, - "requires": { - "@types/node": "*" - } - }, "@types/ua-parser-js": { "version": "0.7.36", "resolved": "https://registry.npmjs.org/@types/ua-parser-js/-/ua-parser-js-0.7.36.tgz", @@ -16779,345 +14762,22 @@ "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==", - "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" - } - }, - "@wdio/globals": { - "version": "8.0.5", - "resolved": "https://registry.npmjs.org/@wdio/globals/-/globals-8.0.5.tgz", - "integrity": "sha512-SUjC6WuZZPrLz/xV1SwfleyttdcItbocVvGhnJ/lCtlgVxnXcJIF6Qz0D1Mc7C49DiceU35XpVbfv395SJei3Q==", + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@wdio/config/-/config-8.0.2.tgz", + "integrity": "sha512-sLrNT6BXlWpfZS0FODxl628bCKtqHqD3TU31+6av3TnNfa142hQrbGf0u5birtU8c3Qacch4ycA3pmQ1xePGRA==", "dev": true, "requires": { - "expect-webdriverio": "^4.0.1", - "webdriverio": "8.0.5" - } - }, - "@wdio/logger": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@wdio/logger/-/logger-7.16.0.tgz", - "integrity": "sha512-/6lOGb2Iow5eSsy7RJOl1kCwsP4eMlG+/QKro5zUJsuyNJSQXf2ejhpkzyKWLgQbHu83WX6cM1014AZuLkzoQg==", - "dev": true, - "peer": 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.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": "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.26.0", - "resolved": "https://registry.npmjs.org/@wdio/selenium-standalone-service/-/selenium-standalone-service-7.26.0.tgz", - "integrity": "sha512-bP79aBzRBvgNCaJihLaQT/Qxa604o8UsAv9Ce2tARlVb4jFjpGH0w/xkuxUTqSpeQy/Sj+3hLExhNh1YgLe/Bg==", - "dev": true, - "requires": { - "@types/fs-extra": "^9.0.1", - "@types/node": "^18.0.0", - "@types/selenium-standalone": "^7.0.0", - "@wdio/config": "7.26.0", - "@wdio/logger": "7.26.0", - "@wdio/types": "7.26.0", - "fs-extra": "^10.0.0", - "selenium-standalone": "^8.0.3" + "@wdio/logger": "8.0.0", + "@wdio/types": "8.0.0", + "@wdio/utils": "8.0.2", + "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" }, "dependencies": { - "@types/node": { - "version": "18.11.9", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.9.tgz", - "integrity": "sha512-CRpX21/kGdzjOpFsZSkcrXMGIBWMGNIHXXBVFSH+ggkftxg+XYP20TESbh+zFvFj3EQOl5byk0HTRn1IL6hbqg==", - "dev": true - }, - "@wdio/config": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@wdio/config/-/config-7.26.0.tgz", - "integrity": "sha512-GO6kFGgFrx2Hiq+Ww6V9I7cZfShPjfPVhPy3uXnKN2B4FilX8ilLAp5cIFuMuHPeOQq0crYX9cnLYXka6dCGgg==", - "dev": true, - "requires": { - "@wdio/logger": "7.26.0", - "@wdio/types": "7.26.0", - "@wdio/utils": "7.26.0", - "deepmerge": "^4.0.0", - "glob": "^8.0.3" - } - }, - "@wdio/logger": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@wdio/logger/-/logger-7.26.0.tgz", - "integrity": "sha512-kQj9s5JudAG9qB+zAAcYGPHVfATl2oqKgqj47yjehOQ1zzG33xmtL1ArFbQKWhDG32y1A8sN6b0pIqBEIwgg8Q==", - "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.26.0", - "resolved": "https://registry.npmjs.org/@wdio/types/-/types-7.26.0.tgz", - "integrity": "sha512-mOTfWAGQ+iT58iaZhJMwlUkdEn3XEWE4jthysMLXFnSuZ2eaODVAiK31SmlS/eUqgSIaupeGqYUrtCuSNbLefg==", - "dev": true, - "requires": { - "@types/node": "^18.0.0", - "got": "^11.8.1" - } - }, - "@wdio/utils": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@wdio/utils/-/utils-7.26.0.tgz", - "integrity": "sha512-pVq2MPXZAYLkKGKIIHktHejnHqg4TYKoNYSi2EDv+I3GlT8VZKXHazKhci82ov0tD+GdF27+s4DWNDCfGYfBdQ==", - "dev": true, - "requires": { - "@wdio/logger": "7.26.0", - "@wdio/types": "7.26.0", - "p-iteration": "^1.1.8" - } - }, "brace-expansion": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", @@ -17127,6 +14787,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", @@ -17140,37 +14816,145 @@ "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==", + "@wdio/globals": { + "version": "8.0.5", + "resolved": "https://registry.npmjs.org/@wdio/globals/-/globals-8.0.5.tgz", + "integrity": "sha512-SUjC6WuZZPrLz/xV1SwfleyttdcItbocVvGhnJ/lCtlgVxnXcJIF6Qz0D1Mc7C49DiceU35XpVbfv395SJei3Q==", "dev": true, - "peer": true, "requires": { - "@types/node": "^16.11.1", - "got": "^11.8.1" + "expect-webdriverio": "^4.0.1", + "webdriverio": "8.0.5" + } + }, + "@wdio/logger": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@wdio/logger/-/logger-8.0.0.tgz", + "integrity": "sha512-QEBPZoFQhWqqIYmhp8Wa+HhvMrH2Yy0xbD3MPOibkFwp9Tn8Si7oDxbnWqzcPiukLWcb4E/QlgE5f3IM5BrAPQ==", + "dev": true, + "requires": { + "chalk": "^5.1.2", + "loglevel": "^1.6.0", + "loglevel-plugin-prefix": "^0.8.4", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "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/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": "8.0.2", + "resolved": "https://registry.npmjs.org/@wdio/selenium-standalone-service/-/selenium-standalone-service-8.0.2.tgz", + "integrity": "sha512-C0JT4cG+HAj9Ubnpu/NC8MSr5i6p3/4aSUoeCfXQ2sR8ltDOUj1xt4SNTgMERM+guj0Rp5LUvpV/U5iy+jfgPQ==", + "dev": true, + "requires": { + "@types/selenium-standalone": "^7.0.0", + "@wdio/config": "8.0.2", + "@wdio/logger": "8.0.0", + "@wdio/types": "8.0.0", + "selenium-standalone": "^8.2.1" + } + }, + "@wdio/types": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@wdio/types/-/types-8.0.0.tgz", + "integrity": "sha512-6Qt4NmCJrxtbZLxCJBSW68Q4olvHGLoy5mOBaZhPC5FUEmxwhMAtq5e3zrAIpnHEMwl3RUDnMnSO9dApI7a7IQ==", + "dev": true, + "requires": { + "@types/node": "^18.0.0" } }, "@wdio/utils": { - "version": "7.16.3", - "resolved": "https://registry.npmjs.org/@wdio/utils/-/utils-7.16.3.tgz", - "integrity": "sha512-/662h5Z7B5TejHN6GiW96PAKuTPi/xcAGmtjA9ozRBI2/0eHSccDfNEaBgTTjLqqEgGAXylHcOuxHOrKx2ddJw==", + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@wdio/utils/-/utils-8.0.2.tgz", + "integrity": "sha512-3AAShhA1uZV58E/eXRsyA0sHfwlAlmXKH5U202SYwFcYHV/c0zPu56p/ndohsyMmh+0UxgFpHEbTKiI4dhhf3A==", "dev": true, - "peer": true, "requires": { - "@wdio/logger": "7.16.0", - "@wdio/types": "7.16.3", + "@wdio/logger": "8.0.0", + "@wdio/types": "8.0.0", "p-iteration": "^1.1.8" } }, @@ -17246,16 +15030,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", @@ -17564,13 +15338,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", @@ -18118,172 +15885,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", @@ -18395,13 +15996,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", @@ -18547,30 +16141,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", @@ -19124,12 +16694,6 @@ "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==" }, - "deepmerge": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", - "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", - "dev": true - }, "deepmerge-ts": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/deepmerge-ts/-/deepmerge-ts-4.2.2.tgz", @@ -19151,25 +16715,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", @@ -19234,181 +16779,12 @@ "which": "^3.0.0" }, "dependencies": { - "@types/node": { - "version": "18.11.10", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.10.tgz", - "integrity": "sha512-juG3RWMBOqcOuXC643OAdSA525V44cVgGV6dUDuiFtss+8Fk5x1hI93Rsld43VeJVIeqlP9I7Fn9/qaVqoEAuQ==", - "dev": true - }, - "@wdio/config": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@wdio/config/-/config-8.0.2.tgz", - "integrity": "sha512-sLrNT6BXlWpfZS0FODxl628bCKtqHqD3TU31+6av3TnNfa142hQrbGf0u5birtU8c3Qacch4ycA3pmQ1xePGRA==", - "dev": true, - "requires": { - "@wdio/logger": "8.0.0", - "@wdio/types": "8.0.0", - "@wdio/utils": "8.0.2", - "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": "8.0.0", - "resolved": "https://registry.npmjs.org/@wdio/logger/-/logger-8.0.0.tgz", - "integrity": "sha512-QEBPZoFQhWqqIYmhp8Wa+HhvMrH2Yy0xbD3MPOibkFwp9Tn8Si7oDxbnWqzcPiukLWcb4E/QlgE5f3IM5BrAPQ==", - "dev": true, - "requires": { - "chalk": "^5.1.2", - "loglevel": "^1.6.0", - "loglevel-plugin-prefix": "^0.8.4", - "strip-ansi": "^6.0.0" - } - }, "@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/types": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@wdio/types/-/types-8.0.0.tgz", - "integrity": "sha512-6Qt4NmCJrxtbZLxCJBSW68Q4olvHGLoy5mOBaZhPC5FUEmxwhMAtq5e3zrAIpnHEMwl3RUDnMnSO9dApI7a7IQ==", - "dev": true, - "requires": { - "@types/node": "^18.0.0" - } - }, - "@wdio/utils": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@wdio/utils/-/utils-8.0.2.tgz", - "integrity": "sha512-3AAShhA1uZV58E/eXRsyA0sHfwlAlmXKH5U202SYwFcYHV/c0zPu56p/ndohsyMmh+0UxgFpHEbTKiI4dhhf3A==", - "dev": true, - "requires": { - "@wdio/logger": "8.0.0", - "@wdio/types": "8.0.0", - "p-iteration": "^1.1.8" - } - }, - "brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0" - } - }, - "chalk": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.1.2.tgz", - "integrity": "sha512-E5CkT4jWURs1Vy5qGJye+XwCkNj7Od3Af7CP6SujMetSMkLs8Do2RWJK5yx1wamHV/op8Rz+9rltjaTQWDnEFQ==", - "dev": true - }, - "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", - "integrity": "sha512-ull455NHSHI/Y1FqGaaYFaLGkNMMJbavMrEGFXG/PGrg6y7sutWHUHrz6gy6WEBH6akM1M414dWKCNs+IhKdiQ==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^5.0.1", - "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.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" - } - }, - "type-fest": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", - "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", - "dev": true - }, "uuid": { "version": "9.0.0", "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz", @@ -19423,12 +16799,6 @@ "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 } } }, @@ -19580,16 +16950,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", @@ -20136,18 +17496,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", @@ -20287,25 +17635,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", @@ -20322,16 +17651,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", @@ -20599,13 +17918,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", @@ -22017,29 +19329,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", @@ -22208,13 +19497,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", @@ -22375,91 +19657,6 @@ "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==", - "dev": true, - "peer": true, - "requires": { - "async": "0.9.x", - "chalk": "^2.4.2", - "filelist": "^1.0.1", - "minimatch": "^3.0.4" - }, - "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==", - "dev": true, - "peer": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "async": { - "version": "0.9.2", - "resolved": "https://registry.npmjs.org/async/-/async-0.9.2.tgz", - "integrity": "sha512-l6ToIJIotphWahxxHyzK9bnLR6kM4jJIIgLShZeqLY7iboHoGkdgFl7W2/Ivi4SkMJYGKqW8vSuk0uKUj6qsSw==", - "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" - } - } - } - }, "jest-diff": { "version": "29.3.1", "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.3.1.tgz", @@ -22757,13 +19954,6 @@ "graceful-fs": "^4.1.11" } }, - "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 - }, "last-run": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/last-run/-/last-run-1.1.1.tgz", @@ -23003,13 +20193,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", @@ -23034,13 +20217,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, - "peer": true - }, "lodash.isplainobject": { "version": "4.0.6", "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", @@ -23070,13 +20246,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", @@ -23450,13 +20619,6 @@ "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", @@ -23648,13 +20810,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", @@ -23978,16 +21133,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", @@ -24018,24 +21163,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", @@ -24547,59 +21674,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, - "peer": 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, - "peer": 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, - "peer": 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, - "peer": 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, - "peer": 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", @@ -24757,13 +21831,6 @@ "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.9.0", "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", @@ -25069,16 +22136,6 @@ "resolve": "^1.1.6" } }, - "recursive-readdir": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.3.tgz", - "integrity": "sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA==", - "dev": true, - "peer": true, - "requires": { - "minimatch": "^3.0.5" - } - }, "redent": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", @@ -25389,17 +22446,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", @@ -25427,13 +22473,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", @@ -25631,13 +22670,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", @@ -26229,13 +23261,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", @@ -26593,11 +23618,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", @@ -26987,16 +24011,6 @@ "xml-name-validator": "^4.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" - } - }, "webdriver": { "version": "8.0.2", "resolved": "https://registry.npmjs.org/webdriver/-/webdriver-8.0.2.tgz", @@ -27031,75 +24045,12 @@ "defer-to-connect": "^2.0.1" } }, - "@types/node": { - "version": "18.11.10", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.10.tgz", - "integrity": "sha512-juG3RWMBOqcOuXC643OAdSA525V44cVgGV6dUDuiFtss+8Fk5x1hI93Rsld43VeJVIeqlP9I7Fn9/qaVqoEAuQ==", - "dev": true - }, - "@wdio/config": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@wdio/config/-/config-8.0.2.tgz", - "integrity": "sha512-sLrNT6BXlWpfZS0FODxl628bCKtqHqD3TU31+6av3TnNfa142hQrbGf0u5birtU8c3Qacch4ycA3pmQ1xePGRA==", - "dev": true, - "requires": { - "@wdio/logger": "8.0.0", - "@wdio/types": "8.0.0", - "@wdio/utils": "8.0.2", - "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": "8.0.0", - "resolved": "https://registry.npmjs.org/@wdio/logger/-/logger-8.0.0.tgz", - "integrity": "sha512-QEBPZoFQhWqqIYmhp8Wa+HhvMrH2Yy0xbD3MPOibkFwp9Tn8Si7oDxbnWqzcPiukLWcb4E/QlgE5f3IM5BrAPQ==", - "dev": true, - "requires": { - "chalk": "^5.1.2", - "loglevel": "^1.6.0", - "loglevel-plugin-prefix": "^0.8.4", - "strip-ansi": "^6.0.0" - } - }, "@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/types": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@wdio/types/-/types-8.0.0.tgz", - "integrity": "sha512-6Qt4NmCJrxtbZLxCJBSW68Q4olvHGLoy5mOBaZhPC5FUEmxwhMAtq5e3zrAIpnHEMwl3RUDnMnSO9dApI7a7IQ==", - "dev": true, - "requires": { - "@types/node": "^18.0.0" - } - }, - "@wdio/utils": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@wdio/utils/-/utils-8.0.2.tgz", - "integrity": "sha512-3AAShhA1uZV58E/eXRsyA0sHfwlAlmXKH5U202SYwFcYHV/c0zPu56p/ndohsyMmh+0UxgFpHEbTKiI4dhhf3A==", - "dev": true, - "requires": { - "@wdio/logger": "8.0.0", - "@wdio/types": "8.0.0", - "p-iteration": "^1.1.8" - } - }, - "brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0" - } - }, "cacheable-lookup": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-7.0.0.tgz", @@ -27121,47 +24072,12 @@ "responselike": "^3.0.0" } }, - "chalk": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.1.2.tgz", - "integrity": "sha512-E5CkT4jWURs1Vy5qGJye+XwCkNj7Od3Af7CP6SujMetSMkLs8Do2RWJK5yx1wamHV/op8Rz+9rltjaTQWDnEFQ==", - "dev": true - }, - "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", - "integrity": "sha512-ull455NHSHI/Y1FqGaaYFaLGkNMMJbavMrEGFXG/PGrg6y7sutWHUHrz6gy6WEBH6akM1M414dWKCNs+IhKdiQ==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^5.0.1", - "once": "^1.3.0" - } - }, "got": { "version": "12.5.3", "resolved": "https://registry.npmjs.org/got/-/got-12.5.3.tgz", @@ -27197,15 +24113,6 @@ "integrity": "sha512-eBJeF6IXNwX5rksdwBrE2rIJrU2d84GoTvdM7OmmTIwUVXEMd72wIwvT+nyhrqtv7AzbSNsWz7yRsHgVhj1uog==", "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" - } - }, "lowercase-keys": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-3.0.0.tgz", @@ -27218,15 +24125,6 @@ "integrity": "sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==", "dev": true }, - "minimatch": { - "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", @@ -27239,53 +24137,6 @@ "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", @@ -27294,18 +24145,6 @@ "requires": { "lowercase-keys": "^3.0.0" } - }, - "type-fest": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", - "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", - "dev": true - }, - "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 } } }, @@ -27344,66 +24183,12 @@ "webdriver": "8.0.2" }, "dependencies": { - "@types/node": { - "version": "18.11.10", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.10.tgz", - "integrity": "sha512-juG3RWMBOqcOuXC643OAdSA525V44cVgGV6dUDuiFtss+8Fk5x1hI93Rsld43VeJVIeqlP9I7Fn9/qaVqoEAuQ==", - "dev": true - }, - "@wdio/config": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@wdio/config/-/config-8.0.2.tgz", - "integrity": "sha512-sLrNT6BXlWpfZS0FODxl628bCKtqHqD3TU31+6av3TnNfa142hQrbGf0u5birtU8c3Qacch4ycA3pmQ1xePGRA==", - "dev": true, - "requires": { - "@wdio/logger": "8.0.0", - "@wdio/types": "8.0.0", - "@wdio/utils": "8.0.2", - "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": "8.0.0", - "resolved": "https://registry.npmjs.org/@wdio/logger/-/logger-8.0.0.tgz", - "integrity": "sha512-QEBPZoFQhWqqIYmhp8Wa+HhvMrH2Yy0xbD3MPOibkFwp9Tn8Si7oDxbnWqzcPiukLWcb4E/QlgE5f3IM5BrAPQ==", - "dev": true, - "requires": { - "chalk": "^5.1.2", - "loglevel": "^1.6.0", - "loglevel-plugin-prefix": "^0.8.4", - "strip-ansi": "^6.0.0" - } - }, "@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/types": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@wdio/types/-/types-8.0.0.tgz", - "integrity": "sha512-6Qt4NmCJrxtbZLxCJBSW68Q4olvHGLoy5mOBaZhPC5FUEmxwhMAtq5e3zrAIpnHEMwl3RUDnMnSO9dApI7a7IQ==", - "dev": true, - "requires": { - "@types/node": "^18.0.0" - } - }, - "@wdio/utils": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@wdio/utils/-/utils-8.0.2.tgz", - "integrity": "sha512-3AAShhA1uZV58E/eXRsyA0sHfwlAlmXKH5U202SYwFcYHV/c0zPu56p/ndohsyMmh+0UxgFpHEbTKiI4dhhf3A==", - "dev": true, - "requires": { - "@wdio/logger": "8.0.0", - "@wdio/types": "8.0.0", - "p-iteration": "^1.1.8" - } - }, "brace-expansion": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", @@ -27413,56 +24198,12 @@ "balanced-match": "^1.0.0" } }, - "chalk": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.1.2.tgz", - "integrity": "sha512-E5CkT4jWURs1Vy5qGJye+XwCkNj7Od3Af7CP6SujMetSMkLs8Do2RWJK5yx1wamHV/op8Rz+9rltjaTQWDnEFQ==", - "dev": true - }, - "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", - "integrity": "sha512-ull455NHSHI/Y1FqGaaYFaLGkNMMJbavMrEGFXG/PGrg6y7sutWHUHrz6gy6WEBH6akM1M414dWKCNs+IhKdiQ==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^5.0.1", - "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.1", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.1.tgz", @@ -27471,65 +24212,6 @@ "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" - } - }, - "type-fest": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", - "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", - "dev": true - }, - "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 } } }, @@ -27719,104 +24401,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 a4266cf98..bdb12f251 100644 --- a/package.json +++ b/package.json @@ -76,7 +76,7 @@ "@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", From bcdbaa315c597391fae306ffa805ad046aa652cd Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 5 Dec 2022 08:17:53 -0800 Subject: [PATCH 50/73] chore(deps): bump selenium-standalone from 8.2.3 to 8.2.4 (#6683) Bumps [selenium-standalone](https://github.com/webdriverio/selenium-standalone) from 8.2.3 to 8.2.4. - [Release notes](https://github.com/webdriverio/selenium-standalone/releases) - [Changelog](https://github.com/webdriverio/selenium-standalone/blob/main/HISTORY.md) - [Commits](https://github.com/webdriverio/selenium-standalone/compare/v8.2.3...v8.2.4) --- updated-dependencies: - dependency-name: selenium-standalone dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index 5858a8480..b341d144d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11258,9 +11258,9 @@ "dev": true }, "node_modules/selenium-standalone": { - "version": "8.2.3", - "resolved": "https://registry.npmjs.org/selenium-standalone/-/selenium-standalone-8.2.3.tgz", - "integrity": "sha512-WNiVh6uNwgXjM04NzsDgm5hWJGSmAI7fU5vCMWmb9AslQaoFDhvFgLE8wfp+nhdizqCW1bDTCZl3BnNHdaZG8g==", + "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", @@ -22534,9 +22534,9 @@ "dev": true }, "selenium-standalone": { - "version": "8.2.3", - "resolved": "https://registry.npmjs.org/selenium-standalone/-/selenium-standalone-8.2.3.tgz", - "integrity": "sha512-WNiVh6uNwgXjM04NzsDgm5hWJGSmAI7fU5vCMWmb9AslQaoFDhvFgLE8wfp+nhdizqCW1bDTCZl3BnNHdaZG8g==", + "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", From 9741cd25306d084c69a768a395bdaa3f782241db Mon Sep 17 00:00:00 2001 From: Beka Westberg Date: Mon, 5 Dec 2022 10:30:28 -0800 Subject: [PATCH 51/73] chore: add simple round tripping tests (#6668) --- .../event_procedure_change_return_test.js | 20 ++++++++++++++--- tests/mocha/event_procedure_create_test.js | 13 +++++++++++ tests/mocha/event_procedure_delete_test.js | 16 ++++++++++++-- tests/mocha/event_procedure_enable_test.js | 16 ++++++++++++-- .../event_procedure_parameter_create_test.js | 22 +++++++++++++++++-- .../event_procedure_parameter_delete_test.js | 18 +++++++++++++++ .../event_procedure_parameter_rename_test.js | 18 +++++++++++++++ tests/mocha/event_procedure_rename_test.js | 20 ++++++++++++++--- 8 files changed, 131 insertions(+), 12 deletions(-) diff --git a/tests/mocha/event_procedure_change_return_test.js b/tests/mocha/event_procedure_change_return_test.js index 0e11458d6..63b265cb1 100644 --- a/tests/mocha/event_procedure_change_return_test.js +++ b/tests/mocha/event_procedure_change_return_test.js @@ -11,6 +11,9 @@ import {sharedTestSetup, sharedTestTeardown} from './test_helpers/setup_teardown suite('Procedure Change Return Event', function() { + const DEFAULT_TYPES = null; + const NON_DEFAULT_TYPES = []; + setup(function() { sharedTestSetup.call(this); this.workspace = new Blockly.Workspace(); @@ -23,9 +26,6 @@ suite('Procedure Change Return Event', function() { }); suite('running', function() { - const DEFAULT_TYPES = null; - const NON_DEFAULT_TYPES = []; - setup(function() { this.createProcedureModel = (id) => { return new Blockly.procedures.ObservableProcedureModel( @@ -180,4 +180,18 @@ suite('Procedure Change Return Event', function() { }); }); }); + + suite.skip('serialization', function() { + test('events round-trip through JSON', function() { + const model = new Blockly.procedures.ObservableProcedureModel( + this.workspace, 'test name', 'test id'); + const origEvent = new Blockly.Events.ProcedureChangeReturn( + this.workspace, model, NON_DEFAULT_TYPES); + + const json = origEvent.toJson(); + const newEvent = new Blockly.Events.fromJson(json, this.workspace); + + chai.assert.deepEqual(newEvent, origEvent); + }); + }); }); diff --git a/tests/mocha/event_procedure_create_test.js b/tests/mocha/event_procedure_create_test.js index 1455d3afe..d74b56463 100644 --- a/tests/mocha/event_procedure_create_test.js +++ b/tests/mocha/event_procedure_create_test.js @@ -145,4 +145,17 @@ suite('Procedure Create Event', function() { }); }); }); + + suite.skip('serialization', function() { + test('events round-trip through JSON', function() { + const model = new Blockly.procedures.ObservableProcedureModel( + this.workspace, 'test name', 'test id'); + const origEvent = new Blockly.Events.ProcedureCreate(this.workspace, model); + + const json = origEvent.toJson(); + const newEvent = new Blockly.Events.fromJson(json, this.workspace); + + chai.assert.deepEqual(newEvent, origEvent); + }); + }); }); diff --git a/tests/mocha/event_procedure_delete_test.js b/tests/mocha/event_procedure_delete_test.js index 20f41a191..4db5d8ab6 100644 --- a/tests/mocha/event_procedure_delete_test.js +++ b/tests/mocha/event_procedure_delete_test.js @@ -30,8 +30,7 @@ suite('Procedure Delete Event', function() { }; this.createEventToState = (procedureModel) => { - return new Blockly.Events.ProcedureDelete( - this.workspace, procedureModel); + return new Blockly.Events.ProcedureDelete(this.workspace, procedureModel); }; }); @@ -146,4 +145,17 @@ suite('Procedure Delete Event', function() { }); }); }); + + suite.skip('serialization', function() { + test('events round-trip through JSON', function() { + const model = new Blockly.procedures.ObservableProcedureModel( + this.workspace, 'test name', 'test id'); + const origEvent = new Blockly.Events.ProcedureDelete(this.workspace, model); + + const json = origEvent.toJson(); + const newEvent = new Blockly.Events.fromJson(json, this.workspace); + + chai.assert.deepEqual(newEvent, origEvent); + }); + }); }); diff --git a/tests/mocha/event_procedure_enable_test.js b/tests/mocha/event_procedure_enable_test.js index 9617d4c7d..7f753fc1a 100644 --- a/tests/mocha/event_procedure_enable_test.js +++ b/tests/mocha/event_procedure_enable_test.js @@ -30,8 +30,7 @@ suite('Procedure Enable Event', function() { }; this.createEventToState = (procedureModel) => { - return new Blockly.Events.ProcedureEnable( - this.workspace, procedureModel); + return new Blockly.Events.ProcedureEnable(this.workspace, procedureModel); }; }); @@ -172,4 +171,17 @@ suite('Procedure Enable Event', function() { }); }); }); + + suite.skip('serialization', function() { + test('events round-trip through JSON', function() { + const model = new Blockly.procedures.ObservableProcedureModel( + this.workspace, 'test name', 'test id'); + const origEvent = new Blockly.Events.ProcedureEnable(this.workspace, model); + + const json = origEvent.toJson(); + const newEvent = new Blockly.Events.fromJson(json, this.workspace); + + chai.assert.deepEqual(newEvent, origEvent); + }); + }); }); diff --git a/tests/mocha/event_procedure_parameter_create_test.js b/tests/mocha/event_procedure_parameter_create_test.js index 88c214d24..4cfeb34ea 100644 --- a/tests/mocha/event_procedure_parameter_create_test.js +++ b/tests/mocha/event_procedure_parameter_create_test.js @@ -32,9 +32,9 @@ suite('Procedure Parameter Create Event', function() { this.createProcedureAndParameter = (procName, procId, paramName, paramId) => { const param = new Blockly.procedures.ObservableParameterModel( - this.workspace, procName, paramId); + this.workspace, paramName, paramId); const proc = new Blockly.procedures.ObservableProcedureModel( - this.workspace, paramName, procId) + this.workspace, procName, procId) .insertParameter(param, 0); return {param, proc}; }; @@ -196,4 +196,22 @@ suite('Procedure Parameter Create Event', function() { }); }); }); + + suite.skip('serialization', function() { + test('events round-trip through JSON', function() { + const param = new Blockly.procedures.ObservableParameterModel( + this.workspace, 'test param name', 'test param id'); + const model = + new Blockly.procedures.ObservableProcedureModel( + this.workspace, 'test name', 'test id') + .insertParameter(param, 0); + const origEvent = new Blockly.Events.ProcedureParameterCreate( + this.workspace, model); + + const json = origEvent.toJson(); + const newEvent = new Blockly.Events.fromJson(json, this.workspace); + + chai.assert.deepEqual(newEvent, origEvent); + }); + }); }); diff --git a/tests/mocha/event_procedure_parameter_delete_test.js b/tests/mocha/event_procedure_parameter_delete_test.js index 16cebd904..3de6226e1 100644 --- a/tests/mocha/event_procedure_parameter_delete_test.js +++ b/tests/mocha/event_procedure_parameter_delete_test.js @@ -196,4 +196,22 @@ suite('Procedure Parameter Delete Event', function() { }); }); }); + + suite.skip('serialization', function() { + test('events round-trip through JSON', function() { + const param = new Blockly.procedures.ObservableParameterModel( + this.workspace, 'test param name', 'test param id'); + const model = + new Blockly.procedures.ObservableProcedureModel( + this.workspace, 'test name', 'test id') + .insertParameter(param, 0); + const origEvent = new Blockly.Events.ProcedureParameterDelete( + this.workspace, model); + + const json = origEvent.toJson(); + const newEvent = new Blockly.Events.fromJson(json, this.workspace); + + chai.assert.deepEqual(newEvent, origEvent); + }); + }); }); diff --git a/tests/mocha/event_procedure_parameter_rename_test.js b/tests/mocha/event_procedure_parameter_rename_test.js index 7a7de0457..39f75662d 100644 --- a/tests/mocha/event_procedure_parameter_rename_test.js +++ b/tests/mocha/event_procedure_parameter_rename_test.js @@ -203,4 +203,22 @@ suite('Procedure Parameter Rename Event', function() { }); }); }); + + suite.skip('serialization', function() { + test('events round-trip through JSON', function() { + const param = new Blockly.procedures.ObservableParameterModel( + this.workspace, 'test param name', 'test param id'); + const model = + new Blockly.procedures.ObservableProcedureModel( + this.workspace, 'test name', 'test id') + .insertParameter(param, 0); + const origEvent = new Blockly.Events.ProcedureParameterDelete( + this.workspace, model); + + const json = origEvent.toJson(); + const newEvent = new Blockly.Events.fromJson(json, this.workspace); + + chai.assert.deepEqual(newEvent, origEvent); + }); + }); }); diff --git a/tests/mocha/event_procedure_rename_test.js b/tests/mocha/event_procedure_rename_test.js index 162e216eb..1ae69f529 100644 --- a/tests/mocha/event_procedure_rename_test.js +++ b/tests/mocha/event_procedure_rename_test.js @@ -11,6 +11,9 @@ import {sharedTestSetup, sharedTestTeardown} from './test_helpers/setup_teardown suite('Procedure Rename Event', function() { + const DEFAULT_NAME = 'default'; + const NON_DEFAULT_NAME = 'non-default'; + setup(function() { sharedTestSetup.call(this); this.workspace = new Blockly.Workspace(); @@ -23,9 +26,6 @@ suite('Procedure Rename Event', function() { }); suite('running', function() { - const DEFAULT_NAME = 'default'; - const NON_DEFAULT_NAME = 'non-default'; - setup(function() { this.createProcedureModel = (id) => { return new Blockly.procedures.ObservableProcedureModel( @@ -168,4 +168,18 @@ suite('Procedure Rename Event', function() { }); }); }); + + suite.skip('serialization', function() { + test('events round-trip through JSON', function() { + const model = new Blockly.procedures.ObservableProcedureModel( + this.workspace, 'test name', 'test id'); + const origEvent = new Blockly.Events.ProcedureRename( + this.workspace, model, NON_DEFAULT_NAME); + + const json = origEvent.toJson(); + const newEvent = new Blockly.Events.fromJson(json, this.workspace); + + chai.assert.deepEqual(newEvent, origEvent); + }); + }); }); From 90cb965e7c53650d630d65f96d201b4ffaeec88d Mon Sep 17 00:00:00 2001 From: Aaron Dodson Date: Mon, 5 Dec 2022 11:27:52 -0800 Subject: [PATCH 52/73] refactor: Migrate to PointerEvents (#6598) * refactor: Remove checks for PointerEvent support. * refactor: Deprecate and remove calls to splitEventByTouches. * refactor: Deprecate and remove calls to setClientFromTouch(). * refactor: Use PointerEvent in place of Event/MouseEvent/TouchEvent/PseudoEvent. * refactor: Update references to mouse/touch events in code and documentation to reference pointer events. * refactor: Merge Gesture and TouchGesture * chore: clang-format changed files * refactor: Bind and expect PointerEvents instead of MouseEvents. * refactor: Rename TouchGesture to Gesture. * fix: Fix test failures. * chore: clang-format changed files. * fix: Fix errant _ from merging * refactor: Clean up dead code in browser_events.ts. * chore: Update version in deprecation notices to reflect release schedule * fix: Fixed a bug that caused the browser context menu to not be suppressed in Chrome. * fix: Re-export Gesture as TouchGesture for backwards compatibility. * refactor: Deprecate and remove uses of opt_noPreventDefault. * chore: Fix error message in gesture.ts. * chore: Removed obsolete todo. --- core/block_dragger.ts | 6 +- core/block_svg.ts | 9 +- core/blockly.ts | 12 +- core/browser_events.ts | 75 +---- core/bubble.ts | 32 +-- core/bubble_dragger.ts | 6 +- core/comment.ts | 7 +- core/field.ts | 8 +- core/field_angle.ts | 14 +- core/field_colour.ts | 12 +- core/flyout_base.ts | 28 +- core/flyout_button.ts | 7 +- core/gesture.ts | 447 +++++++++++++++++++++--------- core/icon.ts | 4 +- core/inject.ts | 2 +- core/menu.ts | 26 +- core/mutator.ts | 2 +- core/scrollbar.ts | 12 +- core/toolbox/toolbox.ts | 8 +- core/tooltip.ts | 12 +- core/touch.ts | 127 +++------ core/touch_gesture.ts | 312 --------------------- core/trashcan.ts | 10 +- core/workspace_comment_svg.ts | 65 ++--- core/workspace_svg.ts | 38 ++- core/zoom_controls.ts | 10 +- scripts/migration/renamings.json5 | 4 + tests/mocha/toolbox_test.js | 2 +- tests/mocha/tooltip_test.js | 8 +- tests/mocha/touch_test.js | 46 ++- 30 files changed, 545 insertions(+), 806 deletions(-) delete mode 100644 core/touch_gesture.ts diff --git a/core/block_dragger.ts b/core/block_dragger.ts index 0469a325a..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); @@ -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 42c75ee79..0537827a9 100644 --- a/core/blockly.ts +++ b/core/blockly.ts @@ -145,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'; @@ -485,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 @@ -496,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. @@ -671,6 +667,7 @@ 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}; @@ -723,7 +720,6 @@ export {Toolbox}; export {ToolboxCategory}; export {ToolboxItem}; export {ToolboxSeparator}; -export {TouchGesture}; export {Trashcan}; export {VariableMap}; export {VariableModel}; 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/field.ts b/core/field.ts index 815ee6f9e..ce34c8a87 100644 --- a/core/field.ts +++ b/core/field.ts @@ -361,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_); } /** @@ -1076,11 +1076,11 @@ 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; } diff --git a/core/field_angle.ts b/core/field_angle.ts index b44d3e327..448147c65 100644 --- a/core/field_angle.ts +++ b/core/field_angle.ts @@ -278,9 +278,9 @@ export class FieldAngle extends FieldInput { // 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; } @@ -313,15 +313,11 @@ export class FieldAngle extends FieldInput { * * @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. diff --git a/core/field_colour.ts b/core/field_colour.ts index 3d7273b8b..729ebe54f 100644 --- a/core/field_colour.ts +++ b/core/field_colour.ts @@ -306,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) { @@ -415,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_) { @@ -534,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_); diff --git a/core/flyout_base.ts b/core/flyout_base.ts index 89123a083..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. @@ -614,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) { @@ -911,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); @@ -941,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); @@ -1026,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..c9578f45e 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 */ @@ -38,10 +38,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 +55,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 +103,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 +140,46 @@ 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; /** * @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 +215,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 +238,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 +265,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 +302,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 +323,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 +351,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 +375,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 +433,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(); @@ -443,106 +480,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 +757,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 +780,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 +808,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 +825,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 +842,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, ' + @@ -734,9 +917,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 +943,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 +1032,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 +1051,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 +1065,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 +1078,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 +1104,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..8cf0d6872 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; 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/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/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/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..938dcf815 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_; } @@ -513,7 +513,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/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 fb6a006d0..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. @@ -1594,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; } } @@ -1612,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); @@ -1626,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()); @@ -1642,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. @@ -2471,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) { @@ -2495,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/scripts/migration/renamings.json5 b/scripts/migration/renamings.json5 index f5d0e858e..2c33d67ef 100644 --- a/scripts/migration/renamings.json5 +++ b/scripts/migration/renamings.json5 @@ -1424,5 +1424,9 @@ 'develop': [ // New renamings go here! + { + oldName: 'Blockly.TouchGesture', + newName: 'Blockly.Gesture', + }, ] } 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); From 0ea319c4c351447047b133cf4587963b8790170a Mon Sep 17 00:00:00 2001 From: Beka Westberg Date: Mon, 5 Dec 2022 14:39:07 -0800 Subject: [PATCH 53/73] feat: add destroy lifecycle hook to blocks (#6678) * chore: move healing tests * chore: add tests for calling destroy * feat: add calling the destroy callback * chore: cleanup reversions * chore: fixup type of destroy --- core/block.ts | 6 + tests/mocha/block_test.js | 284 +++++++++++++-------- tests/mocha/test_helpers/events.js | 12 + tests/mocha/test_helpers/setup_teardown.js | 5 + 4 files changed, 204 insertions(+), 103 deletions(-) diff --git a/core/block.ts b/core/block.ts index 3c7b21a6a..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 @@ -361,6 +364,9 @@ export class Block implements IASTNodeLocation, IDeletable { } } finally { eventUtils.enable(); + if (typeof this.destroy === 'function') { + this.destroy(); + } this.disposed = true; } } diff --git a/tests/mocha/block_test.js b/tests/mocha/block_test.js index abad7ace0..d25eb1d86 100644 --- a/tests/mocha/block_test.js +++ b/tests/mocha/block_test.js @@ -11,11 +11,12 @@ import {createDeprecationWarningStub} from './test_helpers/warnings.js'; import {createRenderedBlock} from './test_helpers/block_definitions.js'; import * as eventUtils from '../../build/src/core/events/utils.js'; import {sharedTestSetup, sharedTestTeardown, workspaceTeardown} from './test_helpers/setup_teardown.js'; +import {createChangeListenerSpy, createMockEvent} from './test_helpers/events.js'; suite('Blocks', function() { setup(function() { - sharedTestSetup.call(this, {fireEventsNow: false}); + this.clock = sharedTestSetup.call(this, {fireEventsNow: false}).clock; this.workspace = new Blockly.Workspace(); Blockly.defineBlocksWithJsonArray([ { @@ -198,123 +199,200 @@ suite('Blocks', function() { }); }); }); - suite('Dispose', function() { - function assertDisposedNoheal(blocks) { - chai.assert.isFalse(blocks.A.disposed); - // A has nothing connected to it. - chai.assert.equal(blocks.A.getChildren().length, 0); - // B is disposed. - chai.assert.isTrue(blocks.B.disposed); - // And C is disposed. - chai.assert.isTrue(blocks.C.disposed); - } - function assertDisposedHealed(blocks) { - chai.assert.isFalse(blocks.A.disposed); - chai.assert.isFalse(blocks.C.disposed); - // A and C are connected. - chai.assert.equal(blocks.A.getChildren().length, 1); - chai.assert.equal(blocks.C.getParent(), blocks.A); - // B is disposed. - chai.assert.isTrue(blocks.B.disposed); - } - function assertDisposedHealFailed(blocks) { - chai.assert.isFalse(blocks.A.disposed); - chai.assert.isFalse(blocks.C.disposed); - // A has nothing connected to it. - chai.assert.equal(blocks.A.getChildren().length, 0); - // B is disposed. - chai.assert.isTrue(blocks.B.disposed); - // C is the top of its stack. - chai.assert.isNull(blocks.C.getParent()); - } - - suite('Row', function() { + suite('Disposal', function() { + suite('calling destroy', function() { setup(function() { - this.blocks = createTestBlocks(this.workspace, true); + Blockly.Blocks['destroyable_block'] = { + init: function() { }, + destroy: function() { }, + }; + this.block = this.workspace.newBlock('destroyable_block'); }); - test('Don\'t heal', function() { - this.blocks.B.dispose(false); - assertDisposedNoheal(this.blocks); + teardown(function() { + delete Blockly.Blocks['destroyable_block']; }); - test('Heal', function() { - this.blocks.B.dispose(true); - // Each block has only one input, and the types work. - assertDisposedHealed(this.blocks); - }); - test('Heal with bad checks', function() { - const blocks = this.blocks; - // A and C can't connect, but both can connect to B. - blocks.A.inputList[0].connection.setCheck('type1'); - blocks.C.outputConnection.setCheck('type2'); + test('destroy is called', function() { + const spy = sinon.spy(this.block, 'destroy'); - // Each block has only one input, but the types don't work. - blocks.B.dispose(true); - assertDisposedHealFailed(blocks); + this.block.dispose(); + + chai.assert.isTrue(spy.calledOnce, 'Expected destroy to be called.'); }); - test('Parent has multiple inputs', function() { - const blocks = this.blocks; - // Add extra input to parent - blocks.A.appendValueInput("INPUT").setCheck(null); - blocks.B.dispose(true); - assertDisposedHealed(blocks); + + test('disposing is set before destroy', function() { + let disposing = null; + this.block.destroy = function() { + disposing = this.disposing; + }; + + this.block.dispose(); + + chai.assert.isTrue( + disposing, + 'Expected disposing to be set to true before destroy is called.'); }); - test('Middle has multiple inputs', function() { - const blocks = this.blocks; - // Add extra input to middle block - blocks.B.appendValueInput("INPUT").setCheck(null); - blocks.B.dispose(true); - assertDisposedHealed(blocks); + + test('disposed is not set before destroy', function() { + let disposed = null; + this.block.destroy = function() { + disposed = this.disposed; + }; + + this.block.dispose(); + + chai.assert.isFalse( + disposed, + 'Expected disposed to be false when destroy is called'); }); - test('Child has multiple inputs', function() { - const blocks = this.blocks; - // Add extra input to child block - blocks.C.appendValueInput("INPUT").setCheck(null); - // Child block input count doesn't matter. - blocks.B.dispose(true); - assertDisposedHealed(blocks); - }); - test('Child is shadow', function() { - const blocks = this.blocks; - blocks.C.setShadow(true); - blocks.B.dispose(true); - // Even though we're asking to heal, it will appear as if it has not - // healed because shadows always get destroyed. - assertDisposedNoheal(blocks); + + test('events can be fired from destroy', function() { + const mockEvent = createMockEvent(this.workspace); + this.block.destroy = function() { + Blockly.Events.fire(mockEvent); + }; + const spy = createChangeListenerSpy(this.workspace); + + this.block.dispose(); + this.clock.runAll(); + + chai.assert.isTrue( + spy.calledWith(mockEvent), + 'Expected to be able to fire events from destroy'); }); }); - suite('Stack', function() { - setup(function() { - this.blocks = createTestBlocks(this.workspace, false); + + suite('stack/row healing', function() { + function assertDisposedNoheal(blocks) { + chai.assert.isFalse(blocks.A.disposed); + // A has nothing connected to it. + chai.assert.equal(blocks.A.getChildren().length, 0); + // B is disposed. + chai.assert.isTrue(blocks.B.disposed); + // And C is disposed. + chai.assert.isTrue(blocks.C.disposed); + } + + function assertDisposedHealed(blocks) { + chai.assert.isFalse(blocks.A.disposed); + chai.assert.isFalse(blocks.C.disposed); + // A and C are connected. + chai.assert.equal(blocks.A.getChildren().length, 1); + chai.assert.equal(blocks.C.getParent(), blocks.A); + // B is disposed. + chai.assert.isTrue(blocks.B.disposed); + } + + function assertDisposedHealFailed(blocks) { + chai.assert.isFalse(blocks.A.disposed); + chai.assert.isFalse(blocks.C.disposed); + // A has nothing connected to it. + chai.assert.equal(blocks.A.getChildren().length, 0); + // B is disposed. + chai.assert.isTrue(blocks.B.disposed); + // C is the top of its stack. + chai.assert.isNull(blocks.C.getParent()); + } + + suite('Row', function() { + setup(function() { + this.blocks = createTestBlocks(this.workspace, true); + }); + + test('Don\'t heal', function() { + this.blocks.B.dispose(false); + assertDisposedNoheal(this.blocks); + }); + + test('Heal', function() { + this.blocks.B.dispose(true); + // Each block has only one input, and the types work. + assertDisposedHealed(this.blocks); + }); + + test('Heal with bad checks', function() { + const blocks = this.blocks; + + // A and C can't connect, but both can connect to B. + blocks.A.inputList[0].connection.setCheck('type1'); + blocks.C.outputConnection.setCheck('type2'); + + // Each block has only one input, but the types don't work. + blocks.B.dispose(true); + assertDisposedHealFailed(blocks); + }); + + test('Parent has multiple inputs', function() { + const blocks = this.blocks; + // Add extra input to parent + blocks.A.appendValueInput("INPUT").setCheck(null); + blocks.B.dispose(true); + assertDisposedHealed(blocks); + }); + + test('Middle has multiple inputs', function() { + const blocks = this.blocks; + // Add extra input to middle block + blocks.B.appendValueInput("INPUT").setCheck(null); + blocks.B.dispose(true); + assertDisposedHealed(blocks); + }); + + test('Child has multiple inputs', function() { + const blocks = this.blocks; + // Add extra input to child block + blocks.C.appendValueInput("INPUT").setCheck(null); + // Child block input count doesn't matter. + blocks.B.dispose(true); + assertDisposedHealed(blocks); + }); + + test('Child is shadow', function() { + const blocks = this.blocks; + blocks.C.setShadow(true); + blocks.B.dispose(true); + // Even though we're asking to heal, it will appear as if it has not + // healed because shadows always get destroyed. + assertDisposedNoheal(blocks); + }); }); - test('Don\'t heal', function() { - this.blocks.B.dispose(); - assertDisposedNoheal(this.blocks); - }); - test('Heal', function() { - this.blocks.B.dispose(true); - assertDisposedHealed(this.blocks); - }); - test('Heal with bad checks', function() { - const blocks = this.blocks; - // A and C can't connect, but both can connect to B. - blocks.A.nextConnection.setCheck('type1'); - blocks.C.previousConnection.setCheck('type2'); + suite('Stack', function() { + setup(function() { + this.blocks = createTestBlocks(this.workspace, false); + }); + + test('Don\'t heal', function() { + this.blocks.B.dispose(); + assertDisposedNoheal(this.blocks); + }); - // The types don't work. - blocks.B.dispose(true); + test('Heal', function() { + this.blocks.B.dispose(true); + assertDisposedHealed(this.blocks); + }); - assertDisposedHealFailed(blocks); - }); - test('Child is shadow', function() { - const blocks = this.blocks; - blocks.C.setShadow(true); - blocks.B.dispose(true); - // Even though we're asking to heal, it will appear as if it has not - // healed because shadows always get destroyed. - assertDisposedNoheal(blocks); + test('Heal with bad checks', function() { + const blocks = this.blocks; + // A and C can't connect, but both can connect to B. + blocks.A.nextConnection.setCheck('type1'); + blocks.C.previousConnection.setCheck('type2'); + + // The types don't work. + blocks.B.dispose(true); + + assertDisposedHealFailed(blocks); + }); + + test('Child is shadow', function() { + const blocks = this.blocks; + blocks.C.setShadow(true); + blocks.B.dispose(true); + // Even though we're asking to heal, it will appear as if it has not + // healed because shadows always get destroyed. + assertDisposedNoheal(blocks); + }); }); }); }); diff --git a/tests/mocha/test_helpers/events.js b/tests/mocha/test_helpers/events.js index 52d2a2553..c5fb38028 100644 --- a/tests/mocha/test_helpers/events.js +++ b/tests/mocha/test_helpers/events.js @@ -19,6 +19,18 @@ export function createChangeListenerSpy(workspace) { 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, + }; +} + /** * Asserts whether the given xml property has the expected property. * @param {!Node} xmlValue The xml value to check. 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, + }; } /** From fd92cd7824305a317cf3fa247ca161a3e8dfd4f2 Mon Sep 17 00:00:00 2001 From: Maribeth Bottorff Date: Mon, 5 Dec 2022 15:53:26 -0800 Subject: [PATCH 54/73] chore: update release notes config and tagging (#6677) * chore: update release notes config and tagging * chore: add emoji and make cases consistent --- .github/release.yml | 16 +++++++++++----- .github/workflows/conventional-label.yml | 8 ++++++-- 2 files changed, 17 insertions(+), 7 deletions(-) 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/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: '[]' From 983a8be441d8ed3541cf49982f84233828f318c9 Mon Sep 17 00:00:00 2001 From: Christopher Allen Date: Wed, 7 Dec 2022 19:43:50 +0000 Subject: [PATCH 55/73] fix(appengine): Restore build products to previous location (#6687) Modify the prepareDemos script to copy the messages and compressed files to their previous locations in the deploy directory, to fix 404 errors on devsite that we can't immediately fix by pushing devsite. --- scripts/gulpfiles/appengine_tasks.js | 30 ++++++++++++++++++++++++++-- 1 file changed, 28 insertions(+), 2 deletions(-) diff --git a/scripts/gulpfiles/appengine_tasks.js b/scripts/gulpfiles/appengine_tasks.js index d442da110..5e9f9e871 100644 --- a/scripts/gulpfiles/appengine_tasks.js +++ b/scripts/gulpfiles/appengine_tasks.js @@ -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. */ @@ -153,7 +177,9 @@ const prepareDemos = gulp.series( gulp.parallel(buildTasks.cleanBuildDir, packageTasks.cleanReleaseDir), buildTasks.build, - copyBuilt), + gulp.parallel(copyBuilt, + copyCompressedToOldLocation, + copyMessagesToOldLocation)), copyPlaygroundDeps)); /** From e3c04978f3bd18581c156f35cf406857a74ec955 Mon Sep 17 00:00:00 2001 From: Christopher Allen Date: Thu, 8 Dec 2022 16:32:25 +0000 Subject: [PATCH 56/73] chore(build): Remove prepare script; run deps script from start script (#6653) To make `npm install` and `npm ci` faster, and to avoid redundant work when doing either of these followed by `npm run build` (or any other script which does a build), delete the `prepare` script and instead add an invocation of `npm run deps` to the beginning of the `start` script. --- gulpfile.js | 1 - package.json | 3 +-- scripts/gulpfiles/build_tasks.js | 20 -------------------- 3 files changed, 1 insertion(+), 23 deletions(-) diff --git a/gulpfile.js b/gulpfile.js index 80afbd800..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, diff --git a/package.json b/package.json index bdb12f251..aabe95be4 100644 --- a/package.json +++ b/package.json @@ -44,13 +44,12 @@ "minify": "gulp minify", "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 test", "test:generators": "gulp testGenerators", diff --git a/scripts/gulpfiles/build_tasks.js b/scripts/gulpfiles/build_tasks.js index 4358ad8e5..9e8ab31ae 100644 --- a/scripts/gulpfiles/build_tasks.js +++ b/scripts/gulpfiles/build_tasks.js @@ -288,25 +288,6 @@ const 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. @@ -760,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 = From d6230b2a44f498a96be90faa0117a2a34dc63e51 Mon Sep 17 00:00:00 2001 From: Beka Westberg Date: Fri, 9 Dec 2022 10:30:39 -0800 Subject: [PATCH 57/73] feat: procedure event serialization (#6669) * feat: add serialization to procedure base event * feat: add serialization to procedure change return event * feat: add serialization to procedure create event * feat: add serialization of the procedure delete event * feat: add serialization of procedure enable events * feat: add serialization of procedure parameter create events * feat: add serialization of the parameter delete event * feat: add serialization of procedure parameter rename events * feat: add serialization for procedure rename events --- core/events/events_procedure_base.ts | 19 ++++- core/events/events_procedure_change_return.ts | 33 ++++++++- core/events/events_procedure_create.ts | 35 ++++++++- core/events/events_procedure_delete.ts | 29 +++++++- core/events/events_procedure_enable.ts | 29 +++++++- .../events/events_procedure_parameter_base.ts | 29 +++++++- .../events_procedure_parameter_create.ts | 45 ++++++++++-- .../events_procedure_parameter_delete.ts | 41 +++++++++-- .../events_procedure_parameter_rename.ts | 71 +++++++++++++++---- core/events/events_procedure_rename.ts | 33 ++++++++- core/serialization/procedures.ts | 38 +++++++--- .../event_procedure_change_return_test.js | 3 +- tests/mocha/event_procedure_create_test.js | 2 +- tests/mocha/event_procedure_delete_test.js | 3 +- tests/mocha/event_procedure_enable_test.js | 3 +- .../event_procedure_parameter_create_test.js | 8 +-- .../event_procedure_parameter_delete_test.js | 3 +- .../event_procedure_parameter_rename_test.js | 3 +- tests/mocha/event_procedure_rename_test.js | 3 +- 19 files changed, 378 insertions(+), 52 deletions(-) diff --git a/core/events/events_procedure_base.ts b/core/events/events_procedure_base.ts index 36c42f25c..1c17db24a 100644 --- a/core/events/events_procedure_base.ts +++ b/core/events/events_procedure_base.ts @@ -4,7 +4,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -import {Abstract as AbstractEvent} from './events_abstract.js'; +import {Abstract as AbstractEvent, AbstractEventJson} from './events_abstract.js'; import type {IProcedureModel} from '../interfaces/i_procedure_model.js'; import type {Workspace} from '../workspace.js'; @@ -12,11 +12,26 @@ import type {Workspace} from '../workspace.js'; /** * The base event for an event associated with a procedure. */ -export class ProcedureBase extends AbstractEvent { +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 index 9078056e2..a6e3c6be7 100644 --- a/core/events/events_procedure_change_return.ts +++ b/core/events/events_procedure_change_return.ts @@ -9,7 +9,7 @@ import type {IProcedureModel} from '../interfaces/i_procedure_model.js'; import * as registry from '../registry.js'; import type {Workspace} from '../workspace.js'; -import {ProcedureBase} from './events_procedure_base.js'; +import {ProcedureBase, ProcedureBaseJson} from './events_procedure_base.js'; import * as eventUtils from './utils.js'; @@ -49,6 +49,37 @@ export class ProcedureChangeReturn extends ProcedureBase { 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( diff --git a/core/events/events_procedure_create.ts b/core/events/events_procedure_create.ts index 7e9d187e6..ddccfb983 100644 --- a/core/events/events_procedure_create.ts +++ b/core/events/events_procedure_create.ts @@ -5,11 +5,12 @@ */ import type {IProcedureModel} from '../interfaces/i_procedure_model.js'; -import {ObservableProcedureModel} from '../procedures.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} from './events_procedure_base.js'; +import {ProcedureBase, ProcedureBaseJson} from './events_procedure_base.js'; import * as eventUtils from './utils.js'; @@ -30,6 +31,7 @@ export class ProcedureCreate extends ProcedureBase { 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 { @@ -37,6 +39,35 @@ export class ProcedureCreate extends ProcedureBase { 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( diff --git a/core/events/events_procedure_delete.ts b/core/events/events_procedure_delete.ts index 021088e8d..e7555aeba 100644 --- a/core/events/events_procedure_delete.ts +++ b/core/events/events_procedure_delete.ts @@ -10,7 +10,7 @@ import {ObservableProcedureModel} from '../procedures.js'; import * as registry from '../registry.js'; import type {Workspace} from '../workspace.js'; -import {ProcedureBase} from './events_procedure_base.js'; +import {ProcedureBase, ProcedureBaseJson} from './events_procedure_base.js'; import * as eventUtils from './utils.js'; @@ -38,7 +38,34 @@ export class ProcedureDelete extends ProcedureBase { 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 index 33820d966..3ae52e93f 100644 --- a/core/events/events_procedure_enable.ts +++ b/core/events/events_procedure_enable.ts @@ -9,7 +9,7 @@ import type {IProcedureModel} from '../interfaces/i_procedure_model.js'; import * as registry from '../registry.js'; import type {Workspace} from '../workspace.js'; -import {ProcedureBase} from './events_procedure_base.js'; +import {ProcedureBase, ProcedureBaseJson} from './events_procedure_base.js'; import * as eventUtils from './utils.js'; /** @@ -43,7 +43,34 @@ export class ProcedureEnable extends ProcedureBase { 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 index e0ea1a4af..1bbfb2429 100644 --- a/core/events/events_procedure_parameter_base.ts +++ b/core/events/events_procedure_parameter_base.ts @@ -5,10 +5,35 @@ * SPDX-License-Identifier: Apache-2.0 */ -import {ProcedureBase} from './events_procedure_base.js'; +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 class ProcedureParameterBase extends ProcedureBase {} +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 index b7ffec79b..1271effc3 100644 --- a/core/events/events_procedure_parameter_create.ts +++ b/core/events/events_procedure_parameter_create.ts @@ -8,9 +8,10 @@ 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} from './events_procedure_parameter_base.js'; +import {ProcedureParameterBase, ProcedureParameterBaseJson} from './events_procedure_parameter_base.js'; import * as eventUtils from './utils.js'; @@ -27,9 +28,8 @@ export class ProcedureParameterCreate extends ProcedureParameterBase { */ constructor( workspace: Workspace, procedure: IProcedureModel, - public readonly parameter: IParameterModel, - public readonly index: number) { - super(workspace, procedure); + parameter: IParameterModel, public readonly index: number) { + super(workspace, procedure, parameter); } run(forward: boolean) { @@ -44,6 +44,7 @@ export class ProcedureParameterCreate extends ProcedureParameterBase { 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()), @@ -57,6 +58,42 @@ export class ProcedureParameterCreate extends ProcedureParameterBase { 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( diff --git a/core/events/events_procedure_parameter_delete.ts b/core/events/events_procedure_parameter_delete.ts index 838ef5971..4ee43bb0b 100644 --- a/core/events/events_procedure_parameter_delete.ts +++ b/core/events/events_procedure_parameter_delete.ts @@ -10,7 +10,7 @@ import {ObservableParameterModel} from '../procedures/observable_parameter_model import * as registry from '../registry.js'; import type {Workspace} from '../workspace.js'; -import {ProcedureParameterBase} from './events_procedure_parameter_base.js'; +import {ProcedureParameterBase, ProcedureParameterBaseJson} from './events_procedure_parameter_base.js'; import * as eventUtils from './utils.js'; /** @@ -27,9 +27,8 @@ export class ProcedureParameterDelete extends ProcedureParameterBase { */ constructor( workspace: Workspace, procedure: IProcedureModel, - public readonly parameter: IParameterModel, - public readonly index: number) { - super(workspace, procedure); + parameter: IParameterModel, public readonly index: number) { + super(workspace, procedure, parameter); } run(forward: boolean) { @@ -47,6 +46,7 @@ export class ProcedureParameterDelete extends ProcedureParameterBase { 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()), @@ -57,6 +57,39 @@ export class ProcedureParameterDelete extends ProcedureParameterBase { 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( diff --git a/core/events/events_procedure_parameter_rename.ts b/core/events/events_procedure_parameter_rename.ts index 50c248f3c..9baafc11b 100644 --- a/core/events/events_procedure_parameter_rename.ts +++ b/core/events/events_procedure_parameter_rename.ts @@ -9,7 +9,7 @@ import type {IProcedureModel} from '../interfaces/i_procedure_model.js'; import * as registry from '../registry.js'; import type {Workspace} from '../workspace.js'; -import {ProcedureParameterBase} from './events_procedure_parameter_base.js'; +import {ProcedureParameterBase, ProcedureParameterBaseJson} from './events_procedure_parameter_base.js'; import * as eventUtils from './utils.js'; /** @@ -22,23 +22,15 @@ export class ProcedureParameterRename extends ProcedureParameterBase { constructor( workspace: Workspace, procedure: IProcedureModel, - public readonly parameter: IParameterModel, - public readonly oldName: string) { - super(workspace, procedure); + parameter: IParameterModel, public readonly oldName: string) { + super(workspace, procedure, parameter); this.newName = parameter.getName(); } run(forward: boolean) { - const procedureModel = - this.getEventWorkspace_().getProcedureMap().get(this.model.getId()); - if (!procedureModel) { - throw new Error( - 'Cannot rename the parameter of a procedure that does not exist ' + - 'in the procedure map'); - } - const parameterModel = procedureModel.getParameters().find( - (p) => p.getId() === this.parameter.getId()); + const parameterModel = findMatchingParameter( + this.getEventWorkspace_(), this.model.getId(), this.parameter.getId()); if (!parameterModel) { throw new Error( 'Cannot rename a parameter that does not exist ' + @@ -50,6 +42,59 @@ export class ProcedureParameterRename extends ProcedureParameterBase { 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( diff --git a/core/events/events_procedure_rename.ts b/core/events/events_procedure_rename.ts index 19c696a21..0b849d771 100644 --- a/core/events/events_procedure_rename.ts +++ b/core/events/events_procedure_rename.ts @@ -8,7 +8,7 @@ import type {IProcedureModel} from '../interfaces/i_procedure_model.js'; import * as registry from '../registry.js'; import type {Workspace} from '../workspace.js'; -import {ProcedureBase} from './events_procedure_base.js'; +import {ProcedureBase, ProcedureBaseJson} from './events_procedure_base.js'; import * as eventUtils from './utils.js'; /** @@ -41,6 +41,37 @@ export class ProcedureRename extends ProcedureBase { 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( 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/tests/mocha/event_procedure_change_return_test.js b/tests/mocha/event_procedure_change_return_test.js index 63b265cb1..5ec80cdda 100644 --- a/tests/mocha/event_procedure_change_return_test.js +++ b/tests/mocha/event_procedure_change_return_test.js @@ -181,10 +181,11 @@ suite('Procedure Change Return Event', function() { }); }); - suite.skip('serialization', function() { + suite('serialization', function() { test('events round-trip through JSON', function() { const model = new Blockly.procedures.ObservableProcedureModel( this.workspace, 'test name', 'test id'); + this.procedureMap.add(model); const origEvent = new Blockly.Events.ProcedureChangeReturn( this.workspace, model, NON_DEFAULT_TYPES); diff --git a/tests/mocha/event_procedure_create_test.js b/tests/mocha/event_procedure_create_test.js index d74b56463..1432ae3bc 100644 --- a/tests/mocha/event_procedure_create_test.js +++ b/tests/mocha/event_procedure_create_test.js @@ -146,7 +146,7 @@ suite('Procedure Create Event', function() { }); }); - suite.skip('serialization', function() { + suite('serialization', function() { test('events round-trip through JSON', function() { const model = new Blockly.procedures.ObservableProcedureModel( this.workspace, 'test name', 'test id'); diff --git a/tests/mocha/event_procedure_delete_test.js b/tests/mocha/event_procedure_delete_test.js index 4db5d8ab6..aa45b3e7f 100644 --- a/tests/mocha/event_procedure_delete_test.js +++ b/tests/mocha/event_procedure_delete_test.js @@ -146,10 +146,11 @@ suite('Procedure Delete Event', function() { }); }); - suite.skip('serialization', function() { + suite('serialization', function() { test('events round-trip through JSON', function() { const model = new Blockly.procedures.ObservableProcedureModel( this.workspace, 'test name', 'test id'); + this.procedureMap.add(model); const origEvent = new Blockly.Events.ProcedureDelete(this.workspace, model); const json = origEvent.toJson(); diff --git a/tests/mocha/event_procedure_enable_test.js b/tests/mocha/event_procedure_enable_test.js index 7f753fc1a..8e34565c8 100644 --- a/tests/mocha/event_procedure_enable_test.js +++ b/tests/mocha/event_procedure_enable_test.js @@ -172,10 +172,11 @@ suite('Procedure Enable Event', function() { }); }); - suite.skip('serialization', function() { + suite('serialization', function() { test('events round-trip through JSON', function() { const model = new Blockly.procedures.ObservableProcedureModel( this.workspace, 'test name', 'test id'); + this.procedureMap.add(model); const origEvent = new Blockly.Events.ProcedureEnable(this.workspace, model); const json = origEvent.toJson(); diff --git a/tests/mocha/event_procedure_parameter_create_test.js b/tests/mocha/event_procedure_parameter_create_test.js index 4cfeb34ea..2be5c7dcb 100644 --- a/tests/mocha/event_procedure_parameter_create_test.js +++ b/tests/mocha/event_procedure_parameter_create_test.js @@ -197,16 +197,16 @@ suite('Procedure Parameter Create Event', function() { }); }); - suite.skip('serialization', function() { + suite('serialization', function() { test('events round-trip through JSON', function() { const param = new Blockly.procedures.ObservableParameterModel( this.workspace, 'test param name', 'test param id'); const model = new Blockly.procedures.ObservableProcedureModel( - this.workspace, 'test name', 'test id') - .insertParameter(param, 0); + this.workspace, 'test name', 'test id'); + this.procedureMap.add(model); const origEvent = new Blockly.Events.ProcedureParameterCreate( - this.workspace, model); + this.workspace, model, param, 0); const json = origEvent.toJson(); const newEvent = new Blockly.Events.fromJson(json, this.workspace); diff --git a/tests/mocha/event_procedure_parameter_delete_test.js b/tests/mocha/event_procedure_parameter_delete_test.js index 3de6226e1..e98850dfc 100644 --- a/tests/mocha/event_procedure_parameter_delete_test.js +++ b/tests/mocha/event_procedure_parameter_delete_test.js @@ -197,7 +197,7 @@ suite('Procedure Parameter Delete Event', function() { }); }); - suite.skip('serialization', function() { + suite('serialization', function() { test('events round-trip through JSON', function() { const param = new Blockly.procedures.ObservableParameterModel( this.workspace, 'test param name', 'test param id'); @@ -205,6 +205,7 @@ suite('Procedure Parameter Delete Event', function() { new Blockly.procedures.ObservableProcedureModel( this.workspace, 'test name', 'test id') .insertParameter(param, 0); + this.procedureMap.add(model); const origEvent = new Blockly.Events.ProcedureParameterDelete( this.workspace, model); diff --git a/tests/mocha/event_procedure_parameter_rename_test.js b/tests/mocha/event_procedure_parameter_rename_test.js index 39f75662d..c88da7fb9 100644 --- a/tests/mocha/event_procedure_parameter_rename_test.js +++ b/tests/mocha/event_procedure_parameter_rename_test.js @@ -204,7 +204,7 @@ suite('Procedure Parameter Rename Event', function() { }); }); - suite.skip('serialization', function() { + suite('serialization', function() { test('events round-trip through JSON', function() { const param = new Blockly.procedures.ObservableParameterModel( this.workspace, 'test param name', 'test param id'); @@ -212,6 +212,7 @@ suite('Procedure Parameter Rename Event', function() { new Blockly.procedures.ObservableProcedureModel( this.workspace, 'test name', 'test id') .insertParameter(param, 0); + this.procedureMap.add(model); const origEvent = new Blockly.Events.ProcedureParameterDelete( this.workspace, model); diff --git a/tests/mocha/event_procedure_rename_test.js b/tests/mocha/event_procedure_rename_test.js index 1ae69f529..9514cb443 100644 --- a/tests/mocha/event_procedure_rename_test.js +++ b/tests/mocha/event_procedure_rename_test.js @@ -169,10 +169,11 @@ suite('Procedure Rename Event', function() { }); }); - suite.skip('serialization', function() { + suite('serialization', function() { test('events round-trip through JSON', function() { const model = new Blockly.procedures.ObservableProcedureModel( this.workspace, 'test name', 'test id'); + this.procedureMap.add(model); const origEvent = new Blockly.Events.ProcedureRename( this.workspace, model, NON_DEFAULT_NAME); From 9ee1559e345dad22d581fc04ea0d750f97c8566a Mon Sep 17 00:00:00 2001 From: Blake Thomas Williams <49404493+btw17@users.noreply.github.com> Date: Fri, 9 Dec 2022 16:16:37 -0600 Subject: [PATCH 58/73] fix: set default field to any and fix validator function return type (#6690) * chore: set default field to and fix validator function return type * Fix format --- core/field.ts | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/core/field.ts b/core/field.ts index ce34c8a87..cf9148e1c 100644 --- a/core/field.ts +++ b/core/field.ts @@ -45,17 +45,17 @@ import * as WidgetDiv from './widgetdiv.js'; import type {WorkspaceSvg} from './workspace_svg.js'; import * as Xml from './xml.js'; -export type FieldValidator = (value: T) => void; +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. From 20f378e0824d8e398f671ba8369518535d9cae12 Mon Sep 17 00:00:00 2001 From: Maribeth Bottorff Date: Fri, 9 Dec 2022 19:27:27 -0800 Subject: [PATCH 59/73] fix: don't reopen dropdownDiv if it was already open (#6688) --- core/dropdowndiv.ts | 7 +++++++ core/gesture.ts | 20 +++++++++++++++++++- 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/core/dropdowndiv.ts b/core/dropdowndiv.ts index 8a5cceabf..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. * diff --git a/core/gesture.ts b/core/gesture.ts index c9578f45e..935aa37d8 100644 --- a/core/gesture.ts +++ b/core/gesture.ts @@ -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'; @@ -169,6 +170,14 @@ export class Gesture { /** 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 @@ -462,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_); @@ -878,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_(); } From 38dcb11374f0bd3c15b18053cef513c82b627bdd Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 12 Dec 2022 07:28:23 -0800 Subject: [PATCH 60/73] chore(deps): bump qs from 6.5.2 to 6.5.3 (#6689) Bumps [qs](https://github.com/ljharb/qs) from 6.5.2 to 6.5.3. - [Release notes](https://github.com/ljharb/qs/releases) - [Changelog](https://github.com/ljharb/qs/blob/main/CHANGELOG.md) - [Commits](https://github.com/ljharb/qs/compare/v6.5.2...v6.5.3) --- updated-dependencies: - dependency-name: qs dependency-type: indirect ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index b341d144d..10a7a0ab9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10484,9 +10484,9 @@ } }, "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" @@ -21924,9 +21924,9 @@ } }, "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": { From dc74ef5ece84b07855885365111c80d4d2004e60 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 12 Dec 2022 07:28:41 -0800 Subject: [PATCH 61/73] chore(deps): bump @wdio/selenium-standalone-service from 8.0.2 to 8.0.11 (#6693) Bumps [@wdio/selenium-standalone-service](https://github.com/webdriverio/webdriverio/tree/HEAD/packages/wdio-seleniun-standalone-service) from 8.0.2 to 8.0.11. - [Release notes](https://github.com/webdriverio/webdriverio/releases) - [Commits](https://github.com/webdriverio/webdriverio/commits/v8.0.11/packages/wdio-seleniun-standalone-service) --- updated-dependencies: - dependency-name: "@wdio/selenium-standalone-service" dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 383 ++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 373 insertions(+), 10 deletions(-) diff --git a/package-lock.json b/package-lock.json index 10a7a0ab9..2908b116c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1730,21 +1730,236 @@ } }, "node_modules/@wdio/selenium-standalone-service": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@wdio/selenium-standalone-service/-/selenium-standalone-service-8.0.2.tgz", - "integrity": "sha512-C0JT4cG+HAj9Ubnpu/NC8MSr5i6p3/4aSUoeCfXQ2sR8ltDOUj1xt4SNTgMERM+guj0Rp5LUvpV/U5iy+jfgPQ==", + "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/selenium-standalone": "^7.0.0", - "@wdio/config": "8.0.2", + "@wdio/config": "8.0.11", "@wdio/logger": "8.0.0", - "@wdio/types": "8.0.0", + "@wdio/types": "8.0.11", "selenium-standalone": "^8.2.1" }, "engines": { "node": "^16.13 || >=18" } }, + "node_modules/@wdio/selenium-standalone-service/node_modules/@wdio/config": { + "version": "8.0.11", + "resolved": "https://registry.npmjs.org/@wdio/config/-/config-8.0.11.tgz", + "integrity": "sha512-LR8n6TJfDzVtDmuge4EjOHiJKae73ZyvEwTQq3tokovRIbIMaVkfsRV9iqEZiRgohy14ehAREwNgn67j77ucYA==", + "dev": true, + "dependencies": { + "@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": "^16.13 || >=18" + } + }, + "node_modules/@wdio/selenium-standalone-service/node_modules/@wdio/types": { + "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" + }, + "engines": { + "node": "^16.13 || >=18" + } + }, + "node_modules/@wdio/selenium-standalone-service/node_modules/@wdio/utils": { + "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": "8.0.0", + "@wdio/types": "8.0.11", + "import-meta-resolve": "^2.2.0", + "p-iteration": "^1.1.8" + }, + "engines": { + "node": "^16.13 || >=18" + } + }, + "node_modules/@wdio/selenium-standalone-service/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "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", + "integrity": "sha512-ull455NHSHI/Y1FqGaaYFaLGkNMMJbavMrEGFXG/PGrg6y7sutWHUHrz6gy6WEBH6akM1M414dWKCNs+IhKdiQ==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "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.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" + }, + "engines": { + "node": ">=10" + } + }, + "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, + "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/@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, + "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/@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/@wdio/types": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/@wdio/types/-/types-8.0.0.tgz", @@ -14926,16 +15141,164 @@ "dev": true }, "@wdio/selenium-standalone-service": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@wdio/selenium-standalone-service/-/selenium-standalone-service-8.0.2.tgz", - "integrity": "sha512-C0JT4cG+HAj9Ubnpu/NC8MSr5i6p3/4aSUoeCfXQ2sR8ltDOUj1xt4SNTgMERM+guj0Rp5LUvpV/U5iy+jfgPQ==", + "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/selenium-standalone": "^7.0.0", - "@wdio/config": "8.0.2", + "@wdio/config": "8.0.11", "@wdio/logger": "8.0.0", - "@wdio/types": "8.0.0", + "@wdio/types": "8.0.11", "selenium-standalone": "^8.2.1" + }, + "dependencies": { + "@wdio/config": { + "version": "8.0.11", + "resolved": "https://registry.npmjs.org/@wdio/config/-/config-8.0.11.tgz", + "integrity": "sha512-LR8n6TJfDzVtDmuge4EjOHiJKae73ZyvEwTQq3tokovRIbIMaVkfsRV9iqEZiRgohy14ehAREwNgn67j77ucYA==", + "dev": true, + "requires": { + "@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": "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" + } + }, + "@wdio/utils": { + "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": "8.0.0", + "@wdio/types": "8.0.11", + "import-meta-resolve": "^2.2.0", + "p-iteration": "^1.1.8" + } + }, + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "requires": { + "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", + "integrity": "sha512-ull455NHSHI/Y1FqGaaYFaLGkNMMJbavMrEGFXG/PGrg6y7sutWHUHrz6gy6WEBH6akM1M414dWKCNs+IhKdiQ==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "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.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": { From 3a02495aa808691387fa55b742d145c25badb91b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 12 Dec 2022 07:28:50 -0800 Subject: [PATCH 62/73] chore(deps): bump @microsoft/api-extractor from 7.33.6 to 7.33.7 (#6694) Bumps [@microsoft/api-extractor](https://github.com/microsoft/rushstack/tree/HEAD/apps/api-extractor) from 7.33.6 to 7.33.7. - [Release notes](https://github.com/microsoft/rushstack/releases) - [Changelog](https://github.com/microsoft/rushstack/blob/main/apps/api-extractor/CHANGELOG.md) - [Commits](https://github.com/microsoft/rushstack/commits/@microsoft/api-extractor_v7.33.7/apps/api-extractor) --- updated-dependencies: - dependency-name: "@microsoft/api-extractor" dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 144 ++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 134 insertions(+), 10 deletions(-) diff --git a/package-lock.json b/package-lock.json index 2908b116c..ae3e2b00c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -593,15 +593,15 @@ } }, "node_modules/@microsoft/api-extractor": { - "version": "7.33.6", - "resolved": "https://registry.npmjs.org/@microsoft/api-extractor/-/api-extractor-7.33.6.tgz", - "integrity": "sha512-EYu1qWiMyvP/P+7na76PbE7+eOtvuYIvQa2DhZqkSQSLYP2sKLmZaSMK5Jvpgdr0fK/xLFujK5vLf3vpfcmC8g==", + "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.2", + "@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.1", "colors": "~1.2.1", @@ -626,6 +626,62 @@ "@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", @@ -660,6 +716,15 @@ "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.2", "resolved": "https://registry.npmjs.org/@microsoft/tsdoc/-/tsdoc-0.14.2.tgz", @@ -14284,15 +14349,15 @@ } }, "@microsoft/api-extractor": { - "version": "7.33.6", - "resolved": "https://registry.npmjs.org/@microsoft/api-extractor/-/api-extractor-7.33.6.tgz", - "integrity": "sha512-EYu1qWiMyvP/P+7na76PbE7+eOtvuYIvQa2DhZqkSQSLYP2sKLmZaSMK5Jvpgdr0fK/xLFujK5vLf3vpfcmC8g==", + "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.2", + "@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.1", "colors": "~1.2.1", @@ -14303,6 +14368,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", @@ -14323,6 +14441,12 @@ "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 } } }, From def3e9139be5aed024a6dfa19fa4f48e72299a2a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 12 Dec 2022 07:29:10 -0800 Subject: [PATCH 63/73] chore(deps): bump webdriverio from 8.0.5 to 8.0.12 (#6695) Bumps [webdriverio](https://github.com/webdriverio/webdriverio/tree/HEAD/packages/webdriverio) from 8.0.5 to 8.0.12. - [Release notes](https://github.com/webdriverio/webdriverio/releases) - [Changelog](https://github.com/webdriverio/webdriverio/blob/main/CHANGELOG.md) - [Commits](https://github.com/webdriverio/webdriverio/commits/v8.0.12/packages/webdriverio) --- updated-dependencies: - dependency-name: webdriverio dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 1388 ++++++++++++++++++++++++++++++++++++++------- 1 file changed, 1180 insertions(+), 208 deletions(-) diff --git a/package-lock.json b/package-lock.json index ae3e2b00c..c0936828c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1148,9 +1148,9 @@ } }, "node_modules/@types/yargs": { - "version": "17.0.15", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.15.tgz", - "integrity": "sha512-ZHc4W2dnEQPfhn06TBEdWaiUHEZAocYaiVMfwOipY5jcJt/251wVrKCBWBetGZWO5CF8tdb7L3DmdxVlZ2BOIg==", + "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": { @@ -1165,9 +1165,9 @@ "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": { @@ -1746,16 +1746,16 @@ } }, "node_modules/@wdio/globals": { - "version": "8.0.5", - "resolved": "https://registry.npmjs.org/@wdio/globals/-/globals-8.0.5.tgz", - "integrity": "sha512-SUjC6WuZZPrLz/xV1SwfleyttdcItbocVvGhnJ/lCtlgVxnXcJIF6Qz0D1Mc7C49DiceU35XpVbfv395SJei3Q==", + "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, "engines": { "node": "^16.13 || >=18" }, "optionalDependencies": { "expect-webdriverio": "^4.0.1", - "webdriverio": "8.0.5" + "webdriverio": "8.0.12" } }, "node_modules/@wdio/logger": { @@ -1785,6 +1785,12 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, + "node_modules/@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 + }, "node_modules/@wdio/repl": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/@wdio/repl/-/repl-8.0.0.tgz", @@ -3426,9 +3432,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": "*", @@ -4349,21 +4355,21 @@ } }, "node_modules/devtools": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/devtools/-/devtools-8.0.2.tgz", - "integrity": "sha512-hNUoAffjKB+H099+i4UeXP6aZ8wGMafwOab+3dpqh31ssZcNEau3ZGV+W0u8yQqjwqjY2mHSssWYERuh1B1/tQ==", + "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/ua-parser-js": "^0.7.33", - "@wdio/config": "8.0.2", + "@wdio/config": "8.0.11", "@wdio/logger": "8.0.0", "@wdio/protocols": "8.0.0", - "@wdio/types": "8.0.0", - "@wdio/utils": "8.0.2", + "@wdio/types": "8.0.11", + "@wdio/utils": "8.0.11", "chrome-launcher": "^0.15.0", "edge-paths": "^2.1.0", "import-meta-resolve": "^2.1.0", - "puppeteer-core": "19.3.0", + "puppeteer-core": "19.4.0", "query-selector-shadow-dom": "^1.0.0", "ua-parser-js": "^1.0.1", "uuid": "^9.0.0", @@ -4374,16 +4380,213 @@ } }, "node_modules/devtools-protocol": { - "version": "0.0.1077862", - "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1077862.tgz", - "integrity": "sha512-4xhfUhjBf1rE3XD+/VYoKls2fxBE0rG3j1C4b1Ak6hnz9WiwzpMKX7edIfsiPIGRqVZfosu+igxnzVnDhe1T1w==", + "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/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 + "node_modules/devtools/node_modules/@wdio/config": { + "version": "8.0.11", + "resolved": "https://registry.npmjs.org/@wdio/config/-/config-8.0.11.tgz", + "integrity": "sha512-LR8n6TJfDzVtDmuge4EjOHiJKae73ZyvEwTQq3tokovRIbIMaVkfsRV9iqEZiRgohy14ehAREwNgn67j77ucYA==", + "dev": true, + "dependencies": { + "@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": "^16.13 || >=18" + } + }, + "node_modules/devtools/node_modules/@wdio/types": { + "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" + }, + "engines": { + "node": "^16.13 || >=18" + } + }, + "node_modules/devtools/node_modules/@wdio/utils": { + "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": "8.0.0", + "@wdio/types": "8.0.11", + "import-meta-resolve": "^2.2.0", + "p-iteration": "^1.1.8" + }, + "engines": { + "node": "^16.13 || >=18" + } + }, + "node_modules/devtools/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "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", + "integrity": "sha512-ull455NHSHI/Y1FqGaaYFaLGkNMMJbavMrEGFXG/PGrg6y7sutWHUHrz6gy6WEBH6akM1M414dWKCNs+IhKdiQ==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "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.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" + }, + "engines": { + "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", @@ -4409,6 +4612,18 @@ "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", @@ -7398,10 +7613,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" @@ -8182,18 +8396,6 @@ } } }, - "node_modules/jsdom/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==", - "dependencies": { - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/json-buffer": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", @@ -8317,6 +8519,18 @@ "graceful-fs": "^4.1.11" } }, + "node_modules/ky": { + "version": "0.32.2", + "resolved": "https://registry.npmjs.org/ky/-/ky-0.32.2.tgz", + "integrity": "sha512-eBJeF6IXNwX5rksdwBrE2rIJrU2d84GoTvdM7OmmTIwUVXEMd72wIwvT+nyhrqtv7AzbSNsWz7yRsHgVhj1uog==", + "dev": true, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sindresorhus/ky?sponsor=1" + } + }, "node_modules/last-run": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/last-run/-/last-run-1.1.1.tgz", @@ -8432,7 +8646,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": { @@ -8824,9 +9038,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": { @@ -10703,14 +10917,14 @@ } }, "node_modules/puppeteer-core": { - "version": "19.3.0", - "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-19.3.0.tgz", - "integrity": "sha512-P8VAAOBnBJo/7DKJnj1b0K9kZBF2D8lkdL94CjJ+DZKCp182LQqYemPI9omUSZkh4bgykzXjZhaVR1qtddTTQg==", + "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.1056733", + "devtools-protocol": "0.0.1068969", "extract-zip": "2.0.1", "https-proxy-agent": "5.0.1", "proxy-from-env": "1.1.0", @@ -10724,24 +10938,11 @@ } }, "node_modules/puppeteer-core/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==", + "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.10.0", "resolved": "https://registry.npmjs.org/ws/-/ws-8.10.0.tgz", @@ -10773,9 +10974,9 @@ } }, "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": { @@ -12872,9 +13073,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": [ { @@ -13324,18 +13525,18 @@ } }, "node_modules/webdriver": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/webdriver/-/webdriver-8.0.2.tgz", - "integrity": "sha512-tFp935CNs1pczjns26tsfBHhrpq6r9g9MrAIgzPvNfKZzNNpaiY2qXtq2OkPQQxjCZchitNcAmaTz2k251SSNA==", + "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", "@types/ws": "^8.5.3", - "@wdio/config": "8.0.2", + "@wdio/config": "8.0.11", "@wdio/logger": "8.0.0", "@wdio/protocols": "8.0.0", - "@wdio/types": "8.0.0", - "@wdio/utils": "8.0.2", + "@wdio/types": "8.0.11", + "@wdio/utils": "8.0.11", "deepmerge-ts": "^4.2.2", "got": "^12.1.0", "ky": "^0.32.1", @@ -13369,11 +13570,60 @@ "node": ">=14.16" } }, - "node_modules/webdriver/node_modules/@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 + "node_modules/webdriver/node_modules/@wdio/config": { + "version": "8.0.11", + "resolved": "https://registry.npmjs.org/@wdio/config/-/config-8.0.11.tgz", + "integrity": "sha512-LR8n6TJfDzVtDmuge4EjOHiJKae73ZyvEwTQq3tokovRIbIMaVkfsRV9iqEZiRgohy14ehAREwNgn67j77ucYA==", + "dev": true, + "dependencies": { + "@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": "^16.13 || >=18" + } + }, + "node_modules/webdriver/node_modules/@wdio/types": { + "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" + }, + "engines": { + "node": "^16.13 || >=18" + } + }, + "node_modules/webdriver/node_modules/@wdio/utils": { + "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": "8.0.0", + "@wdio/types": "8.0.11", + "import-meta-resolve": "^2.2.0", + "p-iteration": "^1.1.8" + }, + "engines": { + "node": "^16.13 || >=18" + } + }, + "node_modules/webdriver/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } }, "node_modules/webdriver/node_modules/cacheable-lookup": { "version": "7.0.0", @@ -13402,6 +13652,34 @@ "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", @@ -13414,6 +13692,25 @@ "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", + "integrity": "sha512-ull455NHSHI/Y1FqGaaYFaLGkNMMJbavMrEGFXG/PGrg6y7sutWHUHrz6gy6WEBH6akM1M414dWKCNs+IhKdiQ==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/webdriver/node_modules/got": { "version": "12.5.3", "resolved": "https://registry.npmjs.org/got/-/got-12.5.3.tgz", @@ -13452,16 +13749,19 @@ "node": ">=10.19.0" } }, - "node_modules/webdriver/node_modules/ky": { - "version": "0.32.2", - "resolved": "https://registry.npmjs.org/ky/-/ky-0.32.2.tgz", - "integrity": "sha512-eBJeF6IXNwX5rksdwBrE2rIJrU2d84GoTvdM7OmmTIwUVXEMd72wIwvT+nyhrqtv7AzbSNsWz7yRsHgVhj1uog==", + "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": ">=14.16" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { - "url": "https://github.com/sindresorhus/ky?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/webdriver/node_modules/lowercase-keys": { @@ -13488,6 +13788,18 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/webdriver/node_modules/minimatch": { + "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" + }, + "engines": { + "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", @@ -13509,6 +13821,80 @@ "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", @@ -13524,49 +13910,101 @@ "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": "8.0.5", - "resolved": "https://registry.npmjs.org/webdriverio/-/webdriverio-8.0.5.tgz", - "integrity": "sha512-UUP5yWrwPE9U737r+7H0vYWckIGk87VklhALpymVkg7DEmlHP2c7/EI3ZWRZnXqyP5bCOVImuOvxEjiNOH1f+g==", + "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": "8.0.2", - "@wdio/globals": "8.0.5", + "@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.0", - "@wdio/utils": "8.0.2", + "@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": "8.0.2", - "devtools-protocol": "^0.0.1077862", + "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.zip": "^4.2.0", "minimatch": "^5.0.0", - "puppeteer-core": "19.3.0", + "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": "8.0.2" + "webdriver": "8.0.11" }, "engines": { "node": "^16.13 || >=18" } }, - "node_modules/webdriverio/node_modules/@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 + "node_modules/webdriverio/node_modules/@wdio/config": { + "version": "8.0.11", + "resolved": "https://registry.npmjs.org/@wdio/config/-/config-8.0.11.tgz", + "integrity": "sha512-LR8n6TJfDzVtDmuge4EjOHiJKae73ZyvEwTQq3tokovRIbIMaVkfsRV9iqEZiRgohy14ehAREwNgn67j77ucYA==", + "dev": true, + "dependencies": { + "@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": "^16.13 || >=18" + } + }, + "node_modules/webdriverio/node_modules/@wdio/types": { + "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" + }, + "engines": { + "node": "^16.13 || >=18" + } + }, + "node_modules/webdriverio/node_modules/@wdio/utils": { + "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": "8.0.0", + "@wdio/types": "8.0.11", + "import-meta-resolve": "^2.2.0", + "p-iteration": "^1.1.8" + }, + "engines": { + "node": "^16.13 || >=18" + } }, "node_modules/webdriverio/node_modules/brace-expansion": { "version": "2.0.1", @@ -13577,6 +14015,53 @@ "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", + "integrity": "sha512-ull455NHSHI/Y1FqGaaYFaLGkNMMJbavMrEGFXG/PGrg6y7sutWHUHrz6gy6WEBH6akM1M414dWKCNs+IhKdiQ==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "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", @@ -13589,6 +14074,21 @@ "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.1", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.1.tgz", @@ -13601,6 +14101,92 @@ "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": "7.0.0", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", @@ -14858,9 +15444,9 @@ } }, "@types/yargs": { - "version": "17.0.15", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.15.tgz", - "integrity": "sha512-ZHc4W2dnEQPfhn06TBEdWaiUHEZAocYaiVMfwOipY5jcJt/251wVrKCBWBetGZWO5CF8tdb7L3DmdxVlZ2BOIg==", + "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": { @@ -14875,9 +15461,9 @@ "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": { @@ -15229,13 +15815,13 @@ } }, "@wdio/globals": { - "version": "8.0.5", - "resolved": "https://registry.npmjs.org/@wdio/globals/-/globals-8.0.5.tgz", - "integrity": "sha512-SUjC6WuZZPrLz/xV1SwfleyttdcItbocVvGhnJ/lCtlgVxnXcJIF6Qz0D1Mc7C49DiceU35XpVbfv395SJei3Q==", + "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, "requires": { "expect-webdriverio": "^4.0.1", - "webdriverio": "8.0.5" + "webdriverio": "8.0.12" } }, "@wdio/logger": { @@ -15258,6 +15844,12 @@ } } }, + "@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", @@ -16512,9 +17104,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": "*", @@ -17245,33 +17837,167 @@ "dev": true }, "devtools": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/devtools/-/devtools-8.0.2.tgz", - "integrity": "sha512-hNUoAffjKB+H099+i4UeXP6aZ8wGMafwOab+3dpqh31ssZcNEau3ZGV+W0u8yQqjwqjY2mHSssWYERuh1B1/tQ==", + "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/ua-parser-js": "^0.7.33", - "@wdio/config": "8.0.2", + "@wdio/config": "8.0.11", "@wdio/logger": "8.0.0", "@wdio/protocols": "8.0.0", - "@wdio/types": "8.0.0", - "@wdio/utils": "8.0.2", + "@wdio/types": "8.0.11", + "@wdio/utils": "8.0.11", "chrome-launcher": "^0.15.0", "edge-paths": "^2.1.0", "import-meta-resolve": "^2.1.0", - "puppeteer-core": "19.3.0", + "puppeteer-core": "19.4.0", "query-selector-shadow-dom": "^1.0.0", "ua-parser-js": "^1.0.1", "uuid": "^9.0.0", "which": "^3.0.0" }, "dependencies": { - "@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==", + "@wdio/config": { + "version": "8.0.11", + "resolved": "https://registry.npmjs.org/@wdio/config/-/config-8.0.11.tgz", + "integrity": "sha512-LR8n6TJfDzVtDmuge4EjOHiJKae73ZyvEwTQq3tokovRIbIMaVkfsRV9iqEZiRgohy14ehAREwNgn67j77ucYA==", + "dev": true, + "requires": { + "@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": "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" + } + }, + "@wdio/utils": { + "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": "8.0.0", + "@wdio/types": "8.0.11", + "import-meta-resolve": "^2.2.0", + "p-iteration": "^1.1.8" + } + }, + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "requires": { + "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", + "integrity": "sha512-ull455NHSHI/Y1FqGaaYFaLGkNMMJbavMrEGFXG/PGrg6y7sutWHUHrz6gy6WEBH6akM1M414dWKCNs+IhKdiQ==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "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.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", @@ -17286,13 +18012,19 @@ "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.1077862", - "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1077862.tgz", - "integrity": "sha512-4xhfUhjBf1rE3XD+/VYoKls2fxBE0rG3j1C4b1Ak6hnz9WiwzpMKX7edIfsiPIGRqVZfosu+igxnzVnDhe1T1w==", + "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": { @@ -19729,10 +20461,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" @@ -20319,17 +21050,6 @@ "whatwg-url": "^11.0.0", "ws": "^8.11.0", "xml-name-validator": "^4.0.0" - }, - "dependencies": { - "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==", - "requires": { - "agent-base": "6", - "debug": "4" - } - } } }, "json-buffer": { @@ -20441,6 +21161,12 @@ "graceful-fs": "^4.1.11" } }, + "ky": { + "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", "resolved": "https://registry.npmjs.org/last-run/-/last-run-1.1.1.tgz", @@ -20537,7 +21263,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 } } @@ -20886,9 +21612,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": { @@ -22368,14 +23094,14 @@ "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" }, "puppeteer-core": { - "version": "19.3.0", - "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-19.3.0.tgz", - "integrity": "sha512-P8VAAOBnBJo/7DKJnj1b0K9kZBF2D8lkdL94CjJ+DZKCp182LQqYemPI9omUSZkh4bgykzXjZhaVR1qtddTTQg==", + "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.1056733", + "devtools-protocol": "0.0.1068969", "extract-zip": "2.0.1", "https-proxy-agent": "5.0.1", "proxy-from-env": "1.1.0", @@ -22386,21 +23112,11 @@ }, "dependencies": { "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.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.10.0", "resolved": "https://registry.npmjs.org/ws/-/ws-8.10.0.tgz", @@ -22417,9 +23133,9 @@ "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": { @@ -24123,9 +24839,9 @@ "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": { @@ -24499,18 +25215,18 @@ } }, "webdriver": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/webdriver/-/webdriver-8.0.2.tgz", - "integrity": "sha512-tFp935CNs1pczjns26tsfBHhrpq6r9g9MrAIgzPvNfKZzNNpaiY2qXtq2OkPQQxjCZchitNcAmaTz2k251SSNA==", + "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", "@types/ws": "^8.5.3", - "@wdio/config": "8.0.2", + "@wdio/config": "8.0.11", "@wdio/logger": "8.0.0", "@wdio/protocols": "8.0.0", - "@wdio/types": "8.0.0", - "@wdio/utils": "8.0.2", + "@wdio/types": "8.0.11", + "@wdio/utils": "8.0.11", "deepmerge-ts": "^4.2.2", "got": "^12.1.0", "ky": "^0.32.1", @@ -24532,11 +25248,51 @@ "defer-to-connect": "^2.0.1" } }, - "@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/config": { + "version": "8.0.11", + "resolved": "https://registry.npmjs.org/@wdio/config/-/config-8.0.11.tgz", + "integrity": "sha512-LR8n6TJfDzVtDmuge4EjOHiJKae73ZyvEwTQq3tokovRIbIMaVkfsRV9iqEZiRgohy14ehAREwNgn67j77ucYA==", + "dev": true, + "requires": { + "@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": "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" + } + }, + "@wdio/utils": { + "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": "8.0.0", + "@wdio/types": "8.0.11", + "import-meta-resolve": "^2.2.0", + "p-iteration": "^1.1.8" + } + }, + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0" + } }, "cacheable-lookup": { "version": "7.0.0", @@ -24559,12 +25315,41 @@ "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", + "integrity": "sha512-ull455NHSHI/Y1FqGaaYFaLGkNMMJbavMrEGFXG/PGrg6y7sutWHUHrz6gy6WEBH6akM1M414dWKCNs+IhKdiQ==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + } + }, "got": { "version": "12.5.3", "resolved": "https://registry.npmjs.org/got/-/got-12.5.3.tgz", @@ -24594,11 +25379,14 @@ "resolve-alpn": "^1.2.0" } }, - "ky": { - "version": "0.32.2", - "resolved": "https://registry.npmjs.org/ky/-/ky-0.32.2.tgz", - "integrity": "sha512-eBJeF6IXNwX5rksdwBrE2rIJrU2d84GoTvdM7OmmTIwUVXEMd72wIwvT+nyhrqtv7AzbSNsWz7yRsHgVhj1uog==", - "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" + } }, "lowercase-keys": { "version": "3.0.0", @@ -24612,6 +25400,15 @@ "integrity": "sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==", "dev": true }, + "minimatch": { + "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", @@ -24624,6 +25421,53 @@ "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", @@ -24632,49 +25476,86 @@ "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": "8.0.5", - "resolved": "https://registry.npmjs.org/webdriverio/-/webdriverio-8.0.5.tgz", - "integrity": "sha512-UUP5yWrwPE9U737r+7H0vYWckIGk87VklhALpymVkg7DEmlHP2c7/EI3ZWRZnXqyP5bCOVImuOvxEjiNOH1f+g==", + "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": "8.0.2", - "@wdio/globals": "8.0.5", + "@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.0", - "@wdio/utils": "8.0.2", + "@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": "8.0.2", - "devtools-protocol": "^0.0.1077862", + "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.zip": "^4.2.0", "minimatch": "^5.0.0", - "puppeteer-core": "19.3.0", + "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": "8.0.2" + "webdriver": "8.0.11" }, "dependencies": { - "@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/config": { + "version": "8.0.11", + "resolved": "https://registry.npmjs.org/@wdio/config/-/config-8.0.11.tgz", + "integrity": "sha512-LR8n6TJfDzVtDmuge4EjOHiJKae73ZyvEwTQq3tokovRIbIMaVkfsRV9iqEZiRgohy14ehAREwNgn67j77ucYA==", + "dev": true, + "requires": { + "@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": "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" + } + }, + "@wdio/utils": { + "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": "8.0.0", + "@wdio/types": "8.0.11", + "import-meta-resolve": "^2.2.0", + "p-iteration": "^1.1.8" + } }, "brace-expansion": { "version": "2.0.1", @@ -24685,12 +25566,50 @@ "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", + "integrity": "sha512-ull455NHSHI/Y1FqGaaYFaLGkNMMJbavMrEGFXG/PGrg6y7sutWHUHrz6gy6WEBH6akM1M414dWKCNs+IhKdiQ==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "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.1", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.1.tgz", @@ -24699,6 +25618,59 @@ "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 } } }, From afdd2d88212ca7a3fa014db43937f775aff1220b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 12 Dec 2022 07:29:38 -0800 Subject: [PATCH 64/73] chore(deps): bump @typescript-eslint/eslint-plugin from 5.44.0 to 5.46.0 (#6697) Bumps [@typescript-eslint/eslint-plugin](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/eslint-plugin) from 5.44.0 to 5.46.0. - [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases) - [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/eslint-plugin/CHANGELOG.md) - [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v5.46.0/packages/eslint-plugin) --- updated-dependencies: - dependency-name: "@typescript-eslint/eslint-plugin" dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 232 +++++++++++++++++++++++----------------------- 1 file changed, 116 insertions(+), 116 deletions(-) diff --git a/package-lock.json b/package-lock.json index c0936828c..d404d4631 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1175,14 +1175,14 @@ } }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "5.44.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.44.0.tgz", - "integrity": "sha512-j5ULd7FmmekcyWeArx+i8x7sdRHzAtXTkmDPthE4amxZOWKFK7bomoJ4r7PJ8K7PoMzD16U8MmuZFAonr1ERvw==", + "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.44.0", - "@typescript-eslint/type-utils": "5.44.0", - "@typescript-eslint/utils": "5.44.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", @@ -1208,13 +1208,13 @@ } }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/scope-manager": { - "version": "5.44.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.44.0.tgz", - "integrity": "sha512-2pKml57KusI0LAhgLKae9kwWeITZ7IsZs77YxyNyIVOwQ1kToyXRaJLl+uDEXzMN5hnobKUOo2gKntK9H1YL8g==", + "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.44.0", - "@typescript-eslint/visitor-keys": "5.44.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" @@ -1225,9 +1225,9 @@ } }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/types": { - "version": "5.44.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.44.0.tgz", - "integrity": "sha512-Tp+zDnHmGk4qKR1l+Y1rBvpjpm5tGXX339eAlRBDg+kgZkz9Bw+pqi4dyseOZMsGuSH69fYfPJCBKBrbPCxYFQ==", + "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" @@ -1238,12 +1238,12 @@ } }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/visitor-keys": { - "version": "5.44.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.44.0.tgz", - "integrity": "sha512-a48tLG8/4m62gPFbJ27FxwCOqPKxsb8KC3HkmYoq2As/4YyjQl1jDbRr1s63+g4FS/iIehjmN3L5UjmKva1HzQ==", + "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.44.0", + "@typescript-eslint/types": "5.46.0", "eslint-visitor-keys": "^3.3.0" }, "engines": { @@ -1301,13 +1301,13 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "5.44.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.44.0.tgz", - "integrity": "sha512-A1u0Yo5wZxkXPQ7/noGkRhV4J9opcymcr31XQtOzcc5nO/IHN2E2TPMECKWYpM3e6olWEM63fq/BaL1wEYnt/w==", + "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.44.0", - "@typescript-eslint/utils": "5.44.0", + "@typescript-eslint/typescript-estree": "5.46.0", + "@typescript-eslint/utils": "5.46.0", "debug": "^4.3.4", "tsutils": "^3.21.0" }, @@ -1328,9 +1328,9 @@ } }, "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/types": { - "version": "5.44.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.44.0.tgz", - "integrity": "sha512-Tp+zDnHmGk4qKR1l+Y1rBvpjpm5tGXX339eAlRBDg+kgZkz9Bw+pqi4dyseOZMsGuSH69fYfPJCBKBrbPCxYFQ==", + "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" @@ -1341,13 +1341,13 @@ } }, "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/typescript-estree": { - "version": "5.44.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.44.0.tgz", - "integrity": "sha512-M6Jr+RM7M5zeRj2maSfsZK2660HKAJawv4Ud0xT+yauyvgrsHu276VtXlKDFnEmhG+nVEd0fYZNXGoAgxwDWJw==", + "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.44.0", - "@typescript-eslint/visitor-keys": "5.44.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", @@ -1368,12 +1368,12 @@ } }, "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/visitor-keys": { - "version": "5.44.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.44.0.tgz", - "integrity": "sha512-a48tLG8/4m62gPFbJ27FxwCOqPKxsb8KC3HkmYoq2As/4YyjQl1jDbRr1s63+g4FS/iIehjmN3L5UjmKva1HzQ==", + "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.44.0", + "@typescript-eslint/types": "5.46.0", "eslint-visitor-keys": "^3.3.0" }, "engines": { @@ -1427,16 +1427,16 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "5.44.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.44.0.tgz", - "integrity": "sha512-fMzA8LLQ189gaBjS0MZszw5HBdZgVwxVFShCO3QN+ws3GlPkcy9YuS3U4wkT6su0w+Byjq3mS3uamy9HE4Yfjw==", + "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.44.0", - "@typescript-eslint/types": "5.44.0", - "@typescript-eslint/typescript-estree": "5.44.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" @@ -1453,13 +1453,13 @@ } }, "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/scope-manager": { - "version": "5.44.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.44.0.tgz", - "integrity": "sha512-2pKml57KusI0LAhgLKae9kwWeITZ7IsZs77YxyNyIVOwQ1kToyXRaJLl+uDEXzMN5hnobKUOo2gKntK9H1YL8g==", + "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.44.0", - "@typescript-eslint/visitor-keys": "5.44.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" @@ -1470,9 +1470,9 @@ } }, "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/types": { - "version": "5.44.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.44.0.tgz", - "integrity": "sha512-Tp+zDnHmGk4qKR1l+Y1rBvpjpm5tGXX339eAlRBDg+kgZkz9Bw+pqi4dyseOZMsGuSH69fYfPJCBKBrbPCxYFQ==", + "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" @@ -1483,13 +1483,13 @@ } }, "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/typescript-estree": { - "version": "5.44.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.44.0.tgz", - "integrity": "sha512-M6Jr+RM7M5zeRj2maSfsZK2660HKAJawv4Ud0xT+yauyvgrsHu276VtXlKDFnEmhG+nVEd0fYZNXGoAgxwDWJw==", + "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.44.0", - "@typescript-eslint/visitor-keys": "5.44.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", @@ -1510,12 +1510,12 @@ } }, "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/visitor-keys": { - "version": "5.44.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.44.0.tgz", - "integrity": "sha512-a48tLG8/4m62gPFbJ27FxwCOqPKxsb8KC3HkmYoq2As/4YyjQl1jDbRr1s63+g4FS/iIehjmN3L5UjmKva1HzQ==", + "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.44.0", + "@typescript-eslint/types": "5.46.0", "eslint-visitor-keys": "^3.3.0" }, "engines": { @@ -15471,14 +15471,14 @@ } }, "@typescript-eslint/eslint-plugin": { - "version": "5.44.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.44.0.tgz", - "integrity": "sha512-j5ULd7FmmekcyWeArx+i8x7sdRHzAtXTkmDPthE4amxZOWKFK7bomoJ4r7PJ8K7PoMzD16U8MmuZFAonr1ERvw==", + "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.44.0", - "@typescript-eslint/type-utils": "5.44.0", - "@typescript-eslint/utils": "5.44.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", @@ -15488,28 +15488,28 @@ }, "dependencies": { "@typescript-eslint/scope-manager": { - "version": "5.44.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.44.0.tgz", - "integrity": "sha512-2pKml57KusI0LAhgLKae9kwWeITZ7IsZs77YxyNyIVOwQ1kToyXRaJLl+uDEXzMN5hnobKUOo2gKntK9H1YL8g==", + "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.44.0", - "@typescript-eslint/visitor-keys": "5.44.0" + "@typescript-eslint/types": "5.46.0", + "@typescript-eslint/visitor-keys": "5.46.0" } }, "@typescript-eslint/types": { - "version": "5.44.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.44.0.tgz", - "integrity": "sha512-Tp+zDnHmGk4qKR1l+Y1rBvpjpm5tGXX339eAlRBDg+kgZkz9Bw+pqi4dyseOZMsGuSH69fYfPJCBKBrbPCxYFQ==", + "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.44.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.44.0.tgz", - "integrity": "sha512-a48tLG8/4m62gPFbJ27FxwCOqPKxsb8KC3HkmYoq2As/4YyjQl1jDbRr1s63+g4FS/iIehjmN3L5UjmKva1HzQ==", + "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.44.0", + "@typescript-eslint/types": "5.46.0", "eslint-visitor-keys": "^3.3.0" } } @@ -15540,31 +15540,31 @@ } }, "@typescript-eslint/type-utils": { - "version": "5.44.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.44.0.tgz", - "integrity": "sha512-A1u0Yo5wZxkXPQ7/noGkRhV4J9opcymcr31XQtOzcc5nO/IHN2E2TPMECKWYpM3e6olWEM63fq/BaL1wEYnt/w==", + "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.44.0", - "@typescript-eslint/utils": "5.44.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.44.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.44.0.tgz", - "integrity": "sha512-Tp+zDnHmGk4qKR1l+Y1rBvpjpm5tGXX339eAlRBDg+kgZkz9Bw+pqi4dyseOZMsGuSH69fYfPJCBKBrbPCxYFQ==", + "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.44.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.44.0.tgz", - "integrity": "sha512-M6Jr+RM7M5zeRj2maSfsZK2660HKAJawv4Ud0xT+yauyvgrsHu276VtXlKDFnEmhG+nVEd0fYZNXGoAgxwDWJw==", + "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.44.0", - "@typescript-eslint/visitor-keys": "5.44.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", @@ -15573,12 +15573,12 @@ } }, "@typescript-eslint/visitor-keys": { - "version": "5.44.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.44.0.tgz", - "integrity": "sha512-a48tLG8/4m62gPFbJ27FxwCOqPKxsb8KC3HkmYoq2As/4YyjQl1jDbRr1s63+g4FS/iIehjmN3L5UjmKva1HzQ==", + "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.44.0", + "@typescript-eslint/types": "5.46.0", "eslint-visitor-keys": "^3.3.0" } } @@ -15608,45 +15608,45 @@ } }, "@typescript-eslint/utils": { - "version": "5.44.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.44.0.tgz", - "integrity": "sha512-fMzA8LLQ189gaBjS0MZszw5HBdZgVwxVFShCO3QN+ws3GlPkcy9YuS3U4wkT6su0w+Byjq3mS3uamy9HE4Yfjw==", + "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.44.0", - "@typescript-eslint/types": "5.44.0", - "@typescript-eslint/typescript-estree": "5.44.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.44.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.44.0.tgz", - "integrity": "sha512-2pKml57KusI0LAhgLKae9kwWeITZ7IsZs77YxyNyIVOwQ1kToyXRaJLl+uDEXzMN5hnobKUOo2gKntK9H1YL8g==", + "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.44.0", - "@typescript-eslint/visitor-keys": "5.44.0" + "@typescript-eslint/types": "5.46.0", + "@typescript-eslint/visitor-keys": "5.46.0" } }, "@typescript-eslint/types": { - "version": "5.44.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.44.0.tgz", - "integrity": "sha512-Tp+zDnHmGk4qKR1l+Y1rBvpjpm5tGXX339eAlRBDg+kgZkz9Bw+pqi4dyseOZMsGuSH69fYfPJCBKBrbPCxYFQ==", + "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.44.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.44.0.tgz", - "integrity": "sha512-M6Jr+RM7M5zeRj2maSfsZK2660HKAJawv4Ud0xT+yauyvgrsHu276VtXlKDFnEmhG+nVEd0fYZNXGoAgxwDWJw==", + "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.44.0", - "@typescript-eslint/visitor-keys": "5.44.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", @@ -15655,12 +15655,12 @@ } }, "@typescript-eslint/visitor-keys": { - "version": "5.44.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.44.0.tgz", - "integrity": "sha512-a48tLG8/4m62gPFbJ27FxwCOqPKxsb8KC3HkmYoq2As/4YyjQl1jDbRr1s63+g4FS/iIehjmN3L5UjmKva1HzQ==", + "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.44.0", + "@typescript-eslint/types": "5.46.0", "eslint-visitor-keys": "^3.3.0" } }, From f63c19083c071525f57df5ff7be7662402abbfe2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 12 Dec 2022 08:19:40 -0800 Subject: [PATCH 65/73] chore(deps): bump typescript from 4.9.3 to 4.9.4 (#6696) Bumps [typescript](https://github.com/Microsoft/TypeScript) from 4.9.3 to 4.9.4. - [Release notes](https://github.com/Microsoft/TypeScript/releases) - [Commits](https://github.com/Microsoft/TypeScript/compare/v4.9.3...v4.9.4) --- updated-dependencies: - dependency-name: typescript dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 373 +--------------------------------------------- 1 file changed, 6 insertions(+), 367 deletions(-) diff --git a/package-lock.json b/package-lock.json index d404d4631..cf1184897 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1557,194 +1557,6 @@ "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@wdio/config": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@wdio/config/-/config-8.0.2.tgz", - "integrity": "sha512-sLrNT6BXlWpfZS0FODxl628bCKtqHqD3TU31+6av3TnNfa142hQrbGf0u5birtU8c3Qacch4ycA3pmQ1xePGRA==", - "dev": true, - "dependencies": { - "@wdio/logger": "8.0.0", - "@wdio/types": "8.0.0", - "@wdio/utils": "8.0.2", - "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": "^16.13 || >=18" - } - }, - "node_modules/@wdio/config/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/@wdio/config/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/config/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/config/node_modules/glob": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-8.0.3.tgz", - "integrity": "sha512-ull455NHSHI/Y1FqGaaYFaLGkNMMJbavMrEGFXG/PGrg6y7sutWHUHrz6gy6WEBH6akM1M414dWKCNs+IhKdiQ==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^5.0.1", - "once": "^1.3.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@wdio/config/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/config/node_modules/minimatch": { - "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" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@wdio/config/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/@wdio/config/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/@wdio/config/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/config/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/config/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/config/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/@wdio/globals": { "version": "8.0.12", "resolved": "https://registry.npmjs.org/@wdio/globals/-/globals-8.0.12.tgz", @@ -2031,32 +1843,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@wdio/types": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@wdio/types/-/types-8.0.0.tgz", - "integrity": "sha512-6Qt4NmCJrxtbZLxCJBSW68Q4olvHGLoy5mOBaZhPC5FUEmxwhMAtq5e3zrAIpnHEMwl3RUDnMnSO9dApI7a7IQ==", - "dev": true, - "dependencies": { - "@types/node": "^18.0.0" - }, - "engines": { - "node": "^16.13 || >=18" - } - }, - "node_modules/@wdio/utils": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@wdio/utils/-/utils-8.0.2.tgz", - "integrity": "sha512-3AAShhA1uZV58E/eXRsyA0sHfwlAlmXKH5U202SYwFcYHV/c0zPu56p/ndohsyMmh+0UxgFpHEbTKiI4dhhf3A==", - "dev": true, - "dependencies": { - "@wdio/logger": "8.0.0", - "@wdio/types": "8.0.0", - "p-iteration": "^1.1.8" - }, - "engines": { - "node": "^16.13 || >=18" - } - }, "node_modules/@yarnpkg/lockfile": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz", @@ -13060,9 +12846,9 @@ "dev": true }, "node_modules/typescript": { - "version": "4.9.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.3.tgz", - "integrity": "sha512-CIfGzTelbKNEnLpLdGFgdyKhG23CKdKgQPOBc+OUNrkJ2vr+KSzsSV5kq5iWhEQbok+quxgGzrAtGWCyU7tHnA==", + "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", @@ -15687,133 +15473,6 @@ "eslint-visitor-keys": "^3.3.0" } }, - "@wdio/config": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@wdio/config/-/config-8.0.2.tgz", - "integrity": "sha512-sLrNT6BXlWpfZS0FODxl628bCKtqHqD3TU31+6av3TnNfa142hQrbGf0u5birtU8c3Qacch4ycA3pmQ1xePGRA==", - "dev": true, - "requires": { - "@wdio/logger": "8.0.0", - "@wdio/types": "8.0.0", - "@wdio/utils": "8.0.2", - "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" - }, - "dependencies": { - "brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "requires": { - "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", - "integrity": "sha512-ull455NHSHI/Y1FqGaaYFaLGkNMMJbavMrEGFXG/PGrg6y7sutWHUHrz6gy6WEBH6akM1M414dWKCNs+IhKdiQ==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^5.0.1", - "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.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/globals": { "version": "8.0.12", "resolved": "https://registry.npmjs.org/@wdio/globals/-/globals-8.0.12.tgz", @@ -16017,26 +15676,6 @@ } } }, - "@wdio/types": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@wdio/types/-/types-8.0.0.tgz", - "integrity": "sha512-6Qt4NmCJrxtbZLxCJBSW68Q4olvHGLoy5mOBaZhPC5FUEmxwhMAtq5e3zrAIpnHEMwl3RUDnMnSO9dApI7a7IQ==", - "dev": true, - "requires": { - "@types/node": "^18.0.0" - } - }, - "@wdio/utils": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@wdio/utils/-/utils-8.0.2.tgz", - "integrity": "sha512-3AAShhA1uZV58E/eXRsyA0sHfwlAlmXKH5U202SYwFcYHV/c0zPu56p/ndohsyMmh+0UxgFpHEbTKiI4dhhf3A==", - "dev": true, - "requires": { - "@wdio/logger": "8.0.0", - "@wdio/types": "8.0.0", - "p-iteration": "^1.1.8" - } - }, "@yarnpkg/lockfile": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz", @@ -24833,9 +24472,9 @@ "dev": true }, "typescript": { - "version": "4.9.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.3.tgz", - "integrity": "sha512-CIfGzTelbKNEnLpLdGFgdyKhG23CKdKgQPOBc+OUNrkJ2vr+KSzsSV5kq5iWhEQbok+quxgGzrAtGWCyU7tHnA==", + "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": { From 768d18468aebf8971a256ae605c41b50f01f4970 Mon Sep 17 00:00:00 2001 From: Neil Fraser Date: Mon, 12 Dec 2022 20:25:00 +0100 Subject: [PATCH 66/73] fix: Don't spellcheck number fields. (#6698) For the most part spellcheckers ignore numbers so this isn't an issue. But (for example) 'Infinity' is an English word that's hardcoded into Blockly, and other languages may spellcheck it as wrong. --- core/field_number.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/core/field_number.ts b/core/field_number.ts index b3e23d07c..a891f1c58 100644 --- a/core/field_number.ts +++ b/core/field_number.ts @@ -47,6 +47,9 @@ export class FieldNumber extends FieldInput { */ 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 From f528eccba7bc13ec730e5078b9b1747babad123e Mon Sep 17 00:00:00 2001 From: Christopher Allen Date: Wed, 14 Dec 2022 19:47:27 +0000 Subject: [PATCH 67/73] fix(tests): Fix bootstrapping of generators in compressed mode (#6703) Previously we had code that would, in uncompiled mode, make sure that javascriptGenerator etc. were set to the corresponding module exports object (by fetching it with goog.module.get), but in compressed mode we made no effort to set (e.g.) javascriptGenerator to Blockly.JavaScript, which is where that export actually appears in the namespace tree when loading the chunk via a `); } 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; + } +})(); From fccf8e436e5f1e74a73c66199d6300e3c5ad828c Mon Sep 17 00:00:00 2001 From: Neil Fraser Date: Thu, 15 Dec 2022 00:25:06 +0100 Subject: [PATCH 68/73] feat: Display a 'wait' cursor when opening trashcan (#6699) No visible change for regular case. But if there's thousands of blocks in the trash, the visual feedback that something's happening is better. Otherwise the user clicks, and that click will cause some random block to be spawned out of the trash. --- core/trashcan.ts | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/core/trashcan.ts b/core/trashcan.ts index 938dcf815..04c1196e7 100644 --- a/core/trashcan.ts +++ b/core/trashcan.ts @@ -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); } From 3be3d4a6ff752ad55b6aba505977052538cb7b5e Mon Sep 17 00:00:00 2001 From: Christopher Allen Date: Wed, 14 Dec 2022 23:48:12 +0000 Subject: [PATCH 69/73] chore: miscellaneous fixes to docs, style, and tests (#6705) * docs(icon): Better description for Icon.prototype.setVisible Also tweak description of getBlock. * docs(blocks): Fix typo in description of BlockDefinition * chore(tests): Factor out common goog:chromeOptions * chore(build): Minor style fixes --- core/blocks.ts | 2 +- core/icon.ts | 6 +++--- scripts/gulpfiles/build_tasks.js | 6 +++--- tests/generators/webdriver.js | 13 +++++++------ tests/mocha/webdriver.js | 16 +++++++--------- 5 files changed, 21 insertions(+), 22 deletions(-) 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/icon.ts b/core/icon.ts index 8cf0d6872..83051610a 100644 --- a/core/icon.ts +++ b/core/icon.ts @@ -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/scripts/gulpfiles/build_tasks.js b/scripts/gulpfiles/build_tasks.js index 9e8ab31ae..5538abc92 100644 --- a/scripts/gulpfiles/build_tasks.js +++ b/scripts/gulpfiles/build_tasks.js @@ -168,7 +168,7 @@ 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. } @@ -387,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 @@ -591,7 +591,7 @@ 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 diff --git a/tests/generators/webdriver.js b/tests/generators/webdriver.js index 71cb75991..202850746 100644 --- a/tests/generators/webdriver.js +++ b/tests/generators/webdriver.js @@ -42,22 +42,23 @@ async function runGeneratorsInBrowser(outputDir) { var options = { capabilities: { browserName: 'chrome', + 'goog:chromeOptions': { + args: ['--allow-file-access-from-files'], + }, }, 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', '--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://' + __dirname + '/index.html'; diff --git a/tests/mocha/webdriver.js b/tests/mocha/webdriver.js index 0fba49f87..e7eb99bc7 100644 --- a/tests/mocha/webdriver.js +++ b/tests/mocha/webdriver.js @@ -21,27 +21,25 @@ async function runMochaTestsInBrowser() { const options = { capabilities: { browserName: 'chrome', + 'goog:chromeOptions': { + args: ['--allow-file-access-from-files'], + }, }, services: [ ['selenium-standalone'], ], 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'); } const url = 'file://' + posixPath(__dirname) + '/index.html'; From 73cdc7410f6dcb4efc9391ff0e92282a83733a31 Mon Sep 17 00:00:00 2001 From: Beka Westberg Date: Thu, 15 Dec 2022 01:07:37 +0000 Subject: [PATCH 70/73] chore: update typings docs (#6704) --- typings/README.md | 16 ++++------------ 1 file changed, 4 insertions(+), 12 deletions(-) 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`. From 658e14ff75582c4c12bab7c5e4704625f148be9c Mon Sep 17 00:00:00 2001 From: Beka Westberg Date: Thu, 15 Dec 2022 01:08:15 +0000 Subject: [PATCH 71/73] fix: not being able to set field values to empty (#6702) --- core/field_input.ts | 17 +++-------------- tests/mocha/blocks/procedures_test.js | 15 ++++----------- 2 files changed, 7 insertions(+), 25 deletions(-) diff --git a/core/field_input.ts b/core/field_input.ts index 78fd63c7d..b7e36d05b 100644 --- a/core/field_input.ts +++ b/core/field_input.ts @@ -186,6 +186,7 @@ export abstract class FieldInput extends Field { */ 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. @@ -207,12 +208,9 @@ export abstract class FieldInput extends Field { * that this is a string. */ protected override doValueUpdate_(newValue: AnyDuringMigration) { + this.isDirty_ = true; this.isTextValid_ = true; this.value_ = newValue; - if (!this.isBeingEdited_) { - // This should only occur if setValue is triggered programmatically. - this.isDirty_ = true; - } } /** @@ -383,7 +381,6 @@ export abstract class FieldInput extends Field { htmlInput.value = htmlInput.defaultValue = this.getEditorText_(this.value_); htmlInput.setAttribute('data-untyped-default-value', this.value_); - htmlInput.setAttribute('data-old-value', ''); this.resizeEditor_(); @@ -493,15 +490,7 @@ export abstract class FieldInput extends Field { * @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_(); - } + this.setValue(this.getValueFromEditorText_(this.htmlInput_!.value)); } /** diff --git a/tests/mocha/blocks/procedures_test.js b/tests/mocha/blocks/procedures_test.js index 98bdf6e9d..0e5e944c3 100644 --- a/tests/mocha/blocks/procedures_test.js +++ b/tests/mocha/blocks/procedures_test.js @@ -484,10 +484,9 @@ suite('Procedures', function() { test('Simple, Input', function() { const defInput = this.defBlock.getField('NAME'); defInput.htmlInput_ = document.createElement('input'); - defInput.htmlInput_.setAttribute('data-old-value', 'proc name'); defInput.htmlInput_.setAttribute('data-untyped-default-value', 'proc name'); - defInput.htmlInput_.value = defInput.htmlInput_.getAttribute('data-old-value') + '2'; + defInput.htmlInput_.value = 'proc name2'; defInput.onHtmlInputChange_(null); chai.assert.equal( this.defBlock.getFieldValue('NAME'), 'proc name2'); @@ -497,7 +496,6 @@ suite('Procedures', function() { test('lower -> CAPS', function() { const defInput = this.defBlock.getField('NAME'); defInput.htmlInput_ = document.createElement('input'); - defInput.htmlInput_.setAttribute('data-old-value', 'proc name'); defInput.htmlInput_.setAttribute('data-untyped-default-value', 'proc name'); defInput.htmlInput_.value = 'PROC NAME'; @@ -512,7 +510,6 @@ suite('Procedures', function() { this.callBlock.setFieldValue('PROC NAME', 'NAME'); const defInput = this.defBlock.getField('NAME'); defInput.htmlInput_ = document.createElement('input'); - defInput.htmlInput_.setAttribute('data-old-value', 'PROC NAME'); defInput.htmlInput_.setAttribute('data-untyped-default-value', 'PROC NAME'); defInput.htmlInput_.value = 'proc name'; @@ -525,10 +522,9 @@ suite('Procedures', function() { test('Whitespace', function() { const defInput = this.defBlock.getField('NAME'); defInput.htmlInput_ = document.createElement('input'); - defInput.htmlInput_.setAttribute('data-old-value', 'proc name'); defInput.htmlInput_.setAttribute('data-untyped-default-value', 'proc name'); - defInput.htmlInput_.value = defInput.htmlInput_.getAttribute('data-old-value') + ' '; + defInput.htmlInput_.value = 'proc name '; defInput.onHtmlInputChange_(null); chai.assert.equal( this.defBlock.getFieldValue('NAME'), 'proc name'); @@ -538,12 +534,11 @@ suite('Procedures', function() { test('Whitespace then Text', function() { const defInput = this.defBlock.getField('NAME'); defInput.htmlInput_ = document.createElement('input'); - defInput.htmlInput_.setAttribute('data-old-value', 'proc name'); defInput.htmlInput_.setAttribute('data-untyped-default-value', 'proc name'); - defInput.htmlInput_.value = defInput.htmlInput_.getAttribute('data-old-value') + ' '; + defInput.htmlInput_.value = 'proc name '; defInput.onHtmlInputChange_(null); - defInput.htmlInput_.value = defInput.htmlInput_.getAttribute('data-old-value') + '2'; + defInput.htmlInput_.value = 'proc name 2'; defInput.onHtmlInputChange_(null); chai.assert.equal( this.defBlock.getFieldValue('NAME'), 'proc name 2'); @@ -553,7 +548,6 @@ suite('Procedures', function() { test('Set Empty', function() { const defInput = this.defBlock.getField('NAME'); defInput.htmlInput_ = document.createElement('input'); - defInput.htmlInput_.setAttribute('data-old-value', 'proc name'); defInput.htmlInput_.setAttribute('data-untyped-default-value', 'proc name'); defInput.htmlInput_.value = ''; @@ -568,7 +562,6 @@ suite('Procedures', function() { test('Set Empty, and Create New', function() { const defInput = this.defBlock.getField('NAME'); defInput.htmlInput_ = document.createElement('input'); - defInput.htmlInput_.setAttribute('data-old-value', 'proc name'); defInput.htmlInput_.setAttribute('data-untyped-default-value', 'proc name'); defInput.htmlInput_.value = ''; From d4f630c275257827273359edfa0d12ca70f2d54e Mon Sep 17 00:00:00 2001 From: Christopher Allen Date: Thu, 15 Dec 2022 17:38:20 +0000 Subject: [PATCH 72/73] chore: Rollup of 2022 Q4 updates from TranslateWiki (#6709) --- msg/json/bs.json | 12 +++++++ msg/json/de.json | 7 ++++ msg/json/diq.json | 6 ++++ msg/json/es.json | 24 ++++++++----- msg/json/fr.json | 4 +-- msg/json/he.json | 2 +- msg/json/hy.json | 79 ++++++++++++++++++++++++------------------- msg/json/is.json | 26 +++++++++----- msg/json/ja.json | 3 +- msg/json/ko.json | 7 ++-- msg/json/nb.json | 1 + msg/json/oc.json | 5 ++- msg/json/smn.json | 27 ++++++++++++++- msg/json/zh-hant.json | 21 ++++++------ 14 files changed, 154 insertions(+), 70 deletions(-) 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": "轉成英文小寫", From e4f42aa8fa817358739f4b85bd4777fa527ca9e1 Mon Sep 17 00:00:00 2001 From: Christopher Allen Date: Thu, 15 Dec 2022 17:50:52 +0000 Subject: [PATCH 73/73] chore(tests): Update metadata for 2022 Q4 release (#6710) --- tests/scripts/check_metadata.sh | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) 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'