diff --git a/.eslintrc.js b/.eslintrc.js index a007cb3ab..1bb2d9f2a 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -9,10 +9,6 @@ module.exports = { browser: true }, rules: { - 'max-lines': [ - 'warn', - { max: 500, skipBlankLines: true, skipComments: true } - ], 'no-console': 'off', 'prefer-const': 'off' }, diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index aae7a9d2c..f905d75ed 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -67,3 +67,9 @@ jobs: with: command: pnpm test:ci install: false + - name: Upload Coverage to Qlty + uses: qltysh/qlty-action/coverage@v2 + with: + token: ${{ secrets.QLTY_COVERAGE_TOKEN }} + files: shepherd.js/test/coverage/lcov.info + add-prefix: shepherd.js/ diff --git a/.tool-versions b/.tool-versions index c122b0b2e..62676b08b 100644 --- a/.tool-versions +++ b/.tool-versions @@ -1,2 +1,2 @@ -nodejs 20.19.0 -pnpm 10.17.1 +nodejs 22.22.0 +pnpm 10.28.2 diff --git a/package.json b/package.json index 3d394d96d..2274aa002 100644 --- a/package.json +++ b/package.json @@ -9,7 +9,7 @@ "license": "AGPL-3.0", "scripts": { "build": "pnpm -F shepherd.js build && pnpm -F '!shepherd.js' -F !landing -F !shepherd-docs build", - "cypress:install": "pnpm -F 'cypress-tests' cypress:install", + "cypress:install": "pnpm -F shepherd.js cypress:install", "dev": "pnpm watch", "lint": "pnpm -F '*' lint", "lint:fix": "pnpm -F '*' lint:fix", @@ -18,23 +18,26 @@ "lint:prettier:fix": "pnpm -F '*' lint:prettier:fix", "prepare": "pnpm -F shepherd.js build", "start": "pnpm watch", - "test:ci": "pnpm build && pnpm -F '*' test:ci", - "test:cy:watch": "pnpm -F cypress-tests test:watch", - "test:unit:watch": "pnpm -F unit-tests test:watch", + "test:ci": "pnpm build && pnpm -F shepherd.js test:ci", + "test:cy:ci": "pnpm -F shepherd.js test:cy:ci", + "test:cy:watch": "pnpm -F shepherd.js test:cy:watch", + "test:unit:ci": "pnpm -F shepherd.js test:unit:ci", + "test:unit:watch": "pnpm -F shepherd.js test:unit:watch", "types:check": "pnpm -F shepherd.js types:check", - "view-coverage": "pnpm -F unit-tests view-coverage", + "view-coverage": "pnpm -F shepherd.js view-coverage", "watch": "pnpm -F shepherd.js watch" }, "devDependencies": { "@babel/core": "^7.28.5", "@babel/preset-env": "^7.28.5", - "@typescript-eslint/eslint-plugin": "^7.18.0", - "@typescript-eslint/parser": "^7.18.0", + "@eslint/js": "^9.39.2", + "@typescript-eslint/eslint-plugin": "^8.54.0", + "@typescript-eslint/parser": "^8.54.0", "autoprefixer": "^10.4.23", "concurrently": "^9.2.1", "del": "^7.1.0", - "eslint": "^8.57.1", - "eslint-plugin-svelte": "^2.46.1", + "eslint": "^9.39.2", + "eslint-plugin-svelte": "^3.14.0", "postcss": "^8.5.6", "prettier": "3.3.3", "prettier-plugin-astro": "^0.14.1", @@ -45,9 +48,9 @@ "svelte": "^5.46.4", "typescript": "^5.9.3" }, - "packageManager": "pnpm@10.17.1", + "packageManager": "pnpm@10.28.2", "engines": { - "node": "18.* || >= 20" + "node": ">= 20" }, "authors": [ "Robbie Wagner ", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index aebd304d7..fc7d7acd0 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -14,12 +14,15 @@ importers: '@babel/preset-env': specifier: ^7.28.5 version: 7.28.5(@babel/core@7.28.5) + '@eslint/js': + specifier: ^9.39.2 + version: 9.39.2 '@typescript-eslint/eslint-plugin': - specifier: ^7.18.0 - version: 7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3) + specifier: ^8.54.0 + version: 8.54.0(@typescript-eslint/parser@8.54.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3))(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) '@typescript-eslint/parser': - specifier: ^7.18.0 - version: 7.18.0(eslint@8.57.1)(typescript@5.9.3) + specifier: ^8.54.0 + version: 8.54.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) autoprefixer: specifier: ^10.4.23 version: 10.4.23(postcss@8.5.6) @@ -30,11 +33,11 @@ importers: specifier: ^7.1.0 version: 7.1.0 eslint: - specifier: ^8.57.1 - version: 8.57.1 + specifier: ^9.39.2 + version: 9.39.2(jiti@1.21.7) eslint-plugin-svelte: - specifier: ^2.46.1 - version: 2.46.1(eslint@8.57.1)(svelte@5.46.4) + specifier: ^3.14.0 + version: 3.14.0(eslint@9.39.2(jiti@1.21.7))(svelte@5.46.4) postcss: specifier: ^8.5.6 version: 8.5.6 @@ -228,21 +231,69 @@ importers: '@rollup/plugin-terser': specifier: ^0.4.4 version: 0.4.4(rollup@4.54.0) + '@sveltejs/vite-plugin-svelte': + specifier: ^6.2.1 + version: 6.2.1(svelte@5.46.4)(vite@7.3.0(@types/node@25.0.3)(jiti@1.21.7)(terser@5.44.1)(yaml@2.8.2)) + '@testing-library/jest-dom': + specifier: ^6.4.8 + version: 6.9.1 + '@testing-library/svelte': + specifier: ^5.3.1 + version: 5.3.1(svelte@5.46.4)(vite@7.3.0(@types/node@25.0.3)(jiti@1.21.7)(terser@5.44.1)(yaml@2.8.2))(vitest@4.0.16) + '@vitest/coverage-v8': + specifier: ^4.0.16 + version: 4.0.16(vitest@4.0.16) + '@vitest/expect': + specifier: ^4.0.18 + version: 4.0.18 autoprefixer: specifier: ^10.4.23 version: 10.4.23(postcss@8.5.6) + chai: + specifier: ^6.2.0 + version: 6.2.2 cssnano: specifier: ^7.1.2 version: 7.1.2(postcss@8.5.6) + cypress: + specifier: ^14.5.4 + version: 14.5.4 + cypress-plugin-tab: + specifier: ^1.0.5 + version: 1.0.5 + del: + specifier: ^7.1.0 + version: 7.1.0 dts-bundle-generator: specifier: ^9.5.1 version: 9.5.1 + eslint: + specifier: ^9.39.2 + version: 9.39.2(jiti@1.21.7) + eslint-plugin-cypress: + specifier: ^5.2.1 + version: 5.2.1(eslint@9.39.2(jiti@1.21.7)) eslint-plugin-svelte: specifier: ^2.46.1 - version: 2.46.1(eslint@8.57.1)(svelte@5.46.4) + version: 2.46.1(eslint@9.39.2(jiti@1.21.7))(svelte@5.46.4) + eslint-plugin-vitest: + specifier: ^0.5.4 + version: 0.5.4(@typescript-eslint/eslint-plugin@8.54.0(@typescript-eslint/parser@8.54.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3))(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3))(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3)(vitest@4.0.16) execa: specifier: ^9.6.1 version: 9.6.1 + globals: + specifier: ^17.2.0 + version: 17.2.0 + happy-dom: + specifier: ^16.4.1 + version: 16.8.1 + http-server: + specifier: ^14.1.1 + version: 14.1.1 + lodash: + specifier: ^4.17.23 + version: 4.17.23 postcss: specifier: ^8.5.6 version: 8.5.6 @@ -258,6 +309,9 @@ importers: replace: specifier: ^1.2.2 version: 1.2.2 + resize-observer-polyfill: + specifier: ^1.5.1 + version: 1.5.1 rimraf: specifier: ^6.1.2 version: 6.1.2 @@ -288,9 +342,15 @@ importers: rollup-plugin-visualizer: specifier: ^5.14.0 version: 5.14.0(rollup@4.54.0) + start-server-and-test: + specifier: ^2.1.3 + version: 2.1.3 svelte: specifier: ^5.46.4 version: 5.46.4 + svelte-eslint-parser: + specifier: ^1.4.1 + version: 1.4.1(svelte@5.46.4) svelte-preprocess: specifier: ^6.0.3 version: 6.0.3(@babel/core@7.28.5)(postcss-load-config@6.0.1(jiti@1.21.7)(postcss@8.5.6)(yaml@2.8.2))(postcss@8.5.6)(svelte@5.46.4)(typescript@5.9.3) @@ -300,130 +360,9 @@ importers: typescript: specifier: ^5.9.3 version: 5.9.3 - - test/cypress: - dependencies: - shepherd.js: - specifier: workspace:* - version: link:../../shepherd.js - devDependencies: - '@babel/core': - specifier: ^7.28.4 - version: 7.28.5 - '@babel/preset-env': - specifier: ^7.28.3 - version: 7.28.5(@babel/core@7.28.5) - '@babel/preset-typescript': - specifier: ^7.27.1 - version: 7.28.5(@babel/core@7.28.5) - chai: - specifier: ^6.2.0 - version: 6.2.0 - cypress: - specifier: ^14.5.4 - version: 14.5.4 - cypress-plugin-tab: - specifier: ^1.0.5 - version: 1.0.5 - del: - specifier: ^7.1.0 - version: 7.1.0 - eslint: - specifier: ^8.57.1 - version: 8.57.1 - http-server: - specifier: ^14.1.1 - version: 14.1.1 - postcss: - specifier: ^8.5.6 - version: 8.5.6 - prettier: - specifier: ^3.6.2 - version: 3.6.2 - replace: - specifier: ^1.2.2 - version: 1.2.2 - start-server-and-test: - specifier: ^2.1.3 - version: 2.1.3 - typescript: - specifier: ^5.9.3 - version: 5.9.3 - - test/unit: - devDependencies: - '@floating-ui/dom': - specifier: ^1.6.10 - version: 1.7.4 - '@sveltejs/vite-plugin-svelte': - specifier: ^6.2.1 - version: 6.2.1(svelte@5.46.4)(vite@7.2.2(@types/node@25.0.3)(jiti@1.21.7)(terser@5.44.1)(yaml@2.8.2)) - '@testing-library/jest-dom': - specifier: ^6.4.8 - version: 6.9.1 - '@testing-library/svelte': - specifier: ^5.3.1 - version: 5.3.1(svelte@5.46.4)(vite@7.2.2(@types/node@25.0.3)(jiti@1.21.7)(terser@5.44.1)(yaml@2.8.2))(vitest@4.0.16) - '@vitest/coverage-v8': - specifier: ^4.0.16 - version: 4.0.16(vitest@4.0.16) - '@vitest/expect': - specifier: ^4.0.18 - version: 4.0.18 - autoprefixer: - specifier: ^10.4.22 - version: 10.4.22(postcss@8.5.6) - del: - specifier: ^7.1.0 - version: 7.1.0 - eslint: - specifier: ^8.57.1 - version: 8.57.1 - eslint-plugin-vitest: - specifier: ^0.5.4 - version: 0.5.4(@typescript-eslint/eslint-plugin@7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3)(vitest@4.0.16) - happy-dom: - specifier: ^16.4.1 - version: 16.8.1 - http-server: - specifier: ^14.1.1 - version: 14.1.1 - jsdom: - specifier: ^27.4.0 - version: 27.4.0 - lodash: - specifier: ^4.17.23 - version: 4.17.23 - postcss: - specifier: ^8.5.6 - version: 8.5.6 - prettier: - specifier: 3.3.3 - version: 3.3.3 - replace: - specifier: ^1.2.2 - version: 1.2.2 - resize-observer-polyfill: - specifier: ^1.5.1 - version: 1.5.1 - shepherd.js: - specifier: workspace:* - version: link:../../shepherd.js - start-server-and-test: - specifier: ^2.1.3 - version: 2.1.3 - svelte: - specifier: ^5.39.7 - version: 5.46.4 - svelte-preprocess: - specifier: ^6.0.3 - version: 6.0.3(@babel/core@7.28.5)(postcss-load-config@6.0.1(jiti@1.21.7)(postcss@8.5.6)(yaml@2.8.2))(postcss@8.5.6)(svelte@5.46.4)(typescript@5.9.3) - typescript: - specifier: ^5.9.3 - version: 5.9.3 vite: specifier: ^7.2.2 - version: 7.2.2(@types/node@25.0.3)(jiti@1.21.7)(terser@5.44.1)(yaml@2.8.2) + version: 7.3.0(@types/node@25.0.3)(jiti@1.21.7)(terser@5.44.1)(yaml@2.8.2) vitest: specifier: ^4.0.16 version: 4.0.16(@types/node@25.0.3)(@vitest/ui@4.0.16)(happy-dom@16.8.1)(jiti@1.21.7)(jsdom@27.4.0)(terser@5.44.1)(yaml@2.8.2) @@ -1488,17 +1427,43 @@ packages: peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + '@eslint-community/eslint-utils@4.9.1': + resolution: {integrity: sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + '@eslint-community/regexpp@4.12.2': resolution: {integrity: sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - '@eslint/eslintrc@2.1.4': - resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + '@eslint/config-array@0.21.1': + resolution: {integrity: sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/js@8.57.1': - resolution: {integrity: sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + '@eslint/config-helpers@0.4.2': + resolution: {integrity: sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/core@0.17.0': + resolution: {integrity: sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/eslintrc@3.3.3': + resolution: {integrity: sha512-Kr+LPIUVKz2qkx1HAMH8q1q6azbqBAsXJUxBl/ODDuVPX45Z9DfwB8tPjTi6nNZ8BuM3nbJxC5zCAg5elnBUTQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/js@9.39.2': + resolution: {integrity: sha512-q1mjIoW1VX4IvSocvM/vbTiveKC4k9eLrajNEuSsmjymSDEbpGddtpfOoN7YGAqBK3NG+uqo8ia4PDTt8buCYA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/object-schema@2.1.7': + resolution: {integrity: sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/plugin-kit@0.4.1': + resolution: {integrity: sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@exodus/bytes@1.8.0': resolution: {integrity: sha512-8JPn18Bcp8Uo1T82gR8lh2guEOa5KKU/IEKvvdp0sgmi7coPBWf1Doi1EXsGZb2ehc8ym/StJCjffYV+ne7sXQ==} @@ -1558,18 +1523,21 @@ packages: '@hapi/topo@6.0.2': resolution: {integrity: sha512-KR3rD5inZbGMrHmgPxsJ9dbi6zEK+C3ZwUwTa+eMwWLz7oijWUTWD2pMSNNYJAU6Qq+65NkxXjqHr/7LM2Xkqg==} - '@humanwhocodes/config-array@0.13.0': - resolution: {integrity: sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==} - engines: {node: '>=10.10.0'} - deprecated: Use @eslint/config-array instead + '@humanfs/core@0.19.1': + resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} + engines: {node: '>=18.18.0'} + + '@humanfs/node@0.16.7': + resolution: {integrity: sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==} + engines: {node: '>=18.18.0'} '@humanwhocodes/module-importer@1.0.1': resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} engines: {node: '>=12.22'} - '@humanwhocodes/object-schema@2.0.3': - resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} - deprecated: Use @eslint/object-schema instead + '@humanwhocodes/retry@0.4.3': + resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} + engines: {node: '>=18.18'} '@img/colour@1.0.0': resolution: {integrity: sha512-A5P/LfWGFSl6nsckYtjw9da+19jB8hkJ6ACTGcDfEJ0aE+l2n2El7dsVM7UVHZQ9s2lmYMWlrS21YLy2IR1LUw==} @@ -1601,89 +1569,105 @@ packages: resolution: {integrity: sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==} cpu: [arm64] os: [linux] + libc: [glibc] '@img/sharp-libvips-linux-arm@1.2.4': resolution: {integrity: sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==} cpu: [arm] os: [linux] + libc: [glibc] '@img/sharp-libvips-linux-ppc64@1.2.4': resolution: {integrity: sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==} cpu: [ppc64] os: [linux] + libc: [glibc] '@img/sharp-libvips-linux-riscv64@1.2.4': resolution: {integrity: sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==} cpu: [riscv64] os: [linux] + libc: [glibc] '@img/sharp-libvips-linux-s390x@1.2.4': resolution: {integrity: sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==} cpu: [s390x] os: [linux] + libc: [glibc] '@img/sharp-libvips-linux-x64@1.2.4': resolution: {integrity: sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==} cpu: [x64] os: [linux] + libc: [glibc] '@img/sharp-libvips-linuxmusl-arm64@1.2.4': resolution: {integrity: sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==} cpu: [arm64] os: [linux] + libc: [musl] '@img/sharp-libvips-linuxmusl-x64@1.2.4': resolution: {integrity: sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==} cpu: [x64] os: [linux] + libc: [musl] '@img/sharp-linux-arm64@0.34.5': resolution: {integrity: sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [linux] + libc: [glibc] '@img/sharp-linux-arm@0.34.5': resolution: {integrity: sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm] os: [linux] + libc: [glibc] '@img/sharp-linux-ppc64@0.34.5': resolution: {integrity: sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [ppc64] os: [linux] + libc: [glibc] '@img/sharp-linux-riscv64@0.34.5': resolution: {integrity: sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [riscv64] os: [linux] + libc: [glibc] '@img/sharp-linux-s390x@0.34.5': resolution: {integrity: sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [s390x] os: [linux] + libc: [glibc] '@img/sharp-linux-x64@0.34.5': resolution: {integrity: sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [linux] + libc: [glibc] '@img/sharp-linuxmusl-arm64@0.34.5': resolution: {integrity: sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [linux] + libc: [musl] '@img/sharp-linuxmusl-x64@0.34.5': resolution: {integrity: sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [linux] + libc: [musl] '@img/sharp-wasm32@0.34.5': resolution: {integrity: sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==} @@ -2187,56 +2171,67 @@ packages: resolution: {integrity: sha512-EHMUcDwhtdRGlXZsGSIuXSYwD5kOT9NVnx9sqzYiwAc91wfYOE1g1djOEDseZJKKqtHAHGwnGPQu3kytmfaXLQ==} cpu: [arm] os: [linux] + libc: [glibc] '@rollup/rollup-linux-arm-musleabihf@4.54.0': resolution: {integrity: sha512-+pBrqEjaakN2ySv5RVrj/qLytYhPKEUwk+e3SFU5jTLHIcAtqh2rLrd/OkbNuHJpsBgxsD8ccJt5ga/SeG0JmA==} cpu: [arm] os: [linux] + libc: [musl] '@rollup/rollup-linux-arm64-gnu@4.54.0': resolution: {integrity: sha512-NSqc7rE9wuUaRBsBp5ckQ5CVz5aIRKCwsoa6WMF7G01sX3/qHUw/z4pv+D+ahL1EIKy6Enpcnz1RY8pf7bjwng==} cpu: [arm64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-arm64-musl@4.54.0': resolution: {integrity: sha512-gr5vDbg3Bakga5kbdpqx81m2n9IX8M6gIMlQQIXiLTNeQW6CucvuInJ91EuCJ/JYvc+rcLLsDFcfAD1K7fMofg==} cpu: [arm64] os: [linux] + libc: [musl] '@rollup/rollup-linux-loong64-gnu@4.54.0': resolution: {integrity: sha512-gsrtB1NA3ZYj2vq0Rzkylo9ylCtW/PhpLEivlgWe0bpgtX5+9j9EZa0wtZiCjgu6zmSeZWyI/e2YRX1URozpIw==} cpu: [loong64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-ppc64-gnu@4.54.0': resolution: {integrity: sha512-y3qNOfTBStmFNq+t4s7Tmc9hW2ENtPg8FeUD/VShI7rKxNW7O4fFeaYbMsd3tpFlIg1Q8IapFgy7Q9i2BqeBvA==} cpu: [ppc64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-riscv64-gnu@4.54.0': resolution: {integrity: sha512-89sepv7h2lIVPsFma8iwmccN7Yjjtgz0Rj/Ou6fEqg3HDhpCa+Et+YSufy27i6b0Wav69Qv4WBNl3Rs6pwhebQ==} cpu: [riscv64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-riscv64-musl@4.54.0': resolution: {integrity: sha512-ZcU77ieh0M2Q8Ur7D5X7KvK+UxbXeDHwiOt/CPSBTI1fBmeDMivW0dPkdqkT4rOgDjrDDBUed9x4EgraIKoR2A==} cpu: [riscv64] os: [linux] + libc: [musl] '@rollup/rollup-linux-s390x-gnu@4.54.0': resolution: {integrity: sha512-2AdWy5RdDF5+4YfG/YesGDDtbyJlC9LHmL6rZw6FurBJ5n4vFGupsOBGfwMRjBYH7qRQowT8D/U4LoSvVwOhSQ==} cpu: [s390x] os: [linux] + libc: [glibc] '@rollup/rollup-linux-x64-gnu@4.54.0': resolution: {integrity: sha512-WGt5J8Ij/rvyqpFexxk3ffKqqbLf9AqrTBbWDk7ApGUzaIs6V+s2s84kAxklFwmMF/vBNGrVdYgbblCOFFezMQ==} cpu: [x64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-x64-musl@4.54.0': resolution: {integrity: sha512-JzQmb38ATzHjxlPHuTH6tE7ojnMKM2kYNzt44LO/jJi8BpceEC8QuXYA908n8r3CNuG/B3BV8VR3Hi1rYtmPiw==} cpu: [x64] os: [linux] + libc: [musl] '@rollup/rollup-openharmony-arm64@4.54.0': resolution: {integrity: sha512-huT3fd0iC7jigGh7n3q/+lfPcXxBi+om/Rs3yiFxjvSxbSB6aohDFXbWvlspaqjeOh+hx7DDHS+5Es5qRkWkZg==} @@ -2497,6 +2492,9 @@ packages: '@types/js-yaml@4.0.9': resolution: {integrity: sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg==} + '@types/json-schema@7.0.15': + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + '@types/mdast@4.0.4': resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==} @@ -2545,45 +2543,56 @@ packages: '@types/yauzl@2.10.3': resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==} - '@typescript-eslint/eslint-plugin@7.18.0': - resolution: {integrity: sha512-94EQTWZ40mzBc42ATNIBimBEDltSJ9RQHCC8vc/PDbxi4k8dVwUAv4o98dk50M1zB+JGFxp43FP7f8+FP8R6Sw==} - engines: {node: ^18.18.0 || >=20.0.0} + '@typescript-eslint/eslint-plugin@8.54.0': + resolution: {integrity: sha512-hAAP5io/7csFStuOmR782YmTthKBJ9ND3WVL60hcOjvtGFb+HJxH4O5huAcmcZ9v9G8P+JETiZ/G1B8MALnWZQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - '@typescript-eslint/parser': ^7.0.0 - eslint: ^8.56.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + '@typescript-eslint/parser': ^8.54.0 + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/parser@7.18.0': - resolution: {integrity: sha512-4Z+L8I2OqhZV8qA132M4wNL30ypZGYOQVBfMgxDH/K5UX0PNqTu1c6za9ST5r9+tavvHiTWmBnKzpCJ/GlVFtg==} - engines: {node: ^18.18.0 || >=20.0.0} + '@typescript-eslint/parser@8.54.0': + resolution: {integrity: sha512-BtE0k6cjwjLZoZixN0t5AKP0kSzlGu7FctRXYuPAm//aaiZhmfq1JwdYpYr1brzEspYyFeF+8XF5j2VK6oalrA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - eslint: ^8.56.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <6.0.0' + + '@typescript-eslint/project-service@8.54.0': + resolution: {integrity: sha512-YPf+rvJ1s7MyiWM4uTRhE4DvBXrEV+d8oC3P9Y2eT7S+HBS0clybdMIPnhiATi9vZOYDc7OQ1L/i6ga6NFYK/g==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.0.0' '@typescript-eslint/scope-manager@7.18.0': resolution: {integrity: sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA==} engines: {node: ^18.18.0 || >=20.0.0} - '@typescript-eslint/type-utils@7.18.0': - resolution: {integrity: sha512-XL0FJXuCLaDuX2sYqZUUSOJ2sG5/i1AAze+axqmLnSkNEVMVYLF+cbwlB2w8D1tinFuSikHmFta+P+HOofrLeA==} - engines: {node: ^18.18.0 || >=20.0.0} + '@typescript-eslint/scope-manager@8.54.0': + resolution: {integrity: sha512-27rYVQku26j/PbHYcVfRPonmOlVI6gihHtXFbTdB5sb6qA0wdAQAbyXFVarQ5t4HRojIz64IV90YtsjQSSGlQg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/tsconfig-utils@8.54.0': + resolution: {integrity: sha512-dRgOyT2hPk/JwxNMZDsIXDgyl9axdJI3ogZ2XWhBPsnZUv+hPesa5iuhdYt2gzwA9t8RE5ytOJ6xB0moV0Ujvw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - eslint: ^8.56.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + typescript: '>=4.8.4 <6.0.0' + + '@typescript-eslint/type-utils@8.54.0': + resolution: {integrity: sha512-hiLguxJWHjjwL6xMBwD903ciAwd7DmK30Y9Axs/etOkftC3ZNN9K44IuRD/EB08amu+Zw6W37x9RecLkOo3pMA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <6.0.0' '@typescript-eslint/types@7.18.0': resolution: {integrity: sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ==} engines: {node: ^18.18.0 || >=20.0.0} + '@typescript-eslint/types@8.54.0': + resolution: {integrity: sha512-PDUI9R1BVjqu7AUDsRBbKMtwmjWcn4J3le+5LpcFgWULN3LvHC5rkc9gCVxbrsrGmO1jfPybN5s6h4Jy+OnkAA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/typescript-estree@7.18.0': resolution: {integrity: sha512-aP1v/BSPnnyhMHts8cf1qQ6Q1IFwwRvAQGRvBFkWlo3/lH29OXA3Pts+c10nxRxIBrDnoMqzhgdwVe5f2D6OzA==} engines: {node: ^18.18.0 || >=20.0.0} @@ -2593,16 +2602,33 @@ packages: typescript: optional: true + '@typescript-eslint/typescript-estree@8.54.0': + resolution: {integrity: sha512-BUwcskRaPvTk6fzVWgDPdUndLjB87KYDrN5EYGetnktoeAvPtO4ONHlAZDnj5VFnUANg0Sjm7j4usBlnoVMHwA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.0.0' + '@typescript-eslint/utils@7.18.0': resolution: {integrity: sha512-kK0/rNa2j74XuHVcoCZxdFBMF+aq/vH83CXAOHieC+2Gis4mF8jJXT5eAfyD3K0sAxtPuwxaIOIOvhwzVDt/kw==} engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: eslint: ^8.56.0 + '@typescript-eslint/utils@8.54.0': + resolution: {integrity: sha512-9Cnda8GS57AQakvRyG0PTejJNlA2xhvyNtEVIMlDWOOeEyBkYWhGPnfrIAnqxLMTSTo6q8g12XVjjev5l1NvMA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <6.0.0' + '@typescript-eslint/visitor-keys@7.18.0': resolution: {integrity: sha512-cDF0/Gf81QpY3xYyJKDV14Zwdmid5+uuENhjH2EqFaF0ni+yAyq/LzMaIJdhNJXZI7uLzwIlA+V7oWoyn6Curg==} engines: {node: ^18.18.0 || >=20.0.0} + '@typescript-eslint/visitor-keys@8.54.0': + resolution: {integrity: sha512-VFlhGSl4opC0bprJiItPQ1RfUhGDIBokcPwaFH4yiBCaNPeld/9VeXbiPO1cLyorQi1G1vL+ecBk1x8o1axORA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@ungap/structured-clone@1.3.0': resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} @@ -2992,13 +3018,6 @@ packages: resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==} engines: {node: '>= 4.0.0'} - autoprefixer@10.4.22: - resolution: {integrity: sha512-ARe0v/t9gO28Bznv6GgqARmVqcWOV3mfgUPn9becPHMiD3o9BwlRgaeccZnwTpZ7Zwqrm+c1sUSsMxIzQzc8Xg==} - engines: {node: ^10 || ^12 || >=14} - hasBin: true - peerDependencies: - postcss: ^8.1.0 - autoprefixer@10.4.23: resolution: {integrity: sha512-YYTXSFulfwytnjAPlw8QHncHJmlvFKtczb8InXaAx9Q0LbfDnfEYDE55omerIJKihhmU61Ft+cAOSzQVaBUmeA==} engines: {node: ^10 || ^12 || >=14} @@ -3046,10 +3065,6 @@ packages: base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - baseline-browser-mapping@2.8.28: - resolution: {integrity: sha512-gYjt7OIqdM0PcttNYP2aVrr2G0bMALkBaoehD4BuRGjAOtipg0b6wHg1yNL+s5zSnLZZrGHOw4IrND8CD+3oIQ==} - hasBin: true - baseline-browser-mapping@2.9.11: resolution: {integrity: sha512-Sg0xJUNDU1sJNGdfGWhVHX0kkZ+HWcvmVymJbj6NSgZZmW/8S9Y2HQ5euytnIgakgxN6papOAWiwDo1ctFDcoQ==} hasBin: true @@ -3114,11 +3129,6 @@ packages: brotli@1.3.3: resolution: {integrity: sha512-oTKjJdShmDuGW94SyyaoQvAjf30dZaHnjJ8uAF+u2/vGJkJbJPJAT1gDiOJP5v1Zb6f9KEyW/1HpuaWIXtGHPg==} - browserslist@4.28.0: - resolution: {integrity: sha512-tbydkR/CxfMwelN0vwdP/pLkDwyAASZ+VfWm4EOwlB6SWhx1sYnWLqo8N5j0rAzPfzfRaxt0mM/4wPU/Su84RQ==} - engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} - hasBin: true - browserslist@4.28.1: resolution: {integrity: sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} @@ -3180,9 +3190,6 @@ packages: caniuse-api@3.0.0: resolution: {integrity: sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==} - caniuse-lite@1.0.30001755: - resolution: {integrity: sha512-44V+Jm6ctPj7R52Na4TLi3Zri4dWUljJd+RDm+j8LtNCc/ihLCT+X1TzoOAkRETEWqjuLnh9581Tl80FvK7jVA==} - caniuse-lite@1.0.30001761: resolution: {integrity: sha512-JF9ptu1vP2coz98+5051jZ4PwQgd2ni8A+gYSN7EA7dPKIMf0pDlSUxhdmVOaV3/fYK5uWBkgSXJaRLr4+3A6g==} @@ -3192,10 +3199,6 @@ packages: ccount@2.0.1: resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} - chai@6.2.0: - resolution: {integrity: sha512-aUTnJc/JipRzJrNADXVvpVqi6CO0dn3nx4EVPxijri+fj3LUUDyZQOgVeW54Ob3Y1Xh9Iz8f+CgaCl8v0mn9bA==} - engines: {node: '>=18'} - chai@6.2.2: resolution: {integrity: sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==} engines: {node: '>=18'} @@ -3699,10 +3702,6 @@ packages: dlv@1.1.3: resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} - doctrine@3.0.0: - resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} - engines: {node: '>=6.0.0'} - dom-accessibility-api@0.5.16: resolution: {integrity: sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==} @@ -3762,9 +3761,6 @@ packages: engines: {node: '>=0.10.0'} hasBin: true - electron-to-chromium@1.5.254: - resolution: {integrity: sha512-DcUsWpVhv9svsKRxnSCZ86SjD+sp32SGidNB37KpqXJncp1mfUgKbHvBomE89WJDbfVKw1mdv5+ikrvd43r+Bg==} - electron-to-chromium@1.5.267: resolution: {integrity: sha512-0Drusm6MVRXSOJpGbaSVgcQsuB4hEkMpHXaVstcPmhu5LIedxs1xNK/nIxmQIU/RPC0+1/o0AVZfBTkTNJOdUw==} @@ -3879,6 +3875,11 @@ packages: peerDependencies: eslint: '>=6.0.0' + eslint-plugin-cypress@5.2.1: + resolution: {integrity: sha512-HTJLbcd7fwJ4agbHinZ4FUIl38bUTJT3BmH8zdgS2V32LETmPqCtWHi3xlgZ2vpX0aW6kQoHCVVqHm8NxZJ9sA==} + peerDependencies: + eslint: '>=9' + eslint-plugin-svelte@2.46.1: resolution: {integrity: sha512-7xYr2o4NID/f9OEYMqxsEQsCsj4KaMy4q5sANaKkAb6/QeCjYFxRmDm2S3YC3A3pl1kyPZ/syOx/i7LcWYSbIw==} engines: {node: ^14.17.0 || >=16.0.0} @@ -3889,6 +3890,16 @@ packages: svelte: optional: true + eslint-plugin-svelte@3.14.0: + resolution: {integrity: sha512-Isw0GvaMm0yHxAj71edAdGFh28ufYs+6rk2KlbbZphnqZAzrH3Se3t12IFh2H9+1F/jlDhBBL4oiOJmLqmYX0g==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.1 || ^9.0.0 + svelte: ^3.37.0 || ^4.0.0 || ^5.0.0 + peerDependenciesMeta: + svelte: + optional: true + eslint-plugin-vitest@0.5.4: resolution: {integrity: sha512-um+odCkccAHU53WdKAw39MY61+1x990uXjSPguUCq3VcEHdqJrOb8OTMrbYlY6f9jAKx7x98kLVlIe3RJeJqoQ==} engines: {node: ^18.0.0 || >= 20.0.0} @@ -3906,19 +3917,35 @@ packages: resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + eslint-scope@8.4.0: + resolution: {integrity: sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + eslint-visitor-keys@3.4.3: resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - eslint@8.57.1: - resolution: {integrity: sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - deprecated: This version is no longer supported. Please see https://eslint.org/version-support for other options. + eslint-visitor-keys@4.2.1: + resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + eslint@9.39.2: + resolution: {integrity: sha512-LEyamqS7W5HB3ujJyvi0HQK/dtVINZvd5mAAp9eT5S/ujByGjiZLCzPcHVzuXbpJDJF/cxwHlfceVUDZ2lnSTw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} hasBin: true + peerDependencies: + jiti: '*' + peerDependenciesMeta: + jiti: + optional: true esm-env@1.2.2: resolution: {integrity: sha512-Epxrv+Nr/CaL4ZcFGPJIYLWFom+YeV1DqMLHJoEd9SYRxNbaFruBwfEX/kkHUJf55j2+TUbmDcmuilbP1TmXHA==} + espree@10.4.0: + resolution: {integrity: sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + espree@9.6.1: resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -4077,9 +4104,9 @@ packages: resolution: {integrity: sha512-d+l3qxjSesT4V7v2fh+QnmFnUWv9lSpjarhShNTgBOfA0ttejbQUAlHLitbjkoRiDulW0OPoQPYIGhIC8ohejg==} engines: {node: '>=18'} - file-entry-cache@6.0.1: - resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} - engines: {node: ^10.12.0 || >=12.0.0} + file-entry-cache@8.0.0: + resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} + engines: {node: '>=16.0.0'} file-set@5.3.0: resolution: {integrity: sha512-FKCxdjLX0J6zqTWdT0RXIxNF/n7MyXXnsSUp0syLEOCKdexvPZ02lNNv2a+gpK9E3hzUYF3+eFZe32ci7goNUg==} @@ -4121,9 +4148,9 @@ packages: resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} engines: {node: '>=10'} - flat-cache@3.2.0: - resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} - engines: {node: ^10.12.0 || >=12.0.0} + flat-cache@4.0.1: + resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} + engines: {node: '>=16'} flatted@3.3.3: resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==} @@ -4154,10 +4181,6 @@ packages: forever-agent@0.6.1: resolution: {integrity: sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==} - form-data@4.0.4: - resolution: {integrity: sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==} - engines: {node: '>= 6'} - form-data@4.0.5: resolution: {integrity: sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==} engines: {node: '>= 6'} @@ -4278,9 +4301,17 @@ packages: resolution: {integrity: sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==} engines: {node: '>=10'} - globals@13.24.0: - resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} - engines: {node: '>=8'} + globals@14.0.0: + resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} + engines: {node: '>=18'} + + globals@16.5.0: + resolution: {integrity: sha512-c/c15i26VrJ4IRt5Z89DnIzCGDn9EcebibhAOjw5ibqEHsE1wLUgkPn9RDmNcUKyU87GeaL633nyJ+pplFR2ZQ==} + engines: {node: '>=18'} + + globals@17.2.0: + resolution: {integrity: sha512-tovnCz/fEq+Ripoq+p/gN1u7l6A7wwkoBT9pRCzTHzsD/LvADIzXZdjmRymh5Ztf0DYC3Rwg5cZRYjxzBmzbWg==} + engines: {node: '>=18'} globby@11.1.0: resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} @@ -4300,9 +4331,6 @@ packages: graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} - graphemer@1.4.0: - resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} - gzip-size@6.0.0: resolution: {integrity: sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==} engines: {node: '>=10'} @@ -4526,6 +4554,10 @@ packages: resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} engines: {node: '>= 4'} + ignore@7.0.5: + resolution: {integrity: sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==} + engines: {node: '>= 4'} + import-cwd@3.0.0: resolution: {integrity: sha512-4pnzH16plW+hgvRECbDWpQl3cqtvSofHWh44met7ESfZ8UZOWWddm8hEyDTqREJ9RbYHY8gi8DqmaelApoOGMg==} engines: {node: '>=8'} @@ -4845,6 +4877,9 @@ packages: known-css-properties@0.35.0: resolution: {integrity: sha512-a/RAk2BfKk+WFGhhOCAYqSiFLc34k8Mt/6NWRI4joER0EYUzXIcFivjjnoD3+XU1DggLn/tZc3DOAgke7l8a4A==} + known-css-properties@0.37.0: + resolution: {integrity: sha512-JCDrsP4Z1Sb9JwG0aJ8Eo2r7k4Ou5MwmThS/6lcIe1ICyb7UBJKGRIUUdqc2ASdE/42lgz6zFUnzAIhtXnBVrQ==} + kolorist@1.8.0: resolution: {integrity: sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==} @@ -5418,10 +5453,6 @@ packages: resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} engines: {node: '>=0.10.0'} - normalize-range@0.1.2: - resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==} - engines: {node: '>=0.10.0'} - normalize-url@6.1.0: resolution: {integrity: sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==} engines: {node: '>=10'} @@ -6143,6 +6174,12 @@ packages: peerDependencies: postcss: ^8.3.3 + postcss-safe-parser@7.0.1: + resolution: {integrity: sha512-0AioNCJZ2DPYz5ABT6bddIqlhgwhpHZ/l65YAYo0BCIn0xiDpsnTHz0gnoTGk0OXZW0JRs+cDwL8u/teRdz+8A==} + engines: {node: '>=18.0'} + peerDependencies: + postcss: ^8.4.31 + postcss-scss@4.0.9: resolution: {integrity: sha512-AjKOeiwAitL/MXxQW2DliT28EKukvvbEWx3LBmJIRN8KfBGZbRTxNYW0kSqi1COiTZ57nZ9NW06S6ux//N1c9A==} engines: {node: '>=12.0'} @@ -6211,11 +6248,6 @@ packages: engines: {node: '>=14'} hasBin: true - prettier@3.6.2: - resolution: {integrity: sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==} - engines: {node: '>=14'} - hasBin: true - prettier@3.7.4: resolution: {integrity: sha512-v6UNi1+3hSlVvv8fSaoUbggEM5VErKmmpGA7Pl3HF8V6uKY7rvClBOJlH6yNwQtfTueNkGVpOv/mtWL9L4bgRA==} engines: {node: '>=14'} @@ -7009,6 +7041,15 @@ packages: svelte: optional: true + svelte-eslint-parser@1.4.1: + resolution: {integrity: sha512-1eqkfQ93goAhjAXxZiu1SaKI9+0/sxp4JIWQwUpsz7ybehRE5L8dNuz7Iry7K22R47p5/+s9EM+38nHV2OlgXA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0, pnpm: 10.24.0} + peerDependencies: + svelte: ^3.37.0 || ^4.0.0 || ^5.0.0 + peerDependenciesMeta: + svelte: + optional: true + svelte-preprocess@6.0.3: resolution: {integrity: sha512-PLG2k05qHdhmRG7zR/dyo5qKvakhm8IJ+hD2eFRQmMLHp7X3eJnjeupUtvuRpbNiF31RjVw45W+abDwHEmP5OA==} engines: {node: '>= 18.0.0'} @@ -7098,9 +7139,6 @@ packages: engines: {node: '>=10'} hasBin: true - text-table@0.2.0: - resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} - thenify-all@1.6.0: resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} engines: {node: '>=0.8'} @@ -7189,6 +7227,12 @@ packages: peerDependencies: typescript: '>=4.2.0' + ts-api-utils@2.4.0: + resolution: {integrity: sha512-3TaVTaAv2gTiMB35i3FiGJaRfwb3Pyn/j3m/bfAvGe8FB7CF6u+LMYqYlDh7reQf7UNvoTvdfAqHGmPGOSsPmA==} + engines: {node: '>=18.12'} + peerDependencies: + typescript: '>=4.8.4' + ts-interface-checker@0.1.13: resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} @@ -7456,12 +7500,6 @@ packages: resolution: {integrity: sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==} engines: {node: '>=8'} - update-browserslist-db@1.1.4: - resolution: {integrity: sha512-q0SPT4xyU84saUX+tomz1WLkxUbuaJnR1xWt17M7fJtEJigJeWUNGUqrauFXsHnqev9y9JTRGwk13tFBuKby4A==} - hasBin: true - peerDependencies: - browserslist: '>= 4.21.0' - update-browserslist-db@1.2.3: resolution: {integrity: sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==} hasBin: true @@ -7494,79 +7532,39 @@ packages: verror@1.10.0: resolution: {integrity: sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==} - engines: {'0': node >=0.6.0} - - vfile-location@5.0.3: - resolution: {integrity: sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg==} - - vfile-message@4.0.3: - resolution: {integrity: sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==} - - vfile@6.0.3: - resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} - - vite-plugin-dts@4.5.4: - resolution: {integrity: sha512-d4sOM8M/8z7vRXHHq/ebbblfaxENjogAAekcfcDCCwAyvGqnPrc7f4NZbvItS+g4WTgerW0xDwSz5qz11JT3vg==} - peerDependencies: - typescript: '*' - vite: '*' - peerDependenciesMeta: - vite: - optional: true - - vite@6.4.1: - resolution: {integrity: sha512-+Oxm7q9hDoLMyJOYfUYBuHQo+dkAloi33apOPP56pzj+vsdJDzr+j1NISE5pyaAuKL4A3UD34qd0lx5+kfKp2g==} - engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} - hasBin: true - peerDependencies: - '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 - jiti: '>=1.21.0' - less: '*' - lightningcss: ^1.21.0 - sass: '*' - sass-embedded: '*' - stylus: '*' - sugarss: '*' - terser: ^5.16.0 - tsx: ^4.8.1 - yaml: ^2.4.2 - peerDependenciesMeta: - '@types/node': - optional: true - jiti: - optional: true - less: - optional: true - lightningcss: - optional: true - sass: - optional: true - sass-embedded: - optional: true - stylus: - optional: true - sugarss: - optional: true - terser: - optional: true - tsx: - optional: true - yaml: + engines: {'0': node >=0.6.0} + + vfile-location@5.0.3: + resolution: {integrity: sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg==} + + vfile-message@4.0.3: + resolution: {integrity: sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==} + + vfile@6.0.3: + resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} + + vite-plugin-dts@4.5.4: + resolution: {integrity: sha512-d4sOM8M/8z7vRXHHq/ebbblfaxENjogAAekcfcDCCwAyvGqnPrc7f4NZbvItS+g4WTgerW0xDwSz5qz11JT3vg==} + peerDependencies: + typescript: '*' + vite: '*' + peerDependenciesMeta: + vite: optional: true - vite@7.2.2: - resolution: {integrity: sha512-BxAKBWmIbrDgrokdGZH1IgkIk/5mMHDreLDmCJ0qpyJaAteP8NvMhkwr/ZCQNqNH97bw/dANTE9PDzqwJghfMQ==} - engines: {node: ^20.19.0 || >=22.12.0} + vite@6.4.1: + resolution: {integrity: sha512-+Oxm7q9hDoLMyJOYfUYBuHQo+dkAloi33apOPP56pzj+vsdJDzr+j1NISE5pyaAuKL4A3UD34qd0lx5+kfKp2g==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} hasBin: true peerDependencies: - '@types/node': ^20.19.0 || >=22.12.0 + '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 jiti: '>=1.21.0' - less: ^4.0.0 + less: '*' lightningcss: ^1.21.0 - sass: ^1.70.0 - sass-embedded: ^1.70.0 - stylus: '>=0.54.8' - sugarss: ^5.0.0 + sass: '*' + sass-embedded: '*' + stylus: '*' + sugarss: '*' terser: ^5.16.0 tsx: ^4.8.1 yaml: ^2.4.2 @@ -8084,7 +8082,8 @@ packages: snapshots: - '@acemir/cssom@0.9.31': {} + '@acemir/cssom@0.9.31': + optional: true '@adobe/css-tools@4.4.4': {} @@ -8120,6 +8119,7 @@ snapshots: '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) '@csstools/css-tokenizer': 3.0.4 lru-cache: 11.2.4 + optional: true '@asamuzakjp/dom-selector@6.7.6': dependencies: @@ -8128,8 +8128,10 @@ snapshots: css-tree: 3.1.0 is-potential-custom-element-name: 1.0.1 lru-cache: 11.2.4 + optional: true - '@asamuzakjp/nwsapi@2.3.9': {} + '@asamuzakjp/nwsapi@2.3.9': + optional: true '@astrojs/check@0.9.5(prettier-plugin-astro@0.14.1)(prettier@3.7.4)(typescript@5.9.3)': dependencies: @@ -9073,12 +9075,14 @@ snapshots: '@colors/colors@1.5.0': optional: true - '@csstools/color-helpers@5.1.0': {} + '@csstools/color-helpers@5.1.0': + optional: true '@csstools/css-calc@2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4)': dependencies: '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) '@csstools/css-tokenizer': 3.0.4 + optional: true '@csstools/css-color-parser@3.1.0(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4)': dependencies: @@ -9086,14 +9090,18 @@ snapshots: '@csstools/css-calc': 2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) '@csstools/css-tokenizer': 3.0.4 + optional: true '@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4)': dependencies: '@csstools/css-tokenizer': 3.0.4 + optional: true - '@csstools/css-syntax-patches-for-csstree@1.0.25': {} + '@csstools/css-syntax-patches-for-csstree@1.0.25': + optional: true - '@csstools/css-tokenizer@3.0.4': {} + '@csstools/css-tokenizer@3.0.4': + optional: true '@ctrl/tinycolor@4.2.0': {} @@ -9105,7 +9113,7 @@ snapshots: combined-stream: 1.0.8 extend: 3.0.2 forever-agent: 0.6.1 - form-data: 4.0.4 + form-data: 4.0.5 http-signature: 1.4.0 is-typedarray: 1.0.0 isstream: 0.1.2 @@ -9314,19 +9322,40 @@ snapshots: '@esbuild/win32-x64@0.27.2': optional: true - '@eslint-community/eslint-utils@4.9.0(eslint@8.57.1)': + '@eslint-community/eslint-utils@4.9.0(eslint@9.39.2(jiti@1.21.7))': + dependencies: + eslint: 9.39.2(jiti@1.21.7) + eslint-visitor-keys: 3.4.3 + + '@eslint-community/eslint-utils@4.9.1(eslint@9.39.2(jiti@1.21.7))': dependencies: - eslint: 8.57.1 + eslint: 9.39.2(jiti@1.21.7) eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.12.2': {} - '@eslint/eslintrc@2.1.4': + '@eslint/config-array@0.21.1': + dependencies: + '@eslint/object-schema': 2.1.7 + debug: 4.4.3(supports-color@8.1.1) + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + + '@eslint/config-helpers@0.4.2': + dependencies: + '@eslint/core': 0.17.0 + + '@eslint/core@0.17.0': + dependencies: + '@types/json-schema': 7.0.15 + + '@eslint/eslintrc@3.3.3': dependencies: ajv: 6.12.6 debug: 4.4.3(supports-color@8.1.1) - espree: 9.6.1 - globals: 13.24.0 + espree: 10.4.0 + globals: 14.0.0 ignore: 5.3.2 import-fresh: 3.3.1 js-yaml: 4.1.1 @@ -9335,9 +9364,17 @@ snapshots: transitivePeerDependencies: - supports-color - '@eslint/js@8.57.1': {} + '@eslint/js@9.39.2': {} - '@exodus/bytes@1.8.0': {} + '@eslint/object-schema@2.1.7': {} + + '@eslint/plugin-kit@0.4.1': + dependencies: + '@eslint/core': 0.17.0 + levn: 0.4.1 + + '@exodus/bytes@1.8.0': + optional: true '@expressive-code/core@0.40.2': dependencies: @@ -9404,17 +9441,16 @@ snapshots: dependencies: '@hapi/hoek': 11.0.7 - '@humanwhocodes/config-array@0.13.0': + '@humanfs/core@0.19.1': {} + + '@humanfs/node@0.16.7': dependencies: - '@humanwhocodes/object-schema': 2.0.3 - debug: 4.4.3(supports-color@8.1.1) - minimatch: 3.1.2 - transitivePeerDependencies: - - supports-color + '@humanfs/core': 0.19.1 + '@humanwhocodes/retry': 0.4.3 '@humanwhocodes/module-importer@1.0.1': {} - '@humanwhocodes/object-schema@2.0.3': {} + '@humanwhocodes/retry@0.4.3': {} '@img/colour@1.0.0': {} @@ -10243,24 +10279,24 @@ snapshots: dependencies: acorn: 8.15.0 - '@sveltejs/vite-plugin-svelte-inspector@5.0.1(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.46.4)(vite@7.2.2(@types/node@25.0.3)(jiti@1.21.7)(terser@5.44.1)(yaml@2.8.2)))(svelte@5.46.4)(vite@7.2.2(@types/node@25.0.3)(jiti@1.21.7)(terser@5.44.1)(yaml@2.8.2))': + '@sveltejs/vite-plugin-svelte-inspector@5.0.1(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.46.4)(vite@7.3.0(@types/node@25.0.3)(jiti@1.21.7)(terser@5.44.1)(yaml@2.8.2)))(svelte@5.46.4)(vite@7.3.0(@types/node@25.0.3)(jiti@1.21.7)(terser@5.44.1)(yaml@2.8.2))': dependencies: - '@sveltejs/vite-plugin-svelte': 6.2.1(svelte@5.46.4)(vite@7.2.2(@types/node@25.0.3)(jiti@1.21.7)(terser@5.44.1)(yaml@2.8.2)) + '@sveltejs/vite-plugin-svelte': 6.2.1(svelte@5.46.4)(vite@7.3.0(@types/node@25.0.3)(jiti@1.21.7)(terser@5.44.1)(yaml@2.8.2)) debug: 4.4.3(supports-color@8.1.1) svelte: 5.46.4 - vite: 7.2.2(@types/node@25.0.3)(jiti@1.21.7)(terser@5.44.1)(yaml@2.8.2) + vite: 7.3.0(@types/node@25.0.3)(jiti@1.21.7)(terser@5.44.1)(yaml@2.8.2) transitivePeerDependencies: - supports-color - '@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.46.4)(vite@7.2.2(@types/node@25.0.3)(jiti@1.21.7)(terser@5.44.1)(yaml@2.8.2))': + '@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.46.4)(vite@7.3.0(@types/node@25.0.3)(jiti@1.21.7)(terser@5.44.1)(yaml@2.8.2))': dependencies: - '@sveltejs/vite-plugin-svelte-inspector': 5.0.1(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.46.4)(vite@7.2.2(@types/node@25.0.3)(jiti@1.21.7)(terser@5.44.1)(yaml@2.8.2)))(svelte@5.46.4)(vite@7.2.2(@types/node@25.0.3)(jiti@1.21.7)(terser@5.44.1)(yaml@2.8.2)) + '@sveltejs/vite-plugin-svelte-inspector': 5.0.1(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.46.4)(vite@7.3.0(@types/node@25.0.3)(jiti@1.21.7)(terser@5.44.1)(yaml@2.8.2)))(svelte@5.46.4)(vite@7.3.0(@types/node@25.0.3)(jiti@1.21.7)(terser@5.44.1)(yaml@2.8.2)) debug: 4.4.3(supports-color@8.1.1) deepmerge: 4.3.1 magic-string: 0.30.21 svelte: 5.46.4 - vite: 7.2.2(@types/node@25.0.3)(jiti@1.21.7)(terser@5.44.1)(yaml@2.8.2) - vitefu: 1.1.1(vite@7.2.2(@types/node@25.0.3)(jiti@1.21.7)(terser@5.44.1)(yaml@2.8.2)) + vite: 7.3.0(@types/node@25.0.3)(jiti@1.21.7)(terser@5.44.1)(yaml@2.8.2) + vitefu: 1.1.1(vite@7.3.0(@types/node@25.0.3)(jiti@1.21.7)(terser@5.44.1)(yaml@2.8.2)) transitivePeerDependencies: - supports-color @@ -10306,13 +10342,13 @@ snapshots: dependencies: svelte: 5.46.4 - '@testing-library/svelte@5.3.1(svelte@5.46.4)(vite@7.2.2(@types/node@25.0.3)(jiti@1.21.7)(terser@5.44.1)(yaml@2.8.2))(vitest@4.0.16)': + '@testing-library/svelte@5.3.1(svelte@5.46.4)(vite@7.3.0(@types/node@25.0.3)(jiti@1.21.7)(terser@5.44.1)(yaml@2.8.2))(vitest@4.0.16)': dependencies: '@testing-library/dom': 10.4.1 '@testing-library/svelte-core': 1.0.0(svelte@5.46.4) svelte: 5.46.4 optionalDependencies: - vite: 7.2.2(@types/node@25.0.3)(jiti@1.21.7)(terser@5.44.1)(yaml@2.8.2) + vite: 7.3.0(@types/node@25.0.3)(jiti@1.21.7)(terser@5.44.1)(yaml@2.8.2) vitest: 4.0.16(@types/node@25.0.3)(@vitest/ui@4.0.16)(happy-dom@16.8.1)(jiti@1.21.7)(jsdom@27.4.0)(terser@5.44.1)(yaml@2.8.2) '@tootallnate/once@1.1.2': {} @@ -10380,6 +10416,8 @@ snapshots: '@types/js-yaml@4.0.9': {} + '@types/json-schema@7.0.15': {} + '@types/mdast@4.0.4': dependencies: '@types/unist': 3.0.3 @@ -10427,33 +10465,39 @@ snapshots: '@types/node': 25.0.3 optional: true - '@typescript-eslint/eslint-plugin@7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3)': + '@typescript-eslint/eslint-plugin@8.54.0(@typescript-eslint/parser@8.54.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3))(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3)': dependencies: '@eslint-community/regexpp': 4.12.2 - '@typescript-eslint/parser': 7.18.0(eslint@8.57.1)(typescript@5.9.3) - '@typescript-eslint/scope-manager': 7.18.0 - '@typescript-eslint/type-utils': 7.18.0(eslint@8.57.1)(typescript@5.9.3) - '@typescript-eslint/utils': 7.18.0(eslint@8.57.1)(typescript@5.9.3) - '@typescript-eslint/visitor-keys': 7.18.0 - eslint: 8.57.1 - graphemer: 1.4.0 - ignore: 5.3.2 + '@typescript-eslint/parser': 8.54.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) + '@typescript-eslint/scope-manager': 8.54.0 + '@typescript-eslint/type-utils': 8.54.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) + '@typescript-eslint/utils': 8.54.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) + '@typescript-eslint/visitor-keys': 8.54.0 + eslint: 9.39.2(jiti@1.21.7) + ignore: 7.0.5 natural-compare: 1.4.0 - ts-api-utils: 1.4.3(typescript@5.9.3) - optionalDependencies: + ts-api-utils: 2.4.0(typescript@5.9.3) typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.9.3)': + '@typescript-eslint/parser@8.54.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3)': dependencies: - '@typescript-eslint/scope-manager': 7.18.0 - '@typescript-eslint/types': 7.18.0 - '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.9.3) - '@typescript-eslint/visitor-keys': 7.18.0 + '@typescript-eslint/scope-manager': 8.54.0 + '@typescript-eslint/types': 8.54.0 + '@typescript-eslint/typescript-estree': 8.54.0(typescript@5.9.3) + '@typescript-eslint/visitor-keys': 8.54.0 + debug: 4.4.3(supports-color@8.1.1) + eslint: 9.39.2(jiti@1.21.7) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/project-service@8.54.0(typescript@5.9.3)': + dependencies: + '@typescript-eslint/tsconfig-utils': 8.54.0(typescript@5.9.3) + '@typescript-eslint/types': 8.54.0 debug: 4.4.3(supports-color@8.1.1) - eslint: 8.57.1 - optionalDependencies: typescript: 5.9.3 transitivePeerDependencies: - supports-color @@ -10463,20 +10507,31 @@ snapshots: '@typescript-eslint/types': 7.18.0 '@typescript-eslint/visitor-keys': 7.18.0 - '@typescript-eslint/type-utils@7.18.0(eslint@8.57.1)(typescript@5.9.3)': + '@typescript-eslint/scope-manager@8.54.0': dependencies: - '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.9.3) - '@typescript-eslint/utils': 7.18.0(eslint@8.57.1)(typescript@5.9.3) + '@typescript-eslint/types': 8.54.0 + '@typescript-eslint/visitor-keys': 8.54.0 + + '@typescript-eslint/tsconfig-utils@8.54.0(typescript@5.9.3)': + dependencies: + typescript: 5.9.3 + + '@typescript-eslint/type-utils@8.54.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3)': + dependencies: + '@typescript-eslint/types': 8.54.0 + '@typescript-eslint/typescript-estree': 8.54.0(typescript@5.9.3) + '@typescript-eslint/utils': 8.54.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) debug: 4.4.3(supports-color@8.1.1) - eslint: 8.57.1 - ts-api-utils: 1.4.3(typescript@5.9.3) - optionalDependencies: + eslint: 9.39.2(jiti@1.21.7) + ts-api-utils: 2.4.0(typescript@5.9.3) typescript: 5.9.3 transitivePeerDependencies: - supports-color '@typescript-eslint/types@7.18.0': {} + '@typescript-eslint/types@8.54.0': {} + '@typescript-eslint/typescript-estree@7.18.0(typescript@5.9.3)': dependencies: '@typescript-eslint/types': 7.18.0 @@ -10492,22 +10547,53 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@7.18.0(eslint@8.57.1)(typescript@5.9.3)': + '@typescript-eslint/typescript-estree@8.54.0(typescript@5.9.3)': + dependencies: + '@typescript-eslint/project-service': 8.54.0(typescript@5.9.3) + '@typescript-eslint/tsconfig-utils': 8.54.0(typescript@5.9.3) + '@typescript-eslint/types': 8.54.0 + '@typescript-eslint/visitor-keys': 8.54.0 + debug: 4.4.3(supports-color@8.1.1) + minimatch: 9.0.5 + semver: 7.7.3 + tinyglobby: 0.2.15 + ts-api-utils: 2.4.0(typescript@5.9.3) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/utils@7.18.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3)': dependencies: - '@eslint-community/eslint-utils': 4.9.0(eslint@8.57.1) + '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.2(jiti@1.21.7)) '@typescript-eslint/scope-manager': 7.18.0 '@typescript-eslint/types': 7.18.0 '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.9.3) - eslint: 8.57.1 + eslint: 9.39.2(jiti@1.21.7) transitivePeerDependencies: - supports-color - typescript + '@typescript-eslint/utils@8.54.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3)': + dependencies: + '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.2(jiti@1.21.7)) + '@typescript-eslint/scope-manager': 8.54.0 + '@typescript-eslint/types': 8.54.0 + '@typescript-eslint/typescript-estree': 8.54.0(typescript@5.9.3) + eslint: 9.39.2(jiti@1.21.7) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + '@typescript-eslint/visitor-keys@7.18.0': dependencies: '@typescript-eslint/types': 7.18.0 eslint-visitor-keys: 3.4.3 + '@typescript-eslint/visitor-keys@8.54.0': + dependencies: + '@typescript-eslint/types': 8.54.0 + eslint-visitor-keys: 4.2.1 + '@ungap/structured-clone@1.3.0': {} '@vercel/analytics@1.6.1(react@19.2.4)(svelte@5.46.4)': @@ -10637,7 +10723,7 @@ snapshots: sirv: 3.0.2 tinyglobby: 0.2.15 tinyrainbow: 3.0.3 - vitest: 4.0.16(@types/node@25.0.3)(@vitest/ui@4.0.16)(happy-dom@20.0.11)(jiti@1.21.7)(jsdom@27.4.0)(terser@5.44.1)(yaml@2.8.2) + vitest: 4.0.16(@types/node@25.0.3)(@vitest/ui@4.0.16)(happy-dom@16.8.1)(jiti@1.21.7)(jsdom@27.4.0)(terser@5.44.1)(yaml@2.8.2) '@vitest/utils@4.0.16': dependencies: @@ -11058,16 +11144,6 @@ snapshots: at-least-node@1.0.0: {} - autoprefixer@10.4.22(postcss@8.5.6): - dependencies: - browserslist: 4.28.0 - caniuse-lite: 1.0.30001755 - fraction.js: 5.3.4 - normalize-range: 0.1.2 - picocolors: 1.1.1 - postcss: 8.5.6 - postcss-value-parser: 4.2.0 - autoprefixer@10.4.23(postcss@8.5.6): dependencies: browserslist: 4.28.1 @@ -11123,8 +11199,6 @@ snapshots: base64-js@1.5.1: {} - baseline-browser-mapping@2.8.28: {} - baseline-browser-mapping@2.9.11: {} basic-auth@2.0.1: @@ -11148,6 +11222,7 @@ snapshots: bidi-js@1.0.3: dependencies: require-from-string: 2.0.2 + optional: true binary-extensions@2.3.0: {} @@ -11204,14 +11279,6 @@ snapshots: dependencies: base64-js: 1.5.1 - browserslist@4.28.0: - dependencies: - baseline-browser-mapping: 2.8.28 - caniuse-lite: 1.0.30001755 - electron-to-chromium: 1.5.254 - node-releases: 2.0.27 - update-browserslist-db: 1.1.4(browserslist@4.28.0) - browserslist@4.28.1: dependencies: baseline-browser-mapping: 2.9.11 @@ -11319,16 +11386,12 @@ snapshots: lodash.memoize: 4.1.2 lodash.uniq: 4.5.0 - caniuse-lite@1.0.30001755: {} - caniuse-lite@1.0.30001761: {} caseless@0.12.0: {} ccount@2.0.1: {} - chai@6.2.0: {} - chai@6.2.2: {} chalk-template@0.4.0: @@ -11713,6 +11776,7 @@ snapshots: '@csstools/css-syntax-patches-for-csstree': 1.0.25 css-tree: 3.1.0 lru-cache: 11.2.4 + optional: true csstype@3.2.3: {} @@ -11754,7 +11818,7 @@ snapshots: is-installed-globally: 0.4.0 lazy-ass: 1.6.0 listr2: 3.14.0(enquirer@2.4.1) - lodash: 4.17.21 + lodash: 4.17.23 log-symbols: 4.1.0 minimist: 1.2.8 ospath: 1.2.2 @@ -11777,6 +11841,7 @@ snapshots: dependencies: whatwg-mimetype: 4.0.0 whatwg-url: 15.1.0 + optional: true dayjs@1.11.19: {} @@ -11796,7 +11861,8 @@ snapshots: decamelize@1.2.0: {} - decimal.js@10.6.0: {} + decimal.js@10.6.0: + optional: true decode-named-character-reference@1.2.0: dependencies: @@ -11867,10 +11933,6 @@ snapshots: dlv@1.1.3: {} - doctrine@3.0.0: - dependencies: - esutils: 2.0.3 - dom-accessibility-api@0.5.16: {} dom-accessibility-api@0.6.3: {} @@ -11937,8 +11999,6 @@ snapshots: dependencies: jake: 10.9.4 - electron-to-chromium@1.5.254: {} - electron-to-chromium@1.5.267: {} emmet@2.4.11: @@ -12081,17 +12141,22 @@ snapshots: escape-string-regexp@5.0.0: {} - eslint-compat-utils@0.5.1(eslint@8.57.1): + eslint-compat-utils@0.5.1(eslint@9.39.2(jiti@1.21.7)): dependencies: - eslint: 8.57.1 + eslint: 9.39.2(jiti@1.21.7) semver: 7.7.3 - eslint-plugin-svelte@2.46.1(eslint@8.57.1)(svelte@5.46.4): + eslint-plugin-cypress@5.2.1(eslint@9.39.2(jiti@1.21.7)): dependencies: - '@eslint-community/eslint-utils': 4.9.0(eslint@8.57.1) + eslint: 9.39.2(jiti@1.21.7) + globals: 16.5.0 + + eslint-plugin-svelte@2.46.1(eslint@9.39.2(jiti@1.21.7))(svelte@5.46.4): + dependencies: + '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.2(jiti@1.21.7)) '@jridgewell/sourcemap-codec': 1.5.5 - eslint: 8.57.1 - eslint-compat-utils: 0.5.1(eslint@8.57.1) + eslint: 9.39.2(jiti@1.21.7) + eslint-compat-utils: 0.5.1(eslint@9.39.2(jiti@1.21.7)) esutils: 2.0.3 known-css-properties: 0.35.0 postcss: 8.5.6 @@ -12105,12 +12170,30 @@ snapshots: transitivePeerDependencies: - ts-node - eslint-plugin-vitest@0.5.4(@typescript-eslint/eslint-plugin@7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3)(vitest@4.0.16): + eslint-plugin-svelte@3.14.0(eslint@9.39.2(jiti@1.21.7))(svelte@5.46.4): + dependencies: + '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.2(jiti@1.21.7)) + '@jridgewell/sourcemap-codec': 1.5.5 + eslint: 9.39.2(jiti@1.21.7) + esutils: 2.0.3 + globals: 16.5.0 + known-css-properties: 0.37.0 + postcss: 8.5.6 + postcss-load-config: 3.1.4(postcss@8.5.6) + postcss-safe-parser: 7.0.1(postcss@8.5.6) + semver: 7.7.3 + svelte-eslint-parser: 1.4.1(svelte@5.46.4) + optionalDependencies: + svelte: 5.46.4 + transitivePeerDependencies: + - ts-node + + eslint-plugin-vitest@0.5.4(@typescript-eslint/eslint-plugin@8.54.0(@typescript-eslint/parser@8.54.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3))(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3))(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3)(vitest@4.0.16): dependencies: - '@typescript-eslint/utils': 7.18.0(eslint@8.57.1)(typescript@5.9.3) - eslint: 8.57.1 + '@typescript-eslint/utils': 7.18.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) + eslint: 9.39.2(jiti@1.21.7) optionalDependencies: - '@typescript-eslint/eslint-plugin': 7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3) + '@typescript-eslint/eslint-plugin': 8.54.0(@typescript-eslint/parser@8.54.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3))(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) vitest: 4.0.16(@types/node@25.0.3)(@vitest/ui@4.0.16)(happy-dom@16.8.1)(jiti@1.21.7)(jsdom@27.4.0)(terser@5.44.1)(yaml@2.8.2) transitivePeerDependencies: - supports-color @@ -12121,53 +12204,64 @@ snapshots: esrecurse: 4.3.0 estraverse: 5.3.0 + eslint-scope@8.4.0: + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + eslint-visitor-keys@3.4.3: {} - eslint@8.57.1: + eslint-visitor-keys@4.2.1: {} + + eslint@9.39.2(jiti@1.21.7): dependencies: - '@eslint-community/eslint-utils': 4.9.0(eslint@8.57.1) + '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.2(jiti@1.21.7)) '@eslint-community/regexpp': 4.12.2 - '@eslint/eslintrc': 2.1.4 - '@eslint/js': 8.57.1 - '@humanwhocodes/config-array': 0.13.0 + '@eslint/config-array': 0.21.1 + '@eslint/config-helpers': 0.4.2 + '@eslint/core': 0.17.0 + '@eslint/eslintrc': 3.3.3 + '@eslint/js': 9.39.2 + '@eslint/plugin-kit': 0.4.1 + '@humanfs/node': 0.16.7 '@humanwhocodes/module-importer': 1.0.1 - '@nodelib/fs.walk': 1.2.8 - '@ungap/structured-clone': 1.3.0 + '@humanwhocodes/retry': 0.4.3 + '@types/estree': 1.0.8 ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.6 debug: 4.4.3(supports-color@8.1.1) - doctrine: 3.0.0 escape-string-regexp: 4.0.0 - eslint-scope: 7.2.2 - eslint-visitor-keys: 3.4.3 - espree: 9.6.1 + eslint-scope: 8.4.0 + eslint-visitor-keys: 4.2.1 + espree: 10.4.0 esquery: 1.6.0 esutils: 2.0.3 fast-deep-equal: 3.1.3 - file-entry-cache: 6.0.1 + file-entry-cache: 8.0.0 find-up: 5.0.0 glob-parent: 6.0.2 - globals: 13.24.0 - graphemer: 1.4.0 ignore: 5.3.2 imurmurhash: 0.1.4 is-glob: 4.0.3 - is-path-inside: 3.0.3 - js-yaml: 4.1.1 json-stable-stringify-without-jsonify: 1.0.1 - levn: 0.4.1 lodash.merge: 4.6.2 minimatch: 3.1.2 natural-compare: 1.4.0 optionator: 0.9.4 - strip-ansi: 6.0.1 - text-table: 0.2.0 + optionalDependencies: + jiti: 1.21.7 transitivePeerDependencies: - supports-color esm-env@1.2.2: {} + espree@10.4.0: + dependencies: + acorn: 8.15.0 + acorn-jsx: 5.3.2(acorn@8.15.0) + eslint-visitor-keys: 4.2.1 + espree@9.6.1: dependencies: acorn: 8.15.0 @@ -12361,9 +12455,9 @@ snapshots: dependencies: is-unicode-supported: 2.1.0 - file-entry-cache@6.0.1: + file-entry-cache@8.0.0: dependencies: - flat-cache: 3.2.0 + flat-cache: 4.0.1 file-set@5.3.0: dependencies: @@ -12394,11 +12488,10 @@ snapshots: locate-path: 6.0.0 path-exists: 4.0.0 - flat-cache@3.2.0: + flat-cache@4.0.1: dependencies: flatted: 3.3.3 keyv: 4.5.4 - rimraf: 3.0.2 flatted@3.3.3: {} @@ -12432,14 +12525,6 @@ snapshots: forever-agent@0.6.1: {} - form-data@4.0.4: - dependencies: - asynckit: 0.4.0 - combined-stream: 1.0.8 - es-set-tostringtag: 2.1.0 - hasown: 2.0.2 - mime-types: 2.1.35 - form-data@4.0.5: dependencies: asynckit: 0.4.0 @@ -12599,9 +12684,11 @@ snapshots: dependencies: ini: 2.0.0 - globals@13.24.0: - dependencies: - type-fest: 0.20.2 + globals@14.0.0: {} + + globals@16.5.0: {} + + globals@17.2.0: {} globby@11.1.0: dependencies: @@ -12626,8 +12713,6 @@ snapshots: graceful-fs@4.2.11: {} - graphemer@1.4.0: {} - gzip-size@6.0.0: dependencies: duplexer: 0.1.2 @@ -12890,6 +12975,7 @@ snapshots: '@exodus/bytes': 1.8.0 transitivePeerDependencies: - '@exodus/crypto' + optional: true html-escaper@2.0.2: {} @@ -12923,6 +13009,7 @@ snapshots: debug: 4.4.3(supports-color@8.1.1) transitivePeerDependencies: - supports-color + optional: true http-proxy@1.18.1: dependencies: @@ -13007,6 +13094,8 @@ snapshots: ignore@5.3.2: {} + ignore@7.0.5: {} + import-cwd@3.0.0: dependencies: import-from: 3.0.0 @@ -13117,7 +13206,8 @@ snapshots: is-plain-obj@4.1.0: {} - is-potential-custom-element-name@1.0.1: {} + is-potential-custom-element-name@1.0.1: + optional: true is-reference@3.0.3: dependencies: @@ -13235,6 +13325,7 @@ snapshots: - bufferutil - supports-color - utf-8-validate + optional: true jsesc@3.1.0: {} @@ -13285,6 +13376,8 @@ snapshots: known-css-properties@0.35.0: {} + known-css-properties@0.37.0: {} + kolorist@1.8.0: {} ky@1.14.2: {} @@ -14190,8 +14283,6 @@ snapshots: normalize-path@3.0.0: {} - normalize-range@0.1.2: {} - normalize-url@6.1.0: {} npm-bundled@3.0.1: @@ -14475,6 +14566,7 @@ snapshots: parse5@8.0.0: dependencies: entities: 6.0.1 + optional: true pascal-case@3.1.2: dependencies: @@ -14905,6 +14997,10 @@ snapshots: dependencies: postcss: 8.5.6 + postcss-safe-parser@7.0.1(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + postcss-scss@4.0.9(postcss@8.5.6): dependencies: postcss: 8.5.6 @@ -14974,8 +15070,6 @@ snapshots: prettier@3.3.3: {} - prettier@3.6.2: {} - prettier@3.7.4: {} pretty-bytes@5.6.0: {} @@ -15418,7 +15512,7 @@ snapshots: dependencies: commenting: 1.1.0 fdir: 6.5.0(picomatch@4.0.3) - lodash: 4.17.21 + lodash: 4.17.23 magic-string: 0.30.21 moment: 2.30.1 package-name-regex: 2.0.6 @@ -15536,6 +15630,7 @@ snapshots: saxes@6.0.0: dependencies: xmlchars: 2.2.0 + optional: true scheduler@0.27.0: {} @@ -15964,6 +16059,17 @@ snapshots: optionalDependencies: svelte: 5.46.4 + svelte-eslint-parser@1.4.1(svelte@5.46.4): + dependencies: + eslint-scope: 8.4.0 + eslint-visitor-keys: 4.2.1 + espree: 10.4.0 + postcss: 8.5.6 + postcss-scss: 4.0.9(postcss@8.5.6) + postcss-selector-parser: 7.1.1 + optionalDependencies: + svelte: 5.46.4 + svelte-preprocess@6.0.3(@babel/core@7.28.5)(postcss-load-config@6.0.1(jiti@1.21.7)(postcss@8.5.6)(yaml@2.8.2))(postcss@8.5.6)(svelte@5.46.4)(typescript@5.9.3): dependencies: svelte: 5.46.4 @@ -16018,7 +16124,8 @@ snapshots: picocolors: 1.1.1 sax: 1.4.3 - symbol-tree@3.2.4: {} + symbol-tree@3.2.4: + optional: true table-layout@4.1.1: dependencies: @@ -16105,8 +16212,6 @@ snapshots: commander: 2.20.3 source-map-support: 0.5.21 - text-table@0.2.0: {} - thenify-all@1.6.0: dependencies: thenify: 3.3.1 @@ -16134,7 +16239,8 @@ snapshots: tldts-core@6.1.86: {} - tldts-core@7.0.19: {} + tldts-core@7.0.19: + optional: true tldts@6.1.86: dependencies: @@ -16143,6 +16249,7 @@ snapshots: tldts@7.0.19: dependencies: tldts-core: 7.0.19 + optional: true tmp@0.2.5: {} @@ -16159,12 +16266,14 @@ snapshots: tough-cookie@6.0.0: dependencies: tldts: 7.0.19 + optional: true tr46@0.0.3: {} tr46@6.0.0: dependencies: punycode: 2.3.1 + optional: true tree-kill@1.2.2: {} @@ -16176,6 +16285,10 @@ snapshots: dependencies: typescript: 5.9.3 + ts-api-utils@2.4.0(typescript@5.9.3): + dependencies: + typescript: 5.9.3 + ts-interface-checker@0.1.13: {} tsconfck@3.1.6(typescript@5.9.3): @@ -16383,12 +16496,6 @@ snapshots: untildify@4.0.0: {} - update-browserslist-db@1.1.4(browserslist@4.28.0): - dependencies: - browserslist: 4.28.0 - escalade: 3.2.0 - picocolors: 1.1.1 - update-browserslist-db@1.2.3(browserslist@4.28.1): dependencies: browserslist: 4.28.1 @@ -16469,21 +16576,6 @@ snapshots: terser: 5.44.1 yaml: 2.8.2 - vite@7.2.2(@types/node@25.0.3)(jiti@1.21.7)(terser@5.44.1)(yaml@2.8.2): - dependencies: - esbuild: 0.25.12 - fdir: 6.5.0(picomatch@4.0.3) - picomatch: 4.0.3 - postcss: 8.5.6 - rollup: 4.54.0 - tinyglobby: 0.2.15 - optionalDependencies: - '@types/node': 25.0.3 - fsevents: 2.3.3 - jiti: 1.21.7 - terser: 5.44.1 - yaml: 2.8.2 - vite@7.3.0(@types/node@25.0.3)(jiti@1.21.7)(terser@5.44.1)(yaml@2.8.2): dependencies: esbuild: 0.27.2 @@ -16503,9 +16595,9 @@ snapshots: optionalDependencies: vite: 6.4.1(@types/node@25.0.3)(jiti@1.21.7)(terser@5.44.1)(yaml@2.8.2) - vitefu@1.1.1(vite@7.2.2(@types/node@25.0.3)(jiti@1.21.7)(terser@5.44.1)(yaml@2.8.2)): + vitefu@1.1.1(vite@7.3.0(@types/node@25.0.3)(jiti@1.21.7)(terser@5.44.1)(yaml@2.8.2)): optionalDependencies: - vite: 7.2.2(@types/node@25.0.3)(jiti@1.21.7)(terser@5.44.1)(yaml@2.8.2) + vite: 7.3.0(@types/node@25.0.3)(jiti@1.21.7)(terser@5.44.1)(yaml@2.8.2) vitest@4.0.16(@types/node@25.0.3)(@vitest/ui@4.0.16)(happy-dom@16.8.1)(jiti@1.21.7)(jsdom@27.4.0)(terser@5.44.1)(yaml@2.8.2): dependencies: @@ -16757,6 +16849,7 @@ snapshots: w3c-xmlserializer@5.0.0: dependencies: xml-name-validator: 5.0.0 + optional: true wait-on@9.0.3(debug@4.4.3): dependencies: @@ -16774,7 +16867,8 @@ snapshots: webidl-conversions@7.0.0: {} - webidl-conversions@8.0.1: {} + webidl-conversions@8.0.1: + optional: true whatwg-encoding@2.0.0: dependencies: @@ -16782,12 +16876,14 @@ snapshots: whatwg-mimetype@3.0.0: {} - whatwg-mimetype@4.0.0: {} + whatwg-mimetype@4.0.0: + optional: true whatwg-url@15.1.0: dependencies: tr46: 6.0.0 webidl-conversions: 8.0.1 + optional: true whatwg-url@5.0.0: dependencies: @@ -16859,11 +16955,14 @@ snapshots: ws@7.5.10: {} - ws@8.19.0: {} + ws@8.19.0: + optional: true - xml-name-validator@5.0.0: {} + xml-name-validator@5.0.0: + optional: true - xmlchars@2.2.0: {} + xmlchars@2.2.0: + optional: true xxhash-wasm@1.1.0: {} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 252f36a66..026df1d5e 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -2,8 +2,6 @@ packages: - shepherd.js - landing - packages/* - - test/cypress - - test/unit - docs-src onlyBuiltDependencies: diff --git a/shepherd.js/.eslintignore b/shepherd.js/.eslintignore index 44779f99e..0defceee8 100644 --- a/shepherd.js/.eslintignore +++ b/shepherd.js/.eslintignore @@ -1,4 +1,4 @@ /dev/ -/dist/ -/dummy/ -/tmp/ +dist/ +dummy/ +tmp/ diff --git a/shepherd.js/.eslintrc.cjs b/shepherd.js/.eslintrc.cjs index c07341556..cdb534029 100644 --- a/shepherd.js/.eslintrc.cjs +++ b/shepherd.js/.eslintrc.cjs @@ -6,13 +6,10 @@ module.exports = { }, extends: ['eslint:recommended', 'plugin:svelte/recommended'], env: { - browser: true + browser: true, + es2020: true, }, rules: { - 'max-lines': [ - 'warn', - { max: 500, skipBlankLines: true, skipComments: true } - ], 'no-console': 'off', 'prefer-const': 'off' }, @@ -40,6 +37,14 @@ module.exports = { 'prefer-rest-params': 'off' } }, + // Vitest setup file (uses Node globals) + { + files: ['test/unit/setupTests.js'], + env: { + node: true, + es2020: true + } + }, // node files { files: [ diff --git a/shepherd.js/.gitignore b/shepherd.js/.gitignore index a327266fe..653ef766b 100644 --- a/shepherd.js/.gitignore +++ b/shepherd.js/.gitignore @@ -5,6 +5,7 @@ /.log/ /.nyc_output/ /coverage/ +/test/coverage/ /node_modules/ /tmp/ /.DS_Store diff --git a/shepherd.js/.prettierignore b/shepherd.js/.prettierignore index 44779f99e..0defceee8 100644 --- a/shepherd.js/.prettierignore +++ b/shepherd.js/.prettierignore @@ -1,4 +1,4 @@ /dev/ -/dist/ -/dummy/ -/tmp/ +dist/ +dummy/ +tmp/ diff --git a/shepherd.js/cypress/downloads/downloads.html b/shepherd.js/cypress/downloads/downloads.html new file mode 100644 index 000000000..692129beb Binary files /dev/null and b/shepherd.js/cypress/downloads/downloads.html differ diff --git a/shepherd.js/eslint.config.js b/shepherd.js/eslint.config.js new file mode 100644 index 000000000..fe1f32365 --- /dev/null +++ b/shepherd.js/eslint.config.js @@ -0,0 +1,143 @@ +import js from '@eslint/js'; +import svelte from 'eslint-plugin-svelte'; +import cypress from 'eslint-plugin-cypress/flat'; +import globals from 'globals'; +import ts from '@typescript-eslint/eslint-plugin'; +import tsParser from '@typescript-eslint/parser'; +import svelteParser from 'svelte-eslint-parser'; + +export default [ + // Base config for all files + js.configs.recommended, + { + languageOptions: { + ecmaVersion: 'latest', + sourceType: 'module', + globals: { + ...globals.browser, + ...globals.es2020 + } + }, + rules: { + 'no-console': 'off', + 'prefer-const': 'off', + 'no-unused-vars': [ + 'error', + { argsIgnorePattern: '^_', varsIgnorePattern: '^_' } + ] + } + }, + + // Svelte files + ...svelte.configs['flat/recommended'], + { + files: ['**/*.svelte'], + languageOptions: { + parser: svelteParser + }, + rules: { + 'svelte/no-at-html-tags': 'off', + 'svelte/valid-compile': 'off' + } + }, + + // TypeScript files + { + files: ['**/*.ts'], + ignores: ['vitest.config.ts'], + languageOptions: { + parser: tsParser, + parserOptions: { + project: './tsconfig.json' + } + }, + plugins: { + '@typescript-eslint': ts + }, + rules: { + '@typescript-eslint/no-unused-vars': [ + 'error', + { + argsIgnorePattern: '^_', + varsIgnorePattern: '^_', + caughtErrorsIgnorePattern: '^_' + } + ], + '@typescript-eslint/no-explicit-any': 'error', + 'no-unused-vars': 'off', // Use TypeScript version instead + 'prefer-rest-params': 'off' + } + }, + + // Config files (vitest, babel, etc.) + { + files: ['vitest.config.ts', '**/*.config.*'], + languageOptions: { + globals: { + ...globals.node + } + } + }, + + // Cypress test files + { + files: ['test/cypress/**/*.cy.js', 'test/cypress/utils/**/*.js'], + ...cypress.configs.recommended, + rules: { + 'cypress/no-unnecessary-waiting': 'off', + 'cypress/no-async-tests': 'off' + } + }, + + // Cypress support files (uses CommonJS) + { + files: ['test/cypress/support/**/*.js'], + languageOptions: { + globals: { + ...globals.node + } + } + }, + + // Vitest setup file (uses Node globals) + { + files: ['test/unit/setupTests.js'], + languageOptions: { + globals: { + ...globals.node + } + } + }, + + // Node config files + { + files: [ + '.eslintrc.js', + '.prettierrc.js', + 'rollup.config.mjs', + 'svelte.config.js', + 'eslint.config.js', + 'test/unit/babel.config.cjs' + ], + languageOptions: { + globals: { + ...globals.node + } + } + }, + + // Ignore patterns + { + ignores: [ + 'dev/', + 'dist/', + 'dummy/', + 'tmp/', + 'test/cypress/dummy/js/prism.js', + 'node_modules/', + 'coverage/', + 'test/coverage/', + '.eslintrc.cjs' + ] + } +]; diff --git a/shepherd.js/package.json b/shepherd.js/package.json index 786828734..df1889595 100644 --- a/shepherd.js/package.json +++ b/shepherd.js/package.json @@ -33,6 +33,9 @@ "scripts": { "build": "pnpm clean && rollup -c", "clean": "rimraf ./dist ./tmp", + "cy:open": "cypress open --config-file test/cypress/cypress.config.js", + "cy:run:chrome": "cypress run --browser chrome --config-file test/cypress/cypress.config.js", + "cypress:install": "cypress install", "esdoc": "esdoc", "lint": "concurrently \"npm:lint:*(!fix)\" --names \"lint:\"", "lint:fix": "concurrently \"npm:lint:*:fix\" --names \"fix:\"", @@ -41,9 +44,19 @@ "lint:prettier": "prettier --check '**/*.{js,svelte,ts}'", "lint:prettier:fix": "prettier --write '**/*.{js,svelte,ts}'", "prepack": "pnpm build", + "start-test-server": "http-server . -p 9002", + "test": "vitest", + "test:all": "pnpm test:unit:ci && pnpm test:cy:ci", + "test:ci": "pnpm test:unit:ci && pnpm test:cy:ci", + "test:cy:ci": "start-server-and-test start-test-server http://127.0.0.1:9002 cy:run:chrome", + "test:cy:watch": "start-server-and-test start-test-server http://127.0.0.1:9002 cy:open", + "test:unit": "vitest", + "test:unit:ci": "vitest run --coverage", + "test:unit:watch": "vitest", "types:check": "pnpm types:check:esm && pnpm types:check:attw", "types:check:attw": "pnpm attw --pack . --exclude-entrypoints ./dist/css/shepherd.css", "types:check:esm": "pnpm tsc --module esnext --moduleResolution bundler --noEmit true --emitDeclarationOnly false", + "view-coverage": "http-server -p 9003 ./test/coverage/lcov-report -o", "watch": "pnpm clean && rollup -c --environment DEVELOPMENT --watch" }, "dependencies": { @@ -60,16 +73,33 @@ "@rollup/plugin-node-resolve": "^16.0.3", "@rollup/plugin-replace": "^6.0.3", "@rollup/plugin-terser": "^0.4.4", + "@sveltejs/vite-plugin-svelte": "^6.2.1", + "@testing-library/jest-dom": "^6.4.8", + "@testing-library/svelte": "^5.3.1", + "@vitest/coverage-v8": "^4.0.16", + "@vitest/expect": "^4.0.18", "autoprefixer": "^10.4.23", + "chai": "^6.2.0", "cssnano": "^7.1.2", + "cypress": "^14.5.4", + "cypress-plugin-tab": "^1.0.5", + "del": "^7.1.0", "dts-bundle-generator": "^9.5.1", + "eslint": "^9.39.2", + "eslint-plugin-cypress": "^5.2.1", "eslint-plugin-svelte": "^2.46.1", + "eslint-plugin-vitest": "^0.5.4", "execa": "^9.6.1", + "globals": "^17.2.0", + "happy-dom": "^16.4.1", + "http-server": "^14.1.1", + "lodash": "^4.17.23", "postcss": "^8.5.6", "prettier": "^3.7.4", "prettier-plugin-svelte": "^3.4.1", "renamer": "^5.0.2", "replace": "^1.2.2", + "resize-observer-polyfill": "^1.5.1", "rimraf": "^6.1.2", "rollup": "^4.54.0", "rollup-plugin-analyzer": "^4.0.0", @@ -80,14 +110,18 @@ "rollup-plugin-serve": "^2.0.3", "rollup-plugin-svelte": "^7.2.3", "rollup-plugin-visualizer": "^5.14.0", + "start-server-and-test": "^2.1.3", "svelte": "^5.46.4", + "svelte-eslint-parser": "^1.4.1", "svelte-preprocess": "^6.0.3", "svelte2tsx": "0.7.13", - "typescript": "^5.9.3" + "typescript": "^5.9.3", + "vite": "^7.2.2", + "vitest": "^4.0.16" }, - "packageManager": "pnpm@9.15.4", + "packageManager": "pnpm@10.28.2", "engines": { - "node": "18.* || >= 20" + "node": ">= 20" }, "publishConfig": { "registry": "https://registry.npmjs.org" diff --git a/shepherd.js/src/step.ts b/shepherd.js/src/step.ts index 765694fe3..f8e3cc9c6 100644 --- a/shepherd.js/src/step.ts +++ b/shepherd.js/src/step.ts @@ -306,7 +306,6 @@ export class Step extends Evented { _resolvedAttachTo: StepOptionsAttachTo | null; _resolvedExtraHighlightElements?: HTMLElement[]; classPrefix?: string; - // eslint-disable-next-line @typescript-eslint/ban-types declare cleanup: Function | null; el?: HTMLElement | null; declare id: string; diff --git a/shepherd.js/src/utils/general.ts b/shepherd.js/src/utils/general.ts index fba57ddd9..43e180699 100644 --- a/shepherd.js/src/utils/general.ts +++ b/shepherd.js/src/utils/general.ts @@ -50,7 +50,7 @@ export function parseAttachTo(step: Step) { returnOpts.element = document.querySelector( returnOpts.element ) as HTMLElement; - } catch (e) { + } catch (_e) { // TODO } if (!returnOpts.element) { diff --git a/shepherd.js/src/utils/type-check.ts b/shepherd.js/src/utils/type-check.ts index 5a7a61957..adf211f15 100644 --- a/shepherd.js/src/utils/type-check.ts +++ b/shepherd.js/src/utils/type-check.ts @@ -18,7 +18,6 @@ export function isHTMLElement(value: T | HTMLElement): value is HTMLElement { * Checks if `value` is classified as a `Function` object. * @param value The param to check if it is a function */ -// eslint-disable-next-line @typescript-eslint/ban-types export function isFunction(value: T | Function): value is Function { return typeof value === 'function'; } diff --git a/test/cypress/.gitignore b/shepherd.js/test/cypress/.gitignore similarity index 100% rename from test/cypress/.gitignore rename to shepherd.js/test/cypress/.gitignore diff --git a/shepherd.js/test/cypress/cypress.config.js b/shepherd.js/test/cypress/cypress.config.js new file mode 100644 index 000000000..af58415dd --- /dev/null +++ b/shepherd.js/test/cypress/cypress.config.js @@ -0,0 +1,18 @@ +import { defineConfig } from 'cypress'; +import { fileURLToPath } from 'url'; +import { dirname, join } from 'path'; + +const __filename = fileURLToPath(import.meta.url); +const __dirname = dirname(__filename); + +export default defineConfig({ + fixturesFolder: join(__dirname, 'fixtures'), + video: false, + viewportWidth: 1440, + viewportHeight: 900, + e2e: { + baseUrl: 'http://localhost:9002', + specPattern: join(__dirname, 'integration/**/*.cy.{js,jsx,ts,tsx}'), + supportFile: join(__dirname, 'support/index.js') + } +}); diff --git a/test/cypress/dummy/assets/favicons/android-chrome-192x192.png b/shepherd.js/test/cypress/dummy/assets/favicons/android-chrome-192x192.png similarity index 100% rename from test/cypress/dummy/assets/favicons/android-chrome-192x192.png rename to shepherd.js/test/cypress/dummy/assets/favicons/android-chrome-192x192.png diff --git a/test/cypress/dummy/assets/favicons/android-chrome-512x512.png b/shepherd.js/test/cypress/dummy/assets/favicons/android-chrome-512x512.png similarity index 100% rename from test/cypress/dummy/assets/favicons/android-chrome-512x512.png rename to shepherd.js/test/cypress/dummy/assets/favicons/android-chrome-512x512.png diff --git a/test/cypress/dummy/assets/favicons/apple-touch-icon.png b/shepherd.js/test/cypress/dummy/assets/favicons/apple-touch-icon.png similarity index 100% rename from test/cypress/dummy/assets/favicons/apple-touch-icon.png rename to shepherd.js/test/cypress/dummy/assets/favicons/apple-touch-icon.png diff --git a/test/cypress/dummy/assets/favicons/browserconfig.xml b/shepherd.js/test/cypress/dummy/assets/favicons/browserconfig.xml similarity index 100% rename from test/cypress/dummy/assets/favicons/browserconfig.xml rename to shepherd.js/test/cypress/dummy/assets/favicons/browserconfig.xml diff --git a/test/cypress/dummy/assets/favicons/favicon-16x16.png b/shepherd.js/test/cypress/dummy/assets/favicons/favicon-16x16.png similarity index 100% rename from test/cypress/dummy/assets/favicons/favicon-16x16.png rename to shepherd.js/test/cypress/dummy/assets/favicons/favicon-16x16.png diff --git a/test/cypress/dummy/assets/favicons/favicon-32x32.png b/shepherd.js/test/cypress/dummy/assets/favicons/favicon-32x32.png similarity index 100% rename from test/cypress/dummy/assets/favicons/favicon-32x32.png rename to shepherd.js/test/cypress/dummy/assets/favicons/favicon-32x32.png diff --git a/test/cypress/dummy/assets/favicons/favicon.ico b/shepherd.js/test/cypress/dummy/assets/favicons/favicon.ico similarity index 100% rename from test/cypress/dummy/assets/favicons/favicon.ico rename to shepherd.js/test/cypress/dummy/assets/favicons/favicon.ico diff --git a/test/cypress/dummy/assets/favicons/manifest.json b/shepherd.js/test/cypress/dummy/assets/favicons/manifest.json similarity index 100% rename from test/cypress/dummy/assets/favicons/manifest.json rename to shepherd.js/test/cypress/dummy/assets/favicons/manifest.json diff --git a/test/cypress/dummy/assets/favicons/mstile-150x150.png b/shepherd.js/test/cypress/dummy/assets/favicons/mstile-150x150.png similarity index 100% rename from test/cypress/dummy/assets/favicons/mstile-150x150.png rename to shepherd.js/test/cypress/dummy/assets/favicons/mstile-150x150.png diff --git a/test/cypress/dummy/assets/favicons/safari-pinned-tab.svg b/shepherd.js/test/cypress/dummy/assets/favicons/safari-pinned-tab.svg similarity index 100% rename from test/cypress/dummy/assets/favicons/safari-pinned-tab.svg rename to shepherd.js/test/cypress/dummy/assets/favicons/safari-pinned-tab.svg diff --git a/test/cypress/dummy/css/fonts.css b/shepherd.js/test/cypress/dummy/css/fonts.css similarity index 100% rename from test/cypress/dummy/css/fonts.css rename to shepherd.js/test/cypress/dummy/css/fonts.css diff --git a/test/cypress/dummy/css/prism.css b/shepherd.js/test/cypress/dummy/css/prism.css similarity index 100% rename from test/cypress/dummy/css/prism.css rename to shepherd.js/test/cypress/dummy/css/prism.css diff --git a/test/cypress/dummy/css/welcome.css b/shepherd.js/test/cypress/dummy/css/welcome.css similarity index 100% rename from test/cypress/dummy/css/welcome.css rename to shepherd.js/test/cypress/dummy/css/welcome.css diff --git a/test/cypress/dummy/index.html b/shepherd.js/test/cypress/dummy/index.html similarity index 96% rename from test/cypress/dummy/index.html rename to shepherd.js/test/cypress/dummy/index.html index 4b3bde146..7bef4f966 100644 --- a/test/cypress/dummy/index.html +++ b/shepherd.js/test/cypress/dummy/index.html @@ -47,7 +47,7 @@ @@ -131,7 +131,7 @@

Example

diff --git a/shepherd.js/test/cypress/dummy/js/prism.js b/shepherd.js/test/cypress/dummy/js/prism.js new file mode 100644 index 000000000..99fd1135b --- /dev/null +++ b/shepherd.js/test/cypress/dummy/js/prism.js @@ -0,0 +1,644 @@ +/* PrismJS 1.15.0 +https://prismjs.com/download.html#themes=prism&languages=markup+clike+javascript&plugins=unescaped-markup+normalize-whitespace */ +var _self = + 'undefined' != typeof window + ? window + : 'undefined' != typeof WorkerGlobalScope && + self instanceof WorkerGlobalScope + ? self + : {}, + Prism = (function () { + var e = /\blang(?:uage)?-([\w-]+)\b/i, + t = 0, + n = (_self.Prism = { + manual: _self.Prism && _self.Prism.manual, + disableWorkerMessageHandler: + _self.Prism && _self.Prism.disableWorkerMessageHandler, + util: { + encode: function (e) { + return e instanceof r + ? new r(e.type, n.util.encode(e.content), e.alias) + : 'Array' === n.util.type(e) + ? e.map(n.util.encode) + : e + .replace(/&/g, '&') + .replace(/ e.length) return; + if (!(w instanceof s)) { + if (m && b != t.length - 1) { + h.lastIndex = k; + var _ = h.exec(e); + if (!_) break; + for ( + var j = _.index + (d ? _[1].length : 0), + P = _.index + _[0].length, + A = b, + x = k, + O = t.length; + O > A && (P > x || (!t[A].type && !t[A - 1].greedy)); + ++A + ) + ((x += t[A].length), j >= x && (++b, (k = x))); + if (t[b] instanceof s) continue; + ((I = A - b), (w = e.slice(k, x)), (_.index -= k)); + } else { + h.lastIndex = 0; + var _ = h.exec(w), + I = 1; + } + if (_) { + d && (p = _[1] ? _[1].length : 0); + var j = _.index + p, + _ = _[0].slice(p), + P = j + _.length, + N = w.slice(0, j), + S = w.slice(P), + C = [b, I]; + N && (++b, (k += N.length), C.push(N)); + var E = new s(u, f ? n.tokenize(_, f) : _, y, _, m); + if ( + (C.push(E), + S && C.push(S), + Array.prototype.splice.apply(t, C), + 1 != I && n.matchGrammar(e, t, r, b, k, !0, u), + i) + ) + break; + } else if (i) break; + } + } + } + } + }, + tokenize: function (e, t) { + var r = [e], + a = t.rest; + if (a) { + for (var l in a) t[l] = a[l]; + delete t.rest; + } + return (n.matchGrammar(e, r, t, 0, 0, !1), r); + }, + hooks: { + all: {}, + add: function (e, t) { + var r = n.hooks.all; + ((r[e] = r[e] || []), r[e].push(t)); + }, + run: function (e, t) { + var r = n.hooks.all[e]; + if (r && r.length) for (var a, l = 0; (a = r[l++]); ) a(t); + } + } + }), + r = (n.Token = function (e, t, n, r, a) { + ((this.type = e), + (this.content = t), + (this.alias = n), + (this.length = 0 | (r || '').length), + (this.greedy = !!a)); + }); + if ( + ((r.stringify = function (e, t, a) { + if ('string' == typeof e) return e; + if ('Array' === n.util.type(e)) + return e + .map(function (n) { + return r.stringify(n, t, e); + }) + .join(''); + var l = { + type: e.type, + content: r.stringify(e.content, t, a), + tag: 'span', + classes: ['token', e.type], + attributes: {}, + language: t, + parent: a + }; + if (e.alias) { + var i = 'Array' === n.util.type(e.alias) ? e.alias : [e.alias]; + Array.prototype.push.apply(l.classes, i); + } + n.hooks.run('wrap', l); + var o = Object.keys(l.attributes) + .map(function (e) { + return ( + e + '="' + (l.attributes[e] || '').replace(/"/g, '"') + '"' + ); + }) + .join(' '); + return ( + '<' + + l.tag + + ' class="' + + l.classes.join(' ') + + '"' + + (o ? ' ' + o : '') + + '>' + + l.content + + '' + ); + }), + !_self.document) + ) + return _self.addEventListener + ? (n.disableWorkerMessageHandler || + _self.addEventListener( + 'message', + function (e) { + var t = JSON.parse(e.data), + r = t.language, + a = t.code, + l = t.immediateClose; + (_self.postMessage(n.highlight(a, n.languages[r], r)), + l && _self.close()); + }, + !1 + ), + _self.Prism) + : _self.Prism; + var a = + document.currentScript || + [].slice.call(document.getElementsByTagName('script')).pop(); + return ( + a && + ((n.filename = a.src), + n.manual || + a.hasAttribute('data-manual') || + ('loading' !== document.readyState + ? window.requestAnimationFrame + ? window.requestAnimationFrame(n.highlightAll) + : window.setTimeout(n.highlightAll, 16) + : document.addEventListener('DOMContentLoaded', n.highlightAll))), + _self.Prism + ); + })(); +('undefined' != typeof module && module.exports && (module.exports = Prism), + 'undefined' != typeof global && (global.Prism = Prism)); +((Prism.languages.markup = { + comment: //, + prolog: /<\?[\s\S]+?\?>/, + doctype: //i, + cdata: //i, + tag: { + pattern: + /<\/?(?!\d)[^\s>\/=$<%]+(?:\s+[^\s>\/=]+(?:=(?:("|')(?:\\[\s\S]|(?!\1)[^\\])*\1|[^\s'">=]+))?)*\s*\/?>/i, + greedy: !0, + inside: { + tag: { + pattern: /^<\/?[^\s>\/]+/i, + inside: { punctuation: /^<\/?/, namespace: /^[^\s>\/:]+:/ } + }, + 'attr-value': { + pattern: /=(?:("|')(?:\\[\s\S]|(?!\1)[^\\])*\1|[^\s'">=]+)/i, + inside: { + punctuation: [/^=/, { pattern: /(^|[^\\])["']/, lookbehind: !0 }] + } + }, + punctuation: /\/?>/, + 'attr-name': { + pattern: /[^\s>\/]+/, + inside: { namespace: /^[^\s>\/:]+:/ } + } + } + }, + entity: /&#?[\da-z]{1,8};/i +}), + (Prism.languages.markup.tag.inside['attr-value'].inside.entity = + Prism.languages.markup.entity), + Prism.hooks.add('wrap', function (a) { + 'entity' === a.type && + (a.attributes.title = a.content.replace(/&/, '&')); + }), + (Prism.languages.xml = Prism.languages.markup), + (Prism.languages.html = Prism.languages.markup), + (Prism.languages.mathml = Prism.languages.markup), + (Prism.languages.svg = Prism.languages.markup)); +Prism.languages.clike = { + comment: [ + { pattern: /(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/, lookbehind: !0 }, + { pattern: /(^|[^\\:])\/\/.*/, lookbehind: !0, greedy: !0 } + ], + string: { + pattern: /(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/, + greedy: !0 + }, + 'class-name': { + pattern: + /((?:\b(?:class|interface|extends|implements|trait|instanceof|new)\s+)|(?:catch\s+\())[\w.\\]+/i, + lookbehind: !0, + inside: { punctuation: /[.\\]/ } + }, + keyword: + /\b(?:if|else|while|do|for|return|in|instanceof|function|new|try|throw|catch|finally|null|break|continue)\b/, + boolean: /\b(?:true|false)\b/, + function: /[a-z0-9_]+(?=\()/i, + number: /\b0x[\da-f]+\b|(?:\b\d+\.?\d*|\B\.\d+)(?:e[+-]?\d+)?/i, + operator: /--?|\+\+?|!=?=?|<=?|>=?|==?=?|&&?|\|\|?|\?|\*|\/|~|\^|%/, + punctuation: /[{}[\];(),.:]/ +}; +((Prism.languages.javascript = Prism.languages.extend('clike', { + keyword: + /\b(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|var|void|while|with|yield)\b/, + number: + /\b(?:0[xX][\dA-Fa-f]+|0[bB][01]+|0[oO][0-7]+|NaN|Infinity)\b|(?:\b\d+\.?\d*|\B\.\d+)(?:[Ee][+-]?\d+)?/, + function: /[_$a-z\xA0-\uFFFF][$\w\xA0-\uFFFF]*(?=\s*\()/i, + operator: + /-[-=]?|\+[+=]?|!=?=?|<>?>?=?|=(?:==?|>)?|&[&=]?|\|[|=]?|\*\*?=?|\/=?|~|\^=?|%=?|\?|\.{3}/ +})), + Prism.languages.insertBefore('javascript', 'keyword', { + regex: { + pattern: + /((?:^|[^$\w\xA0-\uFFFF."'\])\s])\s*)\/(\[[^\]\r\n]+]|\\.|[^\/\\\[\r\n])+\/[gimyu]{0,5}(?=\s*($|[\r\n,.;})\]]))/, + lookbehind: !0, + greedy: !0 + }, + 'function-variable': { + pattern: + /[_$a-z\xA0-\uFFFF][$\w\xA0-\uFFFF]*(?=\s*=\s*(?:function\b|(?:\([^()]*\)|[_$a-z\xA0-\uFFFF][$\w\xA0-\uFFFF]*)\s*=>))/i, + alias: 'function' + }, + constant: /\b[A-Z][A-Z\d_]*\b/ + }), + Prism.languages.insertBefore('javascript', 'string', { + 'template-string': { + pattern: /`(?:\\[\s\S]|\${[^}]+}|[^\\`])*`/, + greedy: !0, + inside: { + interpolation: { + pattern: /\${[^}]+}/, + inside: { + 'interpolation-punctuation': { + pattern: /^\${|}$/, + alias: 'punctuation' + }, + rest: null + } + }, + string: /[\s\S]+/ + } + } + }), + (Prism.languages.javascript[ + 'template-string' + ].inside.interpolation.inside.rest = Prism.languages.javascript), + Prism.languages.markup && + Prism.languages.insertBefore('markup', 'tag', { + script: { + pattern: /()[\s\S]*?(?=<\/script>)/i, + lookbehind: !0, + inside: Prism.languages.javascript, + alias: 'language-javascript', + greedy: !0 + } + }), + (Prism.languages.js = Prism.languages.javascript)); +!(function () { + 'undefined' != typeof self && + self.Prism && + self.document && + Prism.languages.markup && + ((Prism.plugins.UnescapedMarkup = !0), + Prism.hooks.add('before-highlightall', function (e) { + e.selector += + ", [class*='lang-'] script[type='text/plain'], [class*='language-'] script[type='text/plain'], script[type='text/plain'][class*='lang-'], script[type='text/plain'][class*='language-']"; + }), + Prism.hooks.add('before-sanity-check', function (e) { + if ( + (e.element.matches || e.element.msMatchesSelector).call( + e.element, + "script[type='text/plain']" + ) + ) { + var t = document.createElement('code'), + n = document.createElement('pre'); + return ( + (n.className = t.className = e.element.className), + e.element.dataset && + Object.keys(e.element.dataset).forEach(function (t) { + Object.prototype.hasOwnProperty.call(e.element.dataset, t) && + (n.dataset[t] = e.element.dataset[t]); + }), + (e.code = e.code.replace(/<\/script(>|>)/gi, '')), + (t.textContent = e.code), + n.appendChild(t), + e.element.parentNode.replaceChild(n, e.element), + (e.element = t), + void 0 + ); + } + var n = e.element.parentNode; + !e.code && + n && + 'pre' == n.nodeName.toLowerCase() && + e.element.childNodes.length && + '#comment' == e.element.childNodes[0].nodeName && + (e.element.textContent = e.code = e.element.childNodes[0].textContent); + })); +})(); +!(function () { + function e(e) { + this.defaults = r({}, e); + } + function n(e) { + return e.replace(/-(\w)/g, function (e, n) { + return n.toUpperCase(); + }); + } + function t(e) { + for (var n = 0, t = 0; t < e.length; ++t) + e.charCodeAt(t) == ' '.charCodeAt(0) && (n += 3); + return e.length + n; + } + var r = + Object.assign || + function (e, n) { + for (var t in n) n.hasOwnProperty(t) && (e[t] = n[t]); + return e; + }; + ((e.prototype = { + setDefaults: function (e) { + this.defaults = r(this.defaults, e); + }, + normalize: function (e, t) { + t = r(this.defaults, t); + for (var i in t) { + var o = n(i); + 'normalize' !== i && + 'setDefaults' !== o && + t[i] && + this[o] && + (e = this[o].call(this, e, t[i])); + } + return e; + }, + leftTrim: function (e) { + return e.replace(/^\s+/, ''); + }, + rightTrim: function (e) { + return e.replace(/\s+$/, ''); + }, + tabsToSpaces: function (e, n) { + return ((n = 0 | n || 4), e.replace(/\t/g, new Array(++n).join(' '))); + }, + spacesToTabs: function (e, n) { + return ((n = 0 | n || 4), e.replace(new RegExp(' {' + n + '}', 'g'), ' ')); + }, + removeTrailing: function (e) { + return e.replace(/\s*?$/gm, ''); + }, + removeInitialLineFeed: function (e) { + return e.replace(/^(?:\r?\n|\r)/, ''); + }, + removeIndent: function (e) { + var n = e.match(/^[^\S\n\r]*(?=\S)/gm); + return n && n[0].length + ? (n.sort(function (e, n) { + return e.length - n.length; + }), + n[0].length ? e.replace(new RegExp('^' + n[0], 'gm'), '') : e) + : e; + }, + indent: function (e, n) { + return e.replace(/^[^\S\n\r]*(?=\S)/gm, new Array(++n).join(' ') + '$&'); + }, + breakLines: function (e, n) { + n = n === !0 ? 80 : 0 | n || 80; + for (var r = e.split('\n'), i = 0; i < r.length; ++i) + if (!(t(r[i]) <= n)) { + for (var o = r[i].split(/(\s+)/g), a = 0, s = 0; s < o.length; ++s) { + var l = t(o[s]); + ((a += l), a > n && ((o[s] = '\n' + o[s]), (a = l))); + } + r[i] = o.join(''); + } + return r.join('\n'); + } + }), + 'undefined' != typeof module && module.exports && (module.exports = e), + 'undefined' != typeof Prism && + ((Prism.plugins.NormalizeWhitespace = new e({ + 'remove-trailing': !0, + 'remove-indent': !0, + 'left-trim': !0, + 'right-trim': !0 + })), + Prism.hooks.add('before-sanity-check', function (e) { + var n = Prism.plugins.NormalizeWhitespace; + if (!e.settings || e.settings['whitespace-normalization'] !== !1) { + if ((!e.element || !e.element.parentNode) && e.code) + return ((e.code = n.normalize(e.code, e.settings)), void 0); + var t = e.element.parentNode, + r = /\bno-whitespace-normalization\b/; + if ( + e.code && + t && + 'pre' === t.nodeName.toLowerCase() && + !r.test(t.className) && + !r.test(e.element.className) + ) { + for ( + var i = t.childNodes, o = '', a = '', s = !1, l = 0; + l < i.length; + ++l + ) { + var c = i[l]; + c == e.element + ? (s = !0) + : '#text' === c.nodeName && + (s ? (a += c.nodeValue) : (o += c.nodeValue), + t.removeChild(c), + --l); + } + if (e.element.children.length && Prism.plugins.KeepMarkup) { + var u = o + e.element.innerHTML + a; + ((e.element.innerHTML = n.normalize(u, e.settings)), + (e.code = e.element.textContent)); + } else + ((e.code = o + e.code + a), + (e.code = n.normalize(e.code, e.settings))); + } + } + }))); +})(); diff --git a/test/cypress/dummy/sheep.svg b/shepherd.js/test/cypress/dummy/sheep.svg similarity index 100% rename from test/cypress/dummy/sheep.svg rename to shepherd.js/test/cypress/dummy/sheep.svg diff --git a/test/cypress/examples/css/no-css-import.html b/shepherd.js/test/cypress/examples/css/no-css-import.html similarity index 74% rename from test/cypress/examples/css/no-css-import.html rename to shepherd.js/test/cypress/examples/css/no-css-import.html index 7ccf53676..62dc538cf 100644 --- a/test/cypress/examples/css/no-css-import.html +++ b/shepherd.js/test/cypress/examples/css/no-css-import.html @@ -1,7 +1,7 @@ diff --git a/test/cypress/examples/css/with-css-import.html b/shepherd.js/test/cypress/examples/css/with-css-import.html similarity index 65% rename from test/cypress/examples/css/with-css-import.html rename to shepherd.js/test/cypress/examples/css/with-css-import.html index 1ce1abea9..6ccbf4024 100644 --- a/test/cypress/examples/css/with-css-import.html +++ b/shepherd.js/test/cypress/examples/css/with-css-import.html @@ -2,10 +2,10 @@ diff --git a/test/cypress/examples/destroying-elements.html b/shepherd.js/test/cypress/examples/destroying-elements.html similarity index 79% rename from test/cypress/examples/destroying-elements.html rename to shepherd.js/test/cypress/examples/destroying-elements.html index 7fb0b2f21..f102208e0 100644 --- a/test/cypress/examples/destroying-elements.html +++ b/shepherd.js/test/cypress/examples/destroying-elements.html @@ -2,10 +2,10 @@ diff --git a/test/cypress/integration/a11y.cy.js b/shepherd.js/test/cypress/integration/a11y.cy.js similarity index 99% rename from test/cypress/integration/a11y.cy.js rename to shepherd.js/test/cypress/integration/a11y.cy.js index a64a77d74..386aeb820 100644 --- a/test/cypress/integration/a11y.cy.js +++ b/shepherd.js/test/cypress/integration/a11y.cy.js @@ -6,7 +6,7 @@ describe('a11y', () => { beforeEach(() => { Shepherd = null; - cy.visit('/dummy/', { + cy.visit('/test/cypress/dummy/', { onLoad(contentWindow) { if (contentWindow.Shepherd) { return (Shepherd = contentWindow.Shepherd); diff --git a/test/cypress/integration/css.cy.js b/shepherd.js/test/cypress/integration/css.cy.js similarity index 61% rename from test/cypress/integration/css.cy.js rename to shepherd.js/test/cypress/integration/css.cy.js index 9fa71251f..fc1cc80e2 100644 --- a/test/cypress/integration/css.cy.js +++ b/shepherd.js/test/cypress/integration/css.cy.js @@ -7,14 +7,22 @@ */ describe('CSS Import Behavior', () => { it('includes project styles when explicitly imported', () => { - cy.visit('/examples/css/with-css-import'); + cy.visit('/test/cypress/examples/css/with-css-import'); cy.window().should('have.property', 'Shepherd'); - cy.get('[data-test-id="fake-modal-overlay"]').should('have.css', 'pointer-events', 'none'); + cy.get('[data-test-id="fake-modal-overlay"]').should( + 'have.css', + 'pointer-events', + 'none' + ); }); it('DOES NOT include project styles without explicit import', () => { - cy.visit('/examples/css/no-css-import'); + cy.visit('/test/cypress/examples/css/no-css-import'); cy.window().should('have.property', 'Shepherd'); - cy.get('[data-test-id="fake-modal-overlay"]').should('not.have.css', 'pointer-events', 'none'); + cy.get('[data-test-id="fake-modal-overlay"]').should( + 'not.have.css', + 'pointer-events', + 'none' + ); }); }); diff --git a/shepherd.js/test/cypress/integration/destroying-elements.cy.js b/shepherd.js/test/cypress/integration/destroying-elements.cy.js new file mode 100644 index 000000000..54757a575 --- /dev/null +++ b/shepherd.js/test/cypress/integration/destroying-elements.cy.js @@ -0,0 +1,100 @@ +import setupTour from '../utils/setup-tour'; + +describe('destroying-elements', () => { + let Shepherd; + + beforeEach(() => { + Shepherd = null; + + cy.visit('/test/cypress/examples/destroying-elements', { + onLoad(contentWindow) { + if (contentWindow.Shepherd) { + return (Shepherd = contentWindow.Shepherd); + } + } + }); + }); + + it('recalculates positioning when element is removed and added', () => { + const steps = () => { + return [ + { + attachTo: { element: '.first', on: 'bottom' }, + id: 'first', + title: 'First step', + text: 'this is fine the first time' + }, + { + attachTo: { element: '.second', on: 'bottom' }, + id: 'second', + title: 'Second step', + text: 'Please click the destroy button and then the create button. After the First element is created, please click back' + } + ]; + }; + + const tour = setupTour( + Shepherd, + { + cancelIcon: { + enabled: false + } + }, + steps + ); + + tour.start(); + + cy.wait(250); + + let initialPosition; + let missingStepElementPosition; + let finalPosition; + + cy.get('[data-shepherd-step-id="first"]') + .then((stepElement) => { + initialPosition = stepElement.css(['position', 'top', 'left']); + tour.next(); + + return cy.get('.first'); + }) + .then((firstElement) => { + // Remove the first element + firstElement.remove(); + + tour.back(); + cy.wait(250); + + return cy.get('[data-shepherd-step-id="first"]'); + }) + .then((stepElement2) => { + missingStepElementPosition = stepElement2.css([ + 'position', + 'top', + 'left' + ]); + expect(missingStepElementPosition).to.not.deep.equal(initialPosition); + + tour.next(); + + return cy.document(); + }) + .then((document) => { + // Create the first element again + const first = document.createElement('div'); + first.className = 'first'; + first.textContent = 'First'; + document.body.appendChild(first); + + tour.back(); + + cy.wait(250); + + return cy.get('[data-shepherd-step-id="first"]'); + }) + .then((stepElement3) => { + finalPosition = stepElement3.css(['position', 'top', 'left']); + expect(finalPosition).to.deep.equal(initialPosition); + }); + }); +}); diff --git a/test/cypress/integration/element-targeting.cy.js b/shepherd.js/test/cypress/integration/element-targeting.cy.js similarity index 91% rename from test/cypress/integration/element-targeting.cy.js rename to shepherd.js/test/cypress/integration/element-targeting.cy.js index 7bc9a1223..cf73ad3fa 100644 --- a/test/cypress/integration/element-targeting.cy.js +++ b/shepherd.js/test/cypress/integration/element-targeting.cy.js @@ -6,10 +6,10 @@ describe('Attaching tooltips to target elements in the DOM on each step', () => beforeEach(() => { Shepherd = null; - cy.visit('/dummy/', { + cy.visit('/test/cypress/dummy/', { onLoad(contentWindow) { if (contentWindow.Shepherd) { - return Shepherd = contentWindow.Shepherd; + return (Shepherd = contentWindow.Shepherd); } } }); @@ -44,7 +44,7 @@ describe('Attaching tooltips to target elements in the DOM on each step', () => }); }); - describe('Unique selectors with multiple Tours', function() { + describe('Unique selectors with multiple Tours', function () { let firstTour, secondTour; beforeEach(() => { @@ -67,7 +67,7 @@ describe('Attaching tooltips to target elements in the DOM on each step', () => firstTour.complete(); secondTour.complete(); }); - it('applies default classes only on each individual tour', async function() { + it('applies default classes only on each individual tour', async function () { firstTour.start(); secondTour.start(); diff --git a/test/cypress/integration/modal.cy.js b/shepherd.js/test/cypress/integration/modal.cy.js similarity index 70% rename from test/cypress/integration/modal.cy.js rename to shepherd.js/test/cypress/integration/modal.cy.js index f46c035b9..e2d6ed768 100644 --- a/test/cypress/integration/modal.cy.js +++ b/shepherd.js/test/cypress/integration/modal.cy.js @@ -7,10 +7,10 @@ describe('Modal mode', () => { beforeEach(() => { Shepherd = null; - cy.visit('/dummy/', { + cy.visit('/test/cypress/dummy/', { onLoad(contentWindow) { if (contentWindow.Shepherd) { - return Shepherd = contentWindow.Shepherd; + return (Shepherd = contentWindow.Shepherd); } } }); @@ -30,8 +30,15 @@ describe('Modal mode', () => { it('Displaying the modal during tours when modal mode is enabled', () => { tour.start(); - cy.get('.shepherd-modal-overlay-container').should('have.css', 'opacity', '0.5'); - cy.get('.shepherd-modal-overlay-container').should('have.class', 'shepherd-modal-is-visible'); + cy.get('.shepherd-modal-overlay-container').should( + 'have.css', + 'opacity', + '0.5' + ); + cy.get('.shepherd-modal-overlay-container').should( + 'have.class', + 'shepherd-modal-is-visible' + ); }); }); @@ -45,8 +52,15 @@ describe('Modal mode', () => { it('Hiding the modal during tours when modal mode is not enabled', () => { tour.start(); - cy.get('.shepherd-modal-overlay-container').should('have.css', 'opacity', '0'); - cy.get('.shepherd-modal-overlay-container').should('not.have.class', 'shepherd-modal-is-visible'); + cy.get('.shepherd-modal-overlay-container').should( + 'have.css', + 'opacity', + '0' + ); + cy.get('.shepherd-modal-overlay-container').should( + 'not.have.class', + 'shepherd-modal-is-visible' + ); }); }); @@ -55,12 +69,17 @@ describe('Modal mode', () => { tour = setupTour(Shepherd, {}, null, { useModalOverlay: true }); }); - it('removes shepherd-modal-is-visible class from the overlay', async() => { + it('removes shepherd-modal-is-visible class from the overlay', async () => { tour.start(); - await cy.get('.shepherd-modal-overlay-container').should('have.class', 'shepherd-modal-is-visible'); + await cy + .get('.shepherd-modal-overlay-container') + .should('have.class', 'shepherd-modal-is-visible'); tour.hide(); - cy.get('.shepherd-modal-overlay-container').should('not.have.class', 'shepherd-modal-is-visible'); + cy.get('.shepherd-modal-overlay-container').should( + 'not.have.class', + 'shepherd-modal-is-visible' + ); }); }); @@ -88,12 +107,13 @@ describe('Modal mode', () => { it('applying highlight classes to the target element', () => { tour.start(); - expect(tour.getCurrentStep().target.classList.contains('highlight')).to.be.true; + expect(tour.getCurrentStep().target.classList.contains('highlight')).to.be + .true; }); }); - describe('Modal with multiple Tours', function() { - it('only activates one SVG overall', async function() { + describe('Modal with multiple Tours', function () { + it('only activates one SVG overall', async function () { const steps = [ { id: 'test', diff --git a/test/cypress/integration/test.acceptance.cy.js b/shepherd.js/test/cypress/integration/test.acceptance.cy.js similarity index 74% rename from test/cypress/integration/test.acceptance.cy.js rename to shepherd.js/test/cypress/integration/test.acceptance.cy.js index b4506b200..aa6dd7883 100644 --- a/test/cypress/integration/test.acceptance.cy.js +++ b/shepherd.js/test/cypress/integration/test.acceptance.cy.js @@ -7,10 +7,10 @@ describe('Shepherd Acceptance Tests', () => { beforeEach(() => { Shepherd = null; - cy.visit('/dummy/', { + cy.visit('/test/cypress/dummy/', { onLoad(contentWindow) { if (contentWindow.Shepherd) { - return Shepherd = contentWindow.Shepherd; + return (Shepherd = contentWindow.Shepherd); } } }); @@ -33,26 +33,37 @@ describe('Shepherd Acceptance Tests', () => { ]; }; - const tour = setupTour(Shepherd, { - cancelIcon: { - enabled: false - } - }, steps); + const tour = setupTour( + Shepherd, + { + cancelIcon: { + enabled: false + } + }, + steps + ); tour.start(); // Step text should be visible cy.get('.shepherd-text') - .contains('Shepherd is a JavaScript library').should('be.visible'); + .contains('Shepherd is a JavaScript library') + .should('be.visible'); cy.document().then((document) => { - assert.deepEqual(document.querySelector('[data-test-hero-welcome]'), tour.getCurrentStep().target, 'hero welcome is the target'); + assert.deepEqual( + document.querySelector('[data-test-hero-welcome]'), + tour.getCurrentStep().target, + 'hero welcome is the target' + ); }); }); it('works with DOM elements', () => { cy.document().then((document) => { - const heroIncludingElement = document.querySelector('[data-test-hero-including]'); + const heroIncludingElement = document.querySelector( + '[data-test-hero-including]' + ); const steps = () => { return [ @@ -67,16 +78,25 @@ describe('Shepherd Acceptance Tests', () => { } ]; }; - const tour = setupTour(Shepherd, { - cancelIcon: { - enabled: false - } - }, steps); + const tour = setupTour( + Shepherd, + { + cancelIcon: { + enabled: false + } + }, + steps + ); tour.start(); // Step text should be visible cy.get('.shepherd-text') - .contains('Including Shepherd is easy!').should('be.visible'); - assert.deepEqual(heroIncludingElement, tour.getCurrentStep().target, 'heroIncludingElement is the target'); + .contains('Including Shepherd is easy!') + .should('be.visible'); + assert.deepEqual( + heroIncludingElement, + tour.getCurrentStep().target, + 'heroIncludingElement is the target' + ); }); }); @@ -87,22 +107,28 @@ describe('Shepherd Acceptance Tests', () => { { text: 'You may provide function returning DOM node references.', attachTo: { - element: () => document.querySelector('[data-test-hero-including]'), + element: () => + document.querySelector('[data-test-hero-including]'), on: 'bottom' }, id: 'including' } ]; }; - const tour = setupTour(Shepherd, { - cancelIcon: { - enabled: false - } - }, steps); + const tour = setupTour( + Shepherd, + { + cancelIcon: { + enabled: false + } + }, + steps + ); tour.start(); // Step text should be visible cy.get('.shepherd-text') - .contains('You may provide function returning DOM node references.').should('be.visible'); + .contains('You may provide function returning DOM node references.') + .should('be.visible'); assert.deepEqual( document.querySelector('[data-test-hero-including]'), tour.getCurrentStep().target, @@ -125,15 +151,20 @@ describe('Shepherd Acceptance Tests', () => { } ]; }; - const tour = setupTour(Shepherd, { - cancelIcon: { - enabled: false - } - }, steps); + const tour = setupTour( + Shepherd, + { + cancelIcon: { + enabled: false + } + }, + steps + ); tour.start(); // Step text should be visible cy.get('.shepherd-text') - .contains('You may provide functions returning selectors.').should('be.visible'); + .contains('You may provide functions returning selectors.') + .should('be.visible'); assert.deepEqual( document.querySelector('[data-test-hero-including]'), tour.getCurrentStep().target, @@ -156,17 +187,28 @@ describe('Shepherd Acceptance Tests', () => { } ]; }; - const tour = setupTour(Shepherd, { - cancelIcon: { - enabled: false - } - }, steps); + const tour = setupTour( + Shepherd, + { + cancelIcon: { + enabled: false + } + }, + steps + ); tour.start(); // Step text should be visible cy.get('.shepherd-text') - .contains('When attachTo.element callback returns null, the step is centered.').should('be.visible'); + .contains( + 'When attachTo.element callback returns null, the step is centered.' + ) + .should('be.visible'); cy.document().then(() => { - assert.deepEqual(null, tour.getCurrentStep().target, 'target is null'); + assert.deepEqual( + null, + tour.getCurrentStep().target, + 'target is null' + ); }); }); }); @@ -181,17 +223,26 @@ describe('Shepherd Acceptance Tests', () => { } ]; }; - const tour = setupTour(Shepherd, { - cancelIcon: { - enabled: false - } - }, steps); + const tour = setupTour( + Shepherd, + { + cancelIcon: { + enabled: false + } + }, + steps + ); tour.start(); // Step text should be visible cy.get('.shepherd-text') - .contains('When attachTo is undefined, the step is centered.').should('be.visible'); + .contains('When attachTo is undefined, the step is centered.') + .should('be.visible'); cy.document().then(() => { - assert.deepEqual(undefined, tour.getCurrentStep().target, 'target is undefined'); + assert.deepEqual( + undefined, + tour.getCurrentStep().target, + 'target is undefined' + ); }); }); @@ -210,25 +261,36 @@ describe('Shepherd Acceptance Tests', () => { ]; }; - const tour = setupTour(Shepherd, { - cancelIcon: { - enabled: false - } - }, steps); + const tour = setupTour( + Shepherd, + { + cancelIcon: { + enabled: false + } + }, + steps + ); tour.start(); // Step text should be visible cy.get('.shepherd-text') - .contains('When attachTo.element selector is not present in the DOM, the step is centered.').should('be.visible'); + .contains( + 'When attachTo.element selector is not present in the DOM, the step is centered.' + ) + .should('be.visible'); cy.document().then(() => { - assert.deepEqual(null, tour.getCurrentStep().target, 'target is undefined'); + assert.deepEqual( + null, + tour.getCurrentStep().target, + 'target is undefined' + ); }); }); // This tests whether we can create and start a tour containing steps attached to elements that do not yet exist. // We create the element between steps to simulate step target rendering upon user action. - + it('correctly attaches to multiple lazily-evaluated elements', () => { cy.document().then((document) => { const steps = () => { @@ -255,34 +317,45 @@ describe('Shepherd Acceptance Tests', () => { ]; }; - const tour = setupTour(Shepherd, { - cancelIcon: { - enabled: false - } - }, steps); - + const tour = setupTour( + Shepherd, + { + cancelIcon: { + enabled: false + } + }, + steps + ); + tour.start(); - const barTarget = document.createElement('div'); - barTarget.setAttribute('id', 'bar') - document.querySelector('[data-test-hero-including]').appendChild(barTarget); + barTarget.setAttribute('id', 'bar'); + document + .querySelector('[data-test-hero-including]') + .appendChild(barTarget); const bazTarget = document.createElement('div'); bazTarget.setAttribute('class', 'baz'); bazTarget.setAttribute('id', 'baz'); - document.querySelector('[data-test-hero-including]').appendChild(bazTarget); + document + .querySelector('[data-test-hero-including]') + .appendChild(bazTarget); const quxTarget = document.createElement('div'); quxTarget.setAttribute('class', 'baz'); quxTarget.setAttribute('id', 'qux'); - document.querySelector('[data-test-hero-including]').appendChild(quxTarget); + document + .querySelector('[data-test-hero-including]') + .appendChild(quxTarget); + + tour.next(); - tour.next() - cy.get('[data-shepherd-step-id="bar"] .shepherd-text') .then(() => { - cy.get('[data-shepherd-step-id="bar"] .shepherd-text').contains('bar').should('be.visible'); + cy.get('[data-shepherd-step-id="bar"] .shepherd-text') + .contains('bar') + .should('be.visible'); assert.deepEqual( document.querySelector('#bar'), tour.getCurrentStep().target, @@ -290,30 +363,34 @@ describe('Shepherd Acceptance Tests', () => { ); }) .then(() => { - tour.next() - }) - + tour.next(); + }); + cy.get('[data-shepherd-step-id="baz"] .shepherd-text') .then(() => { - cy.get('[data-shepherd-step-id="baz"] .shepherd-text').contains('baz').should('be.visible'); + cy.get('[data-shepherd-step-id="baz"] .shepherd-text') + .contains('baz') + .should('be.visible'); assert.deepEqual( document.querySelector('#baz'), tour.getCurrentStep().target, '#baz is the target' - ) + ); }) .then(() => { - bazTarget.remove() + bazTarget.remove(); }) .then(() => { - cy.get('[data-shepherd-step-id="baz"] .shepherd-text').contains('baz').should('be.visible'); + cy.get('[data-shepherd-step-id="baz"] .shepherd-text') + .contains('baz') + .should('be.visible'); cy.get('.shepherd-element').should('have.focus'); assert.deepEqual( tour.getCurrentStep()._getResolvedAttachToOptions().on, 'bottom', 'Resolved attachTo on is maintained' - ) - }) + ); + }); }); }); @@ -335,18 +412,24 @@ describe('Shepherd Acceptance Tests', () => { ]; }; - const tour = setupTour(Shepherd, { - cancelIcon: { - enabled: false - } - }, steps); + const tour = setupTour( + Shepherd, + { + cancelIcon: { + enabled: false + } + }, + steps + ); tour.start(); const lazyTarget = document.createElement('div'); lazyTarget.setAttribute('id', 'lazyTarget'); // Append to the hero so that the element is in viewport when running the test - document.querySelector('[data-test-hero-including]').appendChild(lazyTarget); + document + .querySelector('[data-test-hero-including]') + .appendChild(lazyTarget); cy.wait(250); @@ -354,14 +437,15 @@ describe('Shepherd Acceptance Tests', () => { // Step text should be visible cy.get('[data-shepherd-step-id="lazyStep"] .shepherd-text') - .contains('Lazy target evaluation works too!').should('be.visible'); + .contains('Lazy target evaluation works too!') + .should('be.visible'); assert.deepEqual( document.querySelector('#lazyTarget'), tour.getCurrentStep().target, '#dummyTarget is the target' ); }); - }); + }); }); describe('buttons', () => { @@ -437,7 +521,9 @@ describe('Shepherd Acceptance Tests', () => { // Click next cy.contains('Next').click(); // Step two text should be visible - cy.get('.shepherd-text').contains('Including Shepherd is easy!').should('be.visible'); + cy.get('.shepherd-text') + .contains('Including Shepherd is easy!') + .should('be.visible'); cy.get('.shepherd-cancel-icon:nth-child(2)').click(); cy.get('.shepherd-element').should('not.exist'); }); @@ -449,15 +535,13 @@ describe('Shepherd Acceptance Tests', () => { } }); tour.start(); - cy.get('.shepherd-cancel-icon') - .should('not.exist'); + cy.get('.shepherd-cancel-icon').should('not.exist'); }); it('Shows cancel link', () => { const tour = setupTour(Shepherd); tour.start(); - cy.get('.shepherd-cancel-icon') - .should('be.visible'); + cy.get('.shepherd-cancel-icon').should('be.visible'); }); }); @@ -527,12 +611,14 @@ describe('Shepherd Acceptance Tests', () => { .then((element) => calculateCenteredScrollTop(element[0])) .then((scrollTop) => { const plusOrMinusPx = 10; - cy.window().its('scrollY').should('be.closeTo', scrollTop, plusOrMinusPx) + cy.window() + .its('scrollY') + .should('be.closeTo', scrollTop, plusOrMinusPx); }); }); }); - describe("arrow padding", () => { + describe('arrow padding', () => { it('uses provided arrow padding', () => { const tour = setupTour(Shepherd, {}, () => [ { @@ -542,7 +628,8 @@ describe('Shepherd Acceptance Tests', () => { on: 'left-end' }, arrow: true, - classes: 'shepherd-step-element shepherd-transparent-text first-step', + classes: + 'shepherd-step-element shepherd-transparent-text first-step', id: 'welcome' } ]); @@ -550,10 +637,12 @@ describe('Shepherd Acceptance Tests', () => { tour.start(); cy.wait(250); - cy.get('[data-shepherd-step-id="welcome"] .shepherd-arrow').then((arrowElement) => { - const finalPosition = arrowElement.css(['top']); - expect(finalPosition).to.deep.equal({ top: "4px" }); - }); + cy.get('[data-shepherd-step-id="welcome"] .shepherd-arrow').then( + (arrowElement) => { + const finalPosition = arrowElement.css(['top']); + expect(finalPosition).to.deep.equal({ top: '4px' }); + } + ); }); it('uses a default arrow padding if not provided', () => { @@ -565,17 +654,20 @@ describe('Shepherd Acceptance Tests', () => { on: 'left-end' }, arrow: { padding: 10 }, - classes: 'shepherd-step-element shepherd-transparent-text first-step', + classes: + 'shepherd-step-element shepherd-transparent-text first-step', id: 'welcome' } ]); tour.start(); cy.wait(250); - cy.get('[data-shepherd-step-id="welcome"] .shepherd-arrow').then((arrowElement) => { - const finalPosition = arrowElement.css(['top']); - expect(finalPosition).to.deep.equal({ top: "10px" }); - }); + cy.get('[data-shepherd-step-id="welcome"] .shepherd-arrow').then( + (arrowElement) => { + const finalPosition = arrowElement.css(['top']); + expect(finalPosition).to.deep.equal({ top: '10px' }); + } + ); }); }); }); diff --git a/test/cypress/support/commands.js b/shepherd.js/test/cypress/support/commands.js similarity index 100% rename from test/cypress/support/commands.js rename to shepherd.js/test/cypress/support/commands.js diff --git a/test/cypress/support/index.js b/shepherd.js/test/cypress/support/index.js similarity index 100% rename from test/cypress/support/index.js rename to shepherd.js/test/cypress/support/index.js diff --git a/test/cypress/utils/default-buttons.js b/shepherd.js/test/cypress/utils/default-buttons.js similarity index 100% rename from test/cypress/utils/default-buttons.js rename to shepherd.js/test/cypress/utils/default-buttons.js diff --git a/test/cypress/utils/default-steps.js b/shepherd.js/test/cypress/utils/default-steps.js similarity index 95% rename from test/cypress/utils/default-steps.js rename to shepherd.js/test/cypress/utils/default-steps.js index 7fe28298f..ba5e6dc4a 100644 --- a/test/cypress/utils/default-steps.js +++ b/shepherd.js/test/cypress/utils/default-steps.js @@ -1,4 +1,4 @@ -export default function(shepherd) { +export default function (shepherd) { return [ { text: ` @@ -22,7 +22,8 @@ export default function(shepherd) { action: shepherd.cancel, classes: 'shepherd-button-secondary cancel-button', text: 'Exit' - }, { + }, + { action: shepherd.next, classes: 'shepherd-button-example-primary next-button', text: 'Next' @@ -42,7 +43,8 @@ export default function(shepherd) { action: shepherd.back, classes: 'shepherd-button-secondary back-button', text: 'Back' - }, { + }, + { action: shepherd.next, classes: 'shepherd-button-example-primary next-button', text: 'Next' @@ -63,7 +65,8 @@ export default function(shepherd) { action: shepherd.back, classes: 'shepherd-button-secondary back-button', text: 'Back' - }, { + }, + { action: shepherd.next, classes: 'shepherd-button-example-primary next-button', text: 'Next' @@ -84,7 +87,8 @@ export default function(shepherd) { action: shepherd.back, classes: 'shepherd-button-secondary back-button', text: 'Back' - }, { + }, + { action: shepherd.next, classes: 'shepherd-button-example-primary next-button', text: 'Done' diff --git a/test/cypress/utils/setup-tour.js b/shepherd.js/test/cypress/utils/setup-tour.js similarity index 97% rename from test/cypress/utils/setup-tour.js rename to shepherd.js/test/cypress/utils/setup-tour.js index a2c79a6cb..bb784f0c0 100644 --- a/test/cypress/utils/setup-tour.js +++ b/shepherd.js/test/cypress/utils/setup-tour.js @@ -21,7 +21,7 @@ export default function (Shepherd, globalDefaults, customSteps, otherOptions) { const shepherdOptions = Object.assign( {}, { - defaultStepOptions, + defaultStepOptions }, otherOptions ); diff --git a/test/unit/babel.config.cjs b/shepherd.js/test/unit/babel.config.cjs similarity index 100% rename from test/unit/babel.config.cjs rename to shepherd.js/test/unit/babel.config.cjs diff --git a/test/unit/components/shepherd-button.spec.js b/shepherd.js/test/unit/components/shepherd-button.spec.js similarity index 97% rename from test/unit/components/shepherd-button.spec.js rename to shepherd.js/test/unit/components/shepherd-button.spec.js index b16746fc1..6507a7e63 100644 --- a/test/unit/components/shepherd-button.spec.js +++ b/shepherd.js/test/unit/components/shepherd-button.spec.js @@ -1,6 +1,7 @@ import { cleanup, render } from '@testing-library/svelte'; import { tick } from 'svelte'; -import ShepherdButton from '../../../shepherd.js/src/components/shepherd-button.svelte'; +import { beforeEach, describe, expect, it } from 'vitest'; +import ShepherdButton from '../../../src/components/shepherd-button.svelte'; describe('component/ShepherdButton', () => { beforeEach(cleanup); diff --git a/test/unit/components/shepherd-content.spec.js b/shepherd.js/test/unit/components/shepherd-content.spec.js similarity index 68% rename from test/unit/components/shepherd-content.spec.js rename to shepherd.js/test/unit/components/shepherd-content.spec.js index 25ba35efc..231741ed6 100644 --- a/test/unit/components/shepherd-content.spec.js +++ b/shepherd.js/test/unit/components/shepherd-content.spec.js @@ -1,5 +1,6 @@ import { cleanup, render } from '@testing-library/svelte'; -import ShepherdContent from '../../../shepherd.js/src/components/shepherd-content.svelte'; +import { beforeEach, describe, expect, it } from 'vitest'; +import ShepherdContent from '../../../src/components/shepherd-content.svelte'; describe('components/ShepherdContent', () => { beforeEach(cleanup); @@ -17,7 +18,9 @@ describe('components/ShepherdContent', () => { const { container } = render(ShepherdContent, { props: { step } }); - expect(container.querySelector('.shepherd-content .shepherd-header')).toBeInTheDocument(); + expect( + container.querySelector('.shepherd-content .shepherd-header') + ).toBeInTheDocument(); }); it('is rendered when title is present', () => { @@ -29,7 +32,9 @@ describe('components/ShepherdContent', () => { const { container } = render(ShepherdContent, { props: { step } }); - expect(container.querySelector('.shepherd-content .shepherd-header')).toBeInTheDocument(); + expect( + container.querySelector('.shepherd-content .shepherd-header') + ).toBeInTheDocument(); }); it('is rendered when cancelIcon is enabled', () => { @@ -43,7 +48,9 @@ describe('components/ShepherdContent', () => { const { container } = render(ShepherdContent, { props: { step } }); - expect(container.querySelector('.shepherd-content .shepherd-header')).toBeInTheDocument(); + expect( + container.querySelector('.shepherd-content .shepherd-header') + ).toBeInTheDocument(); }); it('is not rendered when title is not present and cancelIcon is disabled', () => { @@ -55,7 +62,9 @@ describe('components/ShepherdContent', () => { const { container } = render(ShepherdContent, { props: { step } }); - expect(container.querySelector('.shepherd-header')).not.toBeInTheDocument(); + expect( + container.querySelector('.shepherd-header') + ).not.toBeInTheDocument(); }); }); }); diff --git a/test/unit/components/shepherd-element.spec.js b/shepherd.js/test/unit/components/shepherd-element.spec.js similarity index 89% rename from test/unit/components/shepherd-element.spec.js rename to shepherd.js/test/unit/components/shepherd-element.spec.js index 9f44007ab..3039033f4 100644 --- a/test/unit/components/shepherd-element.spec.js +++ b/shepherd.js/test/unit/components/shepherd-element.spec.js @@ -1,8 +1,8 @@ -import { vi } from 'vitest'; +import { beforeEach, describe, expect, it, vi } from 'vitest'; import { cleanup, fireEvent, render } from '@testing-library/svelte'; -import ShepherdElement from '../../../shepherd.js/src/components/shepherd-element.svelte'; -import { Step } from '../../../shepherd.js/src/step'; -import { Tour } from '../../../shepherd.js/src/tour'; +import ShepherdElement from '../../../src/components/shepherd-element.svelte'; +import { Step } from '../../../src/step'; +import { Tour } from '../../../src/tour'; describe('components/ShepherdElement', () => { describe('arrow', () => { @@ -63,7 +63,7 @@ describe('components/ShepherdElement', () => { container.querySelectorAll('.shepherd-element .shepherd-arrow').length ).toBe(1); }); - + it('arrow: empty object shows arrow', async () => { const testElement = document.createElement('div'); const tour = new Tour(); @@ -124,12 +124,8 @@ describe('components/ShepherdElement', () => { const step = new Step(tour, {}); let propagateValue = 0; - const tourBackStub = vi - .spyOn(tour, 'back') - .mockImplementation(() => {}); - const tourNextStub = vi - .spyOn(tour, 'next') - .mockImplementation(() => {}); + const tourBackStub = vi.spyOn(tour, 'back').mockImplementation(() => {}); + const tourNextStub = vi.spyOn(tour, 'next').mockImplementation(() => {}); // Add a keystroke listener to a parent to test event propagation document.body.addEventListener('keydown', (event) => { @@ -170,12 +166,8 @@ describe('components/ShepherdElement', () => { const step = new Step(tour, {}); let propagateValue = 0; - const tourBackStub = vi - .spyOn(tour, 'back') - .mockImplementation(() => {}); - const tourNextStub = vi - .spyOn(tour, 'next') - .mockImplementation(() => {}); + const tourBackStub = vi.spyOn(tour, 'back').mockImplementation(() => {}); + const tourNextStub = vi.spyOn(tour, 'next').mockImplementation(() => {}); // Add a keystroke listener to a parent to test event propagation document.body.addEventListener('keydown', (event) => { diff --git a/test/unit/components/shepherd-footer.spec.js b/shepherd.js/test/unit/components/shepherd-footer.spec.js similarity index 66% rename from test/unit/components/shepherd-footer.spec.js rename to shepherd.js/test/unit/components/shepherd-footer.spec.js index 7491a6c94..ccc2dc399 100644 --- a/test/unit/components/shepherd-footer.spec.js +++ b/shepherd.js/test/unit/components/shepherd-footer.spec.js @@ -1,5 +1,6 @@ import { cleanup, render } from '@testing-library/svelte'; -import ShepherdFooter from '../../../shepherd.js/src/components/shepherd-footer.svelte'; +import { beforeEach, describe, expect, it } from 'vitest'; +import ShepherdFooter from '../../../src/components/shepherd-footer.svelte'; import defaultButtons from '../../cypress/utils/default-buttons.js'; describe('components/ShepherdFooter', () => { @@ -18,7 +19,9 @@ describe('components/ShepherdFooter', () => { } }); - const buttons = container.querySelectorAll('.shepherd-footer .shepherd-button'); + const buttons = container.querySelectorAll( + '.shepherd-footer .shepherd-button' + ); expect(buttons.length).toBe(0); }); @@ -31,17 +34,16 @@ describe('components/ShepherdFooter', () => { } }); - const buttons = container.querySelectorAll('.shepherd-footer .shepherd-button'); + const buttons = container.querySelectorAll( + '.shepherd-footer .shepherd-button' + ); expect(buttons.length).toBe(0); }); it('renders buttons for each item passed to `options.buttons`', () => { const step = { options: { - buttons: [ - defaultButtons.cancel, - defaultButtons.next - ] + buttons: [defaultButtons.cancel, defaultButtons.next] } }; @@ -51,17 +53,23 @@ describe('components/ShepherdFooter', () => { } }); - const buttons = container.querySelectorAll('.shepherd-footer .shepherd-button'); + const buttons = container.querySelectorAll( + '.shepherd-footer .shepherd-button' + ); expect(buttons.length).toBe(2); const cancelButton = container.querySelector('footer .cancel-button'); expect(cancelButton).toHaveAttribute('tabindex', '0'); - expect(cancelButton).toHaveClass('shepherd-button-secondary cancel-button shepherd-button'); + expect(cancelButton).toHaveClass( + 'shepherd-button-secondary cancel-button shepherd-button' + ); expect(cancelButton).toHaveTextContent('Exit'); const nextButton = container.querySelector('footer .next-button'); expect(nextButton).toHaveAttribute('tabindex', '0'); - expect(nextButton).toHaveClass('shepherd-button-primary next-button shepherd-button'); + expect(nextButton).toHaveClass( + 'shepherd-button-primary next-button shepherd-button' + ); expect(nextButton).toHaveTextContent('Next'); }); }); diff --git a/test/unit/components/shepherd-header.spec.js b/shepherd.js/test/unit/components/shepherd-header.spec.js similarity index 89% rename from test/unit/components/shepherd-header.spec.js rename to shepherd.js/test/unit/components/shepherd-header.spec.js index 1cbd56c32..ff619751f 100644 --- a/test/unit/components/shepherd-header.spec.js +++ b/shepherd.js/test/unit/components/shepherd-header.spec.js @@ -1,8 +1,8 @@ -import { vi } from 'vitest'; +import { beforeEach, describe, expect, it, vi } from 'vitest'; import { cleanup, fireEvent, render } from '@testing-library/svelte'; -import ShepherdHeader from '../../../shepherd.js/src/components/shepherd-header.svelte'; -import { Tour } from '../../../shepherd.js/src/tour'; -import { Step } from '../../../shepherd.js/src/step'; +import ShepherdHeader from '../../../src/components/shepherd-header.svelte'; +import { Tour } from '../../../src/tour'; +import { Step } from '../../../src/step'; describe('components/ShepherdHeader', () => { beforeEach(cleanup); diff --git a/test/unit/components/shepherd-modal.spec.js b/shepherd.js/test/unit/components/shepherd-modal.spec.js similarity index 96% rename from test/unit/components/shepherd-modal.spec.js rename to shepherd.js/test/unit/components/shepherd-modal.spec.js index 09c62bdca..c71e1c5d3 100644 --- a/test/unit/components/shepherd-modal.spec.js +++ b/shepherd.js/test/unit/components/shepherd-modal.spec.js @@ -1,5 +1,5 @@ -import { vi } from 'vitest'; -import ShepherdModal from '../../../shepherd.js/src/components/shepherd-modal.svelte'; +import { afterEach, describe, expect, it, vi } from 'vitest'; +import ShepherdModal from '../../../src/components/shepherd-modal.svelte'; import { mount, unmount } from 'svelte'; const classPrefix = ''; @@ -515,7 +515,6 @@ describe('components/ShepherdModal', () => { showStub.mockRestore(); }); - // eslint-disable-next-line jest/no-disabled-tests it.skip('useModalOverlay: false, hides modal', async () => { const modalComponent = mount(ShepherdModal, { target: document.body, @@ -532,12 +531,8 @@ describe('components/ShepherdModal', () => { } } }; - hideStub = jest - .spyOn(modalComponent, 'hide') - .mockImplementation(() => {}); - showStub = jest - .spyOn(modalComponent, 'show') - .mockImplementation(() => {}); + hideStub = vi.spyOn(modalComponent, 'hide').mockImplementation(() => {}); + showStub = vi.spyOn(modalComponent, 'show').mockImplementation(() => {}); await modalComponent.setupForStep(step); expect(hideStub).toHaveBeenCalled(); @@ -546,7 +541,6 @@ describe('components/ShepherdModal', () => { unmount(modalComponent); }); - // eslint-disable-next-line jest/no-disabled-tests it.skip('useModalOverlay: true, shows modal', async () => { const modalComponent = mount(ShepherdModal, { target: document.body, @@ -563,12 +557,8 @@ describe('components/ShepherdModal', () => { } } }; - hideStub = jest - .spyOn(modalComponent, 'hide') - .mockImplementation(() => {}); - showStub = jest - .spyOn(modalComponent, 'show') - .mockImplementation(() => {}); + hideStub = vi.spyOn(modalComponent, 'hide').mockImplementation(() => {}); + showStub = vi.spyOn(modalComponent, 'show').mockImplementation(() => {}); await modalComponent.setupForStep(step); expect(hideStub).not.toHaveBeenCalled(); diff --git a/test/unit/components/shepherd-text.spec.js b/shepherd.js/test/unit/components/shepherd-text.spec.js similarity index 79% rename from test/unit/components/shepherd-text.spec.js rename to shepherd.js/test/unit/components/shepherd-text.spec.js index bb1f5fdaf..63092c458 100644 --- a/test/unit/components/shepherd-text.spec.js +++ b/shepherd.js/test/unit/components/shepherd-text.spec.js @@ -1,5 +1,6 @@ import { cleanup, render } from '@testing-library/svelte'; -import ShepherdText from '../../../shepherd.js/src/components/shepherd-text.svelte'; +import { beforeEach, describe, expect, it } from 'vitest'; +import ShepherdText from '../../../src/components/shepherd-text.svelte'; describe('components/ShepherdText', () => { beforeEach(cleanup); @@ -17,7 +18,9 @@ describe('components/ShepherdText', () => { } }); - expect(container.querySelector('.shepherd-text')).toHaveTextContent('I am some test text.'); + expect(container.querySelector('.shepherd-text')).toHaveTextContent( + 'I am some test text.' + ); }); it('applies HTML element directly to content', () => { @@ -33,7 +36,9 @@ describe('components/ShepherdText', () => { } }); - expect(container.querySelector('.shepherd-text')).toContainHTML('

I am some test text.

'); + expect(container.querySelector('.shepherd-text')).toContainHTML( + '

I am some test text.

' + ); }); it('applies the text from a function', () => { @@ -49,6 +54,8 @@ describe('components/ShepherdText', () => { } }); - expect(container.querySelector('.shepherd-text')).toHaveTextContent('I am some test text.'); + expect(container.querySelector('.shepherd-text')).toHaveTextContent( + 'I am some test text.' + ); }); }); diff --git a/test/unit/components/shepherd-title.spec.js b/shepherd.js/test/unit/components/shepherd-title.spec.js similarity index 73% rename from test/unit/components/shepherd-title.spec.js rename to shepherd.js/test/unit/components/shepherd-title.spec.js index 71f366ee6..62b117df3 100644 --- a/test/unit/components/shepherd-title.spec.js +++ b/shepherd.js/test/unit/components/shepherd-title.spec.js @@ -1,5 +1,6 @@ import { cleanup, render } from '@testing-library/svelte'; -import ShepherdTitle from '../../../shepherd.js/src/components/shepherd-title.svelte'; +import { beforeEach, describe, expect, it } from 'vitest'; +import ShepherdTitle from '../../../src/components/shepherd-title.svelte'; describe('components/ShepherdTitle', () => { beforeEach(cleanup); @@ -11,7 +12,9 @@ describe('components/ShepherdTitle', () => { } }); - expect(container.querySelector('.shepherd-title')).toHaveTextContent('I am some test title.'); + expect(container.querySelector('.shepherd-title')).toHaveTextContent( + 'I am some test title.' + ); }); it('applies the title from a function', () => { @@ -21,6 +24,8 @@ describe('components/ShepherdTitle', () => { } }); - expect(container.querySelector('.shepherd-title')).toHaveTextContent('I am some test title.'); + expect(container.querySelector('.shepherd-title')).toHaveTextContent( + 'I am some test title.' + ); }); }); diff --git a/test/unit/evented.spec.js b/shepherd.js/test/unit/evented.spec.js similarity index 95% rename from test/unit/evented.spec.js rename to shepherd.js/test/unit/evented.spec.js index 374ca383d..41b4c0935 100644 --- a/test/unit/evented.spec.js +++ b/shepherd.js/test/unit/evented.spec.js @@ -1,6 +1,6 @@ -import { vi } from 'vitest'; +import { beforeEach, describe, expect, it, vi } from 'vitest'; -import { Evented } from '../../shepherd.js/src/evented'; +import { Evented } from '../../src/evented'; describe('Evented', () => { let testEvent, testOnTriggered; diff --git a/test/unit/server.spec.js b/shepherd.js/test/unit/server.spec.js similarity index 76% rename from test/unit/server.spec.js rename to shepherd.js/test/unit/server.spec.js index 4cc0c33a8..c05dcf6b9 100644 --- a/test/unit/server.spec.js +++ b/shepherd.js/test/unit/server.spec.js @@ -2,7 +2,8 @@ * @jest-environment node */ -import Shepherd from '../../shepherd.js/src/shepherd'; +import { describe, expect, it } from 'vitest'; +import Shepherd from '../../src/shepherd'; describe('Server Side Render', function () { describe('Tour constructor', function () { diff --git a/test/unit/setupTests.js b/shepherd.js/test/unit/setupTests.js similarity index 100% rename from test/unit/setupTests.js rename to shepherd.js/test/unit/setupTests.js diff --git a/test/unit/step.spec.js b/shepherd.js/test/unit/step.spec.js similarity index 99% rename from test/unit/step.spec.js rename to shepherd.js/test/unit/step.spec.js index 902edb4ef..b94dacbbc 100644 --- a/test/unit/step.spec.js +++ b/shepherd.js/test/unit/step.spec.js @@ -1,7 +1,7 @@ -import { vi } from 'vitest'; -import Shepherd from '../../shepherd.js/src/shepherd'; -import { Step } from '../../shepherd.js/src/step'; -import { Tour } from '../../shepherd.js/src/tour'; +import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'; +import Shepherd from '../../src/shepherd'; +import { Step } from '../../src/step'; +import { Tour } from '../../src/tour'; import ResizeObserver from 'resize-observer-polyfill'; import { offset } from '@floating-ui/dom'; diff --git a/test/unit/test-helpers.js b/shepherd.js/test/unit/test-helpers.js similarity index 100% rename from test/unit/test-helpers.js rename to shepherd.js/test/unit/test-helpers.js diff --git a/test/unit/tour.spec.js b/shepherd.js/test/unit/tour.spec.js similarity index 99% rename from test/unit/tour.spec.js rename to shepherd.js/test/unit/tour.spec.js index 013a92427..f8d74fcfa 100644 --- a/test/unit/tour.spec.js +++ b/shepherd.js/test/unit/tour.spec.js @@ -1,8 +1,8 @@ import _ from 'lodash'; -import { vi } from 'vitest'; -import Shepherd from '../../shepherd.js/src/shepherd'; +import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'; +import Shepherd from '../../src/shepherd'; import ResizeObserver from 'resize-observer-polyfill'; -import { setupTooltip } from '../../shepherd.js/src/utils/floating-ui'; +import { setupTooltip } from '../../src/utils/floating-ui'; import { offset } from '@floating-ui/dom'; const { Step } = Shepherd; diff --git a/test/unit/utils/bind.spec.js b/shepherd.js/test/unit/utils/bind.spec.js similarity index 93% rename from test/unit/utils/bind.spec.js rename to shepherd.js/test/unit/utils/bind.spec.js index a471d7d3c..4c945dfa4 100644 --- a/test/unit/utils/bind.spec.js +++ b/shepherd.js/test/unit/utils/bind.spec.js @@ -1,7 +1,7 @@ -import { vi } from 'vitest'; +import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'; -import { bindAdvance } from '../../../shepherd.js/src/utils/bind'; -import { Step } from '../../../shepherd.js/src/step'; +import { bindAdvance } from '../../../src/utils/bind'; +import { Step } from '../../../src/step'; describe('Bind Utils', function () { describe('bindAdvance()', () => { diff --git a/test/unit/utils/cleanup.spec.js b/shepherd.js/test/unit/utils/cleanup.spec.js similarity index 97% rename from test/unit/utils/cleanup.spec.js rename to shepherd.js/test/unit/utils/cleanup.spec.js index 5df8f90d4..1eb9107c1 100644 --- a/test/unit/utils/cleanup.spec.js +++ b/shepherd.js/test/unit/utils/cleanup.spec.js @@ -1,4 +1,5 @@ -import { cleanupSteps } from '../../../shepherd.js/src/utils/cleanup'; +import { describe, expect, it } from 'vitest'; +import { cleanupSteps } from '../../../src/utils/cleanup'; describe('Cleanup Utils', function () { // Create some elements to use to attach to diff --git a/test/unit/utils/general.spec.js b/shepherd.js/test/unit/utils/general.spec.js similarity index 95% rename from test/unit/utils/general.spec.js rename to shepherd.js/test/unit/utils/general.spec.js index d8ddb5464..a2dcdfd23 100644 --- a/test/unit/utils/general.spec.js +++ b/shepherd.js/test/unit/utils/general.spec.js @@ -1,11 +1,11 @@ -import { vi } from 'vitest'; -import { Step } from '../../../shepherd.js/src/step'; +import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'; +import { Step } from '../../../src/step'; import { parseAttachTo, shouldCenterStep, parseExtraHighlights -} from '../../../shepherd.js//src/utils/general'; -import { getFloatingUIOptions } from '../../../shepherd.js/src/utils/floating-ui'; +} from '../../../src/utils/general'; +import { getFloatingUIOptions } from '../../../src/utils/floating-ui'; describe('General Utils', function () { let optionsElement; diff --git a/test/unit/vitest.config.ts b/shepherd.js/vitest.config.ts similarity index 61% rename from test/unit/vitest.config.ts rename to shepherd.js/vitest.config.ts index eae71c7a8..7dfd2ad4c 100644 --- a/test/unit/vitest.config.ts +++ b/shepherd.js/vitest.config.ts @@ -16,21 +16,25 @@ export default defineConfig({ test: { globals: true, environment: 'happy-dom', - setupFiles: ['./setupTests.js'], + setupFiles: ['./test/unit/setupTests.js'], coverage: { - include: [ - '../../shepherd.js/src/*.ts', - '../../shepherd.js/src/*.svelte', - '../../shepherd.js/src/components/**/*.svelte', - '../../shepherd.js/src/utils/*.ts', - '../../shepherd.js/src/utils/*.svelte' - ], - reporter: ['text', 'lcov', 'html'] + provider: 'v8', + reporter: ['text', 'lcov', 'html'], + reportsDirectory: './test/coverage', + include: ['src/**/*.{ts,svelte}'], + exclude: [ + '**/*.spec.{js,ts}', + '**/*.test.{js,ts}', + '**/node_modules/**', + '**/dist/**', + '**/tmp/**', + '**/test/**' + ] } }, resolve: { alias: { - 'shepherd.js': '../../shepherd.js/src' + 'shepherd.js': './src' }, conditions: ['browser'] }, diff --git a/test/.eslintrc.js b/test/.eslintrc.js deleted file mode 100644 index bf358696a..000000000 --- a/test/.eslintrc.js +++ /dev/null @@ -1,33 +0,0 @@ -module.exports = { - root: true, - parserOptions: { - ecmaVersion: 2019, - sourceType: 'module' - }, - plugins: [ - 'jest' - ], - extends: [ - 'eslint:recommended' - ], - globals: { - Cypress: false, - Event: true, - MouseEvent: true, - Shepherd: false, - assert: false, - cy: false, - document: false, - expect: false, - require: false, - window: false - }, - env: { - es6: true, - mocha: true, - node: true - }, - rules: { - 'no-console': 'off' - } -}; diff --git a/test/cypress/cypress.config.js b/test/cypress/cypress.config.js deleted file mode 100644 index 02dbd2b23..000000000 --- a/test/cypress/cypress.config.js +++ /dev/null @@ -1,13 +0,0 @@ -import { defineConfig } from 'cypress'; - -export default defineConfig({ - fixturesFolder: './fixtures', - video: false, - viewportWidth: 1440, - viewportHeight: 900, - e2e: { - baseUrl: 'http://localhost:9002', - specPattern: './integration/**/*.cy.{js,jsx,ts,tsx}', - supportFile: './support/index.js' - } -}); diff --git a/test/cypress/dummy/js/prism.js b/test/cypress/dummy/js/prism.js deleted file mode 100644 index 8cea87dc3..000000000 --- a/test/cypress/dummy/js/prism.js +++ /dev/null @@ -1,8 +0,0 @@ -/* PrismJS 1.15.0 -https://prismjs.com/download.html#themes=prism&languages=markup+clike+javascript&plugins=unescaped-markup+normalize-whitespace */ -var _self="undefined"!=typeof window?window:"undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope?self:{},Prism=function(){var e=/\blang(?:uage)?-([\w-]+)\b/i,t=0,n=_self.Prism={manual:_self.Prism&&_self.Prism.manual,disableWorkerMessageHandler:_self.Prism&&_self.Prism.disableWorkerMessageHandler,util:{encode:function(e){return e instanceof r?new r(e.type,n.util.encode(e.content),e.alias):"Array"===n.util.type(e)?e.map(n.util.encode):e.replace(/&/g,"&").replace(/e.length)return;if(!(w instanceof s)){if(m&&b!=t.length-1){h.lastIndex=k;var _=h.exec(e);if(!_)break;for(var j=_.index+(d?_[1].length:0),P=_.index+_[0].length,A=b,x=k,O=t.length;O>A&&(P>x||!t[A].type&&!t[A-1].greedy);++A)x+=t[A].length,j>=x&&(++b,k=x);if(t[b]instanceof s)continue;I=A-b,w=e.slice(k,x),_.index-=k}else{h.lastIndex=0;var _=h.exec(w),I=1}if(_){d&&(p=_[1]?_[1].length:0);var j=_.index+p,_=_[0].slice(p),P=j+_.length,N=w.slice(0,j),S=w.slice(P),C=[b,I];N&&(++b,k+=N.length,C.push(N));var E=new s(u,f?n.tokenize(_,f):_,y,_,m);if(C.push(E),S&&C.push(S),Array.prototype.splice.apply(t,C),1!=I&&n.matchGrammar(e,t,r,b,k,!0,u),i)break}else if(i)break}}}}},tokenize:function(e,t){var r=[e],a=t.rest;if(a){for(var l in a)t[l]=a[l];delete t.rest}return n.matchGrammar(e,r,t,0,0,!1),r},hooks:{all:{},add:function(e,t){var r=n.hooks.all;r[e]=r[e]||[],r[e].push(t)},run:function(e,t){var r=n.hooks.all[e];if(r&&r.length)for(var a,l=0;a=r[l++];)a(t)}}},r=n.Token=function(e,t,n,r,a){this.type=e,this.content=t,this.alias=n,this.length=0|(r||"").length,this.greedy=!!a};if(r.stringify=function(e,t,a){if("string"==typeof e)return e;if("Array"===n.util.type(e))return e.map(function(n){return r.stringify(n,t,e)}).join("");var l={type:e.type,content:r.stringify(e.content,t,a),tag:"span",classes:["token",e.type],attributes:{},language:t,parent:a};if(e.alias){var i="Array"===n.util.type(e.alias)?e.alias:[e.alias];Array.prototype.push.apply(l.classes,i)}n.hooks.run("wrap",l);var o=Object.keys(l.attributes).map(function(e){return e+'="'+(l.attributes[e]||"").replace(/"/g,""")+'"'}).join(" ");return"<"+l.tag+' class="'+l.classes.join(" ")+'"'+(o?" "+o:"")+">"+l.content+""},!_self.document)return _self.addEventListener?(n.disableWorkerMessageHandler||_self.addEventListener("message",function(e){var t=JSON.parse(e.data),r=t.language,a=t.code,l=t.immediateClose;_self.postMessage(n.highlight(a,n.languages[r],r)),l&&_self.close()},!1),_self.Prism):_self.Prism;var a=document.currentScript||[].slice.call(document.getElementsByTagName("script")).pop();return a&&(n.filename=a.src,n.manual||a.hasAttribute("data-manual")||("loading"!==document.readyState?window.requestAnimationFrame?window.requestAnimationFrame(n.highlightAll):window.setTimeout(n.highlightAll,16):document.addEventListener("DOMContentLoaded",n.highlightAll))),_self.Prism}();"undefined"!=typeof module&&module.exports&&(module.exports=Prism),"undefined"!=typeof global&&(global.Prism=Prism); -Prism.languages.markup={comment://,prolog:/<\?[\s\S]+?\?>/,doctype://i,cdata://i,tag:{pattern:/<\/?(?!\d)[^\s>\/=$<%]+(?:\s+[^\s>\/=]+(?:=(?:("|')(?:\\[\s\S]|(?!\1)[^\\])*\1|[^\s'">=]+))?)*\s*\/?>/i,greedy:!0,inside:{tag:{pattern:/^<\/?[^\s>\/]+/i,inside:{punctuation:/^<\/?/,namespace:/^[^\s>\/:]+:/}},"attr-value":{pattern:/=(?:("|')(?:\\[\s\S]|(?!\1)[^\\])*\1|[^\s'">=]+)/i,inside:{punctuation:[/^=/,{pattern:/(^|[^\\])["']/,lookbehind:!0}]}},punctuation:/\/?>/,"attr-name":{pattern:/[^\s>\/]+/,inside:{namespace:/^[^\s>\/:]+:/}}}},entity:/&#?[\da-z]{1,8};/i},Prism.languages.markup.tag.inside["attr-value"].inside.entity=Prism.languages.markup.entity,Prism.hooks.add("wrap",function(a){"entity"===a.type&&(a.attributes.title=a.content.replace(/&/,"&"))}),Prism.languages.xml=Prism.languages.markup,Prism.languages.html=Prism.languages.markup,Prism.languages.mathml=Prism.languages.markup,Prism.languages.svg=Prism.languages.markup; -Prism.languages.clike={comment:[{pattern:/(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/,lookbehind:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],string:{pattern:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},"class-name":{pattern:/((?:\b(?:class|interface|extends|implements|trait|instanceof|new)\s+)|(?:catch\s+\())[\w.\\]+/i,lookbehind:!0,inside:{punctuation:/[.\\]/}},keyword:/\b(?:if|else|while|do|for|return|in|instanceof|function|new|try|throw|catch|finally|null|break|continue)\b/,"boolean":/\b(?:true|false)\b/,"function":/[a-z0-9_]+(?=\()/i,number:/\b0x[\da-f]+\b|(?:\b\d+\.?\d*|\B\.\d+)(?:e[+-]?\d+)?/i,operator:/--?|\+\+?|!=?=?|<=?|>=?|==?=?|&&?|\|\|?|\?|\*|\/|~|\^|%/,punctuation:/[{}[\];(),.:]/}; -Prism.languages.javascript=Prism.languages.extend("clike",{keyword:/\b(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|var|void|while|with|yield)\b/,number:/\b(?:0[xX][\dA-Fa-f]+|0[bB][01]+|0[oO][0-7]+|NaN|Infinity)\b|(?:\b\d+\.?\d*|\B\.\d+)(?:[Ee][+-]?\d+)?/,"function":/[_$a-z\xA0-\uFFFF][$\w\xA0-\uFFFF]*(?=\s*\()/i,operator:/-[-=]?|\+[+=]?|!=?=?|<>?>?=?|=(?:==?|>)?|&[&=]?|\|[|=]?|\*\*?=?|\/=?|~|\^=?|%=?|\?|\.{3}/}),Prism.languages.insertBefore("javascript","keyword",{regex:{pattern:/((?:^|[^$\w\xA0-\uFFFF."'\])\s])\s*)\/(\[[^\]\r\n]+]|\\.|[^\/\\\[\r\n])+\/[gimyu]{0,5}(?=\s*($|[\r\n,.;})\]]))/,lookbehind:!0,greedy:!0},"function-variable":{pattern:/[_$a-z\xA0-\uFFFF][$\w\xA0-\uFFFF]*(?=\s*=\s*(?:function\b|(?:\([^()]*\)|[_$a-z\xA0-\uFFFF][$\w\xA0-\uFFFF]*)\s*=>))/i,alias:"function"},constant:/\b[A-Z][A-Z\d_]*\b/}),Prism.languages.insertBefore("javascript","string",{"template-string":{pattern:/`(?:\\[\s\S]|\${[^}]+}|[^\\`])*`/,greedy:!0,inside:{interpolation:{pattern:/\${[^}]+}/,inside:{"interpolation-punctuation":{pattern:/^\${|}$/,alias:"punctuation"},rest:null}},string:/[\s\S]+/}}}),Prism.languages.javascript["template-string"].inside.interpolation.inside.rest=Prism.languages.javascript,Prism.languages.markup&&Prism.languages.insertBefore("markup","tag",{script:{pattern:/()[\s\S]*?(?=<\/script>)/i,lookbehind:!0,inside:Prism.languages.javascript,alias:"language-javascript",greedy:!0}}),Prism.languages.js=Prism.languages.javascript; -!function(){"undefined"!=typeof self&&self.Prism&&self.document&&Prism.languages.markup&&(Prism.plugins.UnescapedMarkup=!0,Prism.hooks.add("before-highlightall",function(e){e.selector+=", [class*='lang-'] script[type='text/plain'], [class*='language-'] script[type='text/plain'], script[type='text/plain'][class*='lang-'], script[type='text/plain'][class*='language-']"}),Prism.hooks.add("before-sanity-check",function(e){if((e.element.matches||e.element.msMatchesSelector).call(e.element,"script[type='text/plain']")){var t=document.createElement("code"),n=document.createElement("pre");return n.className=t.className=e.element.className,e.element.dataset&&Object.keys(e.element.dataset).forEach(function(t){Object.prototype.hasOwnProperty.call(e.element.dataset,t)&&(n.dataset[t]=e.element.dataset[t])}),e.code=e.code.replace(/<\/script(>|>)/gi,""),t.textContent=e.code,n.appendChild(t),e.element.parentNode.replaceChild(n,e.element),e.element=t,void 0}var n=e.element.parentNode;!e.code&&n&&"pre"==n.nodeName.toLowerCase()&&e.element.childNodes.length&&"#comment"==e.element.childNodes[0].nodeName&&(e.element.textContent=e.code=e.element.childNodes[0].textContent)}))}(); -!function(){function e(e){this.defaults=r({},e)}function n(e){return e.replace(/-(\w)/g,function(e,n){return n.toUpperCase()})}function t(e){for(var n=0,t=0;tn&&(o[s]="\n"+o[s],a=l)}r[i]=o.join("")}return r.join("\n")}},"undefined"!=typeof module&&module.exports&&(module.exports=e),"undefined"!=typeof Prism&&(Prism.plugins.NormalizeWhitespace=new e({"remove-trailing":!0,"remove-indent":!0,"left-trim":!0,"right-trim":!0}),Prism.hooks.add("before-sanity-check",function(e){var n=Prism.plugins.NormalizeWhitespace;if(!e.settings||e.settings["whitespace-normalization"]!==!1){if((!e.element||!e.element.parentNode)&&e.code)return e.code=n.normalize(e.code,e.settings),void 0;var t=e.element.parentNode,r=/\bno-whitespace-normalization\b/;if(e.code&&t&&"pre"===t.nodeName.toLowerCase()&&!r.test(t.className)&&!r.test(e.element.className)){for(var i=t.childNodes,o="",a="",s=!1,l=0;l { - let Shepherd; - - beforeEach(() => { - Shepherd = null; - - cy.visit('/examples/destroying-elements', { - onLoad(contentWindow) { - if (contentWindow.Shepherd) { - return Shepherd = contentWindow.Shepherd; - } - } - }); - }); - - it('recalculates positioning when element is removed and added', () => { - const steps = () => { - return [ - { - attachTo: { element: '.first', on: 'bottom' }, - id: 'first', - title: 'First step', - text: 'this is fine the first time' - }, - { - attachTo: { element: '.second', on: 'bottom' }, - id: 'second', - title: 'Second step', - text: 'Please click the destroy button and then the create button. After the First element is created, please click back' - } - ]; - }; - - const tour = setupTour(Shepherd, { - cancelIcon: { - enabled: false - } - }, steps); - - tour.start(); - - cy.wait(250); - - let initialPosition; - let missingStepElementPosition; - let finalPosition; - - cy.get('[data-shepherd-step-id="first"]').then((stepElement) => { - initialPosition = stepElement.css(['position', 'top', 'left']); - tour.next(); - - return cy.get('.first'); - }) - .then((firstElement) => { - // Remove the first element - firstElement.remove(); - - tour.back(); - cy.wait(250); - - return cy.get('[data-shepherd-step-id="first"]'); - }) - .then((stepElement2) => { - missingStepElementPosition = stepElement2.css(['position', 'top', 'left']); - expect(missingStepElementPosition).to.not.deep.equal(initialPosition); - - tour.next(); - - return cy.document(); - }) - .then((document) => { - // Create the first element again - const first = document.createElement('div'); - first.className = 'first'; - first.textContent = 'First'; - document.body.appendChild(first); - - tour.back(); - - cy.wait(250); - - return cy.get('[data-shepherd-step-id="first"]'); - }) - .then((stepElement3) => { - finalPosition = stepElement3.css(['position', 'top', 'left']); - expect(finalPosition).to.deep.equal(initialPosition); - }); - - }); -}); diff --git a/test/cypress/package.json b/test/cypress/package.json deleted file mode 100644 index e208453ca..000000000 --- a/test/cypress/package.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "name": "cypress-tests", - "private": "true", - "description": "Cypress tests for Shepherd", - "repository": { - "type": "git", - "url": "git+https://github.com/shipshapecode/shepherd.git" - }, - "license": "MIT", - "type": "module", - "scripts": { - "cypress:install": "pnpm cypress install", - "cy:open": "./node_modules/.bin/cypress open", - "cy:run:chrome": "cypress run --browser chrome", - "start-test-server": "http-server -p 9002", - "test:ci": "start-server-and-test start-test-server http://127.0.0.1:9002 cy:run:chrome", - "test:watch": "start-server-and-test start-test-server http://127.0.0.1:9002 cy:open" - }, - "dependencies": { - "shepherd.js": "workspace:*" - }, - "devDependencies": { - "@babel/core": "^7.28.4", - "@babel/preset-env": "^7.28.3", - "@babel/preset-typescript": "^7.27.1", - "chai": "^6.2.0", - "cypress": "^14.5.4", - "cypress-plugin-tab": "^1.0.5", - "del": "^7.1.0", - "eslint": "^8.57.1", - "http-server": "^14.1.1", - "postcss": "^8.5.6", - "prettier": "^3.6.2", - "replace": "^1.2.2", - "start-server-and-test": "^2.1.3", - "typescript": "^5.9.3" - }, - "packageManager": "pnpm@9.15.4", - "engines": { - "node": "18.* || >= 20" - } -} diff --git a/test/unit/.eslintrc.js b/test/unit/.eslintrc.js deleted file mode 100644 index 72b166f2e..000000000 --- a/test/unit/.eslintrc.js +++ /dev/null @@ -1,36 +0,0 @@ -module.exports = { - root: true, - parserOptions: { - ecmaVersion: 2019, - sourceType: 'module' - }, - plugins: [ - 'jest' - ], - extends: [ - 'eslint:recommended', - 'plugin:jest/recommended' - ], - globals: { - Cypress: false, - Event: true, - MouseEvent: true, - Shepherd: false, - assert: false, - cy: false, - document: false, - expect: false, - require: false, - window: false - }, - env: { - es6: true, - mocha: true, - node: true - }, - rules: { - 'jest/valid-expect': 'off', - 'jest/valid-expect-in-promise': 'off', - 'no-console': 'off' - } -}; diff --git a/test/unit/.gitignore b/test/unit/.gitignore deleted file mode 100644 index f6c96cf96..000000000 --- a/test/unit/.gitignore +++ /dev/null @@ -1,21 +0,0 @@ -# Editors -/.idea/ -/.vscode/ - -/.log/ -/.nyc_output/ -/coverage/ -/docs/ -/dist/ -/node_modules/ -/.DS_Store -/.sass-cache -/npm-debug.log* -/stats.html -/yarn-error.log -.yarn/* -!.yarn/patches -!.yarn/plugins -!.yarn/releases -!.yarn/sdks -!.yarn/versions diff --git a/test/unit/package.json b/test/unit/package.json deleted file mode 100644 index 9ed4289d3..000000000 --- a/test/unit/package.json +++ /dev/null @@ -1,49 +0,0 @@ -{ - "name": "unit-tests", - "private": "true", - "description": "Jest unit tests for Shepherd", - "repository": { - "type": "git", - "url": "git+https://github.com/shipshapecode/shepherd.git" - }, - "license": "MIT", - "type": "module", - "scripts": { - "lint:js": "eslint .", - "rewrite-paths": "replace 'SF:.*src' 'SF:src' coverage/lcov.info", - "test:ci": "vitest run --coverage", - "test:watch": "vitest", - "view-coverage": "http-server -p 9003 ./coverage/lcov-report -o" - }, - "devDependencies": { - "@floating-ui/dom": "^1.6.10", - "@sveltejs/vite-plugin-svelte": "^6.2.1", - "@testing-library/jest-dom": "^6.4.8", - "@testing-library/svelte": "^5.3.1", - "@vitest/coverage-v8": "^4.0.16", - "@vitest/expect": "^4.0.18", - "autoprefixer": "^10.4.22", - "del": "^7.1.0", - "eslint": "^8.57.1", - "eslint-plugin-vitest": "^0.5.4", - "happy-dom": "^16.4.1", - "http-server": "^14.1.1", - "jsdom": "^27.4.0", - "lodash": "^4.17.23", - "postcss": "^8.5.6", - "prettier": "3.3.3", - "replace": "^1.2.2", - "resize-observer-polyfill": "^1.5.1", - "shepherd.js": "workspace:*", - "start-server-and-test": "^2.1.3", - "svelte": "^5.39.7", - "svelte-preprocess": "^6.0.3", - "typescript": "^5.9.3", - "vite": "^7.2.2", - "vitest": "^4.0.16" - }, - "packageManager": "pnpm@9.15.4", - "engines": { - "node": "18.* || >= 20" - } -}