diff --git a/.changeset/config.json b/.changeset/config.json index 5b775d360..baa9c722b 100644 --- a/.changeset/config.json +++ b/.changeset/config.json @@ -7,7 +7,7 @@ "commit": false, "linked": [], "access": "public", - "baseBranch": "main", + "baseBranch": "v2", "bumpVersionsWithWorkspaceProtocolOnly": true, "updateInternalDependencies": "minor", "ignore": ["!(@sveltejs/*)"] diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 7d10a6722..488dd80f5 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -6,10 +6,12 @@ on: branches: - main - v1 + - v2 pull_request: branches: - main - v1 + - v2 env: # we call `pnpm playwright install` instead PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD: '1' diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 9c9b16f5e..f7c701093 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -5,6 +5,7 @@ on: branches: - main - v1 + - v2 permissions: {} jobs: diff --git a/package.json b/package.json index 7aa1b618b..1099fec17 100644 --- a/package.json +++ b/package.json @@ -15,7 +15,7 @@ "lint": "pnpm check:lint --fix", "format": "pnpm check:format --write", "fixup": "run-s lint format", - "release": "pnpm changeset publish", + "release": "pnpm changeset publish --tag version-2", "prepare": "husky install", "playwright": "playwright-core" }, diff --git a/packages/e2e-tests/autoprefixer-browerslist/package.json b/packages/e2e-tests/autoprefixer-browerslist/package.json index 1935658d5..f6099b39c 100644 --- a/packages/e2e-tests/autoprefixer-browerslist/package.json +++ b/packages/e2e-tests/autoprefixer-browerslist/package.json @@ -13,7 +13,7 @@ "devDependencies": { "@sveltejs/vite-plugin-svelte": "workspace:^", "autoprefixer": "^10.4.15", - "postcss": "^8.4.29", + "postcss": "^8.4.31", "postcss-load-config": "^4.0.1", "svelte": "^4.2.0", "svelte-preprocess": "^5.0.4", diff --git a/packages/vite-plugin-svelte/CHANGELOG.md b/packages/vite-plugin-svelte/CHANGELOG.md index 7e5c51de4..6b4df476c 100644 --- a/packages/vite-plugin-svelte/CHANGELOG.md +++ b/packages/vite-plugin-svelte/CHANGELOG.md @@ -1,5 +1,29 @@ # @sveltejs/vite-plugin-svelte +## 2.5.3 + +### Patch Changes + +- fix: handle closing tags in attributes when detecting script language ([#796](https://github.com/sveltejs/vite-plugin-svelte/pull/796)) + +## 2.5.2 + +### Patch Changes + +- fix compileModule call for optimizing libraries ([#788](https://github.com/sveltejs/vite-plugin-svelte/pull/788)) + +## 2.5.1 + +### Patch Changes + +- feat: support Svelte 5 compiler API ([#785](https://github.com/sveltejs/vite-plugin-svelte/pull/785)) + +## 2.5.0 + +### Minor Changes + +- feat: add experimental support for Svelte 5 ([#782](https://github.com/sveltejs/vite-plugin-svelte/pull/782)) + ## 2.4.6 ### Patch Changes diff --git a/packages/vite-plugin-svelte/package.json b/packages/vite-plugin-svelte/package.json index 90b303b32..9224452d2 100644 --- a/packages/vite-plugin-svelte/package.json +++ b/packages/vite-plugin-svelte/package.json @@ -1,6 +1,6 @@ { "name": "@sveltejs/vite-plugin-svelte", - "version": "2.4.6", + "version": "2.5.3", "license": "MIT", "author": "dominikg", "files": [ @@ -47,7 +47,7 @@ "vitefu": "^0.2.4" }, "peerDependencies": { - "svelte": "^3.54.0 || ^4.0.0", + "svelte": "^3.54.0 || ^4.0.0 || ^5.0.0-next.0", "vite": "^4.0.0" }, "devDependencies": { diff --git a/packages/vite-plugin-svelte/src/index.d.ts b/packages/vite-plugin-svelte/src/index.d.ts index 52feb0a4b..e5aa5e588 100644 --- a/packages/vite-plugin-svelte/src/index.d.ts +++ b/packages/vite-plugin-svelte/src/index.d.ts @@ -170,6 +170,16 @@ interface ExperimentalOptions { * @default false */ disableSvelteResolveWarnings?: boolean; + /** + * Options for compiling Svelte JS/TS modules + */ + compileModule?: CompileModuleOptions; +} + +interface CompileModuleOptions { + extensions?: string[]; + include?: Arrayable; + exclude?: Arrayable; } type ModuleFormat = NonNullable<'esm'>; diff --git a/packages/vite-plugin-svelte/src/index.js b/packages/vite-plugin-svelte/src/index.js index a08be0ba3..97d4c593f 100644 --- a/packages/vite-plugin-svelte/src/index.js +++ b/packages/vite-plugin-svelte/src/index.js @@ -1,5 +1,6 @@ import fs from 'node:fs'; import { version as viteVersion } from 'vite'; +import * as svelteCompiler from 'svelte/compiler'; import { svelteInspector } from '@sveltejs/vite-plugin-svelte-inspector'; @@ -7,7 +8,7 @@ import { isDepExcluded } from 'vitefu'; import { handleHotUpdate } from './handle-hot-update.js'; import { log, logCompilerWarnings } from './utils/log.js'; import { createCompileSvelte } from './utils/compile.js'; -import { buildIdParser } from './utils/id.js'; +import { buildIdParser, buildModuleIdParser } from './utils/id.js'; import { buildExtraViteConfig, validateInlineOptions, @@ -24,7 +25,7 @@ import { saveSvelteMetadata } from './utils/optimizer.js'; import { VitePluginSvelteCache } from './utils/vite-plugin-svelte-cache.js'; import { loadRaw } from './utils/load-raw.js'; import { FAQ_LINK_CONFLICTS_IN_SVELTE_RESOLVE } from './utils/constants.js'; -import { isSvelte3 } from './utils/svelte-version.js'; +import { isSvelte3, isSvelte5 } from './utils/svelte-version.js'; const isVite4_0 = viteVersion.startsWith('4.0'); @@ -38,6 +39,8 @@ export function svelte(inlineOptions) { // updated in configResolved hook /** @type {import('./types/id.d.ts').IdParser} */ let requestParser; + /** @type {import('./types/id.d.ts').ModuleIdParser} */ + let moduleRequestParser; /** @type {import('./types/options.d.ts').ResolvedOptions} */ let options; /** @type {import('vite').ResolvedConfig} */ @@ -268,9 +271,45 @@ export function svelte(inlineOptions) { ); } } - }, - svelteInspector() + } ]; + + if (!isSvelte5) { + plugins.push(svelteInspector()); // TODO reenable once svelte5 has support + } + if (isSvelte5) { + log.warn( + 'svelte 5 support in v-p-s is experimental, breaking changes can occur in any release until this notice is removed' + ); + log.warn('svelte 5 does not support svelte-inspector yet, disabling it'); + // TODO move to separate file + plugins.push({ + name: 'vite-plugin-svelte-module', + enforce: 'post', + async configResolved() { + moduleRequestParser = buildModuleIdParser(options); + }, + async transform(code, id, opts) { + const ssr = !!opts?.ssr; + const moduleRequest = moduleRequestParser(id, ssr); + if (!moduleRequest) { + return; + } + try { + // @ts-ignore doesn't exist in Svelte 4 + const compileResult = await svelteCompiler.compileModule(code, { + generate: ssr ? 'server' : 'client', + filename: moduleRequest.filename + }); + logCompilerWarnings(moduleRequest, compileResult.warnings, options); + return compileResult.js; + } catch (e) { + throw toRollupError(e, options); + } + } + }); + } + return plugins; } diff --git a/packages/vite-plugin-svelte/src/types/id.d.ts b/packages/vite-plugin-svelte/src/types/id.d.ts index 205afd832..c6b2e325e 100644 --- a/packages/vite-plugin-svelte/src/types/id.d.ts +++ b/packages/vite-plugin-svelte/src/types/id.d.ts @@ -28,4 +28,19 @@ export interface SvelteRequest { raw: boolean; } +export interface SvelteModuleRequest { + id: string; + filename: string; + normalizedFilename: string; + query: RequestQuery; + timestamp: number; + ssr: boolean; +} + export type IdParser = (id: string, ssr: boolean, timestamp?: number) => SvelteRequest | undefined; + +export type ModuleIdParser = ( + id: string, + ssr: boolean, + timestamp?: number +) => SvelteModuleRequest | undefined; diff --git a/packages/vite-plugin-svelte/src/utils/compile.js b/packages/vite-plugin-svelte/src/utils/compile.js index dc9dfd4de..a98813455 100644 --- a/packages/vite-plugin-svelte/src/utils/compile.js +++ b/packages/vite-plugin-svelte/src/utils/compile.js @@ -1,4 +1,4 @@ -import { compile, preprocess, walk } from 'svelte/compiler'; +import * as svelte from 'svelte/compiler'; // @ts-ignore import { createMakeHot } from 'svelte-hmr'; import { safeBase64Hash } from './hash.js'; @@ -7,9 +7,10 @@ import { log } from './log.js'; import { createInjectScopeEverythingRulePreprocessorGroup } from './preprocess.js'; import { mapToRelative } from './sourcemaps.js'; -const scriptLangRE = /