From bd839d8d85fb766032daf9476df65522f1673493 Mon Sep 17 00:00:00 2001 From: GuillaumeOnepilot Date: Sat, 16 Dec 2023 21:31:36 +0100 Subject: [PATCH 01/23] feature: possibilities to merge blocks of different types --- src/components/block/index.ts | 12 ++++++++++-- src/components/modules/blockManager.ts | 2 +- src/components/tools/base.ts | 4 +++- src/components/tools/block.ts | 9 ++++++++- src/components/utils/blocks.ts | 4 ++++ types/tools/block-tool.d.ts | 15 ++++++++++++++- 6 files changed, 40 insertions(+), 6 deletions(-) diff --git a/src/components/block/index.ts b/src/components/block/index.ts index b47fe7811..882dd39b4 100644 --- a/src/components/block/index.ts +++ b/src/components/block/index.ts @@ -549,9 +549,10 @@ export default class Block extends EventsDispatcher { * Call plugins merge method * * @param {BlockToolData} data - data to merge + * @param {string} type - type of the block to merge */ - public async mergeWith(data: BlockToolData): Promise { - await this.toolInstance.merge(data); + public async mergeWith(data: BlockToolData, type: string): Promise { + await this.toolInstance.merge(data, type); } /** @@ -994,4 +995,11 @@ export default class Block extends EventsDispatcher { private dropInputsCache(): void { this.cachedInputs = []; } + + /** + * Get the list of mergeable blocks with the current block + */ + public get mergeableWithBlocks(): string[]|undefined { + return this.tool.mergeableBlocks; + } } diff --git a/src/components/modules/blockManager.ts b/src/components/modules/blockManager.ts index 7075d30fb..499008562 100644 --- a/src/components/modules/blockManager.ts +++ b/src/components/modules/blockManager.ts @@ -474,7 +474,7 @@ export default class BlockManager extends Module { const blockToMergeData = await blockToMerge.data; if (!_.isEmpty(blockToMergeData)) { - await targetBlock.mergeWith(blockToMergeData); + await targetBlock.mergeWith(blockToMergeData, targetBlock.name); } this.removeBlock(blockToMerge); diff --git a/src/components/tools/base.ts b/src/components/tools/base.ts index f89345a91..4b3a134b8 100644 --- a/src/components/tools/base.ts +++ b/src/components/tools/base.ts @@ -89,7 +89,9 @@ export enum InternalBlockToolSettings { /** * Tool paste config */ - PasteConfig = 'pasteConfig' + PasteConfig = 'pasteConfig', + + MergeableBlocks = 'mergeableBlocks' } /** diff --git a/src/components/tools/block.ts b/src/components/tools/block.ts index c5a0f337a..d557a32b1 100644 --- a/src/components/tools/block.ts +++ b/src/components/tools/block.ts @@ -35,7 +35,7 @@ export default class BlockTool extends BaseTool { /** * Tool's constructable blueprint */ - protected constructable: BlockToolConstructable; + public constructable: BlockToolConstructable; /** * Creates new Tool instance @@ -212,4 +212,11 @@ export default class BlockTool extends BaseTool { return baseConfig; } + + /** + * + */ + public get mergeableBlocks(): string[]|undefined { + return this.constructable[InternalBlockToolSettings.MergeableBlocks]; + } } diff --git a/src/components/utils/blocks.ts b/src/components/utils/blocks.ts index 92a802eef..dbe57dce6 100644 --- a/src/components/utils/blocks.ts +++ b/src/components/utils/blocks.ts @@ -14,6 +14,10 @@ import { isFunction, isString, log } from '../utils'; * @param blockToMerge - block to merge from */ export function areBlocksMergeable(targetBlock: Block, blockToMerge: Block): boolean { + if (blockToMerge.mergeableWithBlocks?.includes(targetBlock.name)) { + return true; + } + return targetBlock.mergeable && targetBlock.name === blockToMerge.name; } diff --git a/types/tools/block-tool.d.ts b/types/tools/block-tool.d.ts index 8c9bb858a..4bf673f81 100644 --- a/types/tools/block-tool.d.ts +++ b/types/tools/block-tool.d.ts @@ -12,6 +12,12 @@ import { TunesMenuConfig } from './tool-settings'; * @see {@link docs/tools.md} */ export interface BlockTool extends BaseTool { + + /** + * Block that can be merged with the block + */ + mergeableBlocks?: string[]; + /** * Sanitizer rules description */ @@ -40,8 +46,9 @@ export interface BlockTool extends BaseTool { * Method that specified how to merge two Blocks with same type. * Called by backspace at the beginning of the Block * @param {BlockToolData} blockData + * @param {string} type */ - merge?(blockData: BlockToolData): void; + merge?(blockData: BlockToolData, type: string): void; /** * On paste callback. Fired when pasted content can be substituted by a Tool @@ -92,6 +99,12 @@ export interface BlockToolConstructorOptions Date: Sat, 16 Dec 2023 22:41:22 +0100 Subject: [PATCH 02/23] fix: remove scope change --- src/components/tools/block.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/tools/block.ts b/src/components/tools/block.ts index d557a32b1..c2ec2f1b8 100644 --- a/src/components/tools/block.ts +++ b/src/components/tools/block.ts @@ -35,7 +35,7 @@ export default class BlockTool extends BaseTool { /** * Tool's constructable blueprint */ - public constructable: BlockToolConstructable; + protected constructable: BlockToolConstructable; /** * Creates new Tool instance From 810935b6094b0daf76486845a68ca130e9e2f670 Mon Sep 17 00:00:00 2001 From: GuillaumeOnepilot Date: Sat, 23 Dec 2023 15:14:59 +0100 Subject: [PATCH 03/23] feat: use convert config instead of defined property --- src/components/block/index.ts | 9 ++------- src/components/modules/blockManager.ts | 19 ++++++++++++++++++- src/components/tools/base.ts | 2 -- src/components/tools/block.ts | 7 ------- src/components/utils/blocks.ts | 5 ++++- types/tools/block-tool.d.ts | 11 ----------- 6 files changed, 24 insertions(+), 29 deletions(-) diff --git a/src/components/block/index.ts b/src/components/block/index.ts index 882dd39b4..a9034dfb4 100644 --- a/src/components/block/index.ts +++ b/src/components/block/index.ts @@ -389,6 +389,8 @@ export default class Block extends EventsDispatcher { * @returns {boolean} */ public get mergeable(): boolean { + console.log(this.toolInstance.merge); + return _.isFunction(this.toolInstance.merge); } @@ -995,11 +997,4 @@ export default class Block extends EventsDispatcher { private dropInputsCache(): void { this.cachedInputs = []; } - - /** - * Get the list of mergeable blocks with the current block - */ - public get mergeableWithBlocks(): string[]|undefined { - return this.tool.mergeableBlocks; - } } diff --git a/src/components/modules/blockManager.ts b/src/components/modules/blockManager.ts index 499008562..ecc4fc2bf 100644 --- a/src/components/modules/blockManager.ts +++ b/src/components/modules/blockManager.ts @@ -471,7 +471,24 @@ export default class BlockManager extends Module { * @returns {Promise} - the sequence that can be continued */ public async mergeBlocks(targetBlock: Block, blockToMerge: Block): Promise { - const blockToMergeData = await blockToMerge.data; + const data = await blockToMerge.data; + + const getBlockToolData = async (): Promise => { + const importConfig = targetBlock.tool.conversionConfig.import; + const exportConfig = blockToMerge.tool.conversionConfig.export; + + if (typeof importConfig === 'string') { + return { + [importConfig]: typeof exportConfig === 'string' ? data[exportConfig] : exportConfig(data), + }; + } + + return importConfig(await blockToMerge.exportDataAsString()); + }; + + const blockToMergeData = targetBlock.name !== blockToMerge.name + ? await getBlockToolData() + : data; if (!_.isEmpty(blockToMergeData)) { await targetBlock.mergeWith(blockToMergeData, targetBlock.name); diff --git a/src/components/tools/base.ts b/src/components/tools/base.ts index 4b3a134b8..ddfa7079c 100644 --- a/src/components/tools/base.ts +++ b/src/components/tools/base.ts @@ -90,8 +90,6 @@ export enum InternalBlockToolSettings { * Tool paste config */ PasteConfig = 'pasteConfig', - - MergeableBlocks = 'mergeableBlocks' } /** diff --git a/src/components/tools/block.ts b/src/components/tools/block.ts index c2ec2f1b8..c5a0f337a 100644 --- a/src/components/tools/block.ts +++ b/src/components/tools/block.ts @@ -212,11 +212,4 @@ export default class BlockTool extends BaseTool { return baseConfig; } - - /** - * - */ - public get mergeableBlocks(): string[]|undefined { - return this.constructable[InternalBlockToolSettings.MergeableBlocks]; - } } diff --git a/src/components/utils/blocks.ts b/src/components/utils/blocks.ts index dbe57dce6..f9219c13b 100644 --- a/src/components/utils/blocks.ts +++ b/src/components/utils/blocks.ts @@ -9,12 +9,15 @@ import { isFunction, isString, log } from '../utils'; * We can merge two blocks if: * - they have the same type * - they have a merge function (.mergeable = true) + * - If they have valid conversions config * * @param targetBlock - block to merge to * @param blockToMerge - block to merge from */ export function areBlocksMergeable(targetBlock: Block, blockToMerge: Block): boolean { - if (blockToMerge.mergeableWithBlocks?.includes(targetBlock.name)) { + if (blockToMerge.mergeable && + blockToMerge.tool.conversionConfig?.export !== undefined && + targetBlock.tool.conversionConfig?.import !== undefined) { return true; } diff --git a/types/tools/block-tool.d.ts b/types/tools/block-tool.d.ts index 4bf673f81..ea2642531 100644 --- a/types/tools/block-tool.d.ts +++ b/types/tools/block-tool.d.ts @@ -12,12 +12,6 @@ import { TunesMenuConfig } from './tool-settings'; * @see {@link docs/tools.md} */ export interface BlockTool extends BaseTool { - - /** - * Block that can be merged with the block - */ - mergeableBlocks?: string[]; - /** * Sanitizer rules description */ @@ -100,11 +94,6 @@ export interface BlockToolConstructorOptions Date: Sat, 23 Dec 2023 15:37:31 +0100 Subject: [PATCH 04/23] chore:: use built-in function for type check --- src/components/modules/blockManager.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/components/modules/blockManager.ts b/src/components/modules/blockManager.ts index ecc4fc2bf..db29d6d65 100644 --- a/src/components/modules/blockManager.ts +++ b/src/components/modules/blockManager.ts @@ -21,6 +21,7 @@ import { BlockChanged } from '../events'; import { clean } from '../utils/sanitizer'; import { convertStringToBlockData } from '../utils/blocks'; import PromiseQueue from '../utils/promise-queue'; +import { isString } from '../utils'; /** * @typedef {BlockManager} BlockManager @@ -477,9 +478,9 @@ export default class BlockManager extends Module { const importConfig = targetBlock.tool.conversionConfig.import; const exportConfig = blockToMerge.tool.conversionConfig.export; - if (typeof importConfig === 'string') { + if (isString(importConfig)) { return { - [importConfig]: typeof exportConfig === 'string' ? data[exportConfig] : exportConfig(data), + [importConfig]: isString(exportConfig) ? data[exportConfig] : exportConfig(data), }; } From f8460a2bccc41ac0a3d030f677e90c6cf6d551ee Mon Sep 17 00:00:00 2001 From: GuillaumeOnepilot Date: Sat, 23 Dec 2023 15:56:12 +0100 Subject: [PATCH 05/23] fix: remove console.log --- src/components/block/index.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/components/block/index.ts b/src/components/block/index.ts index a9034dfb4..c68d4eb7d 100644 --- a/src/components/block/index.ts +++ b/src/components/block/index.ts @@ -389,8 +389,6 @@ export default class Block extends EventsDispatcher { * @returns {boolean} */ public get mergeable(): boolean { - console.log(this.toolInstance.merge); - return _.isFunction(this.toolInstance.merge); } From 2074dd129200abd0164b48dbe88b18cc309fb3dc Mon Sep 17 00:00:00 2001 From: GuillaumeOnepilot Date: Sat, 23 Dec 2023 16:03:02 +0100 Subject: [PATCH 06/23] chore: remove styling added by mistakes --- src/components/tools/base.ts | 2 +- types/tools/block-tool.d.ts | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/src/components/tools/base.ts b/src/components/tools/base.ts index ddfa7079c..f89345a91 100644 --- a/src/components/tools/base.ts +++ b/src/components/tools/base.ts @@ -89,7 +89,7 @@ export enum InternalBlockToolSettings { /** * Tool paste config */ - PasteConfig = 'pasteConfig', + PasteConfig = 'pasteConfig' } /** diff --git a/types/tools/block-tool.d.ts b/types/tools/block-tool.d.ts index ea2642531..9b0e3bf05 100644 --- a/types/tools/block-tool.d.ts +++ b/types/tools/block-tool.d.ts @@ -93,7 +93,6 @@ export interface BlockToolConstructorOptions Date: Sun, 24 Dec 2023 17:30:11 +0100 Subject: [PATCH 07/23] test: add testing for different blocks types merging --- test/cypress/fixtures/tools/SimpleHeader.ts | 89 +++++++++++++++++++ .../tests/modules/BlockEvents/Backspace.cy.ts | 44 +++++++++ 2 files changed, 133 insertions(+) create mode 100644 test/cypress/fixtures/tools/SimpleHeader.ts diff --git a/test/cypress/fixtures/tools/SimpleHeader.ts b/test/cypress/fixtures/tools/SimpleHeader.ts new file mode 100644 index 000000000..71696b706 --- /dev/null +++ b/test/cypress/fixtures/tools/SimpleHeader.ts @@ -0,0 +1,89 @@ +import { + BaseTool, + BlockToolConstructorOptions, + BlockToolData, + ConversionConfig +} from '../../../../types'; + +/** + * Simplified Header for testing + */ +export class SimpleHeader implements BaseTool { + private _data: BlockToolData; + private element: HTMLHeadingElement; + + /** + * + * @param options - constructor options + */ + constructor({ data }: BlockToolConstructorOptions) { + this._data = data; + } + + /** + * Return Tool's view + * + * @returns {HTMLHeadingElement} + * @public + */ + public render(): HTMLHeadingElement { + this.element = document.createElement('h1'); + + this.element.innerHTML = this._data.text; + + return this.element; + } + + /** + * @param data - saved data to merger with current block + */ + public merge(data: BlockToolData): void { + this.data = { + text: this.data.text + data.text, + level: this.data.level, + }; + } + + /** + * Extract Tool's data from the view + * + * @param toolsContent - Text tools rendered view + */ + public save(toolsContent: HTMLHeadingElement): BlockToolData { + return { + text: toolsContent.innerHTML, + level: 1, + }; + } + + /** + * Allow Header to be converted to/from other blocks + */ + public static get conversionConfig(): ConversionConfig { + return { + export: 'text', // use 'text' property for other blocks + import: 'text', // fill 'text' property from other block's export string + }; + } + + /** + * Data getter + */ + private get data(): BlockToolData { + this._data.text = this.element.innerHTML; + this._data.level = 1; + + return this._data; + } + + /** + * Data setter + */ + private set data(data: BlockToolData) { + this._data = data; + + if (data.text !== undefined) { + this.element.innerHTML = this._data.text || ''; + } + } +} diff --git a/test/cypress/tests/modules/BlockEvents/Backspace.cy.ts b/test/cypress/tests/modules/BlockEvents/Backspace.cy.ts index ac988a0b0..72f2ae1df 100644 --- a/test/cypress/tests/modules/BlockEvents/Backspace.cy.ts +++ b/test/cypress/tests/modules/BlockEvents/Backspace.cy.ts @@ -1,5 +1,7 @@ import type EditorJS from '../../../../../types/index'; import Chainable = Cypress.Chainable; +import Header from '../../../../../example/tools/header/dist/header.mjs'; +import { SimpleHeader } from '../../../fixtures/tools/SimpleHeader'; /** @@ -293,6 +295,48 @@ describe('Backspace keydown', function () { .should('not.have.class', 'ce-toolbar--opened'); }); + it('should merge different types of blocks if they valid conversion config', function () { + cy.createEditor({ + tools: { + header: SimpleHeader, + }, + data: { + blocks: [ + { + id: 'block1', + type: 'header', + data: { + text: 'First block heading', + }, + }, + { + id: 'block2', + type: 'paragraph', + data: { + text: 'Second block paragraph', + }, + }, + ], + }, + }).as('editorInstance'); + + cy.get('[data-cy=editorjs]') + .find('.ce-paragraph') + .last() + .click() + .type('{home}') // move caret to the beginning + .type('{backspace}'); + + cy.get('@editorInstance') + .then(async (editor) => { + const { blocks } = await editor.save(); + + expect(blocks.length).to.eq(1); // one block has been removed + expect(blocks[0].id).to.eq('block1'); // second block is still here + expect(blocks[0].data.text).to.eq('First block headingSecond block paragraph'); // text has been merged + }); + }); + it('should simply set Caret to the end of the previous Block if Caret at the start of the Block but Blocks are not mergeable. Also, should close the Toolbox.', function () { /** * Mock of tool without merge method From 63703a93d6cf923e858c5daedd39901f3fce7ed7 Mon Sep 17 00:00:00 2001 From: GuillaumeOnepilot Date: Sun, 24 Dec 2023 17:37:35 +0100 Subject: [PATCH 08/23] fix: remove unused import --- test/cypress/tests/modules/BlockEvents/Backspace.cy.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/test/cypress/tests/modules/BlockEvents/Backspace.cy.ts b/test/cypress/tests/modules/BlockEvents/Backspace.cy.ts index 72f2ae1df..5b5e29976 100644 --- a/test/cypress/tests/modules/BlockEvents/Backspace.cy.ts +++ b/test/cypress/tests/modules/BlockEvents/Backspace.cy.ts @@ -1,6 +1,5 @@ import type EditorJS from '../../../../../types/index'; import Chainable = Cypress.Chainable; -import Header from '../../../../../example/tools/header/dist/header.mjs'; import { SimpleHeader } from '../../../fixtures/tools/SimpleHeader'; From 887a2ecebd2819c4ca71b628773af26b46da2680 Mon Sep 17 00:00:00 2001 From: GuillaumeOnepilot Date: Sat, 23 Mar 2024 20:42:41 +0100 Subject: [PATCH 09/23] fix: remove type argument --- src/components/block/index.ts | 5 ++--- src/components/modules/blockManager.ts | 2 +- types/tools/block-tool.d.ts | 3 +-- 3 files changed, 4 insertions(+), 6 deletions(-) diff --git a/src/components/block/index.ts b/src/components/block/index.ts index 4632e17d7..22c6dfa35 100644 --- a/src/components/block/index.ts +++ b/src/components/block/index.ts @@ -539,10 +539,9 @@ export default class Block extends EventsDispatcher { * Call plugins merge method * * @param {BlockToolData} data - data to merge - * @param {string} type - type of the block to merge */ - public async mergeWith(data: BlockToolData, type: string): Promise { - await this.toolInstance.merge(data, type); + public async mergeWith(data: BlockToolData): Promise { + this.toolInstance.merge(data); } /** diff --git a/src/components/modules/blockManager.ts b/src/components/modules/blockManager.ts index c4bcaebcb..cf7a1db1a 100644 --- a/src/components/modules/blockManager.ts +++ b/src/components/modules/blockManager.ts @@ -492,7 +492,7 @@ export default class BlockManager extends Module { : data; if (!_.isEmpty(blockToMergeData)) { - await targetBlock.mergeWith(blockToMergeData, targetBlock.name); + await targetBlock.mergeWith(blockToMergeData); } this.removeBlock(blockToMerge); diff --git a/types/tools/block-tool.d.ts b/types/tools/block-tool.d.ts index 9b0e3bf05..8c9bb858a 100644 --- a/types/tools/block-tool.d.ts +++ b/types/tools/block-tool.d.ts @@ -40,9 +40,8 @@ export interface BlockTool extends BaseTool { * Method that specified how to merge two Blocks with same type. * Called by backspace at the beginning of the Block * @param {BlockToolData} blockData - * @param {string} type */ - merge?(blockData: BlockToolData, type: string): void; + merge?(blockData: BlockToolData): void; /** * On paste callback. Fired when pasted content can be substituted by a Tool From b7a70426dfed1e3a835216426570f02428b29521 Mon Sep 17 00:00:00 2001 From: GuillaumeOnepilot Date: Sat, 23 Mar 2024 20:57:19 +0100 Subject: [PATCH 10/23] fix: use existing functions for data export --- src/components/modules/blockManager.ts | 23 +++++------------------ 1 file changed, 5 insertions(+), 18 deletions(-) diff --git a/src/components/modules/blockManager.ts b/src/components/modules/blockManager.ts index cf7a1db1a..3b56753c7 100644 --- a/src/components/modules/blockManager.ts +++ b/src/components/modules/blockManager.ts @@ -21,7 +21,6 @@ import { BlockChanged } from '../events'; import { clean } from '../utils/sanitizer'; import { convertStringToBlockData } from '../utils/blocks'; import PromiseQueue from '../utils/promise-queue'; -import { isString } from '../utils'; /** * @typedef {BlockManager} BlockManager @@ -472,24 +471,12 @@ export default class BlockManager extends Module { * @returns {Promise} - the sequence that can be continued */ public async mergeBlocks(targetBlock: Block, blockToMerge: Block): Promise { - const data = await blockToMerge.data; - - const getBlockToolData = async (): Promise => { - const importConfig = targetBlock.tool.conversionConfig.import; - const exportConfig = blockToMerge.tool.conversionConfig.export; - - if (isString(importConfig)) { - return { - [importConfig]: isString(exportConfig) ? data[exportConfig] : exportConfig(data), - }; - } - - return importConfig(await blockToMerge.exportDataAsString()); - }; - const blockToMergeData = targetBlock.name !== blockToMerge.name - ? await getBlockToolData() - : data; + ? convertStringToBlockData( + await blockToMerge.exportDataAsString(), + targetBlock.tool.conversionConfig + ) + : await blockToMerge.data; if (!_.isEmpty(blockToMergeData)) { await targetBlock.mergeWith(blockToMergeData); From 58ba6735749eab6359791b4d3e1d5f9f058a8e91 Mon Sep 17 00:00:00 2001 From: GuillaumeOnepilot Date: Sat, 23 Mar 2024 21:01:52 +0100 Subject: [PATCH 11/23] chore: update changelog --- docs/CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index a1b00479d..64ccef078 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -2,6 +2,7 @@ ### 2.30.0 +- `Improvement` — Ability to merge blocks with different types - `Fix` — `onChange` will be called when removing the entire text within a descendant element of a block. - `Fix` - Unexpected new line on Enter press with selected block without caret - `Fix` - Search input autofocus loosing after Block Tunes opening From f9718cae9b0e98c11ade38f9f27aaa66300cb3c9 Mon Sep 17 00:00:00 2001 From: GuillaumeOnepilot Date: Sat, 23 Mar 2024 22:19:16 +0100 Subject: [PATCH 12/23] fix: re put await --- src/components/block/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/block/index.ts b/src/components/block/index.ts index 89824257c..25e898f04 100644 --- a/src/components/block/index.ts +++ b/src/components/block/index.ts @@ -541,7 +541,7 @@ export default class Block extends EventsDispatcher { * @param {BlockToolData} data - data to merge */ public async mergeWith(data: BlockToolData): Promise { - this.toolInstance.merge(data); + await this.toolInstance.merge(data); } /** From 995d5eec6886d2a5d539a220118d19f3bf48794f Mon Sep 17 00:00:00 2001 From: GuillaumeOnepilot Date: Sat, 23 Mar 2024 22:20:38 +0100 Subject: [PATCH 13/23] fix: remove unnecessary check --- src/components/utils/blocks.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/components/utils/blocks.ts b/src/components/utils/blocks.ts index f9219c13b..360da5d68 100644 --- a/src/components/utils/blocks.ts +++ b/src/components/utils/blocks.ts @@ -15,8 +15,7 @@ import { isFunction, isString, log } from '../utils'; * @param blockToMerge - block to merge from */ export function areBlocksMergeable(targetBlock: Block, blockToMerge: Block): boolean { - if (blockToMerge.mergeable && - blockToMerge.tool.conversionConfig?.export !== undefined && + if (blockToMerge.tool.conversionConfig?.export !== undefined && targetBlock.tool.conversionConfig?.import !== undefined) { return true; } From 17059d0319c2fe09e8306046daf2170a4c0c0e29 Mon Sep 17 00:00:00 2001 From: GuillaumeOnepilot Date: Sat, 23 Mar 2024 22:21:02 +0100 Subject: [PATCH 14/23] fix: typo in test name --- test/cypress/tests/modules/BlockEvents/Backspace.cy.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/cypress/tests/modules/BlockEvents/Backspace.cy.ts b/test/cypress/tests/modules/BlockEvents/Backspace.cy.ts index 5b5e29976..c0ec8080e 100644 --- a/test/cypress/tests/modules/BlockEvents/Backspace.cy.ts +++ b/test/cypress/tests/modules/BlockEvents/Backspace.cy.ts @@ -294,7 +294,7 @@ describe('Backspace keydown', function () { .should('not.have.class', 'ce-toolbar--opened'); }); - it('should merge different types of blocks if they valid conversion config', function () { + it('should merge different types of blocks if they valid have a conversion config', function () { cy.createEditor({ tools: { header: SimpleHeader, From d59715b00d992e04ddbdb8950f5ee3f4e7b0b387 Mon Sep 17 00:00:00 2001 From: GuillaumeOnepilot Date: Sat, 23 Mar 2024 22:20:38 +0100 Subject: [PATCH 15/23] fix: re-add condition for merge --- src/components/utils/blocks.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/components/utils/blocks.ts b/src/components/utils/blocks.ts index 360da5d68..f9219c13b 100644 --- a/src/components/utils/blocks.ts +++ b/src/components/utils/blocks.ts @@ -15,7 +15,8 @@ import { isFunction, isString, log } from '../utils'; * @param blockToMerge - block to merge from */ export function areBlocksMergeable(targetBlock: Block, blockToMerge: Block): boolean { - if (blockToMerge.tool.conversionConfig?.export !== undefined && + if (blockToMerge.mergeable && + blockToMerge.tool.conversionConfig?.export !== undefined && targetBlock.tool.conversionConfig?.import !== undefined) { return true; } From f33445a12130d3598141adcd033e2199c75ee006 Mon Sep 17 00:00:00 2001 From: GuillaumeOnepilot Date: Wed, 27 Mar 2024 09:07:30 +0100 Subject: [PATCH 16/23] test: add caret position test --- .../tests/modules/BlockEvents/Backspace.cy.ts | 26 ++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/test/cypress/tests/modules/BlockEvents/Backspace.cy.ts b/test/cypress/tests/modules/BlockEvents/Backspace.cy.ts index c0ec8080e..7deff30d2 100644 --- a/test/cypress/tests/modules/BlockEvents/Backspace.cy.ts +++ b/test/cypress/tests/modules/BlockEvents/Backspace.cy.ts @@ -294,7 +294,7 @@ describe('Backspace keydown', function () { .should('not.have.class', 'ce-toolbar--opened'); }); - it('should merge different types of blocks if they valid have a conversion config', function () { + it('should merge different types of blocks if they valid have a conversion config. Also, should close the Toolbox. Caret should be places in a place of glue', function () { cy.createEditor({ tools: { header: SimpleHeader, @@ -334,6 +334,30 @@ describe('Backspace keydown', function () { expect(blocks[0].id).to.eq('block1'); // second block is still here expect(blocks[0].data.text).to.eq('First block headingSecond block paragraph'); // text has been merged }); + + /** + * Caret is set to the place of merging + */ + cy.window() + .then((window) => { + const selection = window.getSelection(); + const range = selection.getRangeAt(0); + + cy.get('[data-cy=editorjs]') + .find('[data-cy=block-wrapper]') + .should(($block) => { + expect($block[0].contains(range.startContainer)).to.be.true; + range.startContainer.normalize(); // glue merged text nodes + expect(range.startOffset).to.be.eq('First block heading'.length); + }); + }); + + /** + * Toolbox has been closed + */ + cy.get('[data-cy=editorjs]') + .find('.ce-toolbar') + .should('not.have.class', 'ce-toolbar--opened'); }); it('should simply set Caret to the end of the previous Block if Caret at the start of the Block but Blocks are not mergeable. Also, should close the Toolbox.', function () { From 238a1fecc04c46ee099b45c157d1cea09706b357 Mon Sep 17 00:00:00 2001 From: Peter Savchenko Date: Sat, 30 Mar 2024 23:02:21 +0300 Subject: [PATCH 17/23] fix caret issues, add sanitize --- package.json | 2 +- src/components/block/index.ts | 2 +- src/components/modules/blockEvents.ts | 9 +-- src/components/modules/blockManager.ts | 49 ++++++++++---- src/components/modules/caret.ts | 2 +- src/components/utils/blocks.ts | 37 ++++++++-- test/cypress/fixtures/tools/SimpleHeader.ts | 1 + .../tests/modules/BlockEvents/Backspace.cy.ts | 67 ++++++++++++++++++- test/cypress/tests/sanitisation.cy.ts | 43 +++++++++++- yarn.lock | 8 +-- 10 files changed, 189 insertions(+), 31 deletions(-) diff --git a/package.json b/package.json index 3bede1182..0de36944e 100644 --- a/package.json +++ b/package.json @@ -45,7 +45,7 @@ "@editorjs/code": "^2.7.0", "@editorjs/delimiter": "^1.2.0", "@editorjs/header": "^2.7.0", - "@editorjs/paragraph": "^2.11.3", + "@editorjs/paragraph": "^2.11.4", "@editorjs/simple-image": "^1.4.1", "@types/node": "^18.15.11", "chai-subset": "^1.6.0", diff --git a/src/components/block/index.ts b/src/components/block/index.ts index 25e898f04..a9977f2a6 100644 --- a/src/components/block/index.ts +++ b/src/components/block/index.ts @@ -550,7 +550,7 @@ export default class Block extends EventsDispatcher { * * @returns {object} */ - public async save(): Promise { + public async save(): Promise { const extractedBlock = await this.toolInstance.save(this.pluginsContent as HTMLElement); const tunesData: { [name: string]: BlockTuneData } = this.unavailableTunesData; diff --git a/src/components/modules/blockEvents.ts b/src/components/modules/blockEvents.ts index e6425789e..88b55ccb6 100644 --- a/src/components/modules/blockEvents.ts +++ b/src/components/modules/blockEvents.ts @@ -493,12 +493,9 @@ export default class BlockEvents extends Module { BlockManager .mergeBlocks(targetBlock, blockToMerge) .then(() => { - window.requestAnimationFrame(() => { - /** Restore caret position after merge */ - Caret.restoreCaret(targetBlock.pluginsContent as HTMLElement); - targetBlock.pluginsContent.normalize(); - Toolbar.close(); - }); + /** Restore caret position after merge */ + Caret.restoreCaret(targetBlock.pluginsContent as HTMLElement); + Toolbar.close(); }); } diff --git a/src/components/modules/blockManager.ts b/src/components/modules/blockManager.ts index 3b56753c7..0e3b7fab9 100644 --- a/src/components/modules/blockManager.ts +++ b/src/components/modules/blockManager.ts @@ -18,9 +18,10 @@ import { BlockAddedMutationType } from '../../../types/events/block/BlockAdded'; import { BlockMovedMutationType } from '../../../types/events/block/BlockMoved'; import { BlockChangedMutationType } from '../../../types/events/block/BlockChanged'; import { BlockChanged } from '../events'; -import { clean } from '../utils/sanitizer'; -import { convertStringToBlockData } from '../utils/blocks'; +import { clean, sanitizeBlocks } from '../utils/sanitizer'; +import { convertStringToBlockData, isBlockConvertable } from '../utils/blocks'; import PromiseQueue from '../utils/promise-queue'; +import { SavedData } from '../../../types/data-formats'; /** * @typedef {BlockManager} BlockManager @@ -69,7 +70,7 @@ export default class BlockManager extends Module { * * @returns {Block} */ - public get currentBlock(): Block { + public get currentBlock(): Block | undefined { return this._blocks[this.currentBlockIndex]; } @@ -471,17 +472,41 @@ export default class BlockManager extends Module { * @returns {Promise} - the sequence that can be continued */ public async mergeBlocks(targetBlock: Block, blockToMerge: Block): Promise { - const blockToMergeData = targetBlock.name !== blockToMerge.name - ? convertStringToBlockData( - await blockToMerge.exportDataAsString(), - targetBlock.tool.conversionConfig - ) - : await blockToMerge.data; - - if (!_.isEmpty(blockToMergeData)) { - await targetBlock.mergeWith(blockToMergeData); + let blockToMergeData: SavedData | undefined; + + /** + * We can merge: + * 1) Blocks with the same Tool if tool provides merge method + */ + if (targetBlock.name === blockToMerge.name && targetBlock.mergeable) { + blockToMergeData = await blockToMerge.save(); + + if (blockToMergeData === undefined) { + console.error('Could not merge Block. Failed to extract original Block data.'); + + return; + } + + const [ cleanData ] = sanitizeBlocks([ blockToMergeData ], targetBlock.tool.sanitizeConfig); + + await targetBlock.mergeWith(cleanData.data); + } + + /** + * 2) Blocks with different Tools if they provides conversionConfig + */ + if (targetBlock.mergeable && isBlockConvertable(blockToMerge, 'export') && isBlockConvertable(targetBlock, 'import')) { + const blockToMergeDataStringified = await blockToMerge.exportDataAsString(); + const cleanData = clean(blockToMergeDataStringified, targetBlock.tool.sanitizeConfig); + + blockToMergeData = convertStringToBlockData(cleanData, targetBlock.tool.conversionConfig); + } + + if (blockToMergeData === undefined || _.isEmpty(blockToMergeData)) { + return; } + await targetBlock.mergeWith(blockToMergeData); this.removeBlock(blockToMerge); this.currentBlockIndex = this._blocks.indexOf(targetBlock); } diff --git a/src/components/modules/caret.ts b/src/components/modules/caret.ts index 425c8d5e0..57d5c964d 100644 --- a/src/components/modules/caret.ts +++ b/src/components/modules/caret.ts @@ -50,7 +50,7 @@ export default class Caret extends Module { /** * If Block does not contain inputs, treat caret as "at start" */ - if (!currentBlock.focusable) { + if (!currentBlock?.focusable) { return true; } diff --git a/src/components/utils/blocks.ts b/src/components/utils/blocks.ts index f9219c13b..ebb5be7bb 100644 --- a/src/components/utils/blocks.ts +++ b/src/components/utils/blocks.ts @@ -3,6 +3,22 @@ import type { BlockToolData } from '../../../types/tools/block-tool-data'; import type Block from '../block'; import { isFunction, isString, log } from '../utils'; +/** + * Check if block has valid conversion config for export or import. + * + * @param block - block to check + * @param direction - export for block to merge from, import for block to merge to + */ +export function isBlockConvertable(block: Block, direction: 'export' | 'import'): boolean { + if (!block.tool.conversionConfig) { + return false; + } + + const exportProp = block.tool.conversionConfig[direction]; + + return isFunction(exportProp) || isString(exportProp); +} + /** * Check if two blocks could be merged. * @@ -15,13 +31,26 @@ import { isFunction, isString, log } from '../utils'; * @param blockToMerge - block to merge from */ export function areBlocksMergeable(targetBlock: Block, blockToMerge: Block): boolean { - if (blockToMerge.mergeable && - blockToMerge.tool.conversionConfig?.export !== undefined && - targetBlock.tool.conversionConfig?.import !== undefined) { + /** + * If target block has not 'merge' method, we can't merge blocks. + * + * Technically we can (through the conversion) but it will lead a target block delete and recreation, which is unexpected behavior. + */ + if (!targetBlock.mergeable) { + return false; + } + + /** + * Tool knows how to merge own data format + */ + if (targetBlock.name === blockToMerge.name) { return true; } - return targetBlock.mergeable && targetBlock.name === blockToMerge.name; + /** + * We can merge blocks if they have valid conversion config + */ + return isBlockConvertable(blockToMerge, 'export') && isBlockConvertable(targetBlock, 'import'); } /** diff --git a/test/cypress/fixtures/tools/SimpleHeader.ts b/test/cypress/fixtures/tools/SimpleHeader.ts index 71696b706..17cb89a9f 100644 --- a/test/cypress/fixtures/tools/SimpleHeader.ts +++ b/test/cypress/fixtures/tools/SimpleHeader.ts @@ -29,6 +29,7 @@ export class SimpleHeader implements BaseTool { public render(): HTMLHeadingElement { this.element = document.createElement('h1'); + this.element.contentEditable = 'true'; this.element.innerHTML = this._data.text; return this.element; diff --git a/test/cypress/tests/modules/BlockEvents/Backspace.cy.ts b/test/cypress/tests/modules/BlockEvents/Backspace.cy.ts index 7deff30d2..d9c8be04a 100644 --- a/test/cypress/tests/modules/BlockEvents/Backspace.cy.ts +++ b/test/cypress/tests/modules/BlockEvents/Backspace.cy.ts @@ -294,7 +294,7 @@ describe('Backspace keydown', function () { .should('not.have.class', 'ce-toolbar--opened'); }); - it('should merge different types of blocks if they valid have a conversion config. Also, should close the Toolbox. Caret should be places in a place of glue', function () { + it('should merge blocks of different types (Paragraph -> Header) if they have a valid conversion config. Also, should close the Toolbox. Caret should be places in a place of glue', function () { cy.createEditor({ tools: { header: SimpleHeader, @@ -360,6 +360,71 @@ describe('Backspace keydown', function () { .should('not.have.class', 'ce-toolbar--opened'); }); + it('should merge blocks of different types (Header -> Paragraph) if they have a valid conversion config. Also, should close the Toolbox. Caret should be places in a place of glue', function () { + cy.createEditor({ + tools: { + header: SimpleHeader, + }, + data: { + blocks: [ + { + id: 'block1', + type: 'paragraph', + data: { + text: 'First block paragraph', + }, + }, + { + id: 'block2', + type: 'header', + data: { + text: 'Second block heading', + }, + }, + ], + }, + }).as('editorInstance'); + + cy.get('[data-cy=editorjs]') + .find('[data-cy="block-wrapper"][data-id="block2"]') + .click() + .type('{home}') // move caret to the beginning + .type('{backspace}'); + + cy.get('@editorInstance') + .then(async (editor) => { + const { blocks } = await editor.save(); + + expect(blocks.length).to.eq(1); // one block has been removed + expect(blocks[0].id).to.eq('block1'); // second block is still here + expect(blocks[0].data.text).to.eq('First block paragraphSecond block heading'); // text has been merged + }); + + /** + * Caret is set to the place of merging + */ + cy.window() + .then((window) => { + const selection = window.getSelection(); + const range = selection.getRangeAt(0); + + cy.get('[data-cy=editorjs]') + .find('[data-cy=block-wrapper]') + .should(($block) => { + expect($block[0].contains(range.startContainer)).to.be.true; + range.startContainer.normalize(); // glue merged text nodes + expect(range.startOffset).to.be.eq('First block paragraph'.length); + }); + }); + + /** + * Toolbox has been closed + */ + cy.get('[data-cy=editorjs]') + .find('.ce-toolbar') + .should('not.have.class', 'ce-toolbar--opened'); + }); + it('should simply set Caret to the end of the previous Block if Caret at the start of the Block but Blocks are not mergeable. Also, should close the Toolbox.', function () { /** * Mock of tool without merge method diff --git a/test/cypress/tests/sanitisation.cy.ts b/test/cypress/tests/sanitisation.cy.ts index 62610444e..3096c383e 100644 --- a/test/cypress/tests/sanitisation.cy.ts +++ b/test/cypress/tests/sanitisation.cy.ts @@ -3,7 +3,7 @@ import { OutputData } from '../../../types/index'; /* eslint-disable @typescript-eslint/no-explicit-any */ -describe('Output sanitization', () => { +describe('Sanitizing', () => { context('Output should save inline formatting', () => { it('should save initial formatting for paragraph', () => { cy.createEditor({ @@ -74,4 +74,45 @@ describe('Output sanitization', () => { }); }); }); + + it('should sanitize unwanted html on blocks merging', function () { + cy.createEditor({ + data: { + blocks: [ + { + id: 'block1', + type: 'paragraph', + data: { + text: 'First block paragraph', + }, + }, + { + id: 'paragraph', + type: 'paragraph', + data: { + /** + * Tool does not support spans in its sanitization config + */ + text: 'Second XSS block heading', + }, + }, + ], + }, + }).as('editorInstance'); + + cy.get('[data-cy=editorjs]') + .find('.ce-paragraph') + .last() + .click() + .type('{home}') + .type('{backspace}'); + + cy.get('@editorInstance') + .then(async (editor) => { + const { blocks } = await editor.save(); + + expect(blocks[0].data.text).to.eq('First block paragraphSecond XSS block heading'); // text has been merged, span has been removed + }); + }); }); + diff --git a/yarn.lock b/yarn.lock index dd9c6c0af..bb99cad5d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -571,10 +571,10 @@ dependencies: "@codexteam/icons" "^0.0.5" -"@editorjs/paragraph@^2.11.3": - version "2.11.3" - resolved "https://registry.yarnpkg.com/@editorjs/paragraph/-/paragraph-2.11.3.tgz#fb438de863179739f18de7d8851671a0d8447923" - integrity sha512-ON72lhvhgWzPrq4VXpHUeut9bsFeJgVATDeL850FVToOwYHKvdsNpfu0VgxEodhkXgzU/IGl4FzdqC2wd3AJUQ== +"@editorjs/paragraph@^2.11.4": + version "2.11.4" + resolved "https://registry.yarnpkg.com/@editorjs/paragraph/-/paragraph-2.11.4.tgz#ee91fc2d97f0aa9790860854fd804ef5d83d988e" + integrity sha512-OuTINHoHrJwKxlpTm6FtiXazwagALJbP49hfbQWBOLTNiBICncqPe1hdGfgDpeEgH9ZEGZsJelhEDxw2iwcmPA== dependencies: "@codexteam/icons" "^0.0.4" From 8da5cfa12c2aa20d88a132a7b00b4e845d82e764 Mon Sep 17 00:00:00 2001 From: Peter Savchenko Date: Sun, 31 Mar 2024 00:50:19 +0300 Subject: [PATCH 18/23] make if-else statement more clear --- docs/CHANGELOG.md | 2 +- src/components/modules/blockManager.ts | 15 +++++++-------- src/components/utils/blocks.ts | 4 ++-- 3 files changed, 10 insertions(+), 11 deletions(-) diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index 64ccef078..c98cd547c 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -2,7 +2,7 @@ ### 2.30.0 -- `Improvement` — Ability to merge blocks with different types +- `Improvement` — The ability to merge blocks of different types (if both tools provide the conversionConfig) - `Fix` — `onChange` will be called when removing the entire text within a descendant element of a block. - `Fix` - Unexpected new line on Enter press with selected block without caret - `Fix` - Search input autofocus loosing after Block Tunes opening diff --git a/src/components/modules/blockManager.ts b/src/components/modules/blockManager.ts index 0e3b7fab9..b07ac7c3f 100644 --- a/src/components/modules/blockManager.ts +++ b/src/components/modules/blockManager.ts @@ -472,37 +472,36 @@ export default class BlockManager extends Module { * @returns {Promise} - the sequence that can be continued */ public async mergeBlocks(targetBlock: Block, blockToMerge: Block): Promise { - let blockToMergeData: SavedData | undefined; + let blockToMergeData: BlockToolData | undefined; /** * We can merge: * 1) Blocks with the same Tool if tool provides merge method */ if (targetBlock.name === blockToMerge.name && targetBlock.mergeable) { - blockToMergeData = await blockToMerge.save(); + const blockToMergeDataRaw = await blockToMerge.data; - if (blockToMergeData === undefined) { + if (_.isEmpty(blockToMergeDataRaw)) { console.error('Could not merge Block. Failed to extract original Block data.'); return; } - const [ cleanData ] = sanitizeBlocks([ blockToMergeData ], targetBlock.tool.sanitizeConfig); + const [ cleanData ] = sanitizeBlocks([ blockToMergeDataRaw ], targetBlock.tool.sanitizeConfig); - await targetBlock.mergeWith(cleanData.data); - } + blockToMergeData = cleanData; /** * 2) Blocks with different Tools if they provides conversionConfig */ - if (targetBlock.mergeable && isBlockConvertable(blockToMerge, 'export') && isBlockConvertable(targetBlock, 'import')) { + } else if (targetBlock.mergeable && isBlockConvertable(blockToMerge, 'export') && isBlockConvertable(targetBlock, 'import')) { const blockToMergeDataStringified = await blockToMerge.exportDataAsString(); const cleanData = clean(blockToMergeDataStringified, targetBlock.tool.sanitizeConfig); blockToMergeData = convertStringToBlockData(cleanData, targetBlock.tool.conversionConfig); } - if (blockToMergeData === undefined || _.isEmpty(blockToMergeData)) { + if (blockToMergeData === undefined) { return; } diff --git a/src/components/utils/blocks.ts b/src/components/utils/blocks.ts index ebb5be7bb..288e0057e 100644 --- a/src/components/utils/blocks.ts +++ b/src/components/utils/blocks.ts @@ -14,9 +14,9 @@ export function isBlockConvertable(block: Block, direction: 'export' | 'import') return false; } - const exportProp = block.tool.conversionConfig[direction]; + const conversionProp = block.tool.conversionConfig[direction]; - return isFunction(exportProp) || isString(exportProp); + return isFunction(conversionProp) || isString(conversionProp); } /** From 94d6ea55e66ed66db8ff07a766deb3ba8a047c5c Mon Sep 17 00:00:00 2001 From: Peter Savchenko Date: Sun, 31 Mar 2024 01:09:34 +0300 Subject: [PATCH 19/23] upgrade cypress --- .github/workflows/cypress.yml | 4 +- src/components/modules/blockManager.ts | 1 - yarn.lock | 318 +++++++++++++++++-------- 3 files changed, 217 insertions(+), 106 deletions(-) diff --git a/.github/workflows/cypress.yml b/.github/workflows/cypress.yml index 3d9c50a1b..c60e497d2 100644 --- a/.github/workflows/cypress.yml +++ b/.github/workflows/cypress.yml @@ -12,9 +12,9 @@ jobs: steps: - uses: actions/setup-node@v3 with: - node-version: 16 + node-version: 18 - uses: actions/checkout@v3 - - uses: cypress-io/github-action@v5 + - uses: cypress-io/github-action@v6 with: config: video=false browser: ${{ matrix.browser }} diff --git a/src/components/modules/blockManager.ts b/src/components/modules/blockManager.ts index b07ac7c3f..bfc9236be 100644 --- a/src/components/modules/blockManager.ts +++ b/src/components/modules/blockManager.ts @@ -21,7 +21,6 @@ import { BlockChanged } from '../events'; import { clean, sanitizeBlocks } from '../utils/sanitizer'; import { convertStringToBlockData, isBlockConvertable } from '../utils/blocks'; import PromiseQueue from '../utils/promise-queue'; -import { SavedData } from '../../../types/data-formats'; /** * @typedef {BlockManager} BlockManager diff --git a/yarn.lock b/yarn.lock index bb99cad5d..e3c475092 100644 --- a/yarn.lock +++ b/yarn.lock @@ -504,10 +504,10 @@ js-yaml "4.1.0" nyc "15.1.0" -"@cypress/request@^2.88.10": - version "2.88.11" - resolved "https://registry.yarnpkg.com/@cypress/request/-/request-2.88.11.tgz#5a4c7399bc2d7e7ed56e92ce5acb620c8b187047" - integrity sha512-M83/wfQ1EkspjkE2lNWNV5ui2Cv7UCv1swW1DqljahbzLVWltcsexQh8jYtuS/vzFXP+HySntGM83ZXA9fn17w== +"@cypress/request@2.88.12": + version "2.88.12" + resolved "https://registry.yarnpkg.com/@cypress/request/-/request-2.88.12.tgz#ba4911431738494a85e93fb04498cb38bc55d590" + integrity sha512-tOn+0mDZxASFM+cuAP9szGUGPI1HwWVSvdzm7V4cCsPdFTx6qMj29CwaQmRAMIEhORIUBFBsYROYJcveK4uOjA== dependencies: aws-sign2 "~0.7.0" aws4 "^1.8.0" @@ -524,7 +524,7 @@ performance-now "^2.1.0" qs "~6.10.3" safe-buffer "^5.1.2" - tough-cookie "~2.5.0" + tough-cookie "^4.1.3" tunnel-agent "^0.6.0" uuid "^8.3.2" @@ -848,14 +848,16 @@ integrity sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ== "@types/node@*": - version "18.14.6" - resolved "https://registry.yarnpkg.com/@types/node/-/node-18.14.6.tgz#ae1973dd2b1eeb1825695bb11ebfb746d27e3e93" - integrity sha512-93+VvleD3mXwlLI/xASjw0FzKcwzl3OdTCzm1LaRfqgS21gfFtK3zDXM5Op9TeeMsJVOaJ2VRDpT9q4Y3d0AvA== + version "20.12.2" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.12.2.tgz#9facdd11102f38b21b4ebedd9d7999663343d72e" + integrity sha512-zQ0NYO87hyN6Xrclcqp7f8ZbXNbRfoGWNcMvHTPQp9UUrwI0mI7XBz+cu7/W6/VClYo2g63B0cjull/srU7LgQ== + dependencies: + undici-types "~5.26.4" -"@types/node@^14.14.31": - version "14.18.42" - resolved "https://registry.yarnpkg.com/@types/node/-/node-14.18.42.tgz#fa39b2dc8e0eba61bdf51c66502f84e23b66e114" - integrity sha512-xefu+RBie4xWlK8hwAzGh3npDz/4VhF6icY/shU+zv/1fNn+ZVG7T7CRwe9LId9sAYRPxI+59QBPuKL3WpyGRg== +"@types/node@^16.18.39": + version "16.18.93" + resolved "https://registry.yarnpkg.com/@types/node/-/node-16.18.93.tgz#ed4950d2f13afafb2baed1bd098ddf162a4c7b81" + integrity sha512-epWuohp6c0bQt0j3RYCiP9x52axHVn+CjS1Rx1VjPwF+ySg8lrigH3yXGs88XqnA+jGM2qnSMuFTsBxft+hO1Q== "@types/node@^18.15.11": version "18.15.11" @@ -878,14 +880,14 @@ integrity sha512-0kSuKjAS0TrGLJ0M/+8MaFkGsQhZpB6pxOmvS3K8FYI72K//YmdfoW9X2qPsAKh1mkwxGD5zib9s1FIFed6E8g== "@types/sizzle@^2.3.2": - version "2.3.3" - resolved "https://registry.yarnpkg.com/@types/sizzle/-/sizzle-2.3.3.tgz#ff5e2f1902969d305225a047c8a0fd5c915cebef" - integrity sha512-JYM8x9EGF163bEyhdJBpR2QX1R5naCJHC8ucJylJ3w9/CVBaskdQ8WqBf8MmQrd1kRvp/a4TS8HJ+bxzR7ZJYQ== + version "2.3.8" + resolved "https://registry.yarnpkg.com/@types/sizzle/-/sizzle-2.3.8.tgz#518609aefb797da19bf222feb199e8f653ff7627" + integrity sha512-0vWLNK2D5MT9dg0iOo8GlKguPAU02QjmZitPEsXRuJXU/OGIOt9vT9Fc26wtYuavLxtO45v9PGleoL9Z0k1LHg== "@types/yauzl@^2.9.1": - version "2.10.0" - resolved "https://registry.yarnpkg.com/@types/yauzl/-/yauzl-2.10.0.tgz#b3248295276cf8c6f153ebe6a9aba0c988cb2599" - integrity sha512-Cn6WYCm0tXv8p6k+A8PvbDG763EDpBoTzHdA+Q/MF6H3sapGjCm9NzoaJncJS9tUKSuCoDs9XHxYYsQDgxR6kw== + version "2.10.3" + resolved "https://registry.yarnpkg.com/@types/yauzl/-/yauzl-2.10.3.tgz#e9b2808b4f109504a03cda958259876f61017999" + integrity sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q== dependencies: "@types/node" "*" @@ -1146,9 +1148,9 @@ astral-regex@^2.0.0: integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== async@^3.2.0: - version "3.2.4" - resolved "https://registry.yarnpkg.com/async/-/async-3.2.4.tgz#2d22e00f8cddeb5fde5dd33522b56d1cf569a81c" - integrity sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ== + version "3.2.5" + resolved "https://registry.yarnpkg.com/async/-/async-3.2.5.tgz#ebd52a8fdaf7a2289a24df399f8d8485c8a46b66" + integrity sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg== asynckit@^0.4.0: version "0.4.0" @@ -1199,6 +1201,7 @@ balanced-match@^2.0.0: base64-js@^1.3.1: version "1.5.1" resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" + integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== bcrypt-pbkdf@^1.0.0: version "1.0.2" @@ -1300,9 +1303,9 @@ builtins@^5.0.1: semver "^7.0.0" cachedir@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/cachedir/-/cachedir-2.3.0.tgz#0c75892a052198f0b21c7c1804d8331edfcae0e8" - integrity sha512-A+Fezp4zxnit6FanDmv9EqXNAi3vt9DWp51/71UEhXukb7QUuvtv9344h91dyAxuTLoSYJFU299qzR3tzwPAhw== + version "2.4.0" + resolved "https://registry.yarnpkg.com/cachedir/-/cachedir-2.4.0.tgz#7fef9cf7367233d7c88068fe6e34ed0d355a610d" + integrity sha512-9EtFOZR8g22CL7BWjJ9BUx1+A/djkofnyW3aOXZORNW2kxoUpx2h+uN2cOqwPmFhnpVmxg+KW2OjOSgChTEvsQ== caching-transform@^4.0.0: version "4.0.0" @@ -1314,7 +1317,7 @@ caching-transform@^4.0.0: package-hash "^4.0.0" write-file-atomic "^3.0.0" -call-bind@^1.0.0, call-bind@^1.0.2: +call-bind@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== @@ -1322,6 +1325,17 @@ call-bind@^1.0.0, call-bind@^1.0.2: function-bind "^1.1.1" get-intrinsic "^1.0.2" +call-bind@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.7.tgz#06016599c40c56498c18769d2730be242b6fa3b9" + integrity sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w== + dependencies: + es-define-property "^1.0.0" + es-errors "^1.3.0" + function-bind "^1.1.2" + get-intrinsic "^1.2.4" + set-function-length "^1.2.1" + callsites@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" @@ -1416,9 +1430,9 @@ chokidar@3.5.3: fsevents "~2.3.2" ci-info@^3.2.0: - version "3.8.0" - resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.8.0.tgz#81408265a5380c929f0bc665d62256628ce9ef91" - integrity sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw== + version "3.9.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.9.0.tgz#4279a62028a7b1f262f3473fc9605f5e218c59b4" + integrity sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ== clean-stack@^2.0.0: version "2.2.0" @@ -1433,9 +1447,9 @@ cli-cursor@^3.1.0: restore-cursor "^3.1.0" cli-table3@~0.6.1: - version "0.6.3" - resolved "https://registry.yarnpkg.com/cli-table3/-/cli-table3-0.6.3.tgz#61ab765aac156b52f222954ffc607a6f01dbeeb2" - integrity sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg== + version "0.6.4" + resolved "https://registry.yarnpkg.com/cli-table3/-/cli-table3-0.6.4.tgz#d1c536b8a3f2e7bec58f67ac9e5769b1b30088b0" + integrity sha512-Lm3L0p+/npIQWNIiyF/nAn7T5dnOwR3xNTHXYEBFBFVPXzCVNZ5lqEC/1eo/EVfpDsQ1I+TX4ORPQgp+UI0CRw== dependencies: string-width "^4.2.0" optionalDependencies: @@ -1516,9 +1530,9 @@ colord@^2.9.3: integrity sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw== colorette@^2.0.16: - version "2.0.19" - resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.19.tgz#cdf044f47ad41a0f4b56b3a0d5b4e6e1a2d5a798" - integrity sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ== + version "2.0.20" + resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.20.tgz#9eb793e6833067f7235902fcd3b09917a000a95a" + integrity sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w== combined-stream@^1.0.6, combined-stream@~1.0.6: version "1.0.8" @@ -1532,10 +1546,10 @@ commander@^2.12.1: resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== -commander@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-5.1.0.tgz#46abbd1652f8e059bddaef99bbdcb2ad9cf179ae" - integrity sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg== +commander@^6.2.1: + version "6.2.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-6.2.1.tgz#0792eb682dfbc325999bb2b84fddddba110ac73c" + integrity sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA== comment-parser@1.3.1: version "1.3.1" @@ -1681,13 +1695,13 @@ cypress-terminal-report@^5.3.2: tv4 "^1.3.0" cypress@^12.9.0: - version "12.9.0" - resolved "https://registry.yarnpkg.com/cypress/-/cypress-12.9.0.tgz#e6ab43cf329fd7c821ef7645517649d72ccf0a12" - integrity sha512-Ofe09LbHKgSqX89Iy1xen2WvpgbvNxDzsWx3mgU1mfILouELeXYGwIib3ItCwoRrRifoQwcBFmY54Vs0zw7QCg== + version "12.17.4" + resolved "https://registry.yarnpkg.com/cypress/-/cypress-12.17.4.tgz#b4dadf41673058493fa0d2362faa3da1f6ae2e6c" + integrity sha512-gAN8Pmns9MA5eCDFSDJXWKUpaL3IDd89N9TtIupjYnzLSmlpVr+ZR+vb4U/qaMp+lB6tBvAmt7504c3Z4RU5KQ== dependencies: - "@cypress/request" "^2.88.10" + "@cypress/request" "2.88.12" "@cypress/xvfb" "^1.2.4" - "@types/node" "^14.14.31" + "@types/node" "^16.18.39" "@types/sinonjs__fake-timers" "8.1.1" "@types/sizzle" "^2.3.2" arch "^2.2.0" @@ -1699,7 +1713,7 @@ cypress@^12.9.0: check-more-types "^2.24.0" cli-cursor "^3.1.0" cli-table3 "~0.6.1" - commander "^5.1.0" + commander "^6.2.1" common-tags "^1.8.0" dayjs "^1.10.4" debug "^4.3.4" @@ -1717,12 +1731,13 @@ cypress@^12.9.0: listr2 "^3.8.3" lodash "^4.17.21" log-symbols "^4.0.0" - minimist "^1.2.6" + minimist "^1.2.8" ospath "^1.2.2" pretty-bytes "^5.6.0" + process "^0.11.10" proxy-from-env "1.0.0" request-progress "^3.0.0" - semver "^7.3.2" + semver "^7.5.3" supports-color "^8.1.1" tmp "~0.2.1" untildify "^4.0.0" @@ -1741,9 +1756,9 @@ dayjs@1.10.7: integrity sha512-P6twpd70BcPK34K26uJ1KT3wlhpuOAPoMwJzpsIWUxHZ7wpmbdZL/hQqBDfz7hGurYSa5PhzdhDHtt319hL3ig== dayjs@^1.10.4: - version "1.11.7" - resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.11.7.tgz#4b296922642f70999544d1144a2c25730fce63e2" - integrity sha512-+Yw9U6YO5TQohxLcIkrXBeY73WP3ejHWVvx8XCk3gxvQDCTEmS48ZrSZCKciI7Bhl/uCMyxYtE9UqRILmFphkQ== + version "1.11.10" + resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.11.10.tgz#68acea85317a6e164457d6d6947564029a6a16a0" + integrity sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ== debug@4.3.4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.2, debug@^4.3.4: version "4.3.4" @@ -1796,6 +1811,15 @@ default-require-extensions@^3.0.0: dependencies: strip-bom "^4.0.0" +define-data-property@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.4.tgz#894dc141bb7d3060ae4366f6a0107e68fbe48c5e" + integrity sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A== + dependencies: + es-define-property "^1.0.0" + es-errors "^1.3.0" + gopd "^1.0.1" + define-properties@^1.1.3, define-properties@^1.1.4: version "1.2.0" resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.0.tgz#52988570670c9eacedd8064f4a990f2405849bd5" @@ -1871,11 +1895,12 @@ end-of-stream@^1.1.0: once "^1.4.0" enquirer@^2.3.6: - version "2.3.6" - resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.3.6.tgz#2a7fe5dd634a1e4125a975ec994ff5456dc3734d" - integrity sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg== + version "2.4.1" + resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.4.1.tgz#93334b3fbd74fc7097b224ab4a8fb7e40bf4ae56" + integrity sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ== dependencies: ansi-colors "^4.1.1" + strip-ansi "^6.0.1" error-ex@^1.3.1: version "1.3.2" @@ -1923,6 +1948,18 @@ es-abstract@^1.19.0, es-abstract@^1.20.4: unbox-primitive "^1.0.2" which-typed-array "^1.1.9" +es-define-property@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.0.tgz#c7faefbdff8b2696cf5f46921edfb77cc4ba3845" + integrity sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ== + dependencies: + get-intrinsic "^1.2.4" + +es-errors@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f" + integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== + es-set-tostringtag@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz#338d502f6f674301d710b80c8592de8a15f09cd8" @@ -2492,10 +2529,10 @@ fsevents@~2.3.2: resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== -function-bind@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" - integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== +function-bind@^1.1.1, function-bind@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" + integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== function.prototype.name@^1.1.5: version "1.1.5" @@ -2522,7 +2559,18 @@ get-caller-file@^2.0.1, get-caller-file@^2.0.5: resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== -get-intrinsic@^1.0.2, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3, get-intrinsic@^1.2.0: +get-intrinsic@^1.0.2, get-intrinsic@^1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.4.tgz#e385f5a4b5227d449c3eabbad05494ef0abbeadd" + integrity sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ== + dependencies: + es-errors "^1.3.0" + function-bind "^1.1.2" + has-proto "^1.0.1" + has-symbols "^1.0.3" + hasown "^2.0.0" + +get-intrinsic@^1.1.1, get-intrinsic@^1.1.3, get-intrinsic@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.0.tgz#7ad1dc0535f3a2904bba075772763e5051f6d05f" integrity sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q== @@ -2723,6 +2771,13 @@ has-property-descriptors@^1.0.0: dependencies: get-intrinsic "^1.1.1" +has-property-descriptors@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz#963ed7d071dc7bf5f084c5bfbe0d1b6222586854" + integrity sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg== + dependencies: + es-define-property "^1.0.0" + has-proto@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.1.tgz#1885c1305538958aff469fef37937c22795408e0" @@ -2741,11 +2796,9 @@ has-tostringtag@^1.0.0: has-symbols "^1.0.2" has@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" - integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== - dependencies: - function-bind "^1.1.1" + version "1.0.4" + resolved "https://registry.yarnpkg.com/has/-/has-1.0.4.tgz#2eb2860e000011dae4f1406a86fe80e530fb2ec6" + integrity sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ== hasha@^5.0.0: version "5.2.2" @@ -2755,6 +2808,13 @@ hasha@^5.0.0: is-stream "^2.0.0" type-fest "^0.8.0" +hasown@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" + integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== + dependencies: + function-bind "^1.1.2" + he@1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" @@ -2804,6 +2864,7 @@ human-signals@^1.1.1: ieee754@^1.1.13: version "1.2.1" resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" + integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== ignore@^5.1.1, ignore@^5.1.4: version "5.1.4" @@ -3524,7 +3585,7 @@ minimist-options@4.1.0: is-plain-obj "^1.1.0" kind-of "^6.0.3" -minimist@^1.2.0, minimist@^1.2.6: +minimist@^1.2.0, minimist@^1.2.6, minimist@^1.2.8: version "1.2.8" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== @@ -3695,11 +3756,16 @@ nyc@15.1.0: test-exclude "^6.0.0" yargs "^15.0.2" -object-inspect@^1.12.2, object-inspect@^1.9.0: +object-inspect@^1.12.2: version "1.12.3" resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.3.tgz#ba62dffd67ee256c8c086dfae69e016cd1f198b9" integrity sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g== +object-inspect@^1.13.1: + version "1.13.1" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.1.tgz#b96c6109324ccfef6b12216a956ca4dc2ff94bc2" + integrity sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ== + object-keys@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" @@ -4262,12 +4328,17 @@ process-on-spawn@^1.0.0: dependencies: fromentries "^1.2.0" +process@^0.11.10: + version "0.11.10" + resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" + integrity sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A== + proxy-from-env@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.0.0.tgz#33c50398f70ea7eb96d21f7b817630a55791c7ee" integrity sha512-F2JHgJQ1iqwnHDcQjVBsq3n/uoaFL+iPW/eAeL7kVxy/2RrWaN4WroKjjvbsoRtv0ftelNyC01bjRhn/bhcf4A== -psl@^1.1.28: +psl@^1.1.33: version "1.9.0" resolved "https://registry.yarnpkg.com/psl/-/psl-1.9.0.tgz#d0df2a137f00794565fcaf3b2c00cd09f8d5a5a7" integrity sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag== @@ -4285,9 +4356,9 @@ punycode@^2.1.0: resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" punycode@^2.1.1: - version "2.3.0" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.0.tgz#f67fa67c94da8f4d0cfff981aee4118064199b8f" - integrity sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA== + version "2.3.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" + integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== qs@~6.10.3: version "6.10.5" @@ -4296,6 +4367,11 @@ qs@~6.10.3: dependencies: side-channel "^1.0.4" +querystringify@^2.1.1: + version "2.2.0" + resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.2.0.tgz#3345941b4153cb9d082d8eee4cda2016a9aef7f6" + integrity sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ== + queue-microtask@^1.2.2: version "1.2.3" resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" @@ -4390,6 +4466,11 @@ require-main-filename@^2.0.0: resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== +requires-port@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" + integrity sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ== + resolve-from@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" @@ -4423,9 +4504,9 @@ reusify@^1.0.4: integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== rfdc@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/rfdc/-/rfdc-1.3.0.tgz#d0b7c441ab2720d05dc4cf26e01c89631d9da08b" - integrity sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA== + version "1.3.1" + resolved "https://registry.yarnpkg.com/rfdc/-/rfdc-1.3.1.tgz#2b6d4df52dffe8bb346992a10ea9451f24373a8f" + integrity sha512-r5a3l5HzYlIC68TpmYKlxWjmOP6wiPJ1vWv2HeLhNsRZMrCkxeqxiHlQ21oXmQ4F3SiryXBHhAD7JZqvOJjFmg== rimraf@^3.0.0, rimraf@^3.0.2: version "3.0.2" @@ -4464,9 +4545,9 @@ run-parallel@^1.1.9: queue-microtask "^1.2.2" rxjs@^7.5.1: - version "7.8.0" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.8.0.tgz#90a938862a82888ff4c7359811a595e14e1e09a4" - integrity sha512-F2+gxDshqmIub1KdvZkaEfGDwLNpPvk9Fs6LD/MyQxNgMds/WH9OdDDXOmxUZpME+iSK3rQCctkL0DYyytUqMg== + version "7.8.1" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.8.1.tgz#6f6f3d99ea8044291efd92e7c7fcf562c4057543" + integrity sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg== dependencies: tslib "^2.1.0" @@ -4508,7 +4589,7 @@ semver@^6.0.0, semver@^6.3.0: resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== -semver@^7.0.0, semver@^7.3.2, semver@^7.3.4, semver@^7.3.5, semver@^7.3.7, semver@^7.3.8: +semver@^7.0.0, semver@^7.3.4, semver@^7.3.5, semver@^7.3.7, semver@^7.3.8, semver@^7.5.3: version "7.6.0" resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.0.tgz#1a46a4db4bffcccd97b743b5005c8325f23d4e2d" integrity sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg== @@ -4527,6 +4608,18 @@ set-blocking@^2.0.0: resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" integrity sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw== +set-function-length@^1.2.1: + version "1.2.2" + resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.2.2.tgz#aac72314198eaed975cf77b2c3b6b880695e5449" + integrity sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg== + dependencies: + define-data-property "^1.1.4" + es-errors "^1.3.0" + function-bind "^1.1.2" + get-intrinsic "^1.2.4" + gopd "^1.0.1" + has-property-descriptors "^1.0.2" + shallow-clone@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/shallow-clone/-/shallow-clone-3.0.1.tgz#8f2981ad92531f55035b01fb230769a40e02efa3" @@ -4547,13 +4640,14 @@ shebang-regex@^3.0.0: integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== side-channel@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" - integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== + version "1.0.6" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.6.tgz#abd25fb7cd24baf45466406b1096b7831c9215f2" + integrity sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA== dependencies: - call-bind "^1.0.0" - get-intrinsic "^1.0.2" - object-inspect "^1.9.0" + call-bind "^1.0.7" + es-errors "^1.3.0" + get-intrinsic "^1.2.4" + object-inspect "^1.13.1" signal-exit@^3.0.2, signal-exit@^3.0.7: version "3.0.7" @@ -4680,9 +4774,9 @@ sprintf-js@~1.0.2: integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== sshpk@^1.14.1: - version "1.17.0" - resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.17.0.tgz#578082d92d4fe612b13007496e543fa0fbcbe4c5" - integrity sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ== + version "1.18.0" + resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.18.0.tgz#1663e55cddf4d688b86a46b77f0d5fe363aba028" + integrity sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ== dependencies: asn1 "~0.2.3" assert-plus "^1.0.0" @@ -4873,9 +4967,9 @@ text-table@^0.2.0: integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== throttleit@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/throttleit/-/throttleit-1.0.0.tgz#9e785836daf46743145a5984b6268d828528ac6c" - integrity sha512-rkTVqu6IjfQ/6+uNuuc3sZek4CEYxTJom3IktzgdSxcZqdARuebbA/f4QmAxMQIxqq9ZLEUkSYqvuk1I6VKq4g== + version "1.0.1" + resolved "https://registry.yarnpkg.com/throttleit/-/throttleit-1.0.1.tgz#304ec51631c3b770c65c6c6f76938b384000f4d5" + integrity sha512-vDZpf9Chs9mAdfY046mcPt8fg5QSZr37hEH4TXYBnDF+izxgrbRGUAAaBvIk/fJm9aOFCGFd1EsNg5AZCbnQCQ== through@^2.3.8: version "2.3.8" @@ -4883,11 +4977,9 @@ through@^2.3.8: integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== tmp@~0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.2.1.tgz#8457fc3037dcf4719c251367a1af6500ee1ccf14" - integrity sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ== - dependencies: - rimraf "^3.0.0" + version "0.2.3" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.2.3.tgz#eb783cc22bc1e8bebd0671476d46ea4eb32a79ae" + integrity sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w== to-fast-properties@^2.0.0: version "2.0.0" @@ -4901,13 +4993,15 @@ to-regex-range@^5.0.1: dependencies: is-number "^7.0.0" -tough-cookie@~2.5.0: - version "2.5.0" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2" - integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g== +tough-cookie@^4.1.3: + version "4.1.3" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.1.3.tgz#97b9adb0728b42280aa3d814b6b999b2ff0318bf" + integrity sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw== dependencies: - psl "^1.1.28" + psl "^1.1.33" punycode "^2.1.1" + universalify "^0.2.0" + url-parse "^1.5.3" trim-newlines@^3.0.0: version "3.0.1" @@ -4933,9 +5027,9 @@ tslib@^1.8.1: resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.11.1.tgz#eb15d128827fbee2841549e171f45ed338ac7e35" tslib@^2.1.0: - version "2.5.0" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.5.0.tgz#42bfed86f5787aeb41d031866c8f402429e0fddf" - integrity sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg== + version "2.6.2" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.2.tgz#703ac29425e7b37cd6fd456e92404d46d1f3e4ae" + integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q== tslint@^6.1.1: version "6.1.3" @@ -5050,15 +5144,25 @@ unbox-primitive@^1.0.2: has-symbols "^1.0.3" which-boxed-primitive "^1.0.2" +undici-types@~5.26.4: + version "5.26.5" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" + integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== + uniq@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/uniq/-/uniq-1.0.1.tgz#b31c5ae8254844a3a8281541ce2b04b865a734ff" integrity sha512-Gw+zz50YNKPDKXs+9d+aKAjVwpjNwqzvNpLigIruT4HA9lMZNdMqs9x07kKHB/L9WRzqp4+DlTU5s4wG2esdoA== +universalify@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.2.0.tgz#6451760566fa857534745ab1dde952d1b1761be0" + integrity sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg== + universalify@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717" - integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== + version "2.0.1" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.1.tgz#168efc2180964e6386d061e094df61afe239b18d" + integrity sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw== untildify@^4.0.0: version "4.0.0" @@ -5080,6 +5184,14 @@ uri-js@^4.2.2: dependencies: punycode "^2.1.0" +url-parse@^1.5.3: + version "1.5.10" + resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.5.10.tgz#9d3c2f736c1d75dd3bd2be507dcc111f1e2ea9c1" + integrity sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ== + dependencies: + querystringify "^2.1.1" + requires-port "^1.0.0" + util-deprecate@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" From c5d5f840df8814abca9a33b5cc6becd0703cc899 Mon Sep 17 00:00:00 2001 From: Peter Savchenko Date: Sun, 31 Mar 2024 01:14:37 +0300 Subject: [PATCH 20/23] Update cypress.yml --- .github/workflows/cypress.yml | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/.github/workflows/cypress.yml b/.github/workflows/cypress.yml index c60e497d2..80be33f10 100644 --- a/.github/workflows/cypress.yml +++ b/.github/workflows/cypress.yml @@ -10,10 +10,7 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/setup-node@v3 - with: - node-version: 18 - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - uses: cypress-io/github-action@v6 with: config: video=false From ee4f01883b815a98c178ff0a9af3ede59e8b886c Mon Sep 17 00:00:00 2001 From: Peter Savchenko Date: Sun, 31 Mar 2024 08:46:37 +0300 Subject: [PATCH 21/23] upd cypress to 13 --- .github/workflows/cypress.yml | 3 +++ package.json | 2 +- yarn.lock | 42 +++++++++++++++-------------------- 3 files changed, 22 insertions(+), 25 deletions(-) diff --git a/.github/workflows/cypress.yml b/.github/workflows/cypress.yml index 80be33f10..766075563 100644 --- a/.github/workflows/cypress.yml +++ b/.github/workflows/cypress.yml @@ -10,6 +10,9 @@ jobs: runs-on: ubuntu-latest steps: + - uses: actions/setup-node@v3 + with: + node-version: 18 - uses: actions/checkout@v4 - uses: cypress-io/github-action@v6 with: diff --git a/package.json b/package.json index 0de36944e..3e325ab14 100644 --- a/package.json +++ b/package.json @@ -52,7 +52,7 @@ "codex-notifier": "^1.1.2", "codex-tooltip": "^1.0.5", "core-js": "3.30.0", - "cypress": "^12.9.0", + "cypress": "^13.7.1", "cypress-intellij-reporter": "^0.0.7", "cypress-plugin-tab": "^1.0.5", "cypress-terminal-report": "^5.3.2", diff --git a/yarn.lock b/yarn.lock index e3c475092..00de3f0fb 100644 --- a/yarn.lock +++ b/yarn.lock @@ -504,10 +504,10 @@ js-yaml "4.1.0" nyc "15.1.0" -"@cypress/request@2.88.12": - version "2.88.12" - resolved "https://registry.yarnpkg.com/@cypress/request/-/request-2.88.12.tgz#ba4911431738494a85e93fb04498cb38bc55d590" - integrity sha512-tOn+0mDZxASFM+cuAP9szGUGPI1HwWVSvdzm7V4cCsPdFTx6qMj29CwaQmRAMIEhORIUBFBsYROYJcveK4uOjA== +"@cypress/request@^3.0.0": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@cypress/request/-/request-3.0.1.tgz#72d7d5425236a2413bd3d8bb66d02d9dc3168960" + integrity sha512-TWivJlJi8ZDx2wGOw1dbLuHJKUYX7bWySw377nlnGOW3hP9/MUKIsEdXT/YngWxVdgNCHRBmFlBipE+5/2ZZlQ== dependencies: aws-sign2 "~0.7.0" aws4 "^1.8.0" @@ -522,7 +522,7 @@ json-stringify-safe "~5.0.1" mime-types "~2.1.19" performance-now "^2.1.0" - qs "~6.10.3" + qs "6.10.4" safe-buffer "^5.1.2" tough-cookie "^4.1.3" tunnel-agent "^0.6.0" @@ -854,11 +854,6 @@ dependencies: undici-types "~5.26.4" -"@types/node@^16.18.39": - version "16.18.93" - resolved "https://registry.yarnpkg.com/@types/node/-/node-16.18.93.tgz#ed4950d2f13afafb2baed1bd098ddf162a4c7b81" - integrity sha512-epWuohp6c0bQt0j3RYCiP9x52axHVn+CjS1Rx1VjPwF+ySg8lrigH3yXGs88XqnA+jGM2qnSMuFTsBxft+hO1Q== - "@types/node@^18.15.11": version "18.15.11" resolved "https://registry.yarnpkg.com/@types/node/-/node-18.15.11.tgz#b3b790f09cb1696cffcec605de025b088fa4225f" @@ -1282,7 +1277,7 @@ buffer-from@^1.0.0: resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== -buffer@^5.6.0: +buffer@^5.7.1: version "5.7.1" resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== @@ -1694,20 +1689,19 @@ cypress-terminal-report@^5.3.2: semver "^7.3.5" tv4 "^1.3.0" -cypress@^12.9.0: - version "12.17.4" - resolved "https://registry.yarnpkg.com/cypress/-/cypress-12.17.4.tgz#b4dadf41673058493fa0d2362faa3da1f6ae2e6c" - integrity sha512-gAN8Pmns9MA5eCDFSDJXWKUpaL3IDd89N9TtIupjYnzLSmlpVr+ZR+vb4U/qaMp+lB6tBvAmt7504c3Z4RU5KQ== +cypress@^13.7.1: + version "13.7.1" + resolved "https://registry.yarnpkg.com/cypress/-/cypress-13.7.1.tgz#d1208eb04efd46ef52a30480a5da71a03373261a" + integrity sha512-4u/rpFNxOFCoFX/Z5h+uwlkBO4mWzAjveURi3vqdSu56HPvVdyGTxGw4XKGWt399Y1JwIn9E1L9uMXQpc0o55w== dependencies: - "@cypress/request" "2.88.12" + "@cypress/request" "^3.0.0" "@cypress/xvfb" "^1.2.4" - "@types/node" "^16.18.39" "@types/sinonjs__fake-timers" "8.1.1" "@types/sizzle" "^2.3.2" arch "^2.2.0" blob-util "^2.0.2" bluebird "^3.7.2" - buffer "^5.6.0" + buffer "^5.7.1" cachedir "^2.3.0" chalk "^4.1.0" check-more-types "^2.24.0" @@ -1725,7 +1719,7 @@ cypress@^12.9.0: figures "^3.2.0" fs-extra "^9.1.0" getos "^3.2.1" - is-ci "^3.0.0" + is-ci "^3.0.1" is-installed-globally "~0.4.0" lazy-ass "^1.6.0" listr2 "^3.8.3" @@ -2985,7 +2979,7 @@ is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7: resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== -is-ci@^3.0.0: +is-ci@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-3.0.1.tgz#db6ecbed1bd659c43dac0f45661e7674103d1867" integrity sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ== @@ -4360,10 +4354,10 @@ punycode@^2.1.1: resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== -qs@~6.10.3: - version "6.10.5" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.10.5.tgz#974715920a80ff6a262264acd2c7e6c2a53282b4" - integrity sha512-O5RlPh0VFtR78y79rgcgKK4wbAI0C5zGVLztOIdpWX6ep368q5Hv6XRxDvXuZ9q3C6v+e3n8UfZZJw7IIG27eQ== +qs@6.10.4: + version "6.10.4" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.10.4.tgz#6a3003755add91c0ec9eacdc5f878b034e73f9e7" + integrity sha512-OQiU+C+Ds5qiH91qh/mg0w+8nwQuLjM4F4M/PbmhDOoYehPh+Fb0bDjtR1sOvy7YKxvj28Y/M0PhP5uVX0kB+g== dependencies: side-channel "^1.0.4" From ebec260d16273441bc3f6d5f75e5fe2204d8c815 Mon Sep 17 00:00:00 2001 From: Peter Savchenko Date: Sun, 31 Mar 2024 08:56:01 +0300 Subject: [PATCH 22/23] make sanitize test simpler --- test/cypress/tests/sanitisation.cy.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/test/cypress/tests/sanitisation.cy.ts b/test/cypress/tests/sanitisation.cy.ts index 3096c383e..1c5a83ef3 100644 --- a/test/cypress/tests/sanitisation.cy.ts +++ b/test/cypress/tests/sanitisation.cy.ts @@ -83,7 +83,7 @@ describe('Sanitizing', () => { id: 'block1', type: 'paragraph', data: { - text: 'First block paragraph', + text: 'First block', }, }, { @@ -93,7 +93,7 @@ describe('Sanitizing', () => { /** * Tool does not support spans in its sanitization config */ - text: 'Second XSS block heading', + text: 'Second XSS block', }, }, ], @@ -111,7 +111,7 @@ describe('Sanitizing', () => { .then(async (editor) => { const { blocks } = await editor.save(); - expect(blocks[0].data.text).to.eq('First block paragraphSecond XSS block heading'); // text has been merged, span has been removed + expect(blocks[0].data.text).to.eq('First blockSecond XSS block'); // text has been merged, span has been removed }); }); }); From 92c5fb0747bb839c5767764ea2c409fd930fc112 Mon Sep 17 00:00:00 2001 From: Peter Savchenko Date: Sun, 31 Mar 2024 23:27:22 +0300 Subject: [PATCH 23/23] patch rc version --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 3e325ab14..16a857fab 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@editorjs/editorjs", - "version": "2.30.0-rc.1", + "version": "2.30.0-rc.2", "description": "Editor.js — Native JS, based on API and Open Source", "main": "dist/editorjs.umd.js", "module": "dist/editorjs.mjs",