diff --git a/packages/svelte-jsx-snippet/package.json b/packages/svelte-jsx-snippet/package.json index d775df5..82d535c 100644 --- a/packages/svelte-jsx-snippet/package.json +++ b/packages/svelte-jsx-snippet/package.json @@ -63,5 +63,8 @@ "peerDependencies": { "svelte": ">=5.0.0-next.183", "vite": ">=5.0.0" + }, + "dependencies": { + "@rollup/pluginutils": "^5.1.0" } } diff --git a/packages/svelte-jsx-snippet/src/vite.ts b/packages/svelte-jsx-snippet/src/vite.ts index f57d918..e6a5f41 100644 --- a/packages/svelte-jsx-snippet/src/vite.ts +++ b/packages/svelte-jsx-snippet/src/vite.ts @@ -1,7 +1,30 @@ import type { Plugin } from "vite"; import { transform } from "./transformer"; +import { + type FilterPattern, + createFilter as rollupCreateFilter, +} from "@rollup/pluginutils"; + +export interface Options { + include?: FilterPattern; + exclude?: FilterPattern; +} + +/** + * Create a filter function from the given include and exclude patterns. + * @param include - An array of minimatch or regex pattern strings. @default [/\.[mc]?[jt]sx$/] only handle .jsx, .tsx + * @param exclude - An array of minimatch or regex pattern strings. + */ +function createFilter( + include: Options["include"], + exclude: Options["exclude"], +): ReturnType { + return rollupCreateFilter(include ?? [/\.[mc]?[jt]sx$/], exclude); +} + +export function svelteJsxSnippet(options: Options = {}): Plugin { + const filter = createFilter(options.include, options.exclude); -export function svelteJsxSnippet(): Plugin { let dev = false; return { name: "svelte-jsx-snippet", @@ -9,12 +32,12 @@ export function svelteJsxSnippet(): Plugin { configResolved(config) { dev = config.command === "serve"; }, + /** * Transform JSX to snippet (generated) js */ transform(code, id, options) { - // only handle .jsx, .tsx - if (!/\.[mc]?[jt]sx$/.test(id)) return null; + if (!filter(id)) return; return transform(code, { dev, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 552d8b3..08a2931 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -22,6 +22,10 @@ importers: version: 3.2.3(prettier@3.2.5)(svelte@5.0.0-next.183) packages/svelte-jsx-snippet: + dependencies: + '@rollup/pluginutils': + specifier: ^5.1.0 + version: 5.1.0(rollup@4.18.1) devDependencies: '@babel/generator': specifier: ^7.24.10 @@ -375,6 +379,15 @@ packages: '@polka/url@1.0.0-next.25': resolution: {integrity: sha512-j7P6Rgr3mmtdkeDGTe0E/aYyWEWVtc5yFXtHCRHs28/jptDEWfaVOc5T7cblqy1XKPPfCxJc/8DwQ5YgLOZOVQ==} + '@rollup/pluginutils@5.1.0': + resolution: {integrity: sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + '@rollup/rollup-android-arm-eabi@4.17.2': resolution: {integrity: sha512-NM0jFxY8bB8QLkoKxIQeObCaDlJKewVlIEkuyYKm5An1tdVZ966w2+MPQ2l8LBZLjR+SgyV+nRkTIunzOYBMLQ==} cpu: [arm] @@ -986,6 +999,9 @@ packages: esrap@1.2.2: resolution: {integrity: sha512-F2pSJklxx1BlQIQgooczXCPHmcWpn6EsP5oo73LQfonG9fIlIENQ8vMmfGXeojP9MrkzUNAfyU5vdFlR9shHAw==} + estree-walker@2.0.2: + resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + estree-walker@3.0.3: resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} @@ -2719,6 +2735,14 @@ snapshots: '@polka/url@1.0.0-next.25': {} + '@rollup/pluginutils@5.1.0(rollup@4.18.1)': + dependencies: + '@types/estree': 1.0.5 + estree-walker: 2.0.2 + picomatch: 2.3.1 + optionalDependencies: + rollup: 4.18.1 + '@rollup/rollup-android-arm-eabi@4.17.2': optional: true @@ -3358,6 +3382,8 @@ snapshots: '@jridgewell/sourcemap-codec': 1.4.15 '@types/estree': 1.0.5 + estree-walker@2.0.2: {} + estree-walker@3.0.3: dependencies: '@types/estree': 1.0.5