@sveltejs/vite-plugin-svelte
Advanced tools
Comparing version 2.4.6 to 2.5.0
{ | ||
"name": "@sveltejs/vite-plugin-svelte", | ||
"version": "2.4.6", | ||
"version": "2.5.0", | ||
"license": "MIT", | ||
@@ -46,3 +46,3 @@ "author": "dominikg", | ||
"peerDependencies": { | ||
"svelte": "^3.54.0 || ^4.0.0", | ||
"svelte": "^3.54.0 || ^4.0.0 || ^5.0.0-next.0", | ||
"vite": "^4.0.0" | ||
@@ -49,0 +49,0 @@ }, |
@@ -173,4 +173,14 @@ import type { InlineConfig, ResolvedConfig, UserConfig, Plugin } from 'vite'; | ||
disableSvelteResolveWarnings?: boolean; | ||
/** | ||
* Options for compiling Svelte JS/TS modules | ||
*/ | ||
compileModule?: CompileModuleOptions; | ||
} | ||
interface CompileModuleOptions { | ||
extensions?: string[]; | ||
include?: Arrayable<string>; | ||
exclude?: Arrayable<string>; | ||
} | ||
type ModuleFormat = NonNullable<'esm'>; | ||
@@ -177,0 +187,0 @@ type CssHashGetter = NonNullable<CompileOptions['cssHash']>; |
import fs from 'node:fs'; | ||
import { version as viteVersion } from 'vite'; | ||
import * as svelteCompiler from 'svelte/compiler'; | ||
@@ -10,3 +11,3 @@ import { svelteInspector } from '@sveltejs/vite-plugin-svelte-inspector'; | ||
import { createCompileSvelte } from './utils/compile.js'; | ||
import { buildIdParser } from './utils/id.js'; | ||
import { buildIdParser, buildModuleIdParser } from './utils/id.js'; | ||
import { | ||
@@ -28,3 +29,3 @@ buildExtraViteConfig, | ||
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'; | ||
@@ -43,2 +44,4 @@ const isVite4_0 = viteVersion.startsWith('4.0'); | ||
let requestParser; | ||
/** @type {import('./types/id.d.ts').ModuleIdParser} */ | ||
let moduleRequestParser; | ||
/** @type {import('./types/options.d.ts').ResolvedOptions} */ | ||
@@ -274,5 +277,41 @@ let options; | ||
} | ||
}, | ||
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 ? 'ssr' : 'dom', | ||
filename: moduleRequest.filename | ||
}); | ||
logCompilerWarnings(moduleRequest, compileResult.warnings, options); | ||
return compileResult.js; | ||
} catch (e) { | ||
throw toRollupError(e, options); | ||
} | ||
} | ||
}); | ||
} | ||
return plugins; | ||
@@ -279,0 +318,0 @@ } |
@@ -31,2 +31,17 @@ import type { CompileOptions } from 'svelte/types/compiler/interfaces'; | ||
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; |
@@ -1,2 +0,2 @@ | ||
import { compile, preprocess, walk } from 'svelte/compiler'; | ||
import * as svelte from 'svelte/compiler'; | ||
// @ts-ignore | ||
@@ -89,3 +89,3 @@ import { createMakeHot } from 'svelte-hmr'; | ||
try { | ||
preprocessed = await preprocess(code, preprocessors, { filename }); // full filename here so postcss works | ||
preprocessed = await svelte.preprocess(code, preprocessors, { filename }); // full filename here so postcss works | ||
} catch (e) { | ||
@@ -127,3 +127,3 @@ e.message = `Error while preprocessing ${filename}${e.message ? ` - ${e.message}` : ''}`; | ||
const endStat = stats?.start(filename); | ||
const compiled = compile(finalCode, finalCompileOptions); | ||
const compiled = svelte.compile(finalCode, finalCompileOptions); | ||
@@ -192,3 +192,4 @@ if (isSvelte3) { | ||
return createMakeHot({ | ||
walk, | ||
// TODO Svelte 5 doesn't expose walk anymore. If we decide to make v-p-s 2 work with Svelte 5 HMR, we need to import walk from estree-walker | ||
walk: svelte.walk, | ||
hotApi, | ||
@@ -195,0 +196,0 @@ adapter, |
import { readFileSync } from 'node:fs'; | ||
import { compile, preprocess } from 'svelte/compiler'; | ||
import * as svelte from 'svelte/compiler'; | ||
import { log } from './log.js'; | ||
import { toESBuildError } from './error.js'; | ||
import { isSvelte3 } from './svelte-version.js'; | ||
import { isSvelte3, isSvelte5 } from './svelte-version.js'; | ||
@@ -14,2 +14,4 @@ /** | ||
const svelteModuleExtension = '.svelte.js'; | ||
/** | ||
@@ -28,2 +30,5 @@ * @param {import('../types/options.d.ts').ResolvedOptions} options | ||
const svelteExtensions = (options.extensions ?? ['.svelte']).map((ext) => ext.slice(1)); | ||
if (isSvelte5) { | ||
svelteExtensions.push(svelteModuleExtension.slice(1)); | ||
} | ||
const svelteFilter = new RegExp('\\.(' + svelteExtensions.join('|') + ')(\\?.*)?$'); | ||
@@ -60,2 +65,18 @@ /** @type {import('../types/vite-plugin-svelte-stats.d.ts').StatCollection | undefined} */ | ||
async function compileSvelte(options, { filename, code }, statsCollection) { | ||
if (isSvelte5 && filename.endsWith(svelteModuleExtension)) { | ||
const endStat = statsCollection?.start(filename); | ||
// @ts-ignore doesn't exist in Svelte 4 | ||
const compiled = svelte.compileModule(code, { | ||
filename, | ||
generate: 'dom', | ||
runes: true | ||
}); | ||
if (endStat) { | ||
endStat(); | ||
} | ||
return compiled.js.map | ||
? compiled.js.code + '//# sourceMappingURL=' + compiled.js.map.toUrl() | ||
: compiled.js.code; | ||
} | ||
let css = options.compilerOptions.css; | ||
@@ -81,3 +102,3 @@ if (css !== 'none') { | ||
try { | ||
preprocessed = await preprocess(code, options.preprocess, { filename }); | ||
preprocessed = await svelte.preprocess(code, options.preprocess, { filename }); | ||
} catch (e) { | ||
@@ -109,3 +130,3 @@ e.message = `Error while preprocessing ${filename}${e.message ? ` - ${e.message}` : ''}`; | ||
const endStat = statsCollection?.start(filename); | ||
const compiled = compile(finalCode, finalCompileOptions); | ||
const compiled = svelte.compile(finalCode, finalCompileOptions); | ||
if (endStat) { | ||
@@ -112,0 +133,0 @@ endStat(); |
@@ -187,1 +187,46 @@ import { createFilter, normalizePath } from 'vite'; | ||
} | ||
/** | ||
* @param {import('../types/options.d.ts').ResolvedOptions} options | ||
* @returns {import('../types/id.d.ts').ModuleIdParser} | ||
*/ | ||
export function buildModuleIdParser(options) { | ||
const { include, exclude, extensions } = options?.experimental?.compileModule ?? {}; | ||
const root = options.root; | ||
const normalizedRoot = normalizePath(root); | ||
const filter = buildFilter(include, exclude, extensions ?? ['.svelte.js', '.svelte.ts']); | ||
return (id, ssr, timestamp = Date.now()) => { | ||
const { filename, rawQuery } = splitId(id); | ||
if (filter(filename)) { | ||
return parseToSvelteModuleRequest(id, filename, rawQuery, normalizedRoot, timestamp, ssr); | ||
} | ||
}; | ||
} | ||
/** | ||
* @param {string} id | ||
* @param {string} filename | ||
* @param {string} rawQuery | ||
* @param {string} root | ||
* @param {number} timestamp | ||
* @param {boolean} ssr | ||
* @returns {import('../types/id.d.ts').SvelteModuleRequest | undefined} | ||
*/ | ||
function parseToSvelteModuleRequest(id, filename, rawQuery, root, timestamp, ssr) { | ||
const query = parseRequestQuery(rawQuery); | ||
if (query.url || query.raw || query.direct) { | ||
// skip requests with special vite tags | ||
return; | ||
} | ||
const normalizedFilename = normalize(filename, root); | ||
return { | ||
id, | ||
filename, | ||
normalizedFilename, | ||
query, | ||
timestamp, | ||
ssr | ||
}; | ||
} |
@@ -123,3 +123,3 @@ /* eslint-disable no-console */ | ||
/** | ||
* @param {import('../types/id.d.ts').SvelteRequest} svelteRequest | ||
* @param {import('../types/id.d.ts').SvelteRequest | import('../types/id.d.ts').SvelteModuleRequest} svelteRequest | ||
* @param {import('svelte/types/compiler/interfaces').Warning[]} warnings | ||
@@ -126,0 +126,0 @@ * @param {import('../types/options.d.ts').ResolvedOptions} options |
@@ -28,2 +28,3 @@ /* eslint-disable no-unused-vars */ | ||
import { VitePluginSvelteCache } from './vite-plugin-svelte-cache.js'; | ||
import { isSvelte5 } from './svelte-version.js'; | ||
@@ -231,2 +232,6 @@ const allowedPluginOptions = new Set([ | ||
function enforceOptionsForHmr(options) { | ||
if (isSvelte5) { | ||
log.warn('svelte 5 does not support hmr api yet, disabling it for now'); | ||
options.hot = false; | ||
} | ||
if (options.hot) { | ||
@@ -233,0 +238,0 @@ if (!options.compilerOptions.dev) { |
@@ -7,1 +7,6 @@ import { VERSION } from 'svelte/compiler'; | ||
export const isSvelte3 = VERSION.startsWith('3.'); | ||
/** | ||
* @type {boolean} | ||
*/ | ||
export const isSvelte5 = VERSION.startsWith('5.'); |
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
118133
3572