From f23466143ec986bb72ca8ac6dfdf78c2cd8f68a4 Mon Sep 17 00:00:00 2001 From: Michael Cousins Date: Tue, 26 Nov 2024 14:50:13 -0800 Subject: [PATCH 1/6] ci: fix node 16 builds (#413) --- package.json | 9 +++++---- scripts/install-dependencies | 9 ++++++++- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index b65e953..cada7e0 100644 --- a/package.json +++ b/package.json @@ -103,9 +103,10 @@ "@testing-library/user-event": "^14.5.2", "@typescript-eslint/eslint-plugin": "^8.0.0", "@typescript-eslint/parser": "^8.0.0", - "@vitest/coverage-v8": "^2.0.2", + "@vitest/coverage-v8": "^1.0.0 || ^2.0.2", "all-contributors-cli": "^6.26.1", "doctoc": "^2.2.1", + "esbuild": "*", "eslint": "^8.57.0", "eslint-config-prettier": "^9.1.0", "eslint-config-standard": "^17.1.0", @@ -123,10 +124,10 @@ "prettier": "^3.3.3", "prettier-plugin-svelte": "^3.2.5", "svelte": "^3 || ^4 || ^5 || ^5.0.0-next.0", - "svelte-check": "^4.0.4", + "svelte-check": "^3.0.0 || ^4.0.4", "svelte-jester": "^5.0.0", "typescript": "^5.5.3", - "vite": "^5.3.3", - "vitest": "^2.0.2" + "vite": "^4.0.0 || ^5.3.3", + "vitest": "^1.0.0 || ^2.0.2" } } diff --git a/scripts/install-dependencies b/scripts/install-dependencies index 2a3f24f..029bfdf 100755 --- a/scripts/install-dependencies +++ b/scripts/install-dependencies @@ -15,4 +15,11 @@ elif [[ "${svelte_version}" == "3" ]]; then npm install --no-save vite@4 vitest@1 @vitest/coverage-v8@1 @sveltejs/vite-plugin-svelte@2 svelte-check@3 svelte@3 fi -npm ls --depth=0 svelte +npm dedupe +installed_version=$(npm ls --depth=0 --parseable svelte@${svelte_version}) + +if [[ -z "${installed_version}" ]]; then + echo "Error: expected svelte@${svelte_version}" + npm ls --depth=0 svelte + exit 1 +fi From 7f86754782ae44d1a94c1f2ce5c4b32b784ab7d1 Mon Sep 17 00:00:00 2001 From: Michael Cousins Date: Sun, 8 Dec 2024 13:12:14 -0500 Subject: [PATCH 2/6] test(jest): skip auto-cleanup tests in Jest (#417) --- src/__tests__/auto-cleanup.test.js | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/__tests__/auto-cleanup.test.js b/src/__tests__/auto-cleanup.test.js index 803001e..7962925 100644 --- a/src/__tests__/auto-cleanup.test.js +++ b/src/__tests__/auto-cleanup.test.js @@ -1,8 +1,13 @@ import { afterEach, beforeEach, describe, expect, test, vi } from 'vitest' -const globalAfterEach = vi.fn() +import { IS_JEST } from './utils.js' + +// TODO(mcous, 2024-12-08): clearing module cache and re-importing +// in Jest breaks Svelte's environment checking heuristics. +// Re-implement this test in a more accurate environment, without mocks. +describe.skipIf(IS_JEST)('auto-cleanup', () => { + const globalAfterEach = vi.fn() -describe('auto-cleanup', () => { beforeEach(() => { vi.resetModules() globalThis.afterEach = globalAfterEach From 234cc6deee60622dc6b6185b342703b2bdd08464 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 9 Dec 2024 15:14:38 -0500 Subject: [PATCH 3/6] chore(deps): bump codecov/codecov-action from 4 to 5 in the actions group (#414) chore(deps): bump codecov/codecov-action in the actions group Bumps the actions group with 1 update: [codecov/codecov-action](https://github.com/codecov/codecov-action). Updates `codecov/codecov-action` from 4 to 5 - [Release notes](https://github.com/codecov/codecov-action/releases) - [Changelog](https://github.com/codecov/codecov-action/blob/main/CHANGELOG.md) - [Commits](https://github.com/codecov/codecov-action/compare/v4...v5) --- updated-dependencies: - dependency-name: codecov/codecov-action dependency-type: direct:production update-type: version-update:semver-major dependency-group: actions ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 1251be8..79dbe5a 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -59,7 +59,7 @@ jobs: - name: ⬆️ Upload coverage report if: ${{ startsWith(matrix.check, 'test:') }} - uses: codecov/codecov-action@v4 + uses: codecov/codecov-action@v5 with: use_oidc: true fail_ci_if_error: true From 298d7ee7765fe46b809fc8fa8ffeb6f9fb525e9f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 2 Jan 2025 00:24:57 -0500 Subject: [PATCH 4/6] chore(deps-dev): bump happy-dom from 15.11.7 to 16.3.0 in the test group (#420) Bumps the test group with 1 update: [happy-dom](https://github.com/capricorn86/happy-dom). Updates `happy-dom` from 15.11.7 to 16.3.0 - [Release notes](https://github.com/capricorn86/happy-dom/releases) - [Commits](https://github.com/capricorn86/happy-dom/compare/v15.11.7...v16.3.0) --- updated-dependencies: - dependency-name: happy-dom dependency-type: direct:development update-type: version-update:semver-major dependency-group: test ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index cada7e0..008ee04 100644 --- a/package.json +++ b/package.json @@ -116,7 +116,7 @@ "eslint-plugin-simple-import-sort": "^12.1.1", "eslint-plugin-svelte": "^2.42.0", "expect-type": "^1.1.0", - "happy-dom": "^15.7.3", + "happy-dom": "^16.3.0", "jest": "^29.7.0", "jest-environment-jsdom": "^29.7.0", "jsdom": "^25.0.0", From 5aa405a6d8a6ccb8e04e6530f1ade509b5b3cce0 Mon Sep 17 00:00:00 2001 From: Michael Cousins Date: Tue, 11 Feb 2025 12:50:42 -0500 Subject: [PATCH 5/6] ci: fix node 16 builds again (#423) --- package.json | 4 ++-- scripts/install-dependencies | 18 ++++++++++++------ vite.config.js | 7 +++++++ 3 files changed, 21 insertions(+), 8 deletions(-) diff --git a/package.json b/package.json index 008ee04..77bba08 100644 --- a/package.json +++ b/package.json @@ -103,7 +103,7 @@ "@testing-library/user-event": "^14.5.2", "@typescript-eslint/eslint-plugin": "^8.0.0", "@typescript-eslint/parser": "^8.0.0", - "@vitest/coverage-v8": "^1.0.0 || ^2.0.2", + "@vitest/coverage-v8": "0.x.x || ^1.0.0 || ^2.0.2", "all-contributors-cli": "^6.26.1", "doctoc": "^2.2.1", "esbuild": "*", @@ -128,6 +128,6 @@ "svelte-jester": "^5.0.0", "typescript": "^5.5.3", "vite": "^4.0.0 || ^5.3.3", - "vitest": "^1.0.0 || ^2.0.2" + "vitest": "0.x.x || ^1.0.0 || ^2.0.2" } } diff --git a/scripts/install-dependencies b/scripts/install-dependencies index 029bfdf..8f403a0 100755 --- a/scripts/install-dependencies +++ b/scripts/install-dependencies @@ -1,22 +1,28 @@ #!/usr/bin/env bash # Install dependencies for a given version of Svelte -set -euo pipefail +set -euxo pipefail svelte_version=${1} +node_version=$(node --version) rm -rf node_modules npm install --no-package-lock -if [[ "${svelte_version}" == "4" ]]; then +if [[ "${svelte_version}" == "3" ]]; then + npm uninstall --no-save vite vitest @vitest/coverage-v8 @sveltejs/vite-plugin-svelte svelte-check svelte + npm install --no-save vite@4 vitest@0.x.x @vitest/coverage-v8@0.x.x @sveltejs/vite-plugin-svelte@2 svelte-check@3 svelte@3 +elif [[ "${svelte_version}" == "4" ]]; then npm uninstall --no-save @sveltejs/vite-plugin-svelte svelte npm install --no-save @sveltejs/vite-plugin-svelte@3 svelte@4 -elif [[ "${svelte_version}" == "3" ]]; then - npm uninstall --no-save vite vitest @vitest/coverage-v8 @sveltejs/vite-plugin-svelte svelte-check svelte - npm install --no-save vite@4 vitest@1 @vitest/coverage-v8@1 @sveltejs/vite-plugin-svelte@2 svelte-check@3 svelte@3 +fi + +if [[ "${node_version}" =~ "v16" ]]; then + npm uninstall --no-save vite vitest @vitest/coverage-v8 @sveltejs/vite-plugin-svelte + npm install --no-save vite@4 vitest@0.x.x @vitest/coverage-v8@0.x.x @sveltejs/vite-plugin-svelte@2 fi npm dedupe -installed_version=$(npm ls --depth=0 --parseable svelte@${svelte_version}) +installed_version=$(npm ls --depth=0 --parseable svelte@${svelte_version}) if [[ -z "${installed_version}" ]]; then echo "Error: expected svelte@${svelte_version}" diff --git a/vite.config.js b/vite.config.js index 1ddeea5..2db8a40 100644 --- a/vite.config.js +++ b/vite.config.js @@ -1,8 +1,12 @@ +import { createRequire } from 'node:module' + import { svelte } from '@sveltejs/vite-plugin-svelte' import { defineConfig } from 'vite' import { svelteTesting } from './src/vite.js' +const require = createRequire(import.meta.url) + // https://vitejs.dev/config/ export default defineConfig({ plugins: [svelte(), svelteTesting()], @@ -17,5 +21,8 @@ export default defineConfig({ include: ['src/**/*'], exclude: ['**/__tests__/**', 'src/vite.js', 'src/vitest.js'], }, + alias: { + '@testing-library/svelte': require.resolve('.'), + }, }, }) From e86dadae6c55899b13415a71a506a44f414305e1 Mon Sep 17 00:00:00 2001 From: Michael Cousins Date: Tue, 11 Feb 2025 12:59:23 -0500 Subject: [PATCH 6/6] fix(types): fix types when using legacy components in Svelte 5 (#424) --- src/__tests__/fixtures/Typed.svelte | 5 +++++ src/__tests__/render-runes.test-d.ts | 32 +++++++++++++++++++++++++++- src/component-types.d.ts | 14 ++++++------ 3 files changed, 43 insertions(+), 8 deletions(-) diff --git a/src/__tests__/fixtures/Typed.svelte b/src/__tests__/fixtures/Typed.svelte index 44960ab..383214f 100644 --- a/src/__tests__/fixtures/Typed.svelte +++ b/src/__tests__/fixtures/Typed.svelte @@ -1,9 +1,14 @@

hello {name}

count: {count}

+ diff --git a/src/__tests__/render-runes.test-d.ts b/src/__tests__/render-runes.test-d.ts index 2d0c69f..48d9d27 100644 --- a/src/__tests__/render-runes.test-d.ts +++ b/src/__tests__/render-runes.test-d.ts @@ -1,7 +1,8 @@ import { expectTypeOf } from 'expect-type' -import { describe, test } from 'vitest' +import { describe, test, vi } from 'vitest' import * as subject from '../index.js' +import LegacyComponent from './fixtures/Typed.svelte' import Component from './fixtures/TypedRunes.svelte' describe('types', () => { @@ -37,3 +38,32 @@ describe('types', () => { }>() }) }) + +describe('legacy component types', () => { + test('render accepts events', () => { + const onGreeting = vi.fn() + subject.render(LegacyComponent, { + props: { name: 'Alice', count: 42 }, + events: { greeting: onGreeting }, + }) + }) + + test('component $set and $on are not allowed', () => { + const onGreeting = vi.fn() + const { component } = subject.render(LegacyComponent, { + name: 'Alice', + count: 42, + }) + + expectTypeOf(component).toMatchTypeOf<{ hello: string }>() + + // @ts-expect-error: Svelte 5 mount does not return `$set` + component.$on('greeting', onGreeting) + + // @ts-expect-error: Svelte 5 mount does not return `$set` + component.$set({ name: 'Bob' }) + + // @ts-expect-error: Svelte 5 mount does not return `$destroy` + component.$destroy() + }) +}) diff --git a/src/component-types.d.ts b/src/component-types.d.ts index 9f707c2..8300243 100644 --- a/src/component-types.d.ts +++ b/src/component-types.d.ts @@ -45,17 +45,17 @@ export type Props = ComponentProps * In Svelte 5, this is the set of variables marked as `export`'d. * In Svelte 4, this is simply the instance of the component class. */ -export type Exports = C extends LegacyComponent - ? C - : C extends ModernComponent +export type Exports = IS_MODERN_SVELTE extends true + ? C extends ModernComponent ? E - : never + : C & { $set: never; $on: never; $destroy: never } + : C /** * Options that may be passed to `mount` when rendering the component. * * In Svelte 4, these are the options passed to the component constructor. */ -export type MountOptions = C extends LegacyComponent - ? LegacyConstructorOptions> - : Parameters, Exports>>[1] +export type MountOptions = IS_MODERN_SVELTE extends true + ? Parameters, Exports>>[1] + : LegacyConstructorOptions>