From 87c1e225b9a77553fe620f6e48f4683fa1a26e30 Mon Sep 17 00:00:00 2001 From: Peter Date: Tue, 24 Oct 2023 16:19:29 +0200 Subject: [PATCH 001/608] Added playwright e2e tests for svelte & react --- tests/playwright/.env.svelte | 1 + tests/playwright/.gitignore | 4 + tests/playwright/e2e/backspace-delete.spec.ts | 16 + tests/playwright/e2e/move-node.spec.ts | 22 + tests/playwright/package.json | 27 ++ tests/playwright/playwright.react.config.ts | 77 +++ tests/playwright/playwright.svelte.config.ts | 79 ++++ .../tests-examples/demo-todo-app.spec.ts | 437 ++++++++++++++++++ 8 files changed, 663 insertions(+) create mode 100644 tests/playwright/.env.svelte create mode 100644 tests/playwright/.gitignore create mode 100644 tests/playwright/e2e/backspace-delete.spec.ts create mode 100644 tests/playwright/e2e/move-node.spec.ts create mode 100644 tests/playwright/package.json create mode 100644 tests/playwright/playwright.react.config.ts create mode 100644 tests/playwright/playwright.svelte.config.ts create mode 100644 tests/playwright/tests-examples/demo-todo-app.spec.ts diff --git a/tests/playwright/.env.svelte b/tests/playwright/.env.svelte new file mode 100644 index 00000000..c157dcbc --- /dev/null +++ b/tests/playwright/.env.svelte @@ -0,0 +1 @@ +FRAMEWROK=svelte \ No newline at end of file diff --git a/tests/playwright/.gitignore b/tests/playwright/.gitignore new file mode 100644 index 00000000..75e854d8 --- /dev/null +++ b/tests/playwright/.gitignore @@ -0,0 +1,4 @@ +node_modules/ +/test-results/ +/playwright-report/ +/playwright/.cache/ diff --git a/tests/playwright/e2e/backspace-delete.spec.ts b/tests/playwright/e2e/backspace-delete.spec.ts new file mode 100644 index 00000000..9b5cee21 --- /dev/null +++ b/tests/playwright/e2e/backspace-delete.spec.ts @@ -0,0 +1,16 @@ +import { test, expect } from '@playwright/test'; + +const framework = process.env.FRAMEWORK; + +test('Delete Node with backspace', async ({ page }) => { + await page.goto('/'); + await page.locator(`.${framework}-flow__node`).nth(0).click(); + // await page.getByTestId('rf__node-1').click(); + await page.keyboard.press('Backspace'); + + const nodes = await page.locator(`.${framework}-flow__node`).all(); + expect(nodes).toHaveLength(3); + + const edges = await page.locator(`.${framework}-flow__edge`).all(); + expect(edges).toHaveLength(0); +}); diff --git a/tests/playwright/e2e/move-node.spec.ts b/tests/playwright/e2e/move-node.spec.ts new file mode 100644 index 00000000..d9fea594 --- /dev/null +++ b/tests/playwright/e2e/move-node.spec.ts @@ -0,0 +1,22 @@ +import { test, expect } from '@playwright/test'; + +test('Move Node', async ({ page }) => { + await page.goto('/'); + + const locator = page.getByTestId('rf__node-1'); + + const transformBeforeMove = await locator.evaluate((element) => { + return element.style.transform; + }); + + await locator.hover(); + await page.mouse.down(); + await page.mouse.move(500, 500); + await page.mouse.up(); + + const transformAfterMove = await locator.evaluate((element) => { + return element.style.transform; + }); + + expect(transformBeforeMove).not.toMatch(transformAfterMove); +}); diff --git a/tests/playwright/package.json b/tests/playwright/package.json new file mode 100644 index 00000000..af0109da --- /dev/null +++ b/tests/playwright/package.json @@ -0,0 +1,27 @@ +{ + "name": "playwright", + "version": "1.0.0", + "description": "", + "main": "index.js", + "scripts": { + "test:svelte": "FRAMEWORK=svelte npx playwright test -c playwright.svelte.config.ts", + "test:react": "FRAMEWORK=react npx playwright test -c playwright.react.config.ts", + "test:react:ui": "pnpm run test:react --ui", + "test:svelte:ui": "pnpm run test:svelte --ui" + }, + "keywords": [], + "author": "", + "license": "ISC", + "devDependencies": { + "@playwright/test": "^1.39.0", + "@types/node": "^18.7.16" + }, + "dependencies": { + "@playwright/experimental-ct-react": "^1.39.0", + "@types/react": "^18.2.31", + "@types/react-dom": "^18.2.14", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "typescript": "^5.2.2" + } +} diff --git a/tests/playwright/playwright.react.config.ts b/tests/playwright/playwright.react.config.ts new file mode 100644 index 00000000..fc8009ed --- /dev/null +++ b/tests/playwright/playwright.react.config.ts @@ -0,0 +1,77 @@ +import { defineConfig, devices } from '@playwright/test'; + +/** + * Read environment variables from file. + * https://github.com/motdotla/dotenv + */ +// require('dotenv').config(); + +/** + * See https://playwright.dev/docs/test-configuration. + */ +export default defineConfig({ + testDir: './e2e', + /* Run tests in files in parallel */ + fullyParallel: true, + /* Fail the build on CI if you accidentally left test.only in the source code. */ + forbidOnly: !!process.env.CI, + /* Retry on CI only */ + retries: process.env.CI ? 2 : 0, + /* Opt out of parallel tests on CI. */ + workers: process.env.CI ? 1 : undefined, + /* Reporter to use. See https://playwright.dev/docs/test-reporters */ + reporter: 'html', + /* Shared settings for all the projects below. See https://playwright.dev/docs/api/class-testoptions. */ + use: { + /* Base URL to use in actions like `await page.goto('/')`. */ + baseURL: 'http://127.0.0.1:3000', + + /* Collect trace when retrying the failed test. See https://playwright.dev/docs/trace-viewer */ + trace: 'on-first-retry', + }, + + /* Configure projects for major browsers */ + projects: [ + { + name: 'chromium', + use: { ...devices['Desktop Chrome'] }, + }, + + { + name: 'firefox', + use: { ...devices['Desktop Firefox'] }, + }, + + { + name: 'webkit', + use: { ...devices['Desktop Safari'] }, + }, + + /* Test against mobile viewports. */ + // { + // name: 'Mobile Chrome', + // use: { ...devices['Pixel 5'] }, + // }, + // { + // name: 'Mobile Safari', + // use: { ...devices['iPhone 12'] }, + // }, + + /* Test against branded browsers. */ + // { + // name: 'Microsoft Edge', + // use: { ...devices['Desktop Edge'], channel: 'msedge' }, + // }, + // { + // name: 'Google Chrome', + // use: { ...devices['Desktop Chrome'], channel: 'chrome' }, + // }, + ], + + /* Run your local dev server before starting the tests */ + webServer: { + command: 'cd ../../examples/react && pnpm run dev', + url: 'http://127.0.0.1:3000', + reuseExistingServer: !process.env.CI, + }, +}); diff --git a/tests/playwright/playwright.svelte.config.ts b/tests/playwright/playwright.svelte.config.ts new file mode 100644 index 00000000..e1845f20 --- /dev/null +++ b/tests/playwright/playwright.svelte.config.ts @@ -0,0 +1,79 @@ +import { defineConfig, devices } from '@playwright/test'; + +/** + * Read environment variables from file. + * https://github.com/motdotla/dotenv + */ +// require('dotenv').config(); + +/** + * See https://playwright.dev/docs/test-configuration. + */ +export default defineConfig({ + testDir: './e2e', + /* Run tests in files in parallel */ + fullyParallel: true, + /* Fail the build on CI if you accidentally left test.only in the source code. */ + forbidOnly: !!process.env.CI, + /* Retry on CI only */ + retries: process.env.CI ? 2 : 0, + /* Opt out of parallel tests on CI. */ + workers: process.env.CI ? 1 : undefined, + /* Reporter to use. See https://playwright.dev/docs/test-reporters */ + reporter: 'html', + /* Shared settings for all the projects below. See https://playwright.dev/docs/api/class-testoptions. */ + use: { + /* Base URL to use in actions like `await page.goto('/')`. */ + baseURL: 'http://localhost:5173/', + + /* Collect trace when retrying the failed test. See https://playwright.dev/docs/trace-viewer */ + trace: 'on-first-retry', + }, + + /* Configure projects for major browsers */ + projects: [ + { + name: 'chromium', + use: { ...devices['Desktop Chrome'] }, + }, + + { + name: 'firefox', + use: { ...devices['Desktop Firefox'] }, + }, + + { + name: 'webkit', + use: { ...devices['Desktop Safari'] }, + }, + + /* Test against mobile viewports. */ + // { + // name: 'Mobile Chrome', + // use: { ...devices['Pixel 5'] }, + // }, + // { + // name: 'Mobile Safari', + // use: { ...devices['iPhone 12'] }, + // }, + + /* Test against branded browsers. */ + // { + // name: 'Microsoft Edge', + // use: { ...devices['Desktop Edge'], channel: 'msedge' }, + // }, + // { + // name: 'Google Chrome', + // use: { ...devices['Desktop Chrome'], channel: 'chrome' }, + // }, + ], + + /* Run your local dev server before starting the tests */ + webServer: { + command: 'cd ../../examples/svelte && pnpm run dev', + // for some reason you need to use port otherwise it loads forever + // url: 'http://127.0.0.1:5173', + port: 5173, + reuseExistingServer: !process.env.CI, + }, +}); diff --git a/tests/playwright/tests-examples/demo-todo-app.spec.ts b/tests/playwright/tests-examples/demo-todo-app.spec.ts new file mode 100644 index 00000000..2fd6016f --- /dev/null +++ b/tests/playwright/tests-examples/demo-todo-app.spec.ts @@ -0,0 +1,437 @@ +import { test, expect, type Page } from '@playwright/test'; + +test.beforeEach(async ({ page }) => { + await page.goto('https://demo.playwright.dev/todomvc'); +}); + +const TODO_ITEMS = [ + 'buy some cheese', + 'feed the cat', + 'book a doctors appointment' +]; + +test.describe('New Todo', () => { + test('should allow me to add todo items', async ({ page }) => { + // create a new todo locator + const newTodo = page.getByPlaceholder('What needs to be done?'); + + // Create 1st todo. + await newTodo.fill(TODO_ITEMS[0]); + await newTodo.press('Enter'); + + // Make sure the list only has one todo item. + await expect(page.getByTestId('todo-title')).toHaveText([ + TODO_ITEMS[0] + ]); + + // Create 2nd todo. + await newTodo.fill(TODO_ITEMS[1]); + await newTodo.press('Enter'); + + // Make sure the list now has two todo items. + await expect(page.getByTestId('todo-title')).toHaveText([ + TODO_ITEMS[0], + TODO_ITEMS[1] + ]); + + await checkNumberOfTodosInLocalStorage(page, 2); + }); + + test('should clear text input field when an item is added', async ({ page }) => { + // create a new todo locator + const newTodo = page.getByPlaceholder('What needs to be done?'); + + // Create one todo item. + await newTodo.fill(TODO_ITEMS[0]); + await newTodo.press('Enter'); + + // Check that input is empty. + await expect(newTodo).toBeEmpty(); + await checkNumberOfTodosInLocalStorage(page, 1); + }); + + test('should append new items to the bottom of the list', async ({ page }) => { + // Create 3 items. + await createDefaultTodos(page); + + // create a todo count locator + const todoCount = page.getByTestId('todo-count') + + // Check test using different methods. + await expect(page.getByText('3 items left')).toBeVisible(); + await expect(todoCount).toHaveText('3 items left'); + await expect(todoCount).toContainText('3'); + await expect(todoCount).toHaveText(/3/); + + // Check all items in one call. + await expect(page.getByTestId('todo-title')).toHaveText(TODO_ITEMS); + await checkNumberOfTodosInLocalStorage(page, 3); + }); +}); + +test.describe('Mark all as completed', () => { + test.beforeEach(async ({ page }) => { + await createDefaultTodos(page); + await checkNumberOfTodosInLocalStorage(page, 3); + }); + + test.afterEach(async ({ page }) => { + await checkNumberOfTodosInLocalStorage(page, 3); + }); + + test('should allow me to mark all items as completed', async ({ page }) => { + // Complete all todos. + await page.getByLabel('Mark all as complete').check(); + + // Ensure all todos have 'completed' class. + await expect(page.getByTestId('todo-item')).toHaveClass(['completed', 'completed', 'completed']); + await checkNumberOfCompletedTodosInLocalStorage(page, 3); + }); + + test('should allow me to clear the complete state of all items', async ({ page }) => { + const toggleAll = page.getByLabel('Mark all as complete'); + // Check and then immediately uncheck. + await toggleAll.check(); + await toggleAll.uncheck(); + + // Should be no completed classes. + await expect(page.getByTestId('todo-item')).toHaveClass(['', '', '']); + }); + + test('complete all checkbox should update state when items are completed / cleared', async ({ page }) => { + const toggleAll = page.getByLabel('Mark all as complete'); + await toggleAll.check(); + await expect(toggleAll).toBeChecked(); + await checkNumberOfCompletedTodosInLocalStorage(page, 3); + + // Uncheck first todo. + const firstTodo = page.getByTestId('todo-item').nth(0); + await firstTodo.getByRole('checkbox').uncheck(); + + // Reuse toggleAll locator and make sure its not checked. + await expect(toggleAll).not.toBeChecked(); + + await firstTodo.getByRole('checkbox').check(); + await checkNumberOfCompletedTodosInLocalStorage(page, 3); + + // Assert the toggle all is checked again. + await expect(toggleAll).toBeChecked(); + }); +}); + +test.describe('Item', () => { + + test('should allow me to mark items as complete', async ({ page }) => { + // create a new todo locator + const newTodo = page.getByPlaceholder('What needs to be done?'); + + // Create two items. + for (const item of TODO_ITEMS.slice(0, 2)) { + await newTodo.fill(item); + await newTodo.press('Enter'); + } + + // Check first item. + const firstTodo = page.getByTestId('todo-item').nth(0); + await firstTodo.getByRole('checkbox').check(); + await expect(firstTodo).toHaveClass('completed'); + + // Check second item. + const secondTodo = page.getByTestId('todo-item').nth(1); + await expect(secondTodo).not.toHaveClass('completed'); + await secondTodo.getByRole('checkbox').check(); + + // Assert completed class. + await expect(firstTodo).toHaveClass('completed'); + await expect(secondTodo).toHaveClass('completed'); + }); + + test('should allow me to un-mark items as complete', async ({ page }) => { + // create a new todo locator + const newTodo = page.getByPlaceholder('What needs to be done?'); + + // Create two items. + for (const item of TODO_ITEMS.slice(0, 2)) { + await newTodo.fill(item); + await newTodo.press('Enter'); + } + + const firstTodo = page.getByTestId('todo-item').nth(0); + const secondTodo = page.getByTestId('todo-item').nth(1); + const firstTodoCheckbox = firstTodo.getByRole('checkbox'); + + await firstTodoCheckbox.check(); + await expect(firstTodo).toHaveClass('completed'); + await expect(secondTodo).not.toHaveClass('completed'); + await checkNumberOfCompletedTodosInLocalStorage(page, 1); + + await firstTodoCheckbox.uncheck(); + await expect(firstTodo).not.toHaveClass('completed'); + await expect(secondTodo).not.toHaveClass('completed'); + await checkNumberOfCompletedTodosInLocalStorage(page, 0); + }); + + test('should allow me to edit an item', async ({ page }) => { + await createDefaultTodos(page); + + const todoItems = page.getByTestId('todo-item'); + const secondTodo = todoItems.nth(1); + await secondTodo.dblclick(); + await expect(secondTodo.getByRole('textbox', { name: 'Edit' })).toHaveValue(TODO_ITEMS[1]); + await secondTodo.getByRole('textbox', { name: 'Edit' }).fill('buy some sausages'); + await secondTodo.getByRole('textbox', { name: 'Edit' }).press('Enter'); + + // Explicitly assert the new text value. + await expect(todoItems).toHaveText([ + TODO_ITEMS[0], + 'buy some sausages', + TODO_ITEMS[2] + ]); + await checkTodosInLocalStorage(page, 'buy some sausages'); + }); +}); + +test.describe('Editing', () => { + test.beforeEach(async ({ page }) => { + await createDefaultTodos(page); + await checkNumberOfTodosInLocalStorage(page, 3); + }); + + test('should hide other controls when editing', async ({ page }) => { + const todoItem = page.getByTestId('todo-item').nth(1); + await todoItem.dblclick(); + await expect(todoItem.getByRole('checkbox')).not.toBeVisible(); + await expect(todoItem.locator('label', { + hasText: TODO_ITEMS[1], + })).not.toBeVisible(); + await checkNumberOfTodosInLocalStorage(page, 3); + }); + + test('should save edits on blur', async ({ page }) => { + const todoItems = page.getByTestId('todo-item'); + await todoItems.nth(1).dblclick(); + await todoItems.nth(1).getByRole('textbox', { name: 'Edit' }).fill('buy some sausages'); + await todoItems.nth(1).getByRole('textbox', { name: 'Edit' }).dispatchEvent('blur'); + + await expect(todoItems).toHaveText([ + TODO_ITEMS[0], + 'buy some sausages', + TODO_ITEMS[2], + ]); + await checkTodosInLocalStorage(page, 'buy some sausages'); + }); + + test('should trim entered text', async ({ page }) => { + const todoItems = page.getByTestId('todo-item'); + await todoItems.nth(1).dblclick(); + await todoItems.nth(1).getByRole('textbox', { name: 'Edit' }).fill(' buy some sausages '); + await todoItems.nth(1).getByRole('textbox', { name: 'Edit' }).press('Enter'); + + await expect(todoItems).toHaveText([ + TODO_ITEMS[0], + 'buy some sausages', + TODO_ITEMS[2], + ]); + await checkTodosInLocalStorage(page, 'buy some sausages'); + }); + + test('should remove the item if an empty text string was entered', async ({ page }) => { + const todoItems = page.getByTestId('todo-item'); + await todoItems.nth(1).dblclick(); + await todoItems.nth(1).getByRole('textbox', { name: 'Edit' }).fill(''); + await todoItems.nth(1).getByRole('textbox', { name: 'Edit' }).press('Enter'); + + await expect(todoItems).toHaveText([ + TODO_ITEMS[0], + TODO_ITEMS[2], + ]); + }); + + test('should cancel edits on escape', async ({ page }) => { + const todoItems = page.getByTestId('todo-item'); + await todoItems.nth(1).dblclick(); + await todoItems.nth(1).getByRole('textbox', { name: 'Edit' }).fill('buy some sausages'); + await todoItems.nth(1).getByRole('textbox', { name: 'Edit' }).press('Escape'); + await expect(todoItems).toHaveText(TODO_ITEMS); + }); +}); + +test.describe('Counter', () => { + test('should display the current number of todo items', async ({ page }) => { + // create a new todo locator + const newTodo = page.getByPlaceholder('What needs to be done?'); + + // create a todo count locator + const todoCount = page.getByTestId('todo-count') + + await newTodo.fill(TODO_ITEMS[0]); + await newTodo.press('Enter'); + + await expect(todoCount).toContainText('1'); + + await newTodo.fill(TODO_ITEMS[1]); + await newTodo.press('Enter'); + await expect(todoCount).toContainText('2'); + + await checkNumberOfTodosInLocalStorage(page, 2); + }); +}); + +test.describe('Clear completed button', () => { + test.beforeEach(async ({ page }) => { + await createDefaultTodos(page); + }); + + test('should display the correct text', async ({ page }) => { + await page.locator('.todo-list li .toggle').first().check(); + await expect(page.getByRole('button', { name: 'Clear completed' })).toBeVisible(); + }); + + test('should remove completed items when clicked', async ({ page }) => { + const todoItems = page.getByTestId('todo-item'); + await todoItems.nth(1).getByRole('checkbox').check(); + await page.getByRole('button', { name: 'Clear completed' }).click(); + await expect(todoItems).toHaveCount(2); + await expect(todoItems).toHaveText([TODO_ITEMS[0], TODO_ITEMS[2]]); + }); + + test('should be hidden when there are no items that are completed', async ({ page }) => { + await page.locator('.todo-list li .toggle').first().check(); + await page.getByRole('button', { name: 'Clear completed' }).click(); + await expect(page.getByRole('button', { name: 'Clear completed' })).toBeHidden(); + }); +}); + +test.describe('Persistence', () => { + test('should persist its data', async ({ page }) => { + // create a new todo locator + const newTodo = page.getByPlaceholder('What needs to be done?'); + + for (const item of TODO_ITEMS.slice(0, 2)) { + await newTodo.fill(item); + await newTodo.press('Enter'); + } + + const todoItems = page.getByTestId('todo-item'); + const firstTodoCheck = todoItems.nth(0).getByRole('checkbox'); + await firstTodoCheck.check(); + await expect(todoItems).toHaveText([TODO_ITEMS[0], TODO_ITEMS[1]]); + await expect(firstTodoCheck).toBeChecked(); + await expect(todoItems).toHaveClass(['completed', '']); + + // Ensure there is 1 completed item. + await checkNumberOfCompletedTodosInLocalStorage(page, 1); + + // Now reload. + await page.reload(); + await expect(todoItems).toHaveText([TODO_ITEMS[0], TODO_ITEMS[1]]); + await expect(firstTodoCheck).toBeChecked(); + await expect(todoItems).toHaveClass(['completed', '']); + }); +}); + +test.describe('Routing', () => { + test.beforeEach(async ({ page }) => { + await createDefaultTodos(page); + // make sure the app had a chance to save updated todos in storage + // before navigating to a new view, otherwise the items can get lost :( + // in some frameworks like Durandal + await checkTodosInLocalStorage(page, TODO_ITEMS[0]); + }); + + test('should allow me to display active items', async ({ page }) => { + const todoItem = page.getByTestId('todo-item'); + await page.getByTestId('todo-item').nth(1).getByRole('checkbox').check(); + + await checkNumberOfCompletedTodosInLocalStorage(page, 1); + await page.getByRole('link', { name: 'Active' }).click(); + await expect(todoItem).toHaveCount(2); + await expect(todoItem).toHaveText([TODO_ITEMS[0], TODO_ITEMS[2]]); + }); + + test('should respect the back button', async ({ page }) => { + const todoItem = page.getByTestId('todo-item'); + await page.getByTestId('todo-item').nth(1).getByRole('checkbox').check(); + + await checkNumberOfCompletedTodosInLocalStorage(page, 1); + + await test.step('Showing all items', async () => { + await page.getByRole('link', { name: 'All' }).click(); + await expect(todoItem).toHaveCount(3); + }); + + await test.step('Showing active items', async () => { + await page.getByRole('link', { name: 'Active' }).click(); + }); + + await test.step('Showing completed items', async () => { + await page.getByRole('link', { name: 'Completed' }).click(); + }); + + await expect(todoItem).toHaveCount(1); + await page.goBack(); + await expect(todoItem).toHaveCount(2); + await page.goBack(); + await expect(todoItem).toHaveCount(3); + }); + + test('should allow me to display completed items', async ({ page }) => { + await page.getByTestId('todo-item').nth(1).getByRole('checkbox').check(); + await checkNumberOfCompletedTodosInLocalStorage(page, 1); + await page.getByRole('link', { name: 'Completed' }).click(); + await expect(page.getByTestId('todo-item')).toHaveCount(1); + }); + + test('should allow me to display all items', async ({ page }) => { + await page.getByTestId('todo-item').nth(1).getByRole('checkbox').check(); + await checkNumberOfCompletedTodosInLocalStorage(page, 1); + await page.getByRole('link', { name: 'Active' }).click(); + await page.getByRole('link', { name: 'Completed' }).click(); + await page.getByRole('link', { name: 'All' }).click(); + await expect(page.getByTestId('todo-item')).toHaveCount(3); + }); + + test('should highlight the currently applied filter', async ({ page }) => { + await expect(page.getByRole('link', { name: 'All' })).toHaveClass('selected'); + + //create locators for active and completed links + const activeLink = page.getByRole('link', { name: 'Active' }); + const completedLink = page.getByRole('link', { name: 'Completed' }); + await activeLink.click(); + + // Page change - active items. + await expect(activeLink).toHaveClass('selected'); + await completedLink.click(); + + // Page change - completed items. + await expect(completedLink).toHaveClass('selected'); + }); +}); + +async function createDefaultTodos(page: Page) { + // create a new todo locator + const newTodo = page.getByPlaceholder('What needs to be done?'); + + for (const item of TODO_ITEMS) { + await newTodo.fill(item); + await newTodo.press('Enter'); + } +} + +async function checkNumberOfTodosInLocalStorage(page: Page, expected: number) { + return await page.waitForFunction(e => { + return JSON.parse(localStorage['react-todos']).length === e; + }, expected); +} + +async function checkNumberOfCompletedTodosInLocalStorage(page: Page, expected: number) { + return await page.waitForFunction(e => { + return JSON.parse(localStorage['react-todos']).filter((todo: any) => todo.completed).length === e; + }, expected); +} + +async function checkTodosInLocalStorage(page: Page, title: string) { + return await page.waitForFunction(t => { + return JSON.parse(localStorage['react-todos']).map((todo: any) => todo.title).includes(t); + }, title); +} From 81ae72f497e5c4508ffb1f7c56795a1eff977d5e Mon Sep 17 00:00:00 2001 From: Peter Date: Tue, 24 Oct 2023 16:49:55 +0200 Subject: [PATCH 002/608] Added shared playwright config --- tests/playwright/playwright.react.config.ts | 74 ++------------------ tests/playwright/playwright.shared.config.ts | 63 +++++++++++++++++ tests/playwright/playwright.svelte.config.ts | 74 ++------------------ 3 files changed, 72 insertions(+), 139 deletions(-) create mode 100644 tests/playwright/playwright.shared.config.ts diff --git a/tests/playwright/playwright.react.config.ts b/tests/playwright/playwright.react.config.ts index fc8009ed..c8fa98ef 100644 --- a/tests/playwright/playwright.react.config.ts +++ b/tests/playwright/playwright.react.config.ts @@ -1,77 +1,13 @@ -import { defineConfig, devices } from '@playwright/test'; +import { defineConfig } from '@playwright/test'; +import { sharedConfigWithPort } from './playwright.shared.config'; -/** - * Read environment variables from file. - * https://github.com/motdotla/dotenv - */ -// require('dotenv').config(); +const port = 3000; -/** - * See https://playwright.dev/docs/test-configuration. - */ export default defineConfig({ - testDir: './e2e', - /* Run tests in files in parallel */ - fullyParallel: true, - /* Fail the build on CI if you accidentally left test.only in the source code. */ - forbidOnly: !!process.env.CI, - /* Retry on CI only */ - retries: process.env.CI ? 2 : 0, - /* Opt out of parallel tests on CI. */ - workers: process.env.CI ? 1 : undefined, - /* Reporter to use. See https://playwright.dev/docs/test-reporters */ - reporter: 'html', - /* Shared settings for all the projects below. See https://playwright.dev/docs/api/class-testoptions. */ - use: { - /* Base URL to use in actions like `await page.goto('/')`. */ - baseURL: 'http://127.0.0.1:3000', - - /* Collect trace when retrying the failed test. See https://playwright.dev/docs/trace-viewer */ - trace: 'on-first-retry', - }, - - /* Configure projects for major browsers */ - projects: [ - { - name: 'chromium', - use: { ...devices['Desktop Chrome'] }, - }, - - { - name: 'firefox', - use: { ...devices['Desktop Firefox'] }, - }, - - { - name: 'webkit', - use: { ...devices['Desktop Safari'] }, - }, - - /* Test against mobile viewports. */ - // { - // name: 'Mobile Chrome', - // use: { ...devices['Pixel 5'] }, - // }, - // { - // name: 'Mobile Safari', - // use: { ...devices['iPhone 12'] }, - // }, - - /* Test against branded browsers. */ - // { - // name: 'Microsoft Edge', - // use: { ...devices['Desktop Edge'], channel: 'msedge' }, - // }, - // { - // name: 'Google Chrome', - // use: { ...devices['Desktop Chrome'], channel: 'chrome' }, - // }, - ], - - /* Run your local dev server before starting the tests */ + ...sharedConfigWithPort(port), webServer: { command: 'cd ../../examples/react && pnpm run dev', - url: 'http://127.0.0.1:3000', + port, reuseExistingServer: !process.env.CI, }, }); diff --git a/tests/playwright/playwright.shared.config.ts b/tests/playwright/playwright.shared.config.ts new file mode 100644 index 00000000..828317a7 --- /dev/null +++ b/tests/playwright/playwright.shared.config.ts @@ -0,0 +1,63 @@ +import { PlaywrightTestConfig, devices } from '@playwright/test'; + +export function sharedConfigWithPort(port: number): PlaywrightTestConfig { + return { + testDir: './e2e', + /* Run tests in files in parallel */ + fullyParallel: true, + /* Fail the build on CI if you accidentally left test.only in the source code. */ + forbidOnly: !!process.env.CI, + /* Retry on CI only */ + retries: process.env.CI ? 2 : 0, + /* Opt out of parallel tests on CI. */ + workers: process.env.CI ? 1 : undefined, + /* Reporter to use. See https://playwright.dev/docs/test-reporters */ + reporter: 'html', + /* Shared settings for all the projects below. See https://playwright.dev/docs/api/class-testoptions. */ + use: { + /* Base URL to use in actions like `await page.goto('/')`. */ + baseURL: `http://localhost:${port}/`, + + /* Collect trace when retrying the failed test. See https://playwright.dev/docs/trace-viewer */ + trace: 'on-first-retry', + }, + + /* Configure projects for major browsers */ + projects: [ + { + name: 'chromium', + use: { ...devices['Desktop Chrome'] }, + }, + + { + name: 'firefox', + use: { ...devices['Desktop Firefox'] }, + }, + + { + name: 'webkit', + use: { ...devices['Desktop Safari'] }, + }, + + /* Test against mobile viewports. */ + // { + // name: 'Mobile Chrome', + // use: { ...devices['Pixel 5'] }, + // }, + // { + // name: 'Mobile Safari', + // use: { ...devices['iPhone 12'] }, + // }, + + /* Test against branded browsers. */ + // { + // name: 'Microsoft Edge', + // use: { ...devices['Desktop Edge'], channel: 'msedge' }, + // }, + // { + // name: 'Google Chrome', + // use: { ...devices['Desktop Chrome'], channel: 'chrome' }, + // }, + ], + }; +} diff --git a/tests/playwright/playwright.svelte.config.ts b/tests/playwright/playwright.svelte.config.ts index e1845f20..f92bd3dc 100644 --- a/tests/playwright/playwright.svelte.config.ts +++ b/tests/playwright/playwright.svelte.config.ts @@ -1,79 +1,13 @@ import { defineConfig, devices } from '@playwright/test'; +import { sharedConfigWithPort } from './playwright.shared.config'; -/** - * Read environment variables from file. - * https://github.com/motdotla/dotenv - */ -// require('dotenv').config(); +const port = 5173; -/** - * See https://playwright.dev/docs/test-configuration. - */ export default defineConfig({ - testDir: './e2e', - /* Run tests in files in parallel */ - fullyParallel: true, - /* Fail the build on CI if you accidentally left test.only in the source code. */ - forbidOnly: !!process.env.CI, - /* Retry on CI only */ - retries: process.env.CI ? 2 : 0, - /* Opt out of parallel tests on CI. */ - workers: process.env.CI ? 1 : undefined, - /* Reporter to use. See https://playwright.dev/docs/test-reporters */ - reporter: 'html', - /* Shared settings for all the projects below. See https://playwright.dev/docs/api/class-testoptions. */ - use: { - /* Base URL to use in actions like `await page.goto('/')`. */ - baseURL: 'http://localhost:5173/', - - /* Collect trace when retrying the failed test. See https://playwright.dev/docs/trace-viewer */ - trace: 'on-first-retry', - }, - - /* Configure projects for major browsers */ - projects: [ - { - name: 'chromium', - use: { ...devices['Desktop Chrome'] }, - }, - - { - name: 'firefox', - use: { ...devices['Desktop Firefox'] }, - }, - - { - name: 'webkit', - use: { ...devices['Desktop Safari'] }, - }, - - /* Test against mobile viewports. */ - // { - // name: 'Mobile Chrome', - // use: { ...devices['Pixel 5'] }, - // }, - // { - // name: 'Mobile Safari', - // use: { ...devices['iPhone 12'] }, - // }, - - /* Test against branded browsers. */ - // { - // name: 'Microsoft Edge', - // use: { ...devices['Desktop Edge'], channel: 'msedge' }, - // }, - // { - // name: 'Google Chrome', - // use: { ...devices['Desktop Chrome'], channel: 'chrome' }, - // }, - ], - - /* Run your local dev server before starting the tests */ + ...sharedConfigWithPort(port), webServer: { command: 'cd ../../examples/svelte && pnpm run dev', - // for some reason you need to use port otherwise it loads forever - // url: 'http://127.0.0.1:5173', - port: 5173, + port: port, reuseExistingServer: !process.env.CI, }, }); From 117b4a4cb6eb4ed0abfe089d483a00429bc67e98 Mon Sep 17 00:00:00 2001 From: Peter Date: Wed, 25 Oct 2023 13:23:14 +0200 Subject: [PATCH 003/608] restrucutred svelte examples --- tests/playwright/.gitignore | 3 + tests/playwright/e2e/backspace-delete.spec.ts | 8 +- tests/playwright/e2e/constants.ts | 1 + tests/playwright/e2e/nodes.spec.ts | 14 + tests/playwright/package-lock.json | 1377 +++++++++++++++++ .../tests-examples/demo-todo-app.spec.ts | 437 ------ 6 files changed, 1399 insertions(+), 441 deletions(-) create mode 100644 tests/playwright/e2e/constants.ts create mode 100644 tests/playwright/e2e/nodes.spec.ts create mode 100644 tests/playwright/package-lock.json delete mode 100644 tests/playwright/tests-examples/demo-todo-app.spec.ts diff --git a/tests/playwright/.gitignore b/tests/playwright/.gitignore index 75e854d8..6d284fa6 100644 --- a/tests/playwright/.gitignore +++ b/tests/playwright/.gitignore @@ -2,3 +2,6 @@ node_modules/ /test-results/ /playwright-report/ /playwright/.cache/ +/test-results/ +/playwright-report/ +/playwright/.cache/ diff --git a/tests/playwright/e2e/backspace-delete.spec.ts b/tests/playwright/e2e/backspace-delete.spec.ts index 9b5cee21..0f6d3648 100644 --- a/tests/playwright/e2e/backspace-delete.spec.ts +++ b/tests/playwright/e2e/backspace-delete.spec.ts @@ -1,16 +1,16 @@ import { test, expect } from '@playwright/test'; -const framework = process.env.FRAMEWORK; +import { FRAMEWORK } from './constants'; test('Delete Node with backspace', async ({ page }) => { await page.goto('/'); - await page.locator(`.${framework}-flow__node`).nth(0).click(); + await page.locator(`.${FRAMEWORK}-flow__node`).nth(0).click(); // await page.getByTestId('rf__node-1').click(); await page.keyboard.press('Backspace'); - const nodes = await page.locator(`.${framework}-flow__node`).all(); + const nodes = await page.locator(`.${FRAMEWORK}-flow__node`).all(); expect(nodes).toHaveLength(3); - const edges = await page.locator(`.${framework}-flow__edge`).all(); + const edges = await page.locator(`.${FRAMEWORK}-flow__edge`).all(); expect(edges).toHaveLength(0); }); diff --git a/tests/playwright/e2e/constants.ts b/tests/playwright/e2e/constants.ts new file mode 100644 index 00000000..b1ce66b1 --- /dev/null +++ b/tests/playwright/e2e/constants.ts @@ -0,0 +1 @@ +export const FRAMEWORK = process.env.FRAMEWORK; diff --git a/tests/playwright/e2e/nodes.spec.ts b/tests/playwright/e2e/nodes.spec.ts new file mode 100644 index 00000000..b06de961 --- /dev/null +++ b/tests/playwright/e2e/nodes.spec.ts @@ -0,0 +1,14 @@ +import { test, expect } from '@playwright/test'; + +import { FRAMEWORK } from './constants'; + +test.describe('NODES', () => { + test.beforeEach(async ({ page }) => { + // Go to the starting url before each test. + await page.goto('/tests/nodes'); + }); + + test.describe('selection', () => { + test('selecting a node', async ({ page }) => {}); + }); +}); diff --git a/tests/playwright/package-lock.json b/tests/playwright/package-lock.json new file mode 100644 index 00000000..98e0fdff --- /dev/null +++ b/tests/playwright/package-lock.json @@ -0,0 +1,1377 @@ +{ + "name": "playwright", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "playwright", + "version": "1.0.0", + "license": "ISC", + "dependencies": { + "@playwright/experimental-ct-react": "^1.39.0", + "@types/react": "^18.2.31", + "@types/react-dom": "^18.2.14", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "typescript": "^5.2.2" + }, + "devDependencies": { + "@playwright/test": "^1.39.0", + "@types/node": "^18.7.16" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", + "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.22.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", + "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", + "dependencies": { + "@babel/highlight": "^7.22.13", + "chalk": "^2.4.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.2.tgz", + "integrity": "sha512-0S9TQMmDHlqAZ2ITT95irXKfxN9bncq8ZCoJhun3nHL/lLUxd2NKBJYoNGWH7S0hz6fRQwWlAWn/ILM0C70KZQ==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.2.tgz", + "integrity": "sha512-n7s51eWdaWZ3vGT2tD4T7J6eJs3QoBXydv7vkUM06Bf1cbVD2Kc2UrkzhiQwobfV7NwOnQXYL7UBJ5VPU+RGoQ==", + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.22.13", + "@babel/generator": "^7.23.0", + "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-module-transforms": "^7.23.0", + "@babel/helpers": "^7.23.2", + "@babel/parser": "^7.23.0", + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.23.2", + "@babel/types": "^7.23.0", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/generator": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.0.tgz", + "integrity": "sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==", + "dependencies": { + "@babel/types": "^7.23.0", + "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.15.tgz", + "integrity": "sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==", + "dependencies": { + "@babel/compat-data": "^7.22.9", + "@babel/helper-validator-option": "^7.22.15", + "browserslist": "^4.21.9", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-environment-visitor": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", + "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", + "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", + "dependencies": { + "@babel/template": "^7.22.15", + "@babel/types": "^7.23.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-hoist-variables": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", + "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", + "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", + "dependencies": { + "@babel/types": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.0.tgz", + "integrity": "sha512-WhDWw1tdrlT0gMgUJSlX0IQvoO1eN279zrAUbVB+KpV2c3Tylz8+GnKOLllCS6Z/iZQEyVYxhZVUdPTqs2YYPw==", + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-module-imports": "^7.22.15", + "@babel/helper-simple-access": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/helper-validator-identifier": "^7.22.20" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", + "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", + "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", + "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", + "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.15.tgz", + "integrity": "sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.2.tgz", + "integrity": "sha512-lzchcp8SjTSVe/fPmLwtWVBFC7+Tbn8LGHDVfDp9JGxpAY5opSaEFgt8UQvrnECWOTdji2mOWMz1rOhkHscmGQ==", + "dependencies": { + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.23.2", + "@babel/types": "^7.23.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz", + "integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==", + "dependencies": { + "@babel/helper-validator-identifier": "^7.22.20", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.0.tgz", + "integrity": "sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==", + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-self": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.22.5.tgz", + "integrity": "sha512-nTh2ogNUtxbiSbxaT4Ds6aXnXEipHweN9YRgOX/oNXdf0cCrGn/+2LozFa3lnPV5D90MkjhgckCPBrsoSc1a7g==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-source": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.22.5.tgz", + "integrity": "sha512-yIiRO6yobeEIaI0RTbIr8iAK9FcBHLtZq0S89ZPjDLQXBA4xvghaKqI0etp/tF3htTM0sazJKKLz9oEiGRtu7w==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/template": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", + "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", + "dependencies": { + "@babel/code-frame": "^7.22.13", + "@babel/parser": "^7.22.15", + "@babel/types": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.2.tgz", + "integrity": "sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==", + "dependencies": { + "@babel/code-frame": "^7.22.13", + "@babel/generator": "^7.23.0", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.23.0", + "@babel/types": "^7.23.0", + "debug": "^4.1.0", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.0.tgz", + "integrity": "sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==", + "dependencies": { + "@babel/helper-string-parser": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.20", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.20.tgz", + "integrity": "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz", + "integrity": "sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.20.tgz", + "integrity": "sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz", + "integrity": "sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz", + "integrity": "sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz", + "integrity": "sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz", + "integrity": "sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz", + "integrity": "sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz", + "integrity": "sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz", + "integrity": "sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz", + "integrity": "sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==", + "cpu": [ + "loong64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz", + "integrity": "sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==", + "cpu": [ + "mips64el" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz", + "integrity": "sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==", + "cpu": [ + "ppc64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz", + "integrity": "sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==", + "cpu": [ + "riscv64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz", + "integrity": "sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==", + "cpu": [ + "s390x" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz", + "integrity": "sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz", + "integrity": "sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz", + "integrity": "sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz", + "integrity": "sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz", + "integrity": "sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz", + "integrity": "sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz", + "integrity": "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", + "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.20", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz", + "integrity": "sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@playwright/experimental-ct-core": { + "version": "1.39.0", + "resolved": "https://registry.npmjs.org/@playwright/experimental-ct-core/-/experimental-ct-core-1.39.0.tgz", + "integrity": "sha512-1b/qrlB5A/CdEZns8f2RDkWFmSnGkNyec8n72iinmw07+GHsdMP8fIpazeFB0umxWfo+gPLhkjhTGdB3WXJTBw==", + "dependencies": { + "playwright": "1.39.0", + "playwright-core": "1.39.0", + "vite": "^4.4.10" + }, + "bin": { + "playwright": "cli.js" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/@playwright/experimental-ct-react": { + "version": "1.39.0", + "resolved": "https://registry.npmjs.org/@playwright/experimental-ct-react/-/experimental-ct-react-1.39.0.tgz", + "integrity": "sha512-6GaDVVo6x8P9Jdw3yPbVaEP59nesRsETn3kznHAy+2493VsP3IaVATat2G28z0Sivf/K9Tkh5xRYjiawN0ebgw==", + "dependencies": { + "@playwright/experimental-ct-core": "1.39.0", + "@vitejs/plugin-react": "^4.0.0" + }, + "bin": { + "playwright": "cli.js" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/@playwright/test": { + "version": "1.39.0", + "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.39.0.tgz", + "integrity": "sha512-3u1iFqgzl7zr004bGPYiN/5EZpRUSFddQBra8Rqll5N0/vfpqlP9I9EXqAoGacuAbX6c9Ulg/Cjqglp5VkK6UQ==", + "dev": true, + "dependencies": { + "playwright": "1.39.0" + }, + "bin": { + "playwright": "cli.js" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/@types/babel__core": { + "version": "7.20.3", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.3.tgz", + "integrity": "sha512-54fjTSeSHwfan8AyHWrKbfBWiEUrNTZsUwPTDSNaaP1QDQIZbeNUg3a59E9D+375MzUw/x1vx2/0F5LBz+AeYA==", + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.6.6", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.6.tgz", + "integrity": "sha512-66BXMKb/sUWbMdBNdMvajU7i/44RkrA3z/Yt1c7R5xejt8qh84iU54yUWCtm0QwGJlDcf/gg4zd/x4mpLAlb/w==", + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.3", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.3.tgz", + "integrity": "sha512-ciwyCLeuRfxboZ4isgdNZi/tkt06m8Tw6uGbBSBgWrnnZGNXiEyM27xc/PjXGQLqlZ6ylbgHMnm7ccF9tCkOeQ==", + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.20.3", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.3.tgz", + "integrity": "sha512-Lsh766rGEFbaxMIDH7Qa+Yha8cMVI3qAK6CHt3OR0YfxOIn5Z54iHiyDRycHrBqeIiqGa20Kpsv1cavfBKkRSw==", + "dependencies": { + "@babel/types": "^7.20.7" + } + }, + "node_modules/@types/node": { + "version": "18.18.6", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.18.6.tgz", + "integrity": "sha512-wf3Vz+jCmOQ2HV1YUJuCWdL64adYxumkrxtc+H1VUQlnQI04+5HtH+qZCOE21lBE7gIrt+CwX2Wv8Acrw5Ak6w==", + "devOptional": true + }, + "node_modules/@types/prop-types": { + "version": "15.7.9", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.9.tgz", + "integrity": "sha512-n1yyPsugYNSmHgxDFjicaI2+gCNjsBck8UX9kuofAKlc0h1bL+20oSF72KeNaW2DUlesbEVCFgyV2dPGTiY42g==" + }, + "node_modules/@types/react": { + "version": "18.2.31", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.31.tgz", + "integrity": "sha512-c2UnPv548q+5DFh03y8lEDeMfDwBn9G3dRwfkrxQMo/dOtRHUUO57k6pHvBIfH/VF4Nh+98mZ5aaSe+2echD5g==", + "dependencies": { + "@types/prop-types": "*", + "@types/scheduler": "*", + "csstype": "^3.0.2" + } + }, + "node_modules/@types/react-dom": { + "version": "18.2.14", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.14.tgz", + "integrity": "sha512-V835xgdSVmyQmI1KLV2BEIUgqEuinxp9O4G6g3FqO/SqLac049E53aysv0oEFD2kHfejeKU+ZqL2bcFWj9gLAQ==", + "dependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/scheduler": { + "version": "0.16.5", + "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.5.tgz", + "integrity": "sha512-s/FPdYRmZR8SjLWGMCuax7r3qCWQw9QKHzXVukAuuIJkXkDRwp+Pu5LMIVFi0Fxbav35WURicYr8u1QsoybnQw==" + }, + "node_modules/@vitejs/plugin-react": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.1.0.tgz", + "integrity": "sha512-rM0SqazU9iqPUraQ2JlIvReeaxOoRj6n+PzB1C0cBzIbd8qP336nC39/R9yPi3wVcah7E7j/kdU1uCUqMEU4OQ==", + "dependencies": { + "@babel/core": "^7.22.20", + "@babel/plugin-transform-react-jsx-self": "^7.22.5", + "@babel/plugin-transform-react-jsx-source": "^7.22.5", + "@types/babel__core": "^7.20.2", + "react-refresh": "^0.14.0" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "vite": "^4.2.0" + } + }, + "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==", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/browserslist": { + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.1.tgz", + "integrity": "sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001541", + "electron-to-chromium": "^1.4.535", + "node-releases": "^2.0.13", + "update-browserslist-db": "^1.0.13" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001554", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001554.tgz", + "integrity": "sha512-A2E3U//MBwbJVzebddm1YfNp7Nud5Ip+IPn4BozBmn4KqVX7AvluoIDFWjsv5OkGnKUXQVmMSoMKLa3ScCblcQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] + }, + "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==", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "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==", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==" + }, + "node_modules/csstype": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz", + "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==" + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/electron-to-chromium": { + "version": "1.4.566", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.566.tgz", + "integrity": "sha512-mv+fAy27uOmTVlUULy15U3DVJ+jg+8iyKH1bpwboCRhtDC69GKf1PPTZvEIhCyDr81RFqfxZJYrbgp933a1vtg==" + }, + "node_modules/esbuild": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz", + "integrity": "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==", + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.18.20", + "@esbuild/android-arm64": "0.18.20", + "@esbuild/android-x64": "0.18.20", + "@esbuild/darwin-arm64": "0.18.20", + "@esbuild/darwin-x64": "0.18.20", + "@esbuild/freebsd-arm64": "0.18.20", + "@esbuild/freebsd-x64": "0.18.20", + "@esbuild/linux-arm": "0.18.20", + "@esbuild/linux-arm64": "0.18.20", + "@esbuild/linux-ia32": "0.18.20", + "@esbuild/linux-loong64": "0.18.20", + "@esbuild/linux-mips64el": "0.18.20", + "@esbuild/linux-ppc64": "0.18.20", + "@esbuild/linux-riscv64": "0.18.20", + "@esbuild/linux-s390x": "0.18.20", + "@esbuild/linux-x64": "0.18.20", + "@esbuild/netbsd-x64": "0.18.20", + "@esbuild/openbsd-x64": "0.18.20", + "@esbuild/sunos-x64": "0.18.20", + "@esbuild/win32-arm64": "0.18.20", + "@esbuild/win32-ia32": "0.18.20", + "@esbuild/win32-x64": "0.18.20" + } + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "engines": { + "node": ">=6" + } + }, + "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": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "engines": { + "node": ">=4" + } + }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "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==" + }, + "node_modules/nanoid": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", + "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/node-releases": { + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", + "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==" + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + }, + "node_modules/playwright": { + "version": "1.39.0", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.39.0.tgz", + "integrity": "sha512-naE5QT11uC/Oiq0BwZ50gDmy8c8WLPRTEWuSSFVG2egBka/1qMoSqYQcROMT9zLwJ86oPofcTH2jBY/5wWOgIw==", + "dependencies": { + "playwright-core": "1.39.0" + }, + "bin": { + "playwright": "cli.js" + }, + "engines": { + "node": ">=16" + }, + "optionalDependencies": { + "fsevents": "2.3.2" + } + }, + "node_modules/playwright-core": { + "version": "1.39.0", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.39.0.tgz", + "integrity": "sha512-+k4pdZgs1qiM+OUkSjx96YiKsXsmb59evFoqv8SKO067qBA+Z2s/dCzJij/ZhdQcs2zlTAgRKfeiiLm8PQ2qvw==", + "bin": { + "playwright-core": "cli.js" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/postcss": { + "version": "8.4.31", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", + "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.6", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/react": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", + "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", + "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==", + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.0" + }, + "peerDependencies": { + "react": "^18.2.0" + } + }, + "node_modules/react-refresh": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.0.tgz", + "integrity": "sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/rollup": { + "version": "3.29.4", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.29.4.tgz", + "integrity": "sha512-oWzmBZwvYrU0iJHtDmhsm662rC15FRXmcjCk1xD771dFDx5jJ02ufAQQTn0etB2emNk4J9EZg/yWKpsn9BWGRw==", + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=14.18.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/scheduler": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", + "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", + "dependencies": { + "loose-envify": "^1.1.0" + } + }, + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "engines": { + "node": ">=0.10.0" + } + }, + "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==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "engines": { + "node": ">=4" + } + }, + "node_modules/typescript": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz", + "integrity": "sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", + "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/vite": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/vite/-/vite-4.5.0.tgz", + "integrity": "sha512-ulr8rNLA6rkyFAlVWw2q5YJ91v098AFQ2R0PRFwPzREXOUJQPtFUG0t+/ZikhaOCDqFoDhN6/v8Sq0o4araFAw==", + "dependencies": { + "esbuild": "^0.18.10", + "postcss": "^8.4.27", + "rollup": "^3.27.1" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + }, + "peerDependencies": { + "@types/node": ">= 14", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" + } + } +} diff --git a/tests/playwright/tests-examples/demo-todo-app.spec.ts b/tests/playwright/tests-examples/demo-todo-app.spec.ts deleted file mode 100644 index 2fd6016f..00000000 --- a/tests/playwright/tests-examples/demo-todo-app.spec.ts +++ /dev/null @@ -1,437 +0,0 @@ -import { test, expect, type Page } from '@playwright/test'; - -test.beforeEach(async ({ page }) => { - await page.goto('https://demo.playwright.dev/todomvc'); -}); - -const TODO_ITEMS = [ - 'buy some cheese', - 'feed the cat', - 'book a doctors appointment' -]; - -test.describe('New Todo', () => { - test('should allow me to add todo items', async ({ page }) => { - // create a new todo locator - const newTodo = page.getByPlaceholder('What needs to be done?'); - - // Create 1st todo. - await newTodo.fill(TODO_ITEMS[0]); - await newTodo.press('Enter'); - - // Make sure the list only has one todo item. - await expect(page.getByTestId('todo-title')).toHaveText([ - TODO_ITEMS[0] - ]); - - // Create 2nd todo. - await newTodo.fill(TODO_ITEMS[1]); - await newTodo.press('Enter'); - - // Make sure the list now has two todo items. - await expect(page.getByTestId('todo-title')).toHaveText([ - TODO_ITEMS[0], - TODO_ITEMS[1] - ]); - - await checkNumberOfTodosInLocalStorage(page, 2); - }); - - test('should clear text input field when an item is added', async ({ page }) => { - // create a new todo locator - const newTodo = page.getByPlaceholder('What needs to be done?'); - - // Create one todo item. - await newTodo.fill(TODO_ITEMS[0]); - await newTodo.press('Enter'); - - // Check that input is empty. - await expect(newTodo).toBeEmpty(); - await checkNumberOfTodosInLocalStorage(page, 1); - }); - - test('should append new items to the bottom of the list', async ({ page }) => { - // Create 3 items. - await createDefaultTodos(page); - - // create a todo count locator - const todoCount = page.getByTestId('todo-count') - - // Check test using different methods. - await expect(page.getByText('3 items left')).toBeVisible(); - await expect(todoCount).toHaveText('3 items left'); - await expect(todoCount).toContainText('3'); - await expect(todoCount).toHaveText(/3/); - - // Check all items in one call. - await expect(page.getByTestId('todo-title')).toHaveText(TODO_ITEMS); - await checkNumberOfTodosInLocalStorage(page, 3); - }); -}); - -test.describe('Mark all as completed', () => { - test.beforeEach(async ({ page }) => { - await createDefaultTodos(page); - await checkNumberOfTodosInLocalStorage(page, 3); - }); - - test.afterEach(async ({ page }) => { - await checkNumberOfTodosInLocalStorage(page, 3); - }); - - test('should allow me to mark all items as completed', async ({ page }) => { - // Complete all todos. - await page.getByLabel('Mark all as complete').check(); - - // Ensure all todos have 'completed' class. - await expect(page.getByTestId('todo-item')).toHaveClass(['completed', 'completed', 'completed']); - await checkNumberOfCompletedTodosInLocalStorage(page, 3); - }); - - test('should allow me to clear the complete state of all items', async ({ page }) => { - const toggleAll = page.getByLabel('Mark all as complete'); - // Check and then immediately uncheck. - await toggleAll.check(); - await toggleAll.uncheck(); - - // Should be no completed classes. - await expect(page.getByTestId('todo-item')).toHaveClass(['', '', '']); - }); - - test('complete all checkbox should update state when items are completed / cleared', async ({ page }) => { - const toggleAll = page.getByLabel('Mark all as complete'); - await toggleAll.check(); - await expect(toggleAll).toBeChecked(); - await checkNumberOfCompletedTodosInLocalStorage(page, 3); - - // Uncheck first todo. - const firstTodo = page.getByTestId('todo-item').nth(0); - await firstTodo.getByRole('checkbox').uncheck(); - - // Reuse toggleAll locator and make sure its not checked. - await expect(toggleAll).not.toBeChecked(); - - await firstTodo.getByRole('checkbox').check(); - await checkNumberOfCompletedTodosInLocalStorage(page, 3); - - // Assert the toggle all is checked again. - await expect(toggleAll).toBeChecked(); - }); -}); - -test.describe('Item', () => { - - test('should allow me to mark items as complete', async ({ page }) => { - // create a new todo locator - const newTodo = page.getByPlaceholder('What needs to be done?'); - - // Create two items. - for (const item of TODO_ITEMS.slice(0, 2)) { - await newTodo.fill(item); - await newTodo.press('Enter'); - } - - // Check first item. - const firstTodo = page.getByTestId('todo-item').nth(0); - await firstTodo.getByRole('checkbox').check(); - await expect(firstTodo).toHaveClass('completed'); - - // Check second item. - const secondTodo = page.getByTestId('todo-item').nth(1); - await expect(secondTodo).not.toHaveClass('completed'); - await secondTodo.getByRole('checkbox').check(); - - // Assert completed class. - await expect(firstTodo).toHaveClass('completed'); - await expect(secondTodo).toHaveClass('completed'); - }); - - test('should allow me to un-mark items as complete', async ({ page }) => { - // create a new todo locator - const newTodo = page.getByPlaceholder('What needs to be done?'); - - // Create two items. - for (const item of TODO_ITEMS.slice(0, 2)) { - await newTodo.fill(item); - await newTodo.press('Enter'); - } - - const firstTodo = page.getByTestId('todo-item').nth(0); - const secondTodo = page.getByTestId('todo-item').nth(1); - const firstTodoCheckbox = firstTodo.getByRole('checkbox'); - - await firstTodoCheckbox.check(); - await expect(firstTodo).toHaveClass('completed'); - await expect(secondTodo).not.toHaveClass('completed'); - await checkNumberOfCompletedTodosInLocalStorage(page, 1); - - await firstTodoCheckbox.uncheck(); - await expect(firstTodo).not.toHaveClass('completed'); - await expect(secondTodo).not.toHaveClass('completed'); - await checkNumberOfCompletedTodosInLocalStorage(page, 0); - }); - - test('should allow me to edit an item', async ({ page }) => { - await createDefaultTodos(page); - - const todoItems = page.getByTestId('todo-item'); - const secondTodo = todoItems.nth(1); - await secondTodo.dblclick(); - await expect(secondTodo.getByRole('textbox', { name: 'Edit' })).toHaveValue(TODO_ITEMS[1]); - await secondTodo.getByRole('textbox', { name: 'Edit' }).fill('buy some sausages'); - await secondTodo.getByRole('textbox', { name: 'Edit' }).press('Enter'); - - // Explicitly assert the new text value. - await expect(todoItems).toHaveText([ - TODO_ITEMS[0], - 'buy some sausages', - TODO_ITEMS[2] - ]); - await checkTodosInLocalStorage(page, 'buy some sausages'); - }); -}); - -test.describe('Editing', () => { - test.beforeEach(async ({ page }) => { - await createDefaultTodos(page); - await checkNumberOfTodosInLocalStorage(page, 3); - }); - - test('should hide other controls when editing', async ({ page }) => { - const todoItem = page.getByTestId('todo-item').nth(1); - await todoItem.dblclick(); - await expect(todoItem.getByRole('checkbox')).not.toBeVisible(); - await expect(todoItem.locator('label', { - hasText: TODO_ITEMS[1], - })).not.toBeVisible(); - await checkNumberOfTodosInLocalStorage(page, 3); - }); - - test('should save edits on blur', async ({ page }) => { - const todoItems = page.getByTestId('todo-item'); - await todoItems.nth(1).dblclick(); - await todoItems.nth(1).getByRole('textbox', { name: 'Edit' }).fill('buy some sausages'); - await todoItems.nth(1).getByRole('textbox', { name: 'Edit' }).dispatchEvent('blur'); - - await expect(todoItems).toHaveText([ - TODO_ITEMS[0], - 'buy some sausages', - TODO_ITEMS[2], - ]); - await checkTodosInLocalStorage(page, 'buy some sausages'); - }); - - test('should trim entered text', async ({ page }) => { - const todoItems = page.getByTestId('todo-item'); - await todoItems.nth(1).dblclick(); - await todoItems.nth(1).getByRole('textbox', { name: 'Edit' }).fill(' buy some sausages '); - await todoItems.nth(1).getByRole('textbox', { name: 'Edit' }).press('Enter'); - - await expect(todoItems).toHaveText([ - TODO_ITEMS[0], - 'buy some sausages', - TODO_ITEMS[2], - ]); - await checkTodosInLocalStorage(page, 'buy some sausages'); - }); - - test('should remove the item if an empty text string was entered', async ({ page }) => { - const todoItems = page.getByTestId('todo-item'); - await todoItems.nth(1).dblclick(); - await todoItems.nth(1).getByRole('textbox', { name: 'Edit' }).fill(''); - await todoItems.nth(1).getByRole('textbox', { name: 'Edit' }).press('Enter'); - - await expect(todoItems).toHaveText([ - TODO_ITEMS[0], - TODO_ITEMS[2], - ]); - }); - - test('should cancel edits on escape', async ({ page }) => { - const todoItems = page.getByTestId('todo-item'); - await todoItems.nth(1).dblclick(); - await todoItems.nth(1).getByRole('textbox', { name: 'Edit' }).fill('buy some sausages'); - await todoItems.nth(1).getByRole('textbox', { name: 'Edit' }).press('Escape'); - await expect(todoItems).toHaveText(TODO_ITEMS); - }); -}); - -test.describe('Counter', () => { - test('should display the current number of todo items', async ({ page }) => { - // create a new todo locator - const newTodo = page.getByPlaceholder('What needs to be done?'); - - // create a todo count locator - const todoCount = page.getByTestId('todo-count') - - await newTodo.fill(TODO_ITEMS[0]); - await newTodo.press('Enter'); - - await expect(todoCount).toContainText('1'); - - await newTodo.fill(TODO_ITEMS[1]); - await newTodo.press('Enter'); - await expect(todoCount).toContainText('2'); - - await checkNumberOfTodosInLocalStorage(page, 2); - }); -}); - -test.describe('Clear completed button', () => { - test.beforeEach(async ({ page }) => { - await createDefaultTodos(page); - }); - - test('should display the correct text', async ({ page }) => { - await page.locator('.todo-list li .toggle').first().check(); - await expect(page.getByRole('button', { name: 'Clear completed' })).toBeVisible(); - }); - - test('should remove completed items when clicked', async ({ page }) => { - const todoItems = page.getByTestId('todo-item'); - await todoItems.nth(1).getByRole('checkbox').check(); - await page.getByRole('button', { name: 'Clear completed' }).click(); - await expect(todoItems).toHaveCount(2); - await expect(todoItems).toHaveText([TODO_ITEMS[0], TODO_ITEMS[2]]); - }); - - test('should be hidden when there are no items that are completed', async ({ page }) => { - await page.locator('.todo-list li .toggle').first().check(); - await page.getByRole('button', { name: 'Clear completed' }).click(); - await expect(page.getByRole('button', { name: 'Clear completed' })).toBeHidden(); - }); -}); - -test.describe('Persistence', () => { - test('should persist its data', async ({ page }) => { - // create a new todo locator - const newTodo = page.getByPlaceholder('What needs to be done?'); - - for (const item of TODO_ITEMS.slice(0, 2)) { - await newTodo.fill(item); - await newTodo.press('Enter'); - } - - const todoItems = page.getByTestId('todo-item'); - const firstTodoCheck = todoItems.nth(0).getByRole('checkbox'); - await firstTodoCheck.check(); - await expect(todoItems).toHaveText([TODO_ITEMS[0], TODO_ITEMS[1]]); - await expect(firstTodoCheck).toBeChecked(); - await expect(todoItems).toHaveClass(['completed', '']); - - // Ensure there is 1 completed item. - await checkNumberOfCompletedTodosInLocalStorage(page, 1); - - // Now reload. - await page.reload(); - await expect(todoItems).toHaveText([TODO_ITEMS[0], TODO_ITEMS[1]]); - await expect(firstTodoCheck).toBeChecked(); - await expect(todoItems).toHaveClass(['completed', '']); - }); -}); - -test.describe('Routing', () => { - test.beforeEach(async ({ page }) => { - await createDefaultTodos(page); - // make sure the app had a chance to save updated todos in storage - // before navigating to a new view, otherwise the items can get lost :( - // in some frameworks like Durandal - await checkTodosInLocalStorage(page, TODO_ITEMS[0]); - }); - - test('should allow me to display active items', async ({ page }) => { - const todoItem = page.getByTestId('todo-item'); - await page.getByTestId('todo-item').nth(1).getByRole('checkbox').check(); - - await checkNumberOfCompletedTodosInLocalStorage(page, 1); - await page.getByRole('link', { name: 'Active' }).click(); - await expect(todoItem).toHaveCount(2); - await expect(todoItem).toHaveText([TODO_ITEMS[0], TODO_ITEMS[2]]); - }); - - test('should respect the back button', async ({ page }) => { - const todoItem = page.getByTestId('todo-item'); - await page.getByTestId('todo-item').nth(1).getByRole('checkbox').check(); - - await checkNumberOfCompletedTodosInLocalStorage(page, 1); - - await test.step('Showing all items', async () => { - await page.getByRole('link', { name: 'All' }).click(); - await expect(todoItem).toHaveCount(3); - }); - - await test.step('Showing active items', async () => { - await page.getByRole('link', { name: 'Active' }).click(); - }); - - await test.step('Showing completed items', async () => { - await page.getByRole('link', { name: 'Completed' }).click(); - }); - - await expect(todoItem).toHaveCount(1); - await page.goBack(); - await expect(todoItem).toHaveCount(2); - await page.goBack(); - await expect(todoItem).toHaveCount(3); - }); - - test('should allow me to display completed items', async ({ page }) => { - await page.getByTestId('todo-item').nth(1).getByRole('checkbox').check(); - await checkNumberOfCompletedTodosInLocalStorage(page, 1); - await page.getByRole('link', { name: 'Completed' }).click(); - await expect(page.getByTestId('todo-item')).toHaveCount(1); - }); - - test('should allow me to display all items', async ({ page }) => { - await page.getByTestId('todo-item').nth(1).getByRole('checkbox').check(); - await checkNumberOfCompletedTodosInLocalStorage(page, 1); - await page.getByRole('link', { name: 'Active' }).click(); - await page.getByRole('link', { name: 'Completed' }).click(); - await page.getByRole('link', { name: 'All' }).click(); - await expect(page.getByTestId('todo-item')).toHaveCount(3); - }); - - test('should highlight the currently applied filter', async ({ page }) => { - await expect(page.getByRole('link', { name: 'All' })).toHaveClass('selected'); - - //create locators for active and completed links - const activeLink = page.getByRole('link', { name: 'Active' }); - const completedLink = page.getByRole('link', { name: 'Completed' }); - await activeLink.click(); - - // Page change - active items. - await expect(activeLink).toHaveClass('selected'); - await completedLink.click(); - - // Page change - completed items. - await expect(completedLink).toHaveClass('selected'); - }); -}); - -async function createDefaultTodos(page: Page) { - // create a new todo locator - const newTodo = page.getByPlaceholder('What needs to be done?'); - - for (const item of TODO_ITEMS) { - await newTodo.fill(item); - await newTodo.press('Enter'); - } -} - -async function checkNumberOfTodosInLocalStorage(page: Page, expected: number) { - return await page.waitForFunction(e => { - return JSON.parse(localStorage['react-todos']).length === e; - }, expected); -} - -async function checkNumberOfCompletedTodosInLocalStorage(page: Page, expected: number) { - return await page.waitForFunction(e => { - return JSON.parse(localStorage['react-todos']).filter((todo: any) => todo.completed).length === e; - }, expected); -} - -async function checkTodosInLocalStorage(page: Page, title: string) { - return await page.waitForFunction(t => { - return JSON.parse(localStorage['react-todos']).map((todo: any) => todo.title).includes(t); - }, title); -} From eca85310e165cf7fbc5d08f36d512fc71a5fc8f4 Mon Sep 17 00:00:00 2001 From: Peter Date: Wed, 25 Oct 2023 13:23:37 +0200 Subject: [PATCH 004/608] restrucutred svelte examples --- .../src/components/Header/Header.svelte | 2 +- examples/svelte/src/routes/+layout.server.ts | 6 +- .../src/routes/{ => examples}/+layout.svelte | 2 +- .../svelte/src/routes/examples/+page.svelte | 1 + .../add-node-on-drop/+page.svelte | 0 .../add-node-on-drop/Flow.svelte | 0 .../custom-connection-line/+page.svelte | 0 .../ConnectionLine.svelte | 0 .../custom-connection-line/CustomNode.svelte | 0 .../{ => examples}/customnode/+page.svelte | 0 .../customnode/CustomNode.svelte | 0 .../routes/{ => examples}/dagre/+page.svelte | 0 .../{ => examples}/dagre/nodes-and-edges.ts | 0 .../{ => examples}/drag-n-drop/+page.svelte | 0 .../{ => examples}/drag-n-drop/Flow.svelte | 0 .../{ => examples}/drag-n-drop/Sidebar.svelte | 0 .../routes/{ => examples}/edges/+page.svelte | 0 .../routes/{ => examples}/figma/+page.svelte | 0 .../{ => examples}/interaction/+page.svelte | 0 .../{ => examples}/intersections/+page.svelte | 0 .../{ => examples}/intersections/+server.ts | 0 .../{ => examples}/intersections/Flow.svelte | 0 .../intersections/nodes-and-edges.ts | 0 .../{ => examples}/overview/+page.svelte | 0 .../{ => examples}/overview/CustomEdge.svelte | 0 .../{ => examples}/overview/CustomNode.svelte | 0 .../overview/CustomNodeDragHandle.svelte | 0 .../routes/{ => examples}/stress/+page.svelte | 0 .../{ => examples}/subflows/+page.svelte | 0 .../{ => examples}/subflows/DebugNode.svelte | 0 .../two-way-viewport/+page.svelte | 0 .../two-way-viewport/Flow.svelte | 0 .../{ => examples}/usesvelteflow/+page.svelte | 0 .../{ => examples}/usesvelteflow/Flow.svelte | 0 .../usesvelteflow/Sidebar.svelte | 0 .../useupdatenodeinternals/+page.svelte | 0 .../useupdatenodeinternals/CustomNode.svelte | 0 .../useupdatenodeinternals/Flow.svelte | 0 .../{ => examples}/validation/+page.svelte | 0 .../{ => examples}/validation/style.css | 0 .../src/routes/tests/nodes/+page.svelte | 9 +++ .../svelte/src/routes/tests/nodes/Flow.svelte | 12 +++ .../src/routes/tests/nodes/nodesAndEdges.ts | 73 +++++++++++++++++++ examples/svelte/svelte.config.js | 5 +- 44 files changed, 104 insertions(+), 6 deletions(-) rename examples/svelte/src/routes/{ => examples}/+layout.svelte (81%) create mode 100644 examples/svelte/src/routes/examples/+page.svelte rename examples/svelte/src/routes/{ => examples}/add-node-on-drop/+page.svelte (100%) rename examples/svelte/src/routes/{ => examples}/add-node-on-drop/Flow.svelte (100%) rename examples/svelte/src/routes/{ => examples}/custom-connection-line/+page.svelte (100%) rename examples/svelte/src/routes/{ => examples}/custom-connection-line/ConnectionLine.svelte (100%) rename examples/svelte/src/routes/{ => examples}/custom-connection-line/CustomNode.svelte (100%) rename examples/svelte/src/routes/{ => examples}/customnode/+page.svelte (100%) rename examples/svelte/src/routes/{ => examples}/customnode/CustomNode.svelte (100%) rename examples/svelte/src/routes/{ => examples}/dagre/+page.svelte (100%) rename examples/svelte/src/routes/{ => examples}/dagre/nodes-and-edges.ts (100%) rename examples/svelte/src/routes/{ => examples}/drag-n-drop/+page.svelte (100%) rename examples/svelte/src/routes/{ => examples}/drag-n-drop/Flow.svelte (100%) rename examples/svelte/src/routes/{ => examples}/drag-n-drop/Sidebar.svelte (100%) rename examples/svelte/src/routes/{ => examples}/edges/+page.svelte (100%) rename examples/svelte/src/routes/{ => examples}/figma/+page.svelte (100%) rename examples/svelte/src/routes/{ => examples}/interaction/+page.svelte (100%) rename examples/svelte/src/routes/{ => examples}/intersections/+page.svelte (100%) rename examples/svelte/src/routes/{ => examples}/intersections/+server.ts (100%) rename examples/svelte/src/routes/{ => examples}/intersections/Flow.svelte (100%) rename examples/svelte/src/routes/{ => examples}/intersections/nodes-and-edges.ts (100%) rename examples/svelte/src/routes/{ => examples}/overview/+page.svelte (100%) rename examples/svelte/src/routes/{ => examples}/overview/CustomEdge.svelte (100%) rename examples/svelte/src/routes/{ => examples}/overview/CustomNode.svelte (100%) rename examples/svelte/src/routes/{ => examples}/overview/CustomNodeDragHandle.svelte (100%) rename examples/svelte/src/routes/{ => examples}/stress/+page.svelte (100%) rename examples/svelte/src/routes/{ => examples}/subflows/+page.svelte (100%) rename examples/svelte/src/routes/{ => examples}/subflows/DebugNode.svelte (100%) rename examples/svelte/src/routes/{ => examples}/two-way-viewport/+page.svelte (100%) rename examples/svelte/src/routes/{ => examples}/two-way-viewport/Flow.svelte (100%) rename examples/svelte/src/routes/{ => examples}/usesvelteflow/+page.svelte (100%) rename examples/svelte/src/routes/{ => examples}/usesvelteflow/Flow.svelte (100%) rename examples/svelte/src/routes/{ => examples}/usesvelteflow/Sidebar.svelte (100%) rename examples/svelte/src/routes/{ => examples}/useupdatenodeinternals/+page.svelte (100%) rename examples/svelte/src/routes/{ => examples}/useupdatenodeinternals/CustomNode.svelte (100%) rename examples/svelte/src/routes/{ => examples}/useupdatenodeinternals/Flow.svelte (100%) rename examples/svelte/src/routes/{ => examples}/validation/+page.svelte (100%) rename examples/svelte/src/routes/{ => examples}/validation/style.css (100%) create mode 100644 examples/svelte/src/routes/tests/nodes/+page.svelte create mode 100644 examples/svelte/src/routes/tests/nodes/Flow.svelte create mode 100644 examples/svelte/src/routes/tests/nodes/nodesAndEdges.ts diff --git a/examples/svelte/src/components/Header/Header.svelte b/examples/svelte/src/components/Header/Header.svelte index 202e513b..0bd941b7 100644 --- a/examples/svelte/src/components/Header/Header.svelte +++ b/examples/svelte/src/components/Header/Header.svelte @@ -31,7 +31,7 @@ diff --git a/examples/svelte/src/routes/+layout.server.ts b/examples/svelte/src/routes/+layout.server.ts index b64f1170..c968a610 100644 --- a/examples/svelte/src/routes/+layout.server.ts +++ b/examples/svelte/src/routes/+layout.server.ts @@ -2,7 +2,7 @@ import { redirect } from '@sveltejs/kit'; /** @type {import('./$types').LayoutServerLoad} */ export function load({ route }) { - if (route.id === '/') { - throw redirect(307, '/overview'); - } + if (route.id === '/') { + throw redirect(307, '/examples/overview'); + } } diff --git a/examples/svelte/src/routes/+layout.svelte b/examples/svelte/src/routes/examples/+layout.svelte similarity index 81% rename from examples/svelte/src/routes/+layout.svelte rename to examples/svelte/src/routes/examples/+layout.svelte index 84598fec..cf9f655f 100644 --- a/examples/svelte/src/routes/+layout.svelte +++ b/examples/svelte/src/routes/examples/+layout.svelte @@ -1,5 +1,5 @@
diff --git a/examples/svelte/src/routes/examples/+page.svelte b/examples/svelte/src/routes/examples/+page.svelte new file mode 100644 index 00000000..45db2228 --- /dev/null +++ b/examples/svelte/src/routes/examples/+page.svelte @@ -0,0 +1 @@ +
this redirects to /overview
diff --git a/examples/svelte/src/routes/add-node-on-drop/+page.svelte b/examples/svelte/src/routes/examples/add-node-on-drop/+page.svelte similarity index 100% rename from examples/svelte/src/routes/add-node-on-drop/+page.svelte rename to examples/svelte/src/routes/examples/add-node-on-drop/+page.svelte diff --git a/examples/svelte/src/routes/add-node-on-drop/Flow.svelte b/examples/svelte/src/routes/examples/add-node-on-drop/Flow.svelte similarity index 100% rename from examples/svelte/src/routes/add-node-on-drop/Flow.svelte rename to examples/svelte/src/routes/examples/add-node-on-drop/Flow.svelte diff --git a/examples/svelte/src/routes/custom-connection-line/+page.svelte b/examples/svelte/src/routes/examples/custom-connection-line/+page.svelte similarity index 100% rename from examples/svelte/src/routes/custom-connection-line/+page.svelte rename to examples/svelte/src/routes/examples/custom-connection-line/+page.svelte diff --git a/examples/svelte/src/routes/custom-connection-line/ConnectionLine.svelte b/examples/svelte/src/routes/examples/custom-connection-line/ConnectionLine.svelte similarity index 100% rename from examples/svelte/src/routes/custom-connection-line/ConnectionLine.svelte rename to examples/svelte/src/routes/examples/custom-connection-line/ConnectionLine.svelte diff --git a/examples/svelte/src/routes/custom-connection-line/CustomNode.svelte b/examples/svelte/src/routes/examples/custom-connection-line/CustomNode.svelte similarity index 100% rename from examples/svelte/src/routes/custom-connection-line/CustomNode.svelte rename to examples/svelte/src/routes/examples/custom-connection-line/CustomNode.svelte diff --git a/examples/svelte/src/routes/customnode/+page.svelte b/examples/svelte/src/routes/examples/customnode/+page.svelte similarity index 100% rename from examples/svelte/src/routes/customnode/+page.svelte rename to examples/svelte/src/routes/examples/customnode/+page.svelte diff --git a/examples/svelte/src/routes/customnode/CustomNode.svelte b/examples/svelte/src/routes/examples/customnode/CustomNode.svelte similarity index 100% rename from examples/svelte/src/routes/customnode/CustomNode.svelte rename to examples/svelte/src/routes/examples/customnode/CustomNode.svelte diff --git a/examples/svelte/src/routes/dagre/+page.svelte b/examples/svelte/src/routes/examples/dagre/+page.svelte similarity index 100% rename from examples/svelte/src/routes/dagre/+page.svelte rename to examples/svelte/src/routes/examples/dagre/+page.svelte diff --git a/examples/svelte/src/routes/dagre/nodes-and-edges.ts b/examples/svelte/src/routes/examples/dagre/nodes-and-edges.ts similarity index 100% rename from examples/svelte/src/routes/dagre/nodes-and-edges.ts rename to examples/svelte/src/routes/examples/dagre/nodes-and-edges.ts diff --git a/examples/svelte/src/routes/drag-n-drop/+page.svelte b/examples/svelte/src/routes/examples/drag-n-drop/+page.svelte similarity index 100% rename from examples/svelte/src/routes/drag-n-drop/+page.svelte rename to examples/svelte/src/routes/examples/drag-n-drop/+page.svelte diff --git a/examples/svelte/src/routes/drag-n-drop/Flow.svelte b/examples/svelte/src/routes/examples/drag-n-drop/Flow.svelte similarity index 100% rename from examples/svelte/src/routes/drag-n-drop/Flow.svelte rename to examples/svelte/src/routes/examples/drag-n-drop/Flow.svelte diff --git a/examples/svelte/src/routes/drag-n-drop/Sidebar.svelte b/examples/svelte/src/routes/examples/drag-n-drop/Sidebar.svelte similarity index 100% rename from examples/svelte/src/routes/drag-n-drop/Sidebar.svelte rename to examples/svelte/src/routes/examples/drag-n-drop/Sidebar.svelte diff --git a/examples/svelte/src/routes/edges/+page.svelte b/examples/svelte/src/routes/examples/edges/+page.svelte similarity index 100% rename from examples/svelte/src/routes/edges/+page.svelte rename to examples/svelte/src/routes/examples/edges/+page.svelte diff --git a/examples/svelte/src/routes/figma/+page.svelte b/examples/svelte/src/routes/examples/figma/+page.svelte similarity index 100% rename from examples/svelte/src/routes/figma/+page.svelte rename to examples/svelte/src/routes/examples/figma/+page.svelte diff --git a/examples/svelte/src/routes/interaction/+page.svelte b/examples/svelte/src/routes/examples/interaction/+page.svelte similarity index 100% rename from examples/svelte/src/routes/interaction/+page.svelte rename to examples/svelte/src/routes/examples/interaction/+page.svelte diff --git a/examples/svelte/src/routes/intersections/+page.svelte b/examples/svelte/src/routes/examples/intersections/+page.svelte similarity index 100% rename from examples/svelte/src/routes/intersections/+page.svelte rename to examples/svelte/src/routes/examples/intersections/+page.svelte diff --git a/examples/svelte/src/routes/intersections/+server.ts b/examples/svelte/src/routes/examples/intersections/+server.ts similarity index 100% rename from examples/svelte/src/routes/intersections/+server.ts rename to examples/svelte/src/routes/examples/intersections/+server.ts diff --git a/examples/svelte/src/routes/intersections/Flow.svelte b/examples/svelte/src/routes/examples/intersections/Flow.svelte similarity index 100% rename from examples/svelte/src/routes/intersections/Flow.svelte rename to examples/svelte/src/routes/examples/intersections/Flow.svelte diff --git a/examples/svelte/src/routes/intersections/nodes-and-edges.ts b/examples/svelte/src/routes/examples/intersections/nodes-and-edges.ts similarity index 100% rename from examples/svelte/src/routes/intersections/nodes-and-edges.ts rename to examples/svelte/src/routes/examples/intersections/nodes-and-edges.ts diff --git a/examples/svelte/src/routes/overview/+page.svelte b/examples/svelte/src/routes/examples/overview/+page.svelte similarity index 100% rename from examples/svelte/src/routes/overview/+page.svelte rename to examples/svelte/src/routes/examples/overview/+page.svelte diff --git a/examples/svelte/src/routes/overview/CustomEdge.svelte b/examples/svelte/src/routes/examples/overview/CustomEdge.svelte similarity index 100% rename from examples/svelte/src/routes/overview/CustomEdge.svelte rename to examples/svelte/src/routes/examples/overview/CustomEdge.svelte diff --git a/examples/svelte/src/routes/overview/CustomNode.svelte b/examples/svelte/src/routes/examples/overview/CustomNode.svelte similarity index 100% rename from examples/svelte/src/routes/overview/CustomNode.svelte rename to examples/svelte/src/routes/examples/overview/CustomNode.svelte diff --git a/examples/svelte/src/routes/overview/CustomNodeDragHandle.svelte b/examples/svelte/src/routes/examples/overview/CustomNodeDragHandle.svelte similarity index 100% rename from examples/svelte/src/routes/overview/CustomNodeDragHandle.svelte rename to examples/svelte/src/routes/examples/overview/CustomNodeDragHandle.svelte diff --git a/examples/svelte/src/routes/stress/+page.svelte b/examples/svelte/src/routes/examples/stress/+page.svelte similarity index 100% rename from examples/svelte/src/routes/stress/+page.svelte rename to examples/svelte/src/routes/examples/stress/+page.svelte diff --git a/examples/svelte/src/routes/subflows/+page.svelte b/examples/svelte/src/routes/examples/subflows/+page.svelte similarity index 100% rename from examples/svelte/src/routes/subflows/+page.svelte rename to examples/svelte/src/routes/examples/subflows/+page.svelte diff --git a/examples/svelte/src/routes/subflows/DebugNode.svelte b/examples/svelte/src/routes/examples/subflows/DebugNode.svelte similarity index 100% rename from examples/svelte/src/routes/subflows/DebugNode.svelte rename to examples/svelte/src/routes/examples/subflows/DebugNode.svelte diff --git a/examples/svelte/src/routes/two-way-viewport/+page.svelte b/examples/svelte/src/routes/examples/two-way-viewport/+page.svelte similarity index 100% rename from examples/svelte/src/routes/two-way-viewport/+page.svelte rename to examples/svelte/src/routes/examples/two-way-viewport/+page.svelte diff --git a/examples/svelte/src/routes/two-way-viewport/Flow.svelte b/examples/svelte/src/routes/examples/two-way-viewport/Flow.svelte similarity index 100% rename from examples/svelte/src/routes/two-way-viewport/Flow.svelte rename to examples/svelte/src/routes/examples/two-way-viewport/Flow.svelte diff --git a/examples/svelte/src/routes/usesvelteflow/+page.svelte b/examples/svelte/src/routes/examples/usesvelteflow/+page.svelte similarity index 100% rename from examples/svelte/src/routes/usesvelteflow/+page.svelte rename to examples/svelte/src/routes/examples/usesvelteflow/+page.svelte diff --git a/examples/svelte/src/routes/usesvelteflow/Flow.svelte b/examples/svelte/src/routes/examples/usesvelteflow/Flow.svelte similarity index 100% rename from examples/svelte/src/routes/usesvelteflow/Flow.svelte rename to examples/svelte/src/routes/examples/usesvelteflow/Flow.svelte diff --git a/examples/svelte/src/routes/usesvelteflow/Sidebar.svelte b/examples/svelte/src/routes/examples/usesvelteflow/Sidebar.svelte similarity index 100% rename from examples/svelte/src/routes/usesvelteflow/Sidebar.svelte rename to examples/svelte/src/routes/examples/usesvelteflow/Sidebar.svelte diff --git a/examples/svelte/src/routes/useupdatenodeinternals/+page.svelte b/examples/svelte/src/routes/examples/useupdatenodeinternals/+page.svelte similarity index 100% rename from examples/svelte/src/routes/useupdatenodeinternals/+page.svelte rename to examples/svelte/src/routes/examples/useupdatenodeinternals/+page.svelte diff --git a/examples/svelte/src/routes/useupdatenodeinternals/CustomNode.svelte b/examples/svelte/src/routes/examples/useupdatenodeinternals/CustomNode.svelte similarity index 100% rename from examples/svelte/src/routes/useupdatenodeinternals/CustomNode.svelte rename to examples/svelte/src/routes/examples/useupdatenodeinternals/CustomNode.svelte diff --git a/examples/svelte/src/routes/useupdatenodeinternals/Flow.svelte b/examples/svelte/src/routes/examples/useupdatenodeinternals/Flow.svelte similarity index 100% rename from examples/svelte/src/routes/useupdatenodeinternals/Flow.svelte rename to examples/svelte/src/routes/examples/useupdatenodeinternals/Flow.svelte diff --git a/examples/svelte/src/routes/validation/+page.svelte b/examples/svelte/src/routes/examples/validation/+page.svelte similarity index 100% rename from examples/svelte/src/routes/validation/+page.svelte rename to examples/svelte/src/routes/examples/validation/+page.svelte diff --git a/examples/svelte/src/routes/validation/style.css b/examples/svelte/src/routes/examples/validation/style.css similarity index 100% rename from examples/svelte/src/routes/validation/style.css rename to examples/svelte/src/routes/examples/validation/style.css diff --git a/examples/svelte/src/routes/tests/nodes/+page.svelte b/examples/svelte/src/routes/tests/nodes/+page.svelte new file mode 100644 index 00000000..12dec33c --- /dev/null +++ b/examples/svelte/src/routes/tests/nodes/+page.svelte @@ -0,0 +1,9 @@ + + + + + diff --git a/examples/svelte/src/routes/tests/nodes/Flow.svelte b/examples/svelte/src/routes/tests/nodes/Flow.svelte new file mode 100644 index 00000000..6686c907 --- /dev/null +++ b/examples/svelte/src/routes/tests/nodes/Flow.svelte @@ -0,0 +1,12 @@ + + + diff --git a/examples/svelte/src/routes/tests/nodes/nodesAndEdges.ts b/examples/svelte/src/routes/tests/nodes/nodesAndEdges.ts new file mode 100644 index 00000000..37e2d999 --- /dev/null +++ b/examples/svelte/src/routes/tests/nodes/nodesAndEdges.ts @@ -0,0 +1,73 @@ +import type { Edge, Node } from '@xyflow/svelte'; + +export const initialNodes: Node[] = [ + { + id: '1', + data: { label: '1' }, + position: { x: 0, y: 0 }, + class: 'test-class', + style: 'background-color: red;' + }, + { + id: '2', + data: { label: '2' }, + position: { x: -100, y: 100 } + }, + { + id: '3', + data: { label: '3' }, + position: { x: 100, y: 100 } + }, + { + id: '4', + data: { label: '4' }, + position: { x: 0, y: 200 } + }, + { + id: 'notDraggable', + data: { label: 'notDraggable' }, + position: { x: 0, y: 300 }, + draggable: false + }, + { + id: 'notSelectable', + data: { label: 'notSelectable' }, + position: { x: 0, y: 400 }, + selectable: false + }, + { + id: 'notConnectable', + data: { label: 'notConnectable' }, + position: { x: 0, y: 500 }, + connectable: false + }, + { + id: 'notDeletable', + data: { label: 'notDeletable' }, + position: { x: 0, y: 600 }, + connectable: false + }, + { + id: 'hidden', + data: { label: 'hidden' }, + position: { x: 0, y: 700 }, + hidden: true + } +]; + +export const initialEdges: Edge[] = [ + { + id: '1-2', + type: 'default', + source: '1', + target: '2', + label: 'edge' + }, + { + id: '1-3', + type: 'default', + source: '1', + target: '3', + label: 'edge' + } +]; diff --git a/examples/svelte/svelte.config.js b/examples/svelte/svelte.config.js index 1cf26a00..80719d79 100644 --- a/examples/svelte/svelte.config.js +++ b/examples/svelte/svelte.config.js @@ -11,7 +11,10 @@ const config = { // adapter-auto only supports some environments, see https://kit.svelte.dev/docs/adapter-auto for a list. // If your environment is not supported or you settled on a specific environment, switch out the adapter. // See https://kit.svelte.dev/docs/adapters for more information about adapters. - adapter: adapter() + adapter: adapter(), + alias: { + $components: './src/components' + } } }; From 45ae126d438662cc6e933cf6011702287c607487 Mon Sep 17 00:00:00 2001 From: Peter Date: Wed, 25 Oct 2023 16:57:22 +0200 Subject: [PATCH 005/608] Created e2e tests for node interactions --- examples/react/src/examples/Basic/index.tsx | 1 + .../routes/tests/nodes/DragHandleNode.svelte | 26 ++ .../svelte/src/routes/tests/nodes/Flow.svelte | 8 +- .../src/routes/tests/nodes/nodesAndEdges.ts | 57 +++-- tests/playwright/e2e/backspace-delete.spec.ts | 16 -- tests/playwright/e2e/move-node.spec.ts | 22 -- tests/playwright/e2e/nodes.spec.ts | 236 +++++++++++++++++- 7 files changed, 303 insertions(+), 63 deletions(-) create mode 100644 examples/svelte/src/routes/tests/nodes/DragHandleNode.svelte delete mode 100644 tests/playwright/e2e/backspace-delete.spec.ts delete mode 100644 tests/playwright/e2e/move-node.spec.ts diff --git a/examples/react/src/examples/Basic/index.tsx b/examples/react/src/examples/Basic/index.tsx index 21f48ec5..4f1a51d2 100644 --- a/examples/react/src/examples/Basic/index.tsx +++ b/examples/react/src/examples/Basic/index.tsx @@ -41,6 +41,7 @@ const initialNodes: Node[] = [ data: { label: 'Node 4' }, position: { x: 400, y: 200 }, className: 'light', + connectable: false, }, ]; diff --git a/examples/svelte/src/routes/tests/nodes/DragHandleNode.svelte b/examples/svelte/src/routes/tests/nodes/DragHandleNode.svelte new file mode 100644 index 00000000..da5fa4c4 --- /dev/null +++ b/examples/svelte/src/routes/tests/nodes/DragHandleNode.svelte @@ -0,0 +1,26 @@ + + +
+
+
+ + diff --git a/examples/svelte/src/routes/tests/nodes/Flow.svelte b/examples/svelte/src/routes/tests/nodes/Flow.svelte index 6686c907..6f684cbf 100644 --- a/examples/svelte/src/routes/tests/nodes/Flow.svelte +++ b/examples/svelte/src/routes/tests/nodes/Flow.svelte @@ -3,10 +3,16 @@ import { initialNodes, initialEdges } from './nodesAndEdges'; import { SvelteFlow } from '@xyflow/svelte'; + import DragHandleNode from './DragHandleNode.svelte'; + import '@xyflow/svelte/dist/style.css'; const nodes = writable(initialNodes); const edges = writable(initialEdges); + + const nodeTypes = { + DragHandleNode + }; - + diff --git a/examples/svelte/src/routes/tests/nodes/nodesAndEdges.ts b/examples/svelte/src/routes/tests/nodes/nodesAndEdges.ts index 37e2d999..bd382bef 100644 --- a/examples/svelte/src/routes/tests/nodes/nodesAndEdges.ts +++ b/examples/svelte/src/routes/tests/nodes/nodesAndEdges.ts @@ -2,50 +2,61 @@ import type { Edge, Node } from '@xyflow/svelte'; export const initialNodes: Node[] = [ { - id: '1', - data: { label: '1' }, + id: 'Node-1', + data: { label: 'Node-1' }, position: { x: 0, y: 0 }, - class: 'test-class', + type: 'input', + class: 'playwright-test-class-123', style: 'background-color: red;' }, { - id: '2', - data: { label: '2' }, + id: 'Node-2', + type: 'output', + data: { label: 'Node-2' }, position: { x: -100, y: 100 } }, { - id: '3', - data: { label: '3' }, + id: 'Node-3', + data: { label: 'Node-3' }, position: { x: 100, y: 100 } }, { - id: '4', - data: { label: '4' }, - position: { x: 0, y: 200 } + id: 'Node-4', + data: { label: 'Node-4' }, + position: { x: 0, y: 200 }, + type: 'output' + }, + { + id: 'drag-handle', + data: { label: 'Drag Handle' }, + position: { x: 200, y: 0 }, + type: 'DragHandleNode', + dragHandle: '.custom-drag-handle' + }, + { + id: 'notConnectable', + type: 'output', + data: { label: 'notConnectable' }, + position: { x: 0, y: 300 }, + connectable: false }, { id: 'notDraggable', data: { label: 'notDraggable' }, - position: { x: 0, y: 300 }, + position: { x: 0, y: 400 }, draggable: false }, { id: 'notSelectable', data: { label: 'notSelectable' }, - position: { x: 0, y: 400 }, - selectable: false - }, - { - id: 'notConnectable', - data: { label: 'notConnectable' }, position: { x: 0, y: 500 }, - connectable: false + selectable: false }, { id: 'notDeletable', data: { label: 'notDeletable' }, position: { x: 0, y: 600 }, - connectable: false + deletable: false }, { id: 'hidden', @@ -59,15 +70,15 @@ export const initialEdges: Edge[] = [ { id: '1-2', type: 'default', - source: '1', - target: '2', + source: 'Node-1', + target: 'Node-2', label: 'edge' }, { id: '1-3', type: 'default', - source: '1', - target: '3', + source: 'Node-1', + target: 'Node-3', label: 'edge' } ]; diff --git a/tests/playwright/e2e/backspace-delete.spec.ts b/tests/playwright/e2e/backspace-delete.spec.ts deleted file mode 100644 index 0f6d3648..00000000 --- a/tests/playwright/e2e/backspace-delete.spec.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { test, expect } from '@playwright/test'; - -import { FRAMEWORK } from './constants'; - -test('Delete Node with backspace', async ({ page }) => { - await page.goto('/'); - await page.locator(`.${FRAMEWORK}-flow__node`).nth(0).click(); - // await page.getByTestId('rf__node-1').click(); - await page.keyboard.press('Backspace'); - - const nodes = await page.locator(`.${FRAMEWORK}-flow__node`).all(); - expect(nodes).toHaveLength(3); - - const edges = await page.locator(`.${FRAMEWORK}-flow__edge`).all(); - expect(edges).toHaveLength(0); -}); diff --git a/tests/playwright/e2e/move-node.spec.ts b/tests/playwright/e2e/move-node.spec.ts deleted file mode 100644 index d9fea594..00000000 --- a/tests/playwright/e2e/move-node.spec.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { test, expect } from '@playwright/test'; - -test('Move Node', async ({ page }) => { - await page.goto('/'); - - const locator = page.getByTestId('rf__node-1'); - - const transformBeforeMove = await locator.evaluate((element) => { - return element.style.transform; - }); - - await locator.hover(); - await page.mouse.down(); - await page.mouse.move(500, 500); - await page.mouse.up(); - - const transformAfterMove = await locator.evaluate((element) => { - return element.style.transform; - }); - - expect(transformBeforeMove).not.toMatch(transformAfterMove); -}); diff --git a/tests/playwright/e2e/nodes.spec.ts b/tests/playwright/e2e/nodes.spec.ts index b06de961..03a3bef9 100644 --- a/tests/playwright/e2e/nodes.spec.ts +++ b/tests/playwright/e2e/nodes.spec.ts @@ -9,6 +9,240 @@ test.describe('NODES', () => { }); test.describe('selection', () => { - test('selecting a node', async ({ page }) => {}); + test('selecting a node by click', async ({ page }) => { + const locator = page.locator(`.${FRAMEWORK}-flow__node`).first(); + await locator.click(); + + await expect(locator).toHaveClass(/selected/); + }); + + test('selecting multiple nodes with shift drag', async ({ page }) => { + const nodes = page.locator(`.${FRAMEWORK}-flow__node`); + const firstNode = nodes.first(); + const secondNode = nodes.nth(1); + const thirdNode = nodes.nth(2); + + await expect(firstNode).toBeInViewport(); + await expect(secondNode).toBeInViewport(); + await expect(thirdNode).toBeInViewport(); + + const box = await firstNode.boundingBox(); + + await page.mouse.move(box!.x - 100, box!.y - 10); + await page.keyboard.down('Shift'); + await page.mouse.down(); + await page.mouse.move(box!.x + 200, box!.y + 200); + await page.mouse.up(); + await page.keyboard.up('Shift'); + + await expect(firstNode).toHaveClass(/selected/); + await expect(secondNode).toHaveClass(/selected/); + await expect(thirdNode).toHaveClass(/selected/); + + const selection = page.locator(`.${FRAMEWORK}-flow__selection`); + await expect(selection).toBeInViewport(); + }); + + test('selectable=false prevents selection', async ({ page }) => { + const locator = page.locator(`.${FRAMEWORK}-flow__node`).and(page.locator('[data-id="notSelectable"]')); + await locator.click(); + + await expect(locator).not.toHaveClass(/selected/); + }); + }); + + test.describe('dragging', () => { + test('dragging a node', async ({ page }) => { + const node = page.locator(`.${FRAMEWORK}-flow__node`).first(); + + const transformBeforeMove = await node.evaluate((element) => { + return element.style.transform; + }); + + await node.hover(); + await page.mouse.down(); + await page.mouse.move(500, 500); + await page.mouse.up(); + + const transformAfterMove = await node.evaluate((element) => { + return element.style.transform; + }); + + expect(transformBeforeMove).not.toMatch(transformAfterMove); + }); + + test('draggable=false prevents dragging', async ({ page }) => { + const node = page.locator(`.${FRAMEWORK}-flow__node`).and(page.locator('[data-id="notDraggable"]')); + + const transformBeforeMove = await node.evaluate((element) => { + return element.style.transform; + }); + + await node.hover(); + await page.mouse.down(); + await page.mouse.move(500, 500); + await page.mouse.up(); + + const transformAfterMove = await node.evaluate((element) => { + return element.style.transform; + }); + + expect(transformBeforeMove).toMatch(transformAfterMove); + }); + + test('custom drag handle works', async ({ page }) => { + const node = page.locator(`.${FRAMEWORK}-flow__node`).and(page.locator('[data-id="drag-handle"]')); + const dragHandle = page.locator('.custom-drag-handle'); + + const transformBeforeMove = await node.evaluate((element) => { + return element.style.transform; + }); + + const nodeBox = await node.boundingBox(); + + await page.mouse.move(nodeBox!.x + 10, nodeBox!.y + 10); + await page.mouse.down(); + await page.mouse.move(500, 500); + await page.mouse.up(); + + const transformAfterMove = await node.evaluate((element) => { + return element.style.transform; + }); + + expect(transformBeforeMove).toMatch(transformAfterMove); + + await dragHandle.hover(); + await page.mouse.down(); + await page.mouse.move(500, 500); + await page.mouse.up(); + + const transformAfterDragHandleMove = await node.evaluate((element) => { + return element.style.transform; + }); + + expect(transformBeforeMove).not.toMatch(transformAfterDragHandleMove); + }); + }); + + test.describe('deleting', () => { + test('deleting a node and its edges', async ({ page }) => { + const node = page.locator(`.${FRAMEWORK}-flow__node`).and(page.locator('[data-id="Node-1"]')); + + await node.click(); + await page.keyboard.press('Backspace'); + + await expect(node).not.toBeAttached(); + + const edges = await page.locator(`.${FRAMEWORK}-flow__edge`).all(); + expect(edges).toHaveLength(0); + }); + + test('deletable=false prevents deletion', async ({ page }) => { + const node = page.locator(`.${FRAMEWORK}-flow__node`).and(page.locator('[data-id="notDeletable"]')); + + await node.click(); + await page.keyboard.press('Backspace'); + + await expect(node).toBeAttached(); + }); + }); + + test.describe('connecting', () => { + test('connecting two nodes', async ({ page }) => { + const outputSourceHandle = page.locator(`.${FRAMEWORK}-flow__handle`).and(page.locator('[data-nodeid="Node-1"]')); + const inputSourceHandle = page.locator(`.${FRAMEWORK}-flow__handle`).and(page.locator('[data-nodeid="Node-4"]')); + + await expect(outputSourceHandle).toBeInViewport(); + await expect(inputSourceHandle).toBeInViewport(); + + const edgesBefore = await page.locator(`.${FRAMEWORK}-flow__edge`).all(); + + await outputSourceHandle.hover(); + await page.mouse.down(); + await inputSourceHandle.hover(); + await page.mouse.up(); + + const edgesAfter = await page.locator(`.${FRAMEWORK}-flow__edge`).all(); + expect(edgesAfter).toHaveLength(edgesBefore.length + 1); + }); + + test('connecting two output handles does not work', async ({ page }) => { + const firstOutputHandle = page.locator(`.${FRAMEWORK}-flow__handle`).and(page.locator('[data-nodeid="Node-2"]')); + const secondOutputHandle = page.locator(`.${FRAMEWORK}-flow__handle`).and(page.locator('[data-nodeid="Node-4"]')); + + await expect(firstOutputHandle).toBeInViewport(); + await expect(secondOutputHandle).toBeInViewport(); + + const edgesBefore = await page.locator(`.${FRAMEWORK}-flow__edge`).all(); + + await firstOutputHandle.hover(); + await page.mouse.down(); + await secondOutputHandle.hover(); + await page.mouse.up(); + + const edgesAfter = await page.locator(`.${FRAMEWORK}-flow__edge`).all(); + expect(edgesAfter).toHaveLength(edgesBefore.length); + }); + + test('connecting two input handles does not work', async ({ page }) => { + const firstInputHandle = page.locator(`.${FRAMEWORK}-flow__handle`).and(page.locator('[data-nodeid="Node-1"]')); + const secondInputHandle = page + .locator(`.${FRAMEWORK}-flow__handle`) + .and(page.locator('[data-nodeid="Node-3"]')) + .and(page.locator('.source')); + + await expect(firstInputHandle).toBeInViewport(); + await expect(secondInputHandle).toBeInViewport(); + + const edgesBefore = await page.locator(`.${FRAMEWORK}-flow__edge`).all(); + + await firstInputHandle.hover(); + await page.mouse.down(); + await secondInputHandle.hover(); + await page.mouse.up(); + + const edgesAfter = await page.locator(`.${FRAMEWORK}-flow__edge`).all(); + expect(edgesAfter).toHaveLength(edgesBefore.length); + }); + + test('connectable=false prevents connections', async ({ page }) => { + const outputHandle = page.locator(`.${FRAMEWORK}-flow__handle`).and(page.locator('[data-nodeid="Node-1"]')); + const notConnectableHandle = page + .locator(`.${FRAMEWORK}-flow__handle`) + .and(page.locator('[data-nodeid="notConnectable"]')); + + const notConnectableBox = await notConnectableHandle.boundingBox(); + + await expect(outputHandle).toBeInViewport(); + await expect(notConnectableHandle).toBeInViewport(); + + const edgesBefore = await page.locator(`.${FRAMEWORK}-flow__edge`).all(); + + await outputHandle.hover(); + await page.mouse.down(); + await page.mouse.move(notConnectableBox!.x + 2, notConnectableBox!.y + 2); + await page.mouse.up(); + + const edgesAfter = await page.locator(`.${FRAMEWORK}-flow__edge`).all(); + expect(edgesAfter).toHaveLength(edgesBefore.length); + }); + }); + + test('hidden=true hides the node', async ({ page }) => { + const node = page.locator(`.${FRAMEWORK}-flow__node`).and(page.locator('[data-id="hidden"]')); + + await expect(node).not.toBeInViewport(); + }); + + test('classes get applied', async ({ page }) => { + const node = page.locator(`.${FRAMEWORK}-flow__node`).and(page.locator('[data-id="Node-1"]')); + + await expect(node).toHaveClass(/playwright-test-class-123/); + }); + + test('styles get applied', async ({ page }) => { + const node = page.locator(`.${FRAMEWORK}-flow__node`).and(page.locator('[data-id="Node-1"]')); + + await expect(node).toHaveCSS('background-color', 'rgb(255, 0, 0)'); }); }); From 7eb9fda0fb44049cc5e7bae181775fefb414182f Mon Sep 17 00:00:00 2001 From: Peter Date: Wed, 25 Oct 2023 17:26:23 +0200 Subject: [PATCH 006/608] fixed test case --- tests/playwright/e2e/nodes.spec.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tests/playwright/e2e/nodes.spec.ts b/tests/playwright/e2e/nodes.spec.ts index 03a3bef9..2136c3f1 100644 --- a/tests/playwright/e2e/nodes.spec.ts +++ b/tests/playwright/e2e/nodes.spec.ts @@ -140,6 +140,8 @@ test.describe('NODES', () => { test('deletable=false prevents deletion', async ({ page }) => { const node = page.locator(`.${FRAMEWORK}-flow__node`).and(page.locator('[data-id="notDeletable"]')); + await expect(node).toBeAttached(); + await node.click(); await page.keyboard.press('Backspace'); From 9d386abb2aa299a94955d33751e258380b26c1c0 Mon Sep 17 00:00:00 2001 From: Peter Date: Mon, 30 Oct 2023 13:24:25 +0100 Subject: [PATCH 007/608] tests(svelte) WIP added some e2e tests and edges example --- .../src/routes/tests/edges/+page.svelte | 9 + .../svelte/src/routes/tests/edges/Flow.svelte | 12 ++ .../src/routes/tests/edges/nodesAndEdges.ts | 157 ++++++++++++++++++ tests/playwright/e2e/edges.spec.ts | 120 +++++++++++++ tests/playwright/e2e/nodes.spec.ts | 1 + 5 files changed, 299 insertions(+) create mode 100644 examples/svelte/src/routes/tests/edges/+page.svelte create mode 100644 examples/svelte/src/routes/tests/edges/Flow.svelte create mode 100644 examples/svelte/src/routes/tests/edges/nodesAndEdges.ts create mode 100644 tests/playwright/e2e/edges.spec.ts diff --git a/examples/svelte/src/routes/tests/edges/+page.svelte b/examples/svelte/src/routes/tests/edges/+page.svelte new file mode 100644 index 00000000..12dec33c --- /dev/null +++ b/examples/svelte/src/routes/tests/edges/+page.svelte @@ -0,0 +1,9 @@ + + + + + diff --git a/examples/svelte/src/routes/tests/edges/Flow.svelte b/examples/svelte/src/routes/tests/edges/Flow.svelte new file mode 100644 index 00000000..6686c907 --- /dev/null +++ b/examples/svelte/src/routes/tests/edges/Flow.svelte @@ -0,0 +1,12 @@ + + + diff --git a/examples/svelte/src/routes/tests/edges/nodesAndEdges.ts b/examples/svelte/src/routes/tests/edges/nodesAndEdges.ts new file mode 100644 index 00000000..6e0d969a --- /dev/null +++ b/examples/svelte/src/routes/tests/edges/nodesAndEdges.ts @@ -0,0 +1,157 @@ +import { MarkerType, type Edge, type Node } from '@xyflow/svelte'; + +export const initialNodes: Node[] = [ + { + id: '1', + data: { label: '1' }, + position: { x: 0, y: 0 }, + type: 'input' + }, + { + id: '2', + data: { label: '2' }, + position: { x: -100, y: 100 } + }, + { + id: '3', + data: { label: '3' }, + position: { x: 100, y: 100 } + }, + { + id: '4', + data: { label: '4' }, + position: { x: -100, y: 200 } + }, + { + id: '5', + data: { label: '5' }, + position: { x: 100, y: 200 } + }, + { + id: '6', + data: { label: '6' }, + position: { x: -100, y: 300 } + }, + { + id: '7', + data: { label: '7' }, + position: { x: 100, y: 300 } + }, + { + id: '8', + data: { label: '8' }, + position: { x: -100, y: 400 } + }, + { + id: '9', + data: { label: '9' }, + position: { x: 100, y: 400 } + }, + { + id: '10', + data: { label: '10' }, + position: { x: -100, y: 500 } + }, + { + id: '11', + data: { label: '11' }, + position: { x: 100, y: 500 } + }, + { + id: '12', + data: { label: '12' }, + position: { x: -100, y: 600 } + }, + { + id: '13', + data: { label: '13' }, + position: { x: 100, y: 600 } + } +]; + +export const initialEdges: Edge[] = [ + { + id: 'edge-with-class', + source: '1', + target: '2', + class: 'edge-class-test' + }, + { + id: 'edge-with-style', + source: '1', + target: '3', + style: 'stroke: red;' + }, + { + id: 'hidden-edge', + source: '2', + target: '4', + label: 'hidden', + hidden: true + }, + { + id: 'animated-edge', + source: '3', + target: '5', + label: 'animated', + animated: true + }, + { + id: 'not-selectable-edge', + source: '4', + target: '6', + label: 'not-selectable', + selectable: false + }, + { + id: 'not-deletable', + source: '5', + target: '7', + label: 'not-deletable', + deletable: false + }, + { + id: 'z-index', + source: '6', + target: '8', + label: 'z-index', + zIndex: 3141592 + }, + { + id: 'aria-label', + source: '7', + target: '9', + label: 'aria-label', + ariaLabel: 'aria-label-test' + }, + { + id: 'interaction-width', + source: '8', + target: '10', + label: 'interaction-width', + interactionWidth: 42 + }, + { + id: 'markers', + source: '9', + target: '11', + label: 'markers', + markerEnd: { type: MarkerType.Arrow }, + markerStart: { type: MarkerType.ArrowClosed } + } + // { + // id: 'updatable', + // source: '9', + // target: '11', + // label: 'focusable', + // updatable: true + // }, + // { + // id: 'not-focusable', + // + // source: '5', + // target: '7', + // label: 'not-focusable', + // focusable: false + // }, +]; diff --git a/tests/playwright/e2e/edges.spec.ts b/tests/playwright/e2e/edges.spec.ts new file mode 100644 index 00000000..da5a3feb --- /dev/null +++ b/tests/playwright/e2e/edges.spec.ts @@ -0,0 +1,120 @@ +import { test, expect } from '@playwright/test'; + +import { FRAMEWORK } from './constants'; + +test.describe('EDGES', () => { + test.beforeEach(async ({ page }) => { + // Go to the starting url before each test. + await page.goto('/tests/edges'); + + // Timeout get's ignored and tests timeout after 200ms ??? + // page.waitForSelector('[data-id="edge-with-class"]', { timeout: 5000 }); + }); + + test.describe('selection', () => { + test('selecting an edge by click', async ({ page }) => { + const edge = page.locator('.svelte-flow__edge').and(page.locator('[data-id="edge-with-class"]')); + + await expect(edge).toBeAttached(); + await edge.click(); + await expect(edge).toHaveClass(/selected/); + }); + + // test('selecting multiple edges by meta-click', async ({ page }) => { + // const edge1 = page.locator('[data-id="edge-with-class"]'); + // const edge2 = page.locator('[data-id="edge-with-style"]'); + + // await expect(edge1).toBeAttached(); + // await expect(edge2).toBeAttached(); + + // await edge1.click(); + // await page.keyboard.down('Meta'); + // await edge2.click(); + + // await expect(edge1).toHaveClass(/selected/); + // await expect(edge2).toHaveClass(/selected/); + // }); + }); + + test.describe('properties', () => { + test('classes get applied', async ({ page }) => { + const edge = page.locator('[data-id="edge-with-class"]'); + + await expect(edge).toHaveClass(/edge-class-test/); + }); + + test('styles get applied', async ({ page }) => { + const edge = page.locator('#edge-with-style'); + + await expect(edge).toHaveCSS('stroke', 'rgb(255, 0, 0)'); + }); + + test('hidden=true hides edge', async ({ page }) => { + const edge = page.locator('#hidden-edge'); + + await expect(edge).not.toBeVisible(); + }); + + test('animated=true add "animated" class', async ({ page }) => { + const edge = page.locator('[data-id="animated-edge"]'); + + await expect(edge).toHaveClass(/animated/); + }); + + test('selectable=false prevents selecting of edges', async ({ page }) => { + const edge = page.locator('[data-id="not-selectable-edge"]'); + + await expect(edge).toBeAttached(); + await expect(edge).not.toHaveClass(/selected/); + + // For some reason these commands do not work + // await expect(edge).toBeInViewport(); + // await edge.click(); + + const edgeBox = await edge.boundingBox(); + + await page.mouse.move(edgeBox!.x + edgeBox!.width * 0.5, edgeBox!.y + edgeBox!.height * 0.5); + await page.mouse.down(); + await page.mouse.up(); + + await expect(edge).not.toHaveClass(/selected/); + }); + + test('deleting edges is possible', async ({ page }) => { + const edge = page.locator('[data-id="edge-with-class"]'); + + await expect(edge).toBeAttached(); + + const edgeBox = await edge.boundingBox(); + + await edge.click(); + await expect(edge).toHaveClass(/selected/); + + await page.keyboard.press('Backspace'); + + await expect(edge).not.toBeAttached(); + }); + + test('deletable=false prevents deleting of edges', async ({ page }) => { + const edge = page.locator('[data-id="not-deletable"]'); + + await expect(edge).toBeAttached(); + + // For some reason these commands do not work + // await expect(edge).toBeInViewport(); + // await edge.click(); + + const edgeBox = await edge.boundingBox(); + + await page.mouse.move(edgeBox!.x + edgeBox!.width * 0.5, edgeBox!.y + edgeBox!.height * 0.5); + await page.mouse.down(); + await page.mouse.up(); + + // TODO: times out on webkit + await expect(edge).toHaveClass(/selected/); + + await page.keyboard.press('Backspace'); + await expect(edge).toBeAttached(); + }); + }); +}); diff --git a/tests/playwright/e2e/nodes.spec.ts b/tests/playwright/e2e/nodes.spec.ts index 2136c3f1..697cefa6 100644 --- a/tests/playwright/e2e/nodes.spec.ts +++ b/tests/playwright/e2e/nodes.spec.ts @@ -137,6 +137,7 @@ test.describe('NODES', () => { expect(edges).toHaveLength(0); }); + // TODO: pressing backspace creates problems on webkit test('deletable=false prevents deletion', async ({ page }) => { const node = page.locator(`.${FRAMEWORK}-flow__node`).and(page.locator('[data-id="notDeletable"]')); From a9b911eac38fc8f891fedee1a19c7edfbb4661f1 Mon Sep 17 00:00:00 2001 From: Peter Date: Thu, 2 Nov 2023 12:29:58 +0100 Subject: [PATCH 008/608] some more trying around --- tests/playwright/e2e/edges.spec.ts | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/tests/playwright/e2e/edges.spec.ts b/tests/playwright/e2e/edges.spec.ts index da5a3feb..f91d89e0 100644 --- a/tests/playwright/e2e/edges.spec.ts +++ b/tests/playwright/e2e/edges.spec.ts @@ -20,20 +20,22 @@ test.describe('EDGES', () => { await expect(edge).toHaveClass(/selected/); }); - // test('selecting multiple edges by meta-click', async ({ page }) => { - // const edge1 = page.locator('[data-id="edge-with-class"]'); - // const edge2 = page.locator('[data-id="edge-with-style"]'); + test('selecting multiple edges by meta-click', async ({ page }) => { + const edge1 = page.locator('[data-id="edge-with-class"]'); + const edge2 = page.locator('[data-id="edge-with-style"]'); - // await expect(edge1).toBeAttached(); - // await expect(edge2).toBeAttached(); + await expect(edge1).toBeAttached(); + await expect(edge2).toBeAttached(); + // FIXME: I cannot get this to work + await page.keyboard.down('MetaLeft'); + await edge1.click(); + await expect(edge1).toHaveClass(/selected/); - // await edge1.click(); - // await page.keyboard.down('Meta'); - // await edge2.click(); + await edge2.click(); + await expect(edge2).toHaveClass(/selected/); - // await expect(edge1).toHaveClass(/selected/); - // await expect(edge2).toHaveClass(/selected/); - // }); + await expect(edge1).toHaveClass(/selected/); + }); }); test.describe('properties', () => { From 4cf99ec425470a068fc427fd53497f8839eddf42 Mon Sep 17 00:00:00 2001 From: Peter Date: Thu, 2 Nov 2023 12:30:27 +0100 Subject: [PATCH 009/608] updated lockfile --- pnpm-lock.yaml | 791 ++++--------------------------------------------- 1 file changed, 63 insertions(+), 728 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 981e66bf..449ca1d3 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -16,10 +16,10 @@ importers: version: registry.npmjs.org/@changesets/cli@2.25.0 '@typescript-eslint/eslint-plugin': specifier: latest - version: registry.npmjs.org/@typescript-eslint/eslint-plugin@6.8.0(@typescript-eslint/parser@6.8.0)(eslint@8.43.0)(typescript@5.1.3) + version: registry.npmjs.org/@typescript-eslint/eslint-plugin@6.9.0(@typescript-eslint/parser@6.9.0)(eslint@8.43.0)(typescript@5.1.3) '@typescript-eslint/parser': specifier: latest - version: registry.npmjs.org/@typescript-eslint/parser@6.8.0(eslint@8.43.0)(typescript@5.1.3) + version: registry.npmjs.org/@typescript-eslint/parser@6.9.0(eslint@8.43.0)(typescript@5.1.3) concurrently: specifier: ^7.6.0 version: registry.npmjs.org/concurrently@7.6.0 @@ -90,40 +90,6 @@ importers: specifier: ^4.2.1 version: registry.npmjs.org/svelte@4.2.1 - examples/next-xyflow: - dependencies: - '@xyflow/react': - specifier: workspace:^ - version: link:../../packages/react - next: - specifier: 13.5.4 - version: registry.npmjs.org/next@13.5.4(react-dom@18.2.0)(react@18.2.0) - react: - specifier: ^18 - version: registry.npmjs.org/react@18.2.0 - react-dom: - specifier: ^18 - version: registry.npmjs.org/react-dom@18.2.0(react@18.2.0) - devDependencies: - '@types/node': - specifier: ^20 - version: registry.npmjs.org/@types/node@20.0.0 - '@types/react': - specifier: ^18 - version: registry.npmjs.org/@types/react@18.2.24 - '@types/react-dom': - specifier: ^18 - version: registry.npmjs.org/@types/react-dom@18.2.8 - eslint: - specifier: ^8 - version: registry.npmjs.org/eslint@8.43.0 - eslint-config-next: - specifier: 13.5.4 - version: registry.npmjs.org/eslint-config-next@13.5.4(eslint@8.43.0)(typescript@5.1.3) - typescript: - specifier: ^5 - version: registry.npmjs.org/typescript@5.1.3 - examples/react: dependencies: '@xyflow/react': @@ -457,7 +423,7 @@ importers: version: registry.npmjs.org/eslint-config-prettier@8.8.0(eslint@8.43.0) eslint-config-turbo: specifier: latest - version: registry.npmjs.org/eslint-config-turbo@1.10.15(eslint@8.43.0) + version: registry.npmjs.org/eslint-config-turbo@1.10.16(eslint@8.43.0) eslint-plugin-react: specifier: latest version: registry.npmjs.org/eslint-plugin-react@7.33.2(eslint@8.43.0) @@ -1853,119 +1819,6 @@ packages: read-yaml-file: registry.npmjs.org/read-yaml-file@1.1.0 dev: true - registry.npmjs.org/@next/env@13.5.4: - resolution: {integrity: sha512-LGegJkMvRNw90WWphGJ3RMHMVplYcOfRWf2Be3td3sUa+1AaxmsYyANsA+znrGCBjXJNi4XAQlSoEfUxs/4kIQ==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@next/env/-/env-13.5.4.tgz} - name: '@next/env' - version: 13.5.4 - dev: false - - registry.npmjs.org/@next/eslint-plugin-next@13.5.4: - resolution: {integrity: sha512-vI94U+D7RNgX6XypSyjeFrOzxGlZyxOplU0dVE5norIfZGn/LDjJYPHdvdsR5vN1eRtl6PDAsOHmycFEOljK5A==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-13.5.4.tgz} - name: '@next/eslint-plugin-next' - version: 13.5.4 - dependencies: - glob: registry.npmjs.org/glob@7.1.7 - dev: true - - registry.npmjs.org/@next/swc-darwin-arm64@13.5.4: - resolution: {integrity: sha512-Df8SHuXgF1p+aonBMcDPEsaahNo2TCwuie7VXED4FVyECvdXfRT9unapm54NssV9tF3OQFKBFOdlje4T43VO0w==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-13.5.4.tgz} - name: '@next/swc-darwin-arm64' - version: 13.5.4 - engines: {node: '>= 10'} - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: false - optional: true - - registry.npmjs.org/@next/swc-darwin-x64@13.5.4: - resolution: {integrity: sha512-siPuUwO45PnNRMeZnSa8n/Lye5ZX93IJom9wQRB5DEOdFrw0JjOMu1GINB8jAEdwa7Vdyn1oJ2xGNaQpdQQ9Pw==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-13.5.4.tgz} - name: '@next/swc-darwin-x64' - version: 13.5.4 - engines: {node: '>= 10'} - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: false - optional: true - - registry.npmjs.org/@next/swc-linux-arm64-gnu@13.5.4: - resolution: {integrity: sha512-l/k/fvRP/zmB2jkFMfefmFkyZbDkYW0mRM/LB+tH5u9pB98WsHXC0WvDHlGCYp3CH/jlkJPL7gN8nkTQVrQ/2w==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-13.5.4.tgz} - name: '@next/swc-linux-arm64-gnu' - version: 13.5.4 - engines: {node: '>= 10'} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: false - optional: true - - registry.npmjs.org/@next/swc-linux-arm64-musl@13.5.4: - resolution: {integrity: sha512-YYGb7SlLkI+XqfQa8VPErljb7k9nUnhhRrVaOdfJNCaQnHBcvbT7cx/UjDQLdleJcfyg1Hkn5YSSIeVfjgmkTg==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-13.5.4.tgz} - name: '@next/swc-linux-arm64-musl' - version: 13.5.4 - engines: {node: '>= 10'} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: false - optional: true - - registry.npmjs.org/@next/swc-linux-x64-gnu@13.5.4: - resolution: {integrity: sha512-uE61vyUSClnCH18YHjA8tE1prr/PBFlBFhxBZis4XBRJoR+txAky5d7gGNUIbQ8sZZ7LVkSVgm/5Fc7mwXmRAg==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-13.5.4.tgz} - name: '@next/swc-linux-x64-gnu' - version: 13.5.4 - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: false - optional: true - - registry.npmjs.org/@next/swc-linux-x64-musl@13.5.4: - resolution: {integrity: sha512-qVEKFYML/GvJSy9CfYqAdUexA6M5AklYcQCW+8JECmkQHGoPxCf04iMh7CPR7wkHyWWK+XLt4Ja7hhsPJtSnhg==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-13.5.4.tgz} - name: '@next/swc-linux-x64-musl' - version: 13.5.4 - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: false - optional: true - - registry.npmjs.org/@next/swc-win32-arm64-msvc@13.5.4: - resolution: {integrity: sha512-mDSQfqxAlfpeZOLPxLymZkX0hYF3juN57W6vFHTvwKlnHfmh12Pt7hPIRLYIShk8uYRsKPtMTth/EzpwRI+u8w==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-13.5.4.tgz} - name: '@next/swc-win32-arm64-msvc' - version: 13.5.4 - engines: {node: '>= 10'} - cpu: [arm64] - os: [win32] - requiresBuild: true - dev: false - optional: true - - registry.npmjs.org/@next/swc-win32-ia32-msvc@13.5.4: - resolution: {integrity: sha512-aoqAT2XIekIWoriwzOmGFAvTtVY5O7JjV21giozBTP5c6uZhpvTWRbmHXbmsjZqY4HnEZQRXWkSAppsIBweKqw==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-13.5.4.tgz} - name: '@next/swc-win32-ia32-msvc' - version: 13.5.4 - engines: {node: '>= 10'} - cpu: [ia32] - os: [win32] - requiresBuild: true - dev: false - optional: true - - registry.npmjs.org/@next/swc-win32-x64-msvc@13.5.4: - resolution: {integrity: sha512-cyRvlAxwlddlqeB9xtPSfNSCRy8BOa4wtMo0IuI9P7Y0XT2qpDrpFKRyZ7kUngZis59mPVla5k8X1oOJ8RxDYg==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-13.5.4.tgz} - name: '@next/swc-win32-x64-msvc' - version: 13.5.4 - engines: {node: '>= 10'} - cpu: [x64] - os: [win32] - requiresBuild: true - dev: false - optional: true - registry.npmjs.org/@nodelib/fs.scandir@2.1.5: resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz} name: '@nodelib/fs.scandir' @@ -2113,12 +1966,6 @@ packages: rollup: registry.npmjs.org/rollup@3.23.0 dev: true - registry.npmjs.org/@rushstack/eslint-patch@1.5.1: - resolution: {integrity: sha512-6i/8UoL0P5y4leBIGzvkZdS85RDMG9y1ihZzmTZQ5LdHUYmZ7pKFoj8X0236s3lusPs1Fa5HTQUpwI+UfTcmeA==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.5.1.tgz} - name: '@rushstack/eslint-patch' - version: 1.5.1 - dev: true - registry.npmjs.org/@sideway/address@4.1.4: resolution: {integrity: sha512-7vwq+rOHVWjyXxVlR76Agnvhy8I9rpzjosTESvmhNeXOXdZZB15Fl+TI9x1SiHZH5Jv2wTGduSxFDIaq0m3DUw==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@sideway/address/-/address-4.1.4.tgz} name: '@sideway/address' @@ -2390,14 +2237,6 @@ packages: version: 0.1.2 dev: true - registry.npmjs.org/@swc/helpers@0.5.2: - resolution: {integrity: sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.2.tgz} - name: '@swc/helpers' - version: 0.5.2 - dependencies: - tslib: registry.npmjs.org/tslib@2.6.2 - dev: false - registry.npmjs.org/@swc/types@0.1.5: resolution: {integrity: sha512-myfUej5naTBWnqOCc/MdVOLVjXUXtIA+NpDrDBKJtLLg2shUjBu3cZmB/85RyitKc55+lUUyl7oRfLOvkr2hsw==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@swc/types/-/types-0.1.5.tgz} name: '@swc/types' @@ -2742,12 +2581,6 @@ packages: version: 7.0.14 dev: true - registry.npmjs.org/@types/json5@0.0.29: - resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz} - name: '@types/json5' - version: 0.0.29 - dev: true - registry.npmjs.org/@types/json5@0.0.30: resolution: {integrity: sha512-sqm9g7mHlPY/43fcSNrCYfOeX9zkTTK+euO5E6+CVijSMm5tTjkVdwdqRkY3ljjIAf8679vps5jKUoJBCLsMDA==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@types/json5/-/json5-0.0.30.tgz} name: '@types/json5' @@ -2808,12 +2641,6 @@ packages: version: 18.7.16 dev: true - registry.npmjs.org/@types/node@20.0.0: - resolution: {integrity: sha512-cD2uPTDnQQCVpmRefonO98/PPijuOnnEy5oytWJFPY1N9aJCz2wJ5kSGWO+zJoed2cY2JxQh6yBuUq4vIn61hw==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@types/node/-/node-20.0.0.tgz} - name: '@types/node' - version: 20.0.0 - dev: true - registry.npmjs.org/@types/node@20.8.7: resolution: {integrity: sha512-21TKHHh3eUHIi2MloeptJWALuCu5H7HQTdTrWIFReA8ad+aggoX+lRes3ex7/FtpC+sVUpFMQ+QTfYr74mruiQ==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@types/node/-/node-20.8.7.tgz} name: '@types/node' @@ -2956,11 +2783,11 @@ packages: - supports-color dev: true - registry.npmjs.org/@typescript-eslint/eslint-plugin@6.8.0(@typescript-eslint/parser@6.8.0)(eslint@8.43.0)(typescript@5.1.3): - resolution: {integrity: sha512-GosF4238Tkes2SHPQ1i8f6rMtG6zlKwMEB0abqSJ3Npvos+doIlc/ATG+vX1G9coDF3Ex78zM3heXHLyWEwLUw==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.8.0.tgz} - id: registry.npmjs.org/@typescript-eslint/eslint-plugin/6.8.0 + registry.npmjs.org/@typescript-eslint/eslint-plugin@6.9.0(@typescript-eslint/parser@6.9.0)(eslint@8.43.0)(typescript@5.1.3): + resolution: {integrity: sha512-lgX7F0azQwRPB7t7WAyeHWVfW1YJ9NIgd9mvGhfQpRY56X6AVf8mwM8Wol+0z4liE7XX3QOt8MN1rUKCfSjRIA==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.9.0.tgz} + id: registry.npmjs.org/@typescript-eslint/eslint-plugin/6.9.0 name: '@typescript-eslint/eslint-plugin' - version: 6.8.0 + version: 6.9.0 engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: '@typescript-eslint/parser': ^6.0.0 || ^6.0.0-alpha @@ -2971,11 +2798,11 @@ packages: optional: true dependencies: '@eslint-community/regexpp': registry.npmjs.org/@eslint-community/regexpp@4.9.1 - '@typescript-eslint/parser': registry.npmjs.org/@typescript-eslint/parser@6.8.0(eslint@8.43.0)(typescript@5.1.3) - '@typescript-eslint/scope-manager': registry.npmjs.org/@typescript-eslint/scope-manager@6.8.0 - '@typescript-eslint/type-utils': registry.npmjs.org/@typescript-eslint/type-utils@6.8.0(eslint@8.43.0)(typescript@5.1.3) - '@typescript-eslint/utils': registry.npmjs.org/@typescript-eslint/utils@6.8.0(eslint@8.43.0)(typescript@5.1.3) - '@typescript-eslint/visitor-keys': registry.npmjs.org/@typescript-eslint/visitor-keys@6.8.0 + '@typescript-eslint/parser': registry.npmjs.org/@typescript-eslint/parser@6.9.0(eslint@8.43.0)(typescript@5.1.3) + '@typescript-eslint/scope-manager': registry.npmjs.org/@typescript-eslint/scope-manager@6.9.0 + '@typescript-eslint/type-utils': registry.npmjs.org/@typescript-eslint/type-utils@6.9.0(eslint@8.43.0)(typescript@5.1.3) + '@typescript-eslint/utils': registry.npmjs.org/@typescript-eslint/utils@6.9.0(eslint@8.43.0)(typescript@5.1.3) + '@typescript-eslint/visitor-keys': registry.npmjs.org/@typescript-eslint/visitor-keys@6.9.0 debug: registry.npmjs.org/debug@4.3.4(supports-color@8.1.1) eslint: registry.npmjs.org/eslint@8.43.0 graphemer: registry.npmjs.org/graphemer@1.4.0 @@ -3011,34 +2838,11 @@ packages: - supports-color dev: true - registry.npmjs.org/@typescript-eslint/parser@5.62.0(eslint@8.43.0)(typescript@5.1.3): - resolution: {integrity: sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.62.0.tgz} - id: registry.npmjs.org/@typescript-eslint/parser/5.62.0 + registry.npmjs.org/@typescript-eslint/parser@6.9.0(eslint@8.43.0)(typescript@5.1.3): + resolution: {integrity: sha512-GZmjMh4AJ/5gaH4XF2eXA8tMnHWP+Pm1mjQR2QN4Iz+j/zO04b9TOvJYOX2sCNIQHtRStKTxRY1FX7LhpJT4Gw==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.9.0.tgz} + id: registry.npmjs.org/@typescript-eslint/parser/6.9.0 name: '@typescript-eslint/parser' - version: 5.62.0 - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@typescript-eslint/scope-manager': registry.npmjs.org/@typescript-eslint/scope-manager@5.62.0 - '@typescript-eslint/types': registry.npmjs.org/@typescript-eslint/types@5.62.0 - '@typescript-eslint/typescript-estree': registry.npmjs.org/@typescript-eslint/typescript-estree@5.62.0(typescript@5.1.3) - debug: registry.npmjs.org/debug@4.3.4(supports-color@8.1.1) - eslint: registry.npmjs.org/eslint@8.43.0 - typescript: registry.npmjs.org/typescript@5.1.3 - transitivePeerDependencies: - - supports-color - dev: true - - registry.npmjs.org/@typescript-eslint/parser@6.8.0(eslint@8.43.0)(typescript@5.1.3): - resolution: {integrity: sha512-5tNs6Bw0j6BdWuP8Fx+VH4G9fEPDxnVI7yH1IAPkQH5RUtvKwRoqdecAPdQXv4rSOADAaz1LFBZvZG7VbXivSg==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.8.0.tgz} - id: registry.npmjs.org/@typescript-eslint/parser/6.8.0 - name: '@typescript-eslint/parser' - version: 6.8.0 + version: 6.9.0 engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: eslint: ^7.0.0 || ^8.0.0 @@ -3047,10 +2851,10 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/scope-manager': registry.npmjs.org/@typescript-eslint/scope-manager@6.8.0 - '@typescript-eslint/types': registry.npmjs.org/@typescript-eslint/types@6.8.0 - '@typescript-eslint/typescript-estree': registry.npmjs.org/@typescript-eslint/typescript-estree@6.8.0(typescript@5.1.3) - '@typescript-eslint/visitor-keys': registry.npmjs.org/@typescript-eslint/visitor-keys@6.8.0 + '@typescript-eslint/scope-manager': registry.npmjs.org/@typescript-eslint/scope-manager@6.9.0 + '@typescript-eslint/types': registry.npmjs.org/@typescript-eslint/types@6.9.0 + '@typescript-eslint/typescript-estree': registry.npmjs.org/@typescript-eslint/typescript-estree@6.9.0(typescript@5.1.3) + '@typescript-eslint/visitor-keys': registry.npmjs.org/@typescript-eslint/visitor-keys@6.9.0 debug: registry.npmjs.org/debug@4.3.4(supports-color@8.1.1) eslint: registry.npmjs.org/eslint@8.43.0 typescript: registry.npmjs.org/typescript@5.1.3 @@ -3068,24 +2872,14 @@ packages: '@typescript-eslint/visitor-keys': registry.npmjs.org/@typescript-eslint/visitor-keys@5.60.0 dev: true - registry.npmjs.org/@typescript-eslint/scope-manager@5.62.0: - resolution: {integrity: sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz} + registry.npmjs.org/@typescript-eslint/scope-manager@6.9.0: + resolution: {integrity: sha512-1R8A9Mc39n4pCCz9o79qRO31HGNDvC7UhPhv26TovDsWPBDx+Sg3rOZdCELIA3ZmNoWAuxaMOT7aWtGRSYkQxw==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.9.0.tgz} name: '@typescript-eslint/scope-manager' - version: 5.62.0 - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dependencies: - '@typescript-eslint/types': registry.npmjs.org/@typescript-eslint/types@5.62.0 - '@typescript-eslint/visitor-keys': registry.npmjs.org/@typescript-eslint/visitor-keys@5.62.0 - dev: true - - registry.npmjs.org/@typescript-eslint/scope-manager@6.8.0: - resolution: {integrity: sha512-xe0HNBVwCph7rak+ZHcFD6A+q50SMsFwcmfdjs9Kz4qDh5hWhaPhFjRs/SODEhroBI5Ruyvyz9LfwUJ624O40g==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.8.0.tgz} - name: '@typescript-eslint/scope-manager' - version: 6.8.0 + version: 6.9.0 engines: {node: ^16.0.0 || >=18.0.0} dependencies: - '@typescript-eslint/types': registry.npmjs.org/@typescript-eslint/types@6.8.0 - '@typescript-eslint/visitor-keys': registry.npmjs.org/@typescript-eslint/visitor-keys@6.8.0 + '@typescript-eslint/types': registry.npmjs.org/@typescript-eslint/types@6.9.0 + '@typescript-eslint/visitor-keys': registry.npmjs.org/@typescript-eslint/visitor-keys@6.9.0 dev: true registry.npmjs.org/@typescript-eslint/type-utils@5.60.0(eslint@8.43.0)(typescript@5.1.3): @@ -3111,11 +2905,11 @@ packages: - supports-color dev: true - registry.npmjs.org/@typescript-eslint/type-utils@6.8.0(eslint@8.43.0)(typescript@5.1.3): - resolution: {integrity: sha512-RYOJdlkTJIXW7GSldUIHqc/Hkto8E+fZN96dMIFhuTJcQwdRoGN2rEWA8U6oXbLo0qufH7NPElUb+MceHtz54g==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.8.0.tgz} - id: registry.npmjs.org/@typescript-eslint/type-utils/6.8.0 + registry.npmjs.org/@typescript-eslint/type-utils@6.9.0(eslint@8.43.0)(typescript@5.1.3): + resolution: {integrity: sha512-XXeahmfbpuhVbhSOROIzJ+b13krFmgtc4GlEuu1WBT+RpyGPIA4Y/eGnXzjbDj5gZLzpAXO/sj+IF/x2GtTMjQ==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.9.0.tgz} + id: registry.npmjs.org/@typescript-eslint/type-utils/6.9.0 name: '@typescript-eslint/type-utils' - version: 6.8.0 + version: 6.9.0 engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: eslint: ^7.0.0 || ^8.0.0 @@ -3124,8 +2918,8 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/typescript-estree': registry.npmjs.org/@typescript-eslint/typescript-estree@6.8.0(typescript@5.1.3) - '@typescript-eslint/utils': registry.npmjs.org/@typescript-eslint/utils@6.8.0(eslint@8.43.0)(typescript@5.1.3) + '@typescript-eslint/typescript-estree': registry.npmjs.org/@typescript-eslint/typescript-estree@6.9.0(typescript@5.1.3) + '@typescript-eslint/utils': registry.npmjs.org/@typescript-eslint/utils@6.9.0(eslint@8.43.0)(typescript@5.1.3) debug: registry.npmjs.org/debug@4.3.4(supports-color@8.1.1) eslint: registry.npmjs.org/eslint@8.43.0 ts-api-utils: registry.npmjs.org/ts-api-utils@1.0.3(typescript@5.1.3) @@ -3141,17 +2935,10 @@ packages: engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true - registry.npmjs.org/@typescript-eslint/types@5.62.0: - resolution: {integrity: sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz} + registry.npmjs.org/@typescript-eslint/types@6.9.0: + resolution: {integrity: sha512-+KB0lbkpxBkBSiVCuQvduqMJy+I1FyDbdwSpM3IoBS7APl4Bu15lStPjgBIdykdRqQNYqYNMa8Kuidax6phaEw==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@typescript-eslint/types/-/types-6.9.0.tgz} name: '@typescript-eslint/types' - version: 5.62.0 - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dev: true - - registry.npmjs.org/@typescript-eslint/types@6.8.0: - resolution: {integrity: sha512-p5qOxSum7W3k+llc7owEStXlGmSl8FcGvhYt8Vjy7FqEnmkCVlM3P57XQEGj58oqaBWDQXbJDZxwUWMS/EAPNQ==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@typescript-eslint/types/-/types-6.8.0.tgz} - name: '@typescript-eslint/types' - version: 6.8.0 + version: 6.9.0 engines: {node: ^16.0.0 || >=18.0.0} dev: true @@ -3179,35 +2966,11 @@ packages: - supports-color dev: true - registry.npmjs.org/@typescript-eslint/typescript-estree@5.62.0(typescript@5.1.3): - resolution: {integrity: sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz} - id: registry.npmjs.org/@typescript-eslint/typescript-estree/5.62.0 + registry.npmjs.org/@typescript-eslint/typescript-estree@6.9.0(typescript@5.1.3): + resolution: {integrity: sha512-NJM2BnJFZBEAbCfBP00zONKXvMqihZCrmwCaik0UhLr0vAgb6oguXxLX1k00oQyD+vZZ+CJn3kocvv2yxm4awQ==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.9.0.tgz} + id: registry.npmjs.org/@typescript-eslint/typescript-estree/6.9.0 name: '@typescript-eslint/typescript-estree' - version: 5.62.0 - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@typescript-eslint/types': registry.npmjs.org/@typescript-eslint/types@5.62.0 - '@typescript-eslint/visitor-keys': registry.npmjs.org/@typescript-eslint/visitor-keys@5.62.0 - debug: registry.npmjs.org/debug@4.3.4(supports-color@8.1.1) - globby: registry.npmjs.org/globby@11.1.0 - is-glob: registry.npmjs.org/is-glob@4.0.3 - semver: registry.npmjs.org/semver@7.5.4 - tsutils: registry.npmjs.org/tsutils@3.21.0(typescript@5.1.3) - typescript: registry.npmjs.org/typescript@5.1.3 - transitivePeerDependencies: - - supports-color - dev: true - - registry.npmjs.org/@typescript-eslint/typescript-estree@6.8.0(typescript@5.1.3): - resolution: {integrity: sha512-ISgV0lQ8XgW+mvv5My/+iTUdRmGspducmQcDw5JxznasXNnZn3SKNrTRuMsEXv+V/O+Lw9AGcQCfVaOPCAk/Zg==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.8.0.tgz} - id: registry.npmjs.org/@typescript-eslint/typescript-estree/6.8.0 - name: '@typescript-eslint/typescript-estree' - version: 6.8.0 + version: 6.9.0 engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: typescript: '*' @@ -3215,8 +2978,8 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/types': registry.npmjs.org/@typescript-eslint/types@6.8.0 - '@typescript-eslint/visitor-keys': registry.npmjs.org/@typescript-eslint/visitor-keys@6.8.0 + '@typescript-eslint/types': registry.npmjs.org/@typescript-eslint/types@6.9.0 + '@typescript-eslint/visitor-keys': registry.npmjs.org/@typescript-eslint/visitor-keys@6.9.0 debug: registry.npmjs.org/debug@4.3.4(supports-color@8.1.1) globby: registry.npmjs.org/globby@11.1.0 is-glob: registry.npmjs.org/is-glob@4.0.3 @@ -3250,11 +3013,11 @@ packages: - typescript dev: true - registry.npmjs.org/@typescript-eslint/utils@6.8.0(eslint@8.43.0)(typescript@5.1.3): - resolution: {integrity: sha512-dKs1itdE2qFG4jr0dlYLQVppqTE+Itt7GmIf/vX6CSvsW+3ov8PbWauVKyyfNngokhIO9sKZeRGCUo1+N7U98Q==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.8.0.tgz} - id: registry.npmjs.org/@typescript-eslint/utils/6.8.0 + registry.npmjs.org/@typescript-eslint/utils@6.9.0(eslint@8.43.0)(typescript@5.1.3): + resolution: {integrity: sha512-5Wf+Jsqya7WcCO8me504FBigeQKVLAMPmUzYgDbWchINNh1KJbxCgVya3EQ2MjvJMVeXl3pofRmprqX6mfQkjQ==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.9.0.tgz} + id: registry.npmjs.org/@typescript-eslint/utils/6.9.0 name: '@typescript-eslint/utils' - version: 6.8.0 + version: 6.9.0 engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: eslint: ^7.0.0 || ^8.0.0 @@ -3262,9 +3025,9 @@ packages: '@eslint-community/eslint-utils': registry.npmjs.org/@eslint-community/eslint-utils@4.4.0(eslint@8.43.0) '@types/json-schema': registry.npmjs.org/@types/json-schema@7.0.14 '@types/semver': registry.npmjs.org/@types/semver@7.5.4 - '@typescript-eslint/scope-manager': registry.npmjs.org/@typescript-eslint/scope-manager@6.8.0 - '@typescript-eslint/types': registry.npmjs.org/@typescript-eslint/types@6.8.0 - '@typescript-eslint/typescript-estree': registry.npmjs.org/@typescript-eslint/typescript-estree@6.8.0(typescript@5.1.3) + '@typescript-eslint/scope-manager': registry.npmjs.org/@typescript-eslint/scope-manager@6.9.0 + '@typescript-eslint/types': registry.npmjs.org/@typescript-eslint/types@6.9.0 + '@typescript-eslint/typescript-estree': registry.npmjs.org/@typescript-eslint/typescript-estree@6.9.0(typescript@5.1.3) eslint: registry.npmjs.org/eslint@8.43.0 semver: registry.npmjs.org/semver@7.5.4 transitivePeerDependencies: @@ -3282,23 +3045,13 @@ packages: eslint-visitor-keys: registry.npmjs.org/eslint-visitor-keys@3.4.3 dev: true - registry.npmjs.org/@typescript-eslint/visitor-keys@5.62.0: - resolution: {integrity: sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz} + registry.npmjs.org/@typescript-eslint/visitor-keys@6.9.0: + resolution: {integrity: sha512-dGtAfqjV6RFOtIP8I0B4ZTBRrlTT8NHHlZZSchQx3qReaoDeXhYM++M4So2AgFK9ZB0emRPA6JI1HkafzA2Ibg==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.9.0.tgz} name: '@typescript-eslint/visitor-keys' - version: 5.62.0 - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dependencies: - '@typescript-eslint/types': registry.npmjs.org/@typescript-eslint/types@5.62.0 - eslint-visitor-keys: registry.npmjs.org/eslint-visitor-keys@3.4.3 - dev: true - - registry.npmjs.org/@typescript-eslint/visitor-keys@6.8.0: - resolution: {integrity: sha512-oqAnbA7c+pgOhW2OhGvxm0t1BULX5peQI/rLsNDpGM78EebV3C9IGbX5HNZabuZ6UQrYveCLjKo8Iy/lLlBkkg==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.8.0.tgz} - name: '@typescript-eslint/visitor-keys' - version: 6.8.0 + version: 6.9.0 engines: {node: ^16.0.0 || >=18.0.0} dependencies: - '@typescript-eslint/types': registry.npmjs.org/@typescript-eslint/types@6.8.0 + '@typescript-eslint/types': registry.npmjs.org/@typescript-eslint/types@6.9.0 eslint-visitor-keys: registry.npmjs.org/eslint-visitor-keys@3.4.3 dev: true @@ -3508,19 +3261,6 @@ packages: engines: {node: '>=8'} dev: true - registry.npmjs.org/array.prototype.findlastindex@1.2.3: - resolution: {integrity: sha512-LzLoiOMAxvy+Gd3BAq3B7VeIgPdo+Q8hthvKtXybMvRV0jrXfJM/t8mw7nNlpEcVlVUnCnM2KSX4XU5HmpodOA==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.3.tgz} - name: array.prototype.findlastindex - version: 1.2.3 - engines: {node: '>= 0.4'} - dependencies: - call-bind: registry.npmjs.org/call-bind@1.0.5 - define-properties: registry.npmjs.org/define-properties@1.2.1 - es-abstract: registry.npmjs.org/es-abstract@1.22.3 - es-shim-unscopables: registry.npmjs.org/es-shim-unscopables@1.0.2 - get-intrinsic: registry.npmjs.org/get-intrinsic@1.2.2 - dev: true - registry.npmjs.org/array.prototype.flat@1.3.2: resolution: {integrity: sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz} name: array.prototype.flat @@ -3594,12 +3334,6 @@ packages: engines: {node: '>=0.8'} dev: true - registry.npmjs.org/ast-types-flow@0.0.7: - resolution: {integrity: sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz} - name: ast-types-flow - version: 0.0.7 - dev: true - registry.npmjs.org/astral-regex@2.0.0: resolution: {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz} name: astral-regex @@ -3748,13 +3482,6 @@ packages: version: 1.12.0 dev: true - registry.npmjs.org/axe-core@4.8.2: - resolution: {integrity: sha512-/dlp0fxyM3R8YW7MFzaHWXrf4zzbr0vaYb23VBFCl83R7nWNPg/yaQw2Dc8jzCMmDVLhSdzH8MjrsuIUuvX+6g==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/axe-core/-/axe-core-4.8.2.tgz} - name: axe-core - version: 4.8.2 - engines: {node: '>=4'} - dev: true - registry.npmjs.org/axios@0.21.4(debug@4.3.2): resolution: {integrity: sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/axios/-/axios-0.21.4.tgz} id: registry.npmjs.org/axios/0.21.4 @@ -3963,6 +3690,7 @@ packages: engines: {node: '>=10.16.0'} dependencies: streamsearch: registry.npmjs.org/streamsearch@1.1.0 + dev: true registry.npmjs.org/cachedir@2.4.0: resolution: {integrity: sha512-9EtFOZR8g22CL7BWjJ9BUx1+A/djkofnyW3aOXZORNW2kxoUpx2h+uN2cOqwPmFhnpVmxg+KW2OjOSgChTEvsQ==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/cachedir/-/cachedir-2.4.0.tgz} @@ -4194,12 +3922,6 @@ packages: string-width: registry.npmjs.org/string-width@4.2.3 dev: true - registry.npmjs.org/client-only@0.0.1: - resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz} - name: client-only - version: 0.0.1 - dev: false - registry.npmjs.org/cliui@6.0.0: resolution: {integrity: sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz} name: cliui @@ -4745,12 +4467,6 @@ packages: lodash: registry.npmjs.org/lodash@4.17.21 dev: false - registry.npmjs.org/damerau-levenshtein@1.0.8: - resolution: {integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz} - name: damerau-levenshtein - version: 1.0.8 - dev: true - registry.npmjs.org/dashdash@1.14.1: resolution: {integrity: sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz} name: dashdash @@ -5111,6 +4827,7 @@ packages: resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz} name: emoji-regex version: 9.2.2 + dev: false registry.npmjs.org/end-of-stream@1.4.4: resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz} @@ -5119,16 +4836,6 @@ packages: dependencies: once: registry.npmjs.org/once@1.4.0 - registry.npmjs.org/enhanced-resolve@5.15.0: - resolution: {integrity: sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz} - name: enhanced-resolve - version: 5.15.0 - engines: {node: '>=10.13.0'} - dependencies: - graceful-fs: registry.npmjs.org/graceful-fs@4.2.11 - tapable: registry.npmjs.org/tapable@2.2.1 - dev: true - registry.npmjs.org/enquirer@2.4.1: resolution: {integrity: sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/enquirer/-/enquirer-2.4.1.tgz} name: enquirer @@ -5353,34 +5060,6 @@ packages: engines: {node: '>=12'} dev: false - registry.npmjs.org/eslint-config-next@13.5.4(eslint@8.43.0)(typescript@5.1.3): - resolution: {integrity: sha512-FzQGIj4UEszRX7fcRSJK6L1LrDiVZvDFW320VVntVKh3BSU8Fb9kpaoxQx0cdFgf3MQXdeSbrCXJ/5Z/NndDkQ==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-13.5.4.tgz} - id: registry.npmjs.org/eslint-config-next/13.5.4 - name: eslint-config-next - version: 13.5.4 - peerDependencies: - eslint: ^7.23.0 || ^8.0.0 - typescript: '>=3.3.1' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@next/eslint-plugin-next': registry.npmjs.org/@next/eslint-plugin-next@13.5.4 - '@rushstack/eslint-patch': registry.npmjs.org/@rushstack/eslint-patch@1.5.1 - '@typescript-eslint/parser': registry.npmjs.org/@typescript-eslint/parser@5.62.0(eslint@8.43.0)(typescript@5.1.3) - eslint: registry.npmjs.org/eslint@8.43.0 - eslint-import-resolver-node: registry.npmjs.org/eslint-import-resolver-node@0.3.9 - eslint-import-resolver-typescript: registry.npmjs.org/eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.0)(eslint@8.43.0) - eslint-plugin-import: registry.npmjs.org/eslint-plugin-import@2.29.0(@typescript-eslint/parser@6.8.0)(eslint@8.43.0) - eslint-plugin-jsx-a11y: registry.npmjs.org/eslint-plugin-jsx-a11y@6.7.1(eslint@8.43.0) - eslint-plugin-react: registry.npmjs.org/eslint-plugin-react@7.33.2(eslint@8.43.0) - eslint-plugin-react-hooks: registry.npmjs.org/eslint-plugin-react-hooks@4.6.0(eslint@8.43.0) - typescript: registry.npmjs.org/typescript@5.1.3 - transitivePeerDependencies: - - eslint-import-resolver-webpack - - supports-color - dev: true - registry.npmjs.org/eslint-config-prettier@8.8.0(eslint@8.43.0): resolution: {integrity: sha512-wLbQiFre3tdGgpDv67NQKnJuTlcUVYHas3k+DZCc2U2BadthoEY4B7hLPvAxaqdyOGCzuLfii2fqGph10va7oA==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.8.0.tgz} id: registry.npmjs.org/eslint-config-prettier/8.8.0 @@ -5393,185 +5072,16 @@ packages: eslint: registry.npmjs.org/eslint@8.43.0 dev: true - registry.npmjs.org/eslint-config-turbo@1.10.15(eslint@8.43.0): - resolution: {integrity: sha512-76mpx2x818JZE26euen14utYcFDxOahZ9NaWA+6Xa4pY2ezVKVschuOxS96EQz3o3ZRSmcgBOapw/gHbN+EKxQ==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/eslint-config-turbo/-/eslint-config-turbo-1.10.15.tgz} - id: registry.npmjs.org/eslint-config-turbo/1.10.15 + registry.npmjs.org/eslint-config-turbo@1.10.16(eslint@8.43.0): + resolution: {integrity: sha512-O3NQI72bQHV7FvSC6lWj66EGx8drJJjuT1kuInn6nbMLOHdMBhSUX/8uhTAlHRQdlxZk2j9HtgFCIzSc93w42g==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/eslint-config-turbo/-/eslint-config-turbo-1.10.16.tgz} + id: registry.npmjs.org/eslint-config-turbo/1.10.16 name: eslint-config-turbo - version: 1.10.15 + version: 1.10.16 peerDependencies: eslint: '>6.6.0' dependencies: eslint: registry.npmjs.org/eslint@8.43.0 - eslint-plugin-turbo: registry.npmjs.org/eslint-plugin-turbo@1.10.15(eslint@8.43.0) - dev: true - - registry.npmjs.org/eslint-import-resolver-node@0.3.9: - resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz} - name: eslint-import-resolver-node - version: 0.3.9 - dependencies: - debug: registry.npmjs.org/debug@3.2.7(supports-color@8.1.1) - is-core-module: registry.npmjs.org/is-core-module@2.13.1 - resolve: registry.npmjs.org/resolve@1.22.8 - transitivePeerDependencies: - - supports-color - dev: true - - registry.npmjs.org/eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.0)(eslint@8.43.0): - resolution: {integrity: sha512-xgdptdoi5W3niYeuQxKmzVDTATvLYqhpwmykwsh7f6HIOStGWEIL9iqZgQDF9u9OEzrRwR8no5q2VT+bjAujTg==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.6.1.tgz} - id: registry.npmjs.org/eslint-import-resolver-typescript/3.6.1 - name: eslint-import-resolver-typescript - version: 3.6.1 - engines: {node: ^14.18.0 || >=16.0.0} - peerDependencies: - eslint: '*' - eslint-plugin-import: '*' - dependencies: - debug: registry.npmjs.org/debug@4.3.4(supports-color@8.1.1) - enhanced-resolve: registry.npmjs.org/enhanced-resolve@5.15.0 - eslint: registry.npmjs.org/eslint@8.43.0 - eslint-module-utils: registry.npmjs.org/eslint-module-utils@2.8.0(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.43.0) - eslint-plugin-import: registry.npmjs.org/eslint-plugin-import@2.29.0(@typescript-eslint/parser@6.8.0)(eslint@8.43.0) - fast-glob: registry.npmjs.org/fast-glob@3.3.1 - get-tsconfig: registry.npmjs.org/get-tsconfig@4.7.2 - is-core-module: registry.npmjs.org/is-core-module@2.13.1 - is-glob: registry.npmjs.org/is-glob@4.0.3 - transitivePeerDependencies: - - '@typescript-eslint/parser' - - eslint-import-resolver-node - - eslint-import-resolver-webpack - - supports-color - dev: true - - registry.npmjs.org/eslint-module-utils@2.8.0(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.43.0): - resolution: {integrity: sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz} - id: registry.npmjs.org/eslint-module-utils/2.8.0 - name: eslint-module-utils - version: 2.8.0 - engines: {node: '>=4'} - peerDependencies: - '@typescript-eslint/parser': '*' - eslint: '*' - eslint-import-resolver-node: '*' - eslint-import-resolver-typescript: '*' - eslint-import-resolver-webpack: '*' - peerDependenciesMeta: - '@typescript-eslint/parser': - optional: true - eslint: - optional: true - eslint-import-resolver-node: - optional: true - eslint-import-resolver-typescript: - optional: true - eslint-import-resolver-webpack: - optional: true - dependencies: - '@typescript-eslint/parser': registry.npmjs.org/@typescript-eslint/parser@5.62.0(eslint@8.43.0)(typescript@5.1.3) - debug: registry.npmjs.org/debug@3.2.7(supports-color@8.1.1) - eslint: registry.npmjs.org/eslint@8.43.0 - eslint-import-resolver-node: registry.npmjs.org/eslint-import-resolver-node@0.3.9 - eslint-import-resolver-typescript: registry.npmjs.org/eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.0)(eslint@8.43.0) - transitivePeerDependencies: - - supports-color - dev: true - - registry.npmjs.org/eslint-module-utils@2.8.0(@typescript-eslint/parser@6.8.0)(eslint-import-resolver-node@0.3.9)(eslint@8.43.0): - resolution: {integrity: sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz} - id: registry.npmjs.org/eslint-module-utils/2.8.0 - name: eslint-module-utils - version: 2.8.0 - engines: {node: '>=4'} - peerDependencies: - '@typescript-eslint/parser': '*' - eslint: '*' - eslint-import-resolver-node: '*' - eslint-import-resolver-typescript: '*' - eslint-import-resolver-webpack: '*' - peerDependenciesMeta: - '@typescript-eslint/parser': - optional: true - eslint: - optional: true - eslint-import-resolver-node: - optional: true - eslint-import-resolver-typescript: - optional: true - eslint-import-resolver-webpack: - optional: true - dependencies: - '@typescript-eslint/parser': registry.npmjs.org/@typescript-eslint/parser@6.8.0(eslint@8.43.0)(typescript@5.1.3) - debug: registry.npmjs.org/debug@3.2.7(supports-color@8.1.1) - eslint: registry.npmjs.org/eslint@8.43.0 - eslint-import-resolver-node: registry.npmjs.org/eslint-import-resolver-node@0.3.9 - transitivePeerDependencies: - - supports-color - dev: true - - registry.npmjs.org/eslint-plugin-import@2.29.0(@typescript-eslint/parser@6.8.0)(eslint@8.43.0): - resolution: {integrity: sha512-QPOO5NO6Odv5lpoTkddtutccQjysJuFxoPS7fAHO+9m9udNHvTCPSAMW9zGAYj8lAIdr40I8yPCdUYrncXtrwg==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.29.0.tgz} - id: registry.npmjs.org/eslint-plugin-import/2.29.0 - name: eslint-plugin-import - version: 2.29.0 - engines: {node: '>=4'} - peerDependencies: - '@typescript-eslint/parser': '*' - eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 - peerDependenciesMeta: - '@typescript-eslint/parser': - optional: true - dependencies: - '@typescript-eslint/parser': registry.npmjs.org/@typescript-eslint/parser@6.8.0(eslint@8.43.0)(typescript@5.1.3) - array-includes: registry.npmjs.org/array-includes@3.1.7 - array.prototype.findlastindex: registry.npmjs.org/array.prototype.findlastindex@1.2.3 - array.prototype.flat: registry.npmjs.org/array.prototype.flat@1.3.2 - array.prototype.flatmap: registry.npmjs.org/array.prototype.flatmap@1.3.2 - debug: registry.npmjs.org/debug@3.2.7(supports-color@8.1.1) - doctrine: registry.npmjs.org/doctrine@2.1.0 - eslint: registry.npmjs.org/eslint@8.43.0 - eslint-import-resolver-node: registry.npmjs.org/eslint-import-resolver-node@0.3.9 - eslint-module-utils: registry.npmjs.org/eslint-module-utils@2.8.0(@typescript-eslint/parser@6.8.0)(eslint-import-resolver-node@0.3.9)(eslint@8.43.0) - hasown: registry.npmjs.org/hasown@2.0.0 - is-core-module: registry.npmjs.org/is-core-module@2.13.1 - is-glob: registry.npmjs.org/is-glob@4.0.3 - minimatch: registry.npmjs.org/minimatch@3.1.2 - object.fromentries: registry.npmjs.org/object.fromentries@2.0.7 - object.groupby: registry.npmjs.org/object.groupby@1.0.1 - object.values: registry.npmjs.org/object.values@1.1.7 - semver: registry.npmjs.org/semver@6.3.1 - tsconfig-paths: registry.npmjs.org/tsconfig-paths@3.14.2 - transitivePeerDependencies: - - eslint-import-resolver-typescript - - eslint-import-resolver-webpack - - supports-color - dev: true - - registry.npmjs.org/eslint-plugin-jsx-a11y@6.7.1(eslint@8.43.0): - resolution: {integrity: sha512-63Bog4iIethyo8smBklORknVjB0T2dwB8Mr/hIC+fBS0uyHdYYpzM/Ed+YC8VxTjlXHEWFOdmgwcDn1U2L9VCA==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.7.1.tgz} - id: registry.npmjs.org/eslint-plugin-jsx-a11y/6.7.1 - name: eslint-plugin-jsx-a11y - version: 6.7.1 - engines: {node: '>=4.0'} - peerDependencies: - eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 - dependencies: - '@babel/runtime': registry.npmjs.org/@babel/runtime@7.23.2 - aria-query: registry.npmjs.org/aria-query@5.3.0 - array-includes: registry.npmjs.org/array-includes@3.1.7 - array.prototype.flatmap: registry.npmjs.org/array.prototype.flatmap@1.3.2 - ast-types-flow: registry.npmjs.org/ast-types-flow@0.0.7 - axe-core: registry.npmjs.org/axe-core@4.8.2 - axobject-query: registry.npmjs.org/axobject-query@3.2.1 - damerau-levenshtein: registry.npmjs.org/damerau-levenshtein@1.0.8 - emoji-regex: registry.npmjs.org/emoji-regex@9.2.2 - eslint: registry.npmjs.org/eslint@8.43.0 - has: registry.npmjs.org/has@1.0.4 - jsx-ast-utils: registry.npmjs.org/jsx-ast-utils@3.3.5 - language-tags: registry.npmjs.org/language-tags@1.0.5 - minimatch: registry.npmjs.org/minimatch@3.1.2 - object.entries: registry.npmjs.org/object.entries@1.1.7 - object.fromentries: registry.npmjs.org/object.fromentries@2.0.7 - semver: registry.npmjs.org/semver@6.3.1 + eslint-plugin-turbo: registry.npmjs.org/eslint-plugin-turbo@1.10.16(eslint@8.43.0) dev: true registry.npmjs.org/eslint-plugin-prettier@4.2.1(eslint-config-prettier@8.8.0)(eslint@8.43.0)(prettier@2.8.8): @@ -5594,18 +5104,6 @@ packages: prettier-linter-helpers: registry.npmjs.org/prettier-linter-helpers@1.0.0 dev: true - registry.npmjs.org/eslint-plugin-react-hooks@4.6.0(eslint@8.43.0): - resolution: {integrity: sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz} - id: registry.npmjs.org/eslint-plugin-react-hooks/4.6.0 - name: eslint-plugin-react-hooks - version: 4.6.0 - engines: {node: '>=10'} - peerDependencies: - eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 - dependencies: - eslint: registry.npmjs.org/eslint@8.43.0 - dev: true - registry.npmjs.org/eslint-plugin-react@7.33.2(eslint@8.43.0): resolution: {integrity: sha512-73QQMKALArI8/7xGLNI/3LylrEYrlKZSb5C9+q3OtOewTnMQi5cT+aE9E41sLCmli3I9PGGmD1yiZydyo4FEPw==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.33.2.tgz} id: registry.npmjs.org/eslint-plugin-react/7.33.2 @@ -5665,11 +5163,11 @@ packages: - ts-node dev: true - registry.npmjs.org/eslint-plugin-turbo@1.10.15(eslint@8.43.0): - resolution: {integrity: sha512-Tv4QSKV/U56qGcTqS/UgOvb9HcKFmWOQcVh3HEaj7of94lfaENgfrtK48E2CckQf7amhKs1i+imhCsNCKjkQyA==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/eslint-plugin-turbo/-/eslint-plugin-turbo-1.10.15.tgz} - id: registry.npmjs.org/eslint-plugin-turbo/1.10.15 + registry.npmjs.org/eslint-plugin-turbo@1.10.16(eslint@8.43.0): + resolution: {integrity: sha512-ZjrR88MTN64PNGufSEcM0tf+V1xFYVbeiMeuIqr0aiABGomxFLo4DBkQ7WI4WzkZtWQSIA2sP+yxqSboEfL9MQ==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/eslint-plugin-turbo/-/eslint-plugin-turbo-1.10.16.tgz} + id: registry.npmjs.org/eslint-plugin-turbo/1.10.16 name: eslint-plugin-turbo - version: 1.10.15 + version: 1.10.16 peerDependencies: eslint: '>6.6.0' dependencies: @@ -6306,14 +5804,6 @@ packages: get-intrinsic: registry.npmjs.org/get-intrinsic@1.2.2 dev: true - registry.npmjs.org/get-tsconfig@4.7.2: - resolution: {integrity: sha512-wuMsz4leaj5hbGgg4IvDU0bqJagpftG5l5cXIAvo8uZrqn0NJqwtfupTN00VnkQJPcIRrxYrm1Ue24btpCha2A==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.7.2.tgz} - name: get-tsconfig - version: 4.7.2 - dependencies: - resolve-pkg-maps: registry.npmjs.org/resolve-pkg-maps@1.0.0 - dev: true - registry.npmjs.org/getos@3.2.1: resolution: {integrity: sha512-U56CfOK17OKgTVqozZjUKNdkfEv6jk5WISBJ8SHoagjE6L69zOwl3Z+O8myjY9MEW3i2HPWQBt/LTbCgcC973Q==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/getos/-/getos-3.2.1.tgz} name: getos @@ -6360,25 +5850,6 @@ packages: is-glob: registry.npmjs.org/is-glob@4.0.3 dev: true - registry.npmjs.org/glob-to-regexp@0.4.1: - resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz} - name: glob-to-regexp - version: 0.4.1 - dev: false - - registry.npmjs.org/glob@7.1.7: - resolution: {integrity: sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/glob/-/glob-7.1.7.tgz} - name: glob - version: 7.1.7 - dependencies: - fs.realpath: registry.npmjs.org/fs.realpath@1.0.0 - inflight: registry.npmjs.org/inflight@1.0.6 - inherits: registry.npmjs.org/inherits@2.0.4 - minimatch: registry.npmjs.org/minimatch@3.1.2 - once: registry.npmjs.org/once@1.4.0 - path-is-absolute: registry.npmjs.org/path-is-absolute@1.0.1 - dev: true - registry.npmjs.org/glob@7.2.3: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/glob/-/glob-7.2.3.tgz} name: glob @@ -6566,13 +6037,6 @@ packages: has-symbols: registry.npmjs.org/has-symbols@1.0.3 dev: true - registry.npmjs.org/has@1.0.4: - resolution: {integrity: sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/has/-/has-1.0.4.tgz} - name: has - version: 1.0.4 - engines: {node: '>= 0.4.0'} - dev: true - registry.npmjs.org/hasown@2.0.0: resolution: {integrity: sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz} name: hasown @@ -7334,15 +6798,6 @@ packages: version: 5.0.1 dev: true - registry.npmjs.org/json5@1.0.2: - resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/json5/-/json5-1.0.2.tgz} - name: json5 - version: 1.0.2 - hasBin: true - dependencies: - minimist: registry.npmjs.org/minimist@1.2.8 - dev: true - registry.npmjs.org/json5@2.2.3: resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/json5/-/json5-2.2.3.tgz} name: json5 @@ -7431,20 +6886,6 @@ packages: version: 0.27.0 dev: true - registry.npmjs.org/language-subtag-registry@0.3.22: - resolution: {integrity: sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz} - name: language-subtag-registry - version: 0.3.22 - dev: true - - registry.npmjs.org/language-tags@1.0.5: - resolution: {integrity: sha512-qJhlO9cGXi6hBGKoxEG/sKZDAHD5Hnu9Hs4WbOY3pCWXDhw0N8x1NenNzm2EnNLkLkk7J2SdxAkDSbb6ftT+UQ==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/language-tags/-/language-tags-1.0.5.tgz} - name: language-tags - version: 1.0.5 - dependencies: - language-subtag-registry: registry.npmjs.org/language-subtag-registry@0.3.22 - dev: true - registry.npmjs.org/lazy-ass@1.6.0: resolution: {integrity: sha512-cc8oEVoctTvsFZ/Oje/kGnHbpWHYBe8IAJe4C0QNc3t8uM/0Y8+erSz/7Y1ALuXTEZTMvxXwO6YbX1ey3ujiZw==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/lazy-ass/-/lazy-ass-1.6.0.tgz} name: lazy-ass @@ -8396,48 +7837,6 @@ packages: - supports-color dev: false - registry.npmjs.org/next@13.5.4(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-+93un5S779gho8y9ASQhb/bTkQF17FNQOtXLKAj3lsNgltEcF0C5PMLLncDmH+8X1EnJH1kbqAERa29nRXqhjA==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/next/-/next-13.5.4.tgz} - id: registry.npmjs.org/next/13.5.4 - name: next - version: 13.5.4 - engines: {node: '>=16.14.0'} - hasBin: true - peerDependencies: - '@opentelemetry/api': ^1.1.0 - react: ^18.2.0 - react-dom: ^18.2.0 - sass: ^1.3.0 - peerDependenciesMeta: - '@opentelemetry/api': - optional: true - sass: - optional: true - dependencies: - '@next/env': registry.npmjs.org/@next/env@13.5.4 - '@swc/helpers': registry.npmjs.org/@swc/helpers@0.5.2 - busboy: registry.npmjs.org/busboy@1.6.0 - caniuse-lite: registry.npmjs.org/caniuse-lite@1.0.30001553 - postcss: registry.npmjs.org/postcss@8.4.31 - react: registry.npmjs.org/react@18.2.0 - react-dom: registry.npmjs.org/react-dom@18.2.0(react@18.2.0) - styled-jsx: registry.npmjs.org/styled-jsx@5.1.1(react@18.2.0) - watchpack: registry.npmjs.org/watchpack@2.4.0 - optionalDependencies: - '@next/swc-darwin-arm64': registry.npmjs.org/@next/swc-darwin-arm64@13.5.4 - '@next/swc-darwin-x64': registry.npmjs.org/@next/swc-darwin-x64@13.5.4 - '@next/swc-linux-arm64-gnu': registry.npmjs.org/@next/swc-linux-arm64-gnu@13.5.4 - '@next/swc-linux-arm64-musl': registry.npmjs.org/@next/swc-linux-arm64-musl@13.5.4 - '@next/swc-linux-x64-gnu': registry.npmjs.org/@next/swc-linux-x64-gnu@13.5.4 - '@next/swc-linux-x64-musl': registry.npmjs.org/@next/swc-linux-x64-musl@13.5.4 - '@next/swc-win32-arm64-msvc': registry.npmjs.org/@next/swc-win32-arm64-msvc@13.5.4 - '@next/swc-win32-ia32-msvc': registry.npmjs.org/@next/swc-win32-ia32-msvc@13.5.4 - '@next/swc-win32-x64-msvc': registry.npmjs.org/@next/swc-win32-x64-msvc@13.5.4 - transitivePeerDependencies: - - '@babel/core' - - babel-plugin-macros - dev: false - registry.npmjs.org/nlcst-to-string@3.1.1: resolution: {integrity: sha512-63mVyqaqt0cmn2VcI2aH6kxe1rLAmSROqHMA0i4qqg1tidkfExgpb0FGMikMCn86mw5dFtBtEANfmSSK7TjNHw==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/nlcst-to-string/-/nlcst-to-string-3.1.1.tgz} name: nlcst-to-string @@ -8594,17 +7993,6 @@ packages: es-abstract: registry.npmjs.org/es-abstract@1.22.3 dev: true - registry.npmjs.org/object.groupby@1.0.1: - resolution: {integrity: sha512-HqaQtqLnp/8Bn4GL16cj+CUYbnpe1bh0TtEaWvybszDG4tgxCJuRpV8VGuvNaI1fAnI4lUJzDG55MXcOH4JZcQ==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.1.tgz} - name: object.groupby - version: 1.0.1 - dependencies: - call-bind: registry.npmjs.org/call-bind@1.0.5 - define-properties: registry.npmjs.org/define-properties@1.2.1 - es-abstract: registry.npmjs.org/es-abstract@1.22.3 - get-intrinsic: registry.npmjs.org/get-intrinsic@1.2.2 - dev: true - registry.npmjs.org/object.hasown@1.1.3: resolution: {integrity: sha512-fFI4VcYpRHvSLXxP7yiZOMAd331cPfd2p7PFDVbgUsYOfCT3tICVqXWngbjr4m49OvsBwUBQ6O2uQoJvy3RexA==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.3.tgz} name: object.hasown @@ -10006,12 +9394,6 @@ packages: engines: {node: '>=8'} dev: true - registry.npmjs.org/resolve-pkg-maps@1.0.0: - resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz} - name: resolve-pkg-maps - version: 1.0.0 - dev: true - registry.npmjs.org/resolve@1.22.8: resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz} name: resolve @@ -10685,6 +10067,7 @@ packages: name: streamsearch version: 1.1.0 engines: {node: '>=10.0.0'} + dev: true registry.npmjs.org/streamx@2.15.1: resolution: {integrity: sha512-fQMzy2O/Q47rgwErk/eGeLu/roaFWV0jVsogDmrszM9uIw8L5OA+t+V93MgYlufNptfjmYR1tOMWhei/Eh7TQA==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/streamx/-/streamx-2.15.1.tgz} @@ -10867,26 +10250,6 @@ packages: engines: {node: '>=8'} dev: true - registry.npmjs.org/styled-jsx@5.1.1(react@18.2.0): - resolution: {integrity: sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.1.tgz} - id: registry.npmjs.org/styled-jsx/5.1.1 - name: styled-jsx - version: 5.1.1 - engines: {node: '>= 12.0.0'} - peerDependencies: - '@babel/core': '*' - babel-plugin-macros: '*' - react: '>= 16.8.0 || 17.x.x || ^18.0.0-0' - peerDependenciesMeta: - '@babel/core': - optional: true - babel-plugin-macros: - optional: true - dependencies: - client-only: registry.npmjs.org/client-only@0.0.1 - react: registry.npmjs.org/react@18.2.0 - dev: false - registry.npmjs.org/stylehacks@6.0.0(postcss@8.4.21): resolution: {integrity: sha512-+UT589qhHPwz6mTlCLSt/vMNTJx8dopeJlZAlBMJPWA3ORqu6wmQY7FBXf+qD+FsqoBJODyqNxOUP3jdntFRdw==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/stylehacks/-/stylehacks-6.0.0.tgz} id: registry.npmjs.org/stylehacks/6.0.0 @@ -11194,13 +10557,6 @@ packages: picocolors: registry.npmjs.org/picocolors@1.0.0 dev: true - registry.npmjs.org/tapable@2.2.1: - resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz} - name: tapable - version: 2.2.1 - engines: {node: '>=6'} - dev: true - registry.npmjs.org/tar-fs@2.1.1: resolution: {integrity: sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz} name: tar-fs @@ -11388,17 +10744,6 @@ packages: typescript: registry.npmjs.org/typescript@5.1.3 dev: true - registry.npmjs.org/tsconfig-paths@3.14.2: - resolution: {integrity: sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz} - name: tsconfig-paths - version: 3.14.2 - dependencies: - '@types/json5': registry.npmjs.org/@types/json5@0.0.29 - json5: registry.npmjs.org/json5@1.0.2 - minimist: registry.npmjs.org/minimist@1.2.8 - strip-bom: registry.npmjs.org/strip-bom@3.0.0 - dev: true - registry.npmjs.org/tsconfig-resolver@3.0.1: resolution: {integrity: sha512-ZHqlstlQF449v8glscGRXzL6l2dZvASPCdXJRWG4gHEZlUVx2Jtmr+a2zeVG4LCsKhDXKRj5R3h0C/98UcVAQg==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/tsconfig-resolver/-/tsconfig-resolver-3.0.1.tgz} name: tsconfig-resolver @@ -12033,16 +11378,6 @@ packages: - debug dev: true - registry.npmjs.org/watchpack@2.4.0: - resolution: {integrity: sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz} - name: watchpack - version: 2.4.0 - engines: {node: '>=10.13.0'} - dependencies: - glob-to-regexp: registry.npmjs.org/glob-to-regexp@0.4.1 - graceful-fs: registry.npmjs.org/graceful-fs@4.2.11 - dev: false - registry.npmjs.org/wcwidth@1.0.1: resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz} name: wcwidth From 92272080e36c232c87f4bc260e21f507558897b1 Mon Sep 17 00:00:00 2001 From: Peter Date: Thu, 2 Nov 2023 14:04:41 +0100 Subject: [PATCH 010/608] Added more tests for edges, pane --- .../src/routes/tests/edges/nodesAndEdges.ts | 20 +++++----- .../svelte/src/routes/tests/pane/+page.svelte | 9 +++++ .../svelte/src/routes/tests/pane/Flow.svelte | 12 ++++++ .../src/routes/tests/pane/nodesAndEdges.ts | 35 +++++++++++++++++ tests/playwright/e2e/edges.spec.ts | 38 +++++++++++++++++++ tests/playwright/e2e/pane.spec.ts | 36 ++++++++++++++++++ 6 files changed, 140 insertions(+), 10 deletions(-) create mode 100644 examples/svelte/src/routes/tests/pane/+page.svelte create mode 100644 examples/svelte/src/routes/tests/pane/Flow.svelte create mode 100644 examples/svelte/src/routes/tests/pane/nodesAndEdges.ts create mode 100644 tests/playwright/e2e/pane.spec.ts diff --git a/examples/svelte/src/routes/tests/edges/nodesAndEdges.ts b/examples/svelte/src/routes/tests/edges/nodesAndEdges.ts index 6e0d969a..b5452b8c 100644 --- a/examples/svelte/src/routes/tests/edges/nodesAndEdges.ts +++ b/examples/svelte/src/routes/tests/edges/nodesAndEdges.ts @@ -56,17 +56,17 @@ export const initialNodes: Node[] = [ id: '11', data: { label: '11' }, position: { x: 100, y: 500 } - }, - { - id: '12', - data: { label: '12' }, - position: { x: -100, y: 600 } - }, - { - id: '13', - data: { label: '13' }, - position: { x: 100, y: 600 } } + // { + // id: '12', + // data: { label: '12' }, + // position: { x: -100, y: 600 } + // }, + // { + // id: '13', + // data: { label: '13' }, + // position: { x: 100, y: 600 } + // } ]; export const initialEdges: Edge[] = [ diff --git a/examples/svelte/src/routes/tests/pane/+page.svelte b/examples/svelte/src/routes/tests/pane/+page.svelte new file mode 100644 index 00000000..12dec33c --- /dev/null +++ b/examples/svelte/src/routes/tests/pane/+page.svelte @@ -0,0 +1,9 @@ + + + + + diff --git a/examples/svelte/src/routes/tests/pane/Flow.svelte b/examples/svelte/src/routes/tests/pane/Flow.svelte new file mode 100644 index 00000000..6686c907 --- /dev/null +++ b/examples/svelte/src/routes/tests/pane/Flow.svelte @@ -0,0 +1,12 @@ + + + diff --git a/examples/svelte/src/routes/tests/pane/nodesAndEdges.ts b/examples/svelte/src/routes/tests/pane/nodesAndEdges.ts new file mode 100644 index 00000000..81e88cc4 --- /dev/null +++ b/examples/svelte/src/routes/tests/pane/nodesAndEdges.ts @@ -0,0 +1,35 @@ +import type { Edge, Node } from '@xyflow/svelte'; + +export const initialNodes: Node[] = [ + { + id: '1', + data: { label: '1' }, + position: { x: 0, y: 0 }, + type: 'input' + }, + { + id: '2', + data: { label: '2' }, + position: { x: -100, y: 100 } + }, + { + id: '3', + data: { label: '3' }, + position: { x: 100, y: 100 } + } +]; + +export const initialEdges: Edge[] = [ + { + id: 'edge-with-class', + source: '1', + target: '2', + class: 'edge-class-test' + }, + { + id: 'edge-with-style', + source: '1', + target: '3', + style: 'stroke: red;' + } +]; diff --git a/tests/playwright/e2e/edges.spec.ts b/tests/playwright/e2e/edges.spec.ts index f91d89e0..033bc107 100644 --- a/tests/playwright/e2e/edges.spec.ts +++ b/tests/playwright/e2e/edges.spec.ts @@ -118,5 +118,43 @@ test.describe('EDGES', () => { await page.keyboard.press('Backspace'); await expect(edge).toBeAttached(); }); + + test('zIndex sets z-index of edge svgs', async ({ page }) => { + const svg = page.locator('svg', { has: page.locator('#z-index') }); + + await expect(svg).toBeAttached(); + await expect(svg).toHaveCSS('z-index', '3141592'); + }); + + test('aria-lable is working', async ({ page }) => { + const edge = page.locator('[data-id="aria-label"]'); + + await expect(edge).toHaveAttribute('aria-label', 'aria-label-test'); + }); + + test('interactionWidth is working', async ({ page }) => { + const edge = page.locator('[data-id="interaction-width"]'); + + await expect(edge).toBeAttached(); + + const edgeBox = await edge.boundingBox(); + + //FIXME: Negative values are not working. Investigate further + await page.mouse.move(edgeBox!.x + edgeBox!.width * 0.5 + 21, edgeBox!.y + edgeBox!.height * 0.5); + await page.mouse.down(); + await page.mouse.up(); + + // TODO: times out on webkit + await expect(edge).toHaveClass(/selected/); + }); + + test('markerEnd is setting marker-end', async ({ page }) => { + const edge = page.locator('#markers'); + + await expect(edge).toBeAttached(); + + await expect(edge).toHaveAttribute('marker-start', 'url(#1__type=arrowclosed)'); + await expect(edge).toHaveAttribute('marker-end', 'url(#1__type=arrow)'); + }); }); }); diff --git a/tests/playwright/e2e/pane.spec.ts b/tests/playwright/e2e/pane.spec.ts new file mode 100644 index 00000000..c3899f12 --- /dev/null +++ b/tests/playwright/e2e/pane.spec.ts @@ -0,0 +1,36 @@ +import { test, expect } from '@playwright/test'; + +import { FRAMEWORK } from './constants'; + +test.describe('PANE', () => { + test.beforeEach(async ({ page }) => { + // Go to the starting url before each test. + await page.goto('/tests/pane'); + }); + + test.describe('pan', () => { + test('panning the pane', async ({ page }) => { + const pane = page.locator(`.${FRAMEWORK}-flow__pane`); + const viewport = page.locator(`.${FRAMEWORK}-flow__viewport`); + + await expect(pane).toBeAttached(); + + const paneBox = await pane.boundingBox(); + + const viewportTransformBeforePan = await viewport.evaluate((element) => { + return element.style.transform; + }); + + await pane.hover(); + await page.mouse.down(); + await page.mouse.move(paneBox!.x + 150, paneBox!.y + 100); + await page.mouse.up(); + + const viewportTransformAfterPan = await viewport.evaluate((element) => { + return element.style.transform; + }); + + expect(viewportTransformBeforePan).toBe(viewportTransformAfterPan); + }); + }); +}); From 0b7613c64eb1bff80491f1db686f9a5c0fd0d80f Mon Sep 17 00:00:00 2001 From: Peter Date: Thu, 2 Nov 2023 16:29:22 +0100 Subject: [PATCH 011/608] Added tests for pane --- .../tests/pane/{ => default}/+page.svelte | 0 .../tests/pane/{ => default}/Flow.svelte | 2 +- .../tests/pane/{ => default}/nodesAndEdges.ts | 10 +- .../tests/pane/non-default/+page.svelte | 9 + .../routes/tests/pane/non-default/Flow.svelte | 19 ++ .../tests/pane/non-default/nodesAndEdges.ts | 33 ++++ tests/playwright/e2e/pane.spec.ts | 182 ++++++++++++++++-- 7 files changed, 233 insertions(+), 22 deletions(-) rename examples/svelte/src/routes/tests/pane/{ => default}/+page.svelte (100%) rename examples/svelte/src/routes/tests/pane/{ => default}/Flow.svelte (82%) rename examples/svelte/src/routes/tests/pane/{ => default}/nodesAndEdges.ts (75%) create mode 100644 examples/svelte/src/routes/tests/pane/non-default/+page.svelte create mode 100644 examples/svelte/src/routes/tests/pane/non-default/Flow.svelte create mode 100644 examples/svelte/src/routes/tests/pane/non-default/nodesAndEdges.ts diff --git a/examples/svelte/src/routes/tests/pane/+page.svelte b/examples/svelte/src/routes/tests/pane/default/+page.svelte similarity index 100% rename from examples/svelte/src/routes/tests/pane/+page.svelte rename to examples/svelte/src/routes/tests/pane/default/+page.svelte diff --git a/examples/svelte/src/routes/tests/pane/Flow.svelte b/examples/svelte/src/routes/tests/pane/default/Flow.svelte similarity index 82% rename from examples/svelte/src/routes/tests/pane/Flow.svelte rename to examples/svelte/src/routes/tests/pane/default/Flow.svelte index 6686c907..ae2093ed 100644 --- a/examples/svelte/src/routes/tests/pane/Flow.svelte +++ b/examples/svelte/src/routes/tests/pane/default/Flow.svelte @@ -9,4 +9,4 @@ const edges = writable(initialEdges); - + diff --git a/examples/svelte/src/routes/tests/pane/nodesAndEdges.ts b/examples/svelte/src/routes/tests/pane/default/nodesAndEdges.ts similarity index 75% rename from examples/svelte/src/routes/tests/pane/nodesAndEdges.ts rename to examples/svelte/src/routes/tests/pane/default/nodesAndEdges.ts index 81e88cc4..7d2e0522 100644 --- a/examples/svelte/src/routes/tests/pane/nodesAndEdges.ts +++ b/examples/svelte/src/routes/tests/pane/default/nodesAndEdges.ts @@ -21,15 +21,13 @@ export const initialNodes: Node[] = [ export const initialEdges: Edge[] = [ { - id: 'edge-with-class', + id: 'first-edge', source: '1', - target: '2', - class: 'edge-class-test' + target: '2' }, { - id: 'edge-with-style', + id: 'second-edge', source: '1', - target: '3', - style: 'stroke: red;' + target: '3' } ]; diff --git a/examples/svelte/src/routes/tests/pane/non-default/+page.svelte b/examples/svelte/src/routes/tests/pane/non-default/+page.svelte new file mode 100644 index 00000000..12dec33c --- /dev/null +++ b/examples/svelte/src/routes/tests/pane/non-default/+page.svelte @@ -0,0 +1,9 @@ + + + + + diff --git a/examples/svelte/src/routes/tests/pane/non-default/Flow.svelte b/examples/svelte/src/routes/tests/pane/non-default/Flow.svelte new file mode 100644 index 00000000..d06a8de3 --- /dev/null +++ b/examples/svelte/src/routes/tests/pane/non-default/Flow.svelte @@ -0,0 +1,19 @@ + + + diff --git a/examples/svelte/src/routes/tests/pane/non-default/nodesAndEdges.ts b/examples/svelte/src/routes/tests/pane/non-default/nodesAndEdges.ts new file mode 100644 index 00000000..7d2e0522 --- /dev/null +++ b/examples/svelte/src/routes/tests/pane/non-default/nodesAndEdges.ts @@ -0,0 +1,33 @@ +import type { Edge, Node } from '@xyflow/svelte'; + +export const initialNodes: Node[] = [ + { + id: '1', + data: { label: '1' }, + position: { x: 0, y: 0 }, + type: 'input' + }, + { + id: '2', + data: { label: '2' }, + position: { x: -100, y: 100 } + }, + { + id: '3', + data: { label: '3' }, + position: { x: 100, y: 100 } + } +]; + +export const initialEdges: Edge[] = [ + { + id: 'first-edge', + source: '1', + target: '2' + }, + { + id: 'second-edge', + source: '1', + target: '3' + } +]; diff --git a/tests/playwright/e2e/pane.spec.ts b/tests/playwright/e2e/pane.spec.ts index c3899f12..fab03bdb 100644 --- a/tests/playwright/e2e/pane.spec.ts +++ b/tests/playwright/e2e/pane.spec.ts @@ -1,15 +1,36 @@ import { test, expect } from '@playwright/test'; import { FRAMEWORK } from './constants'; +import { transform } from 'typescript'; -test.describe('PANE', () => { - test.beforeEach(async ({ page }) => { - // Go to the starting url before each test. - await page.goto('/tests/pane'); +const MATCH_ALL_NUMBERS = /[\d\.]+/g; + +// Type "Locator" not exported... +async function getTransform(element) { + const transformString = await element.evaluate((el) => { + return el.style.transform; }); - test.describe('pan', () => { - test('panning the pane', async ({ page }) => { + // Parses all numbers in f.ex "translate(590px, 324px) scale(2)"" + const transforms = transformString.match(MATCH_ALL_NUMBERS); + return { + translateX: parseFloat(transforms![0]), + translateY: parseFloat(transforms![1]), + scale: parseFloat(transforms![2]), + }; +} + +test.describe('PANE DEFAULT', () => { + test.beforeEach(async ({ page }) => { + // Go to the starting url before each test. + await page.goto('/tests/pane/default'); + + // Wait till the edges are rendered + await page.waitForSelector('#first-edge', { timeout: 5000 }); + }); + + test.describe('pan & zoom', () => { + test('panning the pane moves it', async ({ page }) => { const pane = page.locator(`.${FRAMEWORK}-flow__pane`); const viewport = page.locator(`.${FRAMEWORK}-flow__viewport`); @@ -17,20 +38,151 @@ test.describe('PANE', () => { const paneBox = await pane.boundingBox(); - const viewportTransformBeforePan = await viewport.evaluate((element) => { - return element.style.transform; - }); + const transformsBefore = await getTransform(viewport); await pane.hover(); await page.mouse.down(); - await page.mouse.move(paneBox!.x + 150, paneBox!.y + 100); - await page.mouse.up(); + // Move pane by 100, 100 + await page.mouse.move(paneBox!.x + paneBox!.width * 0.5 + 100, paneBox!.y + paneBox!.height * 0.5 + 100); - const viewportTransformAfterPan = await viewport.evaluate((element) => { - return element.style.transform; - }); + const transformsAfter = await getTransform(viewport); - expect(viewportTransformBeforePan).toBe(viewportTransformAfterPan); + expect(transformsAfter.translateX - transformsBefore.translateX).toBe(100); + expect(transformsAfter.translateY - transformsBefore.translateY).toBe(100); + }); + + test('scrolling the default pane zooms it', async ({ page }) => { + const pane = page.locator(`.${FRAMEWORK}-flow__pane`); + const viewport = page.locator(`.${FRAMEWORK}-flow__viewport`); + + await expect(pane).toBeAttached(); + + const transformsBefore = await getTransform(viewport); + + await pane.hover(); + await page.mouse.wheel(0, 100); + + const transformsAfter = await getTransform(viewport); + + expect(transformsAfter.scale).not.toBe(transformsBefore.scale); + }); + }); + + test.describe('minZoom & maxZoom', () => { + test('minZoom works as intended', async ({ page }) => { + const pane = page.locator(`.${FRAMEWORK}-flow__pane`); + const viewport = page.locator(`.${FRAMEWORK}-flow__viewport`); + + await expect(pane).toBeAttached(); + + await pane.hover(); + + // Zoom out + await page.mouse.wheel(5000, 5000); + + const transformsMinZoom = await getTransform(viewport); + expect(transformsMinZoom.scale).toBe(0.25); + }); + + test('maxZoom works as intended', async ({ page }) => { + const pane = page.locator(`.${FRAMEWORK}-flow__pane`); + const viewport = page.locator(`.${FRAMEWORK}-flow__viewport`); + + await expect(pane).toBeAttached(); + + await pane.hover(); + + // Zoom in + await page.mouse.wheel(-5000, -5000); + + const transformsMaxZoom = await getTransform(viewport); + expect(transformsMaxZoom.scale).toBe(4); + }); + }); + + test.describe('autoPan', () => { + test('autoPanOnNodeDrag works as intended', async ({ page }) => { + const viewport = page.locator(`.${FRAMEWORK}-flow__viewport`); + const node = page.locator('[data-id="1"]'); + + await expect(node).toBeAttached(); + + const transformBefore = await getTransform(viewport); + + await node.hover(); + await page.mouse.down(); + await page.mouse.move(0, 0); + await page.waitForTimeout(500); + await page.mouse.move(100, 100); + + const transformAfter = await getTransform(viewport); + + await expect(transformAfter.translateX).toBeGreaterThan(transformBefore.translateX); + await expect(transformAfter.translateY).toBeGreaterThan(transformBefore.translateY); + }); + + test('autoPanOnConnect works as intended', async ({ page }) => { + const viewport = page.locator(`.${FRAMEWORK}-flow__viewport`); + const handle = page.locator('[data-id="1"] .svelte-flow__handle'); + + await expect(handle).toBeAttached(); + + const transformBefore = await getTransform(viewport); + + await handle.hover(); + await page.mouse.down(); + await page.mouse.move(0, 0); + await page.waitForTimeout(500); + await page.mouse.move(100, 100); + + const transformAfter = await getTransform(viewport); + + await expect(transformAfter.translateX).toBeGreaterThan(transformBefore.translateX); + await expect(transformAfter.translateY).toBeGreaterThan(transformBefore.translateY); }); }); }); + +test.describe('PANE NON-DEFAULT', () => { + test.beforeEach(async ({ page }) => { + // Go to the starting url before each test. + await page.goto('/tests/pane/non-default'); + + // Wait till the edges are rendered + await page.waitForSelector('#first-edge', { timeout: 5000 }); + }); + + test.describe('pan & zoom', () => { + test('panOnScroll pans the pane on scrolling', async ({ page }) => { + const pane = page.locator(`.${FRAMEWORK}-flow__pane`); + const viewport = page.locator(`.${FRAMEWORK}-flow__viewport`); + + await expect(pane).toBeAttached(); + + const transformsBefore = await getTransform(viewport); + + await pane.hover(); + await page.mouse.wheel(100, 100); + + const transformsAfter = await getTransform(viewport); + + expect(transformsAfter.translateX).not.toBe(transformsBefore.translateX); + expect(transformsAfter.translateY).not.toBe(transformsBefore.translateY); + }); + + test('intialViewport', async ({ page }) => { + const pane = page.locator(`.${FRAMEWORK}-flow__pane`); + const viewport = page.locator(`.${FRAMEWORK}-flow__viewport`); + + await expect(pane).toBeAttached(); + + const viewportTransform = await getTransform(viewport); + + expect(viewportTransform.translateX).toBe(1.23); + expect(viewportTransform.translateY).toBe(9.87); + expect(viewportTransform.scale).toBe(1.234); + }); + }); +}); + +//TODO: Inverse: Not zooming/panning when disabled From bbd5973d669ae0c089244424573e4eff3685a54d Mon Sep 17 00:00:00 2001 From: spky <11074890+juspky@users.noreply.github.com> Date: Fri, 3 Nov 2023 00:48:46 +0100 Subject: [PATCH 012/608] feat(react): Support Mutiple useOnSelectionChange Hook subscribers --- .../examples/UseOnSelectionChange/index.tsx | 35 +- .../components/SelectionListener/index.tsx | 2 +- .../react/src/hooks/useOnSelectionChange.ts | 9 +- packages/react/src/store/initialState.ts | 1 + packages/react/src/types/store.ts | 4 +- pnpm-lock.yaml | 704 +----------------- 6 files changed, 69 insertions(+), 686 deletions(-) diff --git a/examples/react/src/examples/UseOnSelectionChange/index.tsx b/examples/react/src/examples/UseOnSelectionChange/index.tsx index a9f91adf..f1d8ffeb 100644 --- a/examples/react/src/examples/UseOnSelectionChange/index.tsx +++ b/examples/react/src/examples/UseOnSelectionChange/index.tsx @@ -1,5 +1,5 @@ -import { useCallback } from 'react'; -import { +import { useCallback, useState } from 'react'; +import { ReactFlow, addEdge, ReactFlowProvider, @@ -35,9 +35,9 @@ const initialEdges: Edge[] = [ }, ]; -const SelectionLogger = () => { +const SelectionLogger = ({ id }: { id: string }) => { const onChange = useCallback(({ nodes, edges }: OnSelectionChangeParams) => { - console.log(nodes, edges); + console.log(id, nodes, edges); }, []); useOnSelectionChange({ @@ -63,14 +63,23 @@ const Flow = () => { ); }; -const WrappedFlow = () => ( - - - -
- -
-
-); +const WrappedFlow = () => { + const [secondLoggerActive, setSecondLoggerActive] = useState(false); + + const toggleSecondLogger = () => { + setSecondLoggerActive(!secondLoggerActive); + }; + + return ( + + + + {secondLoggerActive && } +
+ +
+
+ ); +}; export default WrappedFlow; diff --git a/packages/react/src/components/SelectionListener/index.tsx b/packages/react/src/components/SelectionListener/index.tsx index 92644f85..c26888b8 100644 --- a/packages/react/src/components/SelectionListener/index.tsx +++ b/packages/react/src/components/SelectionListener/index.tsx @@ -33,7 +33,7 @@ const SelectionListener = memo(({ onSelectionChange }: SelectionListenerProps) = useEffect(() => { const params = { nodes: selectedNodes, edges: selectedEdges }; onSelectionChange?.(params); - store.getState().onSelectionChange?.(params); + store.getState().onSelectionChange.forEach((fn) => fn(params)); }, [selectedNodes, selectedEdges, onSelectionChange]); return null; diff --git a/packages/react/src/hooks/useOnSelectionChange.ts b/packages/react/src/hooks/useOnSelectionChange.ts index 323f23a8..8ac71464 100644 --- a/packages/react/src/hooks/useOnSelectionChange.ts +++ b/packages/react/src/hooks/useOnSelectionChange.ts @@ -4,14 +4,19 @@ import { useStoreApi } from './useStore'; import type { OnSelectionChangeFunc } from '../types'; export type UseOnSelectionChangeOptions = { - onChange?: OnSelectionChangeFunc; + onChange: OnSelectionChangeFunc; }; function useOnSelectionChange({ onChange }: UseOnSelectionChangeOptions) { const store = useStoreApi(); useEffect(() => { - store.setState({ onSelectionChange: onChange }); + const addedOnSelectionChange = [...store.getState().onSelectionChange, onChange]; + store.setState({ onSelectionChange: addedOnSelectionChange }); + return () => { + const removedOnSelectionChange = store.getState().onSelectionChange.filter((fn) => fn !== onChange); + store.setState({ onSelectionChange: removedOnSelectionChange }); + }; }, [onChange]); } diff --git a/packages/react/src/store/initialState.ts b/packages/react/src/store/initialState.ts index b87310f9..3bbd8053 100644 --- a/packages/react/src/store/initialState.ts +++ b/packages/react/src/store/initialState.ts @@ -92,6 +92,7 @@ const getInitialState = ({ connectionRadius: 20, onError: () => null, isValidConnection: undefined, + onSelectionChange: [], lib: 'react', }; diff --git a/packages/react/src/types/store.ts b/packages/react/src/types/store.ts index f79cb874..47ffd28b 100644 --- a/packages/react/src/types/store.ts +++ b/packages/react/src/types/store.ts @@ -123,8 +123,8 @@ export type ReactFlowStore = { onViewportChangeStart?: OnViewportChange; onViewportChange?: OnViewportChange; onViewportChangeEnd?: OnViewportChange; - - onSelectionChange?: OnSelectionChangeFunc; + + onSelectionChange: OnSelectionChangeFunc[]; ariaLiveMessage: string; autoPanOnConnect: boolean; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 981e66bf..bc38c212 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -90,40 +90,6 @@ importers: specifier: ^4.2.1 version: registry.npmjs.org/svelte@4.2.1 - examples/next-xyflow: - dependencies: - '@xyflow/react': - specifier: workspace:^ - version: link:../../packages/react - next: - specifier: 13.5.4 - version: registry.npmjs.org/next@13.5.4(react-dom@18.2.0)(react@18.2.0) - react: - specifier: ^18 - version: registry.npmjs.org/react@18.2.0 - react-dom: - specifier: ^18 - version: registry.npmjs.org/react-dom@18.2.0(react@18.2.0) - devDependencies: - '@types/node': - specifier: ^20 - version: registry.npmjs.org/@types/node@20.0.0 - '@types/react': - specifier: ^18 - version: registry.npmjs.org/@types/react@18.2.24 - '@types/react-dom': - specifier: ^18 - version: registry.npmjs.org/@types/react-dom@18.2.8 - eslint: - specifier: ^8 - version: registry.npmjs.org/eslint@8.43.0 - eslint-config-next: - specifier: 13.5.4 - version: registry.npmjs.org/eslint-config-next@13.5.4(eslint@8.43.0)(typescript@5.1.3) - typescript: - specifier: ^5 - version: registry.npmjs.org/typescript@5.1.3 - examples/react: dependencies: '@xyflow/react': @@ -1853,119 +1819,6 @@ packages: read-yaml-file: registry.npmjs.org/read-yaml-file@1.1.0 dev: true - registry.npmjs.org/@next/env@13.5.4: - resolution: {integrity: sha512-LGegJkMvRNw90WWphGJ3RMHMVplYcOfRWf2Be3td3sUa+1AaxmsYyANsA+znrGCBjXJNi4XAQlSoEfUxs/4kIQ==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@next/env/-/env-13.5.4.tgz} - name: '@next/env' - version: 13.5.4 - dev: false - - registry.npmjs.org/@next/eslint-plugin-next@13.5.4: - resolution: {integrity: sha512-vI94U+D7RNgX6XypSyjeFrOzxGlZyxOplU0dVE5norIfZGn/LDjJYPHdvdsR5vN1eRtl6PDAsOHmycFEOljK5A==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-13.5.4.tgz} - name: '@next/eslint-plugin-next' - version: 13.5.4 - dependencies: - glob: registry.npmjs.org/glob@7.1.7 - dev: true - - registry.npmjs.org/@next/swc-darwin-arm64@13.5.4: - resolution: {integrity: sha512-Df8SHuXgF1p+aonBMcDPEsaahNo2TCwuie7VXED4FVyECvdXfRT9unapm54NssV9tF3OQFKBFOdlje4T43VO0w==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-13.5.4.tgz} - name: '@next/swc-darwin-arm64' - version: 13.5.4 - engines: {node: '>= 10'} - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: false - optional: true - - registry.npmjs.org/@next/swc-darwin-x64@13.5.4: - resolution: {integrity: sha512-siPuUwO45PnNRMeZnSa8n/Lye5ZX93IJom9wQRB5DEOdFrw0JjOMu1GINB8jAEdwa7Vdyn1oJ2xGNaQpdQQ9Pw==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-13.5.4.tgz} - name: '@next/swc-darwin-x64' - version: 13.5.4 - engines: {node: '>= 10'} - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: false - optional: true - - registry.npmjs.org/@next/swc-linux-arm64-gnu@13.5.4: - resolution: {integrity: sha512-l/k/fvRP/zmB2jkFMfefmFkyZbDkYW0mRM/LB+tH5u9pB98WsHXC0WvDHlGCYp3CH/jlkJPL7gN8nkTQVrQ/2w==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-13.5.4.tgz} - name: '@next/swc-linux-arm64-gnu' - version: 13.5.4 - engines: {node: '>= 10'} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: false - optional: true - - registry.npmjs.org/@next/swc-linux-arm64-musl@13.5.4: - resolution: {integrity: sha512-YYGb7SlLkI+XqfQa8VPErljb7k9nUnhhRrVaOdfJNCaQnHBcvbT7cx/UjDQLdleJcfyg1Hkn5YSSIeVfjgmkTg==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-13.5.4.tgz} - name: '@next/swc-linux-arm64-musl' - version: 13.5.4 - engines: {node: '>= 10'} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: false - optional: true - - registry.npmjs.org/@next/swc-linux-x64-gnu@13.5.4: - resolution: {integrity: sha512-uE61vyUSClnCH18YHjA8tE1prr/PBFlBFhxBZis4XBRJoR+txAky5d7gGNUIbQ8sZZ7LVkSVgm/5Fc7mwXmRAg==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-13.5.4.tgz} - name: '@next/swc-linux-x64-gnu' - version: 13.5.4 - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: false - optional: true - - registry.npmjs.org/@next/swc-linux-x64-musl@13.5.4: - resolution: {integrity: sha512-qVEKFYML/GvJSy9CfYqAdUexA6M5AklYcQCW+8JECmkQHGoPxCf04iMh7CPR7wkHyWWK+XLt4Ja7hhsPJtSnhg==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-13.5.4.tgz} - name: '@next/swc-linux-x64-musl' - version: 13.5.4 - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: false - optional: true - - registry.npmjs.org/@next/swc-win32-arm64-msvc@13.5.4: - resolution: {integrity: sha512-mDSQfqxAlfpeZOLPxLymZkX0hYF3juN57W6vFHTvwKlnHfmh12Pt7hPIRLYIShk8uYRsKPtMTth/EzpwRI+u8w==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-13.5.4.tgz} - name: '@next/swc-win32-arm64-msvc' - version: 13.5.4 - engines: {node: '>= 10'} - cpu: [arm64] - os: [win32] - requiresBuild: true - dev: false - optional: true - - registry.npmjs.org/@next/swc-win32-ia32-msvc@13.5.4: - resolution: {integrity: sha512-aoqAT2XIekIWoriwzOmGFAvTtVY5O7JjV21giozBTP5c6uZhpvTWRbmHXbmsjZqY4HnEZQRXWkSAppsIBweKqw==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-13.5.4.tgz} - name: '@next/swc-win32-ia32-msvc' - version: 13.5.4 - engines: {node: '>= 10'} - cpu: [ia32] - os: [win32] - requiresBuild: true - dev: false - optional: true - - registry.npmjs.org/@next/swc-win32-x64-msvc@13.5.4: - resolution: {integrity: sha512-cyRvlAxwlddlqeB9xtPSfNSCRy8BOa4wtMo0IuI9P7Y0XT2qpDrpFKRyZ7kUngZis59mPVla5k8X1oOJ8RxDYg==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-13.5.4.tgz} - name: '@next/swc-win32-x64-msvc' - version: 13.5.4 - engines: {node: '>= 10'} - cpu: [x64] - os: [win32] - requiresBuild: true - dev: false - optional: true - registry.npmjs.org/@nodelib/fs.scandir@2.1.5: resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz} name: '@nodelib/fs.scandir' @@ -2113,12 +1966,6 @@ packages: rollup: registry.npmjs.org/rollup@3.23.0 dev: true - registry.npmjs.org/@rushstack/eslint-patch@1.5.1: - resolution: {integrity: sha512-6i/8UoL0P5y4leBIGzvkZdS85RDMG9y1ihZzmTZQ5LdHUYmZ7pKFoj8X0236s3lusPs1Fa5HTQUpwI+UfTcmeA==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.5.1.tgz} - name: '@rushstack/eslint-patch' - version: 1.5.1 - dev: true - registry.npmjs.org/@sideway/address@4.1.4: resolution: {integrity: sha512-7vwq+rOHVWjyXxVlR76Agnvhy8I9rpzjosTESvmhNeXOXdZZB15Fl+TI9x1SiHZH5Jv2wTGduSxFDIaq0m3DUw==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@sideway/address/-/address-4.1.4.tgz} name: '@sideway/address' @@ -2390,14 +2237,6 @@ packages: version: 0.1.2 dev: true - registry.npmjs.org/@swc/helpers@0.5.2: - resolution: {integrity: sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.2.tgz} - name: '@swc/helpers' - version: 0.5.2 - dependencies: - tslib: registry.npmjs.org/tslib@2.6.2 - dev: false - registry.npmjs.org/@swc/types@0.1.5: resolution: {integrity: sha512-myfUej5naTBWnqOCc/MdVOLVjXUXtIA+NpDrDBKJtLLg2shUjBu3cZmB/85RyitKc55+lUUyl7oRfLOvkr2hsw==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@swc/types/-/types-0.1.5.tgz} name: '@swc/types' @@ -2742,12 +2581,6 @@ packages: version: 7.0.14 dev: true - registry.npmjs.org/@types/json5@0.0.29: - resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz} - name: '@types/json5' - version: 0.0.29 - dev: true - registry.npmjs.org/@types/json5@0.0.30: resolution: {integrity: sha512-sqm9g7mHlPY/43fcSNrCYfOeX9zkTTK+euO5E6+CVijSMm5tTjkVdwdqRkY3ljjIAf8679vps5jKUoJBCLsMDA==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@types/json5/-/json5-0.0.30.tgz} name: '@types/json5' @@ -2808,16 +2641,11 @@ packages: version: 18.7.16 dev: true - registry.npmjs.org/@types/node@20.0.0: - resolution: {integrity: sha512-cD2uPTDnQQCVpmRefonO98/PPijuOnnEy5oytWJFPY1N9aJCz2wJ5kSGWO+zJoed2cY2JxQh6yBuUq4vIn61hw==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@types/node/-/node-20.0.0.tgz} - name: '@types/node' - version: 20.0.0 - dev: true - registry.npmjs.org/@types/node@20.8.7: resolution: {integrity: sha512-21TKHHh3eUHIi2MloeptJWALuCu5H7HQTdTrWIFReA8ad+aggoX+lRes3ex7/FtpC+sVUpFMQ+QTfYr74mruiQ==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@types/node/-/node-20.8.7.tgz} name: '@types/node' version: 20.8.7 + requiresBuild: true dependencies: undici-types: registry.npmjs.org/undici-types@5.25.3 dev: true @@ -3011,29 +2839,6 @@ packages: - supports-color dev: true - registry.npmjs.org/@typescript-eslint/parser@5.62.0(eslint@8.43.0)(typescript@5.1.3): - resolution: {integrity: sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.62.0.tgz} - id: registry.npmjs.org/@typescript-eslint/parser/5.62.0 - name: '@typescript-eslint/parser' - version: 5.62.0 - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@typescript-eslint/scope-manager': registry.npmjs.org/@typescript-eslint/scope-manager@5.62.0 - '@typescript-eslint/types': registry.npmjs.org/@typescript-eslint/types@5.62.0 - '@typescript-eslint/typescript-estree': registry.npmjs.org/@typescript-eslint/typescript-estree@5.62.0(typescript@5.1.3) - debug: registry.npmjs.org/debug@4.3.4(supports-color@8.1.1) - eslint: registry.npmjs.org/eslint@8.43.0 - typescript: registry.npmjs.org/typescript@5.1.3 - transitivePeerDependencies: - - supports-color - dev: true - registry.npmjs.org/@typescript-eslint/parser@6.8.0(eslint@8.43.0)(typescript@5.1.3): resolution: {integrity: sha512-5tNs6Bw0j6BdWuP8Fx+VH4G9fEPDxnVI7yH1IAPkQH5RUtvKwRoqdecAPdQXv4rSOADAaz1LFBZvZG7VbXivSg==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.8.0.tgz} id: registry.npmjs.org/@typescript-eslint/parser/6.8.0 @@ -3068,16 +2873,6 @@ packages: '@typescript-eslint/visitor-keys': registry.npmjs.org/@typescript-eslint/visitor-keys@5.60.0 dev: true - registry.npmjs.org/@typescript-eslint/scope-manager@5.62.0: - resolution: {integrity: sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz} - name: '@typescript-eslint/scope-manager' - version: 5.62.0 - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dependencies: - '@typescript-eslint/types': registry.npmjs.org/@typescript-eslint/types@5.62.0 - '@typescript-eslint/visitor-keys': registry.npmjs.org/@typescript-eslint/visitor-keys@5.62.0 - dev: true - registry.npmjs.org/@typescript-eslint/scope-manager@6.8.0: resolution: {integrity: sha512-xe0HNBVwCph7rak+ZHcFD6A+q50SMsFwcmfdjs9Kz4qDh5hWhaPhFjRs/SODEhroBI5Ruyvyz9LfwUJ624O40g==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.8.0.tgz} name: '@typescript-eslint/scope-manager' @@ -3141,13 +2936,6 @@ packages: engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true - registry.npmjs.org/@typescript-eslint/types@5.62.0: - resolution: {integrity: sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz} - name: '@typescript-eslint/types' - version: 5.62.0 - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dev: true - registry.npmjs.org/@typescript-eslint/types@6.8.0: resolution: {integrity: sha512-p5qOxSum7W3k+llc7owEStXlGmSl8FcGvhYt8Vjy7FqEnmkCVlM3P57XQEGj58oqaBWDQXbJDZxwUWMS/EAPNQ==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@typescript-eslint/types/-/types-6.8.0.tgz} name: '@typescript-eslint/types' @@ -3179,30 +2967,6 @@ packages: - supports-color dev: true - registry.npmjs.org/@typescript-eslint/typescript-estree@5.62.0(typescript@5.1.3): - resolution: {integrity: sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz} - id: registry.npmjs.org/@typescript-eslint/typescript-estree/5.62.0 - name: '@typescript-eslint/typescript-estree' - version: 5.62.0 - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@typescript-eslint/types': registry.npmjs.org/@typescript-eslint/types@5.62.0 - '@typescript-eslint/visitor-keys': registry.npmjs.org/@typescript-eslint/visitor-keys@5.62.0 - debug: registry.npmjs.org/debug@4.3.4(supports-color@8.1.1) - globby: registry.npmjs.org/globby@11.1.0 - is-glob: registry.npmjs.org/is-glob@4.0.3 - semver: registry.npmjs.org/semver@7.5.4 - tsutils: registry.npmjs.org/tsutils@3.21.0(typescript@5.1.3) - typescript: registry.npmjs.org/typescript@5.1.3 - transitivePeerDependencies: - - supports-color - dev: true - registry.npmjs.org/@typescript-eslint/typescript-estree@6.8.0(typescript@5.1.3): resolution: {integrity: sha512-ISgV0lQ8XgW+mvv5My/+iTUdRmGspducmQcDw5JxznasXNnZn3SKNrTRuMsEXv+V/O+Lw9AGcQCfVaOPCAk/Zg==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.8.0.tgz} id: registry.npmjs.org/@typescript-eslint/typescript-estree/6.8.0 @@ -3282,16 +3046,6 @@ packages: eslint-visitor-keys: registry.npmjs.org/eslint-visitor-keys@3.4.3 dev: true - registry.npmjs.org/@typescript-eslint/visitor-keys@5.62.0: - resolution: {integrity: sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz} - name: '@typescript-eslint/visitor-keys' - version: 5.62.0 - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dependencies: - '@typescript-eslint/types': registry.npmjs.org/@typescript-eslint/types@5.62.0 - eslint-visitor-keys: registry.npmjs.org/eslint-visitor-keys@3.4.3 - dev: true - registry.npmjs.org/@typescript-eslint/visitor-keys@6.8.0: resolution: {integrity: sha512-oqAnbA7c+pgOhW2OhGvxm0t1BULX5peQI/rLsNDpGM78EebV3C9IGbX5HNZabuZ6UQrYveCLjKo8Iy/lLlBkkg==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.8.0.tgz} name: '@typescript-eslint/visitor-keys' @@ -3508,19 +3262,6 @@ packages: engines: {node: '>=8'} dev: true - registry.npmjs.org/array.prototype.findlastindex@1.2.3: - resolution: {integrity: sha512-LzLoiOMAxvy+Gd3BAq3B7VeIgPdo+Q8hthvKtXybMvRV0jrXfJM/t8mw7nNlpEcVlVUnCnM2KSX4XU5HmpodOA==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.3.tgz} - name: array.prototype.findlastindex - version: 1.2.3 - engines: {node: '>= 0.4'} - dependencies: - call-bind: registry.npmjs.org/call-bind@1.0.5 - define-properties: registry.npmjs.org/define-properties@1.2.1 - es-abstract: registry.npmjs.org/es-abstract@1.22.3 - es-shim-unscopables: registry.npmjs.org/es-shim-unscopables@1.0.2 - get-intrinsic: registry.npmjs.org/get-intrinsic@1.2.2 - dev: true - registry.npmjs.org/array.prototype.flat@1.3.2: resolution: {integrity: sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz} name: array.prototype.flat @@ -3594,12 +3335,6 @@ packages: engines: {node: '>=0.8'} dev: true - registry.npmjs.org/ast-types-flow@0.0.7: - resolution: {integrity: sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz} - name: ast-types-flow - version: 0.0.7 - dev: true - registry.npmjs.org/astral-regex@2.0.0: resolution: {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz} name: astral-regex @@ -3748,13 +3483,6 @@ packages: version: 1.12.0 dev: true - registry.npmjs.org/axe-core@4.8.2: - resolution: {integrity: sha512-/dlp0fxyM3R8YW7MFzaHWXrf4zzbr0vaYb23VBFCl83R7nWNPg/yaQw2Dc8jzCMmDVLhSdzH8MjrsuIUuvX+6g==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/axe-core/-/axe-core-4.8.2.tgz} - name: axe-core - version: 4.8.2 - engines: {node: '>=4'} - dev: true - registry.npmjs.org/axios@0.21.4(debug@4.3.2): resolution: {integrity: sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/axios/-/axios-0.21.4.tgz} id: registry.npmjs.org/axios/0.21.4 @@ -3777,6 +3505,7 @@ packages: resolution: {integrity: sha512-fpWrvyVHEKyeEvbKZTVOeZF3VSKKWtJxFIxX/jaVPf+cLbGUSitjb49pHLqPV2BUNNZ0LcoeEGfE/YCpyDYHIw==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/b4a/-/b4a-1.6.4.tgz} name: b4a version: 1.6.4 + requiresBuild: true dev: false optional: true @@ -3824,6 +3553,7 @@ packages: resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/bl/-/bl-4.1.0.tgz} name: bl version: 4.1.0 + requiresBuild: true dependencies: buffer: registry.npmjs.org/buffer@5.7.1 inherits: registry.npmjs.org/inherits@2.0.4 @@ -3963,6 +3693,7 @@ packages: engines: {node: '>=10.16.0'} dependencies: streamsearch: registry.npmjs.org/streamsearch@1.1.0 + dev: true registry.npmjs.org/cachedir@2.4.0: resolution: {integrity: sha512-9EtFOZR8g22CL7BWjJ9BUx1+A/djkofnyW3aOXZORNW2kxoUpx2h+uN2cOqwPmFhnpVmxg+KW2OjOSgChTEvsQ==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/cachedir/-/cachedir-2.4.0.tgz} @@ -4119,6 +3850,7 @@ packages: resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz} name: chownr version: 1.1.4 + requiresBuild: true dev: false optional: true @@ -4194,12 +3926,6 @@ packages: string-width: registry.npmjs.org/string-width@4.2.3 dev: true - registry.npmjs.org/client-only@0.0.1: - resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz} - name: client-only - version: 0.0.1 - dev: false - registry.npmjs.org/cliui@6.0.0: resolution: {integrity: sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz} name: cliui @@ -4275,6 +4001,7 @@ packages: resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz} name: color-string version: 1.9.1 + requiresBuild: true dependencies: color-name: registry.npmjs.org/color-name@1.1.4 simple-swizzle: registry.npmjs.org/simple-swizzle@0.2.2 @@ -4286,6 +4013,7 @@ packages: name: color version: 4.2.3 engines: {node: '>=12.5.0'} + requiresBuild: true dependencies: color-convert: registry.npmjs.org/color-convert@2.0.1 color-string: registry.npmjs.org/color-string@1.9.1 @@ -4745,12 +4473,6 @@ packages: lodash: registry.npmjs.org/lodash@4.17.21 dev: false - registry.npmjs.org/damerau-levenshtein@1.0.8: - resolution: {integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz} - name: damerau-levenshtein - version: 1.0.8 - dev: true - registry.npmjs.org/dashdash@1.14.1: resolution: {integrity: sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz} name: dashdash @@ -4867,6 +4589,7 @@ packages: name: decompress-response version: 6.0.0 engines: {node: '>=10'} + requiresBuild: true dependencies: mimic-response: registry.npmjs.org/mimic-response@3.1.0 dev: false @@ -4882,6 +4605,7 @@ packages: name: deep-extend version: 0.6.0 engines: {node: '>=4.0.0'} + requiresBuild: true dev: false optional: true @@ -4959,6 +4683,7 @@ packages: name: detect-libc version: 2.0.2 engines: {node: '>=8'} + requiresBuild: true dev: false optional: true @@ -5111,6 +4836,7 @@ packages: resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz} name: emoji-regex version: 9.2.2 + dev: false registry.npmjs.org/end-of-stream@1.4.4: resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz} @@ -5119,16 +4845,6 @@ packages: dependencies: once: registry.npmjs.org/once@1.4.0 - registry.npmjs.org/enhanced-resolve@5.15.0: - resolution: {integrity: sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz} - name: enhanced-resolve - version: 5.15.0 - engines: {node: '>=10.13.0'} - dependencies: - graceful-fs: registry.npmjs.org/graceful-fs@4.2.11 - tapable: registry.npmjs.org/tapable@2.2.1 - dev: true - registry.npmjs.org/enquirer@2.4.1: resolution: {integrity: sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/enquirer/-/enquirer-2.4.1.tgz} name: enquirer @@ -5353,34 +5069,6 @@ packages: engines: {node: '>=12'} dev: false - registry.npmjs.org/eslint-config-next@13.5.4(eslint@8.43.0)(typescript@5.1.3): - resolution: {integrity: sha512-FzQGIj4UEszRX7fcRSJK6L1LrDiVZvDFW320VVntVKh3BSU8Fb9kpaoxQx0cdFgf3MQXdeSbrCXJ/5Z/NndDkQ==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-13.5.4.tgz} - id: registry.npmjs.org/eslint-config-next/13.5.4 - name: eslint-config-next - version: 13.5.4 - peerDependencies: - eslint: ^7.23.0 || ^8.0.0 - typescript: '>=3.3.1' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@next/eslint-plugin-next': registry.npmjs.org/@next/eslint-plugin-next@13.5.4 - '@rushstack/eslint-patch': registry.npmjs.org/@rushstack/eslint-patch@1.5.1 - '@typescript-eslint/parser': registry.npmjs.org/@typescript-eslint/parser@5.62.0(eslint@8.43.0)(typescript@5.1.3) - eslint: registry.npmjs.org/eslint@8.43.0 - eslint-import-resolver-node: registry.npmjs.org/eslint-import-resolver-node@0.3.9 - eslint-import-resolver-typescript: registry.npmjs.org/eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.0)(eslint@8.43.0) - eslint-plugin-import: registry.npmjs.org/eslint-plugin-import@2.29.0(@typescript-eslint/parser@6.8.0)(eslint@8.43.0) - eslint-plugin-jsx-a11y: registry.npmjs.org/eslint-plugin-jsx-a11y@6.7.1(eslint@8.43.0) - eslint-plugin-react: registry.npmjs.org/eslint-plugin-react@7.33.2(eslint@8.43.0) - eslint-plugin-react-hooks: registry.npmjs.org/eslint-plugin-react-hooks@4.6.0(eslint@8.43.0) - typescript: registry.npmjs.org/typescript@5.1.3 - transitivePeerDependencies: - - eslint-import-resolver-webpack - - supports-color - dev: true - registry.npmjs.org/eslint-config-prettier@8.8.0(eslint@8.43.0): resolution: {integrity: sha512-wLbQiFre3tdGgpDv67NQKnJuTlcUVYHas3k+DZCc2U2BadthoEY4B7hLPvAxaqdyOGCzuLfii2fqGph10va7oA==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.8.0.tgz} id: registry.npmjs.org/eslint-config-prettier/8.8.0 @@ -5405,175 +5093,6 @@ packages: eslint-plugin-turbo: registry.npmjs.org/eslint-plugin-turbo@1.10.15(eslint@8.43.0) dev: true - registry.npmjs.org/eslint-import-resolver-node@0.3.9: - resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz} - name: eslint-import-resolver-node - version: 0.3.9 - dependencies: - debug: registry.npmjs.org/debug@3.2.7(supports-color@8.1.1) - is-core-module: registry.npmjs.org/is-core-module@2.13.1 - resolve: registry.npmjs.org/resolve@1.22.8 - transitivePeerDependencies: - - supports-color - dev: true - - registry.npmjs.org/eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.0)(eslint@8.43.0): - resolution: {integrity: sha512-xgdptdoi5W3niYeuQxKmzVDTATvLYqhpwmykwsh7f6HIOStGWEIL9iqZgQDF9u9OEzrRwR8no5q2VT+bjAujTg==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.6.1.tgz} - id: registry.npmjs.org/eslint-import-resolver-typescript/3.6.1 - name: eslint-import-resolver-typescript - version: 3.6.1 - engines: {node: ^14.18.0 || >=16.0.0} - peerDependencies: - eslint: '*' - eslint-plugin-import: '*' - dependencies: - debug: registry.npmjs.org/debug@4.3.4(supports-color@8.1.1) - enhanced-resolve: registry.npmjs.org/enhanced-resolve@5.15.0 - eslint: registry.npmjs.org/eslint@8.43.0 - eslint-module-utils: registry.npmjs.org/eslint-module-utils@2.8.0(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.43.0) - eslint-plugin-import: registry.npmjs.org/eslint-plugin-import@2.29.0(@typescript-eslint/parser@6.8.0)(eslint@8.43.0) - fast-glob: registry.npmjs.org/fast-glob@3.3.1 - get-tsconfig: registry.npmjs.org/get-tsconfig@4.7.2 - is-core-module: registry.npmjs.org/is-core-module@2.13.1 - is-glob: registry.npmjs.org/is-glob@4.0.3 - transitivePeerDependencies: - - '@typescript-eslint/parser' - - eslint-import-resolver-node - - eslint-import-resolver-webpack - - supports-color - dev: true - - registry.npmjs.org/eslint-module-utils@2.8.0(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.43.0): - resolution: {integrity: sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz} - id: registry.npmjs.org/eslint-module-utils/2.8.0 - name: eslint-module-utils - version: 2.8.0 - engines: {node: '>=4'} - peerDependencies: - '@typescript-eslint/parser': '*' - eslint: '*' - eslint-import-resolver-node: '*' - eslint-import-resolver-typescript: '*' - eslint-import-resolver-webpack: '*' - peerDependenciesMeta: - '@typescript-eslint/parser': - optional: true - eslint: - optional: true - eslint-import-resolver-node: - optional: true - eslint-import-resolver-typescript: - optional: true - eslint-import-resolver-webpack: - optional: true - dependencies: - '@typescript-eslint/parser': registry.npmjs.org/@typescript-eslint/parser@5.62.0(eslint@8.43.0)(typescript@5.1.3) - debug: registry.npmjs.org/debug@3.2.7(supports-color@8.1.1) - eslint: registry.npmjs.org/eslint@8.43.0 - eslint-import-resolver-node: registry.npmjs.org/eslint-import-resolver-node@0.3.9 - eslint-import-resolver-typescript: registry.npmjs.org/eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.0)(eslint@8.43.0) - transitivePeerDependencies: - - supports-color - dev: true - - registry.npmjs.org/eslint-module-utils@2.8.0(@typescript-eslint/parser@6.8.0)(eslint-import-resolver-node@0.3.9)(eslint@8.43.0): - resolution: {integrity: sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz} - id: registry.npmjs.org/eslint-module-utils/2.8.0 - name: eslint-module-utils - version: 2.8.0 - engines: {node: '>=4'} - peerDependencies: - '@typescript-eslint/parser': '*' - eslint: '*' - eslint-import-resolver-node: '*' - eslint-import-resolver-typescript: '*' - eslint-import-resolver-webpack: '*' - peerDependenciesMeta: - '@typescript-eslint/parser': - optional: true - eslint: - optional: true - eslint-import-resolver-node: - optional: true - eslint-import-resolver-typescript: - optional: true - eslint-import-resolver-webpack: - optional: true - dependencies: - '@typescript-eslint/parser': registry.npmjs.org/@typescript-eslint/parser@6.8.0(eslint@8.43.0)(typescript@5.1.3) - debug: registry.npmjs.org/debug@3.2.7(supports-color@8.1.1) - eslint: registry.npmjs.org/eslint@8.43.0 - eslint-import-resolver-node: registry.npmjs.org/eslint-import-resolver-node@0.3.9 - transitivePeerDependencies: - - supports-color - dev: true - - registry.npmjs.org/eslint-plugin-import@2.29.0(@typescript-eslint/parser@6.8.0)(eslint@8.43.0): - resolution: {integrity: sha512-QPOO5NO6Odv5lpoTkddtutccQjysJuFxoPS7fAHO+9m9udNHvTCPSAMW9zGAYj8lAIdr40I8yPCdUYrncXtrwg==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.29.0.tgz} - id: registry.npmjs.org/eslint-plugin-import/2.29.0 - name: eslint-plugin-import - version: 2.29.0 - engines: {node: '>=4'} - peerDependencies: - '@typescript-eslint/parser': '*' - eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 - peerDependenciesMeta: - '@typescript-eslint/parser': - optional: true - dependencies: - '@typescript-eslint/parser': registry.npmjs.org/@typescript-eslint/parser@6.8.0(eslint@8.43.0)(typescript@5.1.3) - array-includes: registry.npmjs.org/array-includes@3.1.7 - array.prototype.findlastindex: registry.npmjs.org/array.prototype.findlastindex@1.2.3 - array.prototype.flat: registry.npmjs.org/array.prototype.flat@1.3.2 - array.prototype.flatmap: registry.npmjs.org/array.prototype.flatmap@1.3.2 - debug: registry.npmjs.org/debug@3.2.7(supports-color@8.1.1) - doctrine: registry.npmjs.org/doctrine@2.1.0 - eslint: registry.npmjs.org/eslint@8.43.0 - eslint-import-resolver-node: registry.npmjs.org/eslint-import-resolver-node@0.3.9 - eslint-module-utils: registry.npmjs.org/eslint-module-utils@2.8.0(@typescript-eslint/parser@6.8.0)(eslint-import-resolver-node@0.3.9)(eslint@8.43.0) - hasown: registry.npmjs.org/hasown@2.0.0 - is-core-module: registry.npmjs.org/is-core-module@2.13.1 - is-glob: registry.npmjs.org/is-glob@4.0.3 - minimatch: registry.npmjs.org/minimatch@3.1.2 - object.fromentries: registry.npmjs.org/object.fromentries@2.0.7 - object.groupby: registry.npmjs.org/object.groupby@1.0.1 - object.values: registry.npmjs.org/object.values@1.1.7 - semver: registry.npmjs.org/semver@6.3.1 - tsconfig-paths: registry.npmjs.org/tsconfig-paths@3.14.2 - transitivePeerDependencies: - - eslint-import-resolver-typescript - - eslint-import-resolver-webpack - - supports-color - dev: true - - registry.npmjs.org/eslint-plugin-jsx-a11y@6.7.1(eslint@8.43.0): - resolution: {integrity: sha512-63Bog4iIethyo8smBklORknVjB0T2dwB8Mr/hIC+fBS0uyHdYYpzM/Ed+YC8VxTjlXHEWFOdmgwcDn1U2L9VCA==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.7.1.tgz} - id: registry.npmjs.org/eslint-plugin-jsx-a11y/6.7.1 - name: eslint-plugin-jsx-a11y - version: 6.7.1 - engines: {node: '>=4.0'} - peerDependencies: - eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 - dependencies: - '@babel/runtime': registry.npmjs.org/@babel/runtime@7.23.2 - aria-query: registry.npmjs.org/aria-query@5.3.0 - array-includes: registry.npmjs.org/array-includes@3.1.7 - array.prototype.flatmap: registry.npmjs.org/array.prototype.flatmap@1.3.2 - ast-types-flow: registry.npmjs.org/ast-types-flow@0.0.7 - axe-core: registry.npmjs.org/axe-core@4.8.2 - axobject-query: registry.npmjs.org/axobject-query@3.2.1 - damerau-levenshtein: registry.npmjs.org/damerau-levenshtein@1.0.8 - emoji-regex: registry.npmjs.org/emoji-regex@9.2.2 - eslint: registry.npmjs.org/eslint@8.43.0 - has: registry.npmjs.org/has@1.0.4 - jsx-ast-utils: registry.npmjs.org/jsx-ast-utils@3.3.5 - language-tags: registry.npmjs.org/language-tags@1.0.5 - minimatch: registry.npmjs.org/minimatch@3.1.2 - object.entries: registry.npmjs.org/object.entries@1.1.7 - object.fromentries: registry.npmjs.org/object.fromentries@2.0.7 - semver: registry.npmjs.org/semver@6.3.1 - dev: true - registry.npmjs.org/eslint-plugin-prettier@4.2.1(eslint-config-prettier@8.8.0)(eslint@8.43.0)(prettier@2.8.8): resolution: {integrity: sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-4.2.1.tgz} id: registry.npmjs.org/eslint-plugin-prettier/4.2.1 @@ -5594,18 +5113,6 @@ packages: prettier-linter-helpers: registry.npmjs.org/prettier-linter-helpers@1.0.0 dev: true - registry.npmjs.org/eslint-plugin-react-hooks@4.6.0(eslint@8.43.0): - resolution: {integrity: sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz} - id: registry.npmjs.org/eslint-plugin-react-hooks/4.6.0 - name: eslint-plugin-react-hooks - version: 4.6.0 - engines: {node: '>=10'} - peerDependencies: - eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 - dependencies: - eslint: registry.npmjs.org/eslint@8.43.0 - dev: true - registry.npmjs.org/eslint-plugin-react@7.33.2(eslint@8.43.0): resolution: {integrity: sha512-73QQMKALArI8/7xGLNI/3LylrEYrlKZSb5C9+q3OtOewTnMQi5cT+aE9E41sLCmli3I9PGGmD1yiZydyo4FEPw==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.33.2.tgz} id: registry.npmjs.org/eslint-plugin-react/7.33.2 @@ -5915,6 +5422,7 @@ packages: name: expand-template version: 2.0.3 engines: {node: '>=6'} + requiresBuild: true dev: false optional: true @@ -5989,6 +5497,7 @@ packages: resolution: {integrity: sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz} name: fast-fifo version: 1.3.2 + requiresBuild: true dev: false optional: true @@ -6156,6 +5665,7 @@ packages: resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz} name: fs-constants version: 1.0.0 + requiresBuild: true dev: false optional: true @@ -6306,14 +5816,6 @@ packages: get-intrinsic: registry.npmjs.org/get-intrinsic@1.2.2 dev: true - registry.npmjs.org/get-tsconfig@4.7.2: - resolution: {integrity: sha512-wuMsz4leaj5hbGgg4IvDU0bqJagpftG5l5cXIAvo8uZrqn0NJqwtfupTN00VnkQJPcIRrxYrm1Ue24btpCha2A==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.7.2.tgz} - name: get-tsconfig - version: 4.7.2 - dependencies: - resolve-pkg-maps: registry.npmjs.org/resolve-pkg-maps@1.0.0 - dev: true - registry.npmjs.org/getos@3.2.1: resolution: {integrity: sha512-U56CfOK17OKgTVqozZjUKNdkfEv6jk5WISBJ8SHoagjE6L69zOwl3Z+O8myjY9MEW3i2HPWQBt/LTbCgcC973Q==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/getos/-/getos-3.2.1.tgz} name: getos @@ -6334,6 +5836,7 @@ packages: resolution: {integrity: sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz} name: github-from-package version: 0.0.0 + requiresBuild: true dev: false optional: true @@ -6360,25 +5863,6 @@ packages: is-glob: registry.npmjs.org/is-glob@4.0.3 dev: true - registry.npmjs.org/glob-to-regexp@0.4.1: - resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz} - name: glob-to-regexp - version: 0.4.1 - dev: false - - registry.npmjs.org/glob@7.1.7: - resolution: {integrity: sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/glob/-/glob-7.1.7.tgz} - name: glob - version: 7.1.7 - dependencies: - fs.realpath: registry.npmjs.org/fs.realpath@1.0.0 - inflight: registry.npmjs.org/inflight@1.0.6 - inherits: registry.npmjs.org/inherits@2.0.4 - minimatch: registry.npmjs.org/minimatch@3.1.2 - once: registry.npmjs.org/once@1.4.0 - path-is-absolute: registry.npmjs.org/path-is-absolute@1.0.1 - dev: true - registry.npmjs.org/glob@7.2.3: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/glob/-/glob-7.2.3.tgz} name: glob @@ -6566,13 +6050,6 @@ packages: has-symbols: registry.npmjs.org/has-symbols@1.0.3 dev: true - registry.npmjs.org/has@1.0.4: - resolution: {integrity: sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/has/-/has-1.0.4.tgz} - name: has - version: 1.0.4 - engines: {node: '>= 0.4.0'} - dev: true - registry.npmjs.org/hasown@2.0.0: resolution: {integrity: sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz} name: hasown @@ -6813,6 +6290,7 @@ packages: resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/ini/-/ini-1.3.8.tgz} name: ini version: 1.3.8 + requiresBuild: true dev: false optional: true @@ -6854,6 +6332,7 @@ packages: resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz} name: is-arrayish version: 0.3.2 + requiresBuild: true dev: false optional: true @@ -7334,15 +6813,6 @@ packages: version: 5.0.1 dev: true - registry.npmjs.org/json5@1.0.2: - resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/json5/-/json5-1.0.2.tgz} - name: json5 - version: 1.0.2 - hasBin: true - dependencies: - minimist: registry.npmjs.org/minimist@1.2.8 - dev: true - registry.npmjs.org/json5@2.2.3: resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/json5/-/json5-2.2.3.tgz} name: json5 @@ -7431,20 +6901,6 @@ packages: version: 0.27.0 dev: true - registry.npmjs.org/language-subtag-registry@0.3.22: - resolution: {integrity: sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz} - name: language-subtag-registry - version: 0.3.22 - dev: true - - registry.npmjs.org/language-tags@1.0.5: - resolution: {integrity: sha512-qJhlO9cGXi6hBGKoxEG/sKZDAHD5Hnu9Hs4WbOY3pCWXDhw0N8x1NenNzm2EnNLkLkk7J2SdxAkDSbb6ftT+UQ==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/language-tags/-/language-tags-1.0.5.tgz} - name: language-tags - version: 1.0.5 - dependencies: - language-subtag-registry: registry.npmjs.org/language-subtag-registry@0.3.22 - dev: true - registry.npmjs.org/lazy-ass@1.6.0: resolution: {integrity: sha512-cc8oEVoctTvsFZ/Oje/kGnHbpWHYBe8IAJe4C0QNc3t8uM/0Y8+erSz/7Y1ALuXTEZTMvxXwO6YbX1ey3ujiZw==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/lazy-ass/-/lazy-ass-1.6.0.tgz} name: lazy-ass @@ -8261,6 +7717,7 @@ packages: name: mimic-response version: 3.1.0 engines: {node: '>=10'} + requiresBuild: true dev: false optional: true @@ -8315,6 +7772,7 @@ packages: resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz} name: mkdirp-classic version: 0.5.3 + requiresBuild: true dev: false optional: true @@ -8367,6 +7825,7 @@ packages: resolution: {integrity: sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz} name: napi-build-utils version: 1.0.2 + requiresBuild: true dev: false optional: true @@ -8396,48 +7855,6 @@ packages: - supports-color dev: false - registry.npmjs.org/next@13.5.4(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-+93un5S779gho8y9ASQhb/bTkQF17FNQOtXLKAj3lsNgltEcF0C5PMLLncDmH+8X1EnJH1kbqAERa29nRXqhjA==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/next/-/next-13.5.4.tgz} - id: registry.npmjs.org/next/13.5.4 - name: next - version: 13.5.4 - engines: {node: '>=16.14.0'} - hasBin: true - peerDependencies: - '@opentelemetry/api': ^1.1.0 - react: ^18.2.0 - react-dom: ^18.2.0 - sass: ^1.3.0 - peerDependenciesMeta: - '@opentelemetry/api': - optional: true - sass: - optional: true - dependencies: - '@next/env': registry.npmjs.org/@next/env@13.5.4 - '@swc/helpers': registry.npmjs.org/@swc/helpers@0.5.2 - busboy: registry.npmjs.org/busboy@1.6.0 - caniuse-lite: registry.npmjs.org/caniuse-lite@1.0.30001553 - postcss: registry.npmjs.org/postcss@8.4.31 - react: registry.npmjs.org/react@18.2.0 - react-dom: registry.npmjs.org/react-dom@18.2.0(react@18.2.0) - styled-jsx: registry.npmjs.org/styled-jsx@5.1.1(react@18.2.0) - watchpack: registry.npmjs.org/watchpack@2.4.0 - optionalDependencies: - '@next/swc-darwin-arm64': registry.npmjs.org/@next/swc-darwin-arm64@13.5.4 - '@next/swc-darwin-x64': registry.npmjs.org/@next/swc-darwin-x64@13.5.4 - '@next/swc-linux-arm64-gnu': registry.npmjs.org/@next/swc-linux-arm64-gnu@13.5.4 - '@next/swc-linux-arm64-musl': registry.npmjs.org/@next/swc-linux-arm64-musl@13.5.4 - '@next/swc-linux-x64-gnu': registry.npmjs.org/@next/swc-linux-x64-gnu@13.5.4 - '@next/swc-linux-x64-musl': registry.npmjs.org/@next/swc-linux-x64-musl@13.5.4 - '@next/swc-win32-arm64-msvc': registry.npmjs.org/@next/swc-win32-arm64-msvc@13.5.4 - '@next/swc-win32-ia32-msvc': registry.npmjs.org/@next/swc-win32-ia32-msvc@13.5.4 - '@next/swc-win32-x64-msvc': registry.npmjs.org/@next/swc-win32-x64-msvc@13.5.4 - transitivePeerDependencies: - - '@babel/core' - - babel-plugin-macros - dev: false - registry.npmjs.org/nlcst-to-string@3.1.1: resolution: {integrity: sha512-63mVyqaqt0cmn2VcI2aH6kxe1rLAmSROqHMA0i4qqg1tidkfExgpb0FGMikMCn86mw5dFtBtEANfmSSK7TjNHw==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/nlcst-to-string/-/nlcst-to-string-3.1.1.tgz} name: nlcst-to-string @@ -8459,6 +7876,7 @@ packages: name: node-abi version: 3.51.0 engines: {node: '>=10'} + requiresBuild: true dependencies: semver: registry.npmjs.org/semver@7.5.4 dev: false @@ -8468,6 +7886,7 @@ packages: resolution: {integrity: sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/node-addon-api/-/node-addon-api-6.1.0.tgz} name: node-addon-api version: 6.1.0 + requiresBuild: true dev: false optional: true @@ -8594,17 +8013,6 @@ packages: es-abstract: registry.npmjs.org/es-abstract@1.22.3 dev: true - registry.npmjs.org/object.groupby@1.0.1: - resolution: {integrity: sha512-HqaQtqLnp/8Bn4GL16cj+CUYbnpe1bh0TtEaWvybszDG4tgxCJuRpV8VGuvNaI1fAnI4lUJzDG55MXcOH4JZcQ==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.1.tgz} - name: object.groupby - version: 1.0.1 - dependencies: - call-bind: registry.npmjs.org/call-bind@1.0.5 - define-properties: registry.npmjs.org/define-properties@1.2.1 - es-abstract: registry.npmjs.org/es-abstract@1.22.3 - get-intrinsic: registry.npmjs.org/get-intrinsic@1.2.2 - dev: true - registry.npmjs.org/object.hasown@1.1.3: resolution: {integrity: sha512-fFI4VcYpRHvSLXxP7yiZOMAd331cPfd2p7PFDVbgUsYOfCT3tICVqXWngbjr4m49OvsBwUBQ6O2uQoJvy3RexA==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.3.tgz} name: object.hasown @@ -9486,6 +8894,7 @@ packages: version: 7.1.1 engines: {node: '>=10'} hasBin: true + requiresBuild: true dependencies: detect-libc: registry.npmjs.org/detect-libc@2.0.2 expand-template: registry.npmjs.org/expand-template@2.0.3 @@ -9684,6 +9093,7 @@ packages: resolution: {integrity: sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/queue-tick/-/queue-tick-1.0.1.tgz} name: queue-tick version: 1.0.1 + requiresBuild: true dev: false optional: true @@ -9707,6 +9117,7 @@ packages: name: rc version: 1.2.8 hasBin: true + requiresBuild: true dependencies: deep-extend: registry.npmjs.org/deep-extend@0.6.0 ini: registry.npmjs.org/ini@1.3.8 @@ -10006,12 +9417,6 @@ packages: engines: {node: '>=8'} dev: true - registry.npmjs.org/resolve-pkg-maps@1.0.0: - resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz} - name: resolve-pkg-maps - version: 1.0.0 - dev: true - registry.npmjs.org/resolve@1.22.8: resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz} name: resolve @@ -10407,6 +9812,7 @@ packages: resolution: {integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz} name: simple-concat version: 1.0.1 + requiresBuild: true dev: false optional: true @@ -10414,6 +9820,7 @@ packages: resolution: {integrity: sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz} name: simple-get version: 4.0.1 + requiresBuild: true dependencies: decompress-response: registry.npmjs.org/decompress-response@6.0.0 once: registry.npmjs.org/once@1.4.0 @@ -10425,6 +9832,7 @@ packages: resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz} name: simple-swizzle version: 0.2.2 + requiresBuild: true dependencies: is-arrayish: registry.npmjs.org/is-arrayish@0.3.2 dev: false @@ -10685,11 +10093,13 @@ packages: name: streamsearch version: 1.1.0 engines: {node: '>=10.0.0'} + dev: true registry.npmjs.org/streamx@2.15.1: resolution: {integrity: sha512-fQMzy2O/Q47rgwErk/eGeLu/roaFWV0jVsogDmrszM9uIw8L5OA+t+V93MgYlufNptfjmYR1tOMWhei/Eh7TQA==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/streamx/-/streamx-2.15.1.tgz} name: streamx version: 2.15.1 + requiresBuild: true dependencies: fast-fifo: registry.npmjs.org/fast-fifo@1.3.2 queue-tick: registry.npmjs.org/queue-tick@1.0.1 @@ -10857,6 +10267,7 @@ packages: name: strip-json-comments version: 2.0.1 engines: {node: '>=0.10.0'} + requiresBuild: true dev: false optional: true @@ -10867,26 +10278,6 @@ packages: engines: {node: '>=8'} dev: true - registry.npmjs.org/styled-jsx@5.1.1(react@18.2.0): - resolution: {integrity: sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.1.tgz} - id: registry.npmjs.org/styled-jsx/5.1.1 - name: styled-jsx - version: 5.1.1 - engines: {node: '>= 12.0.0'} - peerDependencies: - '@babel/core': '*' - babel-plugin-macros: '*' - react: '>= 16.8.0 || 17.x.x || ^18.0.0-0' - peerDependenciesMeta: - '@babel/core': - optional: true - babel-plugin-macros: - optional: true - dependencies: - client-only: registry.npmjs.org/client-only@0.0.1 - react: registry.npmjs.org/react@18.2.0 - dev: false - registry.npmjs.org/stylehacks@6.0.0(postcss@8.4.21): resolution: {integrity: sha512-+UT589qhHPwz6mTlCLSt/vMNTJx8dopeJlZAlBMJPWA3ORqu6wmQY7FBXf+qD+FsqoBJODyqNxOUP3jdntFRdw==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/stylehacks/-/stylehacks-6.0.0.tgz} id: registry.npmjs.org/stylehacks/6.0.0 @@ -11194,17 +10585,11 @@ packages: picocolors: registry.npmjs.org/picocolors@1.0.0 dev: true - registry.npmjs.org/tapable@2.2.1: - resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz} - name: tapable - version: 2.2.1 - engines: {node: '>=6'} - dev: true - registry.npmjs.org/tar-fs@2.1.1: resolution: {integrity: sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz} name: tar-fs version: 2.1.1 + requiresBuild: true dependencies: chownr: registry.npmjs.org/chownr@1.1.4 mkdirp-classic: registry.npmjs.org/mkdirp-classic@0.5.3 @@ -11217,6 +10602,7 @@ packages: resolution: {integrity: sha512-5AFQU8b9qLfZCX9zp2duONhPmZv0hGYiBPJsyUdqMjzq/mqVpy/rEUSeHk1+YitmxugaptgBh5oDGU3VsAJq4w==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/tar-fs/-/tar-fs-3.0.4.tgz} name: tar-fs version: 3.0.4 + requiresBuild: true dependencies: mkdirp-classic: registry.npmjs.org/mkdirp-classic@0.5.3 pump: registry.npmjs.org/pump@3.0.0 @@ -11229,6 +10615,7 @@ packages: name: tar-stream version: 2.2.0 engines: {node: '>=6'} + requiresBuild: true dependencies: bl: registry.npmjs.org/bl@4.1.0 end-of-stream: registry.npmjs.org/end-of-stream@1.4.4 @@ -11242,6 +10629,7 @@ packages: resolution: {integrity: sha512-B/UyjYwPpMBv+PaFSWAmtYjwdrlEaZQEhMIBFNC5oEG8lpiW8XjcSdmEaClj28ArfKScKHs2nshz3k2le6crsg==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.6.tgz} name: tar-stream version: 3.1.6 + requiresBuild: true dependencies: b4a: registry.npmjs.org/b4a@1.6.4 fast-fifo: registry.npmjs.org/fast-fifo@1.3.2 @@ -11388,17 +10776,6 @@ packages: typescript: registry.npmjs.org/typescript@5.1.3 dev: true - registry.npmjs.org/tsconfig-paths@3.14.2: - resolution: {integrity: sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz} - name: tsconfig-paths - version: 3.14.2 - dependencies: - '@types/json5': registry.npmjs.org/@types/json5@0.0.29 - json5: registry.npmjs.org/json5@1.0.2 - minimist: registry.npmjs.org/minimist@1.2.8 - strip-bom: registry.npmjs.org/strip-bom@3.0.0 - dev: true - registry.npmjs.org/tsconfig-resolver@3.0.1: resolution: {integrity: sha512-ZHqlstlQF449v8glscGRXzL6l2dZvASPCdXJRWG4gHEZlUVx2Jtmr+a2zeVG4LCsKhDXKRj5R3h0C/98UcVAQg==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/tsconfig-resolver/-/tsconfig-resolver-3.0.1.tgz} name: tsconfig-resolver @@ -11678,6 +11055,7 @@ packages: resolution: {integrity: sha512-Ga1jfYwRn7+cP9v8auvEXN1rX3sWqlayd4HP7OKk4mZWylEmu3KzXDUGrQUN6Ol7qo1gPvB2e5gX6udnyEPgdA==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/undici-types/-/undici-types-5.25.3.tgz} name: undici-types version: 5.25.3 + requiresBuild: true dev: true optional: true @@ -12033,16 +11411,6 @@ packages: - debug dev: true - registry.npmjs.org/watchpack@2.4.0: - resolution: {integrity: sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz} - name: watchpack - version: 2.4.0 - engines: {node: '>=10.13.0'} - dependencies: - glob-to-regexp: registry.npmjs.org/glob-to-regexp@0.4.1 - graceful-fs: registry.npmjs.org/graceful-fs@4.2.11 - dev: false - registry.npmjs.org/wcwidth@1.0.1: resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz} name: wcwidth From 57e6e389c9c05f34fcffbe3aa621502b1e373533 Mon Sep 17 00:00:00 2001 From: Peter Date: Tue, 7 Nov 2023 13:04:13 +0100 Subject: [PATCH 013/608] implemented generic tests for config based test flow creation --- tests/playwright/e2e/edges.spec.ts | 2 +- tests/playwright/e2e/nodes.spec.ts | 2 +- tests/playwright/e2e/pane.spec.ts | 5 ++--- tests/playwright/playwright.svelte.config.ts | 4 ++-- 4 files changed, 6 insertions(+), 7 deletions(-) diff --git a/tests/playwright/e2e/edges.spec.ts b/tests/playwright/e2e/edges.spec.ts index 033bc107..1318ee4b 100644 --- a/tests/playwright/e2e/edges.spec.ts +++ b/tests/playwright/e2e/edges.spec.ts @@ -5,7 +5,7 @@ import { FRAMEWORK } from './constants'; test.describe('EDGES', () => { test.beforeEach(async ({ page }) => { // Go to the starting url before each test. - await page.goto('/tests/edges'); + await page.goto('/tests/generic/edges/general'); // Timeout get's ignored and tests timeout after 200ms ??? // page.waitForSelector('[data-id="edge-with-class"]', { timeout: 5000 }); diff --git a/tests/playwright/e2e/nodes.spec.ts b/tests/playwright/e2e/nodes.spec.ts index 697cefa6..f0e97b0c 100644 --- a/tests/playwright/e2e/nodes.spec.ts +++ b/tests/playwright/e2e/nodes.spec.ts @@ -5,7 +5,7 @@ import { FRAMEWORK } from './constants'; test.describe('NODES', () => { test.beforeEach(async ({ page }) => { // Go to the starting url before each test. - await page.goto('/tests/nodes'); + await page.goto('/tests/generic/nodes/general'); }); test.describe('selection', () => { diff --git a/tests/playwright/e2e/pane.spec.ts b/tests/playwright/e2e/pane.spec.ts index fab03bdb..9c3d83a0 100644 --- a/tests/playwright/e2e/pane.spec.ts +++ b/tests/playwright/e2e/pane.spec.ts @@ -1,7 +1,6 @@ import { test, expect } from '@playwright/test'; import { FRAMEWORK } from './constants'; -import { transform } from 'typescript'; const MATCH_ALL_NUMBERS = /[\d\.]+/g; @@ -23,7 +22,7 @@ async function getTransform(element) { test.describe('PANE DEFAULT', () => { test.beforeEach(async ({ page }) => { // Go to the starting url before each test. - await page.goto('/tests/pane/default'); + await page.goto('/tests/generic/pane/general'); // Wait till the edges are rendered await page.waitForSelector('#first-edge', { timeout: 5000 }); @@ -146,7 +145,7 @@ test.describe('PANE DEFAULT', () => { test.describe('PANE NON-DEFAULT', () => { test.beforeEach(async ({ page }) => { // Go to the starting url before each test. - await page.goto('/tests/pane/non-default'); + await page.goto('/tests/generic/pane/non-defaults'); // Wait till the edges are rendered await page.waitForSelector('#first-edge', { timeout: 5000 }); diff --git a/tests/playwright/playwright.svelte.config.ts b/tests/playwright/playwright.svelte.config.ts index f92bd3dc..b08b566c 100644 --- a/tests/playwright/playwright.svelte.config.ts +++ b/tests/playwright/playwright.svelte.config.ts @@ -1,4 +1,4 @@ -import { defineConfig, devices } from '@playwright/test'; +import { defineConfig } from '@playwright/test'; import { sharedConfigWithPort } from './playwright.shared.config'; const port = 5173; @@ -6,7 +6,7 @@ const port = 5173; export default defineConfig({ ...sharedConfigWithPort(port), webServer: { - command: 'cd ../../examples/svelte && pnpm run dev', + command: 'cd ../../examples/svelte && pnpm run dev --port 5173', port: port, reuseExistingServer: !process.env.CI, }, From 3676670c4403a63dd4d3d18c2c66e591ff61655b Mon Sep 17 00:00:00 2001 From: Peter Date: Tue, 7 Nov 2023 13:04:44 +0100 Subject: [PATCH 014/608] implemented generic tests for config based test flow creation --- examples/svelte/src/app.d.ts | 7 + .../svelte/src/generic-tests/edges/general.ts | 161 ++++++++++++++++++ .../nodes/components}/DragHandleNode.svelte | 0 .../svelte/src/generic-tests/nodes/general.ts | 91 ++++++++++ .../svelte/src/generic-tests/pane/general.ts | 37 ++++ .../src/generic-tests/pane/non-defaults.ts | 38 +++++ .../svelte/src/routes/tests/edges/Flow.svelte | 12 -- .../src/routes/tests/edges/nodesAndEdges.ts | 157 ----------------- .../[topic]/[example]}/+page.svelte | 4 +- .../tests/generic/[topic]/[example]/+page.ts | 22 +++ .../generic/[topic]/[example]/Flow.svelte | 16 ++ .../src/routes/tests/nodes/+page.svelte | 9 - .../svelte/src/routes/tests/nodes/Flow.svelte | 18 -- .../src/routes/tests/nodes/nodesAndEdges.ts | 84 --------- .../routes/tests/pane/default/+page.svelte | 9 - .../src/routes/tests/pane/default/Flow.svelte | 12 -- .../tests/pane/default/nodesAndEdges.ts | 33 ---- .../tests/pane/non-default/+page.svelte | 9 - .../routes/tests/pane/non-default/Flow.svelte | 19 --- .../tests/pane/non-default/nodesAndEdges.ts | 33 ---- 20 files changed, 375 insertions(+), 396 deletions(-) create mode 100644 examples/svelte/src/generic-tests/edges/general.ts rename examples/svelte/src/{routes/tests/nodes => generic-tests/nodes/components}/DragHandleNode.svelte (100%) create mode 100644 examples/svelte/src/generic-tests/nodes/general.ts create mode 100644 examples/svelte/src/generic-tests/pane/general.ts create mode 100644 examples/svelte/src/generic-tests/pane/non-defaults.ts delete mode 100644 examples/svelte/src/routes/tests/edges/Flow.svelte delete mode 100644 examples/svelte/src/routes/tests/edges/nodesAndEdges.ts rename examples/svelte/src/routes/tests/{edges => generic/[topic]/[example]}/+page.svelte (75%) create mode 100644 examples/svelte/src/routes/tests/generic/[topic]/[example]/+page.ts create mode 100644 examples/svelte/src/routes/tests/generic/[topic]/[example]/Flow.svelte delete mode 100644 examples/svelte/src/routes/tests/nodes/+page.svelte delete mode 100644 examples/svelte/src/routes/tests/nodes/Flow.svelte delete mode 100644 examples/svelte/src/routes/tests/nodes/nodesAndEdges.ts delete mode 100644 examples/svelte/src/routes/tests/pane/default/+page.svelte delete mode 100644 examples/svelte/src/routes/tests/pane/default/Flow.svelte delete mode 100644 examples/svelte/src/routes/tests/pane/default/nodesAndEdges.ts delete mode 100644 examples/svelte/src/routes/tests/pane/non-default/+page.svelte delete mode 100644 examples/svelte/src/routes/tests/pane/non-default/Flow.svelte delete mode 100644 examples/svelte/src/routes/tests/pane/non-default/nodesAndEdges.ts diff --git a/examples/svelte/src/app.d.ts b/examples/svelte/src/app.d.ts index f59b884c..343f3fd6 100644 --- a/examples/svelte/src/app.d.ts +++ b/examples/svelte/src/app.d.ts @@ -1,4 +1,7 @@ // See https://kit.svelte.dev/docs/types#app + +import type { Edge, Node, SvelteFlowProps } from '@xyflow/svelte'; + // for information about these interfaces declare global { namespace App { @@ -7,6 +10,10 @@ declare global { // interface PageData {} // interface Platform {} } + + interface GenericTestCase { + svelteFlowProps: Omit & { nodes: Node[]; edges: Edge[] }; + } } export {}; diff --git a/examples/svelte/src/generic-tests/edges/general.ts b/examples/svelte/src/generic-tests/edges/general.ts new file mode 100644 index 00000000..cc05aada --- /dev/null +++ b/examples/svelte/src/generic-tests/edges/general.ts @@ -0,0 +1,161 @@ +import { MarkerType } from '@xyflow/svelte'; + +export default { + svelteFlowProps: { + fitView: true, + nodes: [ + { + id: '1', + data: { label: '1' }, + position: { x: 0, y: 0 }, + type: 'input' + }, + { + id: '2', + data: { label: '2' }, + position: { x: -100, y: 100 } + }, + { + id: '3', + data: { label: '3' }, + position: { x: 100, y: 100 } + }, + { + id: '4', + data: { label: '4' }, + position: { x: -100, y: 200 } + }, + { + id: '5', + data: { label: '5' }, + position: { x: 100, y: 200 } + }, + { + id: '6', + data: { label: '6' }, + position: { x: -100, y: 300 } + }, + { + id: '7', + data: { label: '7' }, + position: { x: 100, y: 300 } + }, + { + id: '8', + data: { label: '8' }, + position: { x: -100, y: 400 } + }, + { + id: '9', + data: { label: '9' }, + position: { x: 100, y: 400 } + }, + { + id: '10', + data: { label: '10' }, + position: { x: -100, y: 500 } + }, + { + id: '11', + data: { label: '11' }, + position: { x: 100, y: 500 } + } + // { + // id: '12', + // data: { label: '12' }, + // position: { x: -100, y: 600 } + // }, + // { + // id: '13', + // data: { label: '13' }, + // position: { x: 100, y: 600 } + // } + ], + edges: [ + { + id: 'edge-with-class', + source: '1', + target: '2', + class: 'edge-class-test' + }, + { + id: 'edge-with-style', + source: '1', + target: '3', + style: 'stroke: red;' + }, + { + id: 'hidden-edge', + source: '2', + target: '4', + label: 'hidden', + hidden: true + }, + { + id: 'animated-edge', + source: '3', + target: '5', + label: 'animated', + animated: true + }, + { + id: 'not-selectable-edge', + source: '4', + target: '6', + label: 'not-selectable', + selectable: false + }, + { + id: 'not-deletable', + source: '5', + target: '7', + label: 'not-deletable', + deletable: false + }, + { + id: 'z-index', + source: '6', + target: '8', + label: 'z-index', + zIndex: 3141592 + }, + { + id: 'aria-label', + source: '7', + target: '9', + label: 'aria-label', + ariaLabel: 'aria-label-test' + }, + { + id: 'interaction-width', + source: '8', + target: '10', + label: 'interaction-width', + interactionWidth: 42 + }, + { + id: 'markers', + source: '9', + target: '11', + label: 'markers', + markerEnd: { type: MarkerType.Arrow }, + markerStart: { type: MarkerType.ArrowClosed } + } + // { + // id: 'updatable', + // source: '9', + // target: '11', + // label: 'focusable', + // updatable: true + // }, + // { + // id: 'not-focusable', + // + // source: '5', + // target: '7', + // label: 'not-focusable', + // focusable: false + // }, + ] + } +} satisfies GenericTestCase; diff --git a/examples/svelte/src/routes/tests/nodes/DragHandleNode.svelte b/examples/svelte/src/generic-tests/nodes/components/DragHandleNode.svelte similarity index 100% rename from examples/svelte/src/routes/tests/nodes/DragHandleNode.svelte rename to examples/svelte/src/generic-tests/nodes/components/DragHandleNode.svelte diff --git a/examples/svelte/src/generic-tests/nodes/general.ts b/examples/svelte/src/generic-tests/nodes/general.ts new file mode 100644 index 00000000..b7707a08 --- /dev/null +++ b/examples/svelte/src/generic-tests/nodes/general.ts @@ -0,0 +1,91 @@ +import DragHandleNode from './components/DragHandleNode.svelte'; + +export default { + svelteFlowProps: { + fitView: true, + nodeTypes: { + DragHandleNode + }, + nodes: [ + { + id: 'Node-1', + data: { label: 'Node-1' }, + position: { x: 0, y: 0 }, + type: 'input', + class: 'playwright-test-class-123', + style: 'background-color: red;' + }, + { + id: 'Node-2', + type: 'output', + data: { label: 'Node-2' }, + position: { x: -100, y: 100 } + }, + { + id: 'Node-3', + data: { label: 'Node-3' }, + position: { x: 100, y: 100 } + }, + { + id: 'Node-4', + data: { label: 'Node-4' }, + position: { x: 0, y: 200 }, + type: 'output' + }, + { + id: 'drag-handle', + data: { label: 'Drag Handle' }, + position: { x: 200, y: 0 }, + type: 'DragHandleNode', + dragHandle: '.custom-drag-handle' + }, + { + id: 'notConnectable', + type: 'output', + data: { label: 'notConnectable' }, + position: { x: 0, y: 300 }, + connectable: false + }, + { + id: 'notDraggable', + data: { label: 'notDraggable' }, + position: { x: 0, y: 400 }, + draggable: false + }, + { + id: 'notSelectable', + data: { label: 'notSelectable' }, + position: { x: 0, y: 500 }, + selectable: false + }, + { + id: 'notDeletable', + data: { label: 'notDeletable' }, + position: { x: 0, y: 600 }, + deletable: false + }, + { + id: 'hidden', + data: { label: 'hidden' }, + position: { x: 0, y: 700 }, + hidden: true + } + ], + edges: [ + { + id: '1-2', + type: 'default', + source: 'Node-1', + target: 'Node-2', + label: 'edge' + }, + { + id: '1-3', + type: 'default', + source: 'Node-1', + target: 'Node-3', + label: 'edge' + } + ] + } +} satisfies GenericTestCase; diff --git a/examples/svelte/src/generic-tests/pane/general.ts b/examples/svelte/src/generic-tests/pane/general.ts new file mode 100644 index 00000000..5caac003 --- /dev/null +++ b/examples/svelte/src/generic-tests/pane/general.ts @@ -0,0 +1,37 @@ +export default { + svelteFlowProps: { + minZoom: 0.25, + maxZoom: 4, + fitView: true, + nodes: [ + { + id: '1', + data: { label: '1' }, + position: { x: 0, y: 0 }, + type: 'input' + }, + { + id: '2', + data: { label: '2' }, + position: { x: -100, y: 100 } + }, + { + id: '3', + data: { label: '3' }, + position: { x: 100, y: 100 } + } + ], + edges: [ + { + id: 'first-edge', + source: '1', + target: '2' + }, + { + id: 'second-edge', + source: '1', + target: '3' + } + ] + } +} satisfies GenericTestCase; diff --git a/examples/svelte/src/generic-tests/pane/non-defaults.ts b/examples/svelte/src/generic-tests/pane/non-defaults.ts new file mode 100644 index 00000000..0d17e954 --- /dev/null +++ b/examples/svelte/src/generic-tests/pane/non-defaults.ts @@ -0,0 +1,38 @@ +export default { + svelteFlowProps: { + panOnScroll: true, + initialViewport: { x: 1.23, y: 9.87, zoom: 1.234 }, + autoPanOnConnect: false, + autoPanOnNodeDrag: false, + nodes: [ + { + id: '1', + data: { label: '1' }, + position: { x: 0, y: 0 }, + type: 'input' + }, + { + id: '2', + data: { label: '2' }, + position: { x: -100, y: 100 } + }, + { + id: '3', + data: { label: '3' }, + position: { x: 100, y: 100 } + } + ], + edges: [ + { + id: 'first-edge', + source: '1', + target: '2' + }, + { + id: 'second-edge', + source: '1', + target: '3' + } + ] + } +} satisfies GenericTestCase; diff --git a/examples/svelte/src/routes/tests/edges/Flow.svelte b/examples/svelte/src/routes/tests/edges/Flow.svelte deleted file mode 100644 index 6686c907..00000000 --- a/examples/svelte/src/routes/tests/edges/Flow.svelte +++ /dev/null @@ -1,12 +0,0 @@ - - - diff --git a/examples/svelte/src/routes/tests/edges/nodesAndEdges.ts b/examples/svelte/src/routes/tests/edges/nodesAndEdges.ts deleted file mode 100644 index b5452b8c..00000000 --- a/examples/svelte/src/routes/tests/edges/nodesAndEdges.ts +++ /dev/null @@ -1,157 +0,0 @@ -import { MarkerType, type Edge, type Node } from '@xyflow/svelte'; - -export const initialNodes: Node[] = [ - { - id: '1', - data: { label: '1' }, - position: { x: 0, y: 0 }, - type: 'input' - }, - { - id: '2', - data: { label: '2' }, - position: { x: -100, y: 100 } - }, - { - id: '3', - data: { label: '3' }, - position: { x: 100, y: 100 } - }, - { - id: '4', - data: { label: '4' }, - position: { x: -100, y: 200 } - }, - { - id: '5', - data: { label: '5' }, - position: { x: 100, y: 200 } - }, - { - id: '6', - data: { label: '6' }, - position: { x: -100, y: 300 } - }, - { - id: '7', - data: { label: '7' }, - position: { x: 100, y: 300 } - }, - { - id: '8', - data: { label: '8' }, - position: { x: -100, y: 400 } - }, - { - id: '9', - data: { label: '9' }, - position: { x: 100, y: 400 } - }, - { - id: '10', - data: { label: '10' }, - position: { x: -100, y: 500 } - }, - { - id: '11', - data: { label: '11' }, - position: { x: 100, y: 500 } - } - // { - // id: '12', - // data: { label: '12' }, - // position: { x: -100, y: 600 } - // }, - // { - // id: '13', - // data: { label: '13' }, - // position: { x: 100, y: 600 } - // } -]; - -export const initialEdges: Edge[] = [ - { - id: 'edge-with-class', - source: '1', - target: '2', - class: 'edge-class-test' - }, - { - id: 'edge-with-style', - source: '1', - target: '3', - style: 'stroke: red;' - }, - { - id: 'hidden-edge', - source: '2', - target: '4', - label: 'hidden', - hidden: true - }, - { - id: 'animated-edge', - source: '3', - target: '5', - label: 'animated', - animated: true - }, - { - id: 'not-selectable-edge', - source: '4', - target: '6', - label: 'not-selectable', - selectable: false - }, - { - id: 'not-deletable', - source: '5', - target: '7', - label: 'not-deletable', - deletable: false - }, - { - id: 'z-index', - source: '6', - target: '8', - label: 'z-index', - zIndex: 3141592 - }, - { - id: 'aria-label', - source: '7', - target: '9', - label: 'aria-label', - ariaLabel: 'aria-label-test' - }, - { - id: 'interaction-width', - source: '8', - target: '10', - label: 'interaction-width', - interactionWidth: 42 - }, - { - id: 'markers', - source: '9', - target: '11', - label: 'markers', - markerEnd: { type: MarkerType.Arrow }, - markerStart: { type: MarkerType.ArrowClosed } - } - // { - // id: 'updatable', - // source: '9', - // target: '11', - // label: 'focusable', - // updatable: true - // }, - // { - // id: 'not-focusable', - // - // source: '5', - // target: '7', - // label: 'not-focusable', - // focusable: false - // }, -]; diff --git a/examples/svelte/src/routes/tests/edges/+page.svelte b/examples/svelte/src/routes/tests/generic/[topic]/[example]/+page.svelte similarity index 75% rename from examples/svelte/src/routes/tests/edges/+page.svelte rename to examples/svelte/src/routes/tests/generic/[topic]/[example]/+page.svelte index 12dec33c..2487d85a 100644 --- a/examples/svelte/src/routes/tests/edges/+page.svelte +++ b/examples/svelte/src/routes/tests/generic/[topic]/[example]/+page.svelte @@ -2,8 +2,10 @@ import { SvelteFlowProvider } from '@xyflow/svelte'; import Flow from './Flow.svelte'; + + export let data; - + diff --git a/examples/svelte/src/routes/tests/generic/[topic]/[example]/+page.ts b/examples/svelte/src/routes/tests/generic/[topic]/[example]/+page.ts new file mode 100644 index 00000000..65f62996 --- /dev/null +++ b/examples/svelte/src/routes/tests/generic/[topic]/[example]/+page.ts @@ -0,0 +1,22 @@ +import { error } from '@sveltejs/kit'; + +/** @type {import('./$types').PageLoad} */ +export function load({ params }) { + try { + const genericTestCases = import.meta.glob('/src/generic-tests/**/*.ts', { + eager: true, + import: 'default' + }); + + const generic = genericTestCases[`/src/generic-tests/${params.topic}/${params.example}.ts`]; + if (generic) { + return { + generic + }; + } + } catch (e) { + console.error(e); + } + + throw error(404, 'Not found'); +} diff --git a/examples/svelte/src/routes/tests/generic/[topic]/[example]/Flow.svelte b/examples/svelte/src/routes/tests/generic/[topic]/[example]/Flow.svelte new file mode 100644 index 00000000..40babf50 --- /dev/null +++ b/examples/svelte/src/routes/tests/generic/[topic]/[example]/Flow.svelte @@ -0,0 +1,16 @@ + + + diff --git a/examples/svelte/src/routes/tests/nodes/+page.svelte b/examples/svelte/src/routes/tests/nodes/+page.svelte deleted file mode 100644 index 12dec33c..00000000 --- a/examples/svelte/src/routes/tests/nodes/+page.svelte +++ /dev/null @@ -1,9 +0,0 @@ - - - - - diff --git a/examples/svelte/src/routes/tests/nodes/Flow.svelte b/examples/svelte/src/routes/tests/nodes/Flow.svelte deleted file mode 100644 index 6f684cbf..00000000 --- a/examples/svelte/src/routes/tests/nodes/Flow.svelte +++ /dev/null @@ -1,18 +0,0 @@ - - - diff --git a/examples/svelte/src/routes/tests/nodes/nodesAndEdges.ts b/examples/svelte/src/routes/tests/nodes/nodesAndEdges.ts deleted file mode 100644 index bd382bef..00000000 --- a/examples/svelte/src/routes/tests/nodes/nodesAndEdges.ts +++ /dev/null @@ -1,84 +0,0 @@ -import type { Edge, Node } from '@xyflow/svelte'; - -export const initialNodes: Node[] = [ - { - id: 'Node-1', - data: { label: 'Node-1' }, - position: { x: 0, y: 0 }, - type: 'input', - class: 'playwright-test-class-123', - style: 'background-color: red;' - }, - { - id: 'Node-2', - type: 'output', - data: { label: 'Node-2' }, - position: { x: -100, y: 100 } - }, - { - id: 'Node-3', - data: { label: 'Node-3' }, - position: { x: 100, y: 100 } - }, - { - id: 'Node-4', - data: { label: 'Node-4' }, - position: { x: 0, y: 200 }, - type: 'output' - }, - { - id: 'drag-handle', - data: { label: 'Drag Handle' }, - position: { x: 200, y: 0 }, - type: 'DragHandleNode', - dragHandle: '.custom-drag-handle' - }, - { - id: 'notConnectable', - type: 'output', - data: { label: 'notConnectable' }, - position: { x: 0, y: 300 }, - connectable: false - }, - { - id: 'notDraggable', - data: { label: 'notDraggable' }, - position: { x: 0, y: 400 }, - draggable: false - }, - { - id: 'notSelectable', - data: { label: 'notSelectable' }, - position: { x: 0, y: 500 }, - selectable: false - }, - { - id: 'notDeletable', - data: { label: 'notDeletable' }, - position: { x: 0, y: 600 }, - deletable: false - }, - { - id: 'hidden', - data: { label: 'hidden' }, - position: { x: 0, y: 700 }, - hidden: true - } -]; - -export const initialEdges: Edge[] = [ - { - id: '1-2', - type: 'default', - source: 'Node-1', - target: 'Node-2', - label: 'edge' - }, - { - id: '1-3', - type: 'default', - source: 'Node-1', - target: 'Node-3', - label: 'edge' - } -]; diff --git a/examples/svelte/src/routes/tests/pane/default/+page.svelte b/examples/svelte/src/routes/tests/pane/default/+page.svelte deleted file mode 100644 index 12dec33c..00000000 --- a/examples/svelte/src/routes/tests/pane/default/+page.svelte +++ /dev/null @@ -1,9 +0,0 @@ - - - - - diff --git a/examples/svelte/src/routes/tests/pane/default/Flow.svelte b/examples/svelte/src/routes/tests/pane/default/Flow.svelte deleted file mode 100644 index ae2093ed..00000000 --- a/examples/svelte/src/routes/tests/pane/default/Flow.svelte +++ /dev/null @@ -1,12 +0,0 @@ - - - diff --git a/examples/svelte/src/routes/tests/pane/default/nodesAndEdges.ts b/examples/svelte/src/routes/tests/pane/default/nodesAndEdges.ts deleted file mode 100644 index 7d2e0522..00000000 --- a/examples/svelte/src/routes/tests/pane/default/nodesAndEdges.ts +++ /dev/null @@ -1,33 +0,0 @@ -import type { Edge, Node } from '@xyflow/svelte'; - -export const initialNodes: Node[] = [ - { - id: '1', - data: { label: '1' }, - position: { x: 0, y: 0 }, - type: 'input' - }, - { - id: '2', - data: { label: '2' }, - position: { x: -100, y: 100 } - }, - { - id: '3', - data: { label: '3' }, - position: { x: 100, y: 100 } - } -]; - -export const initialEdges: Edge[] = [ - { - id: 'first-edge', - source: '1', - target: '2' - }, - { - id: 'second-edge', - source: '1', - target: '3' - } -]; diff --git a/examples/svelte/src/routes/tests/pane/non-default/+page.svelte b/examples/svelte/src/routes/tests/pane/non-default/+page.svelte deleted file mode 100644 index 12dec33c..00000000 --- a/examples/svelte/src/routes/tests/pane/non-default/+page.svelte +++ /dev/null @@ -1,9 +0,0 @@ - - - - - diff --git a/examples/svelte/src/routes/tests/pane/non-default/Flow.svelte b/examples/svelte/src/routes/tests/pane/non-default/Flow.svelte deleted file mode 100644 index d06a8de3..00000000 --- a/examples/svelte/src/routes/tests/pane/non-default/Flow.svelte +++ /dev/null @@ -1,19 +0,0 @@ - - - diff --git a/examples/svelte/src/routes/tests/pane/non-default/nodesAndEdges.ts b/examples/svelte/src/routes/tests/pane/non-default/nodesAndEdges.ts deleted file mode 100644 index 7d2e0522..00000000 --- a/examples/svelte/src/routes/tests/pane/non-default/nodesAndEdges.ts +++ /dev/null @@ -1,33 +0,0 @@ -import type { Edge, Node } from '@xyflow/svelte'; - -export const initialNodes: Node[] = [ - { - id: '1', - data: { label: '1' }, - position: { x: 0, y: 0 }, - type: 'input' - }, - { - id: '2', - data: { label: '2' }, - position: { x: -100, y: 100 } - }, - { - id: '3', - data: { label: '3' }, - position: { x: 100, y: 100 } - } -]; - -export const initialEdges: Edge[] = [ - { - id: 'first-edge', - source: '1', - target: '2' - }, - { - id: 'second-edge', - source: '1', - target: '3' - } -]; From b92df2ded28f1eaba62cf15365b8dae4c06e1b75 Mon Sep 17 00:00:00 2001 From: Peter Date: Tue, 7 Nov 2023 14:44:18 +0100 Subject: [PATCH 015/608] created new test case --- .../src/generic-tests/pane/activation-keys.ts | 40 +++++++++++++++++ tests/playwright/e2e/pane.spec.ts | 43 ++++++++++++++++++- 2 files changed, 81 insertions(+), 2 deletions(-) create mode 100644 examples/svelte/src/generic-tests/pane/activation-keys.ts diff --git a/examples/svelte/src/generic-tests/pane/activation-keys.ts b/examples/svelte/src/generic-tests/pane/activation-keys.ts new file mode 100644 index 00000000..e4dbe4e1 --- /dev/null +++ b/examples/svelte/src/generic-tests/pane/activation-keys.ts @@ -0,0 +1,40 @@ +export default { + svelteFlowProps: { + zoomOnScroll: false, + // zoomActivationKey: 'Space', + // panOnDrag: false, + // panOnScroll: false, + panActivationKey: 'Space', + fitView: true, + nodes: [ + { + id: '1', + data: { label: '1' }, + position: { x: 0, y: 0 }, + type: 'input' + }, + { + id: '2', + data: { label: '2' }, + position: { x: -100, y: 100 } + }, + { + id: '3', + data: { label: '3' }, + position: { x: 100, y: 100 } + } + ], + edges: [ + { + id: 'first-edge', + source: '1', + target: '2' + }, + { + id: 'second-edge', + source: '1', + target: '3' + } + ] + } +} satisfies GenericTestCase; diff --git a/tests/playwright/e2e/pane.spec.ts b/tests/playwright/e2e/pane.spec.ts index 9c3d83a0..6090beac 100644 --- a/tests/playwright/e2e/pane.spec.ts +++ b/tests/playwright/e2e/pane.spec.ts @@ -182,6 +182,45 @@ test.describe('PANE NON-DEFAULT', () => { expect(viewportTransform.scale).toBe(1.234); }); }); -}); -//TODO: Inverse: Not zooming/panning when disabled + test.describe('PANE ACTIVATION KEYS', () => { + test.beforeEach(async ({ page }) => { + // Go to the starting url before each test. + await page.goto('/tests/generic/pane/activation-keys'); + + // Wait till the edges are rendered + await page.waitForSelector('#first-edge', { timeout: 5000 }); + }); + + test.describe('pan & zoom', () => { + test('panOnScroll pans the pane on scrolling', async ({ page }) => { + const pane = page.locator(`.${FRAMEWORK}-flow__pane`); + const viewport = page.locator(`.${FRAMEWORK}-flow__viewport`); + + await expect(pane).toBeAttached(); + + const transformsBefore = await getTransform(viewport); + + await pane.hover(); + await page.mouse.wheel(100, 100); + + const transformsAfter = await getTransform(viewport); + + expect(transformsAfter.translateX).not.toBe(transformsBefore.translateX); + expect(transformsAfter.translateY).not.toBe(transformsBefore.translateY); + }); + + test('intialViewport', async ({ page }) => { + const pane = page.locator(`.${FRAMEWORK}-flow__pane`); + const viewport = page.locator(`.${FRAMEWORK}-flow__viewport`); + + await expect(pane).toBeAttached(); + + const viewportTransform = await getTransform(viewport); + + expect(viewportTransform.translateX).toBe(1.23); + expect(viewportTransform.translateY).toBe(9.87); + expect(viewportTransform.scale).toBe(1.234); + }); + }); +}); From 76f482a105739fca6124912e2ff9803b1cf43bde Mon Sep 17 00:00:00 2001 From: Peter Date: Tue, 7 Nov 2023 14:49:02 +0100 Subject: [PATCH 016/608] chore(svelte-examples) updated dependencies --- examples/svelte/package.json | 28 +- pnpm-lock.yaml | 838 ++++++++++++++++++++++++++++++----- 2 files changed, 734 insertions(+), 132 deletions(-) diff --git a/examples/svelte/package.json b/examples/svelte/package.json index 8cd6a14e..03f324bf 100644 --- a/examples/svelte/package.json +++ b/examples/svelte/package.json @@ -12,20 +12,20 @@ "format": "prettier --plugin-search-dir . --write ." }, "devDependencies": { - "@sveltejs/adapter-auto": "^2.0.0", - "@sveltejs/kit": "^1.20.4", - "@typescript-eslint/eslint-plugin": "^5.45.0", - "@typescript-eslint/parser": "^5.45.0", - "eslint": "^8.28.0", - "eslint-config-prettier": "^8.5.0", - "eslint-plugin-svelte": "^2.30.0", - "prettier": "^2.8.0", - "prettier-plugin-svelte": "^2.10.1", - "svelte": "^4.0.5", - "svelte-check": "^3.4.3", - "tslib": "^2.4.1", - "typescript": "^5.0.0", - "vite": "^4.4.2" + "@sveltejs/adapter-auto": "^2.1.1", + "@sveltejs/kit": "^1.27.3", + "@typescript-eslint/eslint-plugin": "^6.10.0", + "@typescript-eslint/parser": "^6.10.0", + "eslint": "^8.53.0", + "eslint-config-prettier": "^9.0.0", + "eslint-plugin-svelte": "^2.35.0", + "prettier": "^3.0.3", + "prettier-plugin-svelte": "^3.0.3", + "svelte": "^4.2.2", + "svelte-check": "^3.5.2", + "tslib": "^2.6.2", + "typescript": "^5.2.2", + "vite": "^4.5.0" }, "type": "module", "dependencies": { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 449ca1d3..9a622802 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -16,10 +16,10 @@ importers: version: registry.npmjs.org/@changesets/cli@2.25.0 '@typescript-eslint/eslint-plugin': specifier: latest - version: registry.npmjs.org/@typescript-eslint/eslint-plugin@6.9.0(@typescript-eslint/parser@6.9.0)(eslint@8.43.0)(typescript@5.1.3) + version: registry.npmjs.org/@typescript-eslint/eslint-plugin@6.10.0(@typescript-eslint/parser@6.10.0)(eslint@8.43.0)(typescript@5.1.3) '@typescript-eslint/parser': specifier: latest - version: registry.npmjs.org/@typescript-eslint/parser@6.9.0(eslint@8.43.0)(typescript@5.1.3) + version: registry.npmjs.org/@typescript-eslint/parser@6.10.0(eslint@8.43.0)(typescript@5.1.3) concurrently: specifier: ^7.6.0 version: registry.npmjs.org/concurrently@7.6.0 @@ -61,10 +61,10 @@ importers: dependencies: '@astrojs/react': specifier: ^3.0.2 - version: registry.npmjs.org/@astrojs/react@3.0.2(@types/react-dom@18.2.8)(@types/react@18.2.24)(react-dom@18.2.0)(react@18.2.0)(vite@4.4.9) + version: registry.npmjs.org/@astrojs/react@3.0.2(@types/react-dom@18.2.8)(@types/react@18.2.24)(react-dom@18.2.0)(react@18.2.0)(vite@4.5.0) '@astrojs/svelte': specifier: ^4.0.2 - version: registry.npmjs.org/@astrojs/svelte@4.0.2(astro@3.2.2)(svelte@4.2.1)(typescript@5.1.3)(vite@4.4.9) + version: registry.npmjs.org/@astrojs/svelte@4.0.2(astro@3.2.2)(svelte@4.2.1)(typescript@5.2.2)(vite@4.5.0) '@types/react': specifier: ^18.2.24 version: registry.npmjs.org/@types/react@18.2.24 @@ -161,47 +161,47 @@ importers: version: link:../../packages/svelte devDependencies: '@sveltejs/adapter-auto': - specifier: ^2.0.0 - version: registry.npmjs.org/@sveltejs/adapter-auto@2.1.0(@sveltejs/kit@1.22.6) + specifier: ^2.1.1 + version: registry.npmjs.org/@sveltejs/adapter-auto@2.1.1(@sveltejs/kit@1.27.3) '@sveltejs/kit': - specifier: ^1.20.4 - version: registry.npmjs.org/@sveltejs/kit@1.22.6(svelte@4.2.1)(vite@4.4.9) + specifier: ^1.27.3 + version: registry.npmjs.org/@sveltejs/kit@1.27.3(svelte@4.2.2)(vite@4.5.0) '@typescript-eslint/eslint-plugin': - specifier: ^5.45.0 - version: registry.npmjs.org/@typescript-eslint/eslint-plugin@5.60.0(@typescript-eslint/parser@5.60.0)(eslint@8.43.0)(typescript@5.1.3) + specifier: ^6.10.0 + version: registry.npmjs.org/@typescript-eslint/eslint-plugin@6.10.0(@typescript-eslint/parser@6.10.0)(eslint@8.53.0)(typescript@5.2.2) '@typescript-eslint/parser': - specifier: ^5.45.0 - version: registry.npmjs.org/@typescript-eslint/parser@5.60.0(eslint@8.43.0)(typescript@5.1.3) + specifier: ^6.10.0 + version: registry.npmjs.org/@typescript-eslint/parser@6.10.0(eslint@8.53.0)(typescript@5.2.2) eslint: - specifier: ^8.28.0 - version: registry.npmjs.org/eslint@8.43.0 + specifier: ^8.53.0 + version: registry.npmjs.org/eslint@8.53.0 eslint-config-prettier: - specifier: ^8.5.0 - version: registry.npmjs.org/eslint-config-prettier@8.8.0(eslint@8.43.0) + specifier: ^9.0.0 + version: registry.npmjs.org/eslint-config-prettier@9.0.0(eslint@8.53.0) eslint-plugin-svelte: - specifier: ^2.30.0 - version: registry.npmjs.org/eslint-plugin-svelte@2.31.1(eslint@8.43.0)(svelte@4.2.1) + specifier: ^2.35.0 + version: registry.npmjs.org/eslint-plugin-svelte@2.35.0(eslint@8.53.0)(svelte@4.2.2) prettier: - specifier: ^2.8.0 - version: registry.npmjs.org/prettier@2.8.8 + specifier: ^3.0.3 + version: registry.npmjs.org/prettier@3.0.3 prettier-plugin-svelte: - specifier: ^2.10.1 - version: registry.npmjs.org/prettier-plugin-svelte@2.10.1(prettier@2.8.8)(svelte@4.2.1) + specifier: ^3.0.3 + version: registry.npmjs.org/prettier-plugin-svelte@3.0.3(prettier@3.0.3)(svelte@4.2.2) svelte: - specifier: ^4.0.5 - version: registry.npmjs.org/svelte@4.2.1 + specifier: ^4.2.2 + version: registry.npmjs.org/svelte@4.2.2 svelte-check: - specifier: ^3.4.3 - version: registry.npmjs.org/svelte-check@3.5.0(postcss@8.4.31)(svelte@4.2.1) + specifier: ^3.5.2 + version: registry.npmjs.org/svelte-check@3.5.2(postcss@8.4.31)(svelte@4.2.2) tslib: - specifier: ^2.4.1 - version: registry.npmjs.org/tslib@2.5.3 + specifier: ^2.6.2 + version: registry.npmjs.org/tslib@2.6.2 typescript: - specifier: ^5.0.0 - version: registry.npmjs.org/typescript@5.1.3 + specifier: ^5.2.2 + version: registry.npmjs.org/typescript@5.2.2 vite: - specifier: ^4.4.2 - version: registry.npmjs.org/vite@4.4.9 + specifier: ^4.5.0 + version: registry.npmjs.org/vite@4.5.0 packages/react: dependencies: @@ -305,7 +305,7 @@ importers: version: registry.npmjs.org/@sveltejs/adapter-auto@2.1.0(@sveltejs/kit@1.22.6) '@sveltejs/kit': specifier: ^1.22.6 - version: registry.npmjs.org/@sveltejs/kit@1.22.6(svelte@4.2.1)(vite@4.4.9) + version: registry.npmjs.org/@sveltejs/kit@1.22.6(svelte@4.2.1)(vite@4.5.0) '@sveltejs/package': specifier: ^2.2.1 version: registry.npmjs.org/@sveltejs/package@2.2.1(svelte@4.2.1)(typescript@5.1.3) @@ -498,7 +498,7 @@ packages: '@astrojs/prism': registry.npmjs.org/@astrojs/prism@3.0.0 astro: registry.npmjs.org/astro@3.2.2 github-slugger: registry.npmjs.org/github-slugger@2.0.0 - import-meta-resolve: registry.npmjs.org/import-meta-resolve@3.0.0 + import-meta-resolve: registry.npmjs.org/import-meta-resolve@3.1.1 mdast-util-definitions: registry.npmjs.org/mdast-util-definitions@6.0.0 rehype-raw: registry.npmjs.org/rehype-raw@6.1.1 rehype-stringify: registry.npmjs.org/rehype-stringify@9.0.4 @@ -523,7 +523,7 @@ packages: prismjs: registry.npmjs.org/prismjs@1.29.0 dev: false - registry.npmjs.org/@astrojs/react@3.0.2(@types/react-dom@18.2.8)(@types/react@18.2.24)(react-dom@18.2.0)(react@18.2.0)(vite@4.4.9): + registry.npmjs.org/@astrojs/react@3.0.2(@types/react-dom@18.2.8)(@types/react@18.2.24)(react-dom@18.2.0)(react@18.2.0)(vite@4.5.0): resolution: {integrity: sha512-aooNIuQxTg+IWGMZPuIEwBeBi4/TCPCMsr3714zuLjAjukVd5ZrX/bCNxJqDWU4HNwUm4XFU1OhcEvYOHa5uMQ==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@astrojs/react/-/react-3.0.2.tgz} id: registry.npmjs.org/@astrojs/react/3.0.2 name: '@astrojs/react' @@ -537,7 +537,7 @@ packages: dependencies: '@types/react': registry.npmjs.org/@types/react@18.2.24 '@types/react-dom': registry.npmjs.org/@types/react-dom@18.2.8 - '@vitejs/plugin-react': registry.npmjs.org/@vitejs/plugin-react@4.0.4(vite@4.4.9) + '@vitejs/plugin-react': registry.npmjs.org/@vitejs/plugin-react@4.0.4(vite@4.5.0) react: registry.npmjs.org/react@18.2.0 react-dom: registry.npmjs.org/react-dom@18.2.0(react@18.2.0) ultrahtml: registry.npmjs.org/ultrahtml@1.5.2 @@ -546,7 +546,7 @@ packages: - vite dev: false - registry.npmjs.org/@astrojs/svelte@4.0.2(astro@3.2.2)(svelte@4.2.1)(typescript@5.1.3)(vite@4.4.9): + registry.npmjs.org/@astrojs/svelte@4.0.2(astro@3.2.2)(svelte@4.2.1)(typescript@5.2.2)(vite@4.5.0): resolution: {integrity: sha512-XB9Sexq+iW5aUpctDk6zuKHbWIAuPlAnZKbfgaS9VOaOUtx1t12crP9YoKEVcTifXYgoRuWWfeEAm2I8pYlLIQ==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@astrojs/svelte/-/svelte-4.0.2.tgz} id: registry.npmjs.org/@astrojs/svelte/4.0.2 name: '@astrojs/svelte' @@ -556,10 +556,10 @@ packages: astro: ^3.0.11 svelte: ^3.55.0 || ^4.0.0 dependencies: - '@sveltejs/vite-plugin-svelte': registry.npmjs.org/@sveltejs/vite-plugin-svelte@2.4.6(svelte@4.2.1)(vite@4.4.9) + '@sveltejs/vite-plugin-svelte': registry.npmjs.org/@sveltejs/vite-plugin-svelte@2.4.6(svelte@4.2.1)(vite@4.5.0) astro: registry.npmjs.org/astro@3.2.2 svelte: registry.npmjs.org/svelte@4.2.1 - svelte2tsx: registry.npmjs.org/svelte2tsx@0.6.23(svelte@4.2.1)(typescript@5.1.3) + svelte2tsx: registry.npmjs.org/svelte2tsx@0.6.23(svelte@4.2.1)(typescript@5.2.2) transitivePeerDependencies: - supports-color - typescript @@ -1671,6 +1671,26 @@ packages: eslint-visitor-keys: registry.npmjs.org/eslint-visitor-keys@3.4.3 dev: true + registry.npmjs.org/@eslint-community/eslint-utils@4.4.0(eslint@8.53.0): + resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz} + id: registry.npmjs.org/@eslint-community/eslint-utils/4.4.0 + name: '@eslint-community/eslint-utils' + version: 4.4.0 + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + dependencies: + eslint: registry.npmjs.org/eslint@8.53.0 + eslint-visitor-keys: registry.npmjs.org/eslint-visitor-keys@3.4.3 + dev: true + + registry.npmjs.org/@eslint-community/regexpp@4.10.0: + resolution: {integrity: sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz} + name: '@eslint-community/regexpp' + version: 4.10.0 + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + dev: true + registry.npmjs.org/@eslint-community/regexpp@4.9.1: resolution: {integrity: sha512-Y27x+MBLjXa+0JWDhykM3+JE+il3kHKAEqabfEWq3SDhZjLYb6/BHL/JKFnH3fe207JaXkyDo685Oc2Glt6ifA==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.9.1.tgz} name: '@eslint-community/regexpp' @@ -1697,6 +1717,25 @@ packages: - supports-color dev: true + registry.npmjs.org/@eslint/eslintrc@2.1.3: + resolution: {integrity: sha512-yZzuIG+jnVu6hNSzFEN07e8BxF3uAzYtQb6uDkaYZLo6oYZDCq454c5kB8zxnzfCYyP4MIuyBn10L0DqwujTmA==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.3.tgz} + name: '@eslint/eslintrc' + version: 2.1.3 + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + ajv: registry.npmjs.org/ajv@6.12.6 + debug: registry.npmjs.org/debug@4.3.4(supports-color@8.1.1) + espree: registry.npmjs.org/espree@9.6.1 + globals: registry.npmjs.org/globals@13.23.0 + ignore: registry.npmjs.org/ignore@5.2.4 + import-fresh: registry.npmjs.org/import-fresh@3.3.0 + js-yaml: registry.npmjs.org/js-yaml@4.1.0 + minimatch: registry.npmjs.org/minimatch@3.1.2 + strip-json-comments: registry.npmjs.org/strip-json-comments@3.1.1 + transitivePeerDependencies: + - supports-color + dev: true + registry.npmjs.org/@eslint/js@8.43.0: resolution: {integrity: sha512-s2UHCoiXfxMvmfzqoN+vrQ84ahUSYde9qNO1MdxmoEhyHWsfmwOpFlwYV+ePJEVc7gFnATGUi376WowX1N7tFg==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@eslint/js/-/js-8.43.0.tgz} name: '@eslint/js' @@ -1704,12 +1743,18 @@ packages: engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true + registry.npmjs.org/@eslint/js@8.53.0: + resolution: {integrity: sha512-Kn7K8dx/5U6+cT1yEhpX1w4PCSg0M+XyRILPgvwcEBjerFWCwQj5sbr3/VmxqV0JGHCBCzyd6LxypEuehypY1w==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@eslint/js/-/js-8.53.0.tgz} + name: '@eslint/js' + version: 8.53.0 + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dev: true + registry.npmjs.org/@fastify/busboy@2.0.0: resolution: {integrity: sha512-JUFJad5lv7jxj926GPgymrWQxxjPYuJNiNjNMzqT+HiuP6Vl3dk5xzG+8sTX96np0ZAluvaMzPsjhHZ5rNuNQQ==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@fastify/busboy/-/busboy-2.0.0.tgz} name: '@fastify/busboy' version: 2.0.0 engines: {node: '>=14'} - dev: false registry.npmjs.org/@hapi/hoek@9.3.0: resolution: {integrity: sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz} @@ -2000,11 +2045,23 @@ packages: peerDependencies: '@sveltejs/kit': ^1.0.0 dependencies: - '@sveltejs/kit': registry.npmjs.org/@sveltejs/kit@1.22.6(svelte@4.2.1)(vite@4.4.9) + '@sveltejs/kit': registry.npmjs.org/@sveltejs/kit@1.22.6(svelte@4.2.1)(vite@4.5.0) import-meta-resolve: registry.npmjs.org/import-meta-resolve@3.0.0 dev: true - registry.npmjs.org/@sveltejs/kit@1.22.6(svelte@4.2.1)(vite@4.4.9): + registry.npmjs.org/@sveltejs/adapter-auto@2.1.1(@sveltejs/kit@1.27.3): + resolution: {integrity: sha512-nzi6x/7/3Axh5VKQ8Eed3pYxastxoa06Y/bFhWb7h3Nu+nGRVxKAy3+hBJgmPCwWScy8n0TsstZjSVKfyrIHkg==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@sveltejs/adapter-auto/-/adapter-auto-2.1.1.tgz} + id: registry.npmjs.org/@sveltejs/adapter-auto/2.1.1 + name: '@sveltejs/adapter-auto' + version: 2.1.1 + peerDependencies: + '@sveltejs/kit': ^1.0.0 + dependencies: + '@sveltejs/kit': registry.npmjs.org/@sveltejs/kit@1.27.3(svelte@4.2.2)(vite@4.5.0) + import-meta-resolve: registry.npmjs.org/import-meta-resolve@4.0.0 + dev: true + + registry.npmjs.org/@sveltejs/kit@1.22.6(svelte@4.2.1)(vite@4.5.0): resolution: {integrity: sha512-SDKxI/QpsReCwIn5czjT53fKlPBybbmMk67d317gUqfeORroBAFN1Z6s/x0E1JYi+04i7kKllS+Sz9wVfmUkAQ==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@sveltejs/kit/-/kit-1.22.6.tgz} id: registry.npmjs.org/@sveltejs/kit/1.22.6 name: '@sveltejs/kit' @@ -2016,7 +2073,7 @@ packages: svelte: ^3.54.0 || ^4.0.0-next.0 vite: ^4.0.0 dependencies: - '@sveltejs/vite-plugin-svelte': registry.npmjs.org/@sveltejs/vite-plugin-svelte@2.4.6(svelte@4.2.1)(vite@4.4.9) + '@sveltejs/vite-plugin-svelte': registry.npmjs.org/@sveltejs/vite-plugin-svelte@2.4.6(svelte@4.2.1)(vite@4.5.0) '@types/cookie': registry.npmjs.org/@types/cookie@0.5.3 cookie: registry.npmjs.org/cookie@0.5.0 devalue: registry.npmjs.org/devalue@4.3.2 @@ -2029,7 +2086,38 @@ packages: sirv: registry.npmjs.org/sirv@2.0.3 svelte: registry.npmjs.org/svelte@4.2.1 undici: registry.npmjs.org/undici@5.23.0 - vite: registry.npmjs.org/vite@4.4.9 + vite: registry.npmjs.org/vite@4.5.0 + transitivePeerDependencies: + - supports-color + dev: true + + registry.npmjs.org/@sveltejs/kit@1.27.3(svelte@4.2.2)(vite@4.5.0): + resolution: {integrity: sha512-pd7qwX6ww5noA0/FLk45B0aKUeOXWR+pfZsGTrv3dRmj3lTmnki9UTmTdWzHJGrje+BBkGUZHfgGrsSOQQBQpQ==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@sveltejs/kit/-/kit-1.27.3.tgz} + id: registry.npmjs.org/@sveltejs/kit/1.27.3 + name: '@sveltejs/kit' + version: 1.27.3 + engines: {node: ^16.14 || >=18} + hasBin: true + requiresBuild: true + peerDependencies: + svelte: ^3.54.0 || ^4.0.0-next.0 + vite: ^4.0.0 + dependencies: + '@sveltejs/vite-plugin-svelte': registry.npmjs.org/@sveltejs/vite-plugin-svelte@2.4.6(svelte@4.2.2)(vite@4.5.0) + '@types/cookie': registry.npmjs.org/@types/cookie@0.5.4 + cookie: registry.npmjs.org/cookie@0.5.0 + devalue: registry.npmjs.org/devalue@4.3.2 + esm-env: registry.npmjs.org/esm-env@1.0.0 + kleur: registry.npmjs.org/kleur@4.1.5 + magic-string: registry.npmjs.org/magic-string@0.30.5 + mrmime: registry.npmjs.org/mrmime@1.0.1 + sade: registry.npmjs.org/sade@1.8.1 + set-cookie-parser: registry.npmjs.org/set-cookie-parser@2.6.0 + sirv: registry.npmjs.org/sirv@2.0.3 + svelte: registry.npmjs.org/svelte@4.2.2 + tiny-glob: registry.npmjs.org/tiny-glob@0.2.9 + undici: registry.npmjs.org/undici@5.26.5 + vite: registry.npmjs.org/vite@4.5.0 transitivePeerDependencies: - supports-color dev: true @@ -2054,7 +2142,7 @@ packages: - typescript dev: true - registry.npmjs.org/@sveltejs/vite-plugin-svelte-inspector@1.0.4(@sveltejs/vite-plugin-svelte@2.4.6)(svelte@4.2.1)(vite@4.4.9): + registry.npmjs.org/@sveltejs/vite-plugin-svelte-inspector@1.0.4(@sveltejs/vite-plugin-svelte@2.4.6)(svelte@4.2.1)(vite@4.5.0): resolution: {integrity: sha512-zjiuZ3yydBtwpF3bj0kQNV0YXe+iKE545QGZVTaylW3eAzFr+pJ/cwK8lZEaRp4JtaJXhD5DyWAV4AxLh6DgaQ==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@sveltejs/vite-plugin-svelte-inspector/-/vite-plugin-svelte-inspector-1.0.4.tgz} id: registry.npmjs.org/@sveltejs/vite-plugin-svelte-inspector/1.0.4 name: '@sveltejs/vite-plugin-svelte-inspector' @@ -2065,14 +2153,33 @@ packages: svelte: ^3.54.0 || ^4.0.0 vite: ^4.0.0 dependencies: - '@sveltejs/vite-plugin-svelte': registry.npmjs.org/@sveltejs/vite-plugin-svelte@2.4.6(svelte@4.2.1)(vite@4.4.9) + '@sveltejs/vite-plugin-svelte': registry.npmjs.org/@sveltejs/vite-plugin-svelte@2.4.6(svelte@4.2.1)(vite@4.5.0) debug: registry.npmjs.org/debug@4.3.4(supports-color@8.1.1) svelte: registry.npmjs.org/svelte@4.2.1 - vite: registry.npmjs.org/vite@4.4.9 + vite: registry.npmjs.org/vite@4.5.0 transitivePeerDependencies: - supports-color - registry.npmjs.org/@sveltejs/vite-plugin-svelte@2.4.6(svelte@4.2.1)(vite@4.4.9): + registry.npmjs.org/@sveltejs/vite-plugin-svelte-inspector@1.0.4(@sveltejs/vite-plugin-svelte@2.4.6)(svelte@4.2.2)(vite@4.5.0): + resolution: {integrity: sha512-zjiuZ3yydBtwpF3bj0kQNV0YXe+iKE545QGZVTaylW3eAzFr+pJ/cwK8lZEaRp4JtaJXhD5DyWAV4AxLh6DgaQ==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@sveltejs/vite-plugin-svelte-inspector/-/vite-plugin-svelte-inspector-1.0.4.tgz} + id: registry.npmjs.org/@sveltejs/vite-plugin-svelte-inspector/1.0.4 + name: '@sveltejs/vite-plugin-svelte-inspector' + version: 1.0.4 + engines: {node: ^14.18.0 || >= 16} + peerDependencies: + '@sveltejs/vite-plugin-svelte': ^2.2.0 + svelte: ^3.54.0 || ^4.0.0 + vite: ^4.0.0 + dependencies: + '@sveltejs/vite-plugin-svelte': registry.npmjs.org/@sveltejs/vite-plugin-svelte@2.4.6(svelte@4.2.2)(vite@4.5.0) + debug: registry.npmjs.org/debug@4.3.4(supports-color@8.1.1) + svelte: registry.npmjs.org/svelte@4.2.2 + vite: registry.npmjs.org/vite@4.5.0 + transitivePeerDependencies: + - supports-color + dev: true + + registry.npmjs.org/@sveltejs/vite-plugin-svelte@2.4.6(svelte@4.2.1)(vite@4.5.0): resolution: {integrity: sha512-zO79p0+DZnXPnF0ltIigWDx/ux7Ni+HRaFOw720Qeivc1azFUrJxTl0OryXVibYNx1hCboGia1NRV3x8RNv4cA==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@sveltejs/vite-plugin-svelte/-/vite-plugin-svelte-2.4.6.tgz} id: registry.npmjs.org/@sveltejs/vite-plugin-svelte/2.4.6 name: '@sveltejs/vite-plugin-svelte' @@ -2082,18 +2189,41 @@ packages: svelte: ^3.54.0 || ^4.0.0 vite: ^4.0.0 dependencies: - '@sveltejs/vite-plugin-svelte-inspector': registry.npmjs.org/@sveltejs/vite-plugin-svelte-inspector@1.0.4(@sveltejs/vite-plugin-svelte@2.4.6)(svelte@4.2.1)(vite@4.4.9) + '@sveltejs/vite-plugin-svelte-inspector': registry.npmjs.org/@sveltejs/vite-plugin-svelte-inspector@1.0.4(@sveltejs/vite-plugin-svelte@2.4.6)(svelte@4.2.1)(vite@4.5.0) debug: registry.npmjs.org/debug@4.3.4(supports-color@8.1.1) deepmerge: registry.npmjs.org/deepmerge@4.3.1 kleur: registry.npmjs.org/kleur@4.1.5 magic-string: registry.npmjs.org/magic-string@0.30.5 svelte: registry.npmjs.org/svelte@4.2.1 svelte-hmr: registry.npmjs.org/svelte-hmr@0.15.3(svelte@4.2.1) - vite: registry.npmjs.org/vite@4.4.9 - vitefu: registry.npmjs.org/vitefu@0.2.5(vite@4.4.9) + vite: registry.npmjs.org/vite@4.5.0 + vitefu: registry.npmjs.org/vitefu@0.2.5(vite@4.5.0) transitivePeerDependencies: - supports-color + registry.npmjs.org/@sveltejs/vite-plugin-svelte@2.4.6(svelte@4.2.2)(vite@4.5.0): + resolution: {integrity: sha512-zO79p0+DZnXPnF0ltIigWDx/ux7Ni+HRaFOw720Qeivc1azFUrJxTl0OryXVibYNx1hCboGia1NRV3x8RNv4cA==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@sveltejs/vite-plugin-svelte/-/vite-plugin-svelte-2.4.6.tgz} + id: registry.npmjs.org/@sveltejs/vite-plugin-svelte/2.4.6 + name: '@sveltejs/vite-plugin-svelte' + version: 2.4.6 + engines: {node: ^14.18.0 || >= 16} + peerDependencies: + svelte: ^3.54.0 || ^4.0.0 + vite: ^4.0.0 + dependencies: + '@sveltejs/vite-plugin-svelte-inspector': registry.npmjs.org/@sveltejs/vite-plugin-svelte-inspector@1.0.4(@sveltejs/vite-plugin-svelte@2.4.6)(svelte@4.2.2)(vite@4.5.0) + debug: registry.npmjs.org/debug@4.3.4(supports-color@8.1.1) + deepmerge: registry.npmjs.org/deepmerge@4.3.1 + kleur: registry.npmjs.org/kleur@4.1.5 + magic-string: registry.npmjs.org/magic-string@0.30.5 + svelte: registry.npmjs.org/svelte@4.2.2 + svelte-hmr: registry.npmjs.org/svelte-hmr@0.15.3(svelte@4.2.2) + vite: registry.npmjs.org/vite@4.5.0 + vitefu: registry.npmjs.org/vitefu@0.2.5(vite@4.5.0) + transitivePeerDependencies: + - supports-color + dev: true + registry.npmjs.org/@swc/core-darwin-arm64@1.3.94: resolution: {integrity: sha512-KNuE6opIy/wAXiGUWLhGWhCG3wA/AdjG6eYkv6dstrAURLaQMAoD8vDfVm8pxS8FA8Kx+0Z4QiDNPqk5aKIsqg==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.3.94.tgz} name: '@swc/core-darwin-arm64' @@ -2293,6 +2423,12 @@ packages: version: 0.5.3 dev: true + registry.npmjs.org/@types/cookie@0.5.4: + resolution: {integrity: sha512-7z/eR6O859gyWIAjuvBWFzNURmf2oPBmJlfVWkwehU5nzIyjwBsTh7WMmEEV4JFnHuQ3ex4oyTvfKzcyJVDBNA==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@types/cookie/-/cookie-0.5.4.tgz} + name: '@types/cookie' + version: 0.5.4 + dev: true + registry.npmjs.org/@types/d3-array@3.0.9: resolution: {integrity: sha512-mZowFN3p64ajCJJ4riVYlOjNlBJv3hctgAY01pjw3qTnJePD8s9DZmYDzhHKvzfCYvdjwylkU38+Vdt7Cu2FDA==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@types/d3-array/-/d3-array-3.0.9.tgz} name: '@types/d3-array' @@ -2581,6 +2717,12 @@ packages: version: 7.0.14 dev: true + registry.npmjs.org/@types/json-schema@7.0.15: + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz} + name: '@types/json-schema' + version: 7.0.15 + dev: true + registry.npmjs.org/@types/json5@0.0.30: resolution: {integrity: sha512-sqm9g7mHlPY/43fcSNrCYfOeX9zkTTK+euO5E6+CVijSMm5tTjkVdwdqRkY3ljjIAf8679vps5jKUoJBCLsMDA==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@types/json5/-/json5-0.0.30.tgz} name: '@types/json5' @@ -2673,6 +2815,12 @@ packages: version: 2.0.8 dev: true + registry.npmjs.org/@types/pug@2.0.9: + resolution: {integrity: sha512-Yg4LkgFYvn1faISbDNWmcAC1XoDT8IoMUFspp5mnagKk+UvD2N0IWt5A7GRdMubsNWqgCLmrkf8rXkzNqb4szA==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@types/pug/-/pug-2.0.9.tgz} + name: '@types/pug' + version: 2.0.9 + dev: true + registry.npmjs.org/@types/react-dom@18.2.8: resolution: {integrity: sha512-bAIvO5lN/U8sPGvs1Xm61rlRHHaq5rp5N3kp9C+NJ/Q41P8iqjkXSu0+/qu8POsjH9pNWb0OYabFez7taP7omw==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.8.tgz} name: '@types/react-dom' @@ -2783,11 +2931,11 @@ packages: - supports-color dev: true - registry.npmjs.org/@typescript-eslint/eslint-plugin@6.9.0(@typescript-eslint/parser@6.9.0)(eslint@8.43.0)(typescript@5.1.3): - resolution: {integrity: sha512-lgX7F0azQwRPB7t7WAyeHWVfW1YJ9NIgd9mvGhfQpRY56X6AVf8mwM8Wol+0z4liE7XX3QOt8MN1rUKCfSjRIA==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.9.0.tgz} - id: registry.npmjs.org/@typescript-eslint/eslint-plugin/6.9.0 + registry.npmjs.org/@typescript-eslint/eslint-plugin@6.10.0(@typescript-eslint/parser@6.10.0)(eslint@8.43.0)(typescript@5.1.3): + resolution: {integrity: sha512-uoLj4g2OTL8rfUQVx2AFO1hp/zja1wABJq77P6IclQs6I/m9GLrm7jCdgzZkvWdDCQf1uEvoa8s8CupsgWQgVg==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.10.0.tgz} + id: registry.npmjs.org/@typescript-eslint/eslint-plugin/6.10.0 name: '@typescript-eslint/eslint-plugin' - version: 6.9.0 + version: 6.10.0 engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: '@typescript-eslint/parser': ^6.0.0 || ^6.0.0-alpha @@ -2797,12 +2945,12 @@ packages: typescript: optional: true dependencies: - '@eslint-community/regexpp': registry.npmjs.org/@eslint-community/regexpp@4.9.1 - '@typescript-eslint/parser': registry.npmjs.org/@typescript-eslint/parser@6.9.0(eslint@8.43.0)(typescript@5.1.3) - '@typescript-eslint/scope-manager': registry.npmjs.org/@typescript-eslint/scope-manager@6.9.0 - '@typescript-eslint/type-utils': registry.npmjs.org/@typescript-eslint/type-utils@6.9.0(eslint@8.43.0)(typescript@5.1.3) - '@typescript-eslint/utils': registry.npmjs.org/@typescript-eslint/utils@6.9.0(eslint@8.43.0)(typescript@5.1.3) - '@typescript-eslint/visitor-keys': registry.npmjs.org/@typescript-eslint/visitor-keys@6.9.0 + '@eslint-community/regexpp': registry.npmjs.org/@eslint-community/regexpp@4.10.0 + '@typescript-eslint/parser': registry.npmjs.org/@typescript-eslint/parser@6.10.0(eslint@8.43.0)(typescript@5.1.3) + '@typescript-eslint/scope-manager': registry.npmjs.org/@typescript-eslint/scope-manager@6.10.0 + '@typescript-eslint/type-utils': registry.npmjs.org/@typescript-eslint/type-utils@6.10.0(eslint@8.43.0)(typescript@5.1.3) + '@typescript-eslint/utils': registry.npmjs.org/@typescript-eslint/utils@6.10.0(eslint@8.43.0)(typescript@5.1.3) + '@typescript-eslint/visitor-keys': registry.npmjs.org/@typescript-eslint/visitor-keys@6.10.0 debug: registry.npmjs.org/debug@4.3.4(supports-color@8.1.1) eslint: registry.npmjs.org/eslint@8.43.0 graphemer: registry.npmjs.org/graphemer@1.4.0 @@ -2815,6 +2963,38 @@ packages: - supports-color dev: true + registry.npmjs.org/@typescript-eslint/eslint-plugin@6.10.0(@typescript-eslint/parser@6.10.0)(eslint@8.53.0)(typescript@5.2.2): + resolution: {integrity: sha512-uoLj4g2OTL8rfUQVx2AFO1hp/zja1wABJq77P6IclQs6I/m9GLrm7jCdgzZkvWdDCQf1uEvoa8s8CupsgWQgVg==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.10.0.tgz} + id: registry.npmjs.org/@typescript-eslint/eslint-plugin/6.10.0 + name: '@typescript-eslint/eslint-plugin' + version: 6.10.0 + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + '@typescript-eslint/parser': ^6.0.0 || ^6.0.0-alpha + eslint: ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@eslint-community/regexpp': registry.npmjs.org/@eslint-community/regexpp@4.10.0 + '@typescript-eslint/parser': registry.npmjs.org/@typescript-eslint/parser@6.10.0(eslint@8.53.0)(typescript@5.2.2) + '@typescript-eslint/scope-manager': registry.npmjs.org/@typescript-eslint/scope-manager@6.10.0 + '@typescript-eslint/type-utils': registry.npmjs.org/@typescript-eslint/type-utils@6.10.0(eslint@8.53.0)(typescript@5.2.2) + '@typescript-eslint/utils': registry.npmjs.org/@typescript-eslint/utils@6.10.0(eslint@8.53.0)(typescript@5.2.2) + '@typescript-eslint/visitor-keys': registry.npmjs.org/@typescript-eslint/visitor-keys@6.10.0 + debug: registry.npmjs.org/debug@4.3.4(supports-color@8.1.1) + eslint: registry.npmjs.org/eslint@8.53.0 + graphemer: registry.npmjs.org/graphemer@1.4.0 + ignore: registry.npmjs.org/ignore@5.2.4 + natural-compare: registry.npmjs.org/natural-compare@1.4.0 + semver: registry.npmjs.org/semver@7.5.4 + ts-api-utils: registry.npmjs.org/ts-api-utils@1.0.3(typescript@5.2.2) + typescript: registry.npmjs.org/typescript@5.2.2 + transitivePeerDependencies: + - supports-color + dev: true + registry.npmjs.org/@typescript-eslint/parser@5.60.0(eslint@8.43.0)(typescript@5.1.3): resolution: {integrity: sha512-jBONcBsDJ9UoTWrARkRRCgDz6wUggmH5RpQVlt7BimSwaTkTjwypGzKORXbR4/2Hqjk9hgwlon2rVQAjWNpkyQ==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.60.0.tgz} id: registry.npmjs.org/@typescript-eslint/parser/5.60.0 @@ -2838,11 +3018,11 @@ packages: - supports-color dev: true - registry.npmjs.org/@typescript-eslint/parser@6.9.0(eslint@8.43.0)(typescript@5.1.3): - resolution: {integrity: sha512-GZmjMh4AJ/5gaH4XF2eXA8tMnHWP+Pm1mjQR2QN4Iz+j/zO04b9TOvJYOX2sCNIQHtRStKTxRY1FX7LhpJT4Gw==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.9.0.tgz} - id: registry.npmjs.org/@typescript-eslint/parser/6.9.0 + registry.npmjs.org/@typescript-eslint/parser@6.10.0(eslint@8.43.0)(typescript@5.1.3): + resolution: {integrity: sha512-+sZwIj+s+io9ozSxIWbNB5873OSdfeBEH/FR0re14WLI6BaKuSOnnwCJ2foUiu8uXf4dRp1UqHP0vrZ1zXGrog==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.10.0.tgz} + id: registry.npmjs.org/@typescript-eslint/parser/6.10.0 name: '@typescript-eslint/parser' - version: 6.9.0 + version: 6.10.0 engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: eslint: ^7.0.0 || ^8.0.0 @@ -2851,10 +3031,10 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/scope-manager': registry.npmjs.org/@typescript-eslint/scope-manager@6.9.0 - '@typescript-eslint/types': registry.npmjs.org/@typescript-eslint/types@6.9.0 - '@typescript-eslint/typescript-estree': registry.npmjs.org/@typescript-eslint/typescript-estree@6.9.0(typescript@5.1.3) - '@typescript-eslint/visitor-keys': registry.npmjs.org/@typescript-eslint/visitor-keys@6.9.0 + '@typescript-eslint/scope-manager': registry.npmjs.org/@typescript-eslint/scope-manager@6.10.0 + '@typescript-eslint/types': registry.npmjs.org/@typescript-eslint/types@6.10.0 + '@typescript-eslint/typescript-estree': registry.npmjs.org/@typescript-eslint/typescript-estree@6.10.0(typescript@5.1.3) + '@typescript-eslint/visitor-keys': registry.npmjs.org/@typescript-eslint/visitor-keys@6.10.0 debug: registry.npmjs.org/debug@4.3.4(supports-color@8.1.1) eslint: registry.npmjs.org/eslint@8.43.0 typescript: registry.npmjs.org/typescript@5.1.3 @@ -2862,6 +3042,30 @@ packages: - supports-color dev: true + registry.npmjs.org/@typescript-eslint/parser@6.10.0(eslint@8.53.0)(typescript@5.2.2): + resolution: {integrity: sha512-+sZwIj+s+io9ozSxIWbNB5873OSdfeBEH/FR0re14WLI6BaKuSOnnwCJ2foUiu8uXf4dRp1UqHP0vrZ1zXGrog==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.10.0.tgz} + id: registry.npmjs.org/@typescript-eslint/parser/6.10.0 + name: '@typescript-eslint/parser' + version: 6.10.0 + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/scope-manager': registry.npmjs.org/@typescript-eslint/scope-manager@6.10.0 + '@typescript-eslint/types': registry.npmjs.org/@typescript-eslint/types@6.10.0 + '@typescript-eslint/typescript-estree': registry.npmjs.org/@typescript-eslint/typescript-estree@6.10.0(typescript@5.2.2) + '@typescript-eslint/visitor-keys': registry.npmjs.org/@typescript-eslint/visitor-keys@6.10.0 + debug: registry.npmjs.org/debug@4.3.4(supports-color@8.1.1) + eslint: registry.npmjs.org/eslint@8.53.0 + typescript: registry.npmjs.org/typescript@5.2.2 + transitivePeerDependencies: + - supports-color + dev: true + registry.npmjs.org/@typescript-eslint/scope-manager@5.60.0: resolution: {integrity: sha512-hakuzcxPwXi2ihf9WQu1BbRj1e/Pd8ZZwVTG9kfbxAMZstKz8/9OoexIwnmLzShtsdap5U/CoQGRCWlSuPbYxQ==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.60.0.tgz} name: '@typescript-eslint/scope-manager' @@ -2872,14 +3076,14 @@ packages: '@typescript-eslint/visitor-keys': registry.npmjs.org/@typescript-eslint/visitor-keys@5.60.0 dev: true - registry.npmjs.org/@typescript-eslint/scope-manager@6.9.0: - resolution: {integrity: sha512-1R8A9Mc39n4pCCz9o79qRO31HGNDvC7UhPhv26TovDsWPBDx+Sg3rOZdCELIA3ZmNoWAuxaMOT7aWtGRSYkQxw==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.9.0.tgz} + registry.npmjs.org/@typescript-eslint/scope-manager@6.10.0: + resolution: {integrity: sha512-TN/plV7dzqqC2iPNf1KrxozDgZs53Gfgg5ZHyw8erd6jd5Ta/JIEcdCheXFt9b1NYb93a1wmIIVW/2gLkombDg==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.10.0.tgz} name: '@typescript-eslint/scope-manager' - version: 6.9.0 + version: 6.10.0 engines: {node: ^16.0.0 || >=18.0.0} dependencies: - '@typescript-eslint/types': registry.npmjs.org/@typescript-eslint/types@6.9.0 - '@typescript-eslint/visitor-keys': registry.npmjs.org/@typescript-eslint/visitor-keys@6.9.0 + '@typescript-eslint/types': registry.npmjs.org/@typescript-eslint/types@6.10.0 + '@typescript-eslint/visitor-keys': registry.npmjs.org/@typescript-eslint/visitor-keys@6.10.0 dev: true registry.npmjs.org/@typescript-eslint/type-utils@5.60.0(eslint@8.43.0)(typescript@5.1.3): @@ -2905,11 +3109,11 @@ packages: - supports-color dev: true - registry.npmjs.org/@typescript-eslint/type-utils@6.9.0(eslint@8.43.0)(typescript@5.1.3): - resolution: {integrity: sha512-XXeahmfbpuhVbhSOROIzJ+b13krFmgtc4GlEuu1WBT+RpyGPIA4Y/eGnXzjbDj5gZLzpAXO/sj+IF/x2GtTMjQ==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.9.0.tgz} - id: registry.npmjs.org/@typescript-eslint/type-utils/6.9.0 + registry.npmjs.org/@typescript-eslint/type-utils@6.10.0(eslint@8.43.0)(typescript@5.1.3): + resolution: {integrity: sha512-wYpPs3hgTFblMYwbYWPT3eZtaDOjbLyIYuqpwuLBBqhLiuvJ+9sEp2gNRJEtR5N/c9G1uTtQQL5AhV0fEPJYcg==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.10.0.tgz} + id: registry.npmjs.org/@typescript-eslint/type-utils/6.10.0 name: '@typescript-eslint/type-utils' - version: 6.9.0 + version: 6.10.0 engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: eslint: ^7.0.0 || ^8.0.0 @@ -2918,8 +3122,8 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/typescript-estree': registry.npmjs.org/@typescript-eslint/typescript-estree@6.9.0(typescript@5.1.3) - '@typescript-eslint/utils': registry.npmjs.org/@typescript-eslint/utils@6.9.0(eslint@8.43.0)(typescript@5.1.3) + '@typescript-eslint/typescript-estree': registry.npmjs.org/@typescript-eslint/typescript-estree@6.10.0(typescript@5.1.3) + '@typescript-eslint/utils': registry.npmjs.org/@typescript-eslint/utils@6.10.0(eslint@8.43.0)(typescript@5.1.3) debug: registry.npmjs.org/debug@4.3.4(supports-color@8.1.1) eslint: registry.npmjs.org/eslint@8.43.0 ts-api-utils: registry.npmjs.org/ts-api-utils@1.0.3(typescript@5.1.3) @@ -2928,6 +3132,29 @@ packages: - supports-color dev: true + registry.npmjs.org/@typescript-eslint/type-utils@6.10.0(eslint@8.53.0)(typescript@5.2.2): + resolution: {integrity: sha512-wYpPs3hgTFblMYwbYWPT3eZtaDOjbLyIYuqpwuLBBqhLiuvJ+9sEp2gNRJEtR5N/c9G1uTtQQL5AhV0fEPJYcg==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.10.0.tgz} + id: registry.npmjs.org/@typescript-eslint/type-utils/6.10.0 + name: '@typescript-eslint/type-utils' + version: 6.10.0 + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/typescript-estree': registry.npmjs.org/@typescript-eslint/typescript-estree@6.10.0(typescript@5.2.2) + '@typescript-eslint/utils': registry.npmjs.org/@typescript-eslint/utils@6.10.0(eslint@8.53.0)(typescript@5.2.2) + debug: registry.npmjs.org/debug@4.3.4(supports-color@8.1.1) + eslint: registry.npmjs.org/eslint@8.53.0 + ts-api-utils: registry.npmjs.org/ts-api-utils@1.0.3(typescript@5.2.2) + typescript: registry.npmjs.org/typescript@5.2.2 + transitivePeerDependencies: + - supports-color + dev: true + registry.npmjs.org/@typescript-eslint/types@5.60.0: resolution: {integrity: sha512-ascOuoCpNZBccFVNJRSC6rPq4EmJ2NkuoKnd6LDNyAQmdDnziAtxbCGWCbefG1CNzmDvd05zO36AmB7H8RzKPA==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@typescript-eslint/types/-/types-5.60.0.tgz} name: '@typescript-eslint/types' @@ -2935,10 +3162,10 @@ packages: engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true - registry.npmjs.org/@typescript-eslint/types@6.9.0: - resolution: {integrity: sha512-+KB0lbkpxBkBSiVCuQvduqMJy+I1FyDbdwSpM3IoBS7APl4Bu15lStPjgBIdykdRqQNYqYNMa8Kuidax6phaEw==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@typescript-eslint/types/-/types-6.9.0.tgz} + registry.npmjs.org/@typescript-eslint/types@6.10.0: + resolution: {integrity: sha512-36Fq1PWh9dusgo3vH7qmQAj5/AZqARky1Wi6WpINxB6SkQdY5vQoT2/7rW7uBIsPDcvvGCLi4r10p0OJ7ITAeg==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@typescript-eslint/types/-/types-6.10.0.tgz} name: '@typescript-eslint/types' - version: 6.9.0 + version: 6.10.0 engines: {node: ^16.0.0 || >=18.0.0} dev: true @@ -2966,11 +3193,11 @@ packages: - supports-color dev: true - registry.npmjs.org/@typescript-eslint/typescript-estree@6.9.0(typescript@5.1.3): - resolution: {integrity: sha512-NJM2BnJFZBEAbCfBP00zONKXvMqihZCrmwCaik0UhLr0vAgb6oguXxLX1k00oQyD+vZZ+CJn3kocvv2yxm4awQ==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.9.0.tgz} - id: registry.npmjs.org/@typescript-eslint/typescript-estree/6.9.0 + registry.npmjs.org/@typescript-eslint/typescript-estree@6.10.0(typescript@5.1.3): + resolution: {integrity: sha512-ek0Eyuy6P15LJVeghbWhSrBCj/vJpPXXR+EpaRZqou7achUWL8IdYnMSC5WHAeTWswYQuP2hAZgij/bC9fanBg==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.10.0.tgz} + id: registry.npmjs.org/@typescript-eslint/typescript-estree/6.10.0 name: '@typescript-eslint/typescript-estree' - version: 6.9.0 + version: 6.10.0 engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: typescript: '*' @@ -2978,8 +3205,8 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/types': registry.npmjs.org/@typescript-eslint/types@6.9.0 - '@typescript-eslint/visitor-keys': registry.npmjs.org/@typescript-eslint/visitor-keys@6.9.0 + '@typescript-eslint/types': registry.npmjs.org/@typescript-eslint/types@6.10.0 + '@typescript-eslint/visitor-keys': registry.npmjs.org/@typescript-eslint/visitor-keys@6.10.0 debug: registry.npmjs.org/debug@4.3.4(supports-color@8.1.1) globby: registry.npmjs.org/globby@11.1.0 is-glob: registry.npmjs.org/is-glob@4.0.3 @@ -2990,6 +3217,30 @@ packages: - supports-color dev: true + registry.npmjs.org/@typescript-eslint/typescript-estree@6.10.0(typescript@5.2.2): + resolution: {integrity: sha512-ek0Eyuy6P15LJVeghbWhSrBCj/vJpPXXR+EpaRZqou7achUWL8IdYnMSC5WHAeTWswYQuP2hAZgij/bC9fanBg==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.10.0.tgz} + id: registry.npmjs.org/@typescript-eslint/typescript-estree/6.10.0 + name: '@typescript-eslint/typescript-estree' + version: 6.10.0 + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/types': registry.npmjs.org/@typescript-eslint/types@6.10.0 + '@typescript-eslint/visitor-keys': registry.npmjs.org/@typescript-eslint/visitor-keys@6.10.0 + debug: registry.npmjs.org/debug@4.3.4(supports-color@8.1.1) + globby: registry.npmjs.org/globby@11.1.0 + is-glob: registry.npmjs.org/is-glob@4.0.3 + semver: registry.npmjs.org/semver@7.5.4 + ts-api-utils: registry.npmjs.org/ts-api-utils@1.0.3(typescript@5.2.2) + typescript: registry.npmjs.org/typescript@5.2.2 + transitivePeerDependencies: + - supports-color + dev: true + registry.npmjs.org/@typescript-eslint/utils@5.60.0(eslint@8.43.0)(typescript@5.1.3): resolution: {integrity: sha512-ba51uMqDtfLQ5+xHtwlO84vkdjrqNzOnqrnwbMHMRY8Tqeme8C2Q8Fc7LajfGR+e3/4LoYiWXUM6BpIIbHJ4hQ==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.60.0.tgz} id: registry.npmjs.org/@typescript-eslint/utils/5.60.0 @@ -3013,21 +3264,21 @@ packages: - typescript dev: true - registry.npmjs.org/@typescript-eslint/utils@6.9.0(eslint@8.43.0)(typescript@5.1.3): - resolution: {integrity: sha512-5Wf+Jsqya7WcCO8me504FBigeQKVLAMPmUzYgDbWchINNh1KJbxCgVya3EQ2MjvJMVeXl3pofRmprqX6mfQkjQ==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.9.0.tgz} - id: registry.npmjs.org/@typescript-eslint/utils/6.9.0 + registry.npmjs.org/@typescript-eslint/utils@6.10.0(eslint@8.43.0)(typescript@5.1.3): + resolution: {integrity: sha512-v+pJ1/RcVyRc0o4wAGux9x42RHmAjIGzPRo538Z8M1tVx6HOnoQBCX/NoadHQlZeC+QO2yr4nNSFWOoraZCAyg==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.10.0.tgz} + id: registry.npmjs.org/@typescript-eslint/utils/6.10.0 name: '@typescript-eslint/utils' - version: 6.9.0 + version: 6.10.0 engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: eslint: ^7.0.0 || ^8.0.0 dependencies: '@eslint-community/eslint-utils': registry.npmjs.org/@eslint-community/eslint-utils@4.4.0(eslint@8.43.0) - '@types/json-schema': registry.npmjs.org/@types/json-schema@7.0.14 + '@types/json-schema': registry.npmjs.org/@types/json-schema@7.0.15 '@types/semver': registry.npmjs.org/@types/semver@7.5.4 - '@typescript-eslint/scope-manager': registry.npmjs.org/@typescript-eslint/scope-manager@6.9.0 - '@typescript-eslint/types': registry.npmjs.org/@typescript-eslint/types@6.9.0 - '@typescript-eslint/typescript-estree': registry.npmjs.org/@typescript-eslint/typescript-estree@6.9.0(typescript@5.1.3) + '@typescript-eslint/scope-manager': registry.npmjs.org/@typescript-eslint/scope-manager@6.10.0 + '@typescript-eslint/types': registry.npmjs.org/@typescript-eslint/types@6.10.0 + '@typescript-eslint/typescript-estree': registry.npmjs.org/@typescript-eslint/typescript-estree@6.10.0(typescript@5.1.3) eslint: registry.npmjs.org/eslint@8.43.0 semver: registry.npmjs.org/semver@7.5.4 transitivePeerDependencies: @@ -3035,6 +3286,28 @@ packages: - typescript dev: true + registry.npmjs.org/@typescript-eslint/utils@6.10.0(eslint@8.53.0)(typescript@5.2.2): + resolution: {integrity: sha512-v+pJ1/RcVyRc0o4wAGux9x42RHmAjIGzPRo538Z8M1tVx6HOnoQBCX/NoadHQlZeC+QO2yr4nNSFWOoraZCAyg==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.10.0.tgz} + id: registry.npmjs.org/@typescript-eslint/utils/6.10.0 + name: '@typescript-eslint/utils' + version: 6.10.0 + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + dependencies: + '@eslint-community/eslint-utils': registry.npmjs.org/@eslint-community/eslint-utils@4.4.0(eslint@8.53.0) + '@types/json-schema': registry.npmjs.org/@types/json-schema@7.0.15 + '@types/semver': registry.npmjs.org/@types/semver@7.5.4 + '@typescript-eslint/scope-manager': registry.npmjs.org/@typescript-eslint/scope-manager@6.10.0 + '@typescript-eslint/types': registry.npmjs.org/@typescript-eslint/types@6.10.0 + '@typescript-eslint/typescript-estree': registry.npmjs.org/@typescript-eslint/typescript-estree@6.10.0(typescript@5.2.2) + eslint: registry.npmjs.org/eslint@8.53.0 + semver: registry.npmjs.org/semver@7.5.4 + transitivePeerDependencies: + - supports-color + - typescript + dev: true + registry.npmjs.org/@typescript-eslint/visitor-keys@5.60.0: resolution: {integrity: sha512-wm9Uz71SbCyhUKgcaPRauBdTegUyY/ZWl8gLwD/i/ybJqscrrdVSFImpvUz16BLPChIeKBK5Fa9s6KDQjsjyWw==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.60.0.tgz} name: '@typescript-eslint/visitor-keys' @@ -3045,16 +3318,22 @@ packages: eslint-visitor-keys: registry.npmjs.org/eslint-visitor-keys@3.4.3 dev: true - registry.npmjs.org/@typescript-eslint/visitor-keys@6.9.0: - resolution: {integrity: sha512-dGtAfqjV6RFOtIP8I0B4ZTBRrlTT8NHHlZZSchQx3qReaoDeXhYM++M4So2AgFK9ZB0emRPA6JI1HkafzA2Ibg==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.9.0.tgz} + registry.npmjs.org/@typescript-eslint/visitor-keys@6.10.0: + resolution: {integrity: sha512-xMGluxQIEtOM7bqFCo+rCMh5fqI+ZxV5RUUOa29iVPz1OgCZrtc7rFnz5cLUazlkPKYqX+75iuDq7m0HQ48nCg==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.10.0.tgz} name: '@typescript-eslint/visitor-keys' - version: 6.9.0 + version: 6.10.0 engines: {node: ^16.0.0 || >=18.0.0} dependencies: - '@typescript-eslint/types': registry.npmjs.org/@typescript-eslint/types@6.9.0 + '@typescript-eslint/types': registry.npmjs.org/@typescript-eslint/types@6.10.0 eslint-visitor-keys: registry.npmjs.org/eslint-visitor-keys@3.4.3 dev: true + registry.npmjs.org/@ungap/structured-clone@1.2.0: + resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz} + name: '@ungap/structured-clone' + version: 1.2.0 + dev: true + registry.npmjs.org/@vitejs/plugin-react-swc@3.3.2(vite@4.4.9): resolution: {integrity: sha512-VJFWY5sfoZerQRvJrh518h3AcQt6f/yTuWn4/TRB+dqmYU0NX1qz7qM5Wfd+gOQqUzQW4gxKqKN3KpE/P3+zrA==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@vitejs/plugin-react-swc/-/plugin-react-swc-3.3.2.tgz} id: registry.npmjs.org/@vitejs/plugin-react-swc/3.3.2 @@ -3085,6 +3364,25 @@ packages: vite: registry.npmjs.org/vite@4.4.9 transitivePeerDependencies: - supports-color + dev: true + + registry.npmjs.org/@vitejs/plugin-react@4.0.4(vite@4.5.0): + resolution: {integrity: sha512-7wU921ABnNYkETiMaZy7XqpueMnpu5VxvVps13MjmCo+utBdD79sZzrApHawHtVX66cCJQQTXFcjH0y9dSUK8g==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.0.4.tgz} + id: registry.npmjs.org/@vitejs/plugin-react/4.0.4 + name: '@vitejs/plugin-react' + version: 4.0.4 + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + vite: ^4.2.0 + dependencies: + '@babel/core': registry.npmjs.org/@babel/core@7.23.2 + '@babel/plugin-transform-react-jsx-self': registry.npmjs.org/@babel/plugin-transform-react-jsx-self@7.22.5(@babel/core@7.23.2) + '@babel/plugin-transform-react-jsx-source': registry.npmjs.org/@babel/plugin-transform-react-jsx-source@7.22.5(@babel/core@7.23.2) + react-refresh: registry.npmjs.org/react-refresh@0.14.0 + vite: registry.npmjs.org/vite@4.5.0 + transitivePeerDependencies: + - supports-color + dev: false registry.npmjs.org/acorn-jsx@5.3.2(acorn@8.10.0): resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz} @@ -3104,6 +3402,14 @@ packages: engines: {node: '>=0.4.0'} hasBin: true + registry.npmjs.org/acorn@8.11.2: + resolution: {integrity: sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/acorn/-/acorn-8.11.2.tgz} + name: acorn + version: 8.11.2 + engines: {node: '>=0.4.0'} + hasBin: true + dev: true + registry.npmjs.org/aggregate-error@3.1.0: resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz} name: aggregate-error @@ -3399,8 +3705,8 @@ packages: undici: registry.npmjs.org/undici@5.26.5 unist-util-visit: registry.npmjs.org/unist-util-visit@4.1.2 vfile: registry.npmjs.org/vfile@5.3.7 - vite: registry.npmjs.org/vite@4.4.9 - vitefu: registry.npmjs.org/vitefu@0.2.5(vite@4.4.9) + vite: registry.npmjs.org/vite@4.5.0 + vitefu: registry.npmjs.org/vitefu@0.2.5(vite@4.5.0) which-pm: registry.npmjs.org/which-pm@2.1.1 yargs-parser: registry.npmjs.org/yargs-parser@21.1.1 zod: registry.npmjs.org/zod@3.21.1 @@ -5060,6 +5366,18 @@ packages: engines: {node: '>=12'} dev: false + registry.npmjs.org/eslint-compat-utils@0.1.2(eslint@8.53.0): + resolution: {integrity: sha512-Jia4JDldWnFNIru1Ehx1H5s9/yxiRHY/TimCuUc0jNexew3cF1gI6CYZil1ociakfWO3rRqFjl1mskBblB3RYg==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/eslint-compat-utils/-/eslint-compat-utils-0.1.2.tgz} + id: registry.npmjs.org/eslint-compat-utils/0.1.2 + name: eslint-compat-utils + version: 0.1.2 + engines: {node: '>=12'} + peerDependencies: + eslint: '>=6.0.0' + dependencies: + eslint: registry.npmjs.org/eslint@8.53.0 + dev: true + registry.npmjs.org/eslint-config-prettier@8.8.0(eslint@8.43.0): resolution: {integrity: sha512-wLbQiFre3tdGgpDv67NQKnJuTlcUVYHas3k+DZCc2U2BadthoEY4B7hLPvAxaqdyOGCzuLfii2fqGph10va7oA==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.8.0.tgz} id: registry.npmjs.org/eslint-config-prettier/8.8.0 @@ -5072,6 +5390,18 @@ packages: eslint: registry.npmjs.org/eslint@8.43.0 dev: true + registry.npmjs.org/eslint-config-prettier@9.0.0(eslint@8.53.0): + resolution: {integrity: sha512-IcJsTkJae2S35pRsRAwoCE+925rJJStOdkKnLVgtE+tEpqU0EVVM7OqrwxqgptKdX29NUwC82I5pXsGFIgSevw==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.0.0.tgz} + id: registry.npmjs.org/eslint-config-prettier/9.0.0 + name: eslint-config-prettier + version: 9.0.0 + hasBin: true + peerDependencies: + eslint: '>=7.0.0' + dependencies: + eslint: registry.npmjs.org/eslint@8.53.0 + dev: true + registry.npmjs.org/eslint-config-turbo@1.10.16(eslint@8.43.0): resolution: {integrity: sha512-O3NQI72bQHV7FvSC6lWj66EGx8drJJjuT1kuInn6nbMLOHdMBhSUX/8uhTAlHRQdlxZk2j9HtgFCIzSc93w42g==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/eslint-config-turbo/-/eslint-config-turbo-1.10.16.tgz} id: registry.npmjs.org/eslint-config-turbo/1.10.16 @@ -5163,6 +5493,38 @@ packages: - ts-node dev: true + registry.npmjs.org/eslint-plugin-svelte@2.35.0(eslint@8.53.0)(svelte@4.2.2): + resolution: {integrity: sha512-3WDFxNrkXaMlpqoNo3M1ZOQuoFLMO9+bdnN6oVVXaydXC7nzCJuGy9a0zqoNDHMSRPYt0Rqo6hIdHMEaI5sQnw==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/eslint-plugin-svelte/-/eslint-plugin-svelte-2.35.0.tgz} + id: registry.npmjs.org/eslint-plugin-svelte/2.35.0 + name: eslint-plugin-svelte + version: 2.35.0 + engines: {node: ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^7.0.0 || ^8.0.0-0 + svelte: ^3.37.0 || ^4.0.0 + peerDependenciesMeta: + svelte: + optional: true + dependencies: + '@eslint-community/eslint-utils': registry.npmjs.org/@eslint-community/eslint-utils@4.4.0(eslint@8.53.0) + '@jridgewell/sourcemap-codec': registry.npmjs.org/@jridgewell/sourcemap-codec@1.4.15 + debug: registry.npmjs.org/debug@4.3.4(supports-color@8.1.1) + eslint: registry.npmjs.org/eslint@8.53.0 + eslint-compat-utils: registry.npmjs.org/eslint-compat-utils@0.1.2(eslint@8.53.0) + esutils: registry.npmjs.org/esutils@2.0.3 + known-css-properties: registry.npmjs.org/known-css-properties@0.29.0 + postcss: registry.npmjs.org/postcss@8.4.31 + postcss-load-config: registry.npmjs.org/postcss-load-config@3.1.4(postcss@8.4.31) + postcss-safe-parser: registry.npmjs.org/postcss-safe-parser@6.0.0(postcss@8.4.31) + postcss-selector-parser: registry.npmjs.org/postcss-selector-parser@6.0.13 + semver: registry.npmjs.org/semver@7.5.4 + svelte: registry.npmjs.org/svelte@4.2.2 + svelte-eslint-parser: registry.npmjs.org/svelte-eslint-parser@0.33.1(svelte@4.2.2) + transitivePeerDependencies: + - supports-color + - ts-node + dev: true + registry.npmjs.org/eslint-plugin-turbo@1.10.16(eslint@8.43.0): resolution: {integrity: sha512-ZjrR88MTN64PNGufSEcM0tf+V1xFYVbeiMeuIqr0aiABGomxFLo4DBkQ7WI4WzkZtWQSIA2sP+yxqSboEfL9MQ==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/eslint-plugin-turbo/-/eslint-plugin-turbo-1.10.16.tgz} id: registry.npmjs.org/eslint-plugin-turbo/1.10.16 @@ -5252,6 +5614,55 @@ packages: - supports-color dev: true + registry.npmjs.org/eslint@8.53.0: + resolution: {integrity: sha512-N4VuiPjXDUa4xVeV/GC/RV3hQW9Nw+Y463lkWaKKXKYMvmRiRDAtfpuPFLN+E1/6ZhyR8J2ig+eVREnYgUsiag==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/eslint/-/eslint-8.53.0.tgz} + name: eslint + version: 8.53.0 + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + hasBin: true + dependencies: + '@eslint-community/eslint-utils': registry.npmjs.org/@eslint-community/eslint-utils@4.4.0(eslint@8.53.0) + '@eslint-community/regexpp': registry.npmjs.org/@eslint-community/regexpp@4.10.0 + '@eslint/eslintrc': registry.npmjs.org/@eslint/eslintrc@2.1.3 + '@eslint/js': registry.npmjs.org/@eslint/js@8.53.0 + '@humanwhocodes/config-array': registry.npmjs.org/@humanwhocodes/config-array@0.11.13 + '@humanwhocodes/module-importer': registry.npmjs.org/@humanwhocodes/module-importer@1.0.1 + '@nodelib/fs.walk': registry.npmjs.org/@nodelib/fs.walk@1.2.8 + '@ungap/structured-clone': registry.npmjs.org/@ungap/structured-clone@1.2.0 + ajv: registry.npmjs.org/ajv@6.12.6 + chalk: registry.npmjs.org/chalk@4.1.2 + cross-spawn: registry.npmjs.org/cross-spawn@7.0.3 + debug: registry.npmjs.org/debug@4.3.4(supports-color@8.1.1) + doctrine: registry.npmjs.org/doctrine@3.0.0 + escape-string-regexp: registry.npmjs.org/escape-string-regexp@4.0.0 + eslint-scope: registry.npmjs.org/eslint-scope@7.2.2 + eslint-visitor-keys: registry.npmjs.org/eslint-visitor-keys@3.4.3 + espree: registry.npmjs.org/espree@9.6.1 + esquery: registry.npmjs.org/esquery@1.5.0 + esutils: registry.npmjs.org/esutils@2.0.3 + fast-deep-equal: registry.npmjs.org/fast-deep-equal@3.1.3 + file-entry-cache: registry.npmjs.org/file-entry-cache@6.0.1 + find-up: registry.npmjs.org/find-up@5.0.0 + glob-parent: registry.npmjs.org/glob-parent@6.0.2 + globals: registry.npmjs.org/globals@13.23.0 + graphemer: registry.npmjs.org/graphemer@1.4.0 + ignore: registry.npmjs.org/ignore@5.2.4 + imurmurhash: registry.npmjs.org/imurmurhash@0.1.4 + is-glob: registry.npmjs.org/is-glob@4.0.3 + is-path-inside: registry.npmjs.org/is-path-inside@3.0.3 + js-yaml: registry.npmjs.org/js-yaml@4.1.0 + json-stable-stringify-without-jsonify: registry.npmjs.org/json-stable-stringify-without-jsonify@1.0.1 + levn: registry.npmjs.org/levn@0.4.1 + lodash.merge: registry.npmjs.org/lodash.merge@4.6.2 + minimatch: registry.npmjs.org/minimatch@3.1.2 + natural-compare: registry.npmjs.org/natural-compare@1.4.0 + optionator: registry.npmjs.org/optionator@0.9.3 + strip-ansi: registry.npmjs.org/strip-ansi@6.0.1 + text-table: registry.npmjs.org/text-table@0.2.0 + transitivePeerDependencies: + - supports-color + dev: true + registry.npmjs.org/esm-env@1.0.0: resolution: {integrity: sha512-Cf6VksWPsTuW01vU9Mk/3vRue91Zevka5SjyNf3nEpokFRuqt/KjUQoGAwq9qMmhpLTHmXzSIrFRw8zxWzmFBA==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/esm-env/-/esm-env-1.0.0.tgz} name: esm-env @@ -5502,6 +5913,19 @@ packages: merge2: registry.npmjs.org/merge2@1.4.1 micromatch: registry.npmjs.org/micromatch@4.0.5 + registry.npmjs.org/fast-glob@3.3.2: + resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz} + name: fast-glob + version: 3.3.2 + engines: {node: '>=8.6.0'} + dependencies: + '@nodelib/fs.stat': registry.npmjs.org/@nodelib/fs.stat@2.0.5 + '@nodelib/fs.walk': registry.npmjs.org/@nodelib/fs.walk@1.2.8 + glob-parent: registry.npmjs.org/glob-parent@5.1.2 + merge2: registry.npmjs.org/merge2@1.4.1 + micromatch: registry.npmjs.org/micromatch@4.0.5 + dev: true + registry.npmjs.org/fast-json-stable-stringify@2.1.0: resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz} name: fast-json-stable-stringify @@ -5909,6 +6333,12 @@ packages: define-properties: registry.npmjs.org/define-properties@1.2.1 dev: true + registry.npmjs.org/globalyzer@0.1.0: + resolution: {integrity: sha512-40oNTM9UfG6aBmuKxk/giHn5nQ8RVz/SS4Ir6zgzOv9/qC3kKZ9v4etGTcJbEl/NyVQH7FGU7d+X1egr57Md2Q==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/globalyzer/-/globalyzer-0.1.0.tgz} + name: globalyzer + version: 0.1.0 + dev: true + registry.npmjs.org/globby@11.1.0: resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/globby/-/globby-11.1.0.tgz} name: globby @@ -5936,6 +6366,12 @@ packages: slash: registry.npmjs.org/slash@4.0.0 dev: true + registry.npmjs.org/globrex@0.1.2: + resolution: {integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/globrex/-/globrex-0.1.2.tgz} + name: globrex + version: 0.1.2 + dev: true + registry.npmjs.org/gopd@1.0.1: resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz} name: gopd @@ -6244,6 +6680,19 @@ packages: resolution: {integrity: sha512-4IwhLhNNA8yy445rPjD/lWh++7hMDOml2eHtd58eG7h+qK3EryMuuRbsHGPikCoAgIkkDnckKfWSk2iDla/ejg==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-3.0.0.tgz} name: import-meta-resolve version: 3.0.0 + dev: true + + registry.npmjs.org/import-meta-resolve@3.1.1: + resolution: {integrity: sha512-qeywsE/KC3w9Fd2ORrRDUw6nS/nLwZpXgfrOc2IILvZYnCaEMd+D56Vfg9k4G29gIeVi3XKql1RQatME8iYsiw==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-3.1.1.tgz} + name: import-meta-resolve + version: 3.1.1 + dev: false + + registry.npmjs.org/import-meta-resolve@4.0.0: + resolution: {integrity: sha512-okYUR7ZQPH+efeuMJGlq4f8ubUgO50kByRPyt/Cy1Io4PSRsPjxME+YlVaCOx+NIToW7hCsZNFJyTPFFKepRSA==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-4.0.0.tgz} + name: import-meta-resolve + version: 4.0.0 + dev: true registry.npmjs.org/imurmurhash@0.1.4: resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz} @@ -6886,6 +7335,12 @@ packages: version: 0.27.0 dev: true + registry.npmjs.org/known-css-properties@0.29.0: + resolution: {integrity: sha512-Ne7wqW7/9Cz54PDt4I3tcV+hAyat8ypyOGzYRJQfdxnnjeWsTxt1cy8pjvvKeI5kfXuyvULyeeAvwvvtAX3ayQ==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.29.0.tgz} + name: known-css-properties + version: 0.29.0 + dev: true + registry.npmjs.org/lazy-ass@1.6.0: resolution: {integrity: sha512-cc8oEVoctTvsFZ/Oje/kGnHbpWHYBe8IAJe4C0QNc3t8uM/0Y8+erSz/7Y1ALuXTEZTMvxXwO6YbX1ey3ujiZw==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/lazy-ass/-/lazy-ass-1.6.0.tgz} name: lazy-ass @@ -8930,6 +9385,19 @@ packages: svelte: registry.npmjs.org/svelte@4.2.1 dev: true + registry.npmjs.org/prettier-plugin-svelte@3.0.3(prettier@3.0.3)(svelte@4.2.2): + resolution: {integrity: sha512-dLhieh4obJEK1hnZ6koxF+tMUrZbV5YGvRpf2+OADyanjya5j0z1Llo8iGwiHmFWZVG/hLEw/AJD5chXd9r3XA==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/prettier-plugin-svelte/-/prettier-plugin-svelte-3.0.3.tgz} + id: registry.npmjs.org/prettier-plugin-svelte/3.0.3 + name: prettier-plugin-svelte + version: 3.0.3 + peerDependencies: + prettier: ^3.0.0 + svelte: ^3.2.0 || ^4.0.0-next.0 + dependencies: + prettier: registry.npmjs.org/prettier@3.0.3 + svelte: registry.npmjs.org/svelte@4.2.2 + dev: true + registry.npmjs.org/prettier@2.8.8: resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz} name: prettier @@ -10325,24 +10793,24 @@ packages: - sugarss dev: true - registry.npmjs.org/svelte-check@3.5.0(postcss@8.4.31)(svelte@4.2.1): - resolution: {integrity: sha512-KHujbn4k17xKYLmtCwv0sKKM7uiHTYcQvXnvrCcNU6a7hcszh99zFTIoiu/Sp/ewAw5aJmillJ1Cs8gKLmcX4A==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/svelte-check/-/svelte-check-3.5.0.tgz} - id: registry.npmjs.org/svelte-check/3.5.0 + registry.npmjs.org/svelte-check@3.5.2(postcss@8.4.31)(svelte@4.2.2): + resolution: {integrity: sha512-5a/YWbiH4c+AqAUP+0VneiV5bP8YOk9JL3jwvN+k2PEPLgpu85bjQc5eE67+eIZBBwUEJzmO3I92OqKcqbp3fw==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/svelte-check/-/svelte-check-3.5.2.tgz} + id: registry.npmjs.org/svelte-check/3.5.2 name: svelte-check - version: 3.5.0 + version: 3.5.2 hasBin: true peerDependencies: svelte: ^3.55.0 || ^4.0.0-next.0 || ^4.0.0 dependencies: '@jridgewell/trace-mapping': registry.npmjs.org/@jridgewell/trace-mapping@0.3.20 chokidar: registry.npmjs.org/chokidar@3.5.3 - fast-glob: registry.npmjs.org/fast-glob@3.3.1 + fast-glob: registry.npmjs.org/fast-glob@3.3.2 import-fresh: registry.npmjs.org/import-fresh@3.3.0 picocolors: registry.npmjs.org/picocolors@1.0.0 sade: registry.npmjs.org/sade@1.8.1 - svelte: registry.npmjs.org/svelte@4.2.1 - svelte-preprocess: registry.npmjs.org/svelte-preprocess@5.0.4(postcss@8.4.31)(svelte@4.2.1)(typescript@5.1.3) - typescript: registry.npmjs.org/typescript@5.1.3 + svelte: registry.npmjs.org/svelte@4.2.2 + svelte-preprocess: registry.npmjs.org/svelte-preprocess@5.0.4(postcss@8.4.31)(svelte@4.2.2)(typescript@5.2.2) + typescript: registry.npmjs.org/typescript@5.2.2 transitivePeerDependencies: - '@babel/core' - coffeescript @@ -10395,6 +10863,26 @@ packages: svelte: registry.npmjs.org/svelte@4.2.1 dev: true + registry.npmjs.org/svelte-eslint-parser@0.33.1(svelte@4.2.2): + resolution: {integrity: sha512-vo7xPGTlKBGdLH8T5L64FipvTrqv3OQRx9d2z5X05KKZDlF4rQk8KViZO4flKERY+5BiVdOh7zZ7JGJWo5P0uA==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/svelte-eslint-parser/-/svelte-eslint-parser-0.33.1.tgz} + id: registry.npmjs.org/svelte-eslint-parser/0.33.1 + name: svelte-eslint-parser + version: 0.33.1 + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + svelte: ^3.37.0 || ^4.0.0 + peerDependenciesMeta: + svelte: + optional: true + dependencies: + eslint-scope: registry.npmjs.org/eslint-scope@7.2.2 + eslint-visitor-keys: registry.npmjs.org/eslint-visitor-keys@3.4.3 + espree: registry.npmjs.org/espree@9.6.1 + postcss: registry.npmjs.org/postcss@8.4.31 + postcss-scss: registry.npmjs.org/postcss-scss@4.0.9(postcss@8.4.31) + svelte: registry.npmjs.org/svelte@4.2.2 + dev: true + registry.npmjs.org/svelte-hmr@0.15.3(svelte@4.2.1): resolution: {integrity: sha512-41snaPswvSf8TJUhlkoJBekRrABDXDMdpNpT2tfHIv4JuhgvHqLMhEPGtaQn0BmbNSTkuz2Ed20DF2eHw0SmBQ==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/svelte-hmr/-/svelte-hmr-0.15.3.tgz} id: registry.npmjs.org/svelte-hmr/0.15.3 @@ -10406,6 +10894,18 @@ packages: dependencies: svelte: registry.npmjs.org/svelte@4.2.1 + registry.npmjs.org/svelte-hmr@0.15.3(svelte@4.2.2): + resolution: {integrity: sha512-41snaPswvSf8TJUhlkoJBekRrABDXDMdpNpT2tfHIv4JuhgvHqLMhEPGtaQn0BmbNSTkuz2Ed20DF2eHw0SmBQ==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/svelte-hmr/-/svelte-hmr-0.15.3.tgz} + id: registry.npmjs.org/svelte-hmr/0.15.3 + name: svelte-hmr + version: 0.15.3 + engines: {node: ^12.20 || ^14.13.1 || >= 16} + peerDependencies: + svelte: ^3.19.0 || ^4.0.0 + dependencies: + svelte: registry.npmjs.org/svelte@4.2.2 + dev: true + registry.npmjs.org/svelte-preprocess@5.0.4(postcss@8.4.21)(svelte@4.2.1)(typescript@5.1.3): resolution: {integrity: sha512-ABia2QegosxOGsVlsSBJvoWeXy1wUKSfF7SWJdTjLAbx/Y3SrVevvvbFNQqrSJw89+lNSsM58SipmZJ5SRi5iw==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/svelte-preprocess/-/svelte-preprocess-5.0.4.tgz} id: registry.npmjs.org/svelte-preprocess/5.0.4 @@ -10457,7 +10957,7 @@ packages: typescript: registry.npmjs.org/typescript@5.1.3 dev: true - registry.npmjs.org/svelte-preprocess@5.0.4(postcss@8.4.31)(svelte@4.2.1)(typescript@5.1.3): + registry.npmjs.org/svelte-preprocess@5.0.4(postcss@8.4.31)(svelte@4.2.2)(typescript@5.2.2): resolution: {integrity: sha512-ABia2QegosxOGsVlsSBJvoWeXy1wUKSfF7SWJdTjLAbx/Y3SrVevvvbFNQqrSJw89+lNSsM58SipmZJ5SRi5iw==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/svelte-preprocess/-/svelte-preprocess-5.0.4.tgz} id: registry.npmjs.org/svelte-preprocess/5.0.4 name: svelte-preprocess @@ -10498,14 +10998,14 @@ packages: typescript: optional: true dependencies: - '@types/pug': registry.npmjs.org/@types/pug@2.0.8 + '@types/pug': registry.npmjs.org/@types/pug@2.0.9 detect-indent: registry.npmjs.org/detect-indent@6.1.0 magic-string: registry.npmjs.org/magic-string@0.27.0 postcss: registry.npmjs.org/postcss@8.4.31 sorcery: registry.npmjs.org/sorcery@0.11.0 strip-indent: registry.npmjs.org/strip-indent@3.0.0 - svelte: registry.npmjs.org/svelte@4.2.1 - typescript: registry.npmjs.org/typescript@5.1.3 + svelte: registry.npmjs.org/svelte@4.2.2 + typescript: registry.npmjs.org/typescript@5.2.2 dev: true registry.npmjs.org/svelte2tsx@0.6.23(svelte@4.2.1)(typescript@5.1.3): @@ -10521,6 +11021,22 @@ packages: pascal-case: registry.npmjs.org/pascal-case@3.1.2 svelte: registry.npmjs.org/svelte@4.2.1 typescript: registry.npmjs.org/typescript@5.1.3 + dev: true + + registry.npmjs.org/svelte2tsx@0.6.23(svelte@4.2.1)(typescript@5.2.2): + resolution: {integrity: sha512-3bwd1PuWUA3oEXy8+85zrLDnmJOsVpShpKVAehGWeYsz/66zMihTpRpUN97VVAKTZbO5tP4wnchHUXYs0zOwdw==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/svelte2tsx/-/svelte2tsx-0.6.23.tgz} + id: registry.npmjs.org/svelte2tsx/0.6.23 + name: svelte2tsx + version: 0.6.23 + peerDependencies: + svelte: ^3.55 || ^4.0.0-next.0 || ^4.0 + typescript: ^4.9.4 || ^5.0.0 + dependencies: + dedent-js: registry.npmjs.org/dedent-js@1.0.1 + pascal-case: registry.npmjs.org/pascal-case@3.1.2 + svelte: registry.npmjs.org/svelte@4.2.1 + typescript: registry.npmjs.org/typescript@5.2.2 + dev: false registry.npmjs.org/svelte@4.2.1: resolution: {integrity: sha512-LpLqY2Jr7cRxkrTc796/AaaoMLF/1ax7cto8Ot76wrvKQhrPmZ0JgajiWPmg9mTSDqO16SSLiD17r9MsvAPTmw==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/svelte/-/svelte-4.2.1.tgz} @@ -10542,6 +11058,27 @@ packages: magic-string: registry.npmjs.org/magic-string@0.30.5 periscopic: registry.npmjs.org/periscopic@3.1.0 + registry.npmjs.org/svelte@4.2.2: + resolution: {integrity: sha512-My2tytF2e2NnHSpn2M7/3VdXT4JdTglYVUuSuK/mXL2XtulPYbeBfl8Dm1QiaKRn0zoULRnL+EtfZHHP0k4H3A==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/svelte/-/svelte-4.2.2.tgz} + name: svelte + version: 4.2.2 + engines: {node: '>=16'} + dependencies: + '@ampproject/remapping': registry.npmjs.org/@ampproject/remapping@2.2.1 + '@jridgewell/sourcemap-codec': registry.npmjs.org/@jridgewell/sourcemap-codec@1.4.15 + '@jridgewell/trace-mapping': registry.npmjs.org/@jridgewell/trace-mapping@0.3.20 + acorn: registry.npmjs.org/acorn@8.11.2 + aria-query: registry.npmjs.org/aria-query@5.3.0 + axobject-query: registry.npmjs.org/axobject-query@3.2.1 + code-red: registry.npmjs.org/code-red@1.0.4 + css-tree: registry.npmjs.org/css-tree@2.3.1 + estree-walker: registry.npmjs.org/estree-walker@3.0.3 + is-reference: registry.npmjs.org/is-reference@3.0.2 + locate-character: registry.npmjs.org/locate-character@3.0.0 + magic-string: registry.npmjs.org/magic-string@0.30.5 + periscopic: registry.npmjs.org/periscopic@3.1.0 + dev: true + registry.npmjs.org/svgo@3.0.2: resolution: {integrity: sha512-Z706C1U2pb1+JGP48fbazf3KxHrWOsLme6Rv7imFBn5EnuanDW1GPaA/P1/dvObE670JDePC3mnj0k0B7P0jjQ==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/svgo/-/svgo-3.0.2.tgz} name: svgo @@ -10649,6 +11186,15 @@ packages: version: 2.3.8 dev: true + registry.npmjs.org/tiny-glob@0.2.9: + resolution: {integrity: sha512-g/55ssRPUjShh+xkfx9UPDXqhckHEsHr4Vd9zX55oSdGZc/MD0m3sferOkwWtp98bv+kcVfEHtRJgBVJzelrzg==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/tiny-glob/-/tiny-glob-0.2.9.tgz} + name: tiny-glob + version: 0.2.9 + dependencies: + globalyzer: registry.npmjs.org/globalyzer@0.1.0 + globrex: registry.npmjs.org/globrex@0.1.2 + dev: true + registry.npmjs.org/tmp@0.0.33: resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz} name: tmp @@ -10744,6 +11290,18 @@ packages: typescript: registry.npmjs.org/typescript@5.1.3 dev: true + registry.npmjs.org/ts-api-utils@1.0.3(typescript@5.2.2): + resolution: {integrity: sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.0.3.tgz} + id: registry.npmjs.org/ts-api-utils/1.0.3 + name: ts-api-utils + version: 1.0.3 + engines: {node: '>=16.13.0'} + peerDependencies: + typescript: '>=4.2.0' + dependencies: + typescript: registry.npmjs.org/typescript@5.2.2 + dev: true + registry.npmjs.org/tsconfig-resolver@3.0.1: resolution: {integrity: sha512-ZHqlstlQF449v8glscGRXzL6l2dZvASPCdXJRWG4gHEZlUVx2Jtmr+a2zeVG4LCsKhDXKRj5R3h0C/98UcVAQg==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/tsconfig-resolver/-/tsconfig-resolver-3.0.1.tgz} name: tsconfig-resolver @@ -11001,6 +11559,14 @@ packages: version: 5.1.3 engines: {node: '>=14.17'} hasBin: true + dev: true + + registry.npmjs.org/typescript@5.2.2: + resolution: {integrity: sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz} + name: typescript + version: 5.2.2 + engines: {node: '>=14.17'} + hasBin: true registry.npmjs.org/ultrahtml@1.5.2: resolution: {integrity: sha512-qh4mBffhlkiXwDAOxvSGxhL0QEQsTbnP9BozOK3OYPEGvPvdWzvAUaXNtUSMdNsKDtuyjEbyVUPFZ52SSLhLqw==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/ultrahtml/-/ultrahtml-1.5.2.tgz} @@ -11042,7 +11608,6 @@ packages: engines: {node: '>=14.0'} dependencies: '@fastify/busboy': registry.npmjs.org/@fastify/busboy@2.0.0 - dev: false registry.npmjs.org/unherit@3.0.1: resolution: {integrity: sha512-akOOQ/Yln8a2sgcLj4U0Jmx0R5jpIg2IUyRrWOzmEbjBtGzBdHtSeFKgoEcoH4KYIG/Pb8GQ/BwtYm0GCq1Sqg==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/unherit/-/unherit-3.0.1.tgz} @@ -11335,8 +11900,45 @@ packages: rollup: registry.npmjs.org/rollup@3.29.4 optionalDependencies: fsevents: registry.npmjs.org/fsevents@2.3.3 + dev: true - registry.npmjs.org/vitefu@0.2.5(vite@4.4.9): + registry.npmjs.org/vite@4.5.0: + resolution: {integrity: sha512-ulr8rNLA6rkyFAlVWw2q5YJ91v098AFQ2R0PRFwPzREXOUJQPtFUG0t+/ZikhaOCDqFoDhN6/v8Sq0o4araFAw==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/vite/-/vite-4.5.0.tgz} + name: vite + version: 4.5.0 + engines: {node: ^14.18.0 || >=16.0.0} + hasBin: true + peerDependencies: + '@types/node': '>= 14' + less: '*' + lightningcss: ^1.21.0 + sass: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + dependencies: + esbuild: registry.npmjs.org/esbuild@0.18.20 + postcss: registry.npmjs.org/postcss@8.4.31 + rollup: registry.npmjs.org/rollup@3.29.4 + optionalDependencies: + fsevents: registry.npmjs.org/fsevents@2.3.3 + + registry.npmjs.org/vitefu@0.2.5(vite@4.5.0): resolution: {integrity: sha512-SgHtMLoqaeeGnd2evZ849ZbACbnwQCIwRH57t18FxcXoZop0uQu0uzlIhJBlF/eWVzuce0sHeqPcDo+evVcg8Q==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/vitefu/-/vitefu-0.2.5.tgz} id: registry.npmjs.org/vitefu/0.2.5 name: vitefu @@ -11347,7 +11949,7 @@ packages: vite: optional: true dependencies: - vite: registry.npmjs.org/vite@4.4.9 + vite: registry.npmjs.org/vite@4.5.0 registry.npmjs.org/vscode-oniguruma@1.7.0: resolution: {integrity: sha512-L9WMGRfrjOhgHSdOYgCt/yRMsXzLDJSL7BPrOZt73gU0iWO4mpqzqQzOz5srxqTvMBaR0XZTSrVWo4j55Rc6cA==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/vscode-oniguruma/-/vscode-oniguruma-1.7.0.tgz} From c5b22e049802ea9b65470e4964e2e9d67e50f243 Mon Sep 17 00:00:00 2001 From: Peter Date: Tue, 7 Nov 2023 14:52:56 +0100 Subject: [PATCH 017/608] removed broken test --- tests/playwright/e2e/pane.spec.ts | 50 +++++++------------------------ 1 file changed, 10 insertions(+), 40 deletions(-) diff --git a/tests/playwright/e2e/pane.spec.ts b/tests/playwright/e2e/pane.spec.ts index 6090beac..f7f52e3c 100644 --- a/tests/playwright/e2e/pane.spec.ts +++ b/tests/playwright/e2e/pane.spec.ts @@ -182,45 +182,15 @@ test.describe('PANE NON-DEFAULT', () => { expect(viewportTransform.scale).toBe(1.234); }); }); +}); - test.describe('PANE ACTIVATION KEYS', () => { - test.beforeEach(async ({ page }) => { - // Go to the starting url before each test. - await page.goto('/tests/generic/pane/activation-keys'); - - // Wait till the edges are rendered - await page.waitForSelector('#first-edge', { timeout: 5000 }); - }); - - test.describe('pan & zoom', () => { - test('panOnScroll pans the pane on scrolling', async ({ page }) => { - const pane = page.locator(`.${FRAMEWORK}-flow__pane`); - const viewport = page.locator(`.${FRAMEWORK}-flow__viewport`); - - await expect(pane).toBeAttached(); - - const transformsBefore = await getTransform(viewport); - - await pane.hover(); - await page.mouse.wheel(100, 100); - - const transformsAfter = await getTransform(viewport); - - expect(transformsAfter.translateX).not.toBe(transformsBefore.translateX); - expect(transformsAfter.translateY).not.toBe(transformsBefore.translateY); - }); - - test('intialViewport', async ({ page }) => { - const pane = page.locator(`.${FRAMEWORK}-flow__pane`); - const viewport = page.locator(`.${FRAMEWORK}-flow__viewport`); - - await expect(pane).toBeAttached(); - - const viewportTransform = await getTransform(viewport); - - expect(viewportTransform.translateX).toBe(1.23); - expect(viewportTransform.translateY).toBe(9.87); - expect(viewportTransform.scale).toBe(1.234); - }); - }); +test.describe('PANE ACTIVATION KEYS', () => { + test.beforeEach(async ({ page }) => { + // Go to the starting url before each test. + await page.goto('/tests/generic/pane/activation-keys'); + + // Wait till the edges are rendered + await page.waitForSelector('#first-edge', { timeout: 5000 }); + }); + // TODO }); From b8a75ccac61c5e258eaf52fbf389253cd4f51a22 Mon Sep 17 00:00:00 2001 From: Peter Date: Tue, 7 Nov 2023 15:05:38 +0100 Subject: [PATCH 018/608] chore(react-examples) updated dependencies --- examples/react/package.json | 24 +- pnpm-lock.yaml | 509 ++++++++++++++++++------------------ 2 files changed, 269 insertions(+), 264 deletions(-) diff --git a/examples/react/package.json b/examples/react/package.json index 73d91382..9c303aae 100644 --- a/examples/react/package.json +++ b/examples/react/package.json @@ -15,25 +15,25 @@ }, "dependencies": { "@xyflow/react": "workspace:*", - "classcat": "^5.0.3", + "classcat": "^5.0.4", "dagre": "^0.8.5", "localforage": "^1.10.0", "react": "^18.2.0", "react-dom": "^18.2.0", - "react-router-dom": "^6.3.0", - "zustand": "^4.4.1" + "react-router-dom": "^6.18.0", + "zustand": "^4.4.6" }, "devDependencies": { "@cypress/skip-test": "^2.6.1", - "@types/dagre": "^0.7.48", - "@types/react": "^18.0.17", - "@types/react-dom": "^18.0.6", - "@vitejs/plugin-react": "4.0.4", - "@vitejs/plugin-react-swc": "^3.3.2", + "@types/dagre": "^0.7.52", + "@types/react": "^18.2.36", + "@types/react-dom": "^18.2.14", + "@vitejs/plugin-react": "4.1.1", + "@vitejs/plugin-react-swc": "^3.4.1", "cypress": "12.17.3", - "cypress-real-events": "1.10.0", - "start-server-and-test": "^1.14.0", - "typescript": "5.1.3", - "vite": "4.4.9" + "cypress-real-events": "1.11.0", + "start-server-and-test": "^2.0.2", + "typescript": "5.2.2", + "vite": "4.5.0" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 9a622802..c07f3def 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -96,7 +96,7 @@ importers: specifier: workspace:* version: link:../../packages/react classcat: - specifier: ^5.0.3 + specifier: ^5.0.4 version: registry.npmjs.org/classcat@5.0.4 dagre: specifier: ^0.8.5 @@ -111,45 +111,45 @@ importers: specifier: ^18.2.0 version: registry.npmjs.org/react-dom@18.2.0(react@18.2.0) react-router-dom: - specifier: ^6.3.0 - version: registry.npmjs.org/react-router-dom@6.3.0(react-dom@18.2.0)(react@18.2.0) + specifier: ^6.18.0 + version: registry.npmjs.org/react-router-dom@6.18.0(react-dom@18.2.0)(react@18.2.0) zustand: - specifier: ^4.4.1 - version: registry.npmjs.org/zustand@4.4.1(@types/react@18.2.24)(react@18.2.0) + specifier: ^4.4.6 + version: registry.npmjs.org/zustand@4.4.6(@types/react@18.2.36)(react@18.2.0) devDependencies: '@cypress/skip-test': specifier: ^2.6.1 version: registry.npmjs.org/@cypress/skip-test@2.6.1 '@types/dagre': - specifier: ^0.7.48 - version: registry.npmjs.org/@types/dagre@0.7.48 + specifier: ^0.7.52 + version: registry.npmjs.org/@types/dagre@0.7.52 '@types/react': - specifier: ^18.0.17 - version: registry.npmjs.org/@types/react@18.2.24 + specifier: ^18.2.36 + version: registry.npmjs.org/@types/react@18.2.36 '@types/react-dom': - specifier: ^18.0.6 - version: registry.npmjs.org/@types/react-dom@18.2.8 + specifier: ^18.2.14 + version: registry.npmjs.org/@types/react-dom@18.2.14 '@vitejs/plugin-react': - specifier: 4.0.4 - version: registry.npmjs.org/@vitejs/plugin-react@4.0.4(vite@4.4.9) + specifier: 4.1.1 + version: registry.npmjs.org/@vitejs/plugin-react@4.1.1(vite@4.5.0) '@vitejs/plugin-react-swc': - specifier: ^3.3.2 - version: registry.npmjs.org/@vitejs/plugin-react-swc@3.3.2(vite@4.4.9) + specifier: ^3.4.1 + version: registry.npmjs.org/@vitejs/plugin-react-swc@3.4.1(vite@4.5.0) cypress: specifier: 12.17.3 version: registry.npmjs.org/cypress@12.17.3 cypress-real-events: - specifier: 1.10.0 - version: registry.npmjs.org/cypress-real-events@1.10.0(cypress@12.17.3) + specifier: 1.11.0 + version: registry.npmjs.org/cypress-real-events@1.11.0(cypress@12.17.3) start-server-and-test: - specifier: ^1.14.0 - version: registry.npmjs.org/start-server-and-test@1.14.0 + specifier: ^2.0.2 + version: registry.npmjs.org/start-server-and-test@2.0.2 typescript: - specifier: 5.1.3 - version: registry.npmjs.org/typescript@5.1.3 + specifier: 5.2.2 + version: registry.npmjs.org/typescript@5.2.2 vite: - specifier: 4.4.9 - version: registry.npmjs.org/vite@4.4.9 + specifier: 4.5.0 + version: registry.npmjs.org/vite@4.5.0 examples/svelte: dependencies: @@ -537,7 +537,7 @@ packages: dependencies: '@types/react': registry.npmjs.org/@types/react@18.2.24 '@types/react-dom': registry.npmjs.org/@types/react-dom@18.2.8 - '@vitejs/plugin-react': registry.npmjs.org/@vitejs/plugin-react@4.0.4(vite@4.5.0) + '@vitejs/plugin-react': registry.npmjs.org/@vitejs/plugin-react@4.1.1(vite@4.5.0) react: registry.npmjs.org/react@18.2.0 react-dom: registry.npmjs.org/react-dom@18.2.0(react@18.2.0) ultrahtml: registry.npmjs.org/ultrahtml@1.5.2 @@ -834,6 +834,7 @@ packages: engines: {node: '>=6.9.0'} dependencies: regenerator-runtime: registry.npmjs.org/regenerator-runtime@0.14.0 + dev: true registry.npmjs.org/@babel/template@7.22.15: resolution: {integrity: sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz} @@ -1894,6 +1895,13 @@ packages: version: 1.0.0-next.23 dev: true + registry.npmjs.org/@remix-run/router@1.11.0: + resolution: {integrity: sha512-BHdhcWgeiudl91HvVa2wxqZjSHbheSgIiDvxrF1VjFzBzpTtuDPkOdOi3Iqvc08kXtFkLjhbS+ML9aM8mJS+wQ==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@remix-run/router/-/router-1.11.0.tgz} + name: '@remix-run/router' + version: 1.11.0 + engines: {node: '>=14.0.0'} + dev: false + registry.npmjs.org/@rollup/plugin-commonjs@25.0.0(rollup@3.23.0): resolution: {integrity: sha512-hoho2Kay9TZrLu0bnDsTTCaj4Npa+THk9snajP/XDNb9a9mmjTjh52EQM9sKl3HD1LsnihX7js+eA2sd2uKAhw==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-25.0.0.tgz} id: registry.npmjs.org/@rollup/plugin-commonjs/25.0.0 @@ -2224,10 +2232,10 @@ packages: - supports-color dev: true - registry.npmjs.org/@swc/core-darwin-arm64@1.3.94: - resolution: {integrity: sha512-KNuE6opIy/wAXiGUWLhGWhCG3wA/AdjG6eYkv6dstrAURLaQMAoD8vDfVm8pxS8FA8Kx+0Z4QiDNPqk5aKIsqg==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.3.94.tgz} + registry.npmjs.org/@swc/core-darwin-arm64@1.3.96: + resolution: {integrity: sha512-8hzgXYVd85hfPh6mJ9yrG26rhgzCmcLO0h1TIl8U31hwmTbfZLzRitFQ/kqMJNbIBCwmNH1RU2QcJnL3d7f69A==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.3.96.tgz} name: '@swc/core-darwin-arm64' - version: 1.3.94 + version: 1.3.96 engines: {node: '>=10'} cpu: [arm64] os: [darwin] @@ -2235,10 +2243,10 @@ packages: dev: true optional: true - registry.npmjs.org/@swc/core-darwin-x64@1.3.94: - resolution: {integrity: sha512-HypemhyehQrLqXwfJv5ronD4BMAXdgMCP4Ei7rt3B6Ftmt9axwGvdwGiXxsYR9h1ncyxoVxN+coGxbNIhKhahw==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.3.94.tgz} + registry.npmjs.org/@swc/core-darwin-x64@1.3.96: + resolution: {integrity: sha512-mFp9GFfuPg+43vlAdQZl0WZpZSE8sEzqL7sr/7Reul5McUHP0BaLsEzwjvD035ESfkY8GBZdLpMinblIbFNljQ==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.3.96.tgz} name: '@swc/core-darwin-x64' - version: 1.3.94 + version: 1.3.96 engines: {node: '>=10'} cpu: [x64] os: [darwin] @@ -2246,10 +2254,10 @@ packages: dev: true optional: true - registry.npmjs.org/@swc/core-linux-arm-gnueabihf@1.3.94: - resolution: {integrity: sha512-KzKN54c7Y6X1db+bBVSXG4+bXmAPvXtDWk+TgwNJH4yYliOrnP/RKkHA5QZ9VFSnqJF06/sAO4kYBiL/aVQDBQ==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.3.94.tgz} + registry.npmjs.org/@swc/core-linux-arm-gnueabihf@1.3.96: + resolution: {integrity: sha512-8UEKkYJP4c8YzYIY/LlbSo8z5Obj4hqcv/fUTHiEePiGsOddgGf7AWjh56u7IoN/0uEmEro59nc1ChFXqXSGyg==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.3.96.tgz} name: '@swc/core-linux-arm-gnueabihf' - version: 1.3.94 + version: 1.3.96 engines: {node: '>=10'} cpu: [arm] os: [linux] @@ -2257,10 +2265,10 @@ packages: dev: true optional: true - registry.npmjs.org/@swc/core-linux-arm64-gnu@1.3.94: - resolution: {integrity: sha512-iAcR8Ho0Uck/SLSrgYfXkpcGOXuN5waMZO7GlL/52QODr7GJtOfZ0H1MCZLbIFkPJp/iXoJpYgym4d/qSd477Q==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.3.94.tgz} + registry.npmjs.org/@swc/core-linux-arm64-gnu@1.3.96: + resolution: {integrity: sha512-c/IiJ0s1y3Ymm2BTpyC/xr6gOvoqAVETrivVXHq68xgNms95luSpbYQ28rqaZC8bQC8M5zdXpSc0T8DJu8RJGw==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.3.96.tgz} name: '@swc/core-linux-arm64-gnu' - version: 1.3.94 + version: 1.3.96 engines: {node: '>=10'} cpu: [arm64] os: [linux] @@ -2268,10 +2276,10 @@ packages: dev: true optional: true - registry.npmjs.org/@swc/core-linux-arm64-musl@1.3.94: - resolution: {integrity: sha512-VCHL1Mb9ENHx+sAeubSSg481MUeP9/PYzPPy9tfswunj/w35M+vEWflwK2dzQL9kUTFD3zcFTpAgsKnj6aX24w==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.3.94.tgz} + registry.npmjs.org/@swc/core-linux-arm64-musl@1.3.96: + resolution: {integrity: sha512-i5/UTUwmJLri7zhtF6SAo/4QDQJDH2fhYJaBIUhrICmIkRO/ltURmpejqxsM/ye9Jqv5zG7VszMC0v/GYn/7BQ==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.3.96.tgz} name: '@swc/core-linux-arm64-musl' - version: 1.3.94 + version: 1.3.96 engines: {node: '>=10'} cpu: [arm64] os: [linux] @@ -2279,10 +2287,10 @@ packages: dev: true optional: true - registry.npmjs.org/@swc/core-linux-x64-gnu@1.3.94: - resolution: {integrity: sha512-gjq7U6clhJi0Oel2a4gwR4MbSu+THQ2hmBNVCOSA3JjPZWZTkJXaJDpnh/r7PJxKBwUDlo0VPlwiwjepAQR2Rw==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.3.94.tgz} + registry.npmjs.org/@swc/core-linux-x64-gnu@1.3.96: + resolution: {integrity: sha512-USdaZu8lTIkm4Yf9cogct/j5eqtdZqTgcTib4I+NloUW0E/hySou3eSyp3V2UAA1qyuC72ld1otXuyKBna0YKQ==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.3.96.tgz} name: '@swc/core-linux-x64-gnu' - version: 1.3.94 + version: 1.3.96 engines: {node: '>=10'} cpu: [x64] os: [linux] @@ -2290,10 +2298,10 @@ packages: dev: true optional: true - registry.npmjs.org/@swc/core-linux-x64-musl@1.3.94: - resolution: {integrity: sha512-rSylruWyeol2ujZDHmwiovupMR5ukMXivlA7DDxmQ1dFUV9HuiPknQrU5rEbI3V2V3V5RkpbEKjnADen7AeMPQ==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.3.94.tgz} + registry.npmjs.org/@swc/core-linux-x64-musl@1.3.96: + resolution: {integrity: sha512-QYErutd+G2SNaCinUVobfL7jWWjGTI0QEoQ6hqTp7PxCJS/dmKmj3C5ZkvxRYcq7XcZt7ovrYCTwPTHzt6lZBg==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.3.96.tgz} name: '@swc/core-linux-x64-musl' - version: 1.3.94 + version: 1.3.96 engines: {node: '>=10'} cpu: [x64] os: [linux] @@ -2301,10 +2309,10 @@ packages: dev: true optional: true - registry.npmjs.org/@swc/core-win32-arm64-msvc@1.3.94: - resolution: {integrity: sha512-OenDUr5MQkz506ebVQq6ezoZ3GZ26nchgf5mPnwab4gx2TEiyR9zn7MdX5LWskTmOK3+FszPbGK0B5oLK6Y5yw==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.3.94.tgz} + registry.npmjs.org/@swc/core-win32-arm64-msvc@1.3.96: + resolution: {integrity: sha512-hjGvvAduA3Un2cZ9iNP4xvTXOO4jL3G9iakhFsgVhpkU73SGmK7+LN8ZVBEu4oq2SUcHO6caWvnZ881cxGuSpg==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.3.96.tgz} name: '@swc/core-win32-arm64-msvc' - version: 1.3.94 + version: 1.3.96 engines: {node: '>=10'} cpu: [arm64] os: [win32] @@ -2312,10 +2320,10 @@ packages: dev: true optional: true - registry.npmjs.org/@swc/core-win32-ia32-msvc@1.3.94: - resolution: {integrity: sha512-mi6NcmtJKnaiHAxLtVz+WzunscsEwPdA0j15DuiYVx06Xo+MdRLJj4eVBgVLwGD1AI3IqKs4MVVx2cD7n0h5mg==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.3.94.tgz} + registry.npmjs.org/@swc/core-win32-ia32-msvc@1.3.96: + resolution: {integrity: sha512-Far2hVFiwr+7VPCM2GxSmbh3ikTpM3pDombE+d69hkedvYHYZxtTF+2LTKl/sXtpbUnsoq7yV/32c9R/xaaWfw==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.3.96.tgz} name: '@swc/core-win32-ia32-msvc' - version: 1.3.94 + version: 1.3.96 engines: {node: '>=10'} cpu: [ia32] os: [win32] @@ -2323,10 +2331,10 @@ packages: dev: true optional: true - registry.npmjs.org/@swc/core-win32-x64-msvc@1.3.94: - resolution: {integrity: sha512-Ba0ZLcGMnqPWWF9Xa+rWhhnkpvE7XoQegMP/VCF2JIHb2ieGBC8jChO6nKRFKZjib/3wghGzxakyDQx3LDhDug==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.3.94.tgz} + registry.npmjs.org/@swc/core-win32-x64-msvc@1.3.96: + resolution: {integrity: sha512-4VbSAniIu0ikLf5mBX81FsljnfqjoVGleEkCQv4+zRlyZtO3FHoDPkeLVoy6WRlj7tyrRcfUJ4mDdPkbfTO14g==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.3.96.tgz} name: '@swc/core-win32-x64-msvc' - version: 1.3.94 + version: 1.3.96 engines: {node: '>=10'} cpu: [x64] os: [win32] @@ -2334,10 +2342,10 @@ packages: dev: true optional: true - registry.npmjs.org/@swc/core@1.3.94: - resolution: {integrity: sha512-jTHn8UJOGgERKZLy8euEixVAzC/w/rUSuMlM3e7hxgap/TC595hSkuQwtkpL238dsuEPveD44GMy2A5UBtSvjg==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@swc/core/-/core-1.3.94.tgz} + registry.npmjs.org/@swc/core@1.3.96: + resolution: {integrity: sha512-zwE3TLgoZwJfQygdv2SdCK9mRLYluwDOM53I+dT6Z5ZvrgVENmY3txvWDvduzkV+/8IuvrRbVezMpxcojadRdQ==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@swc/core/-/core-1.3.96.tgz} name: '@swc/core' - version: 1.3.94 + version: 1.3.96 engines: {node: '>=10'} requiresBuild: true peerDependencies: @@ -2349,16 +2357,16 @@ packages: '@swc/counter': registry.npmjs.org/@swc/counter@0.1.2 '@swc/types': registry.npmjs.org/@swc/types@0.1.5 optionalDependencies: - '@swc/core-darwin-arm64': registry.npmjs.org/@swc/core-darwin-arm64@1.3.94 - '@swc/core-darwin-x64': registry.npmjs.org/@swc/core-darwin-x64@1.3.94 - '@swc/core-linux-arm-gnueabihf': registry.npmjs.org/@swc/core-linux-arm-gnueabihf@1.3.94 - '@swc/core-linux-arm64-gnu': registry.npmjs.org/@swc/core-linux-arm64-gnu@1.3.94 - '@swc/core-linux-arm64-musl': registry.npmjs.org/@swc/core-linux-arm64-musl@1.3.94 - '@swc/core-linux-x64-gnu': registry.npmjs.org/@swc/core-linux-x64-gnu@1.3.94 - '@swc/core-linux-x64-musl': registry.npmjs.org/@swc/core-linux-x64-musl@1.3.94 - '@swc/core-win32-arm64-msvc': registry.npmjs.org/@swc/core-win32-arm64-msvc@1.3.94 - '@swc/core-win32-ia32-msvc': registry.npmjs.org/@swc/core-win32-ia32-msvc@1.3.94 - '@swc/core-win32-x64-msvc': registry.npmjs.org/@swc/core-win32-x64-msvc@1.3.94 + '@swc/core-darwin-arm64': registry.npmjs.org/@swc/core-darwin-arm64@1.3.96 + '@swc/core-darwin-x64': registry.npmjs.org/@swc/core-darwin-x64@1.3.96 + '@swc/core-linux-arm-gnueabihf': registry.npmjs.org/@swc/core-linux-arm-gnueabihf@1.3.96 + '@swc/core-linux-arm64-gnu': registry.npmjs.org/@swc/core-linux-arm64-gnu@1.3.96 + '@swc/core-linux-arm64-musl': registry.npmjs.org/@swc/core-linux-arm64-musl@1.3.96 + '@swc/core-linux-x64-gnu': registry.npmjs.org/@swc/core-linux-x64-gnu@1.3.96 + '@swc/core-linux-x64-musl': registry.npmjs.org/@swc/core-linux-x64-musl@1.3.96 + '@swc/core-win32-arm64-msvc': registry.npmjs.org/@swc/core-win32-arm64-msvc@1.3.96 + '@swc/core-win32-ia32-msvc': registry.npmjs.org/@swc/core-win32-ia32-msvc@1.3.96 + '@swc/core-win32-x64-msvc': registry.npmjs.org/@swc/core-win32-x64-msvc@1.3.96 dev: true registry.npmjs.org/@swc/counter@0.1.2: @@ -2387,35 +2395,43 @@ packages: dependencies: '@babel/parser': registry.npmjs.org/@babel/parser@7.23.0 '@babel/types': registry.npmjs.org/@babel/types@7.23.0 - '@types/babel__generator': registry.npmjs.org/@types/babel__generator@7.6.6 - '@types/babel__template': registry.npmjs.org/@types/babel__template@7.4.3 - '@types/babel__traverse': registry.npmjs.org/@types/babel__traverse@7.20.3 + '@types/babel__generator': registry.npmjs.org/@types/babel__generator@7.6.7 + '@types/babel__template': registry.npmjs.org/@types/babel__template@7.4.4 + '@types/babel__traverse': registry.npmjs.org/@types/babel__traverse@7.20.4 dev: false - registry.npmjs.org/@types/babel__generator@7.6.6: - resolution: {integrity: sha512-66BXMKb/sUWbMdBNdMvajU7i/44RkrA3z/Yt1c7R5xejt8qh84iU54yUWCtm0QwGJlDcf/gg4zd/x4mpLAlb/w==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.6.tgz} - name: '@types/babel__generator' - version: 7.6.6 - dependencies: - '@babel/types': registry.npmjs.org/@babel/types@7.23.0 - dev: false - - registry.npmjs.org/@types/babel__template@7.4.3: - resolution: {integrity: sha512-ciwyCLeuRfxboZ4isgdNZi/tkt06m8Tw6uGbBSBgWrnnZGNXiEyM27xc/PjXGQLqlZ6ylbgHMnm7ccF9tCkOeQ==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.3.tgz} - name: '@types/babel__template' - version: 7.4.3 + registry.npmjs.org/@types/babel__core@7.20.4: + resolution: {integrity: sha512-mLnSC22IC4vcWiuObSRjrLd9XcBTGf59vUSoq2jkQDJ/QQ8PMI9rSuzE+aEV8karUMbskw07bKYoUJCKTUaygg==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.4.tgz} + name: '@types/babel__core' + version: 7.20.4 dependencies: '@babel/parser': registry.npmjs.org/@babel/parser@7.23.0 '@babel/types': registry.npmjs.org/@babel/types@7.23.0 - dev: false + '@types/babel__generator': registry.npmjs.org/@types/babel__generator@7.6.7 + '@types/babel__template': registry.npmjs.org/@types/babel__template@7.4.4 + '@types/babel__traverse': registry.npmjs.org/@types/babel__traverse@7.20.4 - registry.npmjs.org/@types/babel__traverse@7.20.3: - resolution: {integrity: sha512-Lsh766rGEFbaxMIDH7Qa+Yha8cMVI3qAK6CHt3OR0YfxOIn5Z54iHiyDRycHrBqeIiqGa20Kpsv1cavfBKkRSw==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.3.tgz} + registry.npmjs.org/@types/babel__generator@7.6.7: + resolution: {integrity: sha512-6Sfsq+EaaLrw4RmdFWE9Onp63TOUue71AWb4Gpa6JxzgTYtimbM086WnYTy2U67AofR++QKCo08ZP6pwx8YFHQ==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.7.tgz} + name: '@types/babel__generator' + version: 7.6.7 + dependencies: + '@babel/types': registry.npmjs.org/@babel/types@7.23.0 + + registry.npmjs.org/@types/babel__template@7.4.4: + resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz} + name: '@types/babel__template' + version: 7.4.4 + dependencies: + '@babel/parser': registry.npmjs.org/@babel/parser@7.23.0 + '@babel/types': registry.npmjs.org/@babel/types@7.23.0 + + registry.npmjs.org/@types/babel__traverse@7.20.4: + resolution: {integrity: sha512-mSM/iKUk5fDDrEV/e83qY+Cr3I1+Q3qqTuEn++HAWYjEa1+NxZr6CNrcJGf2ZTnq4HoFGC3zaTPZTobCzCFukA==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.4.tgz} name: '@types/babel__traverse' - version: 7.20.3 + version: 7.20.4 dependencies: '@babel/types': registry.npmjs.org/@babel/types@7.23.0 - dev: false registry.npmjs.org/@types/cookie@0.5.3: resolution: {integrity: sha512-SLg07AS9z1Ab2LU+QxzU8RCmzsja80ywjf/t5oqw+4NSH20gIGlhLOrBDm1L3PBWzPa4+wkgFQVZAjE6Ioj2ug==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@types/cookie/-/cookie-0.5.3.tgz} @@ -2670,10 +2686,10 @@ packages: '@types/d3-zoom': registry.npmjs.org/@types/d3-zoom@3.0.1 dev: false - registry.npmjs.org/@types/dagre@0.7.48: - resolution: {integrity: sha512-rF3yXSwHIrDxEkN6edCE4TXknb5YSEpiXfLaspw1I08grC49ZFuAVGOQCmZGIuLUGoFgcqGlUFBL/XrpgYpQgw==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@types/dagre/-/dagre-0.7.48.tgz} + registry.npmjs.org/@types/dagre@0.7.52: + resolution: {integrity: sha512-XKJdy+OClLk3hketHi9Qg6gTfe1F3y+UFnHxKA2rn9Dw+oXa4Gb378Ztz9HlMgZKSxpPmn4BNVh9wgkpvrK1uw==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@types/dagre/-/dagre-0.7.52.tgz} name: '@types/dagre' - version: 0.7.48 + version: 0.7.52 dev: true registry.npmjs.org/@types/debug@4.1.10: @@ -2711,12 +2727,6 @@ packages: ci-info: registry.npmjs.org/ci-info@3.9.0 dev: true - registry.npmjs.org/@types/json-schema@7.0.14: - resolution: {integrity: sha512-U3PUjAudAdJBeC2pgN8uTIKgxrb4nlDF3SF0++EldXQvQBGkpFZMSnwQiIoDU77tv45VgNkl/L4ouD+rEomujw==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.14.tgz} - name: '@types/json-schema' - version: 7.0.14 - dev: true - registry.npmjs.org/@types/json-schema@7.0.15: resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz} name: '@types/json-schema' @@ -2771,10 +2781,10 @@ packages: version: 12.20.55 dev: true - registry.npmjs.org/@types/node@16.18.59: - resolution: {integrity: sha512-PJ1w2cNeKUEdey4LiPra0ZuxZFOGvetswE8qHRriV/sUkL5Al4tTmPV9D2+Y/TPIxTHHgxTfRjZVKWhPw/ORhQ==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@types/node/-/node-16.18.59.tgz} + registry.npmjs.org/@types/node@16.18.60: + resolution: {integrity: sha512-ZUGPWx5vKfN+G2/yN7pcSNLkIkXEvlwNaJEd4e0ppX7W2S8XAkdc/37hM4OUNJB9sa0p12AOvGvxL4JCPiz9DA==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@types/node/-/node-16.18.60.tgz} name: '@types/node' - version: 16.18.59 + version: 16.18.60 dev: true registry.npmjs.org/@types/node@18.7.16: @@ -2783,15 +2793,6 @@ packages: version: 18.7.16 dev: true - registry.npmjs.org/@types/node@20.8.7: - resolution: {integrity: sha512-21TKHHh3eUHIi2MloeptJWALuCu5H7HQTdTrWIFReA8ad+aggoX+lRes3ex7/FtpC+sVUpFMQ+QTfYr74mruiQ==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@types/node/-/node-20.8.7.tgz} - name: '@types/node' - version: 20.8.7 - dependencies: - undici-types: registry.npmjs.org/undici-types@5.25.3 - dev: true - optional: true - registry.npmjs.org/@types/normalize-package-data@2.4.3: resolution: {integrity: sha512-ehPtgRgaULsFG8x0NeYJvmyH1hmlfsNLujHe9dQEia/7MAJYdzMSi19JtchUHjmBA6XC/75dK55mzZH+RyieSg==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.3.tgz} name: '@types/normalize-package-data' @@ -2804,6 +2805,11 @@ packages: version: 6.0.3 dev: false + registry.npmjs.org/@types/prop-types@15.7.10: + resolution: {integrity: sha512-mxSnDQxPqsZxmeShFH+uwQ4kO4gcJcGahjjMFeLbKE95IAZiiZyiEepGZjtXJ7hN/yfu0bu9xN2ajcU0JcxX6A==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.10.tgz} + name: '@types/prop-types' + version: 15.7.10 + registry.npmjs.org/@types/prop-types@15.7.9: resolution: {integrity: sha512-n1yyPsugYNSmHgxDFjicaI2+gCNjsBck8UX9kuofAKlc0h1bL+20oSF72KeNaW2DUlesbEVCFgyV2dPGTiY42g==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.9.tgz} name: '@types/prop-types' @@ -2821,6 +2827,14 @@ packages: version: 2.0.9 dev: true + registry.npmjs.org/@types/react-dom@18.2.14: + resolution: {integrity: sha512-V835xgdSVmyQmI1KLV2BEIUgqEuinxp9O4G6g3FqO/SqLac049E53aysv0oEFD2kHfejeKU+ZqL2bcFWj9gLAQ==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.14.tgz} + name: '@types/react-dom' + version: 18.2.14 + dependencies: + '@types/react': registry.npmjs.org/@types/react@18.2.36 + dev: true + registry.npmjs.org/@types/react-dom@18.2.8: resolution: {integrity: sha512-bAIvO5lN/U8sPGvs1Xm61rlRHHaq5rp5N3kp9C+NJ/Q41P8iqjkXSu0+/qu8POsjH9pNWb0OYabFez7taP7omw==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.8.tgz} name: '@types/react-dom' @@ -2837,6 +2851,15 @@ packages: '@types/scheduler': registry.npmjs.org/@types/scheduler@0.16.5 csstype: registry.npmjs.org/csstype@3.1.2 + registry.npmjs.org/@types/react@18.2.36: + resolution: {integrity: sha512-o9XFsHYLLZ4+sb9CWUYwHqFVoG61SesydF353vFMMsQziiyRu8np4n2OYMUSDZ8XuImxDr9c5tR7gidlH29Vnw==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@types/react/-/react-18.2.36.tgz} + name: '@types/react' + version: 18.2.36 + dependencies: + '@types/prop-types': registry.npmjs.org/@types/prop-types@15.7.10 + '@types/scheduler': registry.npmjs.org/@types/scheduler@0.16.5 + csstype: registry.npmjs.org/csstype@3.1.2 + registry.npmjs.org/@types/resolve@1.20.2: resolution: {integrity: sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@types/resolve/-/resolve-1.20.2.tgz} name: '@types/resolve' @@ -2896,7 +2919,7 @@ packages: version: 2.10.2 requiresBuild: true dependencies: - '@types/node': registry.npmjs.org/@types/node@20.8.7 + '@types/node': registry.npmjs.org/@types/node@16.18.60 dev: true optional: true @@ -3251,7 +3274,7 @@ packages: eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 dependencies: '@eslint-community/eslint-utils': registry.npmjs.org/@eslint-community/eslint-utils@4.4.0(eslint@8.43.0) - '@types/json-schema': registry.npmjs.org/@types/json-schema@7.0.14 + '@types/json-schema': registry.npmjs.org/@types/json-schema@7.0.15 '@types/semver': registry.npmjs.org/@types/semver@7.5.4 '@typescript-eslint/scope-manager': registry.npmjs.org/@typescript-eslint/scope-manager@5.60.0 '@typescript-eslint/types': registry.npmjs.org/@typescript-eslint/types@5.60.0 @@ -3334,43 +3357,25 @@ packages: version: 1.2.0 dev: true - registry.npmjs.org/@vitejs/plugin-react-swc@3.3.2(vite@4.4.9): - resolution: {integrity: sha512-VJFWY5sfoZerQRvJrh518h3AcQt6f/yTuWn4/TRB+dqmYU0NX1qz7qM5Wfd+gOQqUzQW4gxKqKN3KpE/P3+zrA==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@vitejs/plugin-react-swc/-/plugin-react-swc-3.3.2.tgz} - id: registry.npmjs.org/@vitejs/plugin-react-swc/3.3.2 + registry.npmjs.org/@vitejs/plugin-react-swc@3.4.1(vite@4.5.0): + resolution: {integrity: sha512-7YQOQcVV5x1luD8nkbCDdyYygFvn1hjqJk68UvNAzY2QG4o4N5EwAhLLFNOcd1HrdMwDl0VElP8VutoWf9IvJg==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@vitejs/plugin-react-swc/-/plugin-react-swc-3.4.1.tgz} + id: registry.npmjs.org/@vitejs/plugin-react-swc/3.4.1 name: '@vitejs/plugin-react-swc' - version: 3.3.2 + version: 3.4.1 peerDependencies: vite: ^4 dependencies: - '@swc/core': registry.npmjs.org/@swc/core@1.3.94 - vite: registry.npmjs.org/vite@4.4.9 + '@swc/core': registry.npmjs.org/@swc/core@1.3.96 + vite: registry.npmjs.org/vite@4.5.0 transitivePeerDependencies: - '@swc/helpers' dev: true - registry.npmjs.org/@vitejs/plugin-react@4.0.4(vite@4.4.9): - resolution: {integrity: sha512-7wU921ABnNYkETiMaZy7XqpueMnpu5VxvVps13MjmCo+utBdD79sZzrApHawHtVX66cCJQQTXFcjH0y9dSUK8g==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.0.4.tgz} - id: registry.npmjs.org/@vitejs/plugin-react/4.0.4 + registry.npmjs.org/@vitejs/plugin-react@4.1.1(vite@4.5.0): + resolution: {integrity: sha512-Jie2HERK+uh27e+ORXXwEP5h0Y2lS9T2PRGbfebiHGlwzDO0dEnd2aNtOR/qjBlPb1YgxwAONeblL1xqLikLag==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.1.1.tgz} + id: registry.npmjs.org/@vitejs/plugin-react/4.1.1 name: '@vitejs/plugin-react' - version: 4.0.4 - engines: {node: ^14.18.0 || >=16.0.0} - peerDependencies: - vite: ^4.2.0 - dependencies: - '@babel/core': registry.npmjs.org/@babel/core@7.23.2 - '@babel/plugin-transform-react-jsx-self': registry.npmjs.org/@babel/plugin-transform-react-jsx-self@7.22.5(@babel/core@7.23.2) - '@babel/plugin-transform-react-jsx-source': registry.npmjs.org/@babel/plugin-transform-react-jsx-source@7.22.5(@babel/core@7.23.2) - react-refresh: registry.npmjs.org/react-refresh@0.14.0 - vite: registry.npmjs.org/vite@4.4.9 - transitivePeerDependencies: - - supports-color - dev: true - - registry.npmjs.org/@vitejs/plugin-react@4.0.4(vite@4.5.0): - resolution: {integrity: sha512-7wU921ABnNYkETiMaZy7XqpueMnpu5VxvVps13MjmCo+utBdD79sZzrApHawHtVX66cCJQQTXFcjH0y9dSUK8g==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.0.4.tgz} - id: registry.npmjs.org/@vitejs/plugin-react/4.0.4 - name: '@vitejs/plugin-react' - version: 4.0.4 + version: 4.1.1 engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: vite: ^4.2.0 @@ -3378,11 +3383,11 @@ packages: '@babel/core': registry.npmjs.org/@babel/core@7.23.2 '@babel/plugin-transform-react-jsx-self': registry.npmjs.org/@babel/plugin-transform-react-jsx-self@7.22.5(@babel/core@7.23.2) '@babel/plugin-transform-react-jsx-source': registry.npmjs.org/@babel/plugin-transform-react-jsx-source@7.22.5(@babel/core@7.23.2) + '@types/babel__core': registry.npmjs.org/@types/babel__core@7.20.4 react-refresh: registry.npmjs.org/react-refresh@0.14.0 vite: registry.npmjs.org/vite@4.5.0 transitivePeerDependencies: - supports-color - dev: false registry.npmjs.org/acorn-jsx@5.3.2(acorn@8.10.0): resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz} @@ -3513,6 +3518,12 @@ packages: version: 2.2.0 dev: true + registry.npmjs.org/arg@5.0.2: + resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/arg/-/arg-5.0.2.tgz} + name: arg + version: 5.0.2 + dev: true + registry.npmjs.org/argparse@1.0.10: resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz} name: argparse @@ -3723,10 +3734,10 @@ packages: - terser dev: false - registry.npmjs.org/async@3.2.4: - resolution: {integrity: sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/async/-/async-3.2.4.tgz} + registry.npmjs.org/async@3.2.5: + resolution: {integrity: sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/async/-/async-3.2.5.tgz} name: async - version: 3.2.4 + version: 3.2.5 dev: true registry.npmjs.org/asynciterator.prototype@1.0.0: @@ -3788,13 +3799,14 @@ packages: version: 1.12.0 dev: true - registry.npmjs.org/axios@0.21.4(debug@4.3.2): - resolution: {integrity: sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/axios/-/axios-0.21.4.tgz} - id: registry.npmjs.org/axios/0.21.4 + registry.npmjs.org/axios@0.27.2(debug@4.3.4): + resolution: {integrity: sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/axios/-/axios-0.27.2.tgz} + id: registry.npmjs.org/axios/0.27.2 name: axios - version: 0.21.4 + version: 0.27.2 dependencies: - follow-redirects: registry.npmjs.org/follow-redirects@1.15.3(debug@4.3.2) + follow-redirects: registry.npmjs.org/follow-redirects@1.15.3(debug@4.3.4) + form-data: registry.npmjs.org/form-data@4.0.0 transitivePeerDependencies: - debug dev: true @@ -4616,16 +4628,15 @@ packages: stream-transform: registry.npmjs.org/stream-transform@2.1.3 dev: true - registry.npmjs.org/cypress-real-events@1.10.0(cypress@12.17.3): - resolution: {integrity: sha512-ALSdCiG+Rj3Sl6qooqTFeFGBxOIe8QJUcgIuJ6ZVBanTEijXRzqxqstMC2ZKfixqj1TyNjolyZU4zOoN/jtHpg==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/cypress-real-events/-/cypress-real-events-1.10.0.tgz} - id: registry.npmjs.org/cypress-real-events/1.10.0 + registry.npmjs.org/cypress-real-events@1.11.0(cypress@12.17.3): + resolution: {integrity: sha512-4LXVRsyq+xBh5TmlEyO1ojtBXtN7xw720Pwb9rEE9rkJuXmeH3VyoR1GGayMGr+Itqf11eEjfDewtDmcx6PWPQ==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/cypress-real-events/-/cypress-real-events-1.11.0.tgz} + id: registry.npmjs.org/cypress-real-events/1.11.0 name: cypress-real-events - version: 1.10.0 + version: 1.11.0 peerDependencies: - cypress: ^4.x || ^5.x || ^6.x || ^7.x || ^8.x || ^9.x || ^10.x || ^11.x || ^12.x + cypress: ^4.x || ^5.x || ^6.x || ^7.x || ^8.x || ^9.x || ^10.x || ^11.x || ^12.x || ^13.x dependencies: cypress: registry.npmjs.org/cypress@12.17.3 - prettier: registry.npmjs.org/prettier@3.0.3 dev: true registry.npmjs.org/cypress@12.17.3: @@ -4638,7 +4649,7 @@ packages: dependencies: '@cypress/request': registry.npmjs.org/@cypress/request@2.88.12 '@cypress/xvfb': registry.npmjs.org/@cypress/xvfb@1.2.4(supports-color@8.1.1) - '@types/node': registry.npmjs.org/@types/node@16.18.59 + '@types/node': registry.npmjs.org/@types/node@16.18.60 '@types/sinonjs__fake-timers': registry.npmjs.org/@types/sinonjs__fake-timers@8.1.1 '@types/sizzle': registry.npmjs.org/@types/sizzle@2.3.5 arch: registry.npmjs.org/arch@2.2.0 @@ -4830,20 +4841,6 @@ packages: ms: registry.npmjs.org/ms@2.1.3 supports-color: registry.npmjs.org/supports-color@8.1.1 - registry.npmjs.org/debug@4.3.2: - resolution: {integrity: sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/debug/-/debug-4.3.2.tgz} - name: debug - version: 4.3.2 - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - dependencies: - ms: registry.npmjs.org/ms@2.1.2 - dev: true - registry.npmjs.org/debug@4.3.4(supports-color@8.1.1): resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/debug/-/debug-4.3.4.tgz} id: registry.npmjs.org/debug/4.3.4 @@ -6022,7 +6019,7 @@ packages: version: 3.2.9 dev: true - registry.npmjs.org/follow-redirects@1.15.3(debug@4.3.2): + registry.npmjs.org/follow-redirects@1.15.3(debug@4.3.4): resolution: {integrity: sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.3.tgz} id: registry.npmjs.org/follow-redirects/1.15.3 name: follow-redirects @@ -6034,7 +6031,7 @@ packages: debug: optional: true dependencies: - debug: registry.npmjs.org/debug@4.3.2 + debug: registry.npmjs.org/debug@4.3.4(supports-color@8.1.1) dev: true registry.npmjs.org/for-each@0.3.3: @@ -6062,6 +6059,17 @@ packages: mime-types: registry.npmjs.org/mime-types@2.1.35 dev: true + registry.npmjs.org/form-data@4.0.0: + resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz} + name: form-data + version: 4.0.0 + engines: {node: '>= 6'} + dependencies: + asynckit: registry.npmjs.org/asynckit@0.4.0 + combined-stream: registry.npmjs.org/combined-stream@1.0.8 + mime-types: registry.npmjs.org/mime-types@2.1.35 + dev: true + registry.npmjs.org/fraction.js@4.3.7: resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz} name: fraction.js @@ -6123,7 +6131,7 @@ packages: at-least-node: registry.npmjs.org/at-least-node@1.0.0 graceful-fs: registry.npmjs.org/graceful-fs@4.2.11 jsonfile: registry.npmjs.org/jsonfile@6.1.0 - universalify: registry.npmjs.org/universalify@2.0.0 + universalify: registry.npmjs.org/universalify@2.0.1 dev: true registry.npmjs.org/fs.realpath@1.0.0: @@ -6233,7 +6241,7 @@ packages: name: getos version: 3.2.1 dependencies: - async: registry.npmjs.org/async@3.2.4 + async: registry.npmjs.org/async@3.2.5 dev: true registry.npmjs.org/getpass@0.1.7: @@ -6347,7 +6355,7 @@ packages: dependencies: array-union: registry.npmjs.org/array-union@2.1.0 dir-glob: registry.npmjs.org/dir-glob@3.0.1 - fast-glob: registry.npmjs.org/fast-glob@3.3.1 + fast-glob: registry.npmjs.org/fast-glob@3.3.2 ignore: registry.npmjs.org/ignore@5.2.4 merge2: registry.npmjs.org/merge2@1.4.1 slash: registry.npmjs.org/slash@3.0.0 @@ -6360,7 +6368,7 @@ packages: engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dependencies: dir-glob: registry.npmjs.org/dir-glob@3.0.1 - fast-glob: registry.npmjs.org/fast-glob@3.3.1 + fast-glob: registry.npmjs.org/fast-glob@3.3.2 ignore: registry.npmjs.org/ignore@5.2.4 merge2: registry.npmjs.org/merge2@1.4.1 slash: registry.npmjs.org/slash@4.0.0 @@ -6570,14 +6578,6 @@ packages: space-separated-tokens: registry.npmjs.org/space-separated-tokens@2.0.2 dev: false - registry.npmjs.org/history@5.3.0: - resolution: {integrity: sha512-ZqaKwjjrAYUYfLG+htGaIIZ4nioX2L70ZUMIFysS3xvBsSG4x/n1V6TXV3N8ZYNuFGlDirFg32T7B6WOUPDYcQ==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/history/-/history-5.3.0.tgz} - name: history - version: 5.3.0 - dependencies: - '@babel/runtime': registry.npmjs.org/@babel/runtime@7.23.2 - dev: false - registry.npmjs.org/hosted-git-info@2.8.9: resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz} name: hosted-git-info @@ -7273,7 +7273,7 @@ packages: name: jsonfile version: 6.1.0 dependencies: - universalify: registry.npmjs.org/universalify@2.0.0 + universalify: registry.npmjs.org/universalify@2.0.1 optionalDependencies: graceful-fs: registry.npmjs.org/graceful-fs@4.2.11 dev: true @@ -8258,6 +8258,14 @@ packages: version: 3.3.6 engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true + dev: true + + registry.npmjs.org/nanoid@3.3.7: + resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz} + name: nanoid + version: 3.3.7 + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true registry.npmjs.org/napi-build-utils@1.0.2: resolution: {integrity: sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz} @@ -9319,7 +9327,7 @@ packages: version: 8.4.31 engines: {node: ^10 || ^12 || >=14} dependencies: - nanoid: registry.npmjs.org/nanoid@3.3.6 + nanoid: registry.npmjs.org/nanoid@3.3.7 picocolors: registry.npmjs.org/picocolors@1.0.0 source-map-js: registry.npmjs.org/source-map-js@1.0.2 @@ -9516,6 +9524,13 @@ packages: engines: {node: '>=6'} dev: true + registry.npmjs.org/punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz} + name: punycode + version: 2.3.1 + engines: {node: '>=6'} + dev: true + registry.npmjs.org/qs@6.10.4: resolution: {integrity: sha512-OQiU+C+Ds5qiH91qh/mg0w+8nwQuLjM4F4M/PbmhDOoYehPh+Fb0bDjtR1sOvy7YKxvj28Y/M0PhP5uVX0kB+g==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/qs/-/qs-6.10.4.tgz} name: qs @@ -9595,30 +9610,32 @@ packages: version: 0.14.0 engines: {node: '>=0.10.0'} - registry.npmjs.org/react-router-dom@6.3.0(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-uaJj7LKytRxZNQV8+RbzJWnJ8K2nPsOOEuX7aQstlMZKQT0164C+X2w6bnkqU3sjtLvpd5ojrezAyfZ1+0sStw==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.3.0.tgz} - id: registry.npmjs.org/react-router-dom/6.3.0 + registry.npmjs.org/react-router-dom@6.18.0(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-Ubrue4+Ercc/BoDkFQfc6og5zRQ4A8YxSO3Knsne+eRbZ+IepAsK249XBH/XaFuOYOYr3L3r13CXTLvYt5JDjw==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.18.0.tgz} + id: registry.npmjs.org/react-router-dom/6.18.0 name: react-router-dom - version: 6.3.0 + version: 6.18.0 + engines: {node: '>=14.0.0'} peerDependencies: react: '>=16.8' react-dom: '>=16.8' dependencies: - history: registry.npmjs.org/history@5.3.0 + '@remix-run/router': registry.npmjs.org/@remix-run/router@1.11.0 react: registry.npmjs.org/react@18.2.0 react-dom: registry.npmjs.org/react-dom@18.2.0(react@18.2.0) - react-router: registry.npmjs.org/react-router@6.3.0(react@18.2.0) + react-router: registry.npmjs.org/react-router@6.18.0(react@18.2.0) dev: false - registry.npmjs.org/react-router@6.3.0(react@18.2.0): - resolution: {integrity: sha512-7Wh1DzVQ+tlFjkeo+ujvjSqSJmkt1+8JO+T5xklPlgrh70y7ogx75ODRW0ThWhY7S+6yEDks8TYrtQe/aoboBQ==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/react-router/-/react-router-6.3.0.tgz} - id: registry.npmjs.org/react-router/6.3.0 + registry.npmjs.org/react-router@6.18.0(react@18.2.0): + resolution: {integrity: sha512-vk2y7Dsy8wI02eRRaRmOs9g2o+aE72YCx5q9VasT1N9v+lrdB79tIqrjMfByHiY5+6aYkH2rUa5X839nwWGPDg==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/react-router/-/react-router-6.18.0.tgz} + id: registry.npmjs.org/react-router/6.18.0 name: react-router - version: 6.3.0 + version: 6.18.0 + engines: {node: '>=14.0.0'} peerDependencies: react: '>=16.8' dependencies: - history: registry.npmjs.org/history@5.3.0 + '@remix-run/router': registry.npmjs.org/@remix-run/router@1.11.0 react: registry.npmjs.org/react@18.2.0 dev: false @@ -9720,6 +9737,7 @@ packages: resolution: {integrity: sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz} name: regenerator-runtime version: 0.14.0 + dev: true registry.npmjs.org/regexp.prototype.flags@1.5.1: resolution: {integrity: sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz} @@ -10477,20 +10495,21 @@ packages: tweetnacl: registry.npmjs.org/tweetnacl@0.14.5 dev: true - registry.npmjs.org/start-server-and-test@1.14.0: - resolution: {integrity: sha512-on5ELuxO2K0t8EmNj9MtVlFqwBMxfWOhu4U7uZD1xccVpFlOQKR93CSe0u98iQzfNxRyaNTb/CdadbNllplTsw==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/start-server-and-test/-/start-server-and-test-1.14.0.tgz} + registry.npmjs.org/start-server-and-test@2.0.2: + resolution: {integrity: sha512-4sGS2QmETUwqeBUqtTLP7OqXp3PdDnevaWlPlrFQgn8+7uCgVg4Do7/H/ZhAAVyvnL3DqKyANhnLgcgxrjhrMA==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/start-server-and-test/-/start-server-and-test-2.0.2.tgz} name: start-server-and-test - version: 1.14.0 - engines: {node: '>=6'} + version: 2.0.2 + engines: {node: '>=16'} hasBin: true dependencies: + arg: registry.npmjs.org/arg@5.0.2 bluebird: registry.npmjs.org/bluebird@3.7.2 check-more-types: registry.npmjs.org/check-more-types@2.24.0 - debug: registry.npmjs.org/debug@4.3.2 + debug: registry.npmjs.org/debug@4.3.4(supports-color@8.1.1) execa: registry.npmjs.org/execa@5.1.1 lazy-ass: registry.npmjs.org/lazy-ass@1.6.0 ps-tree: registry.npmjs.org/ps-tree@1.2.0 - wait-on: registry.npmjs.org/wait-on@6.0.0(debug@4.3.2) + wait-on: registry.npmjs.org/wait-on@7.1.0(debug@4.3.4) transitivePeerDependencies: - supports-color dev: true @@ -11241,7 +11260,7 @@ packages: engines: {node: '>=6'} dependencies: psl: registry.npmjs.org/psl@1.9.0 - punycode: registry.npmjs.org/punycode@2.3.0 + punycode: registry.npmjs.org/punycode@2.3.1 universalify: registry.npmjs.org/universalify@0.2.0 url-parse: registry.npmjs.org/url-parse@1.5.10 dev: true @@ -11585,13 +11604,6 @@ packages: which-boxed-primitive: registry.npmjs.org/which-boxed-primitive@1.0.2 dev: true - registry.npmjs.org/undici-types@5.25.3: - resolution: {integrity: sha512-Ga1jfYwRn7+cP9v8auvEXN1rX3sWqlayd4HP7OKk4mZWylEmu3KzXDUGrQUN6Ol7qo1gPvB2e5gX6udnyEPgdA==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/undici-types/-/undici-types-5.25.3.tgz} - name: undici-types - version: 5.25.3 - dev: true - optional: true - registry.npmjs.org/undici@5.23.0: resolution: {integrity: sha512-1D7w+fvRsqlQ9GscLBwcAJinqcZGHUKjbOmXdlE/v8BvEGXjeWAax+341q44EuTcHXXnfyKNbKRq4Lg7OzhMmg==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/undici/-/undici-5.23.0.tgz} name: undici @@ -11743,6 +11755,13 @@ packages: engines: {node: '>= 10.0.0'} dev: true + registry.npmjs.org/universalify@2.0.1: + resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz} + name: universalify + version: 2.0.1 + engines: {node: '>= 10.0.0'} + dev: true + registry.npmjs.org/untildify@4.0.0: resolution: {integrity: sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz} name: untildify @@ -11865,43 +11884,6 @@ packages: vfile-message: registry.npmjs.org/vfile-message@3.1.4 dev: false - registry.npmjs.org/vite@4.4.9: - resolution: {integrity: sha512-2mbUn2LlUmNASWwSCNSJ/EG2HuSRTnVNaydp6vMCm5VIqJsjMfbIWtbH2kDuwUVW5mMUKKZvGPX/rqeqVvv1XA==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/vite/-/vite-4.4.9.tgz} - name: vite - version: 4.4.9 - engines: {node: ^14.18.0 || >=16.0.0} - hasBin: true - peerDependencies: - '@types/node': '>= 14' - less: '*' - lightningcss: ^1.21.0 - sass: '*' - stylus: '*' - sugarss: '*' - terser: ^5.4.0 - peerDependenciesMeta: - '@types/node': - optional: true - less: - optional: true - lightningcss: - optional: true - sass: - optional: true - stylus: - optional: true - sugarss: - optional: true - terser: - optional: true - dependencies: - esbuild: registry.npmjs.org/esbuild@0.18.20 - postcss: registry.npmjs.org/postcss@8.4.31 - rollup: registry.npmjs.org/rollup@3.29.4 - optionalDependencies: - fsevents: registry.npmjs.org/fsevents@2.3.3 - dev: true - registry.npmjs.org/vite@4.5.0: resolution: {integrity: sha512-ulr8rNLA6rkyFAlVWw2q5YJ91v098AFQ2R0PRFwPzREXOUJQPtFUG0t+/ZikhaOCDqFoDhN6/v8Sq0o4araFAw==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/vite/-/vite-4.5.0.tgz} name: vite @@ -11963,15 +11945,15 @@ packages: version: 8.0.0 dev: false - registry.npmjs.org/wait-on@6.0.0(debug@4.3.2): - resolution: {integrity: sha512-tnUJr9p5r+bEYXPUdRseolmz5XqJTTj98JgOsfBn7Oz2dxfE2g3zw1jE+Mo8lopM3j3et/Mq1yW7kKX6qw7RVw==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/wait-on/-/wait-on-6.0.0.tgz} - id: registry.npmjs.org/wait-on/6.0.0 + registry.npmjs.org/wait-on@7.1.0(debug@4.3.4): + resolution: {integrity: sha512-U7TF/OYYzAg+OoiT/B8opvN48UHt0QYMi4aD3PjRFpybQ+o6czQF8Ig3SKCCMJdxpBrCalIJ4O00FBof27Fu9Q==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/wait-on/-/wait-on-7.1.0.tgz} + id: registry.npmjs.org/wait-on/7.1.0 name: wait-on - version: 6.0.0 - engines: {node: '>=10.0.0'} + version: 7.1.0 + engines: {node: '>=12.0.0'} hasBin: true dependencies: - axios: registry.npmjs.org/axios@0.21.4(debug@4.3.2) + axios: registry.npmjs.org/axios@0.27.2(debug@4.3.4) joi: registry.npmjs.org/joi@17.11.0 lodash: registry.npmjs.org/lodash@4.17.21 minimist: registry.npmjs.org/minimist@1.2.8 @@ -12306,6 +12288,29 @@ packages: use-sync-external-store: registry.npmjs.org/use-sync-external-store@1.2.0(react@18.2.0) dev: false + registry.npmjs.org/zustand@4.4.6(@types/react@18.2.36)(react@18.2.0): + resolution: {integrity: sha512-Rb16eW55gqL4W2XZpJh0fnrATxYEG3Apl2gfHTyDSE965x/zxslTikpNch0JgNjJA9zK6gEFW8Fl6d1rTZaqgg==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/zustand/-/zustand-4.4.6.tgz} + id: registry.npmjs.org/zustand/4.4.6 + name: zustand + version: 4.4.6 + engines: {node: '>=12.7.0'} + peerDependencies: + '@types/react': '>=16.8' + immer: '>=9.0' + react: '>=16.8' + peerDependenciesMeta: + '@types/react': + optional: true + immer: + optional: true + react: + optional: true + dependencies: + '@types/react': registry.npmjs.org/@types/react@18.2.36 + react: registry.npmjs.org/react@18.2.0 + use-sync-external-store: registry.npmjs.org/use-sync-external-store@1.2.0(react@18.2.0) + dev: false + registry.npmjs.org/zwitch@2.0.4: resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz} name: zwitch From 8be0337e00fc2bb95ed0d00e6101c03dce0559b3 Mon Sep 17 00:00:00 2001 From: Peter Date: Tue, 7 Nov 2023 16:19:09 +0100 Subject: [PATCH 019/608] refactored react-examples app and created generic test case component --- examples/react/cypress.config.ts | 2 +- examples/react/src/App/index.tsx | 150 ++++++++-------- examples/react/src/app.d.ts | 7 + examples/react/src/generic-tests/Flow.tsx | 29 ++++ .../react/src/generic-tests/edges/general.ts | 163 ++++++++++++++++++ examples/react/src/generic-tests/index.tsx | 17 ++ .../react/src/generic-tests/nodes/general.ts | 1 + 7 files changed, 299 insertions(+), 70 deletions(-) create mode 100644 examples/react/src/app.d.ts create mode 100644 examples/react/src/generic-tests/Flow.tsx create mode 100644 examples/react/src/generic-tests/edges/general.ts create mode 100644 examples/react/src/generic-tests/index.tsx create mode 100644 examples/react/src/generic-tests/nodes/general.ts diff --git a/examples/react/cypress.config.ts b/examples/react/cypress.config.ts index b46eaa76..027bd690 100644 --- a/examples/react/cypress.config.ts +++ b/examples/react/cypress.config.ts @@ -2,7 +2,7 @@ import { defineConfig } from 'cypress'; export default defineConfig({ e2e: { - baseUrl: 'http://localhost:3000', + baseUrl: 'http://localhost:3000/examples', viewportWidth: 1280, viewportHeight: 720, video: false, diff --git a/examples/react/src/App/index.tsx b/examples/react/src/App/index.tsx index b6bc5be7..77344ba2 100644 --- a/examples/react/src/App/index.tsx +++ b/examples/react/src/App/index.tsx @@ -1,5 +1,7 @@ import { useEffect, useState } from 'react'; -import { BrowserRouter, Route, Routes, useLocation, useNavigate } from 'react-router-dom'; +import { BrowserRouter, Outlet, Route, Routes, useLocation, useNavigate } from 'react-router-dom'; + +import GenericTests from '../generic-tests'; import Basic from '../examples/Basic'; import Backgrounds from '../examples/Backgrounds'; @@ -57,232 +59,232 @@ interface IRoute { const routes: IRoute[] = [ { name: 'Basic', - path: '/', + path: 'basic', component: Basic, }, { name: 'Backgrounds', - path: '/backgrounds', + path: 'backgrounds', component: Backgrounds, }, { name: 'Cancel Connection', - path: '/cancel-connection', + path: 'cancel-connection', component: CancelConnection, }, { name: 'Controlled/Uncontrolled', - path: '/controlled-uncontrolled', + path: 'controlled-uncontrolled', component: ControlledUncontrolled, }, { name: 'Controlled Viewport', - path: '/controlled-viewport', + path: 'controlled-viewport', component: ControlledViewport, }, { name: 'Custom Connection Line', - path: '/custom-connectionline', + path: 'custom-connectionline', component: CustomConnectionLine, }, { name: 'Custom Minimap Node', - path: '/custom-minimap-node', + path: 'custom-minimap-node', component: CustomMiniMapNode, }, { name: 'Custom Node', - path: '/custom-node', + path: 'custom-node', component: CustomNode, }, { name: 'Default Nodes', - path: '/default-nodes', + path: 'default-nodes', component: DefaultNodes, }, { name: 'Drag Handle', - path: '/draghandle', + path: 'draghandle', component: DragHandle, }, { name: 'Drag and Drop', - path: '/dragndrop', + path: 'dragndrop', component: DragNDrop, }, { name: 'EasyConnect', - path: '/easy-connect', + path: 'easy-connect', component: EasyConnect, }, { name: 'Edges', - path: '/edges', + path: 'edges', component: Edges, }, { name: 'Edge Renderer', - path: '/edge-renderer', + path: 'edge-renderer', component: EdgeRenderer, }, { name: 'Edge Types', - path: '/edge-types', + path: 'edge-types', component: EdgeTypes, }, { name: 'Edge Routing', - path: '/edge-routing', + path: 'edge-routing', component: EdgeRouting, }, { name: 'Empty', - path: '/empty', + path: 'empty', component: Empty, }, { name: 'Figma', - path: '/figma', + path: 'figma', component: Figma, }, { name: 'Floating Edges', - path: '/floating-edges', + path: 'floating-edges', component: FloatingEdges, }, { name: 'Hidden', - path: '/hidden', + path: 'hidden', component: Hidden, }, { name: 'Interaction', - path: '/interaction', + path: 'interaction', component: Interaction, }, { name: 'Intersection', - path: '/intersection', + path: 'intersection', component: Intersection, }, { name: 'Interactive Minimap', - path: '/interactive-minimap', + path: 'interactive-minimap', component: InteractiveMinimap, }, { name: 'Layouting', - path: '/layouting', + path: 'layouting', component: Layouting, }, { name: 'Multi Flows', - path: '/multiflows', + path: 'multiflows', component: MultiFlows, }, { name: 'Nested Nodes', - path: '/nested-nodes', + path: 'nested-nodes', component: NestedNodes, }, { name: 'Node Type Change', - path: '/nodetype-change', + path: 'nodetype-change', component: NodeTypeChange, }, { name: 'nodeTypes Object Change', - path: '/nodetypesobject-change', + path: 'nodetypesobject-change', component: NodeTypesObjectChange, }, { name: 'NodeToolbar', - path: '/node-toolbar', + path: 'node-toolbar', component: NodeToolbar, }, { name: 'NodeResizer', - path: '/node-resizer', + path: 'node-resizer', component: NodeResizer, }, { name: 'Overview', - path: '/overview', + path: 'overview', component: Overview, }, { name: 'Provider', - path: '/provider', + path: 'provider', component: Provider, }, { name: 'Save/Restore', - path: '/save-restore', + path: 'save-restore', component: SaveRestore, }, { name: 'Stress', - path: '/stress', + path: 'stress', component: Stress, }, { name: 'Subflow', - path: '/subflow', + path: 'subflow', component: Subflow, }, { name: 'Switch Flow', - path: '/switch', + path: 'switch', component: SwitchFlow, }, { name: 'Touch Device', - path: '/touch-device', + path: 'touch-device', component: TouchDevice, }, { name: 'Undirectional', - path: '/undirectional', + path: 'undirectional', component: Undirectional, }, { name: 'Updatable Edge', - path: '/updatable-edge', + path: 'updatable-edge', component: UpdatableEdge, }, { name: 'Update Node', - path: '/update-node', + path: 'update-node', component: UpdateNode, }, { name: 'useNodesInitialized', - path: '/use-nodes-initialized', + path: 'use-nodes-initialized', component: useNodesInitialized, }, { name: 'useOnSelectionChange', - path: '/use-on-selection-change', + path: 'use-on-selection-change', component: UseOnSelectionChange, }, { name: 'useReactFlow', - path: '/usereactflow', + path: 'usereactflow', component: UseReactFlow, }, { name: 'useUpdateNodeInternals', - path: '/useupdatenodeinternals', + path: 'useupdatenodeinternals', component: UseUpdateNodeInternals, }, { name: 'Validation', - path: '/validation', + path: 'validation', component: Validation, }, { name: 'useKeyPress', - path: '/use-key-press', + path: 'use-key-press', component: UseKeyPress, }, ]; @@ -299,28 +301,38 @@ const Header = () => { }, [currentPath]); return ( -
- - React Flow Dev - - -
+ <> +
+ + React Flow Dev + + +
+ + ); }; -export default () => ( - -
- - {routes.map((route) => ( - } /> - ))} - - -); +export default () => { + return ( + <> + + + }> + } /> + {routes.map((route) => ( + } /> + ))} + + } /> + + + + ); +}; diff --git a/examples/react/src/app.d.ts b/examples/react/src/app.d.ts new file mode 100644 index 00000000..1118fb9d --- /dev/null +++ b/examples/react/src/app.d.ts @@ -0,0 +1,7 @@ +import { Edge, Node, ReactFlowProps } from '@xyflow/react'; + +declare global { + interface GenericTestCase { + reactFlowProps: Omit & { nodes: Node[]; edges: Edge[] }; + } +} diff --git a/examples/react/src/generic-tests/Flow.tsx b/examples/react/src/generic-tests/Flow.tsx new file mode 100644 index 00000000..28b38001 --- /dev/null +++ b/examples/react/src/generic-tests/Flow.tsx @@ -0,0 +1,29 @@ +import { useState, useCallback } from 'react'; +import { ReactFlow, Controls, Background, applyNodeChanges, applyEdgeChanges } from '@xyflow/react'; + +type FlowProps = { + generics: GenericTestCase; +}; + +export default ({ generics }: FlowProps) => { + const [nodes, setNodes] = useState(generics.reactFlowProps.nodes); + const [edges, setEdges] = useState(generics.reactFlowProps.edges); + + const onNodesChange = useCallback((changes) => setNodes((nds) => applyNodeChanges(changes, nds)), []); + const onEdgesChange = useCallback((changes) => setEdges((eds) => applyEdgeChanges(changes, eds)), []); + + return ( +
+ + + + +
+ ); +}; diff --git a/examples/react/src/generic-tests/edges/general.ts b/examples/react/src/generic-tests/edges/general.ts new file mode 100644 index 00000000..596c836d --- /dev/null +++ b/examples/react/src/generic-tests/edges/general.ts @@ -0,0 +1,163 @@ +import { MarkerType } from '@xyflow/react'; + +export default { + reactFlowProps: { + fitView: true, + nodes: [ + { + id: '1', + data: { label: '1' }, + position: { x: 0, y: 0 }, + type: 'input', + }, + { + id: '2', + data: { label: '2' }, + position: { x: -100, y: 100 }, + }, + { + id: '3', + data: { label: '3' }, + position: { x: 100, y: 100 }, + }, + { + id: '4', + data: { label: '4' }, + position: { x: -100, y: 200 }, + }, + { + id: '5', + data: { label: '5' }, + position: { x: 100, y: 200 }, + }, + { + id: '6', + data: { label: '6' }, + position: { x: -100, y: 300 }, + }, + { + id: '7', + data: { label: '7' }, + position: { x: 100, y: 300 }, + }, + { + id: '8', + data: { label: '8' }, + position: { x: -100, y: 400 }, + }, + { + id: '9', + data: { label: '9' }, + position: { x: 100, y: 400 }, + }, + { + id: '10', + data: { label: '10' }, + position: { x: -100, y: 500 }, + }, + { + id: '11', + data: { label: '11' }, + position: { x: 100, y: 500 }, + }, + // { + // id: '12', + // data: { label: '12' }, + // position: { x: -100, y: 600 } + // }, + // { + // id: '13', + // data: { label: '13' }, + // position: { x: 100, y: 600 } + // } + ], + edges: [ + { + id: 'edge-with-class', + source: '1', + target: '2', + className: 'edge-class-test', + }, + { + id: 'edge-with-style', + source: '1', + target: '3', + style: { + stroke: 'red', + }, + }, + { + id: 'hidden-edge', + source: '2', + target: '4', + label: 'hidden', + hidden: true, + }, + { + id: 'animated-edge', + source: '3', + target: '5', + label: 'animated', + animated: true, + }, + { + id: 'not-selectable-edge', + source: '4', + target: '6', + label: 'not-selectable', + selectable: false, + }, + { + id: 'not-deletable', + source: '5', + target: '7', + label: 'not-deletable', + deletable: false, + }, + { + id: 'z-index', + source: '6', + target: '8', + label: 'z-index', + zIndex: 3141592, + }, + { + id: 'aria-label', + source: '7', + target: '9', + label: 'aria-label', + ariaLabel: 'aria-label-test', + }, + { + id: 'interaction-width', + source: '8', + target: '10', + label: 'interaction-width', + interactionWidth: 42, + }, + { + id: 'markers', + source: '9', + target: '11', + label: 'markers', + markerEnd: { type: MarkerType.Arrow }, + markerStart: { type: MarkerType.ArrowClosed }, + }, + // { + // id: 'updatable', + // source: '9', + // target: '11', + // label: 'focusable', + // updatable: true + // }, + // { + // id: 'not-focusable', + // + // source: '5', + // target: '7', + // label: 'not-focusable', + // focusable: false + // }, + ], + }, +} satisfies GenericTestCase; diff --git a/examples/react/src/generic-tests/index.tsx b/examples/react/src/generic-tests/index.tsx new file mode 100644 index 00000000..d50e466a --- /dev/null +++ b/examples/react/src/generic-tests/index.tsx @@ -0,0 +1,17 @@ +import { useLocation } from 'react-router-dom'; +import Flow from './Flow'; + +export default () => { + const location = useLocation(); + const files = import.meta.glob('./**/*.ts', { eager: true, import: 'default' }); + + const testCasePath = `.${location.pathname.replace('/tests/generic', '')}.ts`; + + const testCase = files[testCasePath]; + + if (!testCase) { + return
; + } + + return ; +}; diff --git a/examples/react/src/generic-tests/nodes/general.ts b/examples/react/src/generic-tests/nodes/general.ts new file mode 100644 index 00000000..ff8b4c56 --- /dev/null +++ b/examples/react/src/generic-tests/nodes/general.ts @@ -0,0 +1 @@ +export default {}; From 9551ebc0f32ebc46d31f89b2089bf89ccadaa137 Mon Sep 17 00:00:00 2001 From: Peter Date: Tue, 7 Nov 2023 16:31:49 +0100 Subject: [PATCH 020/608] ported all test cases from svelte to react --- examples/react/src/app.d.ts | 2 +- examples/react/src/generic-tests/Flow.tsx | 6 +- .../react/src/generic-tests/edges/general.ts | 2 +- .../nodes/components/DragHandleNode.tsx | 25 +++++ .../react/src/generic-tests/nodes/general.ts | 92 ++++++++++++++++++- .../react/src/generic-tests/pane/general.ts | 37 ++++++++ .../src/generic-tests/pane/non-defaults.ts | 38 ++++++++ tests/playwright/e2e/edges.spec.ts | 2 +- tests/playwright/e2e/pane.spec.ts | 2 +- 9 files changed, 198 insertions(+), 8 deletions(-) create mode 100644 examples/react/src/generic-tests/nodes/components/DragHandleNode.tsx create mode 100644 examples/react/src/generic-tests/pane/general.ts create mode 100644 examples/react/src/generic-tests/pane/non-defaults.ts diff --git a/examples/react/src/app.d.ts b/examples/react/src/app.d.ts index 1118fb9d..88375944 100644 --- a/examples/react/src/app.d.ts +++ b/examples/react/src/app.d.ts @@ -2,6 +2,6 @@ import { Edge, Node, ReactFlowProps } from '@xyflow/react'; declare global { interface GenericTestCase { - reactFlowProps: Omit & { nodes: Node[]; edges: Edge[] }; + flowProps: Omit & { nodes: Node[]; edges: Edge[] }; } } diff --git a/examples/react/src/generic-tests/Flow.tsx b/examples/react/src/generic-tests/Flow.tsx index 28b38001..a547bcbc 100644 --- a/examples/react/src/generic-tests/Flow.tsx +++ b/examples/react/src/generic-tests/Flow.tsx @@ -6,8 +6,8 @@ type FlowProps = { }; export default ({ generics }: FlowProps) => { - const [nodes, setNodes] = useState(generics.reactFlowProps.nodes); - const [edges, setEdges] = useState(generics.reactFlowProps.edges); + const [nodes, setNodes] = useState(generics.flowProps.nodes); + const [edges, setEdges] = useState(generics.flowProps.edges); const onNodesChange = useCallback((changes) => setNodes((nds) => applyNodeChanges(changes, nds)), []); const onEdgesChange = useCallback((changes) => setEdges((eds) => applyEdgeChanges(changes, eds)), []); @@ -15,7 +15,7 @@ export default ({ generics }: FlowProps) => { return (
{ + return ( +
+
+
+ ); +}; diff --git a/examples/react/src/generic-tests/nodes/general.ts b/examples/react/src/generic-tests/nodes/general.ts index ff8b4c56..60391602 100644 --- a/examples/react/src/generic-tests/nodes/general.ts +++ b/examples/react/src/generic-tests/nodes/general.ts @@ -1 +1,91 @@ -export default {}; +import DragHandleNode from './components/DragHandleNode'; + +export default { + flowProps: { + fitView: true, + nodeTypes: { + DragHandleNode, + }, + nodes: [ + { + id: 'Node-1', + data: { label: 'Node-1' }, + position: { x: 0, y: 0 }, + type: 'input', + className: 'playwright-test-class-123', + style: { backgroundColor: 'red' }, + }, + { + id: 'Node-2', + type: 'output', + data: { label: 'Node-2' }, + position: { x: -100, y: 100 }, + }, + { + id: 'Node-3', + data: { label: 'Node-3' }, + position: { x: 100, y: 100 }, + }, + { + id: 'Node-4', + data: { label: 'Node-4' }, + position: { x: 0, y: 200 }, + type: 'output', + }, + { + id: 'drag-handle', + data: { label: 'Drag Handle' }, + position: { x: 200, y: 0 }, + type: 'DragHandleNode', + dragHandle: '.custom-drag-handle', + }, + { + id: 'notConnectable', + type: 'output', + data: { label: 'notConnectable' }, + position: { x: 0, y: 300 }, + connectable: false, + }, + { + id: 'notDraggable', + data: { label: 'notDraggable' }, + position: { x: 0, y: 400 }, + draggable: false, + }, + { + id: 'notSelectable', + data: { label: 'notSelectable' }, + position: { x: 0, y: 500 }, + selectable: false, + }, + { + id: 'notDeletable', + data: { label: 'notDeletable' }, + position: { x: 0, y: 600 }, + deletable: false, + }, + { + id: 'hidden', + data: { label: 'hidden' }, + position: { x: 0, y: 700 }, + hidden: true, + }, + ], + edges: [ + { + id: '1-2', + type: 'default', + source: 'Node-1', + target: 'Node-2', + label: 'edge', + }, + { + id: '1-3', + type: 'default', + source: 'Node-1', + target: 'Node-3', + label: 'edge', + }, + ], + }, +} satisfies GenericTestCase; diff --git a/examples/react/src/generic-tests/pane/general.ts b/examples/react/src/generic-tests/pane/general.ts new file mode 100644 index 00000000..cb2ea3a9 --- /dev/null +++ b/examples/react/src/generic-tests/pane/general.ts @@ -0,0 +1,37 @@ +export default { + flowProps: { + minZoom: 0.25, + maxZoom: 4, + fitView: true, + nodes: [ + { + id: '1', + data: { label: '1' }, + position: { x: 0, y: 0 }, + type: 'input', + }, + { + id: '2', + data: { label: '2' }, + position: { x: -100, y: 100 }, + }, + { + id: '3', + data: { label: '3' }, + position: { x: 100, y: 100 }, + }, + ], + edges: [ + { + id: 'first-edge', + source: '1', + target: '2', + }, + { + id: 'second-edge', + source: '1', + target: '3', + }, + ], + }, +} satisfies GenericTestCase; diff --git a/examples/react/src/generic-tests/pane/non-defaults.ts b/examples/react/src/generic-tests/pane/non-defaults.ts new file mode 100644 index 00000000..1c109b53 --- /dev/null +++ b/examples/react/src/generic-tests/pane/non-defaults.ts @@ -0,0 +1,38 @@ +export default { + flowProps: { + panOnScroll: true, + initialViewport: { x: 1.23, y: 9.87, zoom: 1.234 }, + autoPanOnConnect: false, + autoPanOnNodeDrag: false, + nodes: [ + { + id: '1', + data: { label: '1' }, + position: { x: 0, y: 0 }, + type: 'input', + }, + { + id: '2', + data: { label: '2' }, + position: { x: -100, y: 100 }, + }, + { + id: '3', + data: { label: '3' }, + position: { x: 100, y: 100 }, + }, + ], + edges: [ + { + id: 'first-edge', + source: '1', + target: '2', + }, + { + id: 'second-edge', + source: '1', + target: '3', + }, + ], + }, +} satisfies GenericTestCase; diff --git a/tests/playwright/e2e/edges.spec.ts b/tests/playwright/e2e/edges.spec.ts index 1318ee4b..a7ea991f 100644 --- a/tests/playwright/e2e/edges.spec.ts +++ b/tests/playwright/e2e/edges.spec.ts @@ -13,7 +13,7 @@ test.describe('EDGES', () => { test.describe('selection', () => { test('selecting an edge by click', async ({ page }) => { - const edge = page.locator('.svelte-flow__edge').and(page.locator('[data-id="edge-with-class"]')); + const edge = page.locator(`${FRAMEWORK}.-flow__edge`).and(page.locator('[data-id="edge-with-class"]')); await expect(edge).toBeAttached(); await edge.click(); diff --git a/tests/playwright/e2e/pane.spec.ts b/tests/playwright/e2e/pane.spec.ts index f7f52e3c..9f18090f 100644 --- a/tests/playwright/e2e/pane.spec.ts +++ b/tests/playwright/e2e/pane.spec.ts @@ -122,7 +122,7 @@ test.describe('PANE DEFAULT', () => { test('autoPanOnConnect works as intended', async ({ page }) => { const viewport = page.locator(`.${FRAMEWORK}-flow__viewport`); - const handle = page.locator('[data-id="1"] .svelte-flow__handle'); + const handle = page.locator(`[data-id="1"] .${FRAMEWORK}-flow__handle`); await expect(handle).toBeAttached(); From fd2aa9f917315c4091c9cea98b9d9f326fc3fceb Mon Sep 17 00:00:00 2001 From: Peter Date: Tue, 7 Nov 2023 16:37:18 +0100 Subject: [PATCH 021/608] changed generic test case to be closer to react --- examples/svelte/src/app.d.ts | 2 +- examples/svelte/src/generic-tests/edges/general.ts | 2 +- examples/svelte/src/generic-tests/nodes/general.ts | 2 +- examples/svelte/src/generic-tests/pane/activation-keys.ts | 2 +- examples/svelte/src/generic-tests/pane/general.ts | 2 +- examples/svelte/src/generic-tests/pane/non-defaults.ts | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/examples/svelte/src/app.d.ts b/examples/svelte/src/app.d.ts index 343f3fd6..475578fb 100644 --- a/examples/svelte/src/app.d.ts +++ b/examples/svelte/src/app.d.ts @@ -12,7 +12,7 @@ declare global { } interface GenericTestCase { - svelteFlowProps: Omit & { nodes: Node[]; edges: Edge[] }; + flowProps: Omit & { nodes: Node[]; edges: Edge[] }; } } diff --git a/examples/svelte/src/generic-tests/edges/general.ts b/examples/svelte/src/generic-tests/edges/general.ts index cc05aada..cfbb4fc9 100644 --- a/examples/svelte/src/generic-tests/edges/general.ts +++ b/examples/svelte/src/generic-tests/edges/general.ts @@ -1,7 +1,7 @@ import { MarkerType } from '@xyflow/svelte'; export default { - svelteFlowProps: { + flowProps: { fitView: true, nodes: [ { diff --git a/examples/svelte/src/generic-tests/nodes/general.ts b/examples/svelte/src/generic-tests/nodes/general.ts index b7707a08..0b677aa8 100644 --- a/examples/svelte/src/generic-tests/nodes/general.ts +++ b/examples/svelte/src/generic-tests/nodes/general.ts @@ -1,7 +1,7 @@ import DragHandleNode from './components/DragHandleNode.svelte'; export default { - svelteFlowProps: { + flowProps: { fitView: true, nodeTypes: { DragHandleNode diff --git a/examples/svelte/src/generic-tests/pane/activation-keys.ts b/examples/svelte/src/generic-tests/pane/activation-keys.ts index e4dbe4e1..9bdc26f7 100644 --- a/examples/svelte/src/generic-tests/pane/activation-keys.ts +++ b/examples/svelte/src/generic-tests/pane/activation-keys.ts @@ -1,5 +1,5 @@ export default { - svelteFlowProps: { + flowProps: { zoomOnScroll: false, // zoomActivationKey: 'Space', // panOnDrag: false, diff --git a/examples/svelte/src/generic-tests/pane/general.ts b/examples/svelte/src/generic-tests/pane/general.ts index 5caac003..5873b63f 100644 --- a/examples/svelte/src/generic-tests/pane/general.ts +++ b/examples/svelte/src/generic-tests/pane/general.ts @@ -1,5 +1,5 @@ export default { - svelteFlowProps: { + flowProps: { minZoom: 0.25, maxZoom: 4, fitView: true, diff --git a/examples/svelte/src/generic-tests/pane/non-defaults.ts b/examples/svelte/src/generic-tests/pane/non-defaults.ts index 0d17e954..51231fbd 100644 --- a/examples/svelte/src/generic-tests/pane/non-defaults.ts +++ b/examples/svelte/src/generic-tests/pane/non-defaults.ts @@ -1,5 +1,5 @@ export default { - svelteFlowProps: { + flowProps: { panOnScroll: true, initialViewport: { x: 1.23, y: 9.87, zoom: 1.234 }, autoPanOnConnect: false, From 00ff8e877d14bf1dd51d2fddab4f7c48b585a32f Mon Sep 17 00:00:00 2001 From: Peter Date: Tue, 7 Nov 2023 16:43:02 +0100 Subject: [PATCH 022/608] fixed svelte tests --- .../src/routes/tests/generic/[topic]/[example]/Flow.svelte | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/examples/svelte/src/routes/tests/generic/[topic]/[example]/Flow.svelte b/examples/svelte/src/routes/tests/generic/[topic]/[example]/Flow.svelte index 40babf50..0861399a 100644 --- a/examples/svelte/src/routes/tests/generic/[topic]/[example]/Flow.svelte +++ b/examples/svelte/src/routes/tests/generic/[topic]/[example]/Flow.svelte @@ -7,10 +7,10 @@ export let generic: GenericTestCase; // Create writables here so it is easier to create test cases - const nodes = writable(generic.svelteFlowProps.nodes); - const edges = writable(generic.svelteFlowProps.edges); + const nodes = writable(generic.flowProps.nodes); + const edges = writable(generic.flowProps.edges); - const svelteFlowPropsWithWritables = { ...generic.svelteFlowProps, nodes, edges }; + const svelteFlowPropsWithWritables = { ...generic.flowProps, nodes, edges }; From e91a9ae387aff8feb0a2af27a97c449536b13996 Mon Sep 17 00:00:00 2001 From: Peter Date: Tue, 7 Nov 2023 16:50:37 +0100 Subject: [PATCH 023/608] feat(react-flow) added data-id to edges --- packages/react/src/components/Edges/wrapEdge.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/react/src/components/Edges/wrapEdge.tsx b/packages/react/src/components/Edges/wrapEdge.tsx index ad1d8f2a..750254ff 100644 --- a/packages/react/src/components/Edges/wrapEdge.tsx +++ b/packages/react/src/components/Edges/wrapEdge.tsx @@ -213,6 +213,7 @@ export default (EdgeComponent: ComponentType) => { onKeyDown={isFocusable ? onKeyDown : undefined} tabIndex={isFocusable ? 0 : undefined} role={isFocusable ? 'button' : 'img'} + data-id={id} data-testid={`rf__edge-${id}`} aria-label={ariaLabel === null ? undefined : ariaLabel ? ariaLabel : `Edge from ${source} to ${target}`} aria-describedby={isFocusable ? `${ARIA_EDGE_DESC_KEY}-${rfId}` : undefined} From 2d43ab78951c4bbf56fd168317efa9617c7f4408 Mon Sep 17 00:00:00 2001 From: Peter Date: Wed, 8 Nov 2023 10:37:33 +0100 Subject: [PATCH 024/608] fixed some tests --- tests/playwright/e2e/edges.spec.ts | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/tests/playwright/e2e/edges.spec.ts b/tests/playwright/e2e/edges.spec.ts index a7ea991f..c522296d 100644 --- a/tests/playwright/e2e/edges.spec.ts +++ b/tests/playwright/e2e/edges.spec.ts @@ -13,7 +13,7 @@ test.describe('EDGES', () => { test.describe('selection', () => { test('selecting an edge by click', async ({ page }) => { - const edge = page.locator(`${FRAMEWORK}.-flow__edge`).and(page.locator('[data-id="edge-with-class"]')); + const edge = page.locator(`[data-id="edge-with-class"]`); await expect(edge).toBeAttached(); await edge.click(); @@ -26,11 +26,12 @@ test.describe('EDGES', () => { await expect(edge1).toBeAttached(); await expect(edge2).toBeAttached(); - // FIXME: I cannot get this to work - await page.keyboard.down('MetaLeft'); + await edge1.click(); await expect(edge1).toHaveClass(/selected/); + // FIXME: I cannot get this to work + await page.keyboard.down('MetaLeft'); await edge2.click(); await expect(edge2).toHaveClass(/selected/); From 118152bd2e625f14226937054b1ce4abe584594b Mon Sep 17 00:00:00 2001 From: Peter Date: Wed, 8 Nov 2023 10:39:33 +0100 Subject: [PATCH 025/608] fix(svelte) id should not get applied to edge path --- packages/svelte/src/lib/components/BaseEdge/BaseEdge.svelte | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/svelte/src/lib/components/BaseEdge/BaseEdge.svelte b/packages/svelte/src/lib/components/BaseEdge/BaseEdge.svelte index e53bd7c1..4e5b39d1 100644 --- a/packages/svelte/src/lib/components/BaseEdge/BaseEdge.svelte +++ b/packages/svelte/src/lib/components/BaseEdge/BaseEdge.svelte @@ -24,7 +24,6 @@ Date: Wed, 8 Nov 2023 10:39:54 +0100 Subject: [PATCH 026/608] added tests --- examples/react/src/generic-tests/pane/non-defaults.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/react/src/generic-tests/pane/non-defaults.ts b/examples/react/src/generic-tests/pane/non-defaults.ts index 1c109b53..d90be5e9 100644 --- a/examples/react/src/generic-tests/pane/non-defaults.ts +++ b/examples/react/src/generic-tests/pane/non-defaults.ts @@ -1,7 +1,7 @@ export default { flowProps: { panOnScroll: true, - initialViewport: { x: 1.23, y: 9.87, zoom: 1.234 }, + defaultViewport: { x: 1.23, y: 9.87, zoom: 1.234 }, autoPanOnConnect: false, autoPanOnNodeDrag: false, nodes: [ From 5fd7db74a871ed9ab069dcda2dc7fd47f10356e1 Mon Sep 17 00:00:00 2001 From: Peter Date: Wed, 8 Nov 2023 11:22:20 +0100 Subject: [PATCH 027/608] fixed tests for react & added scripts to package.json --- examples/react/src/generic-tests/Flow.tsx | 10 ++++------ package.json | 4 ++++ pnpm-workspace.yaml | 7 ++++--- tests/playwright/e2e/edges.spec.ts | 8 ++++---- tests/playwright/e2e/nodes.spec.ts | 16 +++++++++++----- tests/playwright/e2e/pane.spec.ts | 6 +++--- 6 files changed, 30 insertions(+), 21 deletions(-) diff --git a/examples/react/src/generic-tests/Flow.tsx b/examples/react/src/generic-tests/Flow.tsx index a547bcbc..5b0846a3 100644 --- a/examples/react/src/generic-tests/Flow.tsx +++ b/examples/react/src/generic-tests/Flow.tsx @@ -1,5 +1,5 @@ import { useState, useCallback } from 'react'; -import { ReactFlow, Controls, Background, applyNodeChanges, applyEdgeChanges } from '@xyflow/react'; +import { ReactFlow, applyNodeChanges, applyEdgeChanges, addEdge } from '@xyflow/react'; type FlowProps = { generics: GenericTestCase; @@ -11,7 +11,7 @@ export default ({ generics }: FlowProps) => { const onNodesChange = useCallback((changes) => setNodes((nds) => applyNodeChanges(changes, nds)), []); const onEdgesChange = useCallback((changes) => setEdges((eds) => applyEdgeChanges(changes, eds)), []); - + const onConnect = useCallback((params) => setEdges((eds) => addEdge(params, eds)), []); return (
{ onNodesChange={onNodesChange} edges={edges} onEdgesChange={onEdgesChange} - > - - - + onConnect={onConnect} + >
); }; diff --git a/package.json b/package.json index f0e22afe..4411e137 100644 --- a/package.json +++ b/package.json @@ -10,6 +10,10 @@ "dev": "turbo run dev --parallel --concurrency 12", "dev:svelte": "turbo run dev --filter=svelte --filter=system", "dev:react": "turbo run dev --filter=react", + "test:svelte": "pnpm --filter=playwright run test:svelte", + "test:svelte:ui": "pnpm --filter=playwright run test:svelte:ui", + "test:react": "pnpm --filter=playwright run test:react", + "test:react:ui": "pnpm --filter=playwright run test:react:ui", "build": "turbo run build", "test": "turbo run test", "lint": "turbo run lint", diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index e36b3997..a75d7de6 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -1,4 +1,5 @@ packages: - - "packages/*" - - "examples/*" - - "tooling/*" \ No newline at end of file + - 'packages/*' + - 'examples/*' + - 'tooling/*' + - 'tests/*' diff --git a/tests/playwright/e2e/edges.spec.ts b/tests/playwright/e2e/edges.spec.ts index c522296d..af2cf980 100644 --- a/tests/playwright/e2e/edges.spec.ts +++ b/tests/playwright/e2e/edges.spec.ts @@ -47,7 +47,7 @@ test.describe('EDGES', () => { }); test('styles get applied', async ({ page }) => { - const edge = page.locator('#edge-with-style'); + const edge = page.locator('[data-id="edge-with-style"]').locator(`.${FRAMEWORK}-flow__edge-path`); await expect(edge).toHaveCSS('stroke', 'rgb(255, 0, 0)'); }); @@ -121,7 +121,7 @@ test.describe('EDGES', () => { }); test('zIndex sets z-index of edge svgs', async ({ page }) => { - const svg = page.locator('svg', { has: page.locator('#z-index') }); + const svg = page.locator('svg', { has: page.locator('[data-id="z-index"]') }); await expect(svg).toBeAttached(); await expect(svg).toHaveCSS('z-index', '3141592'); @@ -149,8 +149,8 @@ test.describe('EDGES', () => { await expect(edge).toHaveClass(/selected/); }); - test('markerEnd is setting marker-end', async ({ page }) => { - const edge = page.locator('#markers'); + test('marker-start, marker-end set markers', async ({ page }) => { + const edge = page.locator('[data-id="markers"]').locator(`.${FRAMEWORK}-flow__edge-path`); await expect(edge).toBeAttached(); diff --git a/tests/playwright/e2e/nodes.spec.ts b/tests/playwright/e2e/nodes.spec.ts index f0e97b0c..5afa41de 100644 --- a/tests/playwright/e2e/nodes.spec.ts +++ b/tests/playwright/e2e/nodes.spec.ts @@ -1,4 +1,4 @@ -import { test, expect } from '@playwright/test'; +import { test, expect, Locator } from '@playwright/test'; import { FRAMEWORK } from './constants'; @@ -28,10 +28,10 @@ test.describe('NODES', () => { const box = await firstNode.boundingBox(); - await page.mouse.move(box!.x - 100, box!.y - 10); + await page.mouse.move(box!.x - 150, box!.y - 25); await page.keyboard.down('Shift'); await page.mouse.down(); - await page.mouse.move(box!.x + 200, box!.y + 200); + await page.mouse.move(box!.x + 275, box!.y + 200); await page.mouse.up(); await page.keyboard.up('Shift'); @@ -39,8 +39,14 @@ test.describe('NODES', () => { await expect(secondNode).toHaveClass(/selected/); await expect(thirdNode).toHaveClass(/selected/); - const selection = page.locator(`.${FRAMEWORK}-flow__selection`); - await expect(selection).toBeInViewport(); + let selection: Locator | undefined; + if (FRAMEWORK === 'react') { + selection = page.locator('.react-flow__nodesselection'); + } else if (FRAMEWORK === 'svelte') { + selection = page.locator('.svelte-flow__selection'); + } + + if (selection) await expect(selection).toBeInViewport(); }); test('selectable=false prevents selection', async ({ page }) => { diff --git a/tests/playwright/e2e/pane.spec.ts b/tests/playwright/e2e/pane.spec.ts index 9f18090f..31777c97 100644 --- a/tests/playwright/e2e/pane.spec.ts +++ b/tests/playwright/e2e/pane.spec.ts @@ -25,7 +25,7 @@ test.describe('PANE DEFAULT', () => { await page.goto('/tests/generic/pane/general'); // Wait till the edges are rendered - await page.waitForSelector('#first-edge', { timeout: 5000 }); + await page.waitForSelector('[data-id="first-edge"]', { timeout: 5000 }); }); test.describe('pan & zoom', () => { @@ -148,7 +148,7 @@ test.describe('PANE NON-DEFAULT', () => { await page.goto('/tests/generic/pane/non-defaults'); // Wait till the edges are rendered - await page.waitForSelector('#first-edge', { timeout: 5000 }); + await page.waitForSelector('[data-id="first-edge"]', { timeout: 5000 }); }); test.describe('pan & zoom', () => { @@ -190,7 +190,7 @@ test.describe('PANE ACTIVATION KEYS', () => { await page.goto('/tests/generic/pane/activation-keys'); // Wait till the edges are rendered - await page.waitForSelector('#first-edge', { timeout: 5000 }); + await page.waitForSelector('[data-id="first-edge"]', { timeout: 5000 }); }); // TODO }); From e83079c5cd31d8a411e45a321f9a31592f14e20f Mon Sep 17 00:00:00 2001 From: Peter Date: Wed, 8 Nov 2023 11:28:17 +0100 Subject: [PATCH 028/608] react examples now automatically redirect / to examples --- examples/react/src/App/index.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/examples/react/src/App/index.tsx b/examples/react/src/App/index.tsx index 77344ba2..b134daba 100644 --- a/examples/react/src/App/index.tsx +++ b/examples/react/src/App/index.tsx @@ -1,5 +1,5 @@ import { useEffect, useState } from 'react'; -import { BrowserRouter, Outlet, Route, Routes, useLocation, useNavigate } from 'react-router-dom'; +import { BrowserRouter, Navigate, Outlet, Route, Routes, useLocation, useNavigate } from 'react-router-dom'; import GenericTests from '../generic-tests'; @@ -324,6 +324,7 @@ export default () => { <> + } /> }> } /> {routes.map((route) => ( From 2ebdca0525b4e39a336c8344d3fc8cedf07f844b Mon Sep 17 00:00:00 2001 From: Peter Date: Wed, 8 Nov 2023 13:12:34 +0100 Subject: [PATCH 029/608] fix(svelte) hiding elements considers missing html elements --- .../svelte/src/routes/overview/+page.svelte | 13 ++++++++++ .../components/NodeWrapper/NodeWrapper.svelte | 26 +++++++++---------- 2 files changed, 25 insertions(+), 14 deletions(-) diff --git a/examples/svelte/src/routes/overview/+page.svelte b/examples/svelte/src/routes/overview/+page.svelte index 32bef5d0..dddbf398 100644 --- a/examples/svelte/src/routes/overview/+page.svelte +++ b/examples/svelte/src/routes/overview/+page.svelte @@ -83,6 +83,12 @@ type: 'custom', data: { label: 'Custom Node' }, position: { x: 150, y: 300 } + }, + { + id: 'hideunhide', + data: { label: 'HIDE ME' }, + position: { x: 300, y: 75 }, + hidden: true } ]); @@ -179,6 +185,13 @@ +
diff --git a/packages/svelte/src/lib/components/NodeWrapper/NodeWrapper.svelte b/packages/svelte/src/lib/components/NodeWrapper/NodeWrapper.svelte index e02a0f98..e422b444 100644 --- a/packages/svelte/src/lib/components/NodeWrapper/NodeWrapper.svelte +++ b/packages/svelte/src/lib/components/NodeWrapper/NodeWrapper.svelte @@ -1,13 +1,7 @@ - + diff --git a/examples/svelte/src/routes/tests/generic/[topic]/[example]/+page.ts b/examples/svelte/src/routes/tests/generic/[topic]/[example]/+page.ts index 65f62996..193516c1 100644 --- a/examples/svelte/src/routes/tests/generic/[topic]/[example]/+page.ts +++ b/examples/svelte/src/routes/tests/generic/[topic]/[example]/+page.ts @@ -1,22 +1,19 @@ import { error } from '@sveltejs/kit'; +const flowConfigs = import.meta.glob('/src/generic-tests/**/*.ts', { + eager: true, + import: 'default' +}); + /** @type {import('./$types').PageLoad} */ export function load({ params }) { - try { - const genericTestCases = import.meta.glob('/src/generic-tests/**/*.ts', { - eager: true, - import: 'default' - }); + const flowConfig = flowConfigs[`/src/generic-tests/${params.topic}/${params.example}.ts`]; - const generic = genericTestCases[`/src/generic-tests/${params.topic}/${params.example}.ts`]; - if (generic) { - return { - generic - }; - } - } catch (e) { - console.error(e); + if (!flowConfig) { + throw error(404, 'Not found'); } - throw error(404, 'Not found'); + return { + flowConfig + }; } diff --git a/examples/svelte/src/routes/tests/generic/[topic]/[example]/Flow.svelte b/examples/svelte/src/routes/tests/generic/[topic]/[example]/Flow.svelte index 0861399a..44965e2e 100644 --- a/examples/svelte/src/routes/tests/generic/[topic]/[example]/Flow.svelte +++ b/examples/svelte/src/routes/tests/generic/[topic]/[example]/Flow.svelte @@ -4,13 +4,13 @@ import '@xyflow/svelte/dist/style.css'; - export let generic: GenericTestCase; + export let flowConfig: FlowConfig; // Create writables here so it is easier to create test cases - const nodes = writable(generic.flowProps.nodes); - const edges = writable(generic.flowProps.edges); + const nodes = writable(flowConfig.flowProps.nodes); + const edges = writable(flowConfig.flowProps.edges); - const svelteFlowPropsWithWritables = { ...generic.flowProps, nodes, edges }; + const props = { ...flowConfig.flowProps, nodes, edges }; - + diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c07f3def..3ebd1e7e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -16,10 +16,10 @@ importers: version: registry.npmjs.org/@changesets/cli@2.25.0 '@typescript-eslint/eslint-plugin': specifier: latest - version: registry.npmjs.org/@typescript-eslint/eslint-plugin@6.10.0(@typescript-eslint/parser@6.10.0)(eslint@8.43.0)(typescript@5.1.3) + version: registry.npmjs.org/@typescript-eslint/eslint-plugin@6.8.0(@typescript-eslint/parser@6.8.0)(eslint@8.43.0)(typescript@5.1.3) '@typescript-eslint/parser': specifier: latest - version: registry.npmjs.org/@typescript-eslint/parser@6.10.0(eslint@8.43.0)(typescript@5.1.3) + version: registry.npmjs.org/@typescript-eslint/parser@6.8.0(eslint@8.43.0)(typescript@5.1.3) concurrently: specifier: ^7.6.0 version: registry.npmjs.org/concurrently@7.6.0 @@ -149,7 +149,7 @@ importers: version: registry.npmjs.org/typescript@5.2.2 vite: specifier: 4.5.0 - version: registry.npmjs.org/vite@4.5.0 + version: registry.npmjs.org/vite@4.5.0(@types/node@18.7.16) examples/svelte: dependencies: @@ -201,7 +201,7 @@ importers: version: registry.npmjs.org/typescript@5.2.2 vite: specifier: ^4.5.0 - version: registry.npmjs.org/vite@4.5.0 + version: registry.npmjs.org/vite@4.5.0(@types/node@18.7.16) packages/react: dependencies: @@ -413,6 +413,34 @@ importers: specifier: 5.1.3 version: registry.npmjs.org/typescript@5.1.3 + tests/playwright: + dependencies: + '@playwright/experimental-ct-react': + specifier: ^1.39.0 + version: registry.npmjs.org/@playwright/experimental-ct-react@1.39.0(@types/node@18.7.16)(vite@4.5.0) + '@types/react': + specifier: ^18.2.31 + version: registry.npmjs.org/@types/react@18.2.31 + '@types/react-dom': + specifier: ^18.2.14 + version: registry.npmjs.org/@types/react-dom@18.2.14 + react: + specifier: ^18.2.0 + version: registry.npmjs.org/react@18.2.0 + react-dom: + specifier: ^18.2.0 + version: registry.npmjs.org/react-dom@18.2.0(react@18.2.0) + typescript: + specifier: ^5.2.2 + version: registry.npmjs.org/typescript@5.2.2 + devDependencies: + '@playwright/test': + specifier: ^1.39.0 + version: registry.npmjs.org/@playwright/test@1.39.0 + '@types/node': + specifier: ^18.7.16 + version: registry.npmjs.org/@types/node@18.7.16 + tooling/eslint-config: devDependencies: eslint: @@ -423,7 +451,7 @@ importers: version: registry.npmjs.org/eslint-config-prettier@8.8.0(eslint@8.43.0) eslint-config-turbo: specifier: latest - version: registry.npmjs.org/eslint-config-turbo@1.10.16(eslint@8.43.0) + version: registry.npmjs.org/eslint-config-turbo@1.10.15(eslint@8.43.0) eslint-plugin-react: specifier: latest version: registry.npmjs.org/eslint-plugin-react@7.33.2(eslint@8.43.0) @@ -1889,6 +1917,59 @@ packages: '@nodelib/fs.scandir': registry.npmjs.org/@nodelib/fs.scandir@2.1.5 fastq: registry.npmjs.org/fastq@1.15.0 + registry.npmjs.org/@playwright/experimental-ct-core@1.39.0(@types/node@18.7.16): + resolution: {integrity: sha512-1b/qrlB5A/CdEZns8f2RDkWFmSnGkNyec8n72iinmw07+GHsdMP8fIpazeFB0umxWfo+gPLhkjhTGdB3WXJTBw==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@playwright/experimental-ct-core/-/experimental-ct-core-1.39.0.tgz} + id: registry.npmjs.org/@playwright/experimental-ct-core/1.39.0 + name: '@playwright/experimental-ct-core' + version: 1.39.0 + engines: {node: '>=16'} + hasBin: true + dependencies: + playwright: registry.npmjs.org/playwright@1.39.0 + playwright-core: registry.npmjs.org/playwright-core@1.39.0 + vite: registry.npmjs.org/vite@4.5.0(@types/node@18.7.16) + transitivePeerDependencies: + - '@types/node' + - less + - lightningcss + - sass + - stylus + - sugarss + - terser + dev: false + + registry.npmjs.org/@playwright/experimental-ct-react@1.39.0(@types/node@18.7.16)(vite@4.5.0): + resolution: {integrity: sha512-6GaDVVo6x8P9Jdw3yPbVaEP59nesRsETn3kznHAy+2493VsP3IaVATat2G28z0Sivf/K9Tkh5xRYjiawN0ebgw==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@playwright/experimental-ct-react/-/experimental-ct-react-1.39.0.tgz} + id: registry.npmjs.org/@playwright/experimental-ct-react/1.39.0 + name: '@playwright/experimental-ct-react' + version: 1.39.0 + engines: {node: '>=16'} + hasBin: true + dependencies: + '@playwright/experimental-ct-core': registry.npmjs.org/@playwright/experimental-ct-core@1.39.0(@types/node@18.7.16) + '@vitejs/plugin-react': registry.npmjs.org/@vitejs/plugin-react@4.1.1(vite@4.5.0) + transitivePeerDependencies: + - '@types/node' + - less + - lightningcss + - sass + - stylus + - sugarss + - supports-color + - terser + - vite + dev: false + + registry.npmjs.org/@playwright/test@1.39.0: + resolution: {integrity: sha512-3u1iFqgzl7zr004bGPYiN/5EZpRUSFddQBra8Rqll5N0/vfpqlP9I9EXqAoGacuAbX6c9Ulg/Cjqglp5VkK6UQ==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@playwright/test/-/test-1.39.0.tgz} + name: '@playwright/test' + version: 1.39.0 + engines: {node: '>=16'} + hasBin: true + dependencies: + playwright: registry.npmjs.org/playwright@1.39.0 + dev: true + registry.npmjs.org/@polka/url@1.0.0-next.23: resolution: {integrity: sha512-C16M+IYz0rgRhWZdCmK+h58JMv8vijAA61gmz2rspCSwKwzBebpdcsiUmwrtJRdphuY30i6BSLEOP8ppbNLyLg==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.23.tgz} name: '@polka/url' @@ -2094,7 +2175,7 @@ packages: sirv: registry.npmjs.org/sirv@2.0.3 svelte: registry.npmjs.org/svelte@4.2.1 undici: registry.npmjs.org/undici@5.23.0 - vite: registry.npmjs.org/vite@4.5.0 + vite: registry.npmjs.org/vite@4.5.0(@types/node@18.7.16) transitivePeerDependencies: - supports-color dev: true @@ -2125,7 +2206,7 @@ packages: svelte: registry.npmjs.org/svelte@4.2.2 tiny-glob: registry.npmjs.org/tiny-glob@0.2.9 undici: registry.npmjs.org/undici@5.26.5 - vite: registry.npmjs.org/vite@4.5.0 + vite: registry.npmjs.org/vite@4.5.0(@types/node@18.7.16) transitivePeerDependencies: - supports-color dev: true @@ -2164,7 +2245,7 @@ packages: '@sveltejs/vite-plugin-svelte': registry.npmjs.org/@sveltejs/vite-plugin-svelte@2.4.6(svelte@4.2.1)(vite@4.5.0) debug: registry.npmjs.org/debug@4.3.4(supports-color@8.1.1) svelte: registry.npmjs.org/svelte@4.2.1 - vite: registry.npmjs.org/vite@4.5.0 + vite: registry.npmjs.org/vite@4.5.0(@types/node@18.7.16) transitivePeerDependencies: - supports-color @@ -2182,7 +2263,7 @@ packages: '@sveltejs/vite-plugin-svelte': registry.npmjs.org/@sveltejs/vite-plugin-svelte@2.4.6(svelte@4.2.2)(vite@4.5.0) debug: registry.npmjs.org/debug@4.3.4(supports-color@8.1.1) svelte: registry.npmjs.org/svelte@4.2.2 - vite: registry.npmjs.org/vite@4.5.0 + vite: registry.npmjs.org/vite@4.5.0(@types/node@18.7.16) transitivePeerDependencies: - supports-color dev: true @@ -2204,7 +2285,7 @@ packages: magic-string: registry.npmjs.org/magic-string@0.30.5 svelte: registry.npmjs.org/svelte@4.2.1 svelte-hmr: registry.npmjs.org/svelte-hmr@0.15.3(svelte@4.2.1) - vite: registry.npmjs.org/vite@4.5.0 + vite: registry.npmjs.org/vite@4.5.0(@types/node@18.7.16) vitefu: registry.npmjs.org/vitefu@0.2.5(vite@4.5.0) transitivePeerDependencies: - supports-color @@ -2226,7 +2307,7 @@ packages: magic-string: registry.npmjs.org/magic-string@0.30.5 svelte: registry.npmjs.org/svelte@4.2.2 svelte-hmr: registry.npmjs.org/svelte-hmr@0.15.3(svelte@4.2.2) - vite: registry.npmjs.org/vite@4.5.0 + vite: registry.npmjs.org/vite@4.5.0(@types/node@18.7.16) vitefu: registry.npmjs.org/vitefu@0.2.5(vite@4.5.0) transitivePeerDependencies: - supports-color @@ -2791,7 +2872,6 @@ packages: resolution: {integrity: sha512-EQHhixfu+mkqHMZl1R2Ovuvn47PUw18azMJOTwSZr9/fhzHNGXAJ0ma0dayRVchprpCj0Kc1K1xKoWaATWF1qg==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@types/node/-/node-18.7.16.tgz} name: '@types/node' version: 18.7.16 - dev: true registry.npmjs.org/@types/normalize-package-data@2.4.3: resolution: {integrity: sha512-ehPtgRgaULsFG8x0NeYJvmyH1hmlfsNLujHe9dQEia/7MAJYdzMSi19JtchUHjmBA6XC/75dK55mzZH+RyieSg==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.3.tgz} @@ -2815,12 +2895,6 @@ packages: name: '@types/prop-types' version: 15.7.9 - registry.npmjs.org/@types/pug@2.0.8: - resolution: {integrity: sha512-QzhsZ1dMGyJbn/D9V80zp4GIA4J4rfAjCCxc3MP+new0E8dyVdSkR735Lx+n3LIaHNFcjHL5+TbziccuT+fdoQ==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@types/pug/-/pug-2.0.8.tgz} - name: '@types/pug' - version: 2.0.8 - dev: true - registry.npmjs.org/@types/pug@2.0.9: resolution: {integrity: sha512-Yg4LkgFYvn1faISbDNWmcAC1XoDT8IoMUFspp5mnagKk+UvD2N0IWt5A7GRdMubsNWqgCLmrkf8rXkzNqb4szA==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@types/pug/-/pug-2.0.9.tgz} name: '@types/pug' @@ -2833,7 +2907,6 @@ packages: version: 18.2.14 dependencies: '@types/react': registry.npmjs.org/@types/react@18.2.36 - dev: true registry.npmjs.org/@types/react-dom@18.2.8: resolution: {integrity: sha512-bAIvO5lN/U8sPGvs1Xm61rlRHHaq5rp5N3kp9C+NJ/Q41P8iqjkXSu0+/qu8POsjH9pNWb0OYabFez7taP7omw==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.8.tgz} @@ -2851,6 +2924,16 @@ packages: '@types/scheduler': registry.npmjs.org/@types/scheduler@0.16.5 csstype: registry.npmjs.org/csstype@3.1.2 + registry.npmjs.org/@types/react@18.2.31: + resolution: {integrity: sha512-c2UnPv548q+5DFh03y8lEDeMfDwBn9G3dRwfkrxQMo/dOtRHUUO57k6pHvBIfH/VF4Nh+98mZ5aaSe+2echD5g==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@types/react/-/react-18.2.31.tgz} + name: '@types/react' + version: 18.2.31 + dependencies: + '@types/prop-types': registry.npmjs.org/@types/prop-types@15.7.10 + '@types/scheduler': registry.npmjs.org/@types/scheduler@0.16.5 + csstype: registry.npmjs.org/csstype@3.1.2 + dev: false + registry.npmjs.org/@types/react@18.2.36: resolution: {integrity: sha512-o9XFsHYLLZ4+sb9CWUYwHqFVoG61SesydF353vFMMsQziiyRu8np4n2OYMUSDZ8XuImxDr9c5tR7gidlH29Vnw==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@types/react/-/react-18.2.36.tgz} name: '@types/react' @@ -2919,7 +3002,7 @@ packages: version: 2.10.2 requiresBuild: true dependencies: - '@types/node': registry.npmjs.org/@types/node@16.18.60 + '@types/node': registry.npmjs.org/@types/node@18.7.16 dev: true optional: true @@ -2954,38 +3037,6 @@ packages: - supports-color dev: true - registry.npmjs.org/@typescript-eslint/eslint-plugin@6.10.0(@typescript-eslint/parser@6.10.0)(eslint@8.43.0)(typescript@5.1.3): - resolution: {integrity: sha512-uoLj4g2OTL8rfUQVx2AFO1hp/zja1wABJq77P6IclQs6I/m9GLrm7jCdgzZkvWdDCQf1uEvoa8s8CupsgWQgVg==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.10.0.tgz} - id: registry.npmjs.org/@typescript-eslint/eslint-plugin/6.10.0 - name: '@typescript-eslint/eslint-plugin' - version: 6.10.0 - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - '@typescript-eslint/parser': ^6.0.0 || ^6.0.0-alpha - eslint: ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@eslint-community/regexpp': registry.npmjs.org/@eslint-community/regexpp@4.10.0 - '@typescript-eslint/parser': registry.npmjs.org/@typescript-eslint/parser@6.10.0(eslint@8.43.0)(typescript@5.1.3) - '@typescript-eslint/scope-manager': registry.npmjs.org/@typescript-eslint/scope-manager@6.10.0 - '@typescript-eslint/type-utils': registry.npmjs.org/@typescript-eslint/type-utils@6.10.0(eslint@8.43.0)(typescript@5.1.3) - '@typescript-eslint/utils': registry.npmjs.org/@typescript-eslint/utils@6.10.0(eslint@8.43.0)(typescript@5.1.3) - '@typescript-eslint/visitor-keys': registry.npmjs.org/@typescript-eslint/visitor-keys@6.10.0 - debug: registry.npmjs.org/debug@4.3.4(supports-color@8.1.1) - eslint: registry.npmjs.org/eslint@8.43.0 - graphemer: registry.npmjs.org/graphemer@1.4.0 - ignore: registry.npmjs.org/ignore@5.2.4 - natural-compare: registry.npmjs.org/natural-compare@1.4.0 - semver: registry.npmjs.org/semver@7.5.4 - ts-api-utils: registry.npmjs.org/ts-api-utils@1.0.3(typescript@5.1.3) - typescript: registry.npmjs.org/typescript@5.1.3 - transitivePeerDependencies: - - supports-color - dev: true - registry.npmjs.org/@typescript-eslint/eslint-plugin@6.10.0(@typescript-eslint/parser@6.10.0)(eslint@8.53.0)(typescript@5.2.2): resolution: {integrity: sha512-uoLj4g2OTL8rfUQVx2AFO1hp/zja1wABJq77P6IclQs6I/m9GLrm7jCdgzZkvWdDCQf1uEvoa8s8CupsgWQgVg==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.10.0.tgz} id: registry.npmjs.org/@typescript-eslint/eslint-plugin/6.10.0 @@ -3018,6 +3069,38 @@ packages: - supports-color dev: true + registry.npmjs.org/@typescript-eslint/eslint-plugin@6.8.0(@typescript-eslint/parser@6.8.0)(eslint@8.43.0)(typescript@5.1.3): + resolution: {integrity: sha512-GosF4238Tkes2SHPQ1i8f6rMtG6zlKwMEB0abqSJ3Npvos+doIlc/ATG+vX1G9coDF3Ex78zM3heXHLyWEwLUw==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.8.0.tgz} + id: registry.npmjs.org/@typescript-eslint/eslint-plugin/6.8.0 + name: '@typescript-eslint/eslint-plugin' + version: 6.8.0 + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + '@typescript-eslint/parser': ^6.0.0 || ^6.0.0-alpha + eslint: ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@eslint-community/regexpp': registry.npmjs.org/@eslint-community/regexpp@4.10.0 + '@typescript-eslint/parser': registry.npmjs.org/@typescript-eslint/parser@6.8.0(eslint@8.43.0)(typescript@5.1.3) + '@typescript-eslint/scope-manager': registry.npmjs.org/@typescript-eslint/scope-manager@6.8.0 + '@typescript-eslint/type-utils': registry.npmjs.org/@typescript-eslint/type-utils@6.8.0(eslint@8.43.0)(typescript@5.1.3) + '@typescript-eslint/utils': registry.npmjs.org/@typescript-eslint/utils@6.8.0(eslint@8.43.0)(typescript@5.1.3) + '@typescript-eslint/visitor-keys': registry.npmjs.org/@typescript-eslint/visitor-keys@6.8.0 + debug: registry.npmjs.org/debug@4.3.4(supports-color@8.1.1) + eslint: registry.npmjs.org/eslint@8.43.0 + graphemer: registry.npmjs.org/graphemer@1.4.0 + ignore: registry.npmjs.org/ignore@5.2.4 + natural-compare: registry.npmjs.org/natural-compare@1.4.0 + semver: registry.npmjs.org/semver@7.5.4 + ts-api-utils: registry.npmjs.org/ts-api-utils@1.0.3(typescript@5.1.3) + typescript: registry.npmjs.org/typescript@5.1.3 + transitivePeerDependencies: + - supports-color + dev: true + registry.npmjs.org/@typescript-eslint/parser@5.60.0(eslint@8.43.0)(typescript@5.1.3): resolution: {integrity: sha512-jBONcBsDJ9UoTWrARkRRCgDz6wUggmH5RpQVlt7BimSwaTkTjwypGzKORXbR4/2Hqjk9hgwlon2rVQAjWNpkyQ==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.60.0.tgz} id: registry.npmjs.org/@typescript-eslint/parser/5.60.0 @@ -3041,30 +3124,6 @@ packages: - supports-color dev: true - registry.npmjs.org/@typescript-eslint/parser@6.10.0(eslint@8.43.0)(typescript@5.1.3): - resolution: {integrity: sha512-+sZwIj+s+io9ozSxIWbNB5873OSdfeBEH/FR0re14WLI6BaKuSOnnwCJ2foUiu8uXf4dRp1UqHP0vrZ1zXGrog==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.10.0.tgz} - id: registry.npmjs.org/@typescript-eslint/parser/6.10.0 - name: '@typescript-eslint/parser' - version: 6.10.0 - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - eslint: ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@typescript-eslint/scope-manager': registry.npmjs.org/@typescript-eslint/scope-manager@6.10.0 - '@typescript-eslint/types': registry.npmjs.org/@typescript-eslint/types@6.10.0 - '@typescript-eslint/typescript-estree': registry.npmjs.org/@typescript-eslint/typescript-estree@6.10.0(typescript@5.1.3) - '@typescript-eslint/visitor-keys': registry.npmjs.org/@typescript-eslint/visitor-keys@6.10.0 - debug: registry.npmjs.org/debug@4.3.4(supports-color@8.1.1) - eslint: registry.npmjs.org/eslint@8.43.0 - typescript: registry.npmjs.org/typescript@5.1.3 - transitivePeerDependencies: - - supports-color - dev: true - registry.npmjs.org/@typescript-eslint/parser@6.10.0(eslint@8.53.0)(typescript@5.2.2): resolution: {integrity: sha512-+sZwIj+s+io9ozSxIWbNB5873OSdfeBEH/FR0re14WLI6BaKuSOnnwCJ2foUiu8uXf4dRp1UqHP0vrZ1zXGrog==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.10.0.tgz} id: registry.npmjs.org/@typescript-eslint/parser/6.10.0 @@ -3089,6 +3148,30 @@ packages: - supports-color dev: true + registry.npmjs.org/@typescript-eslint/parser@6.8.0(eslint@8.43.0)(typescript@5.1.3): + resolution: {integrity: sha512-5tNs6Bw0j6BdWuP8Fx+VH4G9fEPDxnVI7yH1IAPkQH5RUtvKwRoqdecAPdQXv4rSOADAaz1LFBZvZG7VbXivSg==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.8.0.tgz} + id: registry.npmjs.org/@typescript-eslint/parser/6.8.0 + name: '@typescript-eslint/parser' + version: 6.8.0 + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/scope-manager': registry.npmjs.org/@typescript-eslint/scope-manager@6.8.0 + '@typescript-eslint/types': registry.npmjs.org/@typescript-eslint/types@6.8.0 + '@typescript-eslint/typescript-estree': registry.npmjs.org/@typescript-eslint/typescript-estree@6.8.0(typescript@5.1.3) + '@typescript-eslint/visitor-keys': registry.npmjs.org/@typescript-eslint/visitor-keys@6.8.0 + debug: registry.npmjs.org/debug@4.3.4(supports-color@8.1.1) + eslint: registry.npmjs.org/eslint@8.43.0 + typescript: registry.npmjs.org/typescript@5.1.3 + transitivePeerDependencies: + - supports-color + dev: true + registry.npmjs.org/@typescript-eslint/scope-manager@5.60.0: resolution: {integrity: sha512-hakuzcxPwXi2ihf9WQu1BbRj1e/Pd8ZZwVTG9kfbxAMZstKz8/9OoexIwnmLzShtsdap5U/CoQGRCWlSuPbYxQ==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.60.0.tgz} name: '@typescript-eslint/scope-manager' @@ -3109,6 +3192,16 @@ packages: '@typescript-eslint/visitor-keys': registry.npmjs.org/@typescript-eslint/visitor-keys@6.10.0 dev: true + registry.npmjs.org/@typescript-eslint/scope-manager@6.8.0: + resolution: {integrity: sha512-xe0HNBVwCph7rak+ZHcFD6A+q50SMsFwcmfdjs9Kz4qDh5hWhaPhFjRs/SODEhroBI5Ruyvyz9LfwUJ624O40g==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.8.0.tgz} + name: '@typescript-eslint/scope-manager' + version: 6.8.0 + engines: {node: ^16.0.0 || >=18.0.0} + dependencies: + '@typescript-eslint/types': registry.npmjs.org/@typescript-eslint/types@6.8.0 + '@typescript-eslint/visitor-keys': registry.npmjs.org/@typescript-eslint/visitor-keys@6.8.0 + dev: true + registry.npmjs.org/@typescript-eslint/type-utils@5.60.0(eslint@8.43.0)(typescript@5.1.3): resolution: {integrity: sha512-X7NsRQddORMYRFH7FWo6sA9Y/zbJ8s1x1RIAtnlj6YprbToTiQnM6vxcMu7iYhdunmoC0rUWlca13D5DVHkK2g==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.60.0.tgz} id: registry.npmjs.org/@typescript-eslint/type-utils/5.60.0 @@ -3132,29 +3225,6 @@ packages: - supports-color dev: true - registry.npmjs.org/@typescript-eslint/type-utils@6.10.0(eslint@8.43.0)(typescript@5.1.3): - resolution: {integrity: sha512-wYpPs3hgTFblMYwbYWPT3eZtaDOjbLyIYuqpwuLBBqhLiuvJ+9sEp2gNRJEtR5N/c9G1uTtQQL5AhV0fEPJYcg==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.10.0.tgz} - id: registry.npmjs.org/@typescript-eslint/type-utils/6.10.0 - name: '@typescript-eslint/type-utils' - version: 6.10.0 - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - eslint: ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@typescript-eslint/typescript-estree': registry.npmjs.org/@typescript-eslint/typescript-estree@6.10.0(typescript@5.1.3) - '@typescript-eslint/utils': registry.npmjs.org/@typescript-eslint/utils@6.10.0(eslint@8.43.0)(typescript@5.1.3) - debug: registry.npmjs.org/debug@4.3.4(supports-color@8.1.1) - eslint: registry.npmjs.org/eslint@8.43.0 - ts-api-utils: registry.npmjs.org/ts-api-utils@1.0.3(typescript@5.1.3) - typescript: registry.npmjs.org/typescript@5.1.3 - transitivePeerDependencies: - - supports-color - dev: true - registry.npmjs.org/@typescript-eslint/type-utils@6.10.0(eslint@8.53.0)(typescript@5.2.2): resolution: {integrity: sha512-wYpPs3hgTFblMYwbYWPT3eZtaDOjbLyIYuqpwuLBBqhLiuvJ+9sEp2gNRJEtR5N/c9G1uTtQQL5AhV0fEPJYcg==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.10.0.tgz} id: registry.npmjs.org/@typescript-eslint/type-utils/6.10.0 @@ -3178,6 +3248,29 @@ packages: - supports-color dev: true + registry.npmjs.org/@typescript-eslint/type-utils@6.8.0(eslint@8.43.0)(typescript@5.1.3): + resolution: {integrity: sha512-RYOJdlkTJIXW7GSldUIHqc/Hkto8E+fZN96dMIFhuTJcQwdRoGN2rEWA8U6oXbLo0qufH7NPElUb+MceHtz54g==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.8.0.tgz} + id: registry.npmjs.org/@typescript-eslint/type-utils/6.8.0 + name: '@typescript-eslint/type-utils' + version: 6.8.0 + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/typescript-estree': registry.npmjs.org/@typescript-eslint/typescript-estree@6.8.0(typescript@5.1.3) + '@typescript-eslint/utils': registry.npmjs.org/@typescript-eslint/utils@6.8.0(eslint@8.43.0)(typescript@5.1.3) + debug: registry.npmjs.org/debug@4.3.4(supports-color@8.1.1) + eslint: registry.npmjs.org/eslint@8.43.0 + ts-api-utils: registry.npmjs.org/ts-api-utils@1.0.3(typescript@5.1.3) + typescript: registry.npmjs.org/typescript@5.1.3 + transitivePeerDependencies: + - supports-color + dev: true + registry.npmjs.org/@typescript-eslint/types@5.60.0: resolution: {integrity: sha512-ascOuoCpNZBccFVNJRSC6rPq4EmJ2NkuoKnd6LDNyAQmdDnziAtxbCGWCbefG1CNzmDvd05zO36AmB7H8RzKPA==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@typescript-eslint/types/-/types-5.60.0.tgz} name: '@typescript-eslint/types' @@ -3192,6 +3285,13 @@ packages: engines: {node: ^16.0.0 || >=18.0.0} dev: true + registry.npmjs.org/@typescript-eslint/types@6.8.0: + resolution: {integrity: sha512-p5qOxSum7W3k+llc7owEStXlGmSl8FcGvhYt8Vjy7FqEnmkCVlM3P57XQEGj58oqaBWDQXbJDZxwUWMS/EAPNQ==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@typescript-eslint/types/-/types-6.8.0.tgz} + name: '@typescript-eslint/types' + version: 6.8.0 + engines: {node: ^16.0.0 || >=18.0.0} + dev: true + registry.npmjs.org/@typescript-eslint/typescript-estree@5.60.0(typescript@5.1.3): resolution: {integrity: sha512-R43thAuwarC99SnvrBmh26tc7F6sPa2B3evkXp/8q954kYL6Ro56AwASYWtEEi+4j09GbiNAHqYwNNZuNlARGQ==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.60.0.tgz} id: registry.npmjs.org/@typescript-eslint/typescript-estree/5.60.0 @@ -3216,30 +3316,6 @@ packages: - supports-color dev: true - registry.npmjs.org/@typescript-eslint/typescript-estree@6.10.0(typescript@5.1.3): - resolution: {integrity: sha512-ek0Eyuy6P15LJVeghbWhSrBCj/vJpPXXR+EpaRZqou7achUWL8IdYnMSC5WHAeTWswYQuP2hAZgij/bC9fanBg==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.10.0.tgz} - id: registry.npmjs.org/@typescript-eslint/typescript-estree/6.10.0 - name: '@typescript-eslint/typescript-estree' - version: 6.10.0 - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@typescript-eslint/types': registry.npmjs.org/@typescript-eslint/types@6.10.0 - '@typescript-eslint/visitor-keys': registry.npmjs.org/@typescript-eslint/visitor-keys@6.10.0 - debug: registry.npmjs.org/debug@4.3.4(supports-color@8.1.1) - globby: registry.npmjs.org/globby@11.1.0 - is-glob: registry.npmjs.org/is-glob@4.0.3 - semver: registry.npmjs.org/semver@7.5.4 - ts-api-utils: registry.npmjs.org/ts-api-utils@1.0.3(typescript@5.1.3) - typescript: registry.npmjs.org/typescript@5.1.3 - transitivePeerDependencies: - - supports-color - dev: true - registry.npmjs.org/@typescript-eslint/typescript-estree@6.10.0(typescript@5.2.2): resolution: {integrity: sha512-ek0Eyuy6P15LJVeghbWhSrBCj/vJpPXXR+EpaRZqou7achUWL8IdYnMSC5WHAeTWswYQuP2hAZgij/bC9fanBg==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.10.0.tgz} id: registry.npmjs.org/@typescript-eslint/typescript-estree/6.10.0 @@ -3264,6 +3340,30 @@ packages: - supports-color dev: true + registry.npmjs.org/@typescript-eslint/typescript-estree@6.8.0(typescript@5.1.3): + resolution: {integrity: sha512-ISgV0lQ8XgW+mvv5My/+iTUdRmGspducmQcDw5JxznasXNnZn3SKNrTRuMsEXv+V/O+Lw9AGcQCfVaOPCAk/Zg==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.8.0.tgz} + id: registry.npmjs.org/@typescript-eslint/typescript-estree/6.8.0 + name: '@typescript-eslint/typescript-estree' + version: 6.8.0 + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/types': registry.npmjs.org/@typescript-eslint/types@6.8.0 + '@typescript-eslint/visitor-keys': registry.npmjs.org/@typescript-eslint/visitor-keys@6.8.0 + debug: registry.npmjs.org/debug@4.3.4(supports-color@8.1.1) + globby: registry.npmjs.org/globby@11.1.0 + is-glob: registry.npmjs.org/is-glob@4.0.3 + semver: registry.npmjs.org/semver@7.5.4 + ts-api-utils: registry.npmjs.org/ts-api-utils@1.0.3(typescript@5.1.3) + typescript: registry.npmjs.org/typescript@5.1.3 + transitivePeerDependencies: + - supports-color + dev: true + registry.npmjs.org/@typescript-eslint/utils@5.60.0(eslint@8.43.0)(typescript@5.1.3): resolution: {integrity: sha512-ba51uMqDtfLQ5+xHtwlO84vkdjrqNzOnqrnwbMHMRY8Tqeme8C2Q8Fc7LajfGR+e3/4LoYiWXUM6BpIIbHJ4hQ==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.60.0.tgz} id: registry.npmjs.org/@typescript-eslint/utils/5.60.0 @@ -3287,28 +3387,6 @@ packages: - typescript dev: true - registry.npmjs.org/@typescript-eslint/utils@6.10.0(eslint@8.43.0)(typescript@5.1.3): - resolution: {integrity: sha512-v+pJ1/RcVyRc0o4wAGux9x42RHmAjIGzPRo538Z8M1tVx6HOnoQBCX/NoadHQlZeC+QO2yr4nNSFWOoraZCAyg==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.10.0.tgz} - id: registry.npmjs.org/@typescript-eslint/utils/6.10.0 - name: '@typescript-eslint/utils' - version: 6.10.0 - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - eslint: ^7.0.0 || ^8.0.0 - dependencies: - '@eslint-community/eslint-utils': registry.npmjs.org/@eslint-community/eslint-utils@4.4.0(eslint@8.43.0) - '@types/json-schema': registry.npmjs.org/@types/json-schema@7.0.15 - '@types/semver': registry.npmjs.org/@types/semver@7.5.4 - '@typescript-eslint/scope-manager': registry.npmjs.org/@typescript-eslint/scope-manager@6.10.0 - '@typescript-eslint/types': registry.npmjs.org/@typescript-eslint/types@6.10.0 - '@typescript-eslint/typescript-estree': registry.npmjs.org/@typescript-eslint/typescript-estree@6.10.0(typescript@5.1.3) - eslint: registry.npmjs.org/eslint@8.43.0 - semver: registry.npmjs.org/semver@7.5.4 - transitivePeerDependencies: - - supports-color - - typescript - dev: true - registry.npmjs.org/@typescript-eslint/utils@6.10.0(eslint@8.53.0)(typescript@5.2.2): resolution: {integrity: sha512-v+pJ1/RcVyRc0o4wAGux9x42RHmAjIGzPRo538Z8M1tVx6HOnoQBCX/NoadHQlZeC+QO2yr4nNSFWOoraZCAyg==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.10.0.tgz} id: registry.npmjs.org/@typescript-eslint/utils/6.10.0 @@ -3331,6 +3409,28 @@ packages: - typescript dev: true + registry.npmjs.org/@typescript-eslint/utils@6.8.0(eslint@8.43.0)(typescript@5.1.3): + resolution: {integrity: sha512-dKs1itdE2qFG4jr0dlYLQVppqTE+Itt7GmIf/vX6CSvsW+3ov8PbWauVKyyfNngokhIO9sKZeRGCUo1+N7U98Q==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.8.0.tgz} + id: registry.npmjs.org/@typescript-eslint/utils/6.8.0 + name: '@typescript-eslint/utils' + version: 6.8.0 + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + dependencies: + '@eslint-community/eslint-utils': registry.npmjs.org/@eslint-community/eslint-utils@4.4.0(eslint@8.43.0) + '@types/json-schema': registry.npmjs.org/@types/json-schema@7.0.15 + '@types/semver': registry.npmjs.org/@types/semver@7.5.4 + '@typescript-eslint/scope-manager': registry.npmjs.org/@typescript-eslint/scope-manager@6.8.0 + '@typescript-eslint/types': registry.npmjs.org/@typescript-eslint/types@6.8.0 + '@typescript-eslint/typescript-estree': registry.npmjs.org/@typescript-eslint/typescript-estree@6.8.0(typescript@5.1.3) + eslint: registry.npmjs.org/eslint@8.43.0 + semver: registry.npmjs.org/semver@7.5.4 + transitivePeerDependencies: + - supports-color + - typescript + dev: true + registry.npmjs.org/@typescript-eslint/visitor-keys@5.60.0: resolution: {integrity: sha512-wm9Uz71SbCyhUKgcaPRauBdTegUyY/ZWl8gLwD/i/ybJqscrrdVSFImpvUz16BLPChIeKBK5Fa9s6KDQjsjyWw==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.60.0.tgz} name: '@typescript-eslint/visitor-keys' @@ -3351,6 +3451,16 @@ packages: eslint-visitor-keys: registry.npmjs.org/eslint-visitor-keys@3.4.3 dev: true + registry.npmjs.org/@typescript-eslint/visitor-keys@6.8.0: + resolution: {integrity: sha512-oqAnbA7c+pgOhW2OhGvxm0t1BULX5peQI/rLsNDpGM78EebV3C9IGbX5HNZabuZ6UQrYveCLjKo8Iy/lLlBkkg==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.8.0.tgz} + name: '@typescript-eslint/visitor-keys' + version: 6.8.0 + engines: {node: ^16.0.0 || >=18.0.0} + dependencies: + '@typescript-eslint/types': registry.npmjs.org/@typescript-eslint/types@6.8.0 + eslint-visitor-keys: registry.npmjs.org/eslint-visitor-keys@3.4.3 + dev: true + registry.npmjs.org/@ungap/structured-clone@1.2.0: resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz} name: '@ungap/structured-clone' @@ -3366,7 +3476,7 @@ packages: vite: ^4 dependencies: '@swc/core': registry.npmjs.org/@swc/core@1.3.96 - vite: registry.npmjs.org/vite@4.5.0 + vite: registry.npmjs.org/vite@4.5.0(@types/node@18.7.16) transitivePeerDependencies: - '@swc/helpers' dev: true @@ -3385,7 +3495,7 @@ packages: '@babel/plugin-transform-react-jsx-source': registry.npmjs.org/@babel/plugin-transform-react-jsx-source@7.22.5(@babel/core@7.23.2) '@types/babel__core': registry.npmjs.org/@types/babel__core@7.20.4 react-refresh: registry.npmjs.org/react-refresh@0.14.0 - vite: registry.npmjs.org/vite@4.5.0 + vite: registry.npmjs.org/vite@4.5.0(@types/node@18.7.16) transitivePeerDependencies: - supports-color @@ -3716,7 +3826,7 @@ packages: undici: registry.npmjs.org/undici@5.26.5 unist-util-visit: registry.npmjs.org/unist-util-visit@4.1.2 vfile: registry.npmjs.org/vfile@5.3.7 - vite: registry.npmjs.org/vite@4.5.0 + vite: registry.npmjs.org/vite@4.5.0(@types/node@18.7.16) vitefu: registry.npmjs.org/vitefu@0.2.5(vite@4.5.0) which-pm: registry.npmjs.org/which-pm@2.1.1 yargs-parser: registry.npmjs.org/yargs-parser@21.1.1 @@ -5399,16 +5509,16 @@ packages: eslint: registry.npmjs.org/eslint@8.53.0 dev: true - registry.npmjs.org/eslint-config-turbo@1.10.16(eslint@8.43.0): - resolution: {integrity: sha512-O3NQI72bQHV7FvSC6lWj66EGx8drJJjuT1kuInn6nbMLOHdMBhSUX/8uhTAlHRQdlxZk2j9HtgFCIzSc93w42g==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/eslint-config-turbo/-/eslint-config-turbo-1.10.16.tgz} - id: registry.npmjs.org/eslint-config-turbo/1.10.16 + registry.npmjs.org/eslint-config-turbo@1.10.15(eslint@8.43.0): + resolution: {integrity: sha512-76mpx2x818JZE26euen14utYcFDxOahZ9NaWA+6Xa4pY2ezVKVschuOxS96EQz3o3ZRSmcgBOapw/gHbN+EKxQ==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/eslint-config-turbo/-/eslint-config-turbo-1.10.15.tgz} + id: registry.npmjs.org/eslint-config-turbo/1.10.15 name: eslint-config-turbo - version: 1.10.16 + version: 1.10.15 peerDependencies: eslint: '>6.6.0' dependencies: eslint: registry.npmjs.org/eslint@8.43.0 - eslint-plugin-turbo: registry.npmjs.org/eslint-plugin-turbo@1.10.16(eslint@8.43.0) + eslint-plugin-turbo: registry.npmjs.org/eslint-plugin-turbo@1.10.15(eslint@8.43.0) dev: true registry.npmjs.org/eslint-plugin-prettier@4.2.1(eslint-config-prettier@8.8.0)(eslint@8.43.0)(prettier@2.8.8): @@ -5522,11 +5632,11 @@ packages: - ts-node dev: true - registry.npmjs.org/eslint-plugin-turbo@1.10.16(eslint@8.43.0): - resolution: {integrity: sha512-ZjrR88MTN64PNGufSEcM0tf+V1xFYVbeiMeuIqr0aiABGomxFLo4DBkQ7WI4WzkZtWQSIA2sP+yxqSboEfL9MQ==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/eslint-plugin-turbo/-/eslint-plugin-turbo-1.10.16.tgz} - id: registry.npmjs.org/eslint-plugin-turbo/1.10.16 + registry.npmjs.org/eslint-plugin-turbo@1.10.15(eslint@8.43.0): + resolution: {integrity: sha512-Tv4QSKV/U56qGcTqS/UgOvb9HcKFmWOQcVh3HEaj7of94lfaENgfrtK48E2CckQf7amhKs1i+imhCsNCKjkQyA==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/eslint-plugin-turbo/-/eslint-plugin-turbo-1.10.15.tgz} + id: registry.npmjs.org/eslint-plugin-turbo/1.10.15 name: eslint-plugin-turbo - version: 1.10.16 + version: 1.10.15 peerDependencies: eslint: '>6.6.0' dependencies: @@ -6140,6 +6250,15 @@ packages: version: 1.0.0 dev: true + registry.npmjs.org/fsevents@2.3.2: + resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz} + name: fsevents + version: 2.3.2 + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + requiresBuild: true + optional: true + registry.npmjs.org/fsevents@2.3.3: resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz} name: fsevents @@ -8772,6 +8891,24 @@ packages: dependencies: find-up: registry.npmjs.org/find-up@4.1.0 + registry.npmjs.org/playwright-core@1.39.0: + resolution: {integrity: sha512-+k4pdZgs1qiM+OUkSjx96YiKsXsmb59evFoqv8SKO067qBA+Z2s/dCzJij/ZhdQcs2zlTAgRKfeiiLm8PQ2qvw==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/playwright-core/-/playwright-core-1.39.0.tgz} + name: playwright-core + version: 1.39.0 + engines: {node: '>=16'} + hasBin: true + + registry.npmjs.org/playwright@1.39.0: + resolution: {integrity: sha512-naE5QT11uC/Oiq0BwZ50gDmy8c8WLPRTEWuSSFVG2egBka/1qMoSqYQcROMT9zLwJ86oPofcTH2jBY/5wWOgIw==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/playwright/-/playwright-1.39.0.tgz} + name: playwright + version: 1.39.0 + engines: {node: '>=16'} + hasBin: true + dependencies: + playwright-core: registry.npmjs.org/playwright-core@1.39.0 + optionalDependencies: + fsevents: registry.npmjs.org/fsevents@2.3.2 + registry.npmjs.org/postcss-calc@9.0.1(postcss@8.4.21): resolution: {integrity: sha512-TipgjGyzP5QzEhsOZUaIkeO5mKeMFpebWzRogWG/ysonUlnHcq5aJe0jOjpfzUU8PeSaBQnrE8ehR0QA5vs8PQ==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/postcss-calc/-/postcss-calc-9.0.1.tgz} id: registry.npmjs.org/postcss-calc/9.0.1 @@ -10798,8 +10935,8 @@ packages: picocolors: registry.npmjs.org/picocolors@1.0.0 sade: registry.npmjs.org/sade@1.8.1 svelte: registry.npmjs.org/svelte@4.2.1 - svelte-preprocess: registry.npmjs.org/svelte-preprocess@5.0.4(postcss@8.4.21)(svelte@4.2.1)(typescript@5.1.3) - typescript: registry.npmjs.org/typescript@5.1.3 + svelte-preprocess: registry.npmjs.org/svelte-preprocess@5.0.4(postcss@8.4.21)(svelte@4.2.1)(typescript@5.2.2) + typescript: registry.npmjs.org/typescript@5.2.2 transitivePeerDependencies: - '@babel/core' - coffeescript @@ -10925,7 +11062,7 @@ packages: svelte: registry.npmjs.org/svelte@4.2.2 dev: true - registry.npmjs.org/svelte-preprocess@5.0.4(postcss@8.4.21)(svelte@4.2.1)(typescript@5.1.3): + registry.npmjs.org/svelte-preprocess@5.0.4(postcss@8.4.21)(svelte@4.2.1)(typescript@5.2.2): resolution: {integrity: sha512-ABia2QegosxOGsVlsSBJvoWeXy1wUKSfF7SWJdTjLAbx/Y3SrVevvvbFNQqrSJw89+lNSsM58SipmZJ5SRi5iw==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/svelte-preprocess/-/svelte-preprocess-5.0.4.tgz} id: registry.npmjs.org/svelte-preprocess/5.0.4 name: svelte-preprocess @@ -10966,14 +11103,14 @@ packages: typescript: optional: true dependencies: - '@types/pug': registry.npmjs.org/@types/pug@2.0.8 + '@types/pug': registry.npmjs.org/@types/pug@2.0.9 detect-indent: registry.npmjs.org/detect-indent@6.1.0 magic-string: registry.npmjs.org/magic-string@0.27.0 postcss: registry.npmjs.org/postcss@8.4.21 sorcery: registry.npmjs.org/sorcery@0.11.0 strip-indent: registry.npmjs.org/strip-indent@3.0.0 svelte: registry.npmjs.org/svelte@4.2.1 - typescript: registry.npmjs.org/typescript@5.1.3 + typescript: registry.npmjs.org/typescript@5.2.2 dev: true registry.npmjs.org/svelte-preprocess@5.0.4(postcss@8.4.31)(svelte@4.2.2)(typescript@5.2.2): @@ -11884,8 +12021,9 @@ packages: vfile-message: registry.npmjs.org/vfile-message@3.1.4 dev: false - registry.npmjs.org/vite@4.5.0: + registry.npmjs.org/vite@4.5.0(@types/node@18.7.16): resolution: {integrity: sha512-ulr8rNLA6rkyFAlVWw2q5YJ91v098AFQ2R0PRFwPzREXOUJQPtFUG0t+/ZikhaOCDqFoDhN6/v8Sq0o4araFAw==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/vite/-/vite-4.5.0.tgz} + id: registry.npmjs.org/vite/4.5.0 name: vite version: 4.5.0 engines: {node: ^14.18.0 || >=16.0.0} @@ -11914,6 +12052,7 @@ packages: terser: optional: true dependencies: + '@types/node': registry.npmjs.org/@types/node@18.7.16 esbuild: registry.npmjs.org/esbuild@0.18.20 postcss: registry.npmjs.org/postcss@8.4.31 rollup: registry.npmjs.org/rollup@3.29.4 @@ -11931,7 +12070,7 @@ packages: vite: optional: true dependencies: - vite: registry.npmjs.org/vite@4.5.0 + vite: registry.npmjs.org/vite@4.5.0(@types/node@18.7.16) registry.npmjs.org/vscode-oniguruma@1.7.0: resolution: {integrity: sha512-L9WMGRfrjOhgHSdOYgCt/yRMsXzLDJSL7BPrOZt73gU0iWO4mpqzqQzOz5srxqTvMBaR0XZTSrVWo4j55Rc6cA==, registry: https://registry.npmjs.com/, tarball: https://registry.npmjs.org/vscode-oniguruma/-/vscode-oniguruma-1.7.0.tgz} From bb6021e6f881d79800af12604dddb2ede942c46e Mon Sep 17 00:00:00 2001 From: braks <78412429+bcakmakoglu@users.noreply.github.com> Date: Wed, 8 Nov 2023 18:07:28 +0100 Subject: [PATCH 031/608] fix(react,svelte): allow panning by scroll when pan activation key is pressed --- packages/react/src/container/FlowRenderer/index.tsx | 3 ++- packages/svelte/src/lib/container/Zoom/Zoom.svelte | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/packages/react/src/container/FlowRenderer/index.tsx b/packages/react/src/container/FlowRenderer/index.tsx index 442cc2bf..bb92f66a 100644 --- a/packages/react/src/container/FlowRenderer/index.tsx +++ b/packages/react/src/container/FlowRenderer/index.tsx @@ -50,7 +50,7 @@ const FlowRenderer = ({ elementsSelectable, zoomOnScroll, zoomOnPinch, - panOnScroll, + panOnScroll: _panOnScroll, panOnScrollSpeed, panOnScrollMode, zoomOnDoubleClick, @@ -72,6 +72,7 @@ const FlowRenderer = ({ const panActivationKeyPressed = useKeyPress(panActivationKeyCode); const panOnDrag = panActivationKeyPressed || _panOnDrag; + const panOnScroll = panActivationKeyPressed || _panOnScroll; const isSelecting = selectionKeyPressed || (selectionOnDrag && panOnDrag !== true); useGlobalKeyHandler({ deleteKeyCode, multiSelectionKeyCode }); diff --git a/packages/svelte/src/lib/container/Zoom/Zoom.svelte b/packages/svelte/src/lib/container/Zoom/Zoom.svelte index d86a8505..116586ad 100644 --- a/packages/svelte/src/lib/container/Zoom/Zoom.svelte +++ b/packages/svelte/src/lib/container/Zoom/Zoom.svelte @@ -33,6 +33,7 @@ $: viewPort = initialViewport || { x: 0, y: 0, zoom: 1 }; $: _panOnDrag = $panActivationKeyPressed || panOnDrag; + $: _panOnScroll = $panActivationKeyPressed || panOnScroll;
Date: Wed, 8 Nov 2023 18:08:35 +0100 Subject: [PATCH 032/608] chore(changeset): add --- .changeset/empty-bobcats-taste.md | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 .changeset/empty-bobcats-taste.md diff --git a/.changeset/empty-bobcats-taste.md b/.changeset/empty-bobcats-taste.md new file mode 100644 index 00000000..aa8b6cef --- /dev/null +++ b/.changeset/empty-bobcats-taste.md @@ -0,0 +1,6 @@ +--- +'@xyflow/react': patch +'@xyflow/svelte': patch +--- + +Allow panning by scroll when pan activation key is pressed. Fixes [#3516](https://github.com/xyflow/xyflow/issues/3516) From 434590543d8debcc0a8231cebad0bbbb73f92c66 Mon Sep 17 00:00:00 2001 From: moklick Date: Wed, 8 Nov 2023 18:13:57 +0100 Subject: [PATCH 033/608] chore(tests): cleanup playwright configs --- examples/react/index.html | 2 +- examples/react/package.json | 2 +- examples/react/public/favicon.ico | Bin 0 -> 114104 bytes examples/react/public/vite.svg | 1 - examples/svelte/package.json | 2 +- examples/svelte/src/app.html | 3 ++- examples/svelte/static/favicon.ico | Bin 0 -> 114104 bytes examples/svelte/static/favicon.png | Bin 1571 -> 0 bytes tests/playwright/.env.svelte | 1 - tests/playwright/playwright.react.config.ts | 11 +---------- tests/playwright/playwright.shared.config.ts | 12 +++++++++++- tests/playwright/playwright.svelte.config.ts | 11 +---------- 12 files changed, 18 insertions(+), 27 deletions(-) create mode 100644 examples/react/public/favicon.ico delete mode 100644 examples/react/public/vite.svg create mode 100644 examples/svelte/static/favicon.ico delete mode 100644 examples/svelte/static/favicon.png delete mode 100644 tests/playwright/.env.svelte diff --git a/examples/react/index.html b/examples/react/index.html index f1cba741..828516b9 100644 --- a/examples/react/index.html +++ b/examples/react/index.html @@ -2,7 +2,7 @@ - + React Flow Examples diff --git a/examples/react/package.json b/examples/react/package.json index 9c303aae..36dd09a6 100644 --- a/examples/react/package.json +++ b/examples/react/package.json @@ -1,5 +1,5 @@ { - "name": "@xyflow/react-examples", + "name": "react-examples", "private": true, "version": "0.0.0", "type": "module", diff --git a/examples/react/public/favicon.ico b/examples/react/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..9ef0fbfd6596f80415822b585a80df66888ec689 GIT binary patch literal 114104 zcmeD^2RxVC`(InKk|fCpp%SHJW$#23Nf{vtnPu-)*=g939T|}ovXaP5Dr9G6&t$#- zbGkpb?(N&X^sigL`}2G{z3=z+p7B1<8P7V;L7^~ExF`r1C_0o3HwvW-?wy=|`^|!n zfl33x`Dj@*_MGCI4JUwg_>S!(o>grKB zNg@I&0`NAGw3L`4{3}fOu@f&mbCGFx%Tsn?_=_=k8C8lx~=8@ww86i zdv()_3Av&%oQ0fr`;(H9g~-Gz-hHBW33*Lc?41|W97~qj)_1qu;c=TmYC+OVmX$F0Rp_~c!9b53#{{B;B`Fqxf>3ANOj($gi> z>pi&_tx#yjLjD}3DugGCx`oQdoOIe=v|m?Vl~pObx&oF-=-q100?QcqpUsO>0G zW1DRgTk|PZF!-bXi1xSU&MqZi1UFB*<55sr;xmL1HREdVpJiv0PaHtY5eVbP zT{cV$UC)nqPmIvcSu@5EZ;2!gtN*3menrNuenBY0E$_*kc6Q7csXi{+jK5u&eImVs z>1{Z+e2gyEh7C?fSz_?goemT^;>3AZo0H)i=~FpHV9;W0-cNNz^8t~s49cTzPC}D+ z46DO|?)<%o03nl&oL3B47I;jKN7v6vHoU%qqp3F*kMg<}zp(4cTm?S1>ErSuL5BH_ zIT8;UDX*ajiI(dul%&Pm4|sIi_aa<` zNXrSmifo1aB%;@On475p?9663mpjvL$1M~hU4Ib^S#O2a#GRmmO}@UU?tviI?2a-1 zlGn_nkI7u0c26kjIAVxD!$=Nr-E(qM@XA8(W>*cmD{KM&<-M*#&2>Qq^q$x#4lEM- zmkXG}yRSR*ON`Rb3hEV|w*)w1K#Ig}`kgHn;B zB%y<|X8uw9g##S+dW0I+4G4d;_nrwl6*- z!)x-wwyCLRQ*P=UTwGJ`Fsp*LdJRo#O%6&a=}gUxxB&el^nAOn=P#T#%sM`0v)Ip0 zdIVFrpUNr2qMsU-w{`B&#JQq_FAKbgZP;QMg>1-PlhLM3 zUS7NMhV*e|x!9;E@8=avH*Sz?bCu^vKiTLMN0V@f9Rp5QH|Cd2e$4wSJ_3nO_{E*Z-J6$ki(>cOtXJD!YAyum2Y#w_=klso`$NC*7>HT zfj(+}E4N1ik`HK}w4mr29?Zr7Dj6MPGN6$UwoMGNZ3f04nNs`>^y_r8&r$D zs4b%MekYgo;Q(>X>Ejjj>>#o1>0- zvBje{+%_o5DKLK6E`}u>k)0;cqXQopol=Ewfu#k&*@vqOpl2YoH+4G7nPq4k#cUzu&u{_R#gP@}g z!tm~$T*su(PVxMGb{N)jZBmlP9OIRkS53SHy8!iZtvxLR-w5W8DM- z5fRS|@gKDpiCC4-HLF=T;v=up9|U1#nyqt=Jl^F|(GoeCj} zu8)+%i>2E?UE;B^Ga~7g$ippWyC+_r;HSg6Q%kftjDxaw$guY0>(<@2>s4j-r;PT9 zV*2~ZxF52yvAHYguy3~{ZGpP{`Sa_%HrK|dr(=dzds-M`u|`SI(RB`4DxNx3{xUgF z@BDcs!#9KP-gSDh>j(2>kVPxpYz!M3Gw%pna8>q{TQ9DhW4~`V%dPC3squ09?e3aI zSmnGr_4f<{<7Z|1x7{GRXL%!u2_-J{h=%3Z;8II-^WCKNqZjV$)$`L>>#&*kRd46y z?C$mQJXW-TlYLY{;R#r(Mb*>_v^H>?O>w6b3*Y0qiCxs`JnYjMek>TPT@63`h=FFL~ui@;LwOW$C)ofU72w!Dd^f zM(IvdqEhwq&bg~b3i;exbP!Cz2<)PbuGT$kHXvrmm85!*Z{%rpb)3EgPS*aUsBSE0 zR6&9LI|8TY14(7rXHOoDd~T-0A7JDW{2~2_*gEIPFv;TR5R~k5Ol$oI)P%U}+{Q&^ z<>eU~cRK72)Xr#HzO8_QtV<_P9;^%2GqJ?VY?|8!ZOQSmwOy3f zC%iqdofKb-T9n$Tk^tM~j2jAY1>U46XFA^vm~^C%_llsfUAQIioxp;Rk3ovxMM;ms z6sBgdGcL!7!``@QQ;%%W(Who2zm#cx^6#7<m{=lu@5HuxeN730p}E`Cjkk3COI0tae%MG@=`h&l6t<*a zho`$~j{XXZ2udr=#pU#VDmK+&pZ0`YYaYG*3D-px;%`oV=uy$xo3o+VpIVsZ%6T`` zWA08u-2(NVem*8FWLLT8S)qFj-cIlXv4!ZaXg?;?3^Q4>!@ErK%5>qiw5qD=xYgUl zz2f2@ZrqgDt&g&P`&Q?!hNv)sa41$5*VB^*weO$d3Kmch+%pTG=Mg`u2d3d2N1aHW zDEq2{Gx8T_cmqu;;`#3)(<@Bzi7jA_ua6U^-L~vFmLAWiKd$_^m zdvCA#!Yr+$gu$S-!P(cnHUxqxfJEN!4(04OF)YcgA@2l&@>5q;S~H zv6YFW-z0n5l|J{z?4U-GqaE%D%W-xJH+O(d?fIG7rnJtD5A$p#dn6g8$qF4l5D_~l zc(n_<MuNkv}|+vg)ok}qgdyrgUw7v&u0 z8XV)>>jhnEaylhL83F?y&hY0u%HH09uZ2sG+WXjdIFHAUWuL2KQ0ZmAbldk13y(PB z+8v}*Fc(Zkb&S)ph%6-NHKilLu-FThrmn{oxT>l(;`zfDB1TFM^zR_`C%0#ezg(C4 zUVLeXyhX{mBW7v-bUR4%!0YCdJRu>fWA2l2%1>`qN9?mz&g{A%9NkdcWgmZE>>)!N z>cLdSCNt(($przNP6l0&<=nZ=1&1t@nnwl)Ns=@ZUeZ2(&g3lp@$ z<<($m-{jqw4jLMTQ6bJDnpfP^r{|m-*4rCRH*fxkKH;Rs$ojHWToyxWuwc2ePBvBxxaNONu=V4e}ACL{7^+=o*}P=Zg% z@cQ1}n7FvedcE!HZFy-Nv|dbGGESaUvx(LzI;BV7IfTD}mvUJGtBK;NypLg?%LXvg zC7xDQYKoX{&^3SF|Hd*^p)>mzb?Hg`yAafzIyAV0~_lA`(e3KMA0 zeyZSuj$FqoWf+=`L_{!21gth+y}GVae&4{Ev(|4JW-IrdQFhR2A@?SLmwZ z_&hHZS5;knG#PHZ@BDMOYnjmvB{yVw?nutC*kMkqvQ#@=PP(J(@~&2%lm=kU_06SM zGIQG&^CxQ}^z`+M2d8%moQQ7-2n{Vg1~|lSdH$H!6OKw%5>{OlO_qqDz~xC|9(E^1 zGD406>mMCB;V{2mix_HH0RdWVR^4j)27a9;-1yijhh_oY&YxG_ar4&L zbgH9|Qj!rfD=X#}D@EC{zytmfn5i^QqR9t|2M+Yp?b>3*>K5NylDMxajpYi@<7~2M zN*@X3Hq))*WjKay4}9$BiR;@;F(fqv)l=U`r3z_jVd|Qbf%$Z|`u>P{S`|?_xtWAp zBqubvN<*2&ee1ouPPTDZ*$OEoK?gggE)YC1 zQE~Cobe&1!weD%6sf+JV6OL3=R76>c&^Ig%P?_8bQo)#MO+?I%d-qKs$APai*7$?@z=!HxpM&117YI#Cwc zVdLf7{D-kQ-A5gF!)1-f>@7F@qp?$Oj1Dqw^s1zDS1ap1=BNcafAp;#w})-c&#-9bt`W=?A{@@-=&nncwN?1@yWb=rdf?!pvRiJ zp}eu|1ZXc@7=DnM>38Xbj(pKEwTV6(S#oK?a;y^EzgV?DE^1#a@g*CNnoK@_j@P<} zhl`%v1^dw3n5XKV`Zoo(o_p+#0!SO|&G$Ni=^$9Fd31by$Mp>tc9XZ?aOq?s^&wxR zdHo7=zNX}=ob}jyTRQxpi~iRLuX9H3+pK&`c#b6?&eu)oC~=6Qr^4pkX2KJ~2Qcae zE>f1_OAWkx7nhW=UOHfVz(z#(PJI04z{A#eIn2|yBvaMON3UbQe=b6jm|#MB!jGHE zt{H!n)^(B1Bp(acZXy&hleOWAJU_{5^?+)G#ZL}FQIBk8Rw}r`$Uxa>E1&c-y;zfu zr^y>|LZgMIgx1E!w0I=j?&x-&_Vik>l-D`_xG5t!jJw{c;jS!7b_c_jE$92EcM@`k z<0@|KDUN2WX&-PFy2_w@0|dI?eV z4AytLm0qYj5IJNOO}sB)yGGP7*>O%x{Y+KGWY(DYUC*{LOOr)7W<}Hrw)j2UY_g)^qMCPi$-`~(hBq_bym7d#%=4E3A59W)KtxhKj zog(ZBA`Y<1tL&>={UC#zH54?)Qa=8rcwup z=AM4W1_phWg|>n1g$2GdGwby&*y7F`8g{*6FD%X*br3ptF0gBI=gv5>IEtdov>;9O zYZKjhYGZP23oUy-Tu8!gkuN=L8+qrjx`v-y4TjYv!Td`q;R0Da9XA)pMk7Q;vnM8H z8hYjkc19&`;9wUFtgO5{^d|RI{dfSQ!U;>4wl)FcZM-En(iOqiO+5^{uaxN7J{n)J zh*>@;Z+b7~_Q*(E8ljWdW_CKJv*c&&5DQbHX z%(CQ-4zp&HC*D?9YrJ+gBUVvCK|)zMuIpehqx6FZ51!Z8SJZ^tO3TU~Wq)PwO)o7R zCdZ70m6C=lAav%80B2(S8`gBADz(irU78|#j)m=r zF{{(Wy~v2Mm-oGfp-Z2C=OhxlK_}LRZF> zrdF0>`j&tHv`2Ql1B1vN!Bg+pnd?yv=B38wj4`1-$raB6x9^O6hzgS3p-)kBwlVw} z2UTNB&6RVH#(gA#lEb@ZveDqqKD^tf=uRL?q10Z6cKKnV$#qF@1V#2@NVjdtp^n~T zbBTB~l-Tmtvkc;!S1Y@C+1W4Kj;NQt$<2r|&CSs&^JKcGUJ&-;_$D96!0RC_h}39k z%2MX;9Zl}<&GvAYp7PrzP9@{$z+;olKd%rPvTn>IGk@wTroskPxSV98_j&&D$D+rT zl*D?TbUBxKZ614L`KZDzAgZ5ACXolqD@kj#g%#zAbv^Y4g@S=aexP`k2xlp0>Y}>y}`Yc4~LU zZjDFSu5CrTQu8Z{T_wqL*R5ajuF&bqYN42z;*{qwP~NoT*p$QW6aJb`?i)KCcVE_F zFyv)Af$zz9yQuN~Ea&x7uOml2<*;H;?0tm8m_u5;?eZCK-VZ)Vfw+m}mY9SbAKOh) zBWJYlGn%&yd$9n*my%?UEzQ%GNfdjT3MnXH_z8|5P)<>i8FwqWZ#}6Y=Yl~&F8Wem zuhUzyvzHDf*76B`qwqVLRu)FG(D(UZk|^@#}n0@*1279EX6dp464 zW1U8q+UB$JB|>9K9{2C*G|_f~iN2jS*p{OoXcB`iHj&Yh-k3K{yYP0nS4BtAr3oiJ z)=}a%^+3E4*Ya#l@ z`bU^pSvQy~l1cZ*yxunZN-O6^PAQgL>JVAWaDeEU(oHV8;uD0WCQY1r=0)9wu4+f3 zBXIQm@doCMpWVj`+>X{$Lpkv z)&s8%lJO098ufvMdH+C}ANC#pg&joLXHD_(T;+(b7TED|PzEr}E|p78Y_-`>d1Zc;Af_Rb1^#e#0L39dCz^ ztCht8E&U;J^Q#Qkn5)G~4k@K2QXB2M**PS0{XC)_+ z0ZqrjL-Yzb{UMKgdt-q3Pw*Ap#~-+;;v@1bwc2_AX{Tr=1$|#&~Dw@ z+r?^@?Zr{<=J%Tw>j%1Cv8muYb;N0!)Kv#_Rxdm&%rA;>5h(2*e=`;q%$YPBQHva` ztdwbFOQI(6c9|C&xKPD8 zx}eCx)WXvBg*KPO&iA+$lR_~X1%&!hvFs;Wgrpgmqy+B%j8}z(2oBemb5i->7O4BF zr;0}B=5Bv2a)-27(_ctPB%oy1{j(hX^@GzV_^%5IX-)RZe;7_O_DhU&W0cOH2t6n* zeSfTA^pH=nNlzL+Hlv+@hRSedd;CbEz27D+2^6DrNe|UyfU!gUxD1N>uUr2tHN_nyNh9F&iTXX@HVbxi6GO||mgf6v=*>2X5K z;E6ZE4*Ao&Q1}p9Ok*6-C~PN)NkJO-mFuEna^TqUD6R( zb-%`2BD%V~6}p_#y^K85wu)L+lr-h1QFa1?1qBv0;Rf2slIT#=Bo5F!vJ$wy?d34n zWje6FZ{Gz~9v+^PuMJ-YwLc`lW~3&@OHLl9zI*6NikfXgs&QmN0aoh4{DUk`#hM+o zjth=^&ns4(SfU}s{m@M-5R)<@Cid>Ihe%yZOZhW)#5V$2piQNW1e)W8#rDOGM%jEr zS<^O$f`hj}8w=oF6O-bvM?`p4>oV=#`!Exg+TWt0rV_wtV>|SsF}$Oc=+x`1OYtm3 zTyC!h0fF3mdnsNfw?JOTi=wu#&2}^?iKkZ=dx9eD`gP{5AFQ5Pa2dWX$u(!V z7h}E-2Pc<&(W7rQL^~ElVFF9E%?< zUbfmnQR#}Mo*Kv?={xx@$vESDw{pI^u~tjO3Im5X$mryA0sSj=yc=&2-ox#U@psObNq;7jO3M^=+dHOhcuXR1X)JY}wHPL-6^bLjUg4(h*i$R41e(Q`OzC#J$FDPrP>O^+7M)yZ82w+}UE zUWSDMMx1J9<~ZZn{311v+3Ch&K?-11$3300Ybm8+Ag$RjQ7wB!?+}z$vo5rh6*(D9 z5$$B$$%&E<;I^6KHqKw#BU#qrN110aOkWWuWn)7X8_T4?Nr>wztg6~VA;J|MoB~clvjf)`BoU#);xi&mU;;!4xXL_C06S6Kwlx(C-mB*xiya@ zO-GtY-2Fok*^8DQ1tk4tN$HuA`fDx|s zPyw}|g$q!a*0;7sbCb$g#0pfsm|%@bAg}Kox8iYF&{3grNZ%apb9d9RgfM}dE-w6p z9%FBU45RLon_zUpXATqopMc)c}Zlw>fhq{QxJ ziduCdU!a1z0MAgd8ui9{VD=Qa}&Rlf3ccemzWniU1<6$>k?@3Uf( zqpGSU*@cUjK&2aRy+3JhkLBvxiI>Du1`P6JoxEk`@$vDdqXm`|L+0&~>FL{}fNC1& zfcfm)D_Whd$LkoD3cyS>URV0wwB6n^apDaaF4nWx=B*|wE|;i^>_3oM*U*q86XBt7 z1O@tx?<0q@gTO~Y<&hn0Hv1|59Rl_DB@z#~+m5J-1D#jdeCzP=wy9~J;}sF41QmlF zGZtrCj;SW!diQRCe+(c>w;7mg_@~AS?E3iHbvjF|&lnTQg(^RRs>xADAhz6&F9a_5)JeDhLCb&~pRN-4ltI&H$VQA4u}_*_!>l-n7%B ze16fv#&&)zr-1R)i!F(X>zo*+XG`#>DxOM}>mF80;_JTkCZ8G%L*SEAbf9B9i?onV zd`qz=$2}_tFQ(wIuzPv}JB@NTS?|4=W3qFHf}GT23D8u zs-V3-$kM^~LKRkSCZ=FFH*AnqAOg&-ms^JKWS7fLHknriDQu|cw=UJoRNW!ByEk6Y z{x(p7Jb!+HamNnO7SPXT7aj7|Y31Ut-=^WC@jH0$wPo>ZI-q9_-gkEUv3NOUa#4YD z&h^R4=8ZDE(c(#s0TB_B#f#RS&4G;4jdT>kI>27m?Z$ai?&x0Y7~r>LpnIobpo=TI z!AgV@183RFd4;Kn`%Y5Qs#Yx-D_@^&T{*x)TQZ*&l?(!r;<<-;tmW9 z#AeM<_Ng}a58Usbwy7Vu7;`R00nGI$PqGFFUt^19JBkN1^>RQwJ;mi%86V;BB=_Yc zAvc~$-l5GK9e04w0tU~FlXve1KU*YuBQ7m%`q;}A+f^7$W3wiU6aq^+c*A{sCb@5B z?bI1ruSi4}>+A!VzLQ4h2S$9(aF+OuKzW)$NtPU9VDco7s4X99#j~2M7Bm_2QUzWE zsj7?(o&ANgNWA>PW57Q^lq9vsm(PfSm380wR9w7P!{!G*2OZzjoT~|o&CBZxp;%hK znfE+zgRGj`AzKUDj`8xsC(m0b2nwAj#qos*yDk!swb{~+)$ol@o-N%{rer)cBQP`c z!6hz^f|qyC*yD{P*TM{Glr*3KvNXq+KUaC`LAE8G^g%hEk@t9D(df;novDBMQtnv8 zNt*dNSC!or+KYNPf%M)^d!JsWHR^3V(H^xldpGT{`iDgaz<77NYZO!hO(jR72)(PT zQJejHEcMyOqz75IPwby%FB_bGUS|?=(BVA|n85M#1a1r21B))DhMmGQJjZ6SW5=E) z$f#YqG(9$PIMwvt$m1)`>u_De1X>>#E)IGD1B7=DEs$U`s{3XeBDm5Wkvj?eqRwWZ z2vWH|6!1&wEpjfEil$sB1w80@5@KHJSxDGR2#4e(&TswI8>gCV|pq*v5eBtI>>clj#2A9Tn6oCSuT^%`plYd z^akSa-p6p-;Ax<)=Q>0~(qd^xp{zuk-BM~hnp_UNar88(5J1?*jmCb_uh1#Ep&YK$hi;|_owq$Xyb5x5M@tHQf6w6L>Vd|q`c#SUw7 zTq&(jl{yXNJ>Vtwl$ zS>hW;B^4Ctk3EZLY4agX@B<&MwY1O#)LAt3T<2=;X-P~!NV|o?jdl(R$pse0O-+xg z5`h*l2?6<9Faj}FNxpj~!XPttBHD45o|U!o7STbi z-YS`qJmUjgp$7u|WI1GD|4dS5>wc7(1Xh==N_@QGzUOXR2c)Mz-*C1MsI_j~JkmQ5 zA3>>Pq2YtOZ{Ks30$m=sa4vpWS0V}q;lyiglCdIJOYMwUj{^0VdOF%I4f29D8c0X3 zLP7EM>(%^=Ro(oHQ{9w49vh~_MRj#?H5?a&X>5mz_gdd_8Dy})&>~GbaFcdvY+g24 zvGN&vft+^t7EFwRhrS|IKBq|;0eh;k(35R7RX@+rb;3U+q{MNF-BH>>m?m|h*D{RH za>?VGyBQG%Tvumj8vM-L?USUXq$mf=cjf?%iPjA_?2Uf>>9<&q?HGR<>ZtQ7<0hh?kxOB5JvfK7E(w?5{8A7&k^E6dmmlvoC<7v#FEio``&ARTS zArgSOIRpFr{tz$wipomO>X4iK6HirTc2M|DN0Xn1b8F4LlS)7XSoUFZGdCDc8q^7~ z1qIz&w<4mV>?$h{L%$Lpo~A^l?!A;#$CZwB_aPJ7A)%+B<>eT2VZMt0e)?iDpb`Zt z%Hwhom5-%2KAEduM^1;W8Rj1tctpL8;N`uOd*c>4C<$e6^IxsF&g?VIut5xU2AlkM zPZ+QOU1O9soi*g3%vaefMFbpWy9j}tCUpak7Vo2VvAMaXql511)vItN+qVTQ6nfyB zu-ZmRI!tZ*Gh0AUVBq89>xwP*$oLS(ZR+W=z)wcD5eSw27kQx}vUOeRtIOrxWy2QQ zaxzf~Ihyxq?{x4&TcE(aAuW5s6qT^FR`UZhPiAthBS*yJUv-+=nh@vokBr<|nw6%a zlAF99vB37e&63&1UZ>K9Xd^y0;FIy?9p_WQ+DW#lp%St>A^P+cfNN>HY+&Nw;B#a@ z7njGg-`Lo%4X)W`|iOy~FEfy|&SQC&@O`T-8Tw84q^JOLpjla8DKBuKT=piTV0-QixoTkjt@IMloW!8Umn?QtoJr7X!01Nc-4Pd$yO>dIb)%A$#W|Hoj9Y1E+ zl)o*|fFrSX55>4m!BC5(KM+DYEo{ld!AuZvE!ej{Aq4e8-&r+NwYEz39FPQn`41>v z3M>UR2eZ_G+l&6CUA^ax3ybEaL#^kN1wE#5*&=v@AICiH#mKqAXij$X=CMt*?Z7IA zM{B6FI9Cl+l1Hb5%k}|P5O9#}f>LyUy-iu)rcIjyZtEV)Fkqf~irIl9d(G&O;BU6S zc1NlDao`}djnAT?si}Iro0)ajF2EN`B$b44QLMve9J1h()c4D=6u&QXl;C;$=v%Oc zS{SxhU)@M_aCf2^YeRhC^}vW|-Ocg?&Rmf=LDT~;8yXrCf|Pw5Lu51}MC*A#i+}(| zwYAniIM}yLOM&f`{k;wN*!{o&ot@2Y*nJWx|IGVpN(|)`lO3g{uO2@k4;>0pQfS2c zqyoeMv!ZUB98R=V;E8UAhtgdue&BCpk>{F{vS(pw%t8zpH+7H8Gw<4UEO{gxt9eQY z|Fs_hCg50uxRSk_GR{FUHm&9o;Q74d@Qtb#KA1nPtyNOm4Rkm_u-<*jVwZ7Y!Jd2O z_5!rS!<)NoSV@T+;%;)DonZ8qXtY4hI1jC(#I#7bbo1&)=Cr9ScZQt`Y)3sBLn_0Q z0>xveve>Gh07FYfrJ^n&xtqLMdT^OnUy_>g1!mHR$5A(eca%Ohl#7bf-E;WXi^tV3 z*qh&&kM8WPEp&e@Hoe{isC0MkiZ>gzPilM<;cGy_7E%t}BX_k4Z^a+N1g1(ZusdBOuiR9drQ?qp35 zu=c%zR=LDPg4^~ZTX&ySjZW-ARKZNE2s%`)z`3mV-id82fP)Eb+@wyF5> z_ts-9^h*kMedvp@#4uMlb5N5qgXd~V6lRt5)zdk3?yV!FkB~Ef@d!GU7ZM*~?Q-^+ zkm5D-jA)k=X`AuuJyh;c*RCJLK^+rXs-8Xf_1!|ORx9^vHQt=GduZ7zKR zmILA(ENj-t+k9Jq==}`%OMmE(mVcdVp51k*$BLPc@4AxZ9_{JyXLoP^$Lk!ssL08y zx%84@+XCyUEW`LrCBycez;1N5B7kZn_uMA)-kRg{)q+(!J2v`AFchD_K^5WVGjYdpMZevGKUWb0ckrpBN135 z%XK_+$}PmeTzp=i_i%UMkr%HbqEbe%iHPEXKvg#CSNrxDZ#Z!%+s&vb5s)(>F|p$o zPor!YH+}O=s4>bIvI82AdoWS{xcM&k$Q6LE8yN40fsh5H7H(={prOK&JE5}F&>ajW zwRP)u0J$B^sZXWk88~;j-m4;%U3dS`7&|j5zGgNbcl*m4_nJM__KQHrVZt3|%7DG& z`Z{wnGU=;Vb#&sc-`3qaC(y80((yyqHY>t@N{9KTJg8#1UC&#*#PGfn*zCNe|4rQOviQi8ua#S07s}06el_$FJTHVa9kPcd~dEpyRBUcPf$z<)uDxN%9Tbnn_6_^zJm;A@ewJkbYn#FDUCz4 z+>H$zFr2&&yI^bX93xD(r?aVehvO2u`QVtq#0`X{V@vfZL~;8LR4F0T=4#X}%=RsF zsX}!4v5PY)kk@Y9 zvZB_f(vs&;QHE)Bx5w!Ud)h^Bk3`@sIK}i9(eBuZX~G(K#hEzB>9qG-WgSPC62145 zbXWGNN8(r?Db((7@IIZyPRZJRTQO=6DsbNor{lKLf)mdB-iEvBN1~o$rK5JGs|nLx zxwP=q`oO%Ca>xGkSL(xc@kIDUj#1-rg%pUOmCWXSuEc@PV2>b5T3k*nMMTqu1>8Hq z2Vess++p||V4yaxM}18HdGO5_1VJ!BS`U&WNX{VL1E~?DQIM8ET7&P40f^HvkY0k6 z0g^pPq98#U04o1@0QI0i!UKs9q$rSvKw5*Ji-BQKJ*0&QNH`$*jxQYA=h z@ath<5i}_uBr%ZSe(~=Dpe#7gZwDy>q&bk*;Mc|g><7spL7M%))&-Cs3nV#^dO=!) z|1JzbnjHlR`&%XgkPjE6iy*Cyd4PofQkVtpHV0`{>j8WpBnObzXb+I^Uk;Flkd`az z1K>SukYJx#qdh>vzXTvH;araOS8D4(;~K9A zknk@BNZak`<^b>J6amxN4Yv{~qb;=s;?pJwpm} zA0m%(a{tj(oS%=>fx5dpJCXM@Gpla@N;7=;@Bw+-)rHho*C0g?^ZwCqgg7nA%R_1^ zE0M1Dc4T^LYNgHo^Lua|fO@>&y8yU{dPAr?S{1-Hq}@$KbWf@x{JVA|yQ#J!yS7mM zlmzP*VB3S7Q&s&)m-nDgelLLiJ2xW(G0@OJ1lc)$`gigHT%S3vgk+_reQQ5}I^5sq z0B{d=$EzCq?Qh;77tWkPIA~~p3cdfTpK;LAAr|@uNMBFS|GNvoGAs=Yk$rUZzub4S zZ=*pBH8l}Pi*EovI01lskmrwDP5zG7Hbh0{@GpmtKlceOC1s?)_uJW7u)z+2W&F9^ zU+p)f#W(Z;NOMSgXg?fYDgEJ`Z*)fMm&eI6jV!>}h3oce0p_tcHT$pmPQ6p7k*Uea z)qEzj-9p+!8}f<)t~qetS;p_LeuZr<0sP@=;c4mPUvh2x8ou{XZ$nZOAZx!WfW8~{ zE6oAXYXcY44#f1VF5>Otg7~<){iDgt*#&|9pL06{+O}OfuaC^n&#&||KfY^W zV1TwPScidzCIajHr@s^87S6p8*XU?)R^{YsPqZSaudYTb`#`zqTh`bWRl16o=H})QO~qqh z;04Nt?QdFFToRP=(aEx^vPY1aAE;kgX#*EPA28EBhxR+G%Ac;Z82BEfJ@hGC5j=bH zj350X#QC4+VfY*B-&O&u^40tr z{oy+JtALG>5n8-Jo!v^|YxK7f=8pE*^;v4Moa|ijb#|A0rPRJV5+B zE+d_7?JMrcv9>uA{Y$KwU1RW6SHNKW0Mn3%;W$CWco33+*o9 zH*ft^JI8X9*XX~DiQleCF)@E@uNB*W02v(_`D4b2tGf_^?711BACpqcqpBnHJ?$+r43F)_dd{;!b z<$jPD75&j)0s1T~C-`jn?<=`p_w@YKfS+);M*mMpzv=D0a@v8hn-m@MJKdM*51*m4 z`G2i11o`=YYQRspTciIcq!(moBhdftYqa|OxfI|NnqR*9=nn#YLY5PJCdtjSqB3Az zxj;AgGhvPXpRhmlZt$ag_c@)>-NW&H!^``t{9kB5z>4TEFD#6V4E@~DM{D%|M1Ob( z`7!8+h>q^d&y=O4{!;#%7#~NDi%a}v8T%O+k@O_!HurO3jsAbc|H8t;N4Xrz_)|DS{RU!~SH`lF}B z;^LRvSm85t&(W9go9!2!j&L<)e68&7^?Z%~=rI`;5{md=zWi}tI^+rCZbu-t#wJK> z^UCM$-nVZ*&iybiEaQG+65{9XfxxnV6zeuAFs{-=#jfN|F6yepU+Lp_iOvV(2tkZJpJ1Gf7Q`xHO2hUcfU6N8*1xT zT<_QR|G}6--wM!10qs=KZV2twP$%`Sf8bk-1ODmg_y57TWIqa^kHnvKt8jdsQ$6)d z?Ei+b-%cL>GA+Z~x`&+fjF0xI&ux?tkI-i+ zKJw10{RyFdQeRE|i}t}XVSKnB1#n+HjDNO_kL4?jix7MJ_D|g#4{0BA?HaNd#Qs`t z*YZ`2b3ZaZw&HE>AKw)}!1YBr?7;Ug(AO84Tt%Fn)P%c#X_tcjgwStwr2uK40QwBN zSSK+49gKnaqX5pXSj2wK|1Ho|#(9>j)NDM0&< zovA6>?}V}Cl)yajweP$W9Q?a|2-+f`J?e8jp}U8E#n5jZ0@ORgeMac;2kX>OR75!G zx1%i+#yym+kETU$kGw0qg@;92{4?=Ea1CEoVg>%*|I!N9bp;3~=A^N^r3ktZmRo;r|ok zbh*xNxk7#r#z}}vcxR*UsT zu7V&=>l$6o#3dAKc|6L(C6#7lIOuG+P8$ir1_uwfah)mc|ZQ2)_`?lu=&e! zVLe^Xz~8_&rfFc(T=@BF|Bto@XoG;Z2xyb|nvU~pdhhS~9NJ`{Z3f!Gp{?e7>c(HA*1WC|B5LY?`F~|HmO%u*Q9sX~$e4c_J7IvHQKtaIv)d zCY}J!`DrGrqXVQxdB`X1haFjYe*XiX^1aSodA{X-cSjjP=2jl!;!|a-yn{Z5(AV&L z)9FW*2isavR<_Eo1hV=Q1hK?lJsmPEK2=rd1$YIpUN6(=udXSEpYlDvv9dg$mv;%A z;9i^Xsf-_S_gDVk&?g!CCV$N@8l6A$_j(5FJRvRfRsV13x3e0*5Xk34Uhi}KF5g3b zE`SF?VoxJTocfok*dOqJAU}kmR=_XPpf6{+Jb1Ms{v-oJ{;wkZ%W`2|v1$l%oe%WO zb?D24^UaUs2fw!e1JXV|BJ!v10s6TA1H^Ab$B(Xd{|A)uAfNv^jo>}xxAMSIcOO8Fm!eX%w{*|4*%{qM5>{`Zki^fI0==Vx;I?{EM04b%nH0GDtm<6p%7L^CKu zx^D+#{WgLu&i{28fBq|!{cp>EDr>nf!L%w*M2Jh5W04m7(Dm^oP8~YW9B) zy#5lm5XW%N|5liKhae59VEzDl;B0#Ysk;m0wzuC}8iJ%>MBm276`$t3`ntbH|9@Nj zhp*8euEDOvBaGDuV>ZGVD{wD0v{SXNB6csdr$D<3)WboY8q~+Y z@m2zKJHHC7jeqo%Ko_GG`q{76*M8ZC|9LITdcDt|{jB>n`u{A<{~GnK(H}h>-ZV9V zI6wg(W415He}`wa%+9XdQR2fCf>cHQwgv=>{$>M){(DfL|Es_n{r^Y_Xy1WnGYF&E zhYoFk@Jt7|7xV7``s)RX0bM_^r+uzhfx14KVl8?dhl$P zzp^7Mh=_jl5&UD$Prsnu$8Y~1>Hc{ifcMar19i7Q8`kLmi30E}CU_>(U(tT~Z-Ksk zXn8?scg=MIv|oX}-gDQ__uF2h|0nvxcqyO9R$Qhvx+^^64c+-~Z(g?j=ARG7_@Br8 zpMPJ(`puT}sRjT1-5UKr;T*@W8PI9L2kSfl?Z?8CEI z(b4*A&(NL!3io6!({?4-T<1^q|BSme`hUVYJfmf$dk;jw8PCv<< z1JHM)Chk-HKjUtV{-3Z8&tivXvVU#7fBqbv@s3Ux2>HLvzu0&2`JCXvh#=#=pX&b^ zcWdX|I9qTpCiK-qx5vwx=r>=@)%xrGv8CVV*BbrN;}OPE zyW-&RF&4SJkT9Zm>NFA)9{ziLJ@mQ$_;hXt==s7BBvb}Ly!HT{5ZIdm_kwg+|M9(_ z`D=~-KNI^uzwR~qqo)CS-forlU%(5Z1IQ!(DzHX>^pt>SC%_oYj|&Tts`94@)D1%a zWV|{J>qsPl%JY6wYyEgv+0*n9fpT5)hhqMP?FDrwu(ccT` z)PEKD+W3cY$yN$q+y4`LYNaLo`1ig>|HkxH)jbB@e!0>d@JtGHb~Zx|&F>m-Yo+b^ z^LsEph5AtiwEExnH!FAE9BxM+x8oYmkBzVJ=kNL2Zy1{<^4OPl3h1K<<<(UHq&<*w zR|YV?AOEi1U*Puu@Vm=MPX4L!A0X{No{Nd*Y(#iA5j>w}r7%4L;&X2O62BH89!x1X zs`HKXXU(g@g*$yx=eLNe~ z+r{Ohz6I)B{;34x55PGH-I=JcZ6?|}t2!qM+IM2WT>oeM!rw6VO0dLl`|lrEAjm(N zGA<&>o#W_f58DP~P0miPg8B$z58jqsO^$4Erq$osS^sQz{h7aETj3dHtA&(7 z#D7B9Xa0$2&|e+S3#$aMy8!`_WRRhi=9`|HLX5RncP8S`q(6-P1lNYu0*tY8R|owZ z@K4ZlwRMEcgR%eH5n?O-)M4- z*b4$i$ZBcvPrvWag&z(1R`3m4&Yh<&ohGYzxa0T zLMt2oQ#6NisUSPYM;h}WZ5AxzZg24EC4j{(bN@F_y9sR!L@33zBO$ZVK zxVFkj5Q}bg{N6H3^1%(xZ`A)tf7l1W*C9Z*eH$+T@~y$IhXKgfnS+G=HM)QP9J~i43&a7WZ{i0* zzBTxDFaT)?X^D2t|D5ih-^2Gof_-M?fm6WCYw$~90MZ`L<*TCoaz6n1utEC2_Ra)I zs^Sd57_1^GQ>8JLlqoMT#;8$9j7P-#0*xv0K)el61W_wq6lVb|N2qXk1mu=oz;GiV zpwSXt7P*#XIc0SPTm(fx4iQj1==@*5?YHl}={GZPW_ET~=db$b&Fk04|M&TK|J{Ex zX5?i;$%J|alo_&ILsOoqJS99bA@c&}4a^<$klQ&xn`a(Rnd$Z2RLVUVM&e>TVBLVV zqkKJ(OvpiC4VO0GC|G`(c$avYBZ{U`T`f34aJOI{>NW?^-BK3la9G33L{TSFys)*FDFb#1T7i2fKHs@heYA0-+WcX3( z#qo%wxm)a+rJm+SwM%GDa5pZxBY3B8q<@Hk)n#Ss-kVyfX0q2lo&A37)o*+2ZR))> zYh%&~I=r`bt!jJQZE4>{4b9LF4G_k~ zS@7k4s-7R%bIUi%nmX{wR@tDO2JG6gLvcQi_~3C~SB$4rT&!h5xa` zhWYL>;H)inO%3q>;d}3O%ZfV>UV3r3`JD1I7x-uF`?KZjHfOq#tHH@dMK15AzMdyx z(mCTrrsV?vrAwB?@CJ{M-v4(s|CL!9`EU64J_(x+t&opa|qwx=g|f94g(teNwCyp7L zPSNYIxxzohAb-shTM}hUm#XijuMYxa!ph~#wY`bW5$^O1#^Zg@CH~?2gAEmGX~`mW z=-@#wnfgEX*ezSMNL5x;s1@Qj6Oc>%`{n<<{2MIaT$TTsJ7)sC<-cQl{P`dExy1v< z6xv9lbHLvEA2R>5CbL`a9pi36`fKdsq&pYq45hJO&p2@4%h2KQsmrR@U08oZ&Pok*V+s%Us8zK-|a z7rOrAm4nCwZ+fMRmq?y$a`VX0hOEroV*TnhKL5?nI@_h6wMW~WBVK-NSi3IcYjM;i z?lBF6O_h~aJ52CeA#)IH0g+RGUB_LSMp~y|;f!_CNjK zfiI)=f9x{G-Wm4#vC{$`mMPN_Ih_!+k2v~z=iX-QCK$hj!)6lx(*ec~`qylZf1k-N z;4wFfJ-VOz?GshLrPSs{a&Ye_es^q*V6$S&a=&}$Mq(=f#i!AAtMWg;l zmNjEG_ZC^lWvTOH|5n38kK>dY+^hyS7Av(=M8}}*x=u$c^~q|v!$^4a`iF0mk1t*x ztt|xSKc8-u29*Y&(=c@@Z2p728&l`8fw`;Fp5VK~oV&W=4V#T`|J&|wuV{6#>4QJ) zDeaH2l<3!gWoQ0-U{_6fQI7F|I|``}d!=8D2mfha6X(wGW)~BMpZ``d-&1j*&6qa8 z*b#&%{0GB^y$`*lhW{vb)bjjiUjNB@%?BGc=rztmVpl2%*kEFe`&6c?)a^__E|ouX z`?)h_s+G%@Th}7KmnCudW{lfWkqPdV$`$^(x5>y*=s%ul*G@5yGk{Dx{`MOCYsfCx zV@?-xfq!&Z=(0@TXP(?^YV==A#vO9UYBOec{khylD|RZ=fn4A}8U5!AH&@2+Pd=pE z599*>jCJU;O}U#VYj#HeT{7}O4FAYB$S~oZSIzpEHj$ zb-zyzO7%X$i4Pn4yjy?~ zc23Y8U7`2B8TNpqOHK`MQtV|nt0zqtzpAf&L(!vq+p} zVofz!Kol_XU1<->1tdj+WqgW7kSzS_{1#^LBA;SvL z28})&pS%l>6s#`*t(pgUQfJ_)z5z5tJ9WxeXV|kpYsyshOy@4D=aWw*g}pmnAC;v{WoU|$?G1pu09tF#Lj@YmsP`<;);%x`YExVhdBwYF zyXts3Ki;QH*QDYk?e0Q@Ip;<>1b}{t{>g=Y-MZ^^y8rWW*DcvUQ^!xxVOw9wZm%AHIg=d(+74}+KJ4(Azg$EMyh(G#P|;L*tVVv9#fbr#p1e@gf_+192`cUZ~rQY4_w?r-wW0 z^EB{+pDE+VyEcQ6&l3S-yC@OQ|0Y5@z{JO7&@SSPg9Yt=d%L#NvJze^J3{zg_g4DVes5AKE1S zrmgQW>2EEQ{g`d!Jb~;(7<7(Y5c8;WH>p=A+2<5FlOr?Q5m!5YhMcF=bXhIu>`gL2 zAC=BJ0e$2;*;5pRt)f5edW>IpI`K|tFQHeT%Kkd`TnsqF@3;SNWsxU|qtf2-i?Jh_ zu?s(}7v0|SdfjJpmNN(wB;TR)S;^1RLZ!+kD)qse&b_dMq&y4{FW>Fx^jA%F{45?W zi?Js--`^P=j5YS%jMbTxA2_!K-OyM%E;h}BvgAb@SS6yxx3S`bn$gh-JGEVG*q}=~ z^LNUDF^Kj+dv`(pQjejZe2)sRJm!R*@<8H{>Co@W&)tLavnZ=%IcefuPMt|ih2KZE z=;tgm=lQXV5CqQsurXiToF4)29`^mH+|%wbCsgLM}ch6 zkNghp29al&yO%Fpq53pF?Dj9Tfn{T(P%rXP7V1B1B8GOJ$YRJd$OHqMee0v2zA*}9 zgMQYex;*-rUMs%#f(vxs8yY#^*{`v4u8lU#p4cdm4f>%6I|R&sY-4t? zoovzXtlwT5vwq9?HL8Up6GW{$FqSR)>uCJ)=>XEvUm!2hc5V8L=gxP=P~@4YFuAQ0 z7CAHk=w4QM-OL&YXEV^juy<A~#_V8TxIqlaXP1%h}WE4?A^&dXWgB9hsDVmvJNj z&|ctmJFNA0_xSokZ@-x6zoWm~?u}Ca-zR5|{&l)T2ed@RQ7xt4`YI+`bdQY%eRas_ zPnq{8t3PFJ3EgPCH4gfp;vq^+dq^%!6j>}8q^wE{t+Ye4-cKOU&Vuy~pjmH(kY_`| zk@biHXtnKufG1yF$}ygx4H|v4o82hlE-g#fDcS{XoBpY;0h&!eLt8cE>Sq%v zB<@jyO@u5LKDc#_yn}Y{{Mf`Fe6rVO zU_pWFJfv?wt&4FTLjDjpX;4Ph;MQ}KKC~tR((~%t-|4THy6GD^UYC{V_Gb$6ALLs+$VB>crcKj!kFiyWof%`d z@|+V-QnRN{iV zJKFHG{rkJ@K0jc9cJrRooilB^>es!yE+6BuNcsoTpsw4X!`=7jegyu)khHm{d!L|ucGu9m%oWL=`8~F`nD5%aZGQ>&64=_`eCc+(AM5CROx!ERJ9@ai zTa1g$aR)p0;12DpaWnst9e?moK2V2(W9U-wX^{-q*+n)dBY%l6-rK4~KZCoO+7 zhSEn(@W|gK&pUm~JA)j3De2gdwQBk(kDh?ET|xdenSU6&dq$=UK5g?4Z1G`_#b#^L z)J>kGT|NnJU109R94ONK%MBg)^Of{#^etf+uzgCJdLAmzI-7r*Niehsk{|AzNd9LM zOkJbAPc!Kj%c?;^9jwfdCTX)yAn>NO)ev($A@YomP4v`Pv z|3KRs@3SiV@Ndqauk#8UNYLzs zKzLn$XNA \ No newline at end of file diff --git a/examples/svelte/package.json b/examples/svelte/package.json index 03f324bf..2679983a 100644 --- a/examples/svelte/package.json +++ b/examples/svelte/package.json @@ -1,5 +1,5 @@ { - "name": "svelte", + "name": "svelte-examples", "version": "0.0.1", "private": true, "scripts": { diff --git a/examples/svelte/src/app.html b/examples/svelte/src/app.html index 68f1308a..a9d5b2f0 100644 --- a/examples/svelte/src/app.html +++ b/examples/svelte/src/app.html @@ -1,8 +1,9 @@ - + + + {#each $visibleEdges as edge (edge.id)} + {@const edgeType = edge.type || 'default'} + {@const selectable = !!( + edge.selectable || + ($elementsSelectable && typeof edge.selectable === 'undefined') + )} + +
diff --git a/packages/svelte/src/lib/store/index.ts b/packages/svelte/src/lib/store/index.ts index 625191e0..a16844d2 100644 --- a/packages/svelte/src/lib/store/index.ts +++ b/packages/svelte/src/lib/store/index.ts @@ -24,7 +24,7 @@ import type { EdgeTypes, NodeTypes, Node, Edge, FitViewOptions, ConnectionData } import { initialEdgeTypes, initialNodeTypes, getInitialStore } from './initial-store'; import type { SvelteFlowStore } from './types'; import { syncNodeStores, syncEdgeStores, syncViewportStores } from './utils'; -import { getEdgeTree } from './edge-tree'; +import { getVisibleEdges } from './visible-edges'; import { getVisibleNodes } from './visible-nodes'; import { getDerivedConnectionProps } from './derived-connection-props'; @@ -349,8 +349,8 @@ export function createStore({ ...store, // derived state - edgeTree: getEdgeTree(store), connection: getDerivedConnectionProps(store, currentConnection), + visibleEdges: getVisibleEdges(store), visibleNodes: getVisibleNodes(store), markers: derived( [store.edges, store.defaultMarkerColor, store.flowId], diff --git a/packages/svelte/src/lib/store/initial-store.ts b/packages/svelte/src/lib/store/initial-store.ts index d6b621d9..3821023a 100644 --- a/packages/svelte/src/lib/store/initial-store.ts +++ b/packages/svelte/src/lib/store/initial-store.ts @@ -91,7 +91,7 @@ export const getInitialStore = ({ nodeLookup: readable>(nodeLookup), visibleNodes: readable([]), edges: createEdgesStore(edges), - edgeTree: readable[]>([]), + visibleEdges: readable([]), height: writable(500), width: writable(500), minZoom: writable(0.5), diff --git a/packages/svelte/src/lib/store/edge-tree.ts b/packages/svelte/src/lib/store/visible-edges.ts similarity index 78% rename from packages/svelte/src/lib/store/edge-tree.ts rename to packages/svelte/src/lib/store/visible-edges.ts index cd5448ab..d9903261 100644 --- a/packages/svelte/src/lib/store/edge-tree.ts +++ b/packages/svelte/src/lib/store/visible-edges.ts @@ -1,10 +1,10 @@ import { derived } from 'svelte/store'; -import { groupEdgesByZLevel, isEdgeVisible, getEdgePosition } from '@xyflow/system'; +import { isEdgeVisible, getEdgePosition, adjustEdgeZIndex } from '@xyflow/system'; import type { EdgeLayouted } from '$lib/types'; import type { SvelteFlowStoreState } from './types'; -export function getEdgeTree(store: SvelteFlowStoreState) { +export function getVisibleEdges(store: SvelteFlowStoreState) { const visibleEdges = derived( [ store.edges, @@ -41,8 +41,15 @@ export function getEdgeTree(store: SvelteFlowStoreState) { ); return derived( - [visibleEdges, store.nodes, store.nodeLookup, store.connectionMode, store.onerror], - ([visibleEdges, , nodeLookup, connectionMode, onerror]) => { + [ + visibleEdges, + store.nodes, + store.nodeLookup, + store.connectionMode, + store.onlyRenderVisibleElements, + store.onerror + ], + ([visibleEdges, , nodeLookup, connectionMode, onlyRenderVisibleElements, onerror]) => { const layoutedEdges = visibleEdges.reduce((res, edge) => { const sourceNode = nodeLookup.get(edge.source); const targetNode = nodeLookup.get(edge.target); @@ -63,7 +70,7 @@ export function getEdgeTree(store: SvelteFlowStoreState) { if (edgePosition) { res.push({ - ...edge, + ...adjustEdgeZIndex(edge, nodeLookup, onlyRenderVisibleElements), ...edgePosition }); } @@ -71,9 +78,7 @@ export function getEdgeTree(store: SvelteFlowStoreState) { return res; }, []); - const groupedEdges = groupEdgesByZLevel(layoutedEdges, nodeLookup, false); - - return groupedEdges; + return layoutedEdges; } ); } diff --git a/packages/svelte/src/lib/types/edges.ts b/packages/svelte/src/lib/types/edges.ts index 33f0d908..4ae172e6 100644 --- a/packages/svelte/src/lib/types/edges.ts +++ b/packages/svelte/src/lib/types/edges.ts @@ -70,6 +70,7 @@ export type EdgeLayouted = Pick< | 'ariaLabel' | 'hidden' | 'class' + | 'zIndex' > & EdgePosition & { sourceNode?: Node; diff --git a/packages/system/src/styles/init.css b/packages/system/src/styles/init.css index 9fed0d7b..26530e9b 100644 --- a/packages/system/src/styles/init.css +++ b/packages/system/src/styles/init.css @@ -57,11 +57,6 @@ outline: none; } -.xy-flow .xy-flow__edges { - pointer-events: none; - overflow: visible; -} - .xy-flow__edge-path { stroke: var(--edge-stroke, var(--edge-stroke-default)); stroke-width: var(--edge-stroke-width, var(--edge-stroke-width-default)); diff --git a/packages/system/src/styles/style.css b/packages/system/src/styles/style.css index 99fa8876..2e6a95c8 100644 --- a/packages/system/src/styles/style.css +++ b/packages/system/src/styles/style.css @@ -20,6 +20,12 @@ --controls-box-shadow-default: 0 0 2px 1px rgba(0, 0, 0, 0.08); } +.xy-flow__edgewrapper { + overflow: visible; + position: absolute; + pointer-events: none; +} + .xy-flow__edge { &.updating { .xy-flow__edge-path { diff --git a/packages/system/src/utils/edges/general.ts b/packages/system/src/utils/edges/general.ts index bdffbbd8..ca1dd390 100644 --- a/packages/system/src/utils/edges/general.ts +++ b/packages/system/src/utils/edges/general.ts @@ -23,63 +23,32 @@ export function getEdgeCenter({ return [centerX, centerY, xOffset, yOffset]; } -const defaultEdgeTree = [{ level: 0, isMaxLevel: true, edges: [] }]; - export type GroupedEdges = { edges: EdgeType[]; level: number; isMaxLevel: boolean; }; -export function groupEdgesByZLevel( - edges: EdgeType[], - nodeLookup: Map, - elevateEdgesOnSelect = false -): GroupedEdges[] { - let maxLevel = -1; +export function adjustEdgeZIndex(edge: EdgeBase, nodeLookup: Map, elevateEdgesOnSelect: boolean) { + const hasZIndex = isNumeric(edge.zIndex); + let z = hasZIndex ? edge.zIndex! : 0; - const levelLookup = edges.reduce>((tree, edge) => { - const hasZIndex = isNumeric(edge.zIndex); - let z = hasZIndex ? edge.zIndex! : 0; + if (elevateEdgesOnSelect) { + const targetNode = nodeLookup.get(edge.target)!; + const sourceNode = nodeLookup.get(edge.source)!; + const edgeOrConnectedNodeSelected = edge.selected || targetNode?.selected || sourceNode?.selected; + const selectedZIndex = Math.max(sourceNode?.[internalsSymbol]?.z || 0, targetNode?.[internalsSymbol]?.z || 0, 1000); + z = (hasZIndex ? edge.zIndex! : 0) + (edgeOrConnectedNodeSelected ? selectedZIndex : 0); - if (elevateEdgesOnSelect) { - const targetNode = nodeLookup.get(edge.target); - const sourceNode = nodeLookup.get(edge.source); - const edgeOrConnectedNodeSelected = edge.selected || targetNode?.selected || sourceNode?.selected; - const selectedZIndex = Math.max( - sourceNode?.[internalsSymbol]?.z || 0, - targetNode?.[internalsSymbol]?.z || 0, - 1000 - ); - z = (hasZIndex ? edge.zIndex! : 0) + (edgeOrConnectedNodeSelected ? selectedZIndex : 0); + if (edge.zIndex !== z) { + return { + ...edge, + zIndex: z, + }; } - - if (tree[z]) { - tree[z].push(edge); - } else { - tree[z] = [edge]; - } - - maxLevel = z > maxLevel ? z : maxLevel; - - return tree; - }, {}); - - const edgeTree = Object.entries(levelLookup).map(([key, edges]) => { - const level = +key; - - return { - edges, - level, - isMaxLevel: level === maxLevel, - }; - }); - - if (edgeTree.length === 0) { - return defaultEdgeTree; } - return edgeTree; + return edge; } type IsEdgeVisibleParams = { From 2fe9d57d2a33e4e3b5e9d39ea289415668875d59 Mon Sep 17 00:00:00 2001 From: moklick Date: Thu, 16 Nov 2023 15:45:36 +0100 Subject: [PATCH 056/608] chore(edges): remove group type --- packages/svelte/src/lib/store/initial-store.ts | 1 - packages/system/src/utils/edges/general.ts | 6 ------ 2 files changed, 7 deletions(-) diff --git a/packages/svelte/src/lib/store/initial-store.ts b/packages/svelte/src/lib/store/initial-store.ts index 3821023a..b9f5a524 100644 --- a/packages/svelte/src/lib/store/initial-store.ts +++ b/packages/svelte/src/lib/store/initial-store.ts @@ -10,7 +10,6 @@ import { type PanZoomInstance, type CoordinateExtent, type IsValidConnection, - type GroupedEdges, type NodeOrigin, type OnError, devWarn, diff --git a/packages/system/src/utils/edges/general.ts b/packages/system/src/utils/edges/general.ts index ca1dd390..518f6963 100644 --- a/packages/system/src/utils/edges/general.ts +++ b/packages/system/src/utils/edges/general.ts @@ -23,12 +23,6 @@ export function getEdgeCenter({ return [centerX, centerY, xOffset, yOffset]; } -export type GroupedEdges = { - edges: EdgeType[]; - level: number; - isMaxLevel: boolean; -}; - export function adjustEdgeZIndex(edge: EdgeBase, nodeLookup: Map, elevateEdgesOnSelect: boolean) { const hasZIndex = isNumeric(edge.zIndex); let z = hasZIndex ? edge.zIndex! : 0; From 622c987e46395d8d91a58530b44bd398113db2f1 Mon Sep 17 00:00:00 2001 From: moklick Date: Thu, 16 Nov 2023 15:52:57 +0100 Subject: [PATCH 057/608] refactor(edges): cleanup markup --- packages/react/src/components/Edges/wrapEdge.tsx | 2 +- packages/react/src/container/EdgeRenderer/index.tsx | 2 +- .../svelte/src/lib/components/EdgeWrapper/EdgeWrapper.svelte | 2 +- .../svelte/src/lib/container/EdgeRenderer/EdgeRenderer.svelte | 2 +- packages/system/src/styles/style.css | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/react/src/components/Edges/wrapEdge.tsx b/packages/react/src/components/Edges/wrapEdge.tsx index afdeead5..7d3f92e6 100644 --- a/packages/react/src/components/Edges/wrapEdge.tsx +++ b/packages/react/src/components/Edges/wrapEdge.tsx @@ -202,7 +202,7 @@ export default (EdgeComponent: ComponentType) => { }; return ( - + - + diff --git a/packages/svelte/src/lib/components/EdgeWrapper/EdgeWrapper.svelte b/packages/svelte/src/lib/components/EdgeWrapper/EdgeWrapper.svelte index 763c6efb..fb90ca8b 100644 --- a/packages/svelte/src/lib/components/EdgeWrapper/EdgeWrapper.svelte +++ b/packages/svelte/src/lib/components/EdgeWrapper/EdgeWrapper.svelte @@ -96,7 +96,7 @@ {#if !hidden} - +
- + diff --git a/packages/system/src/styles/style.css b/packages/system/src/styles/style.css index 2e6a95c8..1ba81595 100644 --- a/packages/system/src/styles/style.css +++ b/packages/system/src/styles/style.css @@ -20,7 +20,7 @@ --controls-box-shadow-default: 0 0 2px 1px rgba(0, 0, 0, 0.08); } -.xy-flow__edgewrapper { +.xy-flow__edges svg { overflow: visible; position: absolute; pointer-events: none; From b8affc1c82b2617fca41a0625f1c49bb74194b6a Mon Sep 17 00:00:00 2001 From: peterkogo <7165378+peterkogo@users.noreply.github.com> Date: Mon, 20 Nov 2023 18:40:43 +0100 Subject: [PATCH 058/608] Svelte NodeToolbar with E2E (#3643) * Added NodeToolbar * Added comments & fixed default behaviour in svelte * Added e2e-tests for NodeToolbar component & added data-id to react NodeToolbar * refactor(svelte/NodeToolbar): cleanup * refactor(node-toolbar): add system utils --------- Co-authored-by: moklick --- .../node-toolbar/components/ToolbarNode.tsx | 19 ++++ .../src/generic-tests/node-toolbar/general.ts | 50 ++++++++++ .../src/components/Header/Header.svelte | 1 + .../components/ToolbarNode.svelte | 30 ++++++ .../src/generic-tests/node-toolbar/general.ts | 50 ++++++++++ .../routes/examples/node-toolbar/+page.svelte | 63 +++++++++++++ .../examples/node-toolbar/CustomNode.svelte | 31 ++++++ .../node-toolbar/SelectedNodesToolbar.svelte | 12 +++ .../NodeToolbar/NodeToolbar.tsx | 65 ++++--------- .../NodeToolbar/types.ts | 4 +- .../svelte/src/lib/actions/portal/index.ts | 20 +++- .../EdgeLabelRenderer.svelte | 5 +- packages/svelte/src/lib/index.ts | 1 + .../plugins/NodeToolbar/NodeToolbar.svelte | 94 +++++++++++++++++++ .../src/lib/plugins/NodeToolbar/index.ts | 2 + .../src/lib/plugins/NodeToolbar/types.ts | 9 ++ packages/system/src/types/nodes.ts | 2 + packages/system/src/utils/index.ts | 1 + packages/system/src/utils/node-toolbar.ts | 49 ++++++++++ tests/playwright/e2e/node-toolbar.spec.ts | 93 ++++++++++++++++++ tests/playwright/e2e/pane.spec.ts | 18 +--- tests/playwright/e2e/utils.ts | 16 ++++ 22 files changed, 564 insertions(+), 71 deletions(-) create mode 100644 examples/react/src/generic-tests/node-toolbar/components/ToolbarNode.tsx create mode 100644 examples/react/src/generic-tests/node-toolbar/general.ts create mode 100644 examples/svelte/src/generic-tests/node-toolbar/components/ToolbarNode.svelte create mode 100644 examples/svelte/src/generic-tests/node-toolbar/general.ts create mode 100644 examples/svelte/src/routes/examples/node-toolbar/+page.svelte create mode 100644 examples/svelte/src/routes/examples/node-toolbar/CustomNode.svelte create mode 100644 examples/svelte/src/routes/examples/node-toolbar/SelectedNodesToolbar.svelte create mode 100644 packages/svelte/src/lib/plugins/NodeToolbar/NodeToolbar.svelte create mode 100644 packages/svelte/src/lib/plugins/NodeToolbar/index.ts create mode 100644 packages/svelte/src/lib/plugins/NodeToolbar/types.ts create mode 100644 packages/system/src/utils/node-toolbar.ts create mode 100644 tests/playwright/e2e/node-toolbar.spec.ts create mode 100644 tests/playwright/e2e/utils.ts diff --git a/examples/react/src/generic-tests/node-toolbar/components/ToolbarNode.tsx b/examples/react/src/generic-tests/node-toolbar/components/ToolbarNode.tsx new file mode 100644 index 00000000..30384445 --- /dev/null +++ b/examples/react/src/generic-tests/node-toolbar/components/ToolbarNode.tsx @@ -0,0 +1,19 @@ +import { memo, FC } from 'react'; +import { Handle, Position, NodeProps, NodeToolbar } from '@xyflow/react'; + +const CustomNode: FC = ({ id, data }) => { + return ( + <> + + + + + +
{data.label}
+ + + + ); +}; + +export default memo(CustomNode); diff --git a/examples/react/src/generic-tests/node-toolbar/general.ts b/examples/react/src/generic-tests/node-toolbar/general.ts new file mode 100644 index 00000000..d7df3fa9 --- /dev/null +++ b/examples/react/src/generic-tests/node-toolbar/general.ts @@ -0,0 +1,50 @@ +import { Position, type Node } from '@xyflow/react'; +import ToolbarNode from './components/ToolbarNode'; + +const positions = ['top', 'right', 'bottom', 'left']; +const alignments = ['start', 'center', 'end']; + +const nodes: Node[] = [ + { + id: 'default-node', + type: 'ToolbarNode', + data: { label: 'toolbar top', toolbarPosition: Position.Top }, + position: { x: 0, y: -200 }, + className: 'react-flow__node-default', + }, +]; + +positions.forEach((position, posIndex) => { + alignments.forEach((align, alignIndex) => { + const id = `node-${align}-${position}`; + nodes.push({ + id, + type: 'ToolbarNode', + data: { + label: `toolbar ${position} ${align}`, + toolbarPosition: position as Position, + toolbarAlign: align, + toolbarVisible: true, + }, + className: 'react-flow__node-default', + position: { x: posIndex * 300, y: alignIndex * 100 }, + }); + }); +}); + +export default { + flowProps: { + fitView: true, + nodeTypes: { + ToolbarNode, + }, + nodes, + edges: [ + { + id: 'first-edge', + source: 'default-node', + target: 'node-start-top', + }, + ], + }, +} satisfies FlowConfig; diff --git a/examples/svelte/src/components/Header/Header.svelte b/examples/svelte/src/components/Header/Header.svelte index 0bd941b7..fde20817 100644 --- a/examples/svelte/src/components/Header/Header.svelte +++ b/examples/svelte/src/components/Header/Header.svelte @@ -12,6 +12,7 @@ 'figma', 'interaction', 'intersections', + 'node-toolbar', 'overview', 'stress', 'subflows', diff --git a/examples/svelte/src/generic-tests/node-toolbar/components/ToolbarNode.svelte b/examples/svelte/src/generic-tests/node-toolbar/components/ToolbarNode.svelte new file mode 100644 index 00000000..0a998217 --- /dev/null +++ b/examples/svelte/src/generic-tests/node-toolbar/components/ToolbarNode.svelte @@ -0,0 +1,30 @@ + + + + + + + +
+
{data.label}
+ + +
+ + diff --git a/examples/svelte/src/generic-tests/node-toolbar/general.ts b/examples/svelte/src/generic-tests/node-toolbar/general.ts new file mode 100644 index 00000000..6fce800f --- /dev/null +++ b/examples/svelte/src/generic-tests/node-toolbar/general.ts @@ -0,0 +1,50 @@ +import { Position, type Node } from '@xyflow/svelte'; +import ToolbarNode from './components/ToolbarNode.svelte'; + +const positions = ['top', 'right', 'bottom', 'left']; +const alignments = ['start', 'center', 'end']; + +const nodes: Node[] = [ + { + id: 'default-node', + type: 'ToolbarNode', + data: { label: 'toolbar top', toolbarPosition: Position.Top }, + position: { x: 0, y: -200 }, + class: 'react-flow__node-default' + } +]; + +positions.forEach((position, posIndex) => { + alignments.forEach((align, alignIndex) => { + const id = `node-${align}-${position}`; + nodes.push({ + id, + type: 'ToolbarNode', + data: { + label: `toolbar ${position} ${align}`, + toolbarPosition: position as Position, + toolbarAlign: align, + toolbarVisible: true + }, + class: 'react-flow__node-default', + position: { x: posIndex * 300, y: alignIndex * 100 } + }); + }); +}); + +export default { + flowProps: { + fitView: true, + nodeTypes: { + ToolbarNode + }, + nodes, + edges: [ + { + id: 'first-edge', + source: 'default-node', + target: 'node-start-top' + } + ] + } +} satisfies FlowConfig; diff --git a/examples/svelte/src/routes/examples/node-toolbar/+page.svelte b/examples/svelte/src/routes/examples/node-toolbar/+page.svelte new file mode 100644 index 00000000..1a4360e5 --- /dev/null +++ b/examples/svelte/src/routes/examples/node-toolbar/+page.svelte @@ -0,0 +1,63 @@ + + +
+ + + + +
diff --git a/examples/svelte/src/routes/examples/node-toolbar/CustomNode.svelte b/examples/svelte/src/routes/examples/node-toolbar/CustomNode.svelte new file mode 100644 index 00000000..af2dabaa --- /dev/null +++ b/examples/svelte/src/routes/examples/node-toolbar/CustomNode.svelte @@ -0,0 +1,31 @@ + + + + + + + +
+
{data.label}
+ + +
+ + diff --git a/examples/svelte/src/routes/examples/node-toolbar/SelectedNodesToolbar.svelte b/examples/svelte/src/routes/examples/node-toolbar/SelectedNodesToolbar.svelte new file mode 100644 index 00000000..df62b856 --- /dev/null +++ b/examples/svelte/src/routes/examples/node-toolbar/SelectedNodesToolbar.svelte @@ -0,0 +1,12 @@ + + + + + diff --git a/packages/react/src/additional-components/NodeToolbar/NodeToolbar.tsx b/packages/react/src/additional-components/NodeToolbar/NodeToolbar.tsx index ad581bcf..c880edb7 100644 --- a/packages/react/src/additional-components/NodeToolbar/NodeToolbar.tsx +++ b/packages/react/src/additional-components/NodeToolbar/NodeToolbar.tsx @@ -1,13 +1,13 @@ import { useCallback, CSSProperties } from 'react'; import cc from 'classcat'; import { shallow } from 'zustand/shallow'; -import { getNodesBounds, Transform, Rect, Position, internalsSymbol } from '@xyflow/system'; +import { getNodesBounds, Rect, Position, internalsSymbol, getNodeToolbarTransform } from '@xyflow/system'; import { Node, ReactFlowState } from '../../types'; import { useStore } from '../../hooks/useStore'; import { useNodeId } from '../../contexts/NodeIdContext'; import NodeToolbarPortal from './NodeToolbarPortal'; -import { Align, NodeToolbarProps } from './types'; +import { NodeToolbarProps } from './types'; const nodeEqualityFn = (a: Node | undefined, b: Node | undefined) => a?.positionAbsolute?.x === b?.positionAbsolute?.x && @@ -22,53 +22,15 @@ const nodesEqualityFn = (a: Node[], b: Node[]) => { }; const storeSelector = (state: ReactFlowState) => ({ - transform: state.transform, + viewport: { + x: state.transform[0], + y: state.transform[1], + zoom: state.transform[2], + }, nodeOrigin: state.nodeOrigin, selectedNodesCount: state.nodes.filter((node) => node.selected).length, }); -function getTransform(nodeRect: Rect, transform: Transform, position: Position, offset: number, align: Align): string { - let alignmentOffset = 0.5; - - if (align === 'start') { - alignmentOffset = 0; - } else if (align === 'end') { - alignmentOffset = 1; - } - - // position === Position.Top - // we set the x any y position of the toolbar based on the nodes position - let pos = [ - (nodeRect.x + nodeRect.width * alignmentOffset) * transform[2] + transform[0], - nodeRect.y * transform[2] + transform[1] - offset, - ]; - // and than shift it based on the alignment. The shift values are in %. - let shift = [-100 * alignmentOffset, -100]; - - switch (position) { - case Position.Right: - pos = [ - (nodeRect.x + nodeRect.width) * transform[2] + transform[0] + offset, - (nodeRect.y + nodeRect.height * alignmentOffset) * transform[2] + transform[1], - ]; - shift = [0, -100 * alignmentOffset]; - break; - case Position.Bottom: - pos[1] = (nodeRect.y + nodeRect.height) * transform[2] + transform[1] + offset; - shift[1] = 0; - break; - case Position.Left: - pos = [ - nodeRect.x * transform[2] + transform[0] - offset, - (nodeRect.y + nodeRect.height * alignmentOffset) * transform[2] + transform[1], - ]; - shift = [-100, -100 * alignmentOffset]; - break; - } - - return `translate(${pos[0]}px, ${pos[1]}px) translate(${shift[0]}%, ${shift[1]}%)`; -} - function NodeToolbar({ nodeId, children, @@ -97,7 +59,9 @@ function NodeToolbar({ [nodeId, contextNodeId] ); const nodes = useStore(nodesSelector, nodesEqualityFn); - const { transform, nodeOrigin, selectedNodesCount } = useStore(storeSelector, shallow); + const { viewport, nodeOrigin, selectedNodesCount } = useStore(storeSelector, shallow); + + // if isVisible is not set, we show the toolbar only if its node is selected and no other node is selected const isActive = typeof isVisible === 'boolean' ? isVisible : nodes.length === 1 && nodes[0].selected && selectedNodesCount === 1; @@ -110,14 +74,19 @@ function NodeToolbar({ const wrapperStyle: CSSProperties = { position: 'absolute', - transform: getTransform(nodeRect, transform, position, offset, align), + transform: getNodeToolbarTransform(nodeRect, viewport, position, offset, align), zIndex, ...style, }; return ( -
+
`${acc}${node.id} `, '').trim()} + > {children}
diff --git a/packages/react/src/additional-components/NodeToolbar/types.ts b/packages/react/src/additional-components/NodeToolbar/types.ts index 29478576..f08859dc 100644 --- a/packages/react/src/additional-components/NodeToolbar/types.ts +++ b/packages/react/src/additional-components/NodeToolbar/types.ts @@ -1,5 +1,5 @@ import type { HTMLAttributes } from 'react'; -import type { Position } from '@xyflow/system'; +import type { Position, Align } from '@xyflow/system'; export type NodeToolbarProps = HTMLAttributes & { nodeId?: string | string[]; @@ -8,5 +8,3 @@ export type NodeToolbarProps = HTMLAttributes & { offset?: number; align?: Align; }; - -export type Align = 'center' | 'start' | 'end'; diff --git a/packages/svelte/src/lib/actions/portal/index.ts b/packages/svelte/src/lib/actions/portal/index.ts index 714e8b3e..fba6562c 100644 --- a/packages/svelte/src/lib/actions/portal/index.ts +++ b/packages/svelte/src/lib/actions/portal/index.ts @@ -1,11 +1,27 @@ -export default function (node: Element, target = 'body') { - const targetEl = document.querySelector(target); +type PortalOptions = { + target?: string; + domNode: Element | null; +}; + +function tryToMount(node: Element, domNode: Element | null, target: string | undefined) { + if (!domNode) { + return; + } + + const targetEl = target ? domNode.querySelector(target) : domNode; if (targetEl) { targetEl.appendChild(node); } +} + +export default function (node: Element, { target, domNode }: PortalOptions) { + tryToMount(node, domNode, target); return { + async update({ target, domNode }: PortalOptions) { + tryToMount(node, domNode, target); + }, destroy() { if (node.parentNode) { node.parentNode.removeChild(node); diff --git a/packages/svelte/src/lib/components/EdgeLabelRenderer/EdgeLabelRenderer.svelte b/packages/svelte/src/lib/components/EdgeLabelRenderer/EdgeLabelRenderer.svelte index d681d388..f3cfeca9 100644 --- a/packages/svelte/src/lib/components/EdgeLabelRenderer/EdgeLabelRenderer.svelte +++ b/packages/svelte/src/lib/components/EdgeLabelRenderer/EdgeLabelRenderer.svelte @@ -1,9 +1,12 @@ -
+
diff --git a/packages/svelte/src/lib/index.ts b/packages/svelte/src/lib/index.ts index b8620d79..88bc483f 100644 --- a/packages/svelte/src/lib/index.ts +++ b/packages/svelte/src/lib/index.ts @@ -14,6 +14,7 @@ export * from '$lib/components/Handle'; export * from '$lib/plugins/Controls'; export * from '$lib/plugins/Background'; export * from '$lib/plugins/Minimap'; +export * from '$lib/plugins/NodeToolbar'; // store export { useStore } from '$lib/store'; diff --git a/packages/svelte/src/lib/plugins/NodeToolbar/NodeToolbar.svelte b/packages/svelte/src/lib/plugins/NodeToolbar/NodeToolbar.svelte new file mode 100644 index 00000000..b01bbb48 --- /dev/null +++ b/packages/svelte/src/lib/plugins/NodeToolbar/NodeToolbar.svelte @@ -0,0 +1,94 @@ + + +{#if $domNode && isActive && toolbarNodes} +
`${acc}${node.id} `, '').trim()} + class="svelte-flow__node-toolbar" + use:portal={{ domNode: $domNode }} + style:position="absolute" + style:transform + style:z-index={zIndex} + > + +
+{/if} diff --git a/packages/svelte/src/lib/plugins/NodeToolbar/index.ts b/packages/svelte/src/lib/plugins/NodeToolbar/index.ts new file mode 100644 index 00000000..7c38ab3d --- /dev/null +++ b/packages/svelte/src/lib/plugins/NodeToolbar/index.ts @@ -0,0 +1,2 @@ +export { default as NodeToolbar } from './NodeToolbar.svelte'; +export * from './types'; diff --git a/packages/svelte/src/lib/plugins/NodeToolbar/types.ts b/packages/svelte/src/lib/plugins/NodeToolbar/types.ts new file mode 100644 index 00000000..6c812de2 --- /dev/null +++ b/packages/svelte/src/lib/plugins/NodeToolbar/types.ts @@ -0,0 +1,9 @@ +import type { Position, Align } from '@xyflow/system'; + +export type NodeToolbarProps = { + nodeId?: string | string[]; + position?: Position; + align?: Align; + offset?: number; + isVisible?: boolean; +}; diff --git a/packages/system/src/types/nodes.ts b/packages/system/src/types/nodes.ts index 22b4e6ab..cea41c65 100644 --- a/packages/system/src/types/nodes.ts +++ b/packages/system/src/types/nodes.ts @@ -97,3 +97,5 @@ export type OnNodeDrag = (event: MouseEvent, node: NodeBase, nodes: NodeBase[]) export type OnSelectionDrag = (event: MouseEvent, nodes: NodeBase[]) => void; export type NodeHandle = Optional; + +export type Align = 'center' | 'start' | 'end'; diff --git a/packages/system/src/utils/index.ts b/packages/system/src/utils/index.ts index 30a7e961..380b7658 100644 --- a/packages/system/src/utils/index.ts +++ b/packages/system/src/utils/index.ts @@ -3,4 +3,5 @@ export * from './edges'; export * from './graph'; export * from './general'; export * from './marker'; +export * from './node-toolbar'; export * from './store'; diff --git a/packages/system/src/utils/node-toolbar.ts b/packages/system/src/utils/node-toolbar.ts new file mode 100644 index 00000000..1813513c --- /dev/null +++ b/packages/system/src/utils/node-toolbar.ts @@ -0,0 +1,49 @@ +import { Position, type Rect, type Viewport, type Align } from '../'; + +export function getNodeToolbarTransform( + nodeRect: Rect, + viewport: Viewport, + position: Position, + offset: number, + align: Align +): string { + let alignmentOffset = 0.5; + + if (align === 'start') { + alignmentOffset = 0; + } else if (align === 'end') { + alignmentOffset = 1; + } + + // position === Position.Top + // we set the x any y position of the toolbar based on the nodes position + let pos = [ + (nodeRect.x + nodeRect.width * alignmentOffset) * viewport.zoom + viewport.x, + nodeRect.y * viewport.zoom + viewport.y - offset, + ]; + // and than shift it based on the alignment. The shift values are in %. + let shift = [-100 * alignmentOffset, -100]; + + switch (position) { + case Position.Right: + pos = [ + (nodeRect.x + nodeRect.width) * viewport.zoom + viewport.x + offset, + (nodeRect.y + nodeRect.height * alignmentOffset) * viewport.zoom + viewport.y, + ]; + shift = [0, -100 * alignmentOffset]; + break; + case Position.Bottom: + pos[1] = (nodeRect.y + nodeRect.height) * viewport.zoom + viewport.y + offset; + shift[1] = 0; + break; + case Position.Left: + pos = [ + nodeRect.x * viewport.zoom + viewport.x - offset, + (nodeRect.y + nodeRect.height * alignmentOffset) * viewport.zoom + viewport.y, + ]; + shift = [-100, -100 * alignmentOffset]; + break; + } + + return `translate(${pos[0]}px, ${pos[1]}px) translate(${shift[0]}%, ${shift[1]}%)`; +} diff --git a/tests/playwright/e2e/node-toolbar.spec.ts b/tests/playwright/e2e/node-toolbar.spec.ts new file mode 100644 index 00000000..daf76070 --- /dev/null +++ b/tests/playwright/e2e/node-toolbar.spec.ts @@ -0,0 +1,93 @@ +import { test, expect, Locator } from '@playwright/test'; +import { FRAMEWORK } from './constants'; + +type Position = 'top' | 'right' | 'bottom' | 'left'; +const positions: Position[] = ['top', 'right', 'bottom', 'left']; + +type Alignment = 'start' | 'center' | 'end'; +const alignments: Alignment[] = ['start', 'center', 'end']; +type Permutation = { + id: string; + position: Position; + align: Alignment; +}; +const permutations: Permutation[] = []; + +positions.forEach((position) => { + alignments.forEach((align) => { + permutations.push({ + id: `node-${align}-${position}`, + position, + align, + }); + }); +}); + +test.describe('Node Toolbar', async () => { + test.beforeEach(async ({ page }) => { + // Go to the starting url before each test. + await page.goto('/tests/generic/node-toolbar/general'); + // Wait till the edges are rendered + await page.waitForSelector('[data-id="first-edge"]', { timeout: 5000 }); + }); + + test('all toolbars are positioned correctly', async ({ page }) => { + permutations.forEach(async (permutation) => { + const toolbar = page + .locator(`[data-id="${permutation.id}"]`) + .and(page.locator(`.${FRAMEWORK}-flow__node-toolbar`)); + const node = page.locator(`[data-id="${permutation.id}"]`).and(page.locator(`.${FRAMEWORK}-flow__node`)); + + await expect(toolbar).toBeAttached(); + await expect(node).toBeAttached(); + + const toolbarBox = await toolbar.boundingBox(); + const nodeBox = await node.boundingBox(); + + switch (permutation.position) { + case 'top': + expect(toolbarBox!.y).toBeLessThan(nodeBox!.y); + break; + case 'right': + expect(toolbarBox!.x).toBeGreaterThan(nodeBox!.x); + break; + case 'bottom': + expect(toolbarBox!.y).toBeGreaterThan(nodeBox!.y); + break; + case 'left': + expect(toolbarBox!.x).toBeLessThan(nodeBox!.x); + break; + } + + const dimension = permutation.position === 'top' || permutation.position === 'bottom' ? 'x' : 'y'; + const extent = permutation.position === 'top' || permutation.position === 'bottom' ? 'width' : 'height'; + + switch (permutation.align) { + case 'start': + expect(Math.floor(toolbarBox![dimension])).toBe(Math.floor(nodeBox![dimension])); + break; + case 'center': + expect(Math.floor(toolbarBox![dimension] + toolbarBox![extent] * 0.5)).toBe( + Math.floor(nodeBox![dimension] + nodeBox![extent] * 0.5) + ); + break; + case 'end': + expect(Math.floor(toolbarBox![dimension] + toolbarBox![extent])).toBe( + Math.floor(nodeBox![dimension] + nodeBox![extent]) + ); + break; + } + }); + }); + + test('toolbar default behaviour', async ({ page }) => { + const node = page.locator('[data-id="default-node"]').and(page.locator(`.${FRAMEWORK}-flow__node`)); + const toolbar = page.locator('[data-id="default-node"]').and(page.locator(`.${FRAMEWORK}-flow__node-toolbar`)); + + await expect(node).toBeAttached(); + await expect(toolbar).not.toBeAttached(); + + await node.click(); + await expect(toolbar).toBeAttached(); + }); +}); diff --git a/tests/playwright/e2e/pane.spec.ts b/tests/playwright/e2e/pane.spec.ts index 31777c97..15a79655 100644 --- a/tests/playwright/e2e/pane.spec.ts +++ b/tests/playwright/e2e/pane.spec.ts @@ -1,23 +1,7 @@ import { test, expect } from '@playwright/test'; import { FRAMEWORK } from './constants'; - -const MATCH_ALL_NUMBERS = /[\d\.]+/g; - -// Type "Locator" not exported... -async function getTransform(element) { - const transformString = await element.evaluate((el) => { - return el.style.transform; - }); - - // Parses all numbers in f.ex "translate(590px, 324px) scale(2)"" - const transforms = transformString.match(MATCH_ALL_NUMBERS); - return { - translateX: parseFloat(transforms![0]), - translateY: parseFloat(transforms![1]), - scale: parseFloat(transforms![2]), - }; -} +import { getTransform } from './utils'; test.describe('PANE DEFAULT', () => { test.beforeEach(async ({ page }) => { diff --git a/tests/playwright/e2e/utils.ts b/tests/playwright/e2e/utils.ts new file mode 100644 index 00000000..76643dd7 --- /dev/null +++ b/tests/playwright/e2e/utils.ts @@ -0,0 +1,16 @@ +const MATCH_ALL_NUMBERS = /[\d\.]+/g; + +// Type "Locator" not exported... +export async function getTransform(element) { + const transformString = await element.evaluate((el) => { + return el.style.transform; + }); + + // Parses all numbers in f.ex "translate(590px, 324px) scale(2)"" + const transforms = transformString.match(MATCH_ALL_NUMBERS); + return { + translateX: parseFloat(transforms![0]), + translateY: parseFloat(transforms![1]), + scale: parseFloat(transforms![2]), + }; +} From 8a5dd652b3b6eb88bb759d3b81e991216af0a6a3 Mon Sep 17 00:00:00 2001 From: moklick Date: Tue, 21 Nov 2023 12:59:12 +0100 Subject: [PATCH 059/608] refactor(svelte): node wrapper position types --- .../lib/components/NodeWrapper/NodeWrapper.svelte | 12 +++++++----- .../svelte/src/lib/components/NodeWrapper/types.ts | 7 ++++--- .../lib/container/NodeRenderer/NodeRenderer.svelte | 6 ++++-- 3 files changed, 15 insertions(+), 10 deletions(-) diff --git a/packages/svelte/src/lib/components/NodeWrapper/NodeWrapper.svelte b/packages/svelte/src/lib/components/NodeWrapper/NodeWrapper.svelte index 29631836..33a954b3 100644 --- a/packages/svelte/src/lib/components/NodeWrapper/NodeWrapper.svelte +++ b/packages/svelte/src/lib/components/NodeWrapper/NodeWrapper.svelte @@ -27,8 +27,10 @@ export let style: NodeWrapperProps['style'] = undefined; export let type: NodeWrapperProps['type'] = 'default'; export let isParent: NodeWrapperProps['isParent'] = false; - export let positionAbsolute: NodeWrapperProps['positionAbsolute'] = undefined; - export let positionOrigin: NodeWrapperProps['positionOrigin'] = undefined; + export let positionX: NodeWrapperProps['positionX']; + export let positionY: NodeWrapperProps['positionY']; + export let positionOriginX: NodeWrapperProps['positionOriginX']; + export let positionOriginY: NodeWrapperProps['positionOriginY']; export let sourcePosition: NodeWrapperProps['sourcePosition'] = undefined; export let targetPosition: NodeWrapperProps['targetPosition'] = undefined; export let zIndex: NodeWrapperProps['zIndex']; @@ -164,7 +166,7 @@ class:nopan={draggable} class:parent={isParent} style:z-index={zIndex} - style:transform="translate({positionOrigin?.x ?? 0}px, {positionOrigin?.y ?? 0}px)" + style:transform="translate({positionOriginX}px, {positionOriginY}px)" style:visibility={initialized ? 'visible' : 'hidden'} style="{style} {node.size?.width ? `;width=${node.size?.width}px` : ''} {node.size?.height ? `;height=${node.size?.height}px;` @@ -187,8 +189,8 @@ {dragging} {dragHandle} isConnectable={connectable} - xPos={positionAbsolute?.x ?? 0} - yPos={positionAbsolute?.y ?? 0} + xPos={positionX} + yPos={positionY} on:connectstart on:connect on:connectend diff --git a/packages/svelte/src/lib/components/NodeWrapper/types.ts b/packages/svelte/src/lib/components/NodeWrapper/types.ts index f4f5c310..e833ef54 100644 --- a/packages/svelte/src/lib/components/NodeWrapper/types.ts +++ b/packages/svelte/src/lib/components/NodeWrapper/types.ts @@ -1,4 +1,3 @@ -import type { XYPosition } from '@xyflow/system'; import type { Node } from '$lib/types'; export type NodeWrapperProps = Pick< @@ -9,7 +8,6 @@ export type NodeWrapperProps = Pick< | 'data' | 'draggable' | 'dragging' - | 'positionAbsolute' | 'selected' | 'selectable' | 'style' @@ -21,7 +19,10 @@ export type NodeWrapperProps = Pick< | 'dragHandle' | 'hidden' > & { - positionOrigin?: XYPosition; + positionX: number; + positionY: number; + positionOriginX: number; + positionOriginY: number; 'on:nodeclick'?: (event: MouseEvent) => void; resizeObserver?: ResizeObserver | null; isParent?: boolean; diff --git a/packages/svelte/src/lib/container/NodeRenderer/NodeRenderer.svelte b/packages/svelte/src/lib/container/NodeRenderer/NodeRenderer.svelte index 6a7acd90..e856b70b 100644 --- a/packages/svelte/src/lib/container/NodeRenderer/NodeRenderer.svelte +++ b/packages/svelte/src/lib/container/NodeRenderer/NodeRenderer.svelte @@ -61,8 +61,10 @@ node.connectable || ($nodesConnectable && typeof node.connectable === 'undefined') )} - positionAbsolute={node.positionAbsolute} - positionOrigin={posOrigin} + positionX={node.positionAbsolute?.x ?? 0} + positionY={node.positionAbsolute?.y ?? 0} + positionOriginX={posOrigin.x ?? 0} + positionOriginY={posOrigin.y ?? 0} isParent={!!node[internalsSymbol]?.isParent} style={node.style} class={node.class} From d812dbbe53336f9d794ed7005f59896d42dc12e4 Mon Sep 17 00:00:00 2001 From: moklick Date: Tue, 21 Nov 2023 15:06:42 +0100 Subject: [PATCH 060/608] refactor(nodes): add computed attr for width/height and absolute position --- .../react/src/examples/EasyConnect/utils.tsx | 15 +++----- .../react/src/examples/FloatingEdges/utils.ts | 4 +- .../MiniMap/MiniMapNodes.tsx | 9 +++-- .../NodeToolbar/NodeToolbar.tsx | 4 +- .../src/components/ConnectionLine/index.tsx | 8 ++-- .../react/src/components/Nodes/wrapNode.tsx | 8 ++-- .../src/container/NodeRenderer/index.tsx | 14 +++---- packages/react/src/hooks/useReactFlow.ts | 2 +- .../react/src/hooks/useUpdateNodePositions.ts | 12 ++++-- packages/react/src/store/index.ts | 7 +++- packages/react/src/store/initialState.ts | 6 +-- packages/react/src/types/nodes.ts | 4 +- packages/react/src/utils/changes.ts | 27 ++++++++----- .../components/NodeWrapper/NodeWrapper.svelte | 6 +-- .../src/lib/components/NodeWrapper/types.ts | 3 +- .../NodeRenderer/NodeRenderer.svelte | 19 ++++++---- .../svelte/src/lib/hooks/useSvelteFlow.ts | 2 +- .../src/lib/hooks/useUpdateNodeInternals.ts | 2 +- .../src/lib/plugins/Minimap/Minimap.svelte | 6 +-- .../src/lib/store/derived-connection-props.ts | 10 +++-- packages/svelte/src/lib/store/index.ts | 17 +++++---- packages/system/src/types/nodes.ts | 12 +++--- packages/system/src/utils/dom.ts | 2 + packages/system/src/utils/edges/positions.ts | 12 +++--- packages/system/src/utils/general.ts | 8 ++-- packages/system/src/utils/graph.ts | 38 ++++++++++--------- packages/system/src/utils/store.ts | 17 ++++++--- packages/system/src/xydrag/XYDrag.ts | 12 +++--- packages/system/src/xydrag/utils.ts | 21 ++++++---- packages/system/src/xyhandle/utils.ts | 4 +- 30 files changed, 177 insertions(+), 134 deletions(-) diff --git a/examples/react/src/examples/EasyConnect/utils.tsx b/examples/react/src/examples/EasyConnect/utils.tsx index cef818f5..d7f3e689 100644 --- a/examples/react/src/examples/EasyConnect/utils.tsx +++ b/examples/react/src/examples/EasyConnect/utils.tsx @@ -4,12 +4,9 @@ import { Node, Position, MarkerType, XYPosition } from '@xyflow/react'; // of the line between the center of the intersectionNode and the target node function getNodeIntersection(intersectionNode: Node, targetNode: Node) { // https://math.stackexchange.com/questions/1724792/an-algorithm-for-finding-the-intersection-point-between-a-center-of-vision-and-a - const { - width: intersectionNodeWidth, - height: intersectionNodeHeight, - positionAbsolute: intersectionNodePosition, - } = intersectionNode; - const targetPosition = targetNode.positionAbsolute!; + const { width: intersectionNodeWidth, height: intersectionNodeHeight } = intersectionNode; + const intersectionNodePosition = intersectionNode.computed?.positionAbsolute!; + const targetPosition = targetNode.computed?.positionAbsolute!; const w = intersectionNodeWidth! / 2; const h = intersectionNodeHeight! / 2; @@ -32,7 +29,7 @@ function getNodeIntersection(intersectionNode: Node, targetNode: Node) { // returns the position (top,right,bottom or right) passed node compared to the intersection point function getEdgePosition(node: Node, intersectionPoint: XYPosition) { - const n = { ...node.positionAbsolute, ...node }; + const n = { ...node.computed?.positionAbsolute, ...node }; const nx = Math.round(n.x!); const ny = Math.round(n.y!); const px = Math.round(intersectionPoint.x); @@ -41,13 +38,13 @@ function getEdgePosition(node: Node, intersectionPoint: XYPosition) { if (px <= nx + 1) { return Position.Left; } - if (px >= nx + n.width! - 1) { + if (px >= nx + n.computed?.width! - 1) { return Position.Right; } if (py <= ny + 1) { return Position.Top; } - if (py >= n.y! + n.height! - 1) { + if (py >= n.y! + n.computed?.height! - 1) { return Position.Bottom; } diff --git a/examples/react/src/examples/FloatingEdges/utils.ts b/examples/react/src/examples/FloatingEdges/utils.ts index 543b0945..0a2d6c03 100644 --- a/examples/react/src/examples/FloatingEdges/utils.ts +++ b/examples/react/src/examples/FloatingEdges/utils.ts @@ -42,13 +42,13 @@ function getEdgePosition(node: Node, intersectionPoint: XYPosition) { if (px <= nx + 1) { return Position.Left; } - if (px >= nx + (n.width ?? 0) - 1) { + if (px >= nx + (n.computed?.width ?? 0) - 1) { return Position.Right; } if (py <= ny + 1) { return Position.Top; } - if (py >= n.y + (n.height ?? 0) - 1) { + if (py >= n.y + (n.computed?.height ?? 0) - 1) { return Position.Bottom; } diff --git a/packages/react/src/additional-components/MiniMap/MiniMapNodes.tsx b/packages/react/src/additional-components/MiniMap/MiniMapNodes.tsx index 21bb8fc5..d72700a7 100644 --- a/packages/react/src/additional-components/MiniMap/MiniMapNodes.tsx +++ b/packages/react/src/additional-components/MiniMap/MiniMapNodes.tsx @@ -12,7 +12,10 @@ import type { MiniMapNodes, GetMiniMapNodeAttribute } from './types'; declare const window: any; const selector = (s: ReactFlowState) => s.nodeOrigin; -const selectorNodes = (s: ReactFlowState) => s.nodes.filter((node) => !node.hidden && node.width && node.height); +const selectorNodes = (s: ReactFlowState) => + s.nodes.filter( + (node) => !node.hidden && (node.computed?.width || node.width) && (node.computed?.height || node.height) + ); const getAttrFunction = (func: any): GetMiniMapNodeAttribute => (func instanceof Function ? func : () => func); function MiniMapNodes({ @@ -44,8 +47,8 @@ function MiniMapNodes({ key={node.id} x={x} y={y} - width={node.width!} - height={node.height!} + width={node.computed?.width ?? node.width ?? 0} + height={node.computed?.height ?? node.height ?? 0} style={node.style} selected={!!node.selected} className={nodeClassNameFunc(node)} diff --git a/packages/react/src/additional-components/NodeToolbar/NodeToolbar.tsx b/packages/react/src/additional-components/NodeToolbar/NodeToolbar.tsx index c880edb7..b7028a76 100644 --- a/packages/react/src/additional-components/NodeToolbar/NodeToolbar.tsx +++ b/packages/react/src/additional-components/NodeToolbar/NodeToolbar.tsx @@ -10,8 +10,8 @@ import NodeToolbarPortal from './NodeToolbarPortal'; import { NodeToolbarProps } from './types'; const nodeEqualityFn = (a: Node | undefined, b: Node | undefined) => - a?.positionAbsolute?.x === b?.positionAbsolute?.x && - a?.positionAbsolute?.y === b?.positionAbsolute?.y && + a?.computed?.positionAbsolute?.x === b?.computed?.positionAbsolute?.x && + a?.computed?.positionAbsolute?.y === b?.computed?.positionAbsolute?.y && a?.width === b?.width && a?.height === b?.height && a?.selected === b?.selected && diff --git a/packages/react/src/components/ConnectionLine/index.tsx b/packages/react/src/components/ConnectionLine/index.tsx index ed1a2115..bdf73089 100644 --- a/packages/react/src/components/ConnectionLine/index.tsx +++ b/packages/react/src/components/ConnectionLine/index.tsx @@ -65,10 +65,10 @@ const ConnectionLine = ({ } const fromHandle = handleId ? handleBounds.find((d) => d.id === handleId) : handleBounds[0]; - const fromHandleX = fromHandle ? fromHandle.x + fromHandle.width / 2 : (fromNode.width ?? 0) / 2; - const fromHandleY = fromHandle ? fromHandle.y + fromHandle.height / 2 : fromNode.height ?? 0; - const fromX = (fromNode.positionAbsolute?.x ?? 0) + fromHandleX; - const fromY = (fromNode.positionAbsolute?.y ?? 0) + fromHandleY; + const fromHandleX = fromHandle ? fromHandle.x + fromHandle.width / 2 : (fromNode.computed?.width ?? 0) / 2; + const fromHandleY = fromHandle ? fromHandle.y + fromHandle.height / 2 : fromNode.computed?.height ?? 0; + const fromX = (fromNode.computed?.positionAbsolute?.x ?? 0) + fromHandleX; + const fromY = (fromNode.computed?.positionAbsolute?.y ?? 0) + fromHandleY; const fromPosition = fromHandle?.position; const toPosition = fromPosition ? oppositePosition[fromPosition] : null; diff --git a/packages/react/src/components/Nodes/wrapNode.tsx b/packages/react/src/components/Nodes/wrapNode.tsx index e50ffcf7..ab56350b 100644 --- a/packages/react/src/components/Nodes/wrapNode.tsx +++ b/packages/react/src/components/Nodes/wrapNode.tsx @@ -52,8 +52,8 @@ export default (NodeComponent: ComponentType) => { disableKeyboardA11y, ariaLabel, rfId, - sizeWidth, - sizeHeight, + width, + height, }: WrapNodeProps) => { const store = useStoreApi(); const nodeRef = useRef(null); @@ -186,8 +186,8 @@ export default (NodeComponent: ComponentType) => { transform: `translate(${xPosOrigin}px,${yPosOrigin}px)`, pointerEvents: hasPointerEvents ? 'all' : 'none', visibility: initialized ? 'visible' : 'hidden', - width: sizeWidth, - height: sizeHeight, + width, + height, ...style, }} data-id={id} diff --git a/packages/react/src/container/NodeRenderer/index.tsx b/packages/react/src/container/NodeRenderer/index.tsx index 98f9fc39..3797bc45 100644 --- a/packages/react/src/container/NodeRenderer/index.tsx +++ b/packages/react/src/container/NodeRenderer/index.tsx @@ -91,19 +91,19 @@ const NodeRenderer = (props: NodeRendererProps) => { const isFocusable = !!(node.focusable || (nodesFocusable && typeof node.focusable === 'undefined')); const clampedPosition = props.nodeExtent - ? clampPosition(node.positionAbsolute, props.nodeExtent) - : node.positionAbsolute; + ? clampPosition(node.computed?.positionAbsolute, props.nodeExtent) + : node.computed?.positionAbsolute; const posX = clampedPosition?.x ?? 0; const posY = clampedPosition?.y ?? 0; const posOrigin = getPositionWithOrigin({ x: posX, y: posY, - width: node.width ?? 0, - height: node.height ?? 0, + width: node.computed?.width ?? node.width ?? 0, + height: node.computed?.height ?? node.height ?? 0, origin: node.origin || props.nodeOrigin, }); - const initialized = (!!node.width && !!node.height) || (!!node.size?.width && !!node.size?.height); + const initialized = (!!node.computed?.width && !!node.computed?.height) || (!!node.width && !!node.height); return ( { id={node.id} className={node.className} style={node.style} - sizeWidth={node.size?.width} - sizeHeight={node.size?.height} + width={node.width ?? undefined} + height={node.height ?? undefined} type={nodeType} data={node.data} sourcePosition={node.sourcePosition || Position.Bottom} diff --git a/packages/react/src/hooks/useReactFlow.ts b/packages/react/src/hooks/useReactFlow.ts index 257dd0f2..44e29c14 100644 --- a/packages/react/src/hooks/useReactFlow.ts +++ b/packages/react/src/hooks/useReactFlow.ts @@ -206,7 +206,7 @@ export default function useReactFlow(): ReactFlo } return (nodes || store.getState().nodes).filter((n) => { - if (!isRect && (n.id === node!.id || !n.positionAbsolute)) { + if (!isRect && (n.id === node!.id || !n.computed?.positionAbsolute)) { return false; } diff --git a/packages/react/src/hooks/useUpdateNodePositions.ts b/packages/react/src/hooks/useUpdateNodePositions.ts index d303fb9b..06577601 100644 --- a/packages/react/src/hooks/useUpdateNodePositions.ts +++ b/packages/react/src/hooks/useUpdateNodePositions.ts @@ -23,8 +23,11 @@ function useUpdateNodePositions() { const yDiff = params.y * yVelo * factor; const nodeUpdates = selectedNodes.map((node) => { - if (node.positionAbsolute) { - let nextPosition = { x: node.positionAbsolute.x + xDiff, y: node.positionAbsolute.y + yDiff }; + if (node.computed?.positionAbsolute) { + let nextPosition = { + x: node.computed?.positionAbsolute.x + xDiff, + y: node.computed?.positionAbsolute.y + yDiff, + }; if (snapToGrid) { nextPosition = snapPosition(nextPosition, snapGrid); @@ -40,7 +43,10 @@ function useUpdateNodePositions() { ); node.position = position; - node.positionAbsolute = positionAbsolute; + if (!node.computed) { + node.computed = {}; + } + node.computed.positionAbsolute = positionAbsolute; } return node; diff --git a/packages/react/src/store/index.ts b/packages/react/src/store/index.ts index a6898f6d..0f50f385 100644 --- a/packages/react/src/store/index.ts +++ b/packages/react/src/store/index.ts @@ -147,7 +147,7 @@ const createRFStore = ({ }; if (positionChanged) { - change.positionAbsolute = node.positionAbsolute; + change.positionAbsolute = node.computed?.positionAbsolute; change.position = node.position; } @@ -276,7 +276,10 @@ const createRFStore = ({ return { ...node, - positionAbsolute, + computed: { + ...node.computed, + positionAbsolute, + }, }; }), }); diff --git a/packages/react/src/store/initialState.ts b/packages/react/src/store/initialState.ts index c87c29f1..48e5434f 100644 --- a/packages/react/src/store/initialState.ts +++ b/packages/react/src/store/initialState.ts @@ -28,11 +28,7 @@ const getInitialState = ({ let transform: Transform = [0, 0, 1]; if (fitView && width && height) { - const nodesWithDimensions = nextNodes.map((node) => ({ - ...node, - width: node.size?.width, - height: node.size?.height, - })); + const nodesWithDimensions = nextNodes.filter((node) => node.width && node.height); const bounds = getNodesBounds(nodesWithDimensions, [0, 0]); const { x, y, zoom } = getViewportForBounds(bounds, width, height, 0.5, 2, 0.1); transform = [x, y, zoom]; diff --git a/packages/react/src/types/nodes.ts b/packages/react/src/types/nodes.ts index 4e648f8e..ab691af5 100644 --- a/packages/react/src/types/nodes.ts +++ b/packages/react/src/types/nodes.ts @@ -40,6 +40,6 @@ export type WrapNodeProps = Pick< noPanClassName: string; rfId: string; disableKeyboardA11y: boolean; - sizeWidth?: number; - sizeHeight?: number; + width?: number; + height?: number; }; diff --git a/packages/react/src/utils/changes.ts b/packages/react/src/utils/changes.ts index 61ff2b19..c113ebe1 100644 --- a/packages/react/src/utils/changes.ts +++ b/packages/react/src/utils/changes.ts @@ -5,14 +5,17 @@ export function handleParentExpand(res: any[], updateItem: any) { const parent = res.find((e) => e.id === updateItem.parentNode); if (parent) { - const extendWidth = updateItem.position.x + updateItem.width - parent.width; - const extendHeight = updateItem.position.y + updateItem.height - parent.height; + if (!parent.computed) { + parent.computed = {}; + } + const extendWidth = updateItem.position.x + updateItem.computed.width - parent.computed.width; + const extendHeight = updateItem.position.y + updateItem.computed.height - parent.computed.height; if (extendWidth > 0 || extendHeight > 0 || updateItem.position.x < 0 || updateItem.position.y < 0) { parent.style = { ...parent.style } || {}; - parent.style.width = parent.style.width ?? parent.width; - parent.style.height = parent.style.height ?? parent.height; + parent.style.width = parent.style.width ?? parent.computed.width; + parent.style.height = parent.style.height ?? parent.computed.height; if (extendWidth > 0) { parent.style.width += extendWidth; @@ -36,8 +39,8 @@ export function handleParentExpand(res: any[], updateItem: any) { updateItem.position.y = 0; } - parent.width = parent.style.width; - parent.height = parent.style.height; + parent.computed.width = parent.style.width; + parent.computed.height = parent.style.height; } } } @@ -87,7 +90,10 @@ function applyChanges(changes: any[], elements: any[]): any[] { } if (typeof currentChange.positionAbsolute !== 'undefined') { - updateItem.positionAbsolute = currentChange.positionAbsolute; + if (!updateItem.computed) { + updateItem.computed = {}; + } + updateItem.computed.positionAbsolute = currentChange.positionAbsolute; } if (typeof currentChange.dragging !== 'undefined') { @@ -101,8 +107,11 @@ function applyChanges(changes: any[], elements: any[]): any[] { } case 'dimensions': { if (typeof currentChange.dimensions !== 'undefined') { - updateItem.width = currentChange.dimensions.width; - updateItem.height = currentChange.dimensions.height; + if (!updateItem.computed) { + updateItem.computed = {}; + } + updateItem.computed.width = currentChange.dimensions.width; + updateItem.computed.height = currentChange.dimensions.height; } if (typeof currentChange.updateStyle !== 'undefined') { diff --git a/packages/svelte/src/lib/components/NodeWrapper/NodeWrapper.svelte b/packages/svelte/src/lib/components/NodeWrapper/NodeWrapper.svelte index 33a954b3..eb2c1472 100644 --- a/packages/svelte/src/lib/components/NodeWrapper/NodeWrapper.svelte +++ b/packages/svelte/src/lib/components/NodeWrapper/NodeWrapper.svelte @@ -34,6 +34,8 @@ export let sourcePosition: NodeWrapperProps['sourcePosition'] = undefined; export let targetPosition: NodeWrapperProps['targetPosition'] = undefined; export let zIndex: NodeWrapperProps['zIndex']; + export let width: NodeWrapperProps['width'] = undefined; + export let height: NodeWrapperProps['height'] = undefined; export let dragHandle: NodeWrapperProps['dragHandle'] = undefined; export let initialized: NodeWrapperProps['initialized'] = false; let className: string = ''; @@ -168,9 +170,7 @@ style:z-index={zIndex} style:transform="translate({positionOriginX}px, {positionOriginY}px)" style:visibility={initialized ? 'visible' : 'hidden'} - style="{style} {node.size?.width ? `;width=${node.size?.width}px` : ''} {node.size?.height - ? `;height=${node.size?.height}px;` - : ''}" + style="{style} {width ? `;width=${width}px` : ''} {height ? `;height=${height}px;` : ''}" on:click={onSelectNodeHandler} on:mouseenter={(event) => dispatch('nodemouseenter', { node, event })} on:mouseleave={(event) => dispatch('nodemouseleave', { node, event })} diff --git a/packages/svelte/src/lib/components/NodeWrapper/types.ts b/packages/svelte/src/lib/components/NodeWrapper/types.ts index e833ef54..3da65c2f 100644 --- a/packages/svelte/src/lib/components/NodeWrapper/types.ts +++ b/packages/svelte/src/lib/components/NodeWrapper/types.ts @@ -11,14 +11,15 @@ export type NodeWrapperProps = Pick< | 'selected' | 'selectable' | 'style' - | 'type' | 'width' | 'height' + | 'type' | 'sourcePosition' | 'targetPosition' | 'dragHandle' | 'hidden' > & { + type: string; positionX: number; positionY: number; positionOriginX: number; diff --git a/packages/svelte/src/lib/container/NodeRenderer/NodeRenderer.svelte b/packages/svelte/src/lib/container/NodeRenderer/NodeRenderer.svelte index e856b70b..48ec792b 100644 --- a/packages/svelte/src/lib/container/NodeRenderer/NodeRenderer.svelte +++ b/packages/svelte/src/lib/container/NodeRenderer/NodeRenderer.svelte @@ -40,10 +40,10 @@
{#each $visibleNodes as node (node.id)} {@const posOrigin = getPositionWithOrigin({ - x: node.positionAbsolute?.x ?? 0, - y: node.positionAbsolute?.y ?? 0, - width: (node.size?.width || node.width) ?? 0, - height: (node.size?.height || node.height) ?? 0, + x: node.computed?.positionAbsolute?.x ?? 0, + y: node.computed?.positionAbsolute?.y ?? 0, + width: node.computed?.width ?? node.width ?? 0, + height: node.computed?.height ?? node.height ?? 0, origin: node.origin })} { - if (!isRect && (n.id === node.id || !n.positionAbsolute)) { + if (!isRect && (n.id === node.id || !n.computed?.positionAbsolute)) { return false; } diff --git a/packages/svelte/src/lib/hooks/useUpdateNodeInternals.ts b/packages/svelte/src/lib/hooks/useUpdateNodeInternals.ts index c66bb688..dad8ed88 100644 --- a/packages/svelte/src/lib/hooks/useUpdateNodeInternals.ts +++ b/packages/svelte/src/lib/hooks/useUpdateNodeInternals.ts @@ -1,5 +1,5 @@ import { get } from 'svelte/store'; -import type { UpdateNodeInternals, NodeDimensionUpdate } from '@xyflow/system'; +import type { UpdateNodeInternals } from '@xyflow/system'; import { useStore } from '$lib/store'; diff --git a/packages/svelte/src/lib/plugins/Minimap/Minimap.svelte b/packages/svelte/src/lib/plugins/Minimap/Minimap.svelte index f3fba426..b331a04e 100644 --- a/packages/svelte/src/lib/plugins/Minimap/Minimap.svelte +++ b/packages/svelte/src/lib/plugins/Minimap/Minimap.svelte @@ -114,13 +114,13 @@ {#if ariaLabel}{ariaLabel}{/if} {#each $nodes as node (node.id)} - {#if node.width && node.height} + {#if (node.computed?.width || node?.width) && (node.computed?.height || node.height)} {@const pos = getNodePositionWithOrigin(node).positionAbsolute} { store.nodes.update((nds) => { - return nds.map((n) => { + return nds.map((node) => { const nodeDragItem = (nodeDragItems as Array).find( - (ndi) => ndi.id === n.id + (ndi) => ndi.id === node.id ); if (nodeDragItem) { return { - ...n, - [internalsSymbol]: n[internalsSymbol], + ...node, dragging, - positionAbsolute: nodeDragItem.positionAbsolute, - position: nodeDragItem.position + position: nodeDragItem.position, + computed: { + ...node.computed, + positionAbsolute: nodeDragItem.computed?.positionAbsolute + }, + [internalsSymbol]: node[internalsSymbol] }; } - return n; + return node; }); }); }; diff --git a/packages/system/src/types/nodes.ts b/packages/system/src/types/nodes.ts index cea41c65..1e354a55 100644 --- a/packages/system/src/types/nodes.ts +++ b/packages/system/src/types/nodes.ts @@ -25,14 +25,14 @@ export type NodeBase zIndex?: number; extent?: 'parent' | CoordinateExtent; expandParent?: boolean; - positionAbsolute?: XYPosition; ariaLabel?: string; focusable?: boolean; origin?: NodeOrigin; handles?: NodeHandle[]; - size?: { + computed?: { width?: number; height?: number; + positionAbsolute?: XYPosition; }; // only used internally @@ -78,11 +78,13 @@ export type NodeBounds = XYPosition & { export type NodeDragItem = { id: string; position: XYPosition; - positionAbsolute: XYPosition; // distance from the mouse cursor to the node when start dragging distance: XYPosition; - width?: number | null; - height?: number | null; + computed: { + width: number | null; + height: number | null; + positionAbsolute: XYPosition; + }; extent?: 'parent' | CoordinateExtent; parentNode?: string; dragging?: boolean; diff --git a/packages/system/src/utils/dom.ts b/packages/system/src/utils/dom.ts index 74bb14aa..3cf5cd61 100644 --- a/packages/system/src/utils/dom.ts +++ b/packages/system/src/utils/dom.ts @@ -73,6 +73,8 @@ export const getHandleBounds = ( } const handlesArray = Array.from(handles) as HTMLDivElement[]; + + // @todo can't we use the node dimensions here? const nodeBounds = nodeElement.getBoundingClientRect(); const nodeOffset = { x: nodeBounds.width * nodeOrigin[0], diff --git a/packages/system/src/utils/edges/positions.ts b/packages/system/src/utils/edges/positions.ts index 8159d46b..35e07834 100644 --- a/packages/system/src/utils/edges/positions.ts +++ b/packages/system/src/utils/edges/positions.ts @@ -88,20 +88,20 @@ function toHandleBounds(handles?: NodeHandle[]) { function getHandleDataByNode(node?: NodeBase): [Rect, NodeHandleBounds | null, boolean] { const handleBounds = node?.[internalsSymbol]?.handleBounds || toHandleBounds(node?.handles) || null; - const nodeWidth = node?.width || node?.size?.width; - const nodeHeight = node?.height || node?.size?.height; + const nodeWidth = node?.computed?.width || node?.width; + const nodeHeight = node?.computed?.height || node?.height; const isValid = handleBounds && nodeWidth && nodeHeight && - typeof node?.positionAbsolute?.x !== 'undefined' && - typeof node?.positionAbsolute?.y !== 'undefined'; + typeof node?.computed?.positionAbsolute?.x !== 'undefined' && + typeof node?.computed?.positionAbsolute?.y !== 'undefined'; return [ { - x: node?.positionAbsolute?.x || 0, - y: node?.positionAbsolute?.y || 0, + x: node?.computed?.positionAbsolute?.x || 0, + y: node?.computed?.positionAbsolute?.y || 0, width: nodeWidth || 0, height: nodeHeight || 0, }, diff --git a/packages/system/src/utils/general.ts b/packages/system/src/utils/general.ts index 976d105f..2db59322 100644 --- a/packages/system/src/utils/general.ts +++ b/packages/system/src/utils/general.ts @@ -64,8 +64,8 @@ export const nodeToRect = (node: NodeBase, nodeOrigin: NodeOrigin = [0, 0]): Rec return { ...positionAbsolute, - width: node.width || 0, - height: node.height || 0, + width: node.computed?.width ?? node.width ?? 0, + height: node.computed?.height ?? node.height ?? 0, }; }; @@ -74,8 +74,8 @@ export const nodeToBox = (node: NodeBase, nodeOrigin: NodeOrigin = [0, 0]): Box return { ...positionAbsolute, - x2: positionAbsolute.x + (node.width || 0), - y2: positionAbsolute.y + (node.height || 0), + x2: positionAbsolute.x + (node.computed?.width ?? node.width ?? 0), + y2: positionAbsolute.y + (node.computed?.height ?? node.height ?? 0), }; }; diff --git a/packages/system/src/utils/graph.ts b/packages/system/src/utils/graph.ts index 43a80ef6..c2e276ae 100644 --- a/packages/system/src/utils/graph.ts +++ b/packages/system/src/utils/graph.ts @@ -86,8 +86,8 @@ export const getNodePositionWithOrigin = ( }; } - const offsetX = (node.width ?? 0) * nodeOrigin[0]; - const offsetY = (node.height ?? 0) * nodeOrigin[1]; + const offsetX = (node.computed?.width ?? node.width ?? 0) * nodeOrigin[0]; + const offsetY = (node.computed?.height ?? node.height ?? 0) * nodeOrigin[1]; const position: XYPosition = { x: node.position.x - offsetX, @@ -96,10 +96,10 @@ export const getNodePositionWithOrigin = ( return { ...position, - positionAbsolute: node.positionAbsolute + positionAbsolute: node.computed?.positionAbsolute ? { - x: node.positionAbsolute.x - offsetX, - y: node.positionAbsolute.y - offsetY, + x: node.computed.positionAbsolute.x - offsetX, + y: node.computed.positionAbsolute.y - offsetY, } : position, }; @@ -118,8 +118,8 @@ export const getNodesBounds = (nodes: NodeBase[], nodeOrigin: NodeOrigin = [0, 0 rectToBox({ x, y, - width: node.width || 0, - height: node.height || 0, + width: node.computed?.width ?? node.width ?? 0, + height: node.computed?.height ?? node.height ?? 0, }) ); }, @@ -145,17 +145,19 @@ export const getNodesInside = ( }; const visibleNodes = nodes.reduce((res, node) => { - const { width, height, selectable = true, hidden = false } = node; + const { computed, selectable = true, hidden = false } = node; + const width = computed?.width ?? node.width ?? null; + const height = computed?.height ?? node.height ?? null; if ((excludeNonSelectableNodes && !selectable) || hidden) { return res; } const overlappingArea = getOverlappingArea(paneRect, nodeToRect(node, nodeOrigin)); - const notInitialized = width === undefined || height === undefined || width === null || height === null; + const notInitialized = width === null || height === null; const partiallyVisible = partially && overlappingArea > 0; - const area = (width || 0) * (height || 0); + const area = (width ?? 0) * (height ?? 0); const isVisible = notInitialized || partiallyVisible || overlappingArea >= area; if (isVisible || node.dragging) { @@ -185,7 +187,7 @@ export function fitView, Options exte options?: Options ) { const filteredNodes = nodes.filter((n) => { - const isVisible = n.width && n.height && (options?.includeHiddenNodes || !n.hidden); + const isVisible = n.computed?.width && n.computed?.height && (options?.includeHiddenNodes || !n.hidden); if (options?.nodes?.length) { return isVisible && options?.nodes.some((optionNode) => optionNode.id === n.id); @@ -218,7 +220,7 @@ function clampNodeExtent(node: NodeDragItem | NodeBase, extent?: CoordinateExten if (!extent || extent === 'parent') { return extent; } - return [extent[0], [extent[1][0] - (node.width || 0), extent[1][1] - (node.height || 0)]]; + return [extent[0], [extent[1][0] - (node.computed?.width ?? 0), extent[1][1] - (node.computed?.height ?? 0)]]; } export function calcNextPosition( @@ -242,16 +244,18 @@ export function calcNextPosition( } if (node.extent === 'parent' && !node.expandParent) { - if (node.parentNode && node.width && node.height) { + const nodeWidth = node.computed?.width; + const nodeHeight = node.computed?.height; + if (node.parentNode && nodeWidth && nodeHeight) { const currNodeOrigin = node.origin || nodeOrigin; currentExtent = - parentNode && isNumeric(parentNode.width) && isNumeric(parentNode.height) + parentNode && isNumeric(parentNode.computed?.width) && isNumeric(parentNode.computed?.height) ? [ - [parentPos.x + node.width * currNodeOrigin[0], parentPos.y + node.height * currNodeOrigin[1]], + [parentPos.x + nodeWidth * currNodeOrigin[0], parentPos.y + nodeHeight * currNodeOrigin[1]], [ - parentPos.x + parentNode.width - node.width + node.width * currNodeOrigin[0], - parentPos.y + parentNode.height - node.height + node.height * currNodeOrigin[1], + parentPos.x + parentNode.computed?.width - nodeWidth + nodeWidth * currNodeOrigin[0], + parentPos.y + parentNode.computed?.height - nodeHeight + nodeHeight * currNodeOrigin[1], ], ] : currentExtent; diff --git a/packages/system/src/utils/store.ts b/packages/system/src/utils/store.ts index 9ed4f871..eca6b8de 100644 --- a/packages/system/src/utils/store.ts +++ b/packages/system/src/utils/store.ts @@ -40,7 +40,7 @@ export function updateAbsolutePositions( parentNode?.origin || nodeOrigin ); - node.positionAbsolute = { + node.computed!.positionAbsolute = { x, y, }; @@ -79,9 +79,11 @@ export function updateNodes( const node: NodeType = { ...options.defaults, ...n, - positionAbsolute: n.position, - width: n.width || currentStoreNode?.width, - height: n.height || currentStoreNode?.height, + computed: { + positionAbsolute: n.position, + width: n.computed?.width || currentStoreNode?.computed?.width, + height: n.computed?.height || currentStoreNode?.computed?.height, + }, }; const z = (isNumeric(n.zIndex) ? n.zIndex : 0) + (n.selected ? selectedNodeZ : 0); const currInternals = n?.[internalsSymbol] || currentStoreNode?.[internalsSymbol]; @@ -160,7 +162,7 @@ export function updateNodeDimensions( const doUpdate = !!( dimensions.width && dimensions.height && - (node.width !== dimensions.width || node.height !== dimensions.height || update.forceUpdate) + (node.computed?.width !== dimensions.width || node.computed?.height !== dimensions.height || update.forceUpdate) ); if (doUpdate) { @@ -168,7 +170,10 @@ export function updateNodeDimensions( const newNode = { ...node, - ...dimensions, + computed: { + ...node.computed, + ...dimensions, + }, [internalsSymbol]: { ...node[internalsSymbol], handleBounds: { diff --git a/packages/system/src/xydrag/XYDrag.ts b/packages/system/src/xydrag/XYDrag.ts index 69d50b41..79a0823a 100644 --- a/packages/system/src/xydrag/XYDrag.ts +++ b/packages/system/src/xydrag/XYDrag.ts @@ -140,11 +140,13 @@ export function XYDrag({ ]; if (dragItems.length > 1 && nodeExtent && !n.extent) { - adjustedNodeExtent[0][0] = n.positionAbsolute.x - nodesBox.x + nodeExtent[0][0]; - adjustedNodeExtent[1][0] = n.positionAbsolute.x + (n.width ?? 0) - nodesBox.x2 + nodeExtent[1][0]; + adjustedNodeExtent[0][0] = n.computed.positionAbsolute.x - nodesBox.x + nodeExtent[0][0]; + adjustedNodeExtent[1][0] = + n.computed.positionAbsolute.x + (n.computed?.width ?? 0) - nodesBox.x2 + nodeExtent[1][0]; - adjustedNodeExtent[0][1] = n.positionAbsolute.y - nodesBox.y + nodeExtent[0][1]; - adjustedNodeExtent[1][1] = n.positionAbsolute.y + (n.height ?? 0) - nodesBox.y2 + nodeExtent[1][1]; + adjustedNodeExtent[0][1] = n.computed.positionAbsolute.y - nodesBox.y + nodeExtent[0][1]; + adjustedNodeExtent[1][1] = + n.computed.positionAbsolute.y + (n.computed?.height ?? 0) - nodesBox.y2 + nodeExtent[1][1]; } const updatedPos = calcNextPosition(n, nextPosition, nodes, adjustedNodeExtent, nodeOrigin, onError); @@ -153,7 +155,7 @@ export function XYDrag({ hasChange = hasChange || n.position.x !== updatedPos.position.x || n.position.y !== updatedPos.position.y; n.position = updatedPos.position; - n.positionAbsolute = updatedPos.positionAbsolute; + n.computed.positionAbsolute = updatedPos.positionAbsolute; return n; }); diff --git a/packages/system/src/xydrag/utils.ts b/packages/system/src/xydrag/utils.ts index 274c2213..15c9af68 100644 --- a/packages/system/src/xydrag/utils.ts +++ b/packages/system/src/xydrag/utils.ts @@ -51,10 +51,9 @@ export function getDragItems( .map((n) => ({ id: n.id, position: n.position || { x: 0, y: 0 }, - positionAbsolute: n.positionAbsolute || { x: 0, y: 0 }, distance: { - x: mousePos.x - (n.positionAbsolute?.x ?? 0), - y: mousePos.y - (n.positionAbsolute?.y ?? 0), + x: mousePos.x - (n.computed?.positionAbsolute?.x ?? 0), + y: mousePos.y - (n.computed?.positionAbsolute?.y ?? 0), }, delta: { x: 0, @@ -62,10 +61,13 @@ export function getDragItems( }, extent: n.extent, parentNode: n.parentNode, - width: n.width, - height: n.height, origin: n.origin, expandParent: n.expandParent, + computed: { + positionAbsolute: n.computed?.positionAbsolute || { x: 0, y: 0 }, + width: n.computed?.width || 0, + height: n.computed?.height || 0, + }, })); } @@ -81,15 +83,18 @@ export function getEventHandlerParams({ dragItems: NodeDragItem[]; nodeLookup: Map; }): [NodeType, NodeType[]] { - const extentedDragItems: NodeType[] = dragItems.map((n) => { + const nodesFromDragItems: NodeType[] = dragItems.map((n) => { const node = nodeLookup.get(n.id)!; return { ...node, position: n.position, - positionAbsolute: n.positionAbsolute, + computed: { + ...n.computed, + positionAbsolute: n.computed.positionAbsolute, + }, }; }); - return [nodeId ? extentedDragItems.find((n) => n.id === nodeId)! : extentedDragItems[0], extentedDragItems]; + return [nodeId ? nodesFromDragItems.find((n) => n.id === nodeId)! : nodesFromDragItems[0], nodesFromDragItems]; } diff --git a/packages/system/src/xyhandle/utils.ts b/packages/system/src/xyhandle/utils.ts index 35b17601..b829f691 100644 --- a/packages/system/src/xyhandle/utils.ts +++ b/packages/system/src/xyhandle/utils.ts @@ -22,8 +22,8 @@ export function getHandles( id: h.id || null, type, nodeId: node.id, - x: (node.positionAbsolute?.x ?? 0) + h.x + h.width / 2, - y: (node.positionAbsolute?.y ?? 0) + h.y + h.height / 2, + x: (node.computed?.positionAbsolute?.x ?? 0) + h.x + h.width / 2, + y: (node.computed?.positionAbsolute?.y ?? 0) + h.y + h.height / 2, }); } return res; From 24c999a335186cd457b38f99e4ef9590447134df Mon Sep 17 00:00:00 2001 From: moklick Date: Tue, 21 Nov 2023 15:18:35 +0100 Subject: [PATCH 061/608] chore(astro): use width/height attrs --- .../src/components/ReactFlowExample/index.tsx | 6 ++--- .../components/SvelteFlowExample/index.svelte | 24 +++++++------------ .../components/NodeWrapper/NodeWrapper.svelte | 4 +++- .../svelte/src/lib/store/initial-store.ts | 6 +---- 4 files changed, 15 insertions(+), 25 deletions(-) diff --git a/examples/astro-xyflow/src/components/ReactFlowExample/index.tsx b/examples/astro-xyflow/src/components/ReactFlowExample/index.tsx index ae5a5c87..ca21eeb7 100644 --- a/examples/astro-xyflow/src/components/ReactFlowExample/index.tsx +++ b/examples/astro-xyflow/src/components/ReactFlowExample/index.tsx @@ -27,7 +27,7 @@ const initialNodes: Node[] = [ type: 'input', data: { label: 'Node 1' }, position: { x: 250, y: 5 }, - size: nodeSize, + ...nodeSize, handles: [ { type: 'source', @@ -41,7 +41,7 @@ const initialNodes: Node[] = [ id: '2', data: { label: 'Node 2' }, position: { x: 100, y: 100 }, - size: nodeSize, + ...nodeSize, handles: [ { type: 'source', @@ -65,7 +65,7 @@ const initialNodes: Node[] = [ id: '3', data: { label: 'Node 3' }, position: { x: 400, y: 100 }, - size: nodeSize, + ...nodeSize, handles: [ { type: 'source', diff --git a/examples/astro-xyflow/src/components/SvelteFlowExample/index.svelte b/examples/astro-xyflow/src/components/SvelteFlowExample/index.svelte index cfa8a449..73196d53 100644 --- a/examples/astro-xyflow/src/components/SvelteFlowExample/index.svelte +++ b/examples/astro-xyflow/src/components/SvelteFlowExample/index.svelte @@ -11,10 +11,8 @@ data: { label: 'Node 0' }, sourcePosition: Position.Right, targetPosition: Position.Left, - size: { - width: 100, - height: 40, - }, + width: 100, + height: 40, handles: [ { type: 'source', x: 100, y: 20, position: Position.Right }, { type: 'target', x: 0, y: 20, position: Position.Left }, @@ -26,10 +24,8 @@ data: { label: 'A' }, sourcePosition: Position.Right, targetPosition: Position.Left, - size: { - width: 100, - height: 40, - }, + width: 100, + height: 40, handles: [ { type: 'source', x: 100, y: 20, position: Position.Right }, { type: 'target', x: 0, y: 20, position: Position.Left }, @@ -41,10 +37,8 @@ data: { label: 'B' }, sourcePosition: Position.Right, targetPosition: Position.Left, - size: { - width: 100, - height: 40, - }, + width: 100, + height: 40, handles: [ { type: 'source', x: 100, y: 20, position: Position.Right }, { type: 'target', x: 0, y: 20, position: Position.Left }, @@ -56,10 +50,8 @@ data: { label: 'C' }, sourcePosition: Position.Right, targetPosition: Position.Left, - size: { - width: 100, - height: 40, - }, + width: 100, + height: 40, handles: [ { type: 'source', x: 100, y: 20, position: Position.Right }, { type: 'target', x: 0, y: 20, position: Position.Left }, diff --git a/packages/svelte/src/lib/components/NodeWrapper/NodeWrapper.svelte b/packages/svelte/src/lib/components/NodeWrapper/NodeWrapper.svelte index eb2c1472..a59e522d 100644 --- a/packages/svelte/src/lib/components/NodeWrapper/NodeWrapper.svelte +++ b/packages/svelte/src/lib/components/NodeWrapper/NodeWrapper.svelte @@ -170,7 +170,9 @@ style:z-index={zIndex} style:transform="translate({positionOriginX}px, {positionOriginY}px)" style:visibility={initialized ? 'visible' : 'hidden'} - style="{style} {width ? `;width=${width}px` : ''} {height ? `;height=${height}px;` : ''}" + style:width={width === undefined ? undefined : `${width}px`} + style:height={height === undefined ? undefined : `${height}px`} + {style} on:click={onSelectNodeHandler} on:mouseenter={(event) => dispatch('nodemouseenter', { node, event })} on:mouseleave={(event) => dispatch('nodemouseleave', { node, event })} diff --git a/packages/svelte/src/lib/store/initial-store.ts b/packages/svelte/src/lib/store/initial-store.ts index d6b621d9..dbbb17fc 100644 --- a/packages/svelte/src/lib/store/initial-store.ts +++ b/packages/svelte/src/lib/store/initial-store.ts @@ -76,11 +76,7 @@ export const getInitialStore = ({ let viewport: Viewport = { x: 0, y: 0, zoom: 1 }; if (fitView && width && height) { - const nodesWithDimensions = nextNodes.map((node) => ({ - ...node, - width: node.size?.width, - height: node.size?.height - })); + const nodesWithDimensions = nextNodes.filter((node) => node.width && node.height); const bounds = getNodesBounds(nodesWithDimensions, [0, 0]); viewport = getViewportForBounds(bounds, width, height, 0.5, 2, 0.1); } From a166129547227284cde5e5031deb48d122498691 Mon Sep 17 00:00:00 2001 From: moklick Date: Tue, 21 Nov 2023 16:03:07 +0100 Subject: [PATCH 062/608] fix(svelte): use node.style.width and node.style --- .../src/components/ReactFlowExample/index.tsx | 8 -------- .../src/lib/components/NodeWrapper/NodeWrapper.svelte | 6 +++--- 2 files changed, 3 insertions(+), 11 deletions(-) diff --git a/examples/astro-xyflow/src/components/ReactFlowExample/index.tsx b/examples/astro-xyflow/src/components/ReactFlowExample/index.tsx index ca21eeb7..4f8ef0ab 100644 --- a/examples/astro-xyflow/src/components/ReactFlowExample/index.tsx +++ b/examples/astro-xyflow/src/components/ReactFlowExample/index.tsx @@ -48,16 +48,12 @@ const initialNodes: Node[] = [ position: Position.Bottom, x: nodeSize.width * 0.5, y: nodeSize.height, - width: 1, - height: 1, }, { type: 'target', position: Position.Top, x: nodeSize.width * 0.5, y: 0, - width: 1, - height: 1, }, ], }, @@ -72,16 +68,12 @@ const initialNodes: Node[] = [ position: Position.Bottom, x: nodeSize.width * 0.5, y: nodeSize.height, - width: 1, - height: 1, }, { type: 'target', position: Position.Top, x: nodeSize.width * 0.5, y: 0, - width: 1, - height: 1, }, ], }, diff --git a/packages/svelte/src/lib/components/NodeWrapper/NodeWrapper.svelte b/packages/svelte/src/lib/components/NodeWrapper/NodeWrapper.svelte index a59e522d..335bff71 100644 --- a/packages/svelte/src/lib/components/NodeWrapper/NodeWrapper.svelte +++ b/packages/svelte/src/lib/components/NodeWrapper/NodeWrapper.svelte @@ -170,9 +170,9 @@ style:z-index={zIndex} style:transform="translate({positionOriginX}px, {positionOriginY}px)" style:visibility={initialized ? 'visible' : 'hidden'} - style:width={width === undefined ? undefined : `${width}px`} - style:height={height === undefined ? undefined : `${height}px`} - {style} + style="{style ?? ''}; {!width ? '' : `width:${width}px;`} {!height + ? '' + : `height:${height}px;`}" on:click={onSelectNodeHandler} on:mouseenter={(event) => dispatch('nodemouseenter', { node, event })} on:mouseleave={(event) => dispatch('nodemouseleave', { node, event })} From 39b0deb9a45e94c971198deaae1a7f85512fa171 Mon Sep 17 00:00:00 2001 From: moklick Date: Tue, 21 Nov 2023 16:08:13 +0100 Subject: [PATCH 063/608] fix(react): node resizer use new width/height attr --- .../src/additional-components/NodeResizer/ResizeControl.tsx | 4 ++-- packages/system/src/utils/graph.ts | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/react/src/additional-components/NodeResizer/ResizeControl.tsx b/packages/react/src/additional-components/NodeResizer/ResizeControl.tsx index 36783fcf..1df32e06 100644 --- a/packages/react/src/additional-components/NodeResizer/ResizeControl.tsx +++ b/packages/react/src/additional-components/NodeResizer/ResizeControl.tsx @@ -70,8 +70,8 @@ function ResizeControl({ const { xSnapped, ySnapped } = getPointerPosition(event.sourceEvent, { transform, snapGrid, snapToGrid }); prevValues.current = { - width: node?.width ?? 0, - height: node?.height ?? 0, + width: node?.computed?.width ?? 0, + height: node?.computed?.height ?? 0, x: node?.position.x ?? 0, y: node?.position.y ?? 0, }; diff --git a/packages/system/src/utils/graph.ts b/packages/system/src/utils/graph.ts index c2e276ae..fe50e1be 100644 --- a/packages/system/src/utils/graph.ts +++ b/packages/system/src/utils/graph.ts @@ -254,8 +254,8 @@ export function calcNextPosition( ? [ [parentPos.x + nodeWidth * currNodeOrigin[0], parentPos.y + nodeHeight * currNodeOrigin[1]], [ - parentPos.x + parentNode.computed?.width - nodeWidth + nodeWidth * currNodeOrigin[0], - parentPos.y + parentNode.computed?.height - nodeHeight + nodeHeight * currNodeOrigin[1], + parentPos.x + parentNode.computed.width - nodeWidth + nodeWidth * currNodeOrigin[0], + parentPos.y + parentNode.computed.height - nodeHeight + nodeHeight * currNodeOrigin[1], ], ] : currentExtent; From 51e98ea44d29e7a6607dfbb8cabd09c9338436f2 Mon Sep 17 00:00:00 2001 From: moklick Date: Tue, 21 Nov 2023 16:37:38 +0100 Subject: [PATCH 064/608] fix(svelte): node toolbar use new width/height attrs --- .../svelte/src/lib/plugins/NodeToolbar/NodeToolbar.svelte | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/packages/svelte/src/lib/plugins/NodeToolbar/NodeToolbar.svelte b/packages/svelte/src/lib/plugins/NodeToolbar/NodeToolbar.svelte index b01bbb48..fab6ce2d 100644 --- a/packages/svelte/src/lib/plugins/NodeToolbar/NodeToolbar.svelte +++ b/packages/svelte/src/lib/plugins/NodeToolbar/NodeToolbar.svelte @@ -51,10 +51,11 @@ let nodeRect: Rect | undefined = undefined; if (toolbarNodes.length === 1) { + const toolbarNode = toolbarNodes[0]; nodeRect = { - ...toolbarNodes[0].position, - width: toolbarNodes[0].width ?? 0, - height: toolbarNodes[0].height ?? 0 + ...toolbarNode.position, + width: toolbarNode.computed?.width ?? toolbarNode.width ?? 0, + height: toolbarNode.computed?.height ?? toolbarNode.height ?? 0 }; } else if (toolbarNodes.length > 1) { nodeRect = getNodesBounds(toolbarNodes, $nodeOrigin); From ab5eef220f65881e94464f6a332e25f614672edb Mon Sep 17 00:00:00 2001 From: Moritz Klack Date: Thu, 23 Nov 2023 12:15:36 +0100 Subject: [PATCH 065/608] Feat: dark mode (#3652) * feat(react/svelte): add dark mode defaults * refactor(darkmode): minimap, edges, edge labels * chore(style): edge label color * feat(colorMode): add colorMode prop light/dark/system * chore(examples): cleanup * test(colorMode): add tests * chore(base.css): add dark base * chore(examples): cleanup --- examples/react/src/App/routes.ts | 6 ++ .../react/src/examples/ColorMode/index.tsx | 88 +++++++++++++++++++ .../react/src/examples/EasyConnect/index.tsx | 1 - .../react/src/examples/NodeResizer/index.tsx | 2 - .../react/src/examples/Overview/index.tsx | 6 +- examples/react/src/main.tsx | 2 +- .../src/components/Header/Header.svelte | 1 + .../routes/examples/color-mode/+page.svelte | 54 ++++++++++++ .../src/routes/examples/edges/+page.svelte | 2 +- .../Background/Patterns.tsx | 2 +- .../additional-components/MiniMap/MiniMap.tsx | 21 +++-- .../MiniMap/MiniMapNode.tsx | 8 +- .../MiniMap/MiniMapNodes.tsx | 12 +-- .../additional-components/MiniMap/types.ts | 6 +- .../react/src/container/ReactFlow/index.tsx | 5 +- packages/react/src/hooks/useColorModeClass.ts | 35 ++++++++ packages/react/src/index.ts | 2 + packages/react/src/styles/base.css | 18 ++++ packages/react/src/styles/style.css | 18 ++++ packages/react/src/types/component-props.ts | 2 + .../container/SvelteFlow/SvelteFlow.svelte | 13 ++- .../src/lib/container/SvelteFlow/types.ts | 4 +- .../src/lib/container/SvelteFlow/utils.ts | 14 ++- .../svelte/src/lib/hooks/useColorModeClass.ts | 32 +++++++ packages/svelte/src/lib/index.ts | 4 +- .../src/lib/plugins/Minimap/Minimap.svelte | 30 +------ .../lib/plugins/Minimap/MinimapNode.svelte | 10 +-- packages/svelte/src/styles/base.css | 9 ++ packages/svelte/src/styles/style.css | 9 ++ packages/system/src/styles/base.css | 5 ++ packages/system/src/styles/init.css | 68 +++++++++++--- packages/system/src/styles/style.css | 31 ++++++- packages/system/src/types/general.ts | 3 + tests/playwright/e2e/edges.spec.ts | 2 +- tests/playwright/e2e/node-toolbar.spec.ts | 2 +- tests/playwright/e2e/nodes.spec.ts | 2 +- tests/playwright/e2e/pane.spec.ts | 6 +- tests/playwright/e2e/props.spec.ts | 22 +++++ 38 files changed, 474 insertions(+), 83 deletions(-) create mode 100644 examples/react/src/examples/ColorMode/index.tsx create mode 100644 examples/svelte/src/routes/examples/color-mode/+page.svelte create mode 100644 packages/react/src/hooks/useColorModeClass.ts create mode 100644 packages/svelte/src/lib/hooks/useColorModeClass.ts create mode 100644 tests/playwright/e2e/props.spec.ts diff --git a/examples/react/src/App/routes.ts b/examples/react/src/App/routes.ts index 6c6b596c..2665abfa 100644 --- a/examples/react/src/App/routes.ts +++ b/examples/react/src/App/routes.ts @@ -1,5 +1,6 @@ import Basic from '../examples/Basic'; import Backgrounds from '../examples/Backgrounds'; +import ColorMode from '../examples/ColorMode'; import ControlledUncontrolled from '../examples/ControlledUncontrolled'; import ControlledViewport from '../examples/ControlledViewport'; import CustomConnectionLine from '../examples/CustomConnectionLine'; @@ -62,6 +63,11 @@ const routes: IRoute[] = [ path: 'backgrounds', component: Backgrounds, }, + { + name: 'Color Mode', + path: 'color-mode', + component: ColorMode, + }, { name: 'Cancel Connection', path: 'cancel-connection', diff --git a/examples/react/src/examples/ColorMode/index.tsx b/examples/react/src/examples/ColorMode/index.tsx new file mode 100644 index 00000000..f867c650 --- /dev/null +++ b/examples/react/src/examples/ColorMode/index.tsx @@ -0,0 +1,88 @@ +import { ChangeEventHandler, useCallback, useState } from 'react'; +import { + ReactFlow, + addEdge, + Node, + useNodesState, + useEdgesState, + OnConnect, + Edge, + MiniMap, + Background, + Controls, + Panel, + ColorMode, + Position, +} from '@xyflow/react'; + +const nodeDefaults = { + sourcePosition: Position.Right, + targetPosition: Position.Left, +}; + +const initialNodes: Node[] = [ + { id: 'A', type: 'input', position: { x: 0, y: 150 }, data: { label: 'A' }, ...nodeDefaults }, + { id: 'B', position: { x: 250, y: 0 }, data: { label: 'B' }, ...nodeDefaults }, + { id: 'C', position: { x: 250, y: 150 }, data: { label: 'C' }, ...nodeDefaults }, + { id: 'D', position: { x: 250, y: 300 }, data: { label: 'D' }, ...nodeDefaults }, +]; + +const initialEdges: Edge[] = [ + { + id: 'A-B', + source: 'A', + target: 'B', + }, + { + id: 'A-C', + source: 'A', + target: 'C', + }, + { + id: 'A-D', + source: 'A', + target: 'D', + }, +]; + +const ColorModeFlow = () => { + const [colorMode, setColorMode] = useState('light'); + const [nodes, , onNodesChange] = useNodesState(initialNodes); + const [edges, setEdges, onEdgesChange] = useEdgesState(initialEdges); + + const onConnect: OnConnect = useCallback( + (params) => { + console.log('on connect', params); + setEdges((eds) => addEdge(params, eds)); + }, + [setEdges] + ); + + const onChange: ChangeEventHandler = (evt) => setColorMode(evt.target.value as ColorMode); + + return ( + + + + + + + + + + ); +}; + +export default ColorModeFlow; diff --git a/examples/react/src/examples/EasyConnect/index.tsx b/examples/react/src/examples/EasyConnect/index.tsx index 7e600848..11e347f1 100644 --- a/examples/react/src/examples/EasyConnect/index.tsx +++ b/examples/react/src/examples/EasyConnect/index.tsx @@ -5,7 +5,6 @@ import CustomNode from './CustomNode'; import FloatingEdge from './FloatingEdge'; import CustomConnectionLine from './CustomConnectionLine'; -import '@xyflow/react/dist/style.css'; import './style.css'; const initialNodes: Node[] = [ diff --git a/examples/react/src/examples/NodeResizer/index.tsx b/examples/react/src/examples/NodeResizer/index.tsx index e276996c..11ce29d2 100644 --- a/examples/react/src/examples/NodeResizer/index.tsx +++ b/examples/react/src/examples/NodeResizer/index.tsx @@ -16,8 +16,6 @@ import CustomResizer from './CustomResizer'; import VerticalResizer from './VerticalResizer'; import HorizontalResizer from './HorizontalResizer'; -import '@xyflow/react/dist/style.css'; - const nodeTypes = { defaultResizer: DefaultResizer, customResizer: CustomResizer, diff --git a/examples/react/src/examples/Overview/index.tsx b/examples/react/src/examples/Overview/index.tsx index 09110529..e4879ace 100644 --- a/examples/react/src/examples/Overview/index.tsx +++ b/examples/react/src/examples/Overview/index.tsx @@ -23,7 +23,7 @@ const onNodeDragStop = (_: ReactMouseEvent, node: Node, nodes: Node[]) => consol const onNodeDoubleClick = (_: ReactMouseEvent, node: Node) => console.log('node double click', node); const onPaneClick = (event: ReactMouseEvent) => console.log('pane click', event); const onPaneScroll = (event?: ReactMouseEvent) => console.log('pane scroll', event); -const onPaneContextMenu = (event: ReactMouseEvent) => console.log('pane context menu', event); +const onPaneContextMenu = (event: ReactMouseEvent | MouseEvent) => console.log('pane context menu', event); const onSelectionDrag = (_: ReactMouseEvent, nodes: Node[]) => console.log('selection drag', nodes); const onSelectionDragStart = (_: ReactMouseEvent, nodes: Node[]) => console.log('selection drag start', nodes); const onSelectionDragStop = (_: ReactMouseEvent, nodes: Node[]) => console.log('selection drag stop', nodes); @@ -230,9 +230,9 @@ const OverviewFlow = () => { onEdgesDelete={onEdgesDelete} onPaneMouseMove={onPaneMouseMove} > - + - + ); }; diff --git a/examples/react/src/main.tsx b/examples/react/src/main.tsx index 663a29b5..4fdcd68a 100644 --- a/examples/react/src/main.tsx +++ b/examples/react/src/main.tsx @@ -1,7 +1,7 @@ import { StrictMode } from 'react'; import { createRoot } from 'react-dom/client'; -import App from './App'; +import App from './App/index'; import '@xyflow/react/dist/style.css'; import './index.css'; diff --git a/examples/svelte/src/components/Header/Header.svelte b/examples/svelte/src/components/Header/Header.svelte index fde20817..7d229796 100644 --- a/examples/svelte/src/components/Header/Header.svelte +++ b/examples/svelte/src/components/Header/Header.svelte @@ -4,6 +4,7 @@ const routes = [ 'add-node-on-drop', + 'colormode', 'custom-connection-line', 'customnode', 'dagre', diff --git a/examples/svelte/src/routes/examples/color-mode/+page.svelte b/examples/svelte/src/routes/examples/color-mode/+page.svelte new file mode 100644 index 00000000..59ddfdfd --- /dev/null +++ b/examples/svelte/src/routes/examples/color-mode/+page.svelte @@ -0,0 +1,54 @@ + + + + + + + + + + + diff --git a/examples/svelte/src/routes/examples/edges/+page.svelte b/examples/svelte/src/routes/examples/edges/+page.svelte index fc118333..403b0ef6 100644 --- a/examples/svelte/src/routes/examples/edges/+page.svelte +++ b/examples/svelte/src/routes/examples/edges/+page.svelte @@ -145,7 +145,7 @@ ]); - + diff --git a/packages/react/src/additional-components/Background/Patterns.tsx b/packages/react/src/additional-components/Background/Patterns.tsx index 1fc71ae5..61715c5a 100644 --- a/packages/react/src/additional-components/Background/Patterns.tsx +++ b/packages/react/src/additional-components/Background/Patterns.tsx @@ -26,6 +26,6 @@ type DotPatternProps = { export function DotPattern({ radius, className }: DotPatternProps) { return ( - + ); } diff --git a/packages/react/src/additional-components/MiniMap/MiniMap.tsx b/packages/react/src/additional-components/MiniMap/MiniMap.tsx index f56ae57f..33848836 100644 --- a/packages/react/src/additional-components/MiniMap/MiniMap.tsx +++ b/packages/react/src/additional-components/MiniMap/MiniMap.tsx @@ -1,6 +1,6 @@ /* eslint-disable @typescript-eslint/ban-ts-comment */ /* eslint-disable @typescript-eslint/no-explicit-any */ -import { memo, useEffect, useRef, type MouseEvent, useCallback } from 'react'; +import { memo, useEffect, useRef, type MouseEvent, useCallback, CSSProperties } from 'react'; import cc from 'classcat'; import { shallow } from 'zustand/shallow'; import { getNodesBounds, getBoundsOfRects, XYMinimap, type Rect, type XYMinimapInstance } from '@xyflow/system'; @@ -40,15 +40,15 @@ const ARIA_LABEL_KEY = 'react-flow__minimap-desc'; function MiniMap({ style, className, - nodeStrokeColor = 'transparent', - nodeColor = '#e2e2e2', + nodeStrokeColor, + nodeColor, nodeClassName = '', nodeBorderRadius = 5, - nodeStrokeWidth = 2, + nodeStrokeWidth, // We need to rename the prop to be `CapitalCase` so that JSX will render it as // a component properly. nodeComponent, - maskColor = 'rgb(240, 240, 240, 0.6)', + maskColor, maskStrokeColor = 'none', maskStrokeWidth = 1, position = 'bottom-right', @@ -126,7 +126,15 @@ function MiniMap({ return ( @@ -153,7 +161,6 @@ function MiniMap({ className="react-flow__minimap-mask" d={`M${x - offset},${y - offset}h${width + offset * 2}v${height + offset * 2}h${-width - offset * 2}z M${viewBB.x},${viewBB.y}h${viewBB.width}v${viewBB.height}h${-viewBB.width}z`} - fill={maskColor} fillRule="evenodd" stroke={maskStrokeColor} strokeWidth={maskStrokeWidth} diff --git a/packages/react/src/additional-components/MiniMap/MiniMapNode.tsx b/packages/react/src/additional-components/MiniMap/MiniMapNode.tsx index 5fe70462..76edf5e6 100644 --- a/packages/react/src/additional-components/MiniMap/MiniMapNode.tsx +++ b/packages/react/src/additional-components/MiniMap/MiniMapNode.tsx @@ -31,9 +31,11 @@ function MiniMapNode({ ry={borderRadius} width={width} height={height} - fill={fill} - stroke={strokeColor} - strokeWidth={strokeWidth} + style={{ + fill, + stroke: strokeColor, + strokeWidth, + }} shapeRendering={shapeRendering} onClick={onClick ? (event) => onClick(event, id) : undefined} /> diff --git a/packages/react/src/additional-components/MiniMap/MiniMapNodes.tsx b/packages/react/src/additional-components/MiniMap/MiniMapNodes.tsx index d72700a7..80ac09be 100644 --- a/packages/react/src/additional-components/MiniMap/MiniMapNodes.tsx +++ b/packages/react/src/additional-components/MiniMap/MiniMapNodes.tsx @@ -19,11 +19,11 @@ const selectorNodes = (s: ReactFlowState) => const getAttrFunction = (func: any): GetMiniMapNodeAttribute => (func instanceof Function ? func : () => func); function MiniMapNodes({ - nodeStrokeColor = 'transparent', - nodeColor = '#e2e2e2', + nodeStrokeColor, + nodeColor, nodeClassName = '', nodeBorderRadius = 5, - nodeStrokeWidth = 2, + nodeStrokeWidth, // We need to rename the prop to be `CapitalCase` so that JSX will render it as // a component properly. nodeComponent: NodeComponent = MiniMapNode, @@ -41,6 +41,8 @@ function MiniMapNodes({ <> {nodes.map((node) => { const { x, y } = getNodePositionWithOrigin(node, node.origin || nodeOrigin).positionAbsolute; + const color = nodeColor === undefined ? undefined : nodeColorFunc(node); + const strokeColor = nodeStrokeColor === undefined ? undefined : nodeStrokeColorFunc(node); return ( void; diff --git a/packages/react/src/container/ReactFlow/index.tsx b/packages/react/src/container/ReactFlow/index.tsx index d7995a53..1b3dc796 100644 --- a/packages/react/src/container/ReactFlow/index.tsx +++ b/packages/react/src/container/ReactFlow/index.tsx @@ -23,6 +23,7 @@ import A11yDescriptions from '../../components/A11yDescriptions'; import GraphView from '../GraphView'; import Wrapper from './Wrapper'; import type { EdgeTypes, NodeTypes, ReactFlowProps, ReactFlowRefType } from '../../types'; +import useColorModeClass from '../../hooks/useColorModeClass'; const defaultNodeTypes: NodeTypes = { input: InputNode, @@ -169,18 +170,20 @@ const ReactFlow = forwardRef( onViewportChange, width, height, + colorMode = 'light', ...rest }, ref ) => { const rfId = id || '1'; + const colorModeClassName = useColorModeClass(colorMode); return (
diff --git a/packages/react/src/hooks/useColorModeClass.ts b/packages/react/src/hooks/useColorModeClass.ts new file mode 100644 index 00000000..b66f8cea --- /dev/null +++ b/packages/react/src/hooks/useColorModeClass.ts @@ -0,0 +1,35 @@ +import { useEffect, useState } from 'react'; +import type { ColorMode, ColorModeClass } from '@xyflow/system'; + +function getMediaQuery() { + if (typeof window === 'undefined' || !window.matchMedia) { + return null; + } + + return window.matchMedia('(prefers-color-scheme: dark)'); +} + +export default function useColorModeClass(colorMode: ColorMode): ColorModeClass { + const [colorModeClass, setColorModeClass] = useState( + colorMode === 'system' ? null : colorMode + ); + + useEffect(() => { + if (colorMode !== 'system') { + setColorModeClass(colorMode); + return; + } + + const mediaQuery = getMediaQuery(); + const updateColorModeClass = () => setColorModeClass(mediaQuery?.matches ? 'dark' : 'light'); + + updateColorModeClass(); + mediaQuery?.addEventListener('change', updateColorModeClass); + + return () => { + mediaQuery?.removeEventListener('change', updateColorModeClass); + }; + }, [colorMode]); + + return colorModeClass !== null ? colorModeClass : getMediaQuery()?.matches ? 'dark' : 'light'; +} diff --git a/packages/react/src/index.ts b/packages/react/src/index.ts index be3de1b5..4fe922e5 100644 --- a/packages/react/src/index.ts +++ b/packages/react/src/index.ts @@ -73,6 +73,8 @@ export { type Box, type Transform, type CoordinateExtent, + type ColorMode, + type ColorModeClass, } from '@xyflow/system'; // system utils diff --git a/packages/react/src/styles/base.css b/packages/react/src/styles/base.css index d6be5b10..4a7281dc 100644 --- a/packages/react/src/styles/base.css +++ b/packages/react/src/styles/base.css @@ -1,3 +1,21 @@ /* this will be exported as base.css and can be used for a basic styling */ @import '../../../system/src/styles/init.css'; @import '../../../system/src/styles/base.css'; + +.react-flow { + --edge-label-background-color-default: #ffffff; + --edge-label-color-default: inherit; +} + +.react-flow.dark { + --edge-label-background-color-default: #141414; + --edge-label-color-default: #f8f8f8; +} + +.react-flow__edge-textbg { + fill: var(--edge-label-background-color, var(--edge-label-background-color-default)); +} + +.react-flow__edge-text { + fill: var(--edge-label-color, var(--edge-label-color-default)); +} diff --git a/packages/react/src/styles/style.css b/packages/react/src/styles/style.css index 406af4e9..2ff7f6c1 100644 --- a/packages/react/src/styles/style.css +++ b/packages/react/src/styles/style.css @@ -2,3 +2,21 @@ @import '../../../system/src/styles/init.css'; @import '../../../system/src/styles/style.css'; @import '../../../system/src/styles/node-resizer.css'; + +.react-flow { + --edge-label-background-color-default: #ffffff; + --edge-label-color-default: inherit; +} + +.react-flow.dark { + --edge-label-background-color-default: #141414; + --edge-label-color-default: #f8f8f8; +} + +.react-flow__edge-textbg { + fill: var(--edge-label-background-color, var(--edge-label-background-color-default)); +} + +.react-flow__edge-text { + fill: var(--edge-label-color, var(--edge-label-color-default)); +} diff --git a/packages/react/src/types/component-props.ts b/packages/react/src/types/component-props.ts index 583b3d86..770432f5 100644 --- a/packages/react/src/types/component-props.ts +++ b/packages/react/src/types/component-props.ts @@ -19,6 +19,7 @@ import type { SelectionMode, OnError, IsValidConnection, + ColorMode, } from '@xyflow/system'; import type { @@ -155,6 +156,7 @@ export type ReactFlowProps = Omit, 'onError'> & { nodeDragThreshold?: number; width?: number; height?: number; + colorMode?: ColorMode; }; export type ReactFlowRefType = HTMLDivElement; diff --git a/packages/svelte/src/lib/container/SvelteFlow/SvelteFlow.svelte b/packages/svelte/src/lib/container/SvelteFlow/SvelteFlow.svelte index 10c1751e..dd72ec3b 100644 --- a/packages/svelte/src/lib/container/SvelteFlow/SvelteFlow.svelte +++ b/packages/svelte/src/lib/container/SvelteFlow/SvelteFlow.svelte @@ -15,8 +15,14 @@ import { Attribution } from '$lib/components/Attribution'; import { key, useStore, createStoreContext } from '$lib/store'; import type { SvelteFlowProps } from './types'; - import { updateStore, updateStoreByKeys, type UpdatableStoreProps } from './utils'; + import { + updateStore, + updateStoreByKeys, + type UpdatableStoreProps, + getColorModeClass + } from './utils'; import { get } from 'svelte/store'; + import { useColorModeClass } from '$lib/hooks/useColorModeClass'; type $$Props = SvelteFlowProps; @@ -70,6 +76,7 @@ export let defaultEdgeOptions: $$Props['defaultEdgeOptions'] = undefined; export let width: $$Props['width'] = undefined; export let height: $$Props['height'] = undefined; + export let colorMode: $$Props['colorMode'] = 'light'; export let defaultMarkerColor = '#b1b1b7'; @@ -156,6 +163,8 @@ maxZoom, translateExtent }); + + $: colorModeClass = useColorModeClass(colorMode);
& { defaultEdgeOptions?: DefaultEdgeOptions; width?: number; height?: number; + colorMode?: ColorMode; class?: string; style?: string; diff --git a/packages/svelte/src/lib/container/SvelteFlow/utils.ts b/packages/svelte/src/lib/container/SvelteFlow/utils.ts index fe5a15aa..9abdb3e9 100644 --- a/packages/svelte/src/lib/container/SvelteFlow/utils.ts +++ b/packages/svelte/src/lib/container/SvelteFlow/utils.ts @@ -1,6 +1,6 @@ import type { SvelteFlowStore } from '$lib/store/types'; import type { EdgeTypes, NodeTypes } from '$lib/types'; -import type { CoordinateExtent } from '@xyflow/system'; +import type { ColorMode, CoordinateExtent } from '@xyflow/system'; import type { Writable } from 'svelte/store'; // this is helper function for updating the store @@ -77,3 +77,15 @@ export function updateStoreByKeys(store: SvelteFlowStore, keys: UpdatableStorePr } }); } + +export function getColorModeClass(colorMode?: ColorMode) { + if (colorMode !== 'system') { + return colorMode; + } + + if (!colorMode || typeof window === 'undefined' || !window.matchMedia) { + return 'light'; + } + + return window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light'; +} diff --git a/packages/svelte/src/lib/hooks/useColorModeClass.ts b/packages/svelte/src/lib/hooks/useColorModeClass.ts new file mode 100644 index 00000000..ad163a3f --- /dev/null +++ b/packages/svelte/src/lib/hooks/useColorModeClass.ts @@ -0,0 +1,32 @@ +import type { ColorMode, ColorModeClass } from '@xyflow/system'; +import { readable, type Readable } from 'svelte/store'; + +function getMediaQuery() { + if (typeof window === 'undefined' || !window.matchMedia) { + return null; + } + + return window.matchMedia('(prefers-color-scheme: dark)'); +} + +export function useColorModeClass(colorMode: ColorMode = 'light'): Readable { + const colorModeClass = readable('light', (set) => { + if (colorMode !== 'system') { + set(colorMode); + + return; + } + + const mediaQuery = getMediaQuery(); + const updateColorModeClass = () => set(mediaQuery?.matches ? 'dark' : 'light'); + + set(mediaQuery?.matches ? 'dark' : 'light'); + mediaQuery?.addEventListener('change', updateColorModeClass); + + return () => { + mediaQuery?.removeEventListener('change', updateColorModeClass); + }; + }); + + return colorModeClass; +} diff --git a/packages/svelte/src/lib/index.ts b/packages/svelte/src/lib/index.ts index 88bc483f..d9e0885f 100644 --- a/packages/svelte/src/lib/index.ts +++ b/packages/svelte/src/lib/index.ts @@ -75,7 +75,9 @@ export { type Rect, type Box, type Transform, - type CoordinateExtent + type CoordinateExtent, + type ColorMode, + type ColorModeClass } from '@xyflow/system'; // system utils diff --git a/packages/svelte/src/lib/plugins/Minimap/Minimap.svelte b/packages/svelte/src/lib/plugins/Minimap/Minimap.svelte index b331a04e..67f93698 100644 --- a/packages/svelte/src/lib/plugins/Minimap/Minimap.svelte +++ b/packages/svelte/src/lib/plugins/Minimap/Minimap.svelte @@ -20,7 +20,7 @@ export let position: $$Props['position'] = 'bottom-right'; export let ariaLabel: $$Props['ariaLabel'] = 'Mini map'; export let nodeStrokeColor: $$Props['nodeStrokeColor'] = 'transparent'; - export let nodeColor: $$Props['nodeColor'] = '#e2e2e2'; + export let nodeColor: $$Props['nodeColor'] = undefined; export let nodeClass: $$Props['nodeClass'] = ''; export let nodeBorderRadius: $$Props['nodeBorderRadius'] = 5; export let nodeStrokeWidth: $$Props['nodeStrokeWidth'] = 2; @@ -51,7 +51,7 @@ translateExtent } = useStore(); - const nodeColorFunc = getAttrFunction(nodeColor); + const nodeColorFunc = nodeColor === undefined ? undefined : getAttrFunction(nodeColor); const nodeStrokeColorFunc = getAttrFunction(nodeStrokeColor); const nodeClassFunc = getAttrFunction(nodeClass); const shapeRendering = @@ -122,7 +122,7 @@ width={node.computed?.width ?? node.width ?? 0} height={node.computed?.height ?? node.height ?? 0} selected={node.selected} - color={nodeColorFunc(node)} + color={nodeColorFunc?.(node)} borderRadius={nodeBorderRadius} strokeColor={nodeStrokeColorFunc(node)} strokeWidth={nodeStrokeWidth} @@ -142,27 +142,3 @@ {/if} - - diff --git a/packages/svelte/src/lib/plugins/Minimap/MinimapNode.svelte b/packages/svelte/src/lib/plugins/Minimap/MinimapNode.svelte index ff0b1f0a..b17165a0 100644 --- a/packages/svelte/src/lib/plugins/Minimap/MinimapNode.svelte +++ b/packages/svelte/src/lib/plugins/Minimap/MinimapNode.svelte @@ -6,9 +6,9 @@ export let width: number = 0; export let height: number = 0; export let borderRadius: number = 5; - export let color: string; + export let color: string | undefined = undefined; export let shapeRendering: string; - export let strokeColor: string; + export let strokeColor: string | undefined = undefined; export let strokeWidth: number = 2; export let selected: boolean = false; let className: string = ''; @@ -24,8 +24,8 @@ ry={borderRadius} {width} {height} - fill={color} - stroke={strokeColor} - stroke-width={strokeWidth} + style={`${color ? `fill: ${color};` : ''}${strokeColor ? `stroke: ${strokeColor};` : ''}${ + strokeWidth ? `stroke-width: ${strokeWidth};` : '' + }`} shape-rendering={shapeRendering} /> diff --git a/packages/svelte/src/styles/base.css b/packages/svelte/src/styles/base.css index 80bc953d..b9861c98 100644 --- a/packages/svelte/src/styles/base.css +++ b/packages/svelte/src/styles/base.css @@ -2,7 +2,16 @@ @import '../../../system/src/styles/init.css'; @import '../../../system/src/styles/base.css'; +.svelte-flow { + --edge-label-color-default: inherit; +} + +.svelte-flow.dark { + --edge-label-color-default: #f8f8f8; +} + .svelte-flow__edge-label { text-align: center; position: absolute; + color: var(--edge-label-color, var(--edge-label-color-default)); } diff --git a/packages/svelte/src/styles/style.css b/packages/svelte/src/styles/style.css index c65dc982..cd89ee84 100644 --- a/packages/svelte/src/styles/style.css +++ b/packages/svelte/src/styles/style.css @@ -2,10 +2,19 @@ @import '../../../system/src/styles/init.css'; @import '../../../system/src/styles/style.css'; +.svelte-flow { + --edge-label-color-default: inherit; +} + +.svelte-flow.dark { + --edge-label-color-default: #f8f8f8; +} + .svelte-flow__edge-label { text-align: center; position: absolute; font-size: 10px; + color: var(--edge-label-color, var(--edge-label-color-default)); } .svelte-flow__nodes { diff --git a/packages/system/src/styles/base.css b/packages/system/src/styles/base.css index 31afe71a..1cb026b6 100644 --- a/packages/system/src/styles/base.css +++ b/packages/system/src/styles/base.css @@ -8,6 +8,10 @@ --selection-border-default: 1px dotted rgba(155, 155, 155, 0.8); } +.xy-flow.dark { + --node-color-default: #f8f8f8; +} + .xy-flow__handle { background-color: var(--handle-background-color, var(--handle-background-color-default)); } @@ -17,6 +21,7 @@ .xy-flow__node-output, .xy-flow__node-group { border: var(--node-border, var(--node-border-default)); + color: var(--node-color, var(--node-color-default)); &.selected, &:focus, diff --git a/packages/system/src/styles/init.css b/packages/system/src/styles/init.css index 9fed0d7b..474b1322 100644 --- a/packages/system/src/styles/init.css +++ b/packages/system/src/styles/init.css @@ -11,12 +11,43 @@ --attribution-background-color-default: rgba(255, 255, 255, 0.5); --minimap-background-color-default: #fff; + --minimap-mask-background-color-default: rgb(240, 240, 240, 0.6); + --minimap-node-background-color-default: #e2e2e2; + --minimap-node-stroke-color-default: transparent; + --minimap-node-stroke-width-default: 2; - --background-pattern-dot-color-default: #91919a; - --background-pattern-line-color-default: #eee; + --background-color-default: transparent; + --background-pattern-dots-color-default: #91919a; + --background-pattern-lines-color-default: #eee; --background-pattern-cross-color-default: #e2e2e2; } +.xy-flow.dark { + --edge-stroke-default: #3c3c3c; + --edge-stroke-width-default: 1; + --edge-stroke-selected-default: #727272; + + --connectionline-stroke-default: #b1b1b7; + --connectionline-stroke-width-default: 1; + + --attribution-background-color-default: rgba(150, 150, 150, 0.25); + + --minimap-background-color-default: #141414; + --minimap-mask-background-color-default: rgb(60, 60, 60, 0.6); + --minimap-node-background-color-default: #2b2b2b; + --minimap-node-stroke-color-default: transparent; + --minimap-node-stroke-width-default: 2; + + --background-color-default: #141414; + --background-pattern-dots-color-default: #777; + --background-pattern-lines-color-default: #777; + --background-pattern-cross-color-default: #777; +} + +.xy-flow { + background-color: var(--background-color-props, var(--background-color-default, 'transparent')); +} + .xy-flow__container { position: absolute; width: 100%; @@ -108,16 +139,11 @@ pointer-events: all; } - &-textbg { - fill: white; - } - .xy-flow__edge-text { pointer-events: none; user-select: none; } } - .xy-flow__connection { pointer-events: none; @@ -268,26 +294,47 @@ .xy-flow__minimap { background: var(--minimap-background-color, var(--minimap-background-color-default)); + + &-mask { + fill: var( + --minimap-mask-background-color-props, + var(--minimap-mask-background-color, var(--minimap-mask-background-color-default)) + ); + } + + &-node { + fill: var( + --minimap-node-background-color-props, + var(--minimap-node-background-color, var(--minimap-node-background-color-default)) + ); + stroke: var( + --minimap-node-stroke-color-props, + var(--minimap-node-stroke-color, var(--minimap-node-stroke-color-default)) + ); + stroke-width: var( + --minimap-node-stroke-width-props, + var(--minimap-node-stroke-width, var(--minimap-node-stroke-width-default)) + ); + } } .xy-flow__background { pointer-events: none; z-index: -1; - background-color: var(--background-color-props, 'transparent'); } .xy-flow__background-pattern { &.dots { fill: var( --background-pattern-color-props, - var(--background-pattern-color, var(--background-pattern-dot-color-default)) + var(--background-pattern-color, var(--background-pattern-dots-color-default)) ); } &.lines { stroke: var( --background-pattern-color-props, - var(--background-pattern-color, var(--background-pattern-line-color-default)) + var(--background-pattern-color, var(--background-pattern-lines-color-default)) ); } @@ -312,6 +359,7 @@ width: 100%; max-width: 12px; max-height: 12px; + fill: currentColor; } } } diff --git a/packages/system/src/styles/style.css b/packages/system/src/styles/style.css index 99fa8876..e88cc3f1 100644 --- a/packages/system/src/styles/style.css +++ b/packages/system/src/styles/style.css @@ -5,6 +5,7 @@ --node-group-background-color-default: rgba(240, 240, 240, 0.25); --node-boxshadow-hover-default: 0 1px 4px 1px rgba(0, 0, 0, 0.08); --node-boxshadow-selected-default: 0 0 0 0.5px #1a192b; + --node-border-radius-default: 3px; --handle-background-color-default: #1a192b; --handle-border-color-default: #fff; @@ -20,6 +21,28 @@ --controls-box-shadow-default: 0 0 2px 1px rgba(0, 0, 0, 0.08); } +.xy-flow.dark { + --node-color-default: #f8f8f8; + --node-border-default: 1px solid #3c3c3c; + --node-background-color-default: #1e1e1e; + --node-group-background-color-default: rgba(240, 240, 240, 0.25); + --node-boxshadow-hover-default: 0 1px 4px 1px rgba(255, 255, 255, 0.08); + --node-boxshadow-selected-default: 0 0 0 0.5px #999; + + --handle-background-color-default: #bebebe; + --handle-border-color-default: #1e1e1e; + + --selection-background-color-default: rgba(200, 200, 220, 0.08); + --selection-border-default: 1px dotted rgba(200, 200, 220, 0.8); + + --controls-button-background-color-default: #2b2b2b; + --controls-button-background-color-hover-default: #3e3e3e; + --controls-button-color-default: #f8f8f8; + --controls-button-color-hover-default: #fff; + --controls-button-border-color-default: #5b5b5b; + --controls-box-shadow-default: 0 0 2px 1px rgba(0, 0, 0, 0.08); +} + .xy-flow__edge { &.updating { .xy-flow__edge-path { @@ -44,7 +67,7 @@ .xy-flow__node-output, .xy-flow__node-group { padding: 10px; - border-radius: 3px; + border-radius: var(--node-border-radius, var(--node-border-radius-default)); width: 150px; font-size: 12px; color: var(--node-color, var(--node-color-default)); @@ -110,7 +133,7 @@ ); color: var( --controls-button-color-hover-props, - var(--controls-button-hover-color, var(--controls-button-hover-color-default)) + var(--controls-button-color-hover, var(--controls-button-color-hover-default)) ); } @@ -122,4 +145,8 @@ } } } + + &-button:last-child { + border-bottom: none; + } } diff --git a/packages/system/src/types/general.ts b/packages/system/src/types/general.ts index bc86442d..22ad889e 100644 --- a/packages/system/src/types/general.ts +++ b/packages/system/src/types/general.ts @@ -136,3 +136,6 @@ export type UpdateConnection = (params: { connectionStartHandle: ConnectingHandle | null; connectionEndHandle: ConnectingHandle | null; }) => void; + +export type ColorModeClass = 'light' | 'dark'; +export type ColorMode = ColorModeClass | 'system'; diff --git a/tests/playwright/e2e/edges.spec.ts b/tests/playwright/e2e/edges.spec.ts index af2cf980..16695e63 100644 --- a/tests/playwright/e2e/edges.spec.ts +++ b/tests/playwright/e2e/edges.spec.ts @@ -2,7 +2,7 @@ import { test, expect } from '@playwright/test'; import { FRAMEWORK } from './constants'; -test.describe('EDGES', () => { +test.describe('Edges', () => { test.beforeEach(async ({ page }) => { // Go to the starting url before each test. await page.goto('/tests/generic/edges/general'); diff --git a/tests/playwright/e2e/node-toolbar.spec.ts b/tests/playwright/e2e/node-toolbar.spec.ts index daf76070..38722e16 100644 --- a/tests/playwright/e2e/node-toolbar.spec.ts +++ b/tests/playwright/e2e/node-toolbar.spec.ts @@ -1,4 +1,4 @@ -import { test, expect, Locator } from '@playwright/test'; +import { test, expect } from '@playwright/test'; import { FRAMEWORK } from './constants'; type Position = 'top' | 'right' | 'bottom' | 'left'; diff --git a/tests/playwright/e2e/nodes.spec.ts b/tests/playwright/e2e/nodes.spec.ts index 5afa41de..decd2c4f 100644 --- a/tests/playwright/e2e/nodes.spec.ts +++ b/tests/playwright/e2e/nodes.spec.ts @@ -2,7 +2,7 @@ import { test, expect, Locator } from '@playwright/test'; import { FRAMEWORK } from './constants'; -test.describe('NODES', () => { +test.describe('Nodes', () => { test.beforeEach(async ({ page }) => { // Go to the starting url before each test. await page.goto('/tests/generic/nodes/general'); diff --git a/tests/playwright/e2e/pane.spec.ts b/tests/playwright/e2e/pane.spec.ts index 15a79655..d4d66988 100644 --- a/tests/playwright/e2e/pane.spec.ts +++ b/tests/playwright/e2e/pane.spec.ts @@ -3,7 +3,7 @@ import { test, expect } from '@playwright/test'; import { FRAMEWORK } from './constants'; import { getTransform } from './utils'; -test.describe('PANE DEFAULT', () => { +test.describe('Pane default', () => { test.beforeEach(async ({ page }) => { // Go to the starting url before each test. await page.goto('/tests/generic/pane/general'); @@ -126,7 +126,7 @@ test.describe('PANE DEFAULT', () => { }); }); -test.describe('PANE NON-DEFAULT', () => { +test.describe('Pane non-default', () => { test.beforeEach(async ({ page }) => { // Go to the starting url before each test. await page.goto('/tests/generic/pane/non-defaults'); @@ -168,7 +168,7 @@ test.describe('PANE NON-DEFAULT', () => { }); }); -test.describe('PANE ACTIVATION KEYS', () => { +test.describe('Pane activation keys', () => { test.beforeEach(async ({ page }) => { // Go to the starting url before each test. await page.goto('/tests/generic/pane/activation-keys'); diff --git a/tests/playwright/e2e/props.spec.ts b/tests/playwright/e2e/props.spec.ts new file mode 100644 index 00000000..b8104633 --- /dev/null +++ b/tests/playwright/e2e/props.spec.ts @@ -0,0 +1,22 @@ +import { test, expect } from '@playwright/test'; + +import { FRAMEWORK } from './constants'; + +test.describe('Props', () => { + test.describe('colorMode', async () => { + test('render default light color mode', async ({ page }) => { + await page.goto('/examples/color-mode'); + const locator = page.locator(`.${FRAMEWORK}-flow`); + + await expect(locator).not.toHaveClass(/dark/); + }); + + test('render dark color mode', async ({ page }) => { + await page.goto('/examples/color-mode'); + const locator = page.locator(`.${FRAMEWORK}-flow`); + await page.getByTestId('colormode-select').selectOption({ label: 'dark' }); + + await expect(locator).toHaveClass(/dark/); + }); + }); +}); From 38b5051179413d1a2439621aefb10143e9f61fba Mon Sep 17 00:00:00 2001 From: moklick Date: Thu, 23 Nov 2023 12:49:06 +0100 Subject: [PATCH 066/608] feat(svelte): add on:selectionclick and on:selectioncontextmenu closes #3646 --- .../src/routes/examples/overview/+page.svelte | 2 ++ .../NodeSelection/NodeSelection.svelte | 17 +++++++++++++++++ .../lib/container/SvelteFlow/SvelteFlow.svelte | 2 +- 3 files changed, 20 insertions(+), 1 deletion(-) diff --git a/examples/svelte/src/routes/examples/overview/+page.svelte b/examples/svelte/src/routes/examples/overview/+page.svelte index dddbf398..68fd4aaa 100644 --- a/examples/svelte/src/routes/examples/overview/+page.svelte +++ b/examples/svelte/src/routes/examples/overview/+page.svelte @@ -174,6 +174,8 @@ event.preventDefault(); console.log('on edge contextmenu', edge); }} + on:selectionclick={(event) => console.log('on selection click', event)} + on:selectioncontextmenu={(event) => console.log('on selection contextmenu', event)} autoPanOnConnect autoPanOnNodeDrag connectionMode={ConnectionMode.Strict} diff --git a/packages/svelte/src/lib/components/NodeSelection/NodeSelection.svelte b/packages/svelte/src/lib/components/NodeSelection/NodeSelection.svelte index 98c48d8c..b314e2ad 100644 --- a/packages/svelte/src/lib/components/NodeSelection/NodeSelection.svelte +++ b/packages/svelte/src/lib/components/NodeSelection/NodeSelection.svelte @@ -1,15 +1,30 @@ {#if selectedNodes && $selectionRectMode === 'nodes'} @@ -17,6 +32,8 @@ class="selection-wrapper nopan" style="width: {bounds.width}px; height: {bounds.height}px; transform: translate({bounds.x}px, {bounds.y}px)" use:drag={{ disabled: false, store }} + on:contextmenu={onContextMenu} + on:click={onClick} >
diff --git a/packages/svelte/src/lib/container/SvelteFlow/SvelteFlow.svelte b/packages/svelte/src/lib/container/SvelteFlow/SvelteFlow.svelte index dd72ec3b..59bff1f4 100644 --- a/packages/svelte/src/lib/container/SvelteFlow/SvelteFlow.svelte +++ b/packages/svelte/src/lib/container/SvelteFlow/SvelteFlow.svelte @@ -223,7 +223,7 @@ on:nodedragstop on:nodecontextmenu /> - + From 1dfff1bf5bec36adce648219cec20f8b9c7b37a7 Mon Sep 17 00:00:00 2001 From: moklick Date: Thu, 23 Nov 2023 13:50:28 +0100 Subject: [PATCH 067/608] refactor(libs) add width, height and positionAbsolute props to NodeProps --- .../src/components/ReactFlowExample/CustomNode.tsx | 4 ++-- examples/react/src/examples/Subflow/DebugNode.tsx | 4 ++-- .../src/routes/examples/overview/CustomNode.svelte | 7 +++---- .../src/routes/examples/subflows/DebugNode.svelte | 14 +++----------- packages/react/src/components/Nodes/wrapNode.tsx | 6 ++++-- .../react/src/container/NodeRenderer/index.tsx | 1 + packages/react/src/types/nodes.ts | 3 ++- .../lib/components/NodeWrapper/NodeWrapper.svelte | 5 +++-- .../svelte/src/lib/components/NodeWrapper/types.ts | 4 ++-- .../src/lib/components/nodes/DefaultNode.svelte | 13 +++++++++---- .../src/lib/components/nodes/GroupNode.svelte | 13 +++++++++---- .../src/lib/components/nodes/InputNode.svelte | 13 +++++++++---- .../src/lib/components/nodes/OutputNode.svelte | 10 ++++++---- .../lib/container/NodeRenderer/NodeRenderer.svelte | 6 +++--- packages/system/src/types/nodes.ts | 5 +++-- packages/system/src/utils/graph.ts | 4 ++-- 16 files changed, 63 insertions(+), 49 deletions(-) diff --git a/examples/astro-xyflow/src/components/ReactFlowExample/CustomNode.tsx b/examples/astro-xyflow/src/components/ReactFlowExample/CustomNode.tsx index dc371239..86aef137 100644 --- a/examples/astro-xyflow/src/components/ReactFlowExample/CustomNode.tsx +++ b/examples/astro-xyflow/src/components/ReactFlowExample/CustomNode.tsx @@ -7,7 +7,7 @@ const sourceHandleStyleB: CSSProperties = { left: 'auto', }; -const CustomNode: FC = ({ data, xPos, yPos }) => { +const CustomNode: FC = ({ data, positionAbsolute }) => { return ( <> @@ -18,7 +18,7 @@ const CustomNode: FC = ({ data, xPos, yPos }) => {
Position:{' '} - {xPos.toFixed(2)},{yPos.toFixed(2)} + {positionAbsolute.x.toFixed(2)},{positionAbsolute.y.toFixed(2)}
diff --git a/examples/react/src/examples/Subflow/DebugNode.tsx b/examples/react/src/examples/Subflow/DebugNode.tsx index 9170ef65..46bae224 100644 --- a/examples/react/src/examples/Subflow/DebugNode.tsx +++ b/examples/react/src/examples/Subflow/DebugNode.tsx @@ -11,13 +11,13 @@ const idStyle: CSSProperties = { left: 2, }; -const DebugNode: FC = ({ zIndex, xPos, yPos, id }) => { +const DebugNode: FC = ({ zIndex, positionAbsolute, id }) => { return ( <>
{id}
- x:{Math.round(xPos || 0)} y:{Math.round(yPos || 0)} z:{zIndex} + x:{Math.round(positionAbsolute.x)} y:{Math.round(positionAbsolute.y)} z:{zIndex}
diff --git a/examples/svelte/src/routes/examples/overview/CustomNode.svelte b/examples/svelte/src/routes/examples/overview/CustomNode.svelte index a8f6a226..1197ce62 100644 --- a/examples/svelte/src/routes/examples/overview/CustomNode.svelte +++ b/examples/svelte/src/routes/examples/overview/CustomNode.svelte @@ -1,16 +1,15 @@
{data.label}
-
{~~xPos}, {~~yPos}
+
{~~positionAbsolute.x}, {~~positionAbsolute.y}
diff --git a/examples/svelte/src/routes/examples/subflows/DebugNode.svelte b/examples/svelte/src/routes/examples/subflows/DebugNode.svelte index 7b4434be..9676957e 100644 --- a/examples/svelte/src/routes/examples/subflows/DebugNode.svelte +++ b/examples/svelte/src/routes/examples/subflows/DebugNode.svelte @@ -1,24 +1,16 @@
{id}
- x:{Math.round(xPos || 0)} y:{Math.round(yPos || 0)} z:{zIndex} + x:{Math.round(positionAbsolute.x)} y:{Math.round(positionAbsolute.y)} z:{zIndex}
- - diff --git a/packages/react/src/components/Nodes/wrapNode.tsx b/packages/react/src/components/Nodes/wrapNode.tsx index ab56350b..cc1537d1 100644 --- a/packages/react/src/components/Nodes/wrapNode.tsx +++ b/packages/react/src/components/Nodes/wrapNode.tsx @@ -52,6 +52,7 @@ export default (NodeComponent: ComponentType) => { disableKeyboardA11y, ariaLabel, rfId, + positionAbsolute, width, height, }: WrapNodeProps) => { @@ -209,8 +210,9 @@ export default (NodeComponent: ComponentType) => { id={id} data={data} type={type} - xPos={xPos} - yPos={yPos} + width={width} + height={height} + positionAbsolute={positionAbsolute} selected={selected} isConnectable={isConnectable} sourcePosition={sourcePosition} diff --git a/packages/react/src/container/NodeRenderer/index.tsx b/packages/react/src/container/NodeRenderer/index.tsx index 3797bc45..73808da1 100644 --- a/packages/react/src/container/NodeRenderer/index.tsx +++ b/packages/react/src/container/NodeRenderer/index.tsx @@ -122,6 +122,7 @@ const NodeRenderer = (props: NodeRendererProps) => { yPos={posY} xPosOrigin={posOrigin.x} yPosOrigin={posOrigin.y} + positionAbsolute={clampedPosition || { x: 0, y: 0 }} onClick={props.onNodeClick} onMouseEnter={props.onNodeMouseEnter} onMouseMove={props.onNodeMouseMove} diff --git a/packages/react/src/types/nodes.ts b/packages/react/src/types/nodes.ts index ab691af5..29548666 100644 --- a/packages/react/src/types/nodes.ts +++ b/packages/react/src/types/nodes.ts @@ -1,5 +1,5 @@ import type { CSSProperties, MouseEvent as ReactMouseEvent } from 'react'; -import type { NodeBase } from '@xyflow/system'; +import type { NodeBase, XYPosition } from '@xyflow/system'; export type Node = NodeBase< NodeData, @@ -24,6 +24,7 @@ export type WrapNodeProps = Pick< yPos: number; xPosOrigin: number; yPosOrigin: number; + positionAbsolute: XYPosition; initialized: boolean; isSelectable: boolean; isDraggable: boolean; diff --git a/packages/svelte/src/lib/components/NodeWrapper/NodeWrapper.svelte b/packages/svelte/src/lib/components/NodeWrapper/NodeWrapper.svelte index 335bff71..9a73ffa8 100644 --- a/packages/svelte/src/lib/components/NodeWrapper/NodeWrapper.svelte +++ b/packages/svelte/src/lib/components/NodeWrapper/NodeWrapper.svelte @@ -191,8 +191,9 @@ {dragging} {dragHandle} isConnectable={connectable} - xPos={positionX} - yPos={positionY} + positionAbsolute={{ x: positionX, y: positionY }} + {width} + {height} on:connectstart on:connect on:connectend diff --git a/packages/svelte/src/lib/components/NodeWrapper/types.ts b/packages/svelte/src/lib/components/NodeWrapper/types.ts index 3da65c2f..39fb0c10 100644 --- a/packages/svelte/src/lib/components/NodeWrapper/types.ts +++ b/packages/svelte/src/lib/components/NodeWrapper/types.ts @@ -11,14 +11,14 @@ export type NodeWrapperProps = Pick< | 'selected' | 'selectable' | 'style' - | 'width' - | 'height' | 'type' | 'sourcePosition' | 'targetPosition' | 'dragHandle' | 'hidden' > & { + width?: number; + height?: number; type: string; positionX: number; positionY: number; diff --git a/packages/svelte/src/lib/components/nodes/DefaultNode.svelte b/packages/svelte/src/lib/components/nodes/DefaultNode.svelte index c802de0c..f4fc7270 100644 --- a/packages/svelte/src/lib/components/nodes/DefaultNode.svelte +++ b/packages/svelte/src/lib/components/nodes/DefaultNode.svelte @@ -11,24 +11,29 @@ // unused props - we need to list them here in order to prevent warnings export let id: $$Props['id'] = ''; + export let width: $$Props['width'] = undefined; + export let height: $$Props['height'] = undefined; export let selected: $$Props['selected'] = undefined; export let type: $$Props['type'] = undefined; export let zIndex: $$Props['zIndex'] = undefined; export let dragging: $$Props['dragging'] = false; export let dragHandle: $$Props['dragHandle'] = undefined; - export let xPos: $$Props['xPos'] = 0; - export let yPos: $$Props['yPos'] = 0; + export let positionAbsolute: $$Props['positionAbsolute'] = { + x: 0, + y: 0 + }; export let isConnectable: $$Props['isConnectable'] = undefined; // @todo: there must be a better way to do this id; + width; + height; selected; type; zIndex; dragging; dragHandle; - xPos; - yPos; + positionAbsolute; isConnectable; diff --git a/packages/svelte/src/lib/components/nodes/GroupNode.svelte b/packages/svelte/src/lib/components/nodes/GroupNode.svelte index cd11b299..22dd0754 100644 --- a/packages/svelte/src/lib/components/nodes/GroupNode.svelte +++ b/packages/svelte/src/lib/components/nodes/GroupNode.svelte @@ -5,6 +5,8 @@ // unused props - we need to list them here in order to prevent warnings export let id: $$Props['id'] = ''; + export let width: $$Props['width'] = undefined; + export let height: $$Props['height'] = undefined; export let data: $$Props['data'] = {}; export let selected: $$Props['selected'] = undefined; export let sourcePosition: $$Props['sourcePosition'] = undefined; @@ -13,12 +15,16 @@ export let zIndex: $$Props['zIndex'] = undefined; export let dragging: $$Props['dragging'] = false; export let dragHandle: $$Props['dragHandle'] = undefined; - export let xPos: $$Props['xPos'] = 0; - export let yPos: $$Props['yPos'] = 0; + export let positionAbsolute: $$Props['positionAbsolute'] = { + x: 0, + y: 0 + }; export let isConnectable: $$Props['isConnectable'] = undefined; // @todo: there must be a better way to do this id; + width; + height; data; selected; sourcePosition; @@ -27,7 +33,6 @@ zIndex; dragging; dragHandle; - xPos; - yPos; + positionAbsolute; isConnectable; diff --git a/packages/svelte/src/lib/components/nodes/InputNode.svelte b/packages/svelte/src/lib/components/nodes/InputNode.svelte index 71e40096..aa911d1c 100644 --- a/packages/svelte/src/lib/components/nodes/InputNode.svelte +++ b/packages/svelte/src/lib/components/nodes/InputNode.svelte @@ -10,26 +10,31 @@ // unused props - we need to list them here in order to prevent warnings export let id: $$Props['id'] = ''; + export let width: $$Props['width'] = undefined; + export let height: $$Props['height'] = undefined; export let selected: $$Props['selected'] = undefined; export let targetPosition: $$Props['targetPosition'] = undefined; export let type: $$Props['type'] = undefined; export let zIndex: $$Props['zIndex'] = undefined; export let dragging: $$Props['dragging'] = false; export let dragHandle: $$Props['dragHandle'] = undefined; - export let xPos: $$Props['xPos'] = 0; - export let yPos: $$Props['yPos'] = 0; + export let positionAbsolute: $$Props['positionAbsolute'] = { + x: 0, + y: 0 + }; export let isConnectable: $$Props['isConnectable'] = undefined; // @todo: there must be a better way to do this id; + width; + height; selected; targetPosition; type; zIndex; dragging; dragHandle; - xPos; - yPos; + positionAbsolute; isConnectable; diff --git a/packages/svelte/src/lib/components/nodes/OutputNode.svelte b/packages/svelte/src/lib/components/nodes/OutputNode.svelte index a9bde54b..b5ebc2b1 100644 --- a/packages/svelte/src/lib/components/nodes/OutputNode.svelte +++ b/packages/svelte/src/lib/components/nodes/OutputNode.svelte @@ -10,26 +10,28 @@ // unused props - we need to list them here in order to prevent warnings export let id: $$Props['id'] = ''; + export let width: $$Props['width'] = undefined; + export let height: $$Props['height'] = undefined; export let selected: $$Props['selected'] = undefined; export let sourcePosition: $$Props['sourcePosition'] = undefined; export let type: $$Props['type'] = undefined; export let zIndex: $$Props['zIndex'] = undefined; export let dragging: $$Props['dragging'] = false; export let dragHandle: $$Props['dragHandle'] = undefined; - export let xPos: $$Props['xPos'] = 0; - export let yPos: $$Props['yPos'] = 0; + export let positionAbsolute: $$Props['positionAbsolute'] = { x: 0, y: 0 }; export let isConnectable: $$Props['isConnectable'] = undefined; // @todo: there must be a better way to do this id; + width; + height; selected; sourcePosition; type; zIndex; dragging; dragHandle; - xPos; - yPos; + positionAbsolute; isConnectable; diff --git a/packages/svelte/src/lib/container/NodeRenderer/NodeRenderer.svelte b/packages/svelte/src/lib/container/NodeRenderer/NodeRenderer.svelte index 48ec792b..b4b05a1b 100644 --- a/packages/svelte/src/lib/container/NodeRenderer/NodeRenderer.svelte +++ b/packages/svelte/src/lib/container/NodeRenderer/NodeRenderer.svelte @@ -68,14 +68,14 @@ isParent={!!node[internalsSymbol]?.isParent} style={node.style} class={node.class} - type={node.type || 'default'} + type={node.type ?? 'default'} sourcePosition={node.sourcePosition} targetPosition={node.targetPosition} dragging={node.dragging} zIndex={node[internalsSymbol]?.z ?? 0} dragHandle={node.dragHandle} - width={node.width} - height={node.height} + width={node.width ?? undefined} + height={node.height ?? undefined} initialized={(!!node.computed?.width && !!node.computed?.height) || (!!node.width && !!node.height)} {resizeObserver} diff --git a/packages/system/src/types/nodes.ts b/packages/system/src/types/nodes.ts index 1e354a55..b55f3f54 100644 --- a/packages/system/src/types/nodes.ts +++ b/packages/system/src/types/nodes.ts @@ -52,8 +52,9 @@ export type NodeProps = { selected: NodeBase['selected']; isConnectable: NodeBase['connectable']; zIndex: NodeBase['zIndex']; - xPos: number; - yPos: number; + positionAbsolute: XYPosition; + width?: number; + height?: number; dragging: boolean; targetPosition?: Position; sourcePosition?: Position; diff --git a/packages/system/src/utils/graph.ts b/packages/system/src/utils/graph.ts index fe50e1be..6a946a10 100644 --- a/packages/system/src/utils/graph.ts +++ b/packages/system/src/utils/graph.ts @@ -254,8 +254,8 @@ export function calcNextPosition( ? [ [parentPos.x + nodeWidth * currNodeOrigin[0], parentPos.y + nodeHeight * currNodeOrigin[1]], [ - parentPos.x + parentNode.computed.width - nodeWidth + nodeWidth * currNodeOrigin[0], - parentPos.y + parentNode.computed.height - nodeHeight + nodeHeight * currNodeOrigin[1], + parentPos.x + (parentNode.computed?.width ?? 0) - nodeWidth + nodeWidth * currNodeOrigin[0], + parentPos.y + (parentNode.computed?.height ?? 0) - nodeHeight + nodeHeight * currNodeOrigin[1], ], ] : currentExtent; From 8fe8f73ed3d7fc2a14b2ecbefffb1b988b2edaf8 Mon Sep 17 00:00:00 2001 From: moklick Date: Thu, 23 Nov 2023 13:51:49 +0100 Subject: [PATCH 068/608] chore(svelte/system): bump --- packages/svelte/CHANGELOG.md | 15 +++++++++++++++ packages/svelte/package.json | 2 +- packages/system/package.json | 2 +- 3 files changed, 17 insertions(+), 2 deletions(-) diff --git a/packages/svelte/CHANGELOG.md b/packages/svelte/CHANGELOG.md index f32356f5..60674c25 100644 --- a/packages/svelte/CHANGELOG.md +++ b/packages/svelte/CHANGELOG.md @@ -1,3 +1,18 @@ +## 0.0.28 + +There are some breaking changes again (sorry!) but we are very close to the final API for Svelte Flow 1.0.0. The biggest change is that we group node attriubutes (`width`, `height`, `positionAbsolute`) that are added by the library under `node.computed`. This makes it easier to understand, that this stuff comes from the library itself. `node.width` and `node.height` is still an optional node option and can be used to set certain dimensions for SSR or on the client. + +- add `` component +- add `on:selectionclick` and `on:selectioncontextmenu` event handlers +- add `ondelete({ nodes, edges })` handler +- add `zoomActivationKey` prop +- add `width` and `height` prop to custom `NodeProps` type +- ⚠️ replace `xPos` and `yPos` with `positionAbsolute` prop to custom `NodeProps` type +- ⚠️ `node.width/height` and `node.positionAbsolute` can now be found under `node.computed.width/height/positionAbsolute` +- ⚠️ `node.width/height` is still optional an can be used for forcing certain dimensions and SSR +- refactor keys: you can now disable keys by setting them to `null` (e.g. `selectionKey={null}`) +- performance optimization with internal node lookup + ## 0.0.27 - add `selectionOnDrag` prop - can be used to create figma-like controls in combination with `panOnDrag={false}` / `panOnDrag={[1, 2]}` + `panOnScroll={true}` diff --git a/packages/svelte/package.json b/packages/svelte/package.json index 3beae0b8..5ed9f8e9 100644 --- a/packages/svelte/package.json +++ b/packages/svelte/package.json @@ -1,6 +1,6 @@ { "name": "@xyflow/svelte", - "version": "0.0.27", + "version": "0.0.28", "description": "Svelte Flow - A highly customizable Svelte library for building node-based editors, workflow systems, diagrams and more.", "keywords": [ "svelte", diff --git a/packages/system/package.json b/packages/system/package.json index d68f2a13..10729670 100644 --- a/packages/system/package.json +++ b/packages/system/package.json @@ -1,6 +1,6 @@ { "name": "@xyflow/system", - "version": "0.0.10", + "version": "0.0.11", "description": "xyflow core system that powers React Flow and Svelte Flow.", "keywords": [ "node-based UI", From 05bd2e866639853742682ad45eb611393e058607 Mon Sep 17 00:00:00 2001 From: Moritz Klack Date: Thu, 23 Nov 2023 13:58:34 +0100 Subject: [PATCH 069/608] chore(svelte): changelog --- packages/svelte/CHANGELOG.md | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/packages/svelte/CHANGELOG.md b/packages/svelte/CHANGELOG.md index 60674c25..12086a6a 100644 --- a/packages/svelte/CHANGELOG.md +++ b/packages/svelte/CHANGELOG.md @@ -1,12 +1,15 @@ ## 0.0.28 -There are some breaking changes again (sorry!) but we are very close to the final API for Svelte Flow 1.0.0. The biggest change is that we group node attriubutes (`width`, `height`, `positionAbsolute`) that are added by the library under `node.computed`. This makes it easier to understand, that this stuff comes from the library itself. `node.width` and `node.height` is still an optional node option and can be used to set certain dimensions for SSR or on the client. +This is a huge update! We added a new `` component and a new `colorMode` ('light' | 'dark' | 'system') prop for toggling dark/light mode. + +There are also some breaking changes again (sorry!) but we are very close to the final API for Svelte Flow 1.0.0. The biggest change is that we group node attriubutes (`width`, `height`, `positionAbsolute`) that are added by the library under `node.computed`. This makes it easier to understand, that this stuff comes from the library itself. `node.width` and `node.height` is still an optional node option and can be used to set certain dimensions for SSR or on the client. - add `` component - add `on:selectionclick` and `on:selectioncontextmenu` event handlers - add `ondelete({ nodes, edges })` handler - add `zoomActivationKey` prop - add `width` and `height` prop to custom `NodeProps` type +- add `colorMode` prop ('light' | 'dark' | 'system') - ⚠️ replace `xPos` and `yPos` with `positionAbsolute` prop to custom `NodeProps` type - ⚠️ `node.width/height` and `node.positionAbsolute` can now be found under `node.computed.width/height/positionAbsolute` - ⚠️ `node.width/height` is still optional an can be used for forcing certain dimensions and SSR @@ -159,4 +162,4 @@ This very first release comes with lots of features already: - draggable, selectable and deletable nodes - support for custom `nodeTypes` and `edgeTypes` - basic viewport settings like `fitView`, `minZoom` and `maxZoom` -- additional components: ``, `` & `` \ No newline at end of file +- additional components: ``, `` & `` From b0ca5a5bc9eccbe511153a3ed17c0ca55656d0e9 Mon Sep 17 00:00:00 2001 From: Ivan Akulov Date: Wed, 22 Nov 2023 18:50:15 +0100 Subject: [PATCH 070/608] Set nodeDragThreshold to 1 This removes an expensive `dragging: false` update on mouseup (with `dragging: true` never even dispatched) --- packages/react/src/store/initialState.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/react/src/store/initialState.ts b/packages/react/src/store/initialState.ts index 48e5434f..e0482961 100644 --- a/packages/react/src/store/initialState.ts +++ b/packages/react/src/store/initialState.ts @@ -61,7 +61,7 @@ const getInitialState = ({ paneDragging: false, noPanClassName: 'nopan', nodeOrigin: [0, 0], - nodeDragThreshold: 0, + nodeDragThreshold: 1, snapGrid: [15, 15], snapToGrid: false, From 24390162e08867a7c68c309a0ebcd52dafd6d425 Mon Sep 17 00:00:00 2001 From: Ivan Akulov Date: Thu, 23 Nov 2023 01:17:55 +0100 Subject: [PATCH 071/608] =?UTF-8?q?Store:=20don=E2=80=99t=20regenerate=20i?= =?UTF-8?q?nternal=20nodes=20if=20user-provided=20nodes=20haven=E2=80=99t?= =?UTF-8?q?=20changed?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/react/src/store/index.ts | 19 ++++++++++++------- packages/react/src/store/initialState.ts | 4 ++-- .../svelte/src/lib/store/initial-store.ts | 4 ++-- packages/svelte/src/lib/store/utils.ts | 4 ++-- packages/system/src/types/nodes.ts | 4 ++++ packages/system/src/utils/store.ts | 5 ++++- 6 files changed, 26 insertions(+), 14 deletions(-) diff --git a/packages/react/src/store/index.ts b/packages/react/src/store/index.ts index 0f50f385..49c7c688 100644 --- a/packages/react/src/store/index.ts +++ b/packages/react/src/store/index.ts @@ -2,7 +2,7 @@ import { createWithEqualityFn } from 'zustand/traditional'; import { clampPosition, fitView as fitViewSystem, - updateNodes, + adoptUserProvidedNodes, updateAbsolutePositions, panBy as panBySystem, Dimensions, @@ -42,11 +42,16 @@ const createRFStore = ({ ...getInitialState({ nodes, edges, width, height, fitView }), setNodes: (nodes: Node[]) => { const { nodeLookup, nodeOrigin, elevateNodesOnSelect } = get(); - // Whenver new nodes are set, we need to calculate the absolute positions of the nodes - // and update the nodeLookup. - const nextNodes = updateNodes(nodes, nodeLookup, { nodeOrigin, elevateNodesOnSelect }); + // setNodes() is called exclusively in response to user actions: + // - either when the `` prop is updated in the controlled ReactFlow setup, + // - or when the user calls something like `reactFlowInstance.setNodes()` in an uncontrolled ReactFlow setup. + // + // When this happens, we take the note objects passed by the user and extend them with fields + // relevant for internal React Flow operations. + // TODO: consider updating the types to reflect the distinction between user-provided nodes and internal nodes. + const nodesWithInternalData = adoptUserProvidedNodes(nodes, nodeLookup, { nodeOrigin, elevateNodesOnSelect }); - set({ nodes: nextNodes }); + set({ nodes: nodesWithInternalData }); }, setEdges: (edges: Edge[]) => { const { defaultEdgeOptions = {} } = get(); @@ -69,7 +74,7 @@ const createRFStore = ({ }; if (hasDefaultNodes) { - nextState.nodes = updateNodes(nodes, new Map(), { + nextState.nodes = adoptUserProvidedNodes(nodes, new Map(), { nodeOrigin: get().nodeOrigin, elevateNodesOnSelect: get().elevateNodesOnSelect, }); @@ -163,7 +168,7 @@ const createRFStore = ({ if (changes?.length) { if (hasDefaultNodes) { const updatedNodes = applyNodeChanges(changes, nodes); - const nextNodes = updateNodes(updatedNodes, nodeLookup, { + const nextNodes = adoptUserProvidedNodes(updatedNodes, nodeLookup, { nodeOrigin, elevateNodesOnSelect, }); diff --git a/packages/react/src/store/initialState.ts b/packages/react/src/store/initialState.ts index 48e5434f..d54ff61c 100644 --- a/packages/react/src/store/initialState.ts +++ b/packages/react/src/store/initialState.ts @@ -1,7 +1,7 @@ import { infiniteExtent, ConnectionMode, - updateNodes, + adoptUserProvidedNodes, getNodesBounds, getViewportForBounds, Transform, @@ -23,7 +23,7 @@ const getInitialState = ({ fitView?: boolean; } = {}): ReactFlowStore => { const nodeLookup = new Map(); - const nextNodes = updateNodes(nodes, nodeLookup, { nodeOrigin: [0, 0], elevateNodesOnSelect: false }); + const nextNodes = adoptUserProvidedNodes(nodes, nodeLookup, { nodeOrigin: [0, 0], elevateNodesOnSelect: false }); let transform: Transform = [0, 0, 1]; diff --git a/packages/svelte/src/lib/store/initial-store.ts b/packages/svelte/src/lib/store/initial-store.ts index dbbb17fc..a3ac2f1e 100644 --- a/packages/svelte/src/lib/store/initial-store.ts +++ b/packages/svelte/src/lib/store/initial-store.ts @@ -15,7 +15,7 @@ import { type OnError, devWarn, type Viewport, - updateNodes, + adoptUserProvidedNodes, getNodesBounds, getViewportForBounds } from '@xyflow/system'; @@ -68,7 +68,7 @@ export const getInitialStore = ({ fitView?: boolean; }) => { const nodeLookup = new Map(); - const nextNodes = updateNodes(nodes, nodeLookup, { + const nextNodes = adoptUserProvidedNodes(nodes, nodeLookup, { nodeOrigin: [0, 0], elevateNodesOnSelect: false }); diff --git a/packages/svelte/src/lib/store/utils.ts b/packages/svelte/src/lib/store/utils.ts index a11bf1f6..2d53ac90 100644 --- a/packages/svelte/src/lib/store/utils.ts +++ b/packages/svelte/src/lib/store/utils.ts @@ -6,7 +6,7 @@ import { type Writable, get } from 'svelte/store'; -import { updateNodes, type Viewport, type PanZoomInstance } from '@xyflow/system'; +import { adoptUserProvidedNodes, type Viewport, type PanZoomInstance } from '@xyflow/system'; import type { DefaultEdgeOptions, DefaultNodeOptions, Edge, Node } from '$lib/types'; @@ -133,7 +133,7 @@ export const createNodesStore = ( let elevateNodesOnSelect = true; const _set = (nds: Node[]): Node[] => { - const nextNodes = updateNodes(nds, nodeLookup, { + const nextNodes = adoptUserProvidedNodes(nds, nodeLookup, { elevateNodesOnSelect, defaults }); diff --git a/packages/system/src/types/nodes.ts b/packages/system/src/types/nodes.ts index b55f3f54..33884bf7 100644 --- a/packages/system/src/types/nodes.ts +++ b/packages/system/src/types/nodes.ts @@ -40,6 +40,10 @@ export type NodeBase z?: number; handleBounds?: NodeHandleBounds; isParent?: boolean; + /** Holds a reference to the original node object provided by the user + * (which may lack some fields, like `computed` or `[internalSymbol]`. Used + * as an optimization to avoid certain operations. */ + userProvidedNode: WeakRef; }; }; diff --git a/packages/system/src/utils/store.ts b/packages/system/src/utils/store.ts index eca6b8de..34d3d529 100644 --- a/packages/system/src/utils/store.ts +++ b/packages/system/src/utils/store.ts @@ -62,7 +62,7 @@ type UpdateNodesOptions = { defaults?: Partial; }; -export function updateNodes( +export function adoptUserProvidedNodes( nodes: NodeType[], nodeLookup: Map, options: UpdateNodesOptions = { @@ -76,6 +76,8 @@ export function updateNodes( const nextNodes = nodes.map((n) => { const currentStoreNode = nodeLookup.get(n.id); + if (n === currentStoreNode?.[internalsSymbol]?.userProvidedNode.deref()) return currentStoreNode; + const node: NodeType = { ...options.defaults, ...n, @@ -97,6 +99,7 @@ export function updateNodes( value: { handleBounds: currInternals?.handleBounds, z, + userProvidedNode: new WeakRef(n), }, }); From 99d945f33c9ebf84e24b460b89cafce087bbc710 Mon Sep 17 00:00:00 2001 From: Ivan Akulov Date: Thu, 23 Nov 2023 01:19:33 +0100 Subject: [PATCH 072/608] Split NodeRenderer into NodeRenderer and NodeComponentWrapper --- .../src/container/NodeRenderer/index.tsx | 174 ++++++++++++------ 1 file changed, 113 insertions(+), 61 deletions(-) diff --git a/packages/react/src/container/NodeRenderer/index.tsx b/packages/react/src/container/NodeRenderer/index.tsx index 73808da1..7c8137ca 100644 --- a/packages/react/src/container/NodeRenderer/index.tsx +++ b/packages/react/src/container/NodeRenderer/index.tsx @@ -76,74 +76,29 @@ const NodeRenderer = (props: NodeRendererProps) => { return (
{nodes.map((node) => { - let nodeType = node.type || 'default'; - - if (!props.nodeTypes[nodeType]) { - onError?.('003', errorMessages['error003'](nodeType)); - - nodeType = 'default'; - } - - const NodeComponent = (props.nodeTypes[nodeType] || props.nodeTypes.default) as ComponentType; - const isDraggable = !!(node.draggable || (nodesDraggable && typeof node.draggable === 'undefined')); - const isSelectable = !!(node.selectable || (elementsSelectable && typeof node.selectable === 'undefined')); - const isConnectable = !!(node.connectable || (nodesConnectable && typeof node.connectable === 'undefined')); - const isFocusable = !!(node.focusable || (nodesFocusable && typeof node.focusable === 'undefined')); - - const clampedPosition = props.nodeExtent - ? clampPosition(node.computed?.positionAbsolute, props.nodeExtent) - : node.computed?.positionAbsolute; - - const posX = clampedPosition?.x ?? 0; - const posY = clampedPosition?.y ?? 0; - const posOrigin = getPositionWithOrigin({ - x: posX, - y: posY, - width: node.computed?.width ?? node.width ?? 0, - height: node.computed?.height ?? node.height ?? 0, - origin: node.origin || props.nodeOrigin, - }); - const initialized = (!!node.computed?.width && !!node.computed?.height) || (!!node.width && !!node.height); - return ( -