From b0f7e8415296f68b0431b45373d3291cb26c56d9 Mon Sep 17 00:00:00 2001 From: sapphi-red <49056869+sapphi-red@users.noreply.github.com> Date: Wed, 11 Sep 2024 19:56:17 +0900 Subject: [PATCH 01/43] feat: use rolldown in the dep optimizer Co-authored-by: underfin --- packages/vite/package.json | 1 + packages/vite/rollup.config.ts | 1 + packages/vite/rollup.dts.config.ts | 1 + packages/vite/src/node/config.ts | 1 + .../src/node/optimizer/esbuildDepPlugin.ts | 347 ---------- packages/vite/src/node/optimizer/index.ts | 279 ++++---- .../src/node/optimizer/rolldownDepPlugin.ts | 336 +++++++++ packages/vite/src/node/optimizer/scan.ts | 642 ++++++++---------- packages/vite/src/node/plugin.ts | 11 +- .../vite/src/node/plugins/importAnalysis.ts | 12 +- playground/optimize-deps/vite.config.js | 26 +- pnpm-lock.yaml | 171 +++++ 12 files changed, 957 insertions(+), 871 deletions(-) delete mode 100644 packages/vite/src/node/optimizer/esbuildDepPlugin.ts create mode 100644 packages/vite/src/node/optimizer/rolldownDepPlugin.ts diff --git a/packages/vite/package.json b/packages/vite/package.json index 3895d988bd3ecd..5cd3b409f47a30 100644 --- a/packages/vite/package.json +++ b/packages/vite/package.json @@ -87,6 +87,7 @@ "dependencies": { "esbuild": "^0.24.0", "postcss": "^8.4.47", + "rolldown": "https://pkg.pr.new/rolldown@dab103f", "rollup": "^4.22.5" }, "optionalDependencies": { diff --git a/packages/vite/rollup.config.ts b/packages/vite/rollup.config.ts index ab979656ee822d..6883d9a91b0a60 100644 --- a/packages/vite/rollup.config.ts +++ b/packages/vite/rollup.config.ts @@ -99,6 +99,7 @@ const nodeConfig = defineConfig({ 'fsevents', 'lightningcss', 'rollup/parseAst', + 'rolldown/experimental', ...Object.keys(pkg.dependencies), ], plugins: [ diff --git a/packages/vite/rollup.dts.config.ts b/packages/vite/rollup.dts.config.ts index 73379bffa70a41..42c6bab09e4552 100644 --- a/packages/vite/rollup.dts.config.ts +++ b/packages/vite/rollup.dts.config.ts @@ -51,6 +51,7 @@ const identifierReplacements: Record> = { PluginContext$1: 'rollup.PluginContext', TransformPluginContext$1: 'rollup.TransformPluginContext', TransformResult$2: 'rollup.TransformResult', + RollupOptions$1: 'rollup.RollupOptions', }, esbuild: { TransformResult$1: 'esbuild_TransformResult', diff --git a/packages/vite/src/node/config.ts b/packages/vite/src/node/config.ts index 5eb1045ef51c65..ceeb6d011d9955 100644 --- a/packages/vite/src/node/config.ts +++ b/packages/vite/src/node/config.ts @@ -798,6 +798,7 @@ function resolveDepOptimizationOptions( preserveSymlinks, ...optimizeDeps.esbuildOptions, }, + rollupOptions: optimizeDeps.rollupOptions, disabled: optimizeDeps.disabled, entries: optimizeDeps.entries, force: optimizeDeps.force ?? false, diff --git a/packages/vite/src/node/optimizer/esbuildDepPlugin.ts b/packages/vite/src/node/optimizer/esbuildDepPlugin.ts deleted file mode 100644 index 088cb35d770bab..00000000000000 --- a/packages/vite/src/node/optimizer/esbuildDepPlugin.ts +++ /dev/null @@ -1,347 +0,0 @@ -import path from 'node:path' -import type { ImportKind, Plugin } from 'esbuild' -import { JS_TYPES_RE, KNOWN_ASSET_TYPES } from '../constants' -import type { PackageCache } from '../packages' -import { - escapeRegex, - flattenId, - isBuiltin, - isExternalUrl, - moduleListContains, - normalizePath, -} from '../utils' -import { browserExternalId, optionalPeerDepId } from '../plugins/resolve' -import { isCSSRequest, isModuleCSSRequest } from '../plugins/css' -import type { Environment } from '../environment' -import { createBackCompatIdResolver } from '../idResolver' - -const externalWithConversionNamespace = - 'vite:dep-pre-bundle:external-conversion' -const convertedExternalPrefix = 'vite-dep-pre-bundle-external:' - -const cjsExternalFacadeNamespace = 'vite:cjs-external-facade' -const nonFacadePrefix = 'vite-cjs-external-facade:' - -const externalTypes = [ - 'css', - // supported pre-processor types - 'less', - 'sass', - 'scss', - 'styl', - 'stylus', - 'pcss', - 'postcss', - // wasm - 'wasm', - // known SFC types - 'vue', - 'svelte', - 'marko', - 'astro', - 'imba', - // JSX/TSX may be configured to be compiled differently from how esbuild - // handles it by default, so exclude them as well - 'jsx', - 'tsx', - ...KNOWN_ASSET_TYPES, -] - -export function esbuildDepPlugin( - environment: Environment, - qualified: Record, - external: string[], -): Plugin { - const { isProduction } = environment.config - const { extensions } = environment.config.dev.optimizeDeps - - // remove optimizable extensions from `externalTypes` list - const allExternalTypes = extensions - ? externalTypes.filter((type) => !extensions?.includes('.' + type)) - : externalTypes - - // use separate package cache for optimizer as it caches paths around node_modules - // and it's unlikely for the core Vite process to traverse into node_modules again - const esmPackageCache: PackageCache = new Map() - const cjsPackageCache: PackageCache = new Map() - - // default resolver which prefers ESM - const _resolve = createBackCompatIdResolver(environment.getTopLevelConfig(), { - asSrc: false, - scan: true, - packageCache: esmPackageCache, - }) - - // cjs resolver that prefers Node - const _resolveRequire = createBackCompatIdResolver( - environment.getTopLevelConfig(), - { - asSrc: false, - isRequire: true, - scan: true, - packageCache: cjsPackageCache, - }, - ) - - const resolve = ( - id: string, - importer: string, - kind: ImportKind, - resolveDir?: string, - ): Promise => { - let _importer: string - // explicit resolveDir - this is passed only during yarn pnp resolve for - // entries - if (resolveDir) { - _importer = normalizePath(path.join(resolveDir, '*')) - } else { - // map importer ids to file paths for correct resolution - _importer = importer in qualified ? qualified[importer] : importer - } - const resolver = kind.startsWith('require') ? _resolveRequire : _resolve - return resolver(environment, id, _importer) - } - - const resolveResult = (id: string, resolved: string) => { - if (resolved.startsWith(browserExternalId)) { - return { - path: id, - namespace: 'browser-external', - } - } - if (resolved.startsWith(optionalPeerDepId)) { - return { - path: resolved, - namespace: 'optional-peer-dep', - } - } - if (environment.config.consumer === 'server' && isBuiltin(resolved)) { - return - } - if (isExternalUrl(resolved)) { - return { - path: resolved, - external: true, - } - } - return { - path: path.resolve(resolved), - } - } - - return { - name: 'vite:dep-pre-bundle', - setup(build) { - // clear package cache when esbuild is finished - build.onEnd(() => { - esmPackageCache.clear() - cjsPackageCache.clear() - }) - - // externalize assets and commonly known non-js file types - // See #8459 for more details about this require-import conversion - build.onResolve( - { - filter: new RegExp( - `\\.(` + allExternalTypes.join('|') + `)(\\?.*)?$`, - ), - }, - async ({ path: id, importer, kind }) => { - // if the prefix exist, it is already converted to `import`, so set `external: true` - if (id.startsWith(convertedExternalPrefix)) { - return { - path: id.slice(convertedExternalPrefix.length), - external: true, - } - } - - const resolved = await resolve(id, importer, kind) - if (resolved) { - // `resolved` can be javascript even when `id` matches `allExternalTypes` - // due to cjs resolution (e.g. require("./test.pdf") for "./test.pdf.js") - // or package name (e.g. import "some-package.pdf") - if (JS_TYPES_RE.test(resolved)) { - return { - path: resolved, - external: false, - } - } - - if (kind === 'require-call') { - // here it is not set to `external: true` to convert `require` to `import` - return { - path: resolved, - namespace: externalWithConversionNamespace, - } - } - return { - path: resolved, - external: true, - } - } - }, - ) - build.onLoad( - { filter: /./, namespace: externalWithConversionNamespace }, - (args) => { - // import itself with prefix (this is the actual part of require-import conversion) - const modulePath = `"${convertedExternalPrefix}${args.path}"` - return { - contents: - isCSSRequest(args.path) && !isModuleCSSRequest(args.path) - ? `import ${modulePath};` - : `export { default } from ${modulePath};` + - `export * from ${modulePath};`, - loader: 'js', - } - }, - ) - - function resolveEntry(id: string) { - const flatId = flattenId(id) - if (flatId in qualified) { - return { - path: qualified[flatId], - } - } - } - - build.onResolve( - { filter: /^[\w@][^:]/ }, - async ({ path: id, importer, kind }) => { - if (moduleListContains(external, id)) { - return { - path: id, - external: true, - } - } - - // ensure esbuild uses our resolved entries - let entry: { path: string } | undefined - // if this is an entry, return entry namespace resolve result - if (!importer) { - if ((entry = resolveEntry(id))) return entry - // check if this is aliased to an entry - also return entry namespace - const aliased = await _resolve(environment, id, undefined, true) - if (aliased && (entry = resolveEntry(aliased))) { - return entry - } - } - - // use vite's own resolver - const resolved = await resolve(id, importer, kind) - if (resolved) { - return resolveResult(id, resolved) - } - }, - ) - - build.onLoad( - { filter: /.*/, namespace: 'browser-external' }, - ({ path }) => { - if (isProduction) { - return { - contents: 'module.exports = {}', - } - } else { - return { - // Return in CJS to intercept named imports. Use `Object.create` to - // create the Proxy in the prototype to workaround esbuild issue. Why? - // - // In short, esbuild cjs->esm flow: - // 1. Create empty object using `Object.create(Object.getPrototypeOf(module.exports))`. - // 2. Assign props of `module.exports` to the object. - // 3. Return object for ESM use. - // - // If we do `module.exports = new Proxy({}, {})`, step 1 returns empty object, - // step 2 does nothing as there's no props for `module.exports`. The final object - // is just an empty object. - // - // Creating the Proxy in the prototype satisfies step 1 immediately, which means - // the returned object is a Proxy that we can intercept. - // - // Note: Skip keys that are accessed by esbuild and browser devtools. - contents: `\ -module.exports = Object.create(new Proxy({}, { - get(_, key) { - if ( - key !== '__esModule' && - key !== '__proto__' && - key !== 'constructor' && - key !== 'splice' - ) { - console.warn(\`Module "${path}" has been externalized for browser compatibility. Cannot access "${path}.\${key}" in client code. See https://vite.dev/guide/troubleshooting.html#module-externalized-for-browser-compatibility for more details.\`) - } - } -}))`, - } - } - }, - ) - - build.onLoad( - { filter: /.*/, namespace: 'optional-peer-dep' }, - ({ path }) => { - if (isProduction) { - return { - contents: 'module.exports = {}', - } - } else { - const [, peerDep, parentDep] = path.split(':') - return { - contents: `throw new Error(\`Could not resolve "${peerDep}" imported by "${parentDep}". Is it installed?\`)`, - } - } - }, - ) - }, - } -} - -const matchesEntireLine = (text: string) => `^${escapeRegex(text)}$` - -// esbuild doesn't transpile `require('foo')` into `import` statements if 'foo' is externalized -// https://github.com/evanw/esbuild/issues/566#issuecomment-735551834 -export function esbuildCjsExternalPlugin( - externals: string[], - platform: 'node' | 'browser', -): Plugin { - return { - name: 'cjs-external', - setup(build) { - const filter = new RegExp(externals.map(matchesEntireLine).join('|')) - - build.onResolve({ filter: new RegExp(`^${nonFacadePrefix}`) }, (args) => { - return { - path: args.path.slice(nonFacadePrefix.length), - external: true, - } - }) - - build.onResolve({ filter }, (args) => { - // preserve `require` for node because it's more accurate than converting it to import - if (args.kind === 'require-call' && platform !== 'node') { - return { - path: args.path, - namespace: cjsExternalFacadeNamespace, - } - } - - return { - path: args.path, - external: true, - } - }) - - build.onLoad( - { filter: /.*/, namespace: cjsExternalFacadeNamespace }, - (args) => ({ - contents: - `import * as m from ${JSON.stringify( - nonFacadePrefix + args.path, - )};` + `module.exports = m;`, - }), - ) - }, - } -} diff --git a/packages/vite/src/node/optimizer/index.ts b/packages/vite/src/node/optimizer/index.ts index b156a38c6a6bc3..e57fcb3e6a39b9 100644 --- a/packages/vite/src/node/optimizer/index.ts +++ b/packages/vite/src/node/optimizer/index.ts @@ -4,12 +4,13 @@ import path from 'node:path' import { promisify } from 'node:util' import { performance } from 'node:perf_hooks' import colors from 'picocolors' -import type { BuildContext, BuildOptions as EsbuildBuildOptions } from 'esbuild' -import esbuild, { build } from 'esbuild' +import type { BuildOptions as EsbuildBuildOptions } from 'esbuild' import { init, parse } from 'es-module-lexer' import glob from 'fast-glob' +import { type RollupOptions, type RollupOutput, rolldown } from 'rolldown' import type { ResolvedConfig } from '../config' import { + asyncFlatten, createDebugger, flattenId, getHash, @@ -21,21 +22,20 @@ import { tryStatSync, unique, } from '../utils' -import { - defaultEsbuildSupported, - transformWithEsbuild, -} from '../plugins/esbuild' +import { transformWithEsbuild } from '../plugins/esbuild' import { ESBUILD_MODULES_TARGET, METADATA_FILENAME } from '../constants' import { isWindows } from '../../shared/utils' import type { Environment } from '../environment' -import { esbuildCjsExternalPlugin, esbuildDepPlugin } from './esbuildDepPlugin' import { ScanEnvironment, scanImports } from './scan' import { createOptimizeDepsIncludeResolver, expandGlobIds } from './resolve' +import { + rolldownCjsExternalPlugin, + rolldownDepPlugin, +} from './rolldownDepPlugin' const debug = createDebugger('vite:deps') const jsExtensionRE = /\.js$/i -const jsMapExtensionRE = /\.js\.map$/i export type ExportsData = { hasModuleSyntax: boolean @@ -103,6 +103,7 @@ export interface DepOptimizationConfig { | 'outExtension' | 'metafile' > + rollupOptions?: RollupOptions /** * List of file extensions that can be optimized. A corresponding esbuild * plugin must exist to handle the specific extension. @@ -201,6 +202,7 @@ export interface OptimizedDepInfo { * data used both to define if interop is needed and when pre-bundling */ exportsData?: Promise + isDynamicEntry?: boolean } export interface DepOptimizationMetadata { @@ -594,7 +596,7 @@ export function runOptimizeDeps( const start = performance.now() - const preparedRun = prepareEsbuildOptimizerRun( + const preparedRun = prepareRolldownOptimizerRun( environment, depsInfo, processingCacheDir, @@ -602,63 +604,44 @@ export function runOptimizeDeps( ) const runResult = preparedRun.then(({ context, idToExports }) => { - function disposeContext() { - return context?.dispose().catch((e) => { - environment.logger.error('Failed to dispose esbuild context', { - error: e, - }) - }) - } if (!context || optimizerContext.cancelled) { - disposeContext() return cancelledResult } return context - .rebuild() + .build() .then((result) => { - const meta = result.metafile! - - // the paths in `meta.outputs` are relative to `process.cwd()` - const processingCacheDirOutputPath = path.relative( - process.cwd(), - processingCacheDir, - ) - - for (const id in depsInfo) { - const output = esbuildOutputFromId( - meta.outputs, - id, - processingCacheDir, - ) - - const { exportsData, ...info } = depsInfo[id] - addOptimizedDepInfo(metadata, 'optimized', { - ...info, - // We only need to hash the output.imports in to check for stability, but adding the hash - // and file path gives us a unique hash that may be useful for other things in the future - fileHash: getHash( - metadata.hash + - depsInfo[id].file + - JSON.stringify(output.imports), - ), - browserHash: metadata.browserHash, - // After bundling we have more information and can warn the user about legacy packages - // that require manual configuration - needsInterop: needsInterop( - environment, - id, - idToExports[id], - output, - ), - }) - } + for (const chunk of result.output) { + if (chunk.type !== 'chunk') continue - for (const o of Object.keys(meta.outputs)) { - if (!jsMapExtensionRE.test(o)) { - const id = path - .relative(processingCacheDirOutputPath, o) - .replace(jsExtensionRE, '') + if (chunk.isEntry) { + // One chunk maybe corresponding multiply entry + const deps = Object.values(depsInfo).filter( + (d) => d.src === normalizePath(chunk.facadeModuleId!), + ) + for (const { exportsData, file, id, ...info } of deps) { + addOptimizedDepInfo(metadata, 'optimized', { + id, + file, + ...info, + // We only need to hash the output.imports in to check for stability, but adding the hash + // and file path gives us a unique hash that may be useful for other things in the future + fileHash: getHash( + metadata.hash + file + JSON.stringify(chunk.modules), + ), + browserHash: metadata.browserHash, + // After bundling we have more information and can warn the user about legacy packages + // that require manual configuration + needsInterop: needsInterop( + environment, + id, + idToExports[id], + chunk, + ), + }) + } + } else { + const id = chunk.fileName.replace(jsExtensionRE, '') const file = getOptimizedDepPath(environment, id) if ( !findOptimizedDepInfoInRecord( @@ -671,6 +654,7 @@ export function runOptimizeDeps( file, needsInterop: false, browserHash: metadata.browserHash, + isDynamicEntry: chunk.isDynamicEntry, }) } } @@ -682,18 +666,14 @@ export function runOptimizeDeps( return successfulResult }) - .catch((e) => { if (e.errors && e.message.includes('The build was canceled')) { - // esbuild logs an error when cancelling, but this is expected so + // an error happens when cancelling, but this is expected so // return an empty result instead return cancelledResult } throw e }) - .finally(() => { - return disposeContext() - }) }) runResult.catch(() => { @@ -704,20 +684,20 @@ export function runOptimizeDeps( async cancel() { optimizerContext.cancelled = true const { context } = await preparedRun - await context?.cancel() + context?.cancel() cleanUp() }, result: runResult, } } -async function prepareEsbuildOptimizerRun( +async function prepareRolldownOptimizerRun( environment: Environment, depsInfo: Record, processingCacheDir: string, optimizerContext: { cancelled: boolean }, ): Promise<{ - context?: BuildContext + context?: { build: () => Promise; cancel: () => void } idToExports: Record }> { // esbuild generates nested directory output with lowest common ancestor base @@ -731,21 +711,19 @@ async function prepareEsbuildOptimizerRun( const { optimizeDeps } = environment.config.dev - const { plugins: pluginsFromConfig = [], ...esbuildOptions } = - optimizeDeps?.esbuildOptions ?? {} + const { plugins: pluginsFromConfig = [], ...rollupOptions } = + optimizeDeps?.rollupOptions ?? {} + let jsxLoader = false await Promise.all( Object.keys(depsInfo).map(async (id) => { const src = depsInfo[id].src! const exportsData = await (depsInfo[id].exportsData ?? extractExportsData(environment, src)) - if (exportsData.jsxLoader && !esbuildOptions.loader?.['.js']) { + if (exportsData.jsxLoader) { // Ensure that optimization won't fail by defaulting '.js' to the JSX parser. // This is useful for packages such as Gatsby. - esbuildOptions.loader = { - '.js': 'jsx', - ...esbuildOptions.loader, - } + jsxLoader = true } const flatId = flattenId(id) flatIdDeps[flatId] = src @@ -765,46 +743,68 @@ async function prepareEsbuildOptimizerRun( const external = [...(optimizeDeps?.exclude ?? [])] - const plugins = [...pluginsFromConfig] + const plugins = await asyncFlatten(pluginsFromConfig) if (external.length) { - plugins.push(esbuildCjsExternalPlugin(external, platform)) + plugins.push(rolldownCjsExternalPlugin(external, platform)) } - plugins.push(esbuildDepPlugin(environment, flatIdDeps, external)) - - const context = await esbuild.context({ - absWorkingDir: process.cwd(), - entryPoints: Object.keys(flatIdDeps), - bundle: true, - // We can't use platform 'neutral', as esbuild has custom handling - // when the platform is 'node' or 'browser' that can't be emulated - // by using mainFields and conditions - platform, - define, - format: 'esm', - // See https://github.com/evanw/esbuild/issues/1921#issuecomment-1152991694 - banner: - platform === 'node' - ? { - js: `import { createRequire } from 'module';const require = createRequire(import.meta.url);`, - } - : undefined, - target: ESBUILD_MODULES_TARGET, - external, - logLevel: 'error', - splitting: true, - sourcemap: true, - outdir: processingCacheDir, - ignoreAnnotations: true, - metafile: true, - plugins, - charset: 'utf8', - ...esbuildOptions, - supported: { - ...defaultEsbuildSupported, - ...esbuildOptions.supported, + plugins.push(rolldownDepPlugin(environment, flatIdDeps, external)) + plugins.push({ + name: 'optimizer-transform', + async transform(code, id) { + if (/\.(?:m?[jt]s|[jt]sx)$/.test(id)) { + const result = await transformWithEsbuild(code, id, { + sourcemap: true, + sourcefile: id, + loader: jsxLoader && /\.js$/.test(id) ? 'jsx' : undefined, + define, + target: ESBUILD_MODULES_TARGET, + }) + return { + code: result.code, + map: result.map, + } + } }, }) - return { context, idToExports } + + let canceled = false + async function build() { + const bundle = await rolldown({ + input: flatIdDeps, + logLevel: 'warn', + plugins, + resolve: { + // TODO: set aliasFields, conditionNames depending on `platform` + mainFields: ['module', 'main'], + aliasFields: [['browser']], + extensions: ['.js', '.css'], + conditionNames: ['browser'], + }, + ...rollupOptions, + }) + if (canceled) { + await bundle.close() + throw new Error('The build was canceled') + } + const result = await bundle.write({ + format: 'esm', + sourcemap: true, + dir: processingCacheDir, + banner: + platform === 'node' + ? `import { createRequire } from 'module';const require = createRequire(import.meta.url);` + : undefined, + ...rollupOptions.output, + }) + await bundle.close() + return result + } + + function cancel() { + canceled = true + } + + return { context: { build, cancel }, idToExports } } export async function addManuallyIncludedOptimizeDeps( @@ -1003,19 +1003,23 @@ function stringifyDepsOptimizerMetadata( browserHash, optimized: Object.fromEntries( Object.values(optimized).map( - ({ id, src, file, fileHash, needsInterop }) => [ + ({ id, src, file, fileHash, needsInterop, isDynamicEntry }) => [ id, { src, file, fileHash, needsInterop, + isDynamicEntry, }, ], ), ), chunks: Object.fromEntries( - Object.values(chunks).map(({ id, file }) => [id, { file }]), + Object.values(chunks).map(({ id, file, isDynamicEntry }) => [ + id, + { file, isDynamicEntry }, + ]), ), }, (key: string, value: string) => { @@ -1030,29 +1034,6 @@ function stringifyDepsOptimizerMetadata( ) } -function esbuildOutputFromId( - outputs: Record, - id: string, - cacheDirOutputPath: string, -): any { - const cwd = process.cwd() - const flatId = flattenId(id) + '.js' - const normalizedOutputPath = normalizePath( - path.relative(cwd, path.join(cacheDirOutputPath, flatId)), - ) - const output = outputs[normalizedOutputPath] - if (output) { - return output - } - // If the root dir was symlinked, esbuild could return output keys as `../cwd/` - // Normalize keys to support this case too - for (const [key, value] of Object.entries(outputs)) { - if (normalizePath(path.relative(cwd, key)) === normalizedOutputPath) { - return value - } - } -} - export async function extractExportsData( environment: Environment, filePath: string, @@ -1061,18 +1042,32 @@ export async function extractExportsData( const { optimizeDeps } = environment.config.dev - const esbuildOptions = optimizeDeps?.esbuildOptions ?? {} + const rollupOptions = optimizeDeps?.rollupOptions ?? {} if (optimizeDeps.extensions?.some((ext) => filePath.endsWith(ext))) { // For custom supported extensions, build the entry file to transform it into JS, // and then parse with es-module-lexer. Note that the `bundle` option is not `true`, // so only the entry file is being transformed. - const result = await build({ - ...esbuildOptions, - entryPoints: [filePath], - write: false, + const { plugins: pluginsFromConfig = [], ...remainingRollupOptions } = + rollupOptions + const plugins = await asyncFlatten(pluginsFromConfig) + plugins.unshift({ + name: 'externalize', + resolveId(id, importer) { + if (importer !== undefined) { + return { id, external: true } + } + }, + }) + const build = await rolldown({ + ...remainingRollupOptions, + plugins, + input: [filePath], + }) + const result = await build.generate({ + ...rollupOptions.output, format: 'esm', }) - const [, exports, , hasModuleSyntax] = parse(result.outputFiles[0].text) + const [, exports, , hasModuleSyntax] = parse(result.output[0].code) return { hasModuleSyntax, exports: exports.map((e) => e.n), @@ -1086,7 +1081,7 @@ export async function extractExportsData( try { parseResult = parse(entryContent) } catch { - const loader = esbuildOptions.loader?.[path.extname(filePath)] || 'jsx' + const loader = rollupOptions.moduleTypes?.[path.extname(filePath)] || 'jsx' debug?.( `Unable to parse: ${filePath}.\n Trying again with a ${loader} transform.`, ) diff --git a/packages/vite/src/node/optimizer/rolldownDepPlugin.ts b/packages/vite/src/node/optimizer/rolldownDepPlugin.ts new file mode 100644 index 00000000000000..1464cfc7f9c248 --- /dev/null +++ b/packages/vite/src/node/optimizer/rolldownDepPlugin.ts @@ -0,0 +1,336 @@ +import path from 'node:path' +import type { ImportKind, Plugin } from 'rolldown' +import { JS_TYPES_RE, KNOWN_ASSET_TYPES } from '../constants' +import type { PackageCache } from '../packages' +import { + escapeRegex, + flattenId, + isBuiltin, + isExternalUrl, + moduleListContains, + normalizePath, +} from '../utils' +import { browserExternalId, optionalPeerDepId } from '../plugins/resolve' +import { isCSSRequest, isModuleCSSRequest } from '../plugins/css' +import type { Environment } from '../environment' +import { createBackCompatIdResolver } from '../idResolver' + +const externalWithConversionNamespace = + 'vite:dep-pre-bundle:external-conversion' +const convertedExternalPrefix = 'vite-dep-pre-bundle-external:' + +const cjsExternalFacadeNamespace = 'vite:cjs-external-facade' +const nonFacadePrefix = 'vite-cjs-external-facade:' + +const externalTypes = [ + 'css', + // supported pre-processor types + 'less', + 'sass', + 'scss', + 'styl', + 'stylus', + 'pcss', + 'postcss', + // wasm + 'wasm', + // known SFC types + 'vue', + 'svelte', + 'marko', + 'astro', + 'imba', + // JSX/TSX may be configured to be compiled differently from how esbuild + // handles it by default, so exclude them as well + 'jsx', + 'tsx', + ...KNOWN_ASSET_TYPES, +] + +const optionalPeerDepNamespace = 'optional-peer-dep:' +const browserExternalNamespace = 'browser-external:' + +export function rolldownDepPlugin( + environment: Environment, + qualified: Record, + external: string[], +): Plugin { + const { isProduction } = environment.config + const { extensions } = environment.config.dev.optimizeDeps + + // remove optimizable extensions from `externalTypes` list + const allExternalTypes = extensions + ? externalTypes.filter((type) => !extensions?.includes('.' + type)) + : externalTypes + + // use separate package cache for optimizer as it caches paths around node_modules + // and it's unlikely for the core Vite process to traverse into node_modules again + const esmPackageCache: PackageCache = new Map() + const cjsPackageCache: PackageCache = new Map() + + // default resolver which prefers ESM + const _resolve = createBackCompatIdResolver(environment.getTopLevelConfig(), { + asSrc: false, + scan: true, + packageCache: esmPackageCache, + }) + + // cjs resolver that prefers Node + const _resolveRequire = createBackCompatIdResolver( + environment.getTopLevelConfig(), + { + asSrc: false, + isRequire: true, + scan: true, + packageCache: cjsPackageCache, + }, + ) + + const resolve = ( + id: string, + importer: string | undefined, + kind: ImportKind, + resolveDir?: string, + ): Promise => { + let _importer: string | undefined + // explicit resolveDir - this is passed only during yarn pnp resolve for + // entries + if (resolveDir) { + _importer = normalizePath(path.join(resolveDir, '*')) + } else if (importer) { + // map importer ids to file paths for correct resolution + _importer = importer in qualified ? qualified[importer] : importer + } + const resolver = kind.startsWith('require') ? _resolveRequire : _resolve + return resolver(environment, id, _importer) + } + + const resolveResult = (id: string, resolved: string) => { + if (resolved.startsWith(browserExternalId)) { + return { + id: browserExternalNamespace + id, + } + } + if (resolved.startsWith(optionalPeerDepId)) { + return { + id: optionalPeerDepNamespace + resolved, + } + } + if (environment.config.consumer === 'server' && isBuiltin(resolved)) { + return + } + if (isExternalUrl(resolved)) { + return { + id: resolved, + external: true, + } + } + return { + id: path.resolve(resolved), + } + } + + const allExternalTypesReg = new RegExp( + `\\.(` + allExternalTypes.join('|') + `)(\\?.*)?$`, + ) + + function resolveEntry(id: string) { + const flatId = flattenId(id) + if (flatId in qualified) { + return { + id: qualified[flatId], + } + } + } + + return { + name: 'vite:dep-pre-bundle', + // clear package cache when build is finished + buildEnd() { + esmPackageCache.clear() + cjsPackageCache.clear() + }, + resolveId: async function (id, importer, options) { + const kind = options.kind + // externalize assets and commonly known non-js file types + // See #8459 for more details about this require-import conversion + if (allExternalTypesReg.test(id)) { + // if the prefix exist, it is already converted to `import`, so set `external: true` + if (id.startsWith(convertedExternalPrefix)) { + return { + id: id.slice(convertedExternalPrefix.length), + external: true, + } + } + + const resolved = await resolve(id, importer, kind) + if (resolved) { + // `resolved` can be javascript even when `id` matches `allExternalTypes` + // due to cjs resolution (e.g. require("./test.pdf") for "./test.pdf.js") + // or package name (e.g. import "some-package.pdf") + if (JS_TYPES_RE.test(resolved)) { + return { + id: resolved, + external: false, + } + } + + if (kind === 'require-call') { + // here it is not set to `external: true` to convert `require` to `import` + return { + id: externalWithConversionNamespace + resolved, + } + } + return { + id: resolved, + external: true, + } + } + } + + if (/^[\w@][^:]/.test(id)) { + if (moduleListContains(external, id)) { + return { + id: id, + external: true, + } + } + + // ensure esbuild uses our resolved entries + let entry: { id: string } | undefined + // if this is an entry, return entry namespace resolve result + if (!importer) { + if ((entry = resolveEntry(id))) return entry + // check if this is aliased to an entry - also return entry namespace + const aliased = await _resolve(environment, id, undefined, true) + if (aliased && (entry = resolveEntry(aliased))) { + return entry + } + } + + // use vite's own resolver + const resolved = await resolve(id, importer, kind) + if (resolved) { + return resolveResult(id, resolved) + } + } + }, + load(id) { + if (id.startsWith(externalWithConversionNamespace)) { + const path = id.slice(externalWithConversionNamespace.length) + // import itself with prefix (this is the actual part of require-import conversion) + const modulePath = `"${convertedExternalPrefix}${path}"` + return { + code: + isCSSRequest(path) && !isModuleCSSRequest(path) + ? `import ${modulePath};` + : `export { default } from ${modulePath};` + + `export * from ${modulePath};`, + } + } + + if (id.startsWith(browserExternalNamespace)) { + const path = id.slice(browserExternalNamespace.length) + if (isProduction) { + return { + code: 'module.exports = {}', + } + } else { + return { + // Return in CJS to intercept named imports. Use `Object.create` to + // create the Proxy in the prototype to workaround esbuild issue. Why? + // + // In short, esbuild cjs->esm flow: + // 1. Create empty object using `Object.create(Object.getPrototypeOf(module.exports))`. + // 2. Assign props of `module.exports` to the object. + // 3. Return object for ESM use. + // + // If we do `module.exports = new Proxy({}, {})`, step 1 returns empty object, + // step 2 does nothing as there's no props for `module.exports`. The final object + // is just an empty object. + // + // Creating the Proxy in the prototype satisfies step 1 immediately, which means + // the returned object is a Proxy that we can intercept. + // + // Note: Skip keys that are accessed by esbuild and browser devtools. + code: `\ +module.exports = Object.create(new Proxy({}, { + get(_, key) { + if ( + key !== '__esModule' && + key !== '__proto__' && + key !== 'constructor' && + key !== 'splice' + ) { + console.warn(\`Module "${path}" has been externalized for browser compatibility. Cannot access "${path}.\${key}" in client code. See http://vite.dev/guide/troubleshooting.html#module-externalized-for-browser-compatibility for more details.\`) + } + } +}))`, + } + } + } + + if (id.startsWith(optionalPeerDepNamespace)) { + if (isProduction) { + return { + code: 'module.exports = {}', + } + } else { + const path = id.slice(externalWithConversionNamespace.length) + const [, peerDep, parentDep] = path.split(':') + return { + code: `throw new Error(\`Could not resolve "${peerDep}" imported by "${parentDep}". Is it installed?\`)`, + } + } + } + }, + } +} + +const matchesEntireLine = (text: string) => `^${escapeRegex(text)}$` + +// esbuild doesn't transpile `require('foo')` into `import` statements if 'foo' is externalized +// https://github.com/evanw/esbuild/issues/566#issuecomment-735551834 +export function rolldownCjsExternalPlugin( + externals: string[], + platform: 'node' | 'browser', +): Plugin { + const filter = new RegExp(externals.map(matchesEntireLine).join('|')) + + return { + name: 'cjs-external', + resolveId(id, _importer, options) { + if (id.startsWith(nonFacadePrefix)) { + return { + id: id.slice(nonFacadePrefix.length), + external: true, + } + } + + if (filter.test(id)) { + const kind = options.kind + // preserve `require` for node because it's more accurate than converting it to import + if (kind === 'require-call' && platform !== 'node') { + return { + id: cjsExternalFacadeNamespace + id, + } + } + + return { + id, + external: true, + } + } + }, + load(id) { + if (id.startsWith(cjsExternalFacadeNamespace)) { + return { + code: + `import * as m from ${JSON.stringify( + nonFacadePrefix + id.slice(cjsExternalFacadeNamespace.length), + )};` + `module.exports = m;`, + } + } + }, + } +} diff --git a/packages/vite/src/node/optimizer/scan.ts b/packages/vite/src/node/optimizer/scan.ts index 90298b8d21070a..13f85cd7612de1 100644 --- a/packages/vite/src/node/optimizer/scan.ts +++ b/packages/vite/src/node/optimizer/scan.ts @@ -3,16 +3,12 @@ import fsp from 'node:fs/promises' import path from 'node:path' import { performance } from 'node:perf_hooks' import glob from 'fast-glob' -import type { - BuildContext, - Loader, - OnLoadArgs, - OnLoadResult, - Plugin, -} from 'esbuild' -import esbuild, { formatMessages, transform } from 'esbuild' +import type { Loader } from 'esbuild' +import { transform } from 'esbuild' import type { PartialResolvedId } from 'rollup' import colors from 'picocolors' +import type { Plugin } from 'rolldown' +import { scan } from 'rolldown/experimental' import { CSS_LANGS_RE, JS_TYPES_RE, @@ -21,6 +17,7 @@ import { } from '../constants' import { arraify, + asyncFlatten, createDebugger, dataUrlRE, externalRE, @@ -112,7 +109,7 @@ type ResolveIdOptions = Omit< const debug = createDebugger('vite:deps') -const htmlTypesRE = /\.(html|vue|svelte|astro|imba)$/ +const htmlTypesRE = /\.(?:html|vue|svelte|astro|imba)$/ // A simple regex to detect import sources. This is only used on // + const filePath = id.replace(normalizePath(config.root), '') + addToHTMLProxyCache(config, filePath, inlineModuleIndex, { + code: contents, + }) + js += `\nimport "${id}?html-proxy&index=${inlineModuleIndex}.js"` + shouldRemove = true + } - if (isModule) { - inlineModuleIndex++ - if (url && !isExcludedUrl(url) && !isPublicFile) { - // - const filePath = id.replace(normalizePath(config.root), '') - addToHTMLProxyCache(config, filePath, inlineModuleIndex, { - code: contents, - }) - js += `\nimport "${id}?html-proxy&index=${inlineModuleIndex}.js"` - shouldRemove = true - } - - everyScriptIsAsync &&= isAsync - someScriptsAreAsync ||= isAsync - someScriptsAreDefer ||= !isAsync - } else if (url && !isPublicFile) { - if (!isExcludedUrl(url)) { - config.logger.warn( - ` asset - for (const { start, end, url } of scriptUrls) { - if (checkPublicFile(url, config)) { - s.update( - start, - end, - partialEncodeURIPath(toOutputPublicFilePath(url)), - ) - } else if (!isExcludedUrl(url)) { - s.update( - start, - end, - partialEncodeURIPath(await urlToBuiltUrl(this, url, id)), - ) + // emit asset + for (const { start, end, url } of scriptUrls) { + if (checkPublicFile(url, config)) { + s.update( + start, + end, + partialEncodeURIPath(toOutputPublicFilePath(url)), + ) + } else if (!isExcludedUrl(url)) { + s.update( + start, + end, + partialEncodeURIPath(await urlToBuiltUrl(this, url, id)), + ) + } } - } - // ignore if its url can't be resolved - const resolvedStyleUrls = await Promise.all( - styleUrls.map(async (styleUrl) => ({ - ...styleUrl, - resolved: await this.resolve(styleUrl.url, id), - })), - ) - for (const { start, end, url, resolved } of resolvedStyleUrls) { - if (resolved == null) { - config.logger.warnOnce( - `\n${url} doesn't exist at build time, it will remain unchanged to be resolved at runtime`, - ) - const importExpression = `\nimport ${JSON.stringify(url)}` - js = js.replace(importExpression, '') - } else { - s.remove(start, end) + // ignore if its url can't be resolved + const resolvedStyleUrls = await Promise.all( + styleUrls.map(async (styleUrl) => ({ + ...styleUrl, + resolved: await this.resolve(styleUrl.url, id), + })), + ) + for (const { start, end, url, resolved } of resolvedStyleUrls) { + if (resolved == null) { + config.logger.warnOnce( + `\n${url} doesn't exist at build time, it will remain unchanged to be resolved at runtime`, + ) + const importExpression = `\nimport ${JSON.stringify(url)}` + js = js.replace(importExpression, '') + } else { + s.remove(start, end) + } } - } - processedHtml(this).set(id, s.toString()) + processedHtml(this).set(id, s.toString()) - // inject module preload polyfill only when configured and needed - const { modulePreload } = this.environment.config.build - if ( - modulePreload !== false && - modulePreload.polyfill && - (someScriptsAreAsync || someScriptsAreDefer) - ) { - js = `import "${modulePreloadPolyfillId}";\n${js}` - } + // inject module preload polyfill only when configured and needed + const { modulePreload } = this.environment.config.build + if ( + modulePreload !== false && + modulePreload.polyfill && + (someScriptsAreAsync || someScriptsAreDefer) + ) { + js = `import "${modulePreloadPolyfillId}";\n${js}` + } - // Force rollup to keep this module from being shared between other entry points. - // If the resulting chunk is empty, it will be removed in generateBundle. - return { code: js, moduleSideEffects: 'no-treeshake' } - } + // Force rollup to keep this module from being shared between other entry points. + // If the resulting chunk is empty, it will be removed in generateBundle. + return { code: js, moduleSideEffects: 'no-treeshake' } + } + }, }, async generateBundle(options, bundle) { diff --git a/packages/vite/src/node/plugins/worker.ts b/packages/vite/src/node/plugins/worker.ts index d1b28ffe5e2cbf..1c41934d674920 100644 --- a/packages/vite/src/node/plugins/worker.ts +++ b/packages/vite/src/node/plugins/worker.ts @@ -1,6 +1,6 @@ import path from 'node:path' import MagicString from 'magic-string' -import type { OutputChunk } from 'rolldown' +import type { OutputChunk, RolldownPlugin } from 'rolldown' import type { ResolvedConfig } from '../config' import type { Plugin } from '../plugin' import { ENV_ENTRY, ENV_PUBLIC_PATH } from '../constants' @@ -221,7 +221,7 @@ export function webWorkerPostPlugin(): Plugin { } } -export function webWorkerPlugin(config: ResolvedConfig): Plugin { +export function webWorkerPlugin(config: ResolvedConfig): RolldownPlugin { const isBuild = config.command === 'build' const isWorker = config.isWorker @@ -239,10 +239,17 @@ export function webWorkerPlugin(config: ResolvedConfig): Plugin { }) }, - load(id) { - if (isBuild && workerOrSharedWorkerRE.test(id)) { - return '' - } + load: { + filter: { + id: { + include: [workerOrSharedWorkerRE], + }, + }, + handler(id) { + if (isBuild && workerOrSharedWorkerRE.test(id)) { + return '' + } + }, }, // shouldTransformCachedModule({ id }) { @@ -251,147 +258,154 @@ export function webWorkerPlugin(config: ResolvedConfig): Plugin { // } // }, - async transform(raw, id) { - const workerFileMatch = workerFileRE.exec(id) - if (workerFileMatch) { - // if import worker by worker constructor will have query.type - // other type will be import worker by esm - const workerType = workerFileMatch[1] as WorkerType - let injectEnv = '' - - const scriptPath = JSON.stringify( - path.posix.join(config.base, ENV_PUBLIC_PATH), - ) + transform: { + filter: { + id: { + include: [workerOrSharedWorkerRE, workerFileRE], + }, + }, + async handler(raw, id) { + const workerFileMatch = workerFileRE.exec(id) + if (workerFileMatch) { + // if import worker by worker constructor will have query.type + // other type will be import worker by esm + const workerType = workerFileMatch[1] as WorkerType + let injectEnv = '' + + const scriptPath = JSON.stringify( + path.posix.join(config.base, ENV_PUBLIC_PATH), + ) - if (workerType === 'classic') { - injectEnv = `importScripts(${scriptPath})\n` - } else if (workerType === 'module') { - injectEnv = `import ${scriptPath}\n` - } else if (workerType === 'ignore') { - if (isBuild) { - injectEnv = '' - } else { - // dynamic worker type we can't know how import the env - // so we copy /@vite/env code of server transform result into file header - const environment = this.environment - const moduleGraph = - environment.mode === 'dev' ? environment.moduleGraph : undefined - const module = moduleGraph?.getModuleById(ENV_ENTRY) - injectEnv = module?.transformResult?.code || '' + if (workerType === 'classic') { + injectEnv = `importScripts(${scriptPath})\n` + } else if (workerType === 'module') { + injectEnv = `import ${scriptPath}\n` + } else if (workerType === 'ignore') { + if (isBuild) { + injectEnv = '' + } else { + // dynamic worker type we can't know how import the env + // so we copy /@vite/env code of server transform result into file header + const environment = this.environment + const moduleGraph = + environment.mode === 'dev' ? environment.moduleGraph : undefined + const module = moduleGraph?.getModuleById(ENV_ENTRY) + injectEnv = module?.transformResult?.code || '' + } } - } - if (injectEnv) { - const s = new MagicString(raw) - s.prepend(injectEnv + ';\n') - return { - code: s.toString(), - map: s.generateMap({ hires: 'boundary' }), + if (injectEnv) { + const s = new MagicString(raw) + s.prepend(injectEnv + ';\n') + return { + code: s.toString(), + map: s.generateMap({ hires: 'boundary' }), + } } + return } - return - } - const workerMatch = workerOrSharedWorkerRE.exec(id) - if (!workerMatch) return - - const { format } = config.worker - const workerConstructor = - workerMatch[1] === 'sharedworker' ? 'SharedWorker' : 'Worker' - const workerType = isBuild - ? format === 'es' - ? 'module' - : 'classic' - : 'module' - const workerTypeOption = `{ - ${workerType === 'module' ? `type: "module",` : ''} - name: options?.name - }` - - let urlCode: string - if (isBuild) { - if (isWorker && config.bundleChain.at(-1) === cleanUrl(id)) { - urlCode = 'self.location.href' - } else if (inlineRE.test(id)) { - const chunk = await bundleWorkerEntry(config, id) - const encodedJs = `const encodedJs = "${Buffer.from( - chunk.code, - ).toString('base64')}";` - - const code = - // Using blob URL for SharedWorker results in multiple instances of a same worker - workerConstructor === 'Worker' - ? `${encodedJs} - const decodeBase64 = (base64) => Uint8Array.from(atob(base64), c => c.charCodeAt(0)); - const blob = typeof self !== "undefined" && self.Blob && new Blob([${ - workerType === 'classic' - ? '' - : // `URL` is always available, in `Worker[type="module"]` - `'URL.revokeObjectURL(import.meta.url);',` - }decodeBase64(encodedJs)], { type: "text/javascript;charset=utf-8" }); - export default function WorkerWrapper(options) { - let objURL; - try { - objURL = blob && (self.URL || self.webkitURL).createObjectURL(blob); - if (!objURL) throw '' - const worker = new ${workerConstructor}(objURL, ${workerTypeOption}); - worker.addEventListener("error", () => { - (self.URL || self.webkitURL).revokeObjectURL(objURL); - }); - return worker; - } catch(e) { + const workerMatch = workerOrSharedWorkerRE.exec(id) + if (!workerMatch) return + + const { format } = config.worker + const workerConstructor = + workerMatch[1] === 'sharedworker' ? 'SharedWorker' : 'Worker' + const workerType = isBuild + ? format === 'es' + ? 'module' + : 'classic' + : 'module' + const workerTypeOption = `{ + ${workerType === 'module' ? `type: "module",` : ''} + name: options?.name + }` + + let urlCode: string + if (isBuild) { + if (isWorker && config.bundleChain.at(-1) === cleanUrl(id)) { + urlCode = 'self.location.href' + } else if (inlineRE.test(id)) { + const chunk = await bundleWorkerEntry(config, id) + const encodedJs = `const encodedJs = "${Buffer.from( + chunk.code, + ).toString('base64')}";` + + const code = + // Using blob URL for SharedWorker results in multiple instances of a same worker + workerConstructor === 'Worker' + ? `${encodedJs} + const decodeBase64 = (base64) => Uint8Array.from(atob(base64), c => c.charCodeAt(0)); + const blob = typeof self !== "undefined" && self.Blob && new Blob([${ + workerType === 'classic' + ? '' + : // `URL` is always available, in `Worker[type="module"]` + `'URL.revokeObjectURL(import.meta.url);',` + }decodeBase64(encodedJs)], { type: "text/javascript;charset=utf-8" }); + export default function WorkerWrapper(options) { + let objURL; + try { + objURL = blob && (self.URL || self.webkitURL).createObjectURL(blob); + if (!objURL) throw '' + const worker = new ${workerConstructor}(objURL, ${workerTypeOption}); + worker.addEventListener("error", () => { + (self.URL || self.webkitURL).revokeObjectURL(objURL); + }); + return worker; + } catch(e) { + return new ${workerConstructor}( + "data:text/javascript;base64," + encodedJs, + ${workerTypeOption} + ); + }${ + // For module workers, we should not revoke the URL until the worker runs, + // otherwise the worker fails to run + workerType === 'classic' + ? ` finally { + objURL && (self.URL || self.webkitURL).revokeObjectURL(objURL); + }` + : '' + } + }` + : `${encodedJs} + export default function WorkerWrapper(options) { return new ${workerConstructor}( "data:text/javascript;base64," + encodedJs, ${workerTypeOption} ); - }${ - // For module workers, we should not revoke the URL until the worker runs, - // otherwise the worker fails to run - workerType === 'classic' - ? ` finally { - objURL && (self.URL || self.webkitURL).revokeObjectURL(objURL); - }` - : '' } - }` - : `${encodedJs} - export default function WorkerWrapper(options) { - return new ${workerConstructor}( - "data:text/javascript;base64," + encodedJs, - ${workerTypeOption} - ); + ` + + return { + code, + // Empty sourcemap to suppress Rollup warning + map: { mappings: '' }, + } + } else { + urlCode = JSON.stringify(await workerFileToUrl(config, id)) } - ` + } else { + let url = await fileToUrl(this, cleanUrl(id)) + url = injectQuery(url, `${WORKER_FILE_ID}&type=${workerType}`) + urlCode = JSON.stringify(url) + } + if (urlRE.test(id)) { return { - code, - // Empty sourcemap to suppress Rollup warning - map: { mappings: '' }, + code: `export default ${urlCode}`, + map: { mappings: '' }, // Empty sourcemap to suppress Rollup warning } - } else { - urlCode = JSON.stringify(await workerFileToUrl(config, id)) } - } else { - let url = await fileToUrl(this, cleanUrl(id)) - url = injectQuery(url, `${WORKER_FILE_ID}&type=${workerType}`) - urlCode = JSON.stringify(url) - } - if (urlRE.test(id)) { return { - code: `export default ${urlCode}`, + code: `export default function WorkerWrapper(options) { + return new ${workerConstructor}( + ${urlCode}, + ${workerTypeOption} + ); + }`, map: { mappings: '' }, // Empty sourcemap to suppress Rollup warning } - } - - return { - code: `export default function WorkerWrapper(options) { - return new ${workerConstructor}( - ${urlCode}, - ${workerTypeOption} - ); - }`, - map: { mappings: '' }, // Empty sourcemap to suppress Rollup warning - } + }, }, renderChunk(code, chunk, outputOptions) { diff --git a/packages/vite/src/node/plugins/workerImportMetaUrl.ts b/packages/vite/src/node/plugins/workerImportMetaUrl.ts index 54f83324303399..d1e484acd54891 100644 --- a/packages/vite/src/node/plugins/workerImportMetaUrl.ts +++ b/packages/vite/src/node/plugins/workerImportMetaUrl.ts @@ -1,9 +1,8 @@ import path from 'node:path' import MagicString from 'magic-string' -import type { RollupError } from 'rolldown' +import type { RolldownPlugin, RollupError } from 'rolldown' import { stripLiteral } from 'strip-literal' import type { ResolvedConfig } from '../config' -import type { Plugin } from '../plugin' import { evalValue, injectQuery, transformStableResult } from '../utils' import { createBackCompatIdResolver } from '../idResolver' import type { ResolveIdFn } from '../idResolver' @@ -104,7 +103,9 @@ function isIncludeWorkerImportMetaUrl(code: string): boolean { return false } -export function workerImportMetaUrlPlugin(config: ResolvedConfig): Plugin { +export function workerImportMetaUrlPlugin( + config: ResolvedConfig, +): RolldownPlugin { const isBuild = config.command === 'build' let workerResolver: ResolveIdFn @@ -126,82 +127,89 @@ export function workerImportMetaUrlPlugin(config: ResolvedConfig): Plugin { // } // }, - async transform(code, id) { - if ( - this.environment.config.consumer === 'client' && - isIncludeWorkerImportMetaUrl(code) - ) { - let s: MagicString | undefined - const cleanString = stripLiteral(code) - const workerImportMetaUrlRE = - /\bnew\s+(?:Worker|SharedWorker)\s*\(\s*(new\s+URL\s*\(\s*('[^']+'|"[^"]+"|`[^`]+`)\s*,\s*import\.meta\.url\s*\))/dg - - let match: RegExpExecArray | null - while ((match = workerImportMetaUrlRE.exec(cleanString))) { - const [[, endIndex], [expStart, expEnd], [urlStart, urlEnd]] = - match.indices! - - const rawUrl = code.slice(urlStart, urlEnd) - - // potential dynamic template string - if (rawUrl[0] === '`' && rawUrl.includes('${')) { - this.error( - `\`new URL(url, import.meta.url)\` is not supported in dynamic template string.`, - expStart, - ) - } + transform: { + filter: { + code: { + include: [/(?:new Worker|new SharedWorker)/], + }, + }, + async handler(code, id) { + if ( + this.environment.config.consumer === 'client' && + isIncludeWorkerImportMetaUrl(code) + ) { + let s: MagicString | undefined + const cleanString = stripLiteral(code) + const workerImportMetaUrlRE = + /\bnew\s+(?:Worker|SharedWorker)\s*\(\s*(new\s+URL\s*\(\s*('[^']+'|"[^"]+"|`[^`]+`)\s*,\s*import\.meta\.url\s*\))/dg + + let match: RegExpExecArray | null + while ((match = workerImportMetaUrlRE.exec(cleanString))) { + const [[, endIndex], [expStart, expEnd], [urlStart, urlEnd]] = + match.indices! + + const rawUrl = code.slice(urlStart, urlEnd) + + // potential dynamic template string + if (rawUrl[0] === '`' && rawUrl.includes('${')) { + this.error( + `\`new URL(url, import.meta.url)\` is not supported in dynamic template string.`, + expStart, + ) + } - s ||= new MagicString(code) - const workerType = getWorkerType(code, cleanString, endIndex) - const url = rawUrl.slice(1, -1) - let file: string | undefined - if (url[0] === '.') { - file = path.resolve(path.dirname(id), url) - file = tryFsResolve(file, fsResolveOptions) ?? file - } else { - workerResolver ??= createBackCompatIdResolver(config, { - extensions: [], - tryIndex: false, - preferRelative: true, - }) - file = await workerResolver(this.environment, url, id) - file ??= - url[0] === '/' - ? slash(path.join(config.publicDir, url)) - : slash(path.resolve(path.dirname(id), url)) - } + s ||= new MagicString(code) + const workerType = getWorkerType(code, cleanString, endIndex) + const url = rawUrl.slice(1, -1) + let file: string | undefined + if (url[0] === '.') { + file = path.resolve(path.dirname(id), url) + file = tryFsResolve(file, fsResolveOptions) ?? file + } else { + workerResolver ??= createBackCompatIdResolver(config, { + extensions: [], + tryIndex: false, + preferRelative: true, + }) + file = await workerResolver(this.environment, url, id) + file ??= + url[0] === '/' + ? slash(path.join(config.publicDir, url)) + : slash(path.resolve(path.dirname(id), url)) + } - if ( - isBuild && - config.isWorker && - config.bundleChain.at(-1) === cleanUrl(file) - ) { - s.update(expStart, expEnd, 'self.location.href') - } else { - let builtUrl: string - if (isBuild) { - builtUrl = await workerFileToUrl(config, file) + if ( + isBuild && + config.isWorker && + config.bundleChain.at(-1) === cleanUrl(file) + ) { + s.update(expStart, expEnd, 'self.location.href') } else { - builtUrl = await fileToUrl(this, cleanUrl(file)) - builtUrl = injectQuery( - builtUrl, - `${WORKER_FILE_ID}&type=${workerType}`, + let builtUrl: string + if (isBuild) { + builtUrl = await workerFileToUrl(config, file) + } else { + builtUrl = await fileToUrl(this, cleanUrl(file)) + builtUrl = injectQuery( + builtUrl, + `${WORKER_FILE_ID}&type=${workerType}`, + ) + } + s.update( + expStart, + expEnd, + `new URL(/* @vite-ignore */ ${JSON.stringify(builtUrl)}, import.meta.url)`, ) } - s.update( - expStart, - expEnd, - `new URL(/* @vite-ignore */ ${JSON.stringify(builtUrl)}, import.meta.url)`, - ) } - } - if (s) { - return transformStableResult(s, id, config) - } + if (s) { + return transformStableResult(s, id, config) + } - return null - } + return null + } + }, }, } } From c48484799ac258215c3699610477e5893b968f36 Mon Sep 17 00:00:00 2001 From: IWANABETHATGUY Date: Sat, 14 Sep 2024 18:59:59 +0800 Subject: [PATCH 13/43] =?UTF-8?q?perf:=20=E2=9A=A1=EF=B8=8F=20use=20defaul?= =?UTF-8?q?t=20resolver=20(#56)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/vite/src/node/plugins/index.ts | 28 +++++++++++++------------ 1 file changed, 15 insertions(+), 13 deletions(-) diff --git a/packages/vite/src/node/plugins/index.ts b/packages/vite/src/node/plugins/index.ts index 351827adc6c714..731f78f4237984 100644 --- a/packages/vite/src/node/plugins/index.ts +++ b/packages/vite/src/node/plugins/index.ts @@ -82,19 +82,21 @@ export async function resolvePlugins( }) : modulePreloadPolyfillPlugin(config) : null, - resolvePlugin( - { - root: config.root, - isProduction: config.isProduction, - isBuild, - packageCache: config.packageCache, - asSrc: true, - fsUtils: getFsUtils(config), - optimizeDeps: true, - externalize: isBuild && !!config.build.ssr, // TODO: should we do this for all environments? - }, - config.environments, - ), + enableNativePlugin + ? null + : resolvePlugin( + { + root: config.root, + isProduction: config.isProduction, + isBuild, + packageCache: config.packageCache, + asSrc: true, + fsUtils: getFsUtils(config), + optimizeDeps: true, + externalize: isBuild && !!config.build.ssr, // TODO: should we do this for all environments? + }, + config.environments, + ), htmlInlineProxyPlugin(config), cssPlugin(config), config.esbuild !== false From f260d3515ce37a70f68f318f2c00670804547f68 Mon Sep 17 00:00:00 2001 From: sapphi-red <49056869+sapphi-red@users.noreply.github.com> Date: Thu, 19 Sep 2024 15:43:29 +0900 Subject: [PATCH 14/43] chore: fix native manifest plugin --- packages/vite/src/node/build.ts | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/packages/vite/src/node/build.ts b/packages/vite/src/node/build.ts index ac5bb57f8c4c36..8602a7ce1d20cf 100644 --- a/packages/vite/src/node/build.ts +++ b/packages/vite/src/node/build.ts @@ -500,7 +500,13 @@ export async function resolveBuildPlugins(config: ResolvedConfig): Promise<{ ? [ config.build.manifest && enableNativePlugin ? // TODO: make this environment-specific - nativeManifestPlugin() + nativeManifestPlugin({ + root: config.root, + outPath: + config.build.manifest === true + ? '.vite/manifest.json' + : config.build.manifest, + }) : manifestPlugin(), ssrManifestPlugin(), ...(enableBuildReport ? [buildReporterPlugin(config)] : []), From 30722bd4d138b2fc8647df84d1e5ae85c6923b12 Mon Sep 17 00:00:00 2001 From: sapphi-red <49056869+sapphi-red@users.noreply.github.com> Date: Thu, 19 Sep 2024 18:14:00 +0900 Subject: [PATCH 15/43] feat: handle non-relative paths by Vite's resolver for enableNativePlugin --- packages/vite/src/node/plugins/index.ts | 16 ++++++++-- packages/vite/src/node/plugins/resolve.ts | 32 +++++++++++++++++++- playground/resolve/browser-field/relative.js | 3 +- 3 files changed, 47 insertions(+), 4 deletions(-) diff --git a/packages/vite/src/node/plugins/index.ts b/packages/vite/src/node/plugins/index.ts index 731f78f4237984..4bf0c449012860 100644 --- a/packages/vite/src/node/plugins/index.ts +++ b/packages/vite/src/node/plugins/index.ts @@ -16,7 +16,7 @@ import type { HookHandler, Plugin, PluginWithRequiredHook } from '../plugin' import { watchPackageDataPlugin } from '../packages' import { getFsUtils } from '../fsUtils' import { jsonPlugin } from './json' -import { resolvePlugin } from './resolve' +import { filteredResolvePlugin, resolvePlugin } from './resolve' import { optimizedDepsPlugin } from './optimizedDeps' import { esbuildPlugin } from './esbuild' import { importAnalysisPlugin } from './importAnalysis' @@ -83,7 +83,19 @@ export async function resolvePlugins( : modulePreloadPolyfillPlugin(config) : null, enableNativePlugin - ? null + ? filteredResolvePlugin( + { + root: config.root, + isProduction: config.isProduction, + isBuild, + packageCache: config.packageCache, + asSrc: true, + fsUtils: getFsUtils(config), + optimizeDeps: true, + externalize: isBuild && !!config.build.ssr, // TODO: should we do this for all environments? + }, + config.environments, + ) : resolvePlugin( { root: config.root, diff --git a/packages/vite/src/node/plugins/resolve.ts b/packages/vite/src/node/plugins/resolve.ts index e33489ec50c327..fe35371e6d55d1 100644 --- a/packages/vite/src/node/plugins/resolve.ts +++ b/packages/vite/src/node/plugins/resolve.ts @@ -1,7 +1,7 @@ import fs from 'node:fs' import path from 'node:path' import colors from 'picocolors' -import type { PartialResolvedId } from 'rolldown' +import type { PartialResolvedId, RolldownPlugin } from 'rolldown' import { exports, imports } from 'resolve.exports' import { hasESMSyntax } from 'mlly' import type { Plugin } from '../plugin' @@ -181,6 +181,36 @@ export interface ResolvePluginOptionsWithOverrides extends ResolveOptions, ResolvePluginOptions {} +export function filteredResolvePlugin( + resolveOptions: ResolvePluginOptionsWithOverrides, + environmentsOptions?: Record, +): RolldownPlugin { + const originalPlugin = resolvePlugin(resolveOptions, environmentsOptions) + + return { + name: 'vite:resolve', + options(option) { + option.resolve ??= {} + option.resolve.extensions = this.environment.config.resolve.extensions + }, + resolveId: { + filter: { + id: { + exclude: [ + // relative paths without query + // also exclude path ending with .[cm]?jsx? (for typescript moduleResolution=nodenext) + /^\.\.?[/\\](?!.*\.[cm]?jsx?$)[^?]+$/, + /^(?:\0|\/?virtual:)/, + ], + }, + }, + // @ts-expect-error the options is incompatible + handler: originalPlugin.resolveId!, + }, + load: originalPlugin.load, + } +} + export function resolvePlugin( resolveOptions: ResolvePluginOptionsWithOverrides, /** diff --git a/playground/resolve/browser-field/relative.js b/playground/resolve/browser-field/relative.js index 660d6be578a728..3be4d7452be75d 100644 --- a/playground/resolve/browser-field/relative.js +++ b/playground/resolve/browser-field/relative.js @@ -4,7 +4,8 @@ import rb from './no-ext.js' // no substitution import rc from './ext' import rd from './ext.js' import re from './ext-index/index.js' -import rf from './ext-index' +// import rf from './ext-index' +const rf = 'FIXME' import rg from './no-ext-index/index.js' // no substitution export { ra, rb, rc, rd, re, rf, rg } From 9acd07914f009d2518b2233f6c9d91bb943290ac Mon Sep 17 00:00:00 2001 From: IWANABETHATGUY Date: Fri, 20 Sep 2024 21:00:05 +0800 Subject: [PATCH 16/43] =?UTF-8?q?fix:=20=F0=9F=90=9B=20lint=20(#58)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/vite/src/node/build.ts | 66 ++++++++++++++++----------------- 1 file changed, 33 insertions(+), 33 deletions(-) diff --git a/packages/vite/src/node/build.ts b/packages/vite/src/node/build.ts index 8602a7ce1d20cf..019933172e25d2 100644 --- a/packages/vite/src/node/build.ts +++ b/packages/vite/src/node/build.ts @@ -1040,10 +1040,10 @@ export function resolveBuildOutputs( } const warningIgnoreList = [`CIRCULAR_DEPENDENCY`, `THIS_IS_UNDEFINED`] -const dynamicImportWarningIgnoreList = [ - `Unsupported expression`, - `statically analyzed`, -] +// const dynamicImportWarningIgnoreList = [ +// `Unsupported expression`, +// `statically analyzed`, +// ] function clearLine() { const tty = process.stdout.isTTY && !process.env.CI @@ -1068,41 +1068,41 @@ export function onRollupWarning( } if (typeof warning === 'object') { - if (warning.code === 'UNRESOLVED_IMPORT') { - const id = warning.id - const exporter = warning.exporter - // throw unless it's commonjs external... - if (!id || !id.endsWith('?commonjs-external')) { - throw new Error( - `[vite]: Rollup failed to resolve import "${exporter}" from "${id}".\n` + - `This is most likely unintended because it can break your application at runtime.\n` + - `If you do want to externalize this module explicitly add it to\n` + - `\`build.rollupOptions.external\``, - ) - } - } + // if (warning.code === 'UNRESOLVED_IMPORT') { + // const id = warning.id + // const exporter = warning.exporter + // // throw unless it's commonjs external... + // if (!id || !id.endsWith('?commonjs-external')) { + // throw new Error( + // `[vite]: Rollup failed to resolve import "${exporter}" from "${id}".\n` + + // `This is most likely unintended because it can break your application at runtime.\n` + + // `If you do want to externalize this module explicitly add it to\n` + + // `\`build.rollupOptions.external\``, + // ) + // } + // } - if ( - warning.plugin === 'rollup-plugin-dynamic-import-variables' && - dynamicImportWarningIgnoreList.some((msg) => - warning.message.includes(msg), - ) - ) { - return - } + // if ( + // warning.plugin === 'rollup-plugin-dynamic-import-variables' && + // dynamicImportWarningIgnoreList.some((msg) => + // warning.message.includes(msg), + // ) + // ) { + // return + // } if (warningIgnoreList.includes(warning.code!)) { return } - if (warning.code === 'PLUGIN_WARNING') { - environment.logger.warn( - `${colors.bold( - colors.yellow(`[plugin:${warning.plugin}]`), - )} ${colors.yellow(warning.message)}`, - ) - return - } + // if (warning.code === 'PLUGIN_WARNING') { + // environment.logger.warn( + // `${colors.bold( + // colors.yellow(`[plugin:${warning.plugin}]`), + // )} ${colors.yellow(warning.message)}`, + // ) + // return + // } } warn(warnLog) From 07080877dfc474699d233715722be26499f6341f Mon Sep 17 00:00:00 2001 From: sapphi-red <49056869+sapphi-red@users.noreply.github.com> Date: Tue, 24 Sep 2024 13:47:21 +0900 Subject: [PATCH 17/43] chore: bump rolldown --- packages/vite/package.json | 2 +- packages/vite/src/node/build.ts | 5 + packages/vite/src/node/optimizer/index.ts | 10 ++ packages/vite/src/node/plugins/worker.ts | 5 + pnpm-lock.yaml | 106 +++++++++++----------- 5 files changed, 74 insertions(+), 54 deletions(-) diff --git a/packages/vite/package.json b/packages/vite/package.json index 5cd3b409f47a30..b792a448f61dab 100644 --- a/packages/vite/package.json +++ b/packages/vite/package.json @@ -87,7 +87,7 @@ "dependencies": { "esbuild": "^0.24.0", "postcss": "^8.4.47", - "rolldown": "https://pkg.pr.new/rolldown@dab103f", + "rolldown": "https://pkg.pr.new/rolldown@824315d", "rollup": "^4.22.5" }, "optionalDependencies": { diff --git a/packages/vite/src/node/build.ts b/packages/vite/src/node/build.ts index 019933172e25d2..e413f6fbb2a12a 100644 --- a/packages/vite/src/node/build.ts +++ b/packages/vite/src/node/build.ts @@ -649,6 +649,11 @@ export async function buildEnvironment( onwarn(warning, warn) { onRollupWarning(warning, warn, environment) }, + // TODO: remove this and enable rolldown's CSS support later + moduleTypes: { + ...options.rollupOptions.moduleTypes, + '.css': 'js', + }, } /** diff --git a/packages/vite/src/node/optimizer/index.ts b/packages/vite/src/node/optimizer/index.ts index e57fcb3e6a39b9..c28018196a3cd7 100644 --- a/packages/vite/src/node/optimizer/index.ts +++ b/packages/vite/src/node/optimizer/index.ts @@ -781,6 +781,11 @@ async function prepareRolldownOptimizerRun( conditionNames: ['browser'], }, ...rollupOptions, + // TODO: remove this and enable rolldown's CSS support later + moduleTypes: { + '.css': 'js', + ...rollupOptions.moduleTypes, + }, }) if (canceled) { await bundle.close() @@ -1062,6 +1067,11 @@ export async function extractExportsData( ...remainingRollupOptions, plugins, input: [filePath], + // TODO: remove this and enable rolldown's CSS support later + moduleTypes: { + '.css': 'js', + ...remainingRollupOptions.moduleTypes, + }, }) const result = await build.generate({ ...rollupOptions.output, diff --git a/packages/vite/src/node/plugins/worker.ts b/packages/vite/src/node/plugins/worker.ts index 1c41934d674920..debfa4610f512f 100644 --- a/packages/vite/src/node/plugins/worker.ts +++ b/packages/vite/src/node/plugins/worker.ts @@ -85,6 +85,11 @@ async function bundleWorkerEntry( onwarn(warning, warn) { onRollupWarning(warning, warn, workerEnvironment) }, + // TODO: remove this and enable rolldown's CSS support later + moduleTypes: { + '.css': 'js', + ...rollupOptions.moduleTypes, + }, // preserveEntrySignatures: false, }) let chunk: OutputChunk diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 287b9b8ea166c8..9de8160d30c9f0 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -234,8 +234,8 @@ importers: specifier: ^8.4.47 version: 8.4.47 rolldown: - specifier: https://pkg.pr.new/rolldown@dab103f - version: https://pkg.pr.new/rolldown@dab103f + specifier: https://pkg.pr.new/rolldown@824315d + version: https://pkg.pr.new/rolldown@824315d rollup: specifier: ^4.22.5 version: 4.22.5 @@ -3085,63 +3085,63 @@ packages: '@polka/url@1.0.0-next.24': resolution: {integrity: sha512-2LuNTFBIO0m7kKIQvvPHN6UE63VjpmL9rnEEaOOaiSPbZK+zUOYIzBAWcED+3XYzhYsd/0mD57VdxAEqqV52CQ==} - '@rolldown/binding-darwin-arm64@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-darwin-arm64@dab103f': - resolution: {tarball: https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-darwin-arm64@dab103f} + '@rolldown/binding-darwin-arm64@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-darwin-arm64@824315d': + resolution: {tarball: https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-darwin-arm64@824315d} version: 0.13.2 os: [darwin] - '@rolldown/binding-darwin-x64@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-darwin-x64@dab103f': - resolution: {tarball: https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-darwin-x64@dab103f} + '@rolldown/binding-darwin-x64@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-darwin-x64@824315d': + resolution: {tarball: https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-darwin-x64@824315d} version: 0.13.2 os: [darwin] - '@rolldown/binding-freebsd-x64@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-freebsd-x64@dab103f': - resolution: {tarball: https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-freebsd-x64@dab103f} + '@rolldown/binding-freebsd-x64@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-freebsd-x64@824315d': + resolution: {tarball: https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-freebsd-x64@824315d} version: 0.13.2 os: [freebsd] - '@rolldown/binding-linux-arm-gnueabihf@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-linux-arm-gnueabihf@dab103f': - resolution: {tarball: https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-linux-arm-gnueabihf@dab103f} + '@rolldown/binding-linux-arm-gnueabihf@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-linux-arm-gnueabihf@824315d': + resolution: {tarball: https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-linux-arm-gnueabihf@824315d} version: 0.13.2 os: [linux] - '@rolldown/binding-linux-arm64-gnu@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-linux-arm64-gnu@dab103f': - resolution: {tarball: https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-linux-arm64-gnu@dab103f} + '@rolldown/binding-linux-arm64-gnu@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-linux-arm64-gnu@824315d': + resolution: {tarball: https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-linux-arm64-gnu@824315d} version: 0.13.2 os: [linux] - '@rolldown/binding-linux-arm64-musl@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-linux-arm64-musl@dab103f': - resolution: {tarball: https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-linux-arm64-musl@dab103f} + '@rolldown/binding-linux-arm64-musl@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-linux-arm64-musl@824315d': + resolution: {tarball: https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-linux-arm64-musl@824315d} version: 0.13.2 os: [linux] - '@rolldown/binding-linux-x64-gnu@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-linux-x64-gnu@dab103f': - resolution: {tarball: https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-linux-x64-gnu@dab103f} + '@rolldown/binding-linux-x64-gnu@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-linux-x64-gnu@824315d': + resolution: {tarball: https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-linux-x64-gnu@824315d} version: 0.13.2 os: [linux] - '@rolldown/binding-linux-x64-musl@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-linux-x64-musl@dab103f': - resolution: {tarball: https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-linux-x64-musl@dab103f} + '@rolldown/binding-linux-x64-musl@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-linux-x64-musl@824315d': + resolution: {tarball: https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-linux-x64-musl@824315d} version: 0.13.2 os: [linux] - '@rolldown/binding-wasm32-wasi@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-wasm32-wasi@dab103f': - resolution: {tarball: https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-wasm32-wasi@dab103f} + '@rolldown/binding-wasm32-wasi@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-wasm32-wasi@824315d': + resolution: {tarball: https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-wasm32-wasi@824315d} version: 0.13.2 engines: {node: '>=14.21.3'} - '@rolldown/binding-win32-arm64-msvc@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-win32-arm64-msvc@dab103f': - resolution: {tarball: https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-win32-arm64-msvc@dab103f} + '@rolldown/binding-win32-arm64-msvc@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-win32-arm64-msvc@824315d': + resolution: {tarball: https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-win32-arm64-msvc@824315d} version: 0.13.2 os: [win32] - '@rolldown/binding-win32-ia32-msvc@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-win32-ia32-msvc@dab103f': - resolution: {tarball: https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-win32-ia32-msvc@dab103f} + '@rolldown/binding-win32-ia32-msvc@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-win32-ia32-msvc@824315d': + resolution: {tarball: https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-win32-ia32-msvc@824315d} version: 0.13.2 os: [win32] - '@rolldown/binding-win32-x64-msvc@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-win32-x64-msvc@dab103f': - resolution: {tarball: https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-win32-x64-msvc@dab103f} + '@rolldown/binding-win32-x64-msvc@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-win32-x64-msvc@824315d': + resolution: {tarball: https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-win32-x64-msvc@824315d} version: 0.13.2 os: [win32] @@ -6396,8 +6396,8 @@ packages: resolution: {integrity: sha512-l0OE8wL34P4nJH/H2ffoaniAokM2qSmrtXHmlpvYr5AVVX8msAyW0l8NVJFDxlSK4u3Uh/f41cQheDVdnYijwQ==} hasBin: true - rolldown@https://pkg.pr.new/rolldown@dab103f: - resolution: {tarball: https://pkg.pr.new/rolldown@dab103f} + rolldown@https://pkg.pr.new/rolldown@824315d: + resolution: {tarball: https://pkg.pr.new/rolldown@824315d} version: 0.13.2 hasBin: true @@ -8753,42 +8753,42 @@ snapshots: '@polka/url@1.0.0-next.24': {} - '@rolldown/binding-darwin-arm64@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-darwin-arm64@dab103f': + '@rolldown/binding-darwin-arm64@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-darwin-arm64@824315d': optional: true - '@rolldown/binding-darwin-x64@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-darwin-x64@dab103f': + '@rolldown/binding-darwin-x64@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-darwin-x64@824315d': optional: true - '@rolldown/binding-freebsd-x64@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-freebsd-x64@dab103f': + '@rolldown/binding-freebsd-x64@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-freebsd-x64@824315d': optional: true - '@rolldown/binding-linux-arm-gnueabihf@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-linux-arm-gnueabihf@dab103f': + '@rolldown/binding-linux-arm-gnueabihf@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-linux-arm-gnueabihf@824315d': optional: true - '@rolldown/binding-linux-arm64-gnu@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-linux-arm64-gnu@dab103f': + '@rolldown/binding-linux-arm64-gnu@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-linux-arm64-gnu@824315d': optional: true - '@rolldown/binding-linux-arm64-musl@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-linux-arm64-musl@dab103f': + '@rolldown/binding-linux-arm64-musl@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-linux-arm64-musl@824315d': optional: true - '@rolldown/binding-linux-x64-gnu@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-linux-x64-gnu@dab103f': + '@rolldown/binding-linux-x64-gnu@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-linux-x64-gnu@824315d': optional: true - '@rolldown/binding-linux-x64-musl@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-linux-x64-musl@dab103f': + '@rolldown/binding-linux-x64-musl@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-linux-x64-musl@824315d': optional: true - '@rolldown/binding-wasm32-wasi@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-wasm32-wasi@dab103f': + '@rolldown/binding-wasm32-wasi@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-wasm32-wasi@824315d': dependencies: '@napi-rs/wasm-runtime': 0.2.4 optional: true - '@rolldown/binding-win32-arm64-msvc@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-win32-arm64-msvc@dab103f': + '@rolldown/binding-win32-arm64-msvc@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-win32-arm64-msvc@824315d': optional: true - '@rolldown/binding-win32-ia32-msvc@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-win32-ia32-msvc@dab103f': + '@rolldown/binding-win32-ia32-msvc@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-win32-ia32-msvc@824315d': optional: true - '@rolldown/binding-win32-x64-msvc@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-win32-x64-msvc@dab103f': + '@rolldown/binding-win32-x64-msvc@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-win32-x64-msvc@824315d': optional: true '@rollup/plugin-alias@5.1.0(rollup@3.29.4)': @@ -12370,22 +12370,22 @@ snapshots: dependencies: glob: 10.4.5 - rolldown@https://pkg.pr.new/rolldown@dab103f: + rolldown@https://pkg.pr.new/rolldown@824315d: dependencies: zod: 3.23.8 optionalDependencies: - '@rolldown/binding-darwin-arm64': https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-darwin-arm64@dab103f - '@rolldown/binding-darwin-x64': https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-darwin-x64@dab103f - '@rolldown/binding-freebsd-x64': https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-freebsd-x64@dab103f - '@rolldown/binding-linux-arm-gnueabihf': https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-linux-arm-gnueabihf@dab103f - '@rolldown/binding-linux-arm64-gnu': https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-linux-arm64-gnu@dab103f - '@rolldown/binding-linux-arm64-musl': https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-linux-arm64-musl@dab103f - '@rolldown/binding-linux-x64-gnu': https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-linux-x64-gnu@dab103f - '@rolldown/binding-linux-x64-musl': https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-linux-x64-musl@dab103f - '@rolldown/binding-wasm32-wasi': https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-wasm32-wasi@dab103f - '@rolldown/binding-win32-arm64-msvc': https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-win32-arm64-msvc@dab103f - '@rolldown/binding-win32-ia32-msvc': https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-win32-ia32-msvc@dab103f - '@rolldown/binding-win32-x64-msvc': https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-win32-x64-msvc@dab103f + '@rolldown/binding-darwin-arm64': https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-darwin-arm64@824315d + '@rolldown/binding-darwin-x64': https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-darwin-x64@824315d + '@rolldown/binding-freebsd-x64': https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-freebsd-x64@824315d + '@rolldown/binding-linux-arm-gnueabihf': https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-linux-arm-gnueabihf@824315d + '@rolldown/binding-linux-arm64-gnu': https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-linux-arm64-gnu@824315d + '@rolldown/binding-linux-arm64-musl': https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-linux-arm64-musl@824315d + '@rolldown/binding-linux-x64-gnu': https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-linux-x64-gnu@824315d + '@rolldown/binding-linux-x64-musl': https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-linux-x64-musl@824315d + '@rolldown/binding-wasm32-wasi': https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-wasm32-wasi@824315d + '@rolldown/binding-win32-arm64-msvc': https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-win32-arm64-msvc@824315d + '@rolldown/binding-win32-ia32-msvc': https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-win32-ia32-msvc@824315d + '@rolldown/binding-win32-x64-msvc': https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-win32-x64-msvc@824315d rollup-plugin-dts@6.1.1(rollup@3.29.4)(typescript@5.5.3): dependencies: From ab51ceead954d1fa67902fc921bc6afa4d430df7 Mon Sep 17 00:00:00 2001 From: sapphi-red <49056869+sapphi-red@users.noreply.github.com> Date: Tue, 24 Sep 2024 15:16:46 +0900 Subject: [PATCH 18/43] chore: skip data uri by load fallback plugin for native data uri handling --- .../vite/src/node/plugins/loadFallback.ts | 33 +++++++++++-------- 1 file changed, 20 insertions(+), 13 deletions(-) diff --git a/packages/vite/src/node/plugins/loadFallback.ts b/packages/vite/src/node/plugins/loadFallback.ts index f221ce56bdd2fb..6771d303d71ef1 100644 --- a/packages/vite/src/node/plugins/loadFallback.ts +++ b/packages/vite/src/node/plugins/loadFallback.ts @@ -1,24 +1,31 @@ import fsp from 'node:fs/promises' +import type { RolldownPlugin } from 'rolldown' import { cleanUrl } from '../../shared/utils' -import type { Plugin } from '../plugin' /** * A plugin to provide build load fallback for arbitrary request with queries. */ -export function buildLoadFallbackPlugin(): Plugin { +export function buildLoadFallbackPlugin(): RolldownPlugin { return { name: 'vite:load-fallback', - async load(id) { - try { - const cleanedId = cleanUrl(id) - const content = await fsp.readFile(cleanedId, 'utf-8') - this.addWatchFile(cleanedId) - return content - } catch { - const content = await fsp.readFile(id, 'utf-8') - this.addWatchFile(id) - return content - } + load: { + filter: { + id: { + exclude: [/^data:/], + }, + }, + async handler(id) { + try { + const cleanedId = cleanUrl(id) + const content = await fsp.readFile(cleanedId, 'utf-8') + this.addWatchFile(cleanedId) + return content + } catch { + const content = await fsp.readFile(id, 'utf-8') + this.addWatchFile(id) + return content + } + }, }, } } From 582d4ecdcfb20bc4d329e0e2c95c05a5f208a071 Mon Sep 17 00:00:00 2001 From: sapphi-red <49056869+sapphi-red@users.noreply.github.com> Date: Wed, 25 Sep 2024 15:57:33 +0900 Subject: [PATCH 19/43] chore: remove browser field edge case test --- playground/resolve/browser-field/relative.js | 6 ++---- playground/resolve/index.html | 5 ++--- 2 files changed, 4 insertions(+), 7 deletions(-) diff --git a/playground/resolve/browser-field/relative.js b/playground/resolve/browser-field/relative.js index 3be4d7452be75d..6b45c5758d37dd 100644 --- a/playground/resolve/browser-field/relative.js +++ b/playground/resolve/browser-field/relative.js @@ -4,8 +4,6 @@ import rb from './no-ext.js' // no substitution import rc from './ext' import rd from './ext.js' import re from './ext-index/index.js' -// import rf from './ext-index' -const rf = 'FIXME' -import rg from './no-ext-index/index.js' // no substitution +import rf from './no-ext-index/index.js' // no substitution -export { ra, rb, rc, rd, re, rf, rg } +export { ra, rb, rc, rd, re, rf } diff --git a/playground/resolve/index.html b/playground/resolve/index.html index 5badd9bf57bb6e..861d2a8e562ee8 100644 --- a/playground/resolve/index.html +++ b/playground/resolve/index.html @@ -322,11 +322,10 @@

resolve non normalized absolute path

rd, re, rf, - rg, } from '@vitejs/test-resolve-browser-field/relative' - const success = [main, a, c, d, e, f, h, i, ra, rc, rd, re, rf] - const noSuccess = [b, g, rb, rg] + const success = [main, a, c, d, e, f, h, i, ra, rc, rd, re] + const noSuccess = [b, g, rb, rf] if ( [...success, ...noSuccess].filter((text) => text.includes('[success]')) From cbee042deced1feff2634434bc68183caef78a6d Mon Sep 17 00:00:00 2001 From: sapphi-red <49056869+sapphi-red@users.noreply.github.com> Date: Fri, 27 Sep 2024 13:04:16 +0900 Subject: [PATCH 20/43] chore: bump rolldown --- packages/vite/package.json | 2 +- pnpm-lock.yaml | 106 ++++++++++++++++++------------------- 2 files changed, 54 insertions(+), 54 deletions(-) diff --git a/packages/vite/package.json b/packages/vite/package.json index b792a448f61dab..aa90d9240bf70e 100644 --- a/packages/vite/package.json +++ b/packages/vite/package.json @@ -87,7 +87,7 @@ "dependencies": { "esbuild": "^0.24.0", "postcss": "^8.4.47", - "rolldown": "https://pkg.pr.new/rolldown@824315d", + "rolldown": "https://pkg.pr.new/rolldown@4caa0a9", "rollup": "^4.22.5" }, "optionalDependencies": { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 9de8160d30c9f0..9ed1d3639fe817 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -234,8 +234,8 @@ importers: specifier: ^8.4.47 version: 8.4.47 rolldown: - specifier: https://pkg.pr.new/rolldown@824315d - version: https://pkg.pr.new/rolldown@824315d + specifier: https://pkg.pr.new/rolldown@4caa0a9 + version: https://pkg.pr.new/rolldown@4caa0a9 rollup: specifier: ^4.22.5 version: 4.22.5 @@ -3085,63 +3085,63 @@ packages: '@polka/url@1.0.0-next.24': resolution: {integrity: sha512-2LuNTFBIO0m7kKIQvvPHN6UE63VjpmL9rnEEaOOaiSPbZK+zUOYIzBAWcED+3XYzhYsd/0mD57VdxAEqqV52CQ==} - '@rolldown/binding-darwin-arm64@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-darwin-arm64@824315d': - resolution: {tarball: https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-darwin-arm64@824315d} + '@rolldown/binding-darwin-arm64@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-darwin-arm64@4caa0a9': + resolution: {tarball: https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-darwin-arm64@4caa0a9} version: 0.13.2 os: [darwin] - '@rolldown/binding-darwin-x64@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-darwin-x64@824315d': - resolution: {tarball: https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-darwin-x64@824315d} + '@rolldown/binding-darwin-x64@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-darwin-x64@4caa0a9': + resolution: {tarball: https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-darwin-x64@4caa0a9} version: 0.13.2 os: [darwin] - '@rolldown/binding-freebsd-x64@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-freebsd-x64@824315d': - resolution: {tarball: https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-freebsd-x64@824315d} + '@rolldown/binding-freebsd-x64@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-freebsd-x64@4caa0a9': + resolution: {tarball: https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-freebsd-x64@4caa0a9} version: 0.13.2 os: [freebsd] - '@rolldown/binding-linux-arm-gnueabihf@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-linux-arm-gnueabihf@824315d': - resolution: {tarball: https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-linux-arm-gnueabihf@824315d} + '@rolldown/binding-linux-arm-gnueabihf@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-linux-arm-gnueabihf@4caa0a9': + resolution: {tarball: https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-linux-arm-gnueabihf@4caa0a9} version: 0.13.2 os: [linux] - '@rolldown/binding-linux-arm64-gnu@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-linux-arm64-gnu@824315d': - resolution: {tarball: https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-linux-arm64-gnu@824315d} + '@rolldown/binding-linux-arm64-gnu@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-linux-arm64-gnu@4caa0a9': + resolution: {tarball: https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-linux-arm64-gnu@4caa0a9} version: 0.13.2 os: [linux] - '@rolldown/binding-linux-arm64-musl@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-linux-arm64-musl@824315d': - resolution: {tarball: https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-linux-arm64-musl@824315d} + '@rolldown/binding-linux-arm64-musl@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-linux-arm64-musl@4caa0a9': + resolution: {tarball: https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-linux-arm64-musl@4caa0a9} version: 0.13.2 os: [linux] - '@rolldown/binding-linux-x64-gnu@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-linux-x64-gnu@824315d': - resolution: {tarball: https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-linux-x64-gnu@824315d} + '@rolldown/binding-linux-x64-gnu@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-linux-x64-gnu@4caa0a9': + resolution: {tarball: https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-linux-x64-gnu@4caa0a9} version: 0.13.2 os: [linux] - '@rolldown/binding-linux-x64-musl@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-linux-x64-musl@824315d': - resolution: {tarball: https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-linux-x64-musl@824315d} + '@rolldown/binding-linux-x64-musl@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-linux-x64-musl@4caa0a9': + resolution: {tarball: https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-linux-x64-musl@4caa0a9} version: 0.13.2 os: [linux] - '@rolldown/binding-wasm32-wasi@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-wasm32-wasi@824315d': - resolution: {tarball: https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-wasm32-wasi@824315d} + '@rolldown/binding-wasm32-wasi@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-wasm32-wasi@4caa0a9': + resolution: {tarball: https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-wasm32-wasi@4caa0a9} version: 0.13.2 engines: {node: '>=14.21.3'} - '@rolldown/binding-win32-arm64-msvc@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-win32-arm64-msvc@824315d': - resolution: {tarball: https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-win32-arm64-msvc@824315d} + '@rolldown/binding-win32-arm64-msvc@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-win32-arm64-msvc@4caa0a9': + resolution: {tarball: https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-win32-arm64-msvc@4caa0a9} version: 0.13.2 os: [win32] - '@rolldown/binding-win32-ia32-msvc@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-win32-ia32-msvc@824315d': - resolution: {tarball: https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-win32-ia32-msvc@824315d} + '@rolldown/binding-win32-ia32-msvc@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-win32-ia32-msvc@4caa0a9': + resolution: {tarball: https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-win32-ia32-msvc@4caa0a9} version: 0.13.2 os: [win32] - '@rolldown/binding-win32-x64-msvc@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-win32-x64-msvc@824315d': - resolution: {tarball: https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-win32-x64-msvc@824315d} + '@rolldown/binding-win32-x64-msvc@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-win32-x64-msvc@4caa0a9': + resolution: {tarball: https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-win32-x64-msvc@4caa0a9} version: 0.13.2 os: [win32] @@ -6396,8 +6396,8 @@ packages: resolution: {integrity: sha512-l0OE8wL34P4nJH/H2ffoaniAokM2qSmrtXHmlpvYr5AVVX8msAyW0l8NVJFDxlSK4u3Uh/f41cQheDVdnYijwQ==} hasBin: true - rolldown@https://pkg.pr.new/rolldown@824315d: - resolution: {tarball: https://pkg.pr.new/rolldown@824315d} + rolldown@https://pkg.pr.new/rolldown@4caa0a9: + resolution: {tarball: https://pkg.pr.new/rolldown@4caa0a9} version: 0.13.2 hasBin: true @@ -8753,42 +8753,42 @@ snapshots: '@polka/url@1.0.0-next.24': {} - '@rolldown/binding-darwin-arm64@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-darwin-arm64@824315d': + '@rolldown/binding-darwin-arm64@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-darwin-arm64@4caa0a9': optional: true - '@rolldown/binding-darwin-x64@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-darwin-x64@824315d': + '@rolldown/binding-darwin-x64@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-darwin-x64@4caa0a9': optional: true - '@rolldown/binding-freebsd-x64@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-freebsd-x64@824315d': + '@rolldown/binding-freebsd-x64@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-freebsd-x64@4caa0a9': optional: true - '@rolldown/binding-linux-arm-gnueabihf@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-linux-arm-gnueabihf@824315d': + '@rolldown/binding-linux-arm-gnueabihf@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-linux-arm-gnueabihf@4caa0a9': optional: true - '@rolldown/binding-linux-arm64-gnu@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-linux-arm64-gnu@824315d': + '@rolldown/binding-linux-arm64-gnu@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-linux-arm64-gnu@4caa0a9': optional: true - '@rolldown/binding-linux-arm64-musl@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-linux-arm64-musl@824315d': + '@rolldown/binding-linux-arm64-musl@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-linux-arm64-musl@4caa0a9': optional: true - '@rolldown/binding-linux-x64-gnu@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-linux-x64-gnu@824315d': + '@rolldown/binding-linux-x64-gnu@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-linux-x64-gnu@4caa0a9': optional: true - '@rolldown/binding-linux-x64-musl@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-linux-x64-musl@824315d': + '@rolldown/binding-linux-x64-musl@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-linux-x64-musl@4caa0a9': optional: true - '@rolldown/binding-wasm32-wasi@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-wasm32-wasi@824315d': + '@rolldown/binding-wasm32-wasi@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-wasm32-wasi@4caa0a9': dependencies: '@napi-rs/wasm-runtime': 0.2.4 optional: true - '@rolldown/binding-win32-arm64-msvc@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-win32-arm64-msvc@824315d': + '@rolldown/binding-win32-arm64-msvc@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-win32-arm64-msvc@4caa0a9': optional: true - '@rolldown/binding-win32-ia32-msvc@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-win32-ia32-msvc@824315d': + '@rolldown/binding-win32-ia32-msvc@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-win32-ia32-msvc@4caa0a9': optional: true - '@rolldown/binding-win32-x64-msvc@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-win32-x64-msvc@824315d': + '@rolldown/binding-win32-x64-msvc@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-win32-x64-msvc@4caa0a9': optional: true '@rollup/plugin-alias@5.1.0(rollup@3.29.4)': @@ -12370,22 +12370,22 @@ snapshots: dependencies: glob: 10.4.5 - rolldown@https://pkg.pr.new/rolldown@824315d: + rolldown@https://pkg.pr.new/rolldown@4caa0a9: dependencies: zod: 3.23.8 optionalDependencies: - '@rolldown/binding-darwin-arm64': https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-darwin-arm64@824315d - '@rolldown/binding-darwin-x64': https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-darwin-x64@824315d - '@rolldown/binding-freebsd-x64': https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-freebsd-x64@824315d - '@rolldown/binding-linux-arm-gnueabihf': https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-linux-arm-gnueabihf@824315d - '@rolldown/binding-linux-arm64-gnu': https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-linux-arm64-gnu@824315d - '@rolldown/binding-linux-arm64-musl': https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-linux-arm64-musl@824315d - '@rolldown/binding-linux-x64-gnu': https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-linux-x64-gnu@824315d - '@rolldown/binding-linux-x64-musl': https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-linux-x64-musl@824315d - '@rolldown/binding-wasm32-wasi': https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-wasm32-wasi@824315d - '@rolldown/binding-win32-arm64-msvc': https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-win32-arm64-msvc@824315d - '@rolldown/binding-win32-ia32-msvc': https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-win32-ia32-msvc@824315d - '@rolldown/binding-win32-x64-msvc': https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-win32-x64-msvc@824315d + '@rolldown/binding-darwin-arm64': https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-darwin-arm64@4caa0a9 + '@rolldown/binding-darwin-x64': https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-darwin-x64@4caa0a9 + '@rolldown/binding-freebsd-x64': https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-freebsd-x64@4caa0a9 + '@rolldown/binding-linux-arm-gnueabihf': https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-linux-arm-gnueabihf@4caa0a9 + '@rolldown/binding-linux-arm64-gnu': https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-linux-arm64-gnu@4caa0a9 + '@rolldown/binding-linux-arm64-musl': https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-linux-arm64-musl@4caa0a9 + '@rolldown/binding-linux-x64-gnu': https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-linux-x64-gnu@4caa0a9 + '@rolldown/binding-linux-x64-musl': https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-linux-x64-musl@4caa0a9 + '@rolldown/binding-wasm32-wasi': https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-wasm32-wasi@4caa0a9 + '@rolldown/binding-win32-arm64-msvc': https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-win32-arm64-msvc@4caa0a9 + '@rolldown/binding-win32-ia32-msvc': https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-win32-ia32-msvc@4caa0a9 + '@rolldown/binding-win32-x64-msvc': https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-win32-x64-msvc@4caa0a9 rollup-plugin-dts@6.1.1(rollup@3.29.4)(typescript@5.5.3): dependencies: From a9d5f4c4461c92779fadbc6e95d7b9e4a8d8db32 Mon Sep 17 00:00:00 2001 From: sapphi-red <49056869+sapphi-red@users.noreply.github.com> Date: Fri, 27 Sep 2024 13:48:47 +0900 Subject: [PATCH 21/43] fix: define import.meta.env --- packages/vite/src/node/plugins/define.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/vite/src/node/plugins/define.ts b/packages/vite/src/node/plugins/define.ts index 25a8383e20ed8f..bb3c2b52b9c229 100644 --- a/packages/vite/src/node/plugins/define.ts +++ b/packages/vite/src/node/plugins/define.ts @@ -183,7 +183,8 @@ export function definePlugin(config: ResolvedConfig): RolldownPlugin { if (enableNativePlugin) { delete plugin.transform plugin.options = function (option) { - const [define, _pattern, _importMetaEnvVal] = getPattern(this.environment) + const [define, _pattern, importMetaEnvVal] = getPattern(this.environment) + define['import.meta.env'] = importMetaEnvVal option.define = define } } From a4034bd526d39c9bc7a2d9f277ed1f5c8410e808 Mon Sep 17 00:00:00 2001 From: sapphi-red <49056869+sapphi-red@users.noreply.github.com> Date: Tue, 1 Oct 2024 16:06:31 +0900 Subject: [PATCH 22/43] chore: use advancedChunks instead of manualChunks --- .../css-codesplit-consistent.spec.ts | 4 +- playground/css-codesplit/vite.config.js | 19 ++++++--- .../__tests__/js-sourcemap.spec.ts | 6 +-- playground/js-sourcemap/vite.config.js | 40 +++++++++++++------ vitest.config.e2e.ts | 2 - 5 files changed, 46 insertions(+), 25 deletions(-) diff --git a/playground/css-codesplit/__tests__/css-codesplit-consistent.spec.ts b/playground/css-codesplit/__tests__/css-codesplit-consistent.spec.ts index 4da121a652d0db..d06d87e9af8223 100644 --- a/playground/css-codesplit/__tests__/css-codesplit-consistent.spec.ts +++ b/playground/css-codesplit/__tests__/css-codesplit-consistent.spec.ts @@ -8,8 +8,8 @@ beforeEach(async () => { for (let i = 0; i < 5; i++) { describe.runIf(isBuild)('css-codesplit build', () => { test('should be consistent with same content', () => { - expect(findAssetFile(/style-.+\.css/)).toMatch('h2{color:#00f}') - expect(findAssetFile(/style2-.+\.css/)).toBe('') + expect(findAssetFile(/style2-.+\.css/)).toMatch('h2{color:#00f}') + expect(findAssetFile(/style-.+\.css/)).toBe('') }) }) } diff --git a/playground/css-codesplit/vite.config.js b/playground/css-codesplit/vite.config.js index 5042b6d9b9cab7..0d3d006e4dda7f 100644 --- a/playground/css-codesplit/vite.config.js +++ b/playground/css-codesplit/vite.config.js @@ -13,11 +13,20 @@ export default defineConfig({ 'shared-css-no-js': resolve(__dirname, 'shared-css-no-js.html'), }, output: { - manualChunks(id) { - // make `chunk.css` it's own chunk for easier testing of pure css chunks - if (id.includes('chunk.css')) { - return 'chunk' - } + // manualChunks(id) { + // // make `chunk.css` it's own chunk for easier testing of pure css chunks + // if (id.includes('chunk.css')) { + // return 'chunk' + // } + // }, + advancedChunks: { + groups: [ + // make `chunk.css` it's own chunk for easier testing of pure css chunks + { + name: 'chunk', + test: 'chunk.css', + }, + ], }, }, }, diff --git a/playground/js-sourcemap/__tests__/js-sourcemap.spec.ts b/playground/js-sourcemap/__tests__/js-sourcemap.spec.ts index 27a25a5445ec7f..55053e85837293 100644 --- a/playground/js-sourcemap/__tests__/js-sourcemap.spec.ts +++ b/playground/js-sourcemap/__tests__/js-sourcemap.spec.ts @@ -140,7 +140,7 @@ describe.runIf(isBuild)('build tests', () => { expect(formatSourcemapForSnapshot(JSON.parse(map))).toMatchInlineSnapshot(` { "ignoreList": [], - "mappings": ";+8BAAA,OAAO,2BAAuB,EAAC,wBAE/B,QAAQ,IAAI,uBAAuB", + "mappings": ";4jCAAA,OAAO,6BAAuB,wBAE9B,QAAQ,IAAI", "sources": [ "../../after-preload-dynamic.js", ], @@ -156,7 +156,7 @@ describe.runIf(isBuild)('build tests', () => { // verify sourcemap comment is preserved at the last line const js = findAssetFile(/after-preload-dynamic-[-\w]{8}\.js$/) expect(js).toMatch( - /\n\/\/# sourceMappingURL=after-preload-dynamic-[-\w]{8}\.js\.map\n$/, + /\n\/\/# sourceMappingURL=after-preload-dynamic-[-\w]{8}\.js\.map\n?$/, ) }) @@ -177,7 +177,7 @@ describe.runIf(isBuild)('build tests', () => { const map = findAssetFile(/with-define-object.*\.js\.map/) expect(formatSourcemapForSnapshot(JSON.parse(map))).toMatchInlineSnapshot(` { - "mappings": "qBAEA,SAASA,GAAO,CACJC,GACZ,CAEA,SAASA,GAAY,CAEX,QAAA,MAAM,qBAAsBC,CAAkB,CACxD,CAEAF,EAAK", + "mappings": "qBAEA,SAAS,GAAO,CACd,EAAA,CACF,CAEA,SAAS,GAAY,CAEnB,QAAQ,MAAM,qBAAsB,CAAA,CACtC,CAEA,EAAA", "sources": [ "../../with-define-object.ts", ], diff --git a/playground/js-sourcemap/vite.config.js b/playground/js-sourcemap/vite.config.js index f47c89eff07ebf..959c94adf060a4 100644 --- a/playground/js-sourcemap/vite.config.js +++ b/playground/js-sourcemap/vite.config.js @@ -11,19 +11,33 @@ export default defineConfig({ sourcemap: true, rollupOptions: { output: { - manualChunks(name) { - if (name.endsWith('after-preload-dynamic.js')) { - return 'after-preload-dynamic' - } - if (name.endsWith('after-preload-dynamic-hashbang.js')) { - return 'after-preload-dynamic-hashbang' - } - if (name.endsWith('after-preload-dynamic-no-dep.js')) { - return 'after-preload-dynamic-no-dep' - } - if (name.includes('with-define-object')) { - return 'with-define-object' - } + // manualChunks(name) { + // if (name.endsWith('after-preload-dynamic.js')) { + // return 'after-preload-dynamic' + // } + // if (name.endsWith('after-preload-dynamic-hashbang.js')) { + // return 'after-preload-dynamic-hashbang' + // } + // if (name.endsWith('after-preload-dynamic-no-dep.js')) { + // return 'after-preload-dynamic-no-dep' + // } + // if (name.includes('with-define-object')) { + // return 'with-define-object' + // } + // }, + advancedChunks: { + groups: [ + { name: 'after-preload-dynamic', test: 'after-preload-dynamic.js' }, + { + name: 'after-preload-dynamic-hashbang', + test: 'after-preload-dynamic-hashbang.js', + }, + { + name: 'after-preload-dynamic-no-dep', + test: 'after-preload-dynamic-no-dep.js', + }, + { name: 'with-define-object', test: 'with-define-object' }, + ], }, banner(chunk) { if (chunk.name.endsWith('after-preload-dynamic-hashbang')) { diff --git a/vitest.config.e2e.ts b/vitest.config.e2e.ts index 157565f6847514..20603ce18f5901 100644 --- a/vitest.config.e2e.ts +++ b/vitest.config.e2e.ts @@ -18,12 +18,10 @@ export default defineConfig({ ...(isBuild ? [ './playground/backend-integration/**/*.spec.[tj]s', // https://github.com/rolldown/rolldown/issues/2207 - './playground/css-codesplit/**/*.spec.[tj]s', // manualChunks './playground/css-dynamic-import/**/*.spec.[tj]s', // https://github.com/rolldown/rolldown/issues/1842 './playground/dynamic-import/**/*.spec.[tj]s', // https://github.com/rolldown/rolldown/issues/1842, https://github.com/rolldown/rolldown/issues/1843 './playground/external/**/*.spec.[tj]s', // https://github.com/rolldown/rolldown/issues/2041 './playground/glob-import/**/*.spec.[tj]s', // remove empty CSS generate chunk https://github.com/rolldown/rolldown/issues/1842 - './playground/js-sourcemap/**/*.spec.[tj]s', // manualChunks './playground/lib/**/*.spec.[tj]s', // umd format './playground/object-hooks/**/*.spec.[tj]s', // object hook sequential './playground/optimize-deps/**/*.spec.[tj]s', // https://github.com/rolldown/rolldown/issues/2031 From 2268aece4f0dca68ea46e4901444d3d3fed68ff7 Mon Sep 17 00:00:00 2001 From: sapphi-red <49056869+sapphi-red@users.noreply.github.com> Date: Tue, 1 Oct 2024 17:02:18 +0900 Subject: [PATCH 23/43] chore: bump rolldown and resolve all relative path with native plugin --- package.json | 2 +- packages/vite/package.json | 2 +- packages/vite/src/module-runner/runner.ts | 2 +- packages/vite/src/node/plugins/resolve.ts | 9 +- pnpm-lock.yaml | 514 ++++++++++------------ 5 files changed, 241 insertions(+), 288 deletions(-) diff --git a/package.json b/package.json index 2acf2870fbeeb6..591ac423d86798 100644 --- a/package.json +++ b/package.json @@ -74,7 +74,7 @@ "simple-git-hooks": "^2.11.1", "tslib": "^2.7.0", "tsx": "^4.19.1", - "typescript": "^5.5.3", + "typescript": "^5.6.2", "typescript-eslint": "^8.8.0", "vite": "workspace:*", "vitest": "^2.1.2" diff --git a/packages/vite/package.json b/packages/vite/package.json index aa90d9240bf70e..4ca389b37429ca 100644 --- a/packages/vite/package.json +++ b/packages/vite/package.json @@ -87,7 +87,7 @@ "dependencies": { "esbuild": "^0.24.0", "postcss": "^8.4.47", - "rolldown": "https://pkg.pr.new/rolldown@4caa0a9", + "rolldown": "https://pkg.pr.new/rolldown@9a0db67", "rollup": "^4.22.5" }, "optionalDependencies": { diff --git a/packages/vite/src/module-runner/runner.ts b/packages/vite/src/module-runner/runner.ts index 97e690ac9a07c2..2cf8098f21d51b 100644 --- a/packages/vite/src/module-runner/runner.ts +++ b/packages/vite/src/module-runner/runner.ts @@ -345,7 +345,7 @@ export class ModuleRunner { dirname: isWindows ? toWindowsPath(dirname) : dirname, url: href, env: this.envProxy, - resolve(_id, _parent) { + resolve(_id, _parent?) { throw new Error( '[module runner] "import.meta.resolve" is not supported.', ) diff --git a/packages/vite/src/node/plugins/resolve.ts b/packages/vite/src/node/plugins/resolve.ts index fe35371e6d55d1..c041c59e5880c9 100644 --- a/packages/vite/src/node/plugins/resolve.ts +++ b/packages/vite/src/node/plugins/resolve.ts @@ -192,14 +192,19 @@ export function filteredResolvePlugin( options(option) { option.resolve ??= {} option.resolve.extensions = this.environment.config.resolve.extensions + option.resolve.extensionAlias = { + '.js': ['.ts', '.tsx', '.js'], + '.jsx': ['.ts', '.tsx', '.jsx'], + '.mjs': ['.mts', '.mjs'], + '.cjs': ['.cts', '.cjs'], + } }, resolveId: { filter: { id: { exclude: [ // relative paths without query - // also exclude path ending with .[cm]?jsx? (for typescript moduleResolution=nodenext) - /^\.\.?[/\\](?!.*\.[cm]?jsx?$)[^?]+$/, + /^\.\.?[/\\][^?]+$/, /^(?:\0|\/?virtual:)/, ], }, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 9ed1d3639fe817..bbc5816ceceba6 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -81,7 +81,7 @@ importers: version: 9.12.0(jiti@1.21.0) eslint-plugin-import-x: specifier: ^4.3.1 - version: 4.3.1(eslint@9.12.0(jiti@1.21.0))(typescript@5.5.3) + version: 4.3.1(eslint@9.12.0(jiti@1.21.0))(typescript@5.6.2) eslint-plugin-n: specifier: ^17.10.3 version: 17.10.3(eslint@9.12.0(jiti@1.21.0)) @@ -128,11 +128,11 @@ importers: specifier: ^4.19.1 version: 4.19.1 typescript: - specifier: ^5.5.3 - version: 5.5.3 + specifier: ^5.6.2 + version: 5.6.2 typescript-eslint: specifier: ^8.8.0 - version: 8.8.0(eslint@9.12.0(jiti@1.21.0))(typescript@5.5.3) + version: 8.8.0(eslint@9.12.0(jiti@1.21.0))(typescript@5.6.2) vite: specifier: workspace:* version: link:packages/vite @@ -144,7 +144,7 @@ importers: devDependencies: '@shikijs/vitepress-twoslash': specifier: ^1.21.1 - version: 1.21.1(typescript@5.5.3) + version: 1.21.1(typescript@5.6.2) '@types/express': specifier: ^4.17.21 version: 4.17.21 @@ -153,13 +153,13 @@ importers: version: 4.2.2 vitepress: specifier: 1.3.4 - version: 1.3.4(@algolia/client-search@4.20.0)(@types/react@18.3.11)(axios@1.7.7)(postcss@8.4.47)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.5.3) + version: 1.3.4(@algolia/client-search@4.20.0)(@types/react@18.3.11)(axios@1.7.7)(postcss@8.4.47)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2) vitepress-plugin-group-icons: specifier: ^1.2.4 version: 1.2.4 vue: specifier: ^3.5.11 - version: 3.5.11(typescript@5.5.3) + version: 3.5.11(typescript@5.6.2) packages/create-vite: devDependencies: @@ -183,7 +183,7 @@ importers: version: 2.4.2 unbuild: specifier: ^2.0.0 - version: 2.0.0(sass@1.79.4)(typescript@5.5.3) + version: 2.0.0(sass@1.79.4)(typescript@5.6.2) packages/plugin-legacy: dependencies: @@ -220,7 +220,7 @@ importers: version: 1.1.0 unbuild: specifier: ^2.0.0 - version: 2.0.0(sass@1.79.4)(typescript@5.5.3) + version: 2.0.0(sass@1.79.4)(typescript@5.6.2) vite: specifier: workspace:* version: link:../vite @@ -234,8 +234,8 @@ importers: specifier: ^8.4.47 version: 8.4.47 rolldown: - specifier: https://pkg.pr.new/rolldown@4caa0a9 - version: https://pkg.pr.new/rolldown@4caa0a9 + specifier: https://pkg.pr.new/rolldown@9a0db67 + version: https://pkg.pr.new/rolldown@9a0db67 rollup: specifier: ^4.22.5 version: 4.22.5 @@ -375,7 +375,7 @@ importers: version: 16.1.0(postcss@8.4.47) postcss-load-config: specifier: ^4.0.2 - version: 4.0.2(postcss@8.4.47)(ts-node@10.9.2(@types/node@20.16.10)(typescript@5.5.3)) + version: 4.0.2(postcss@8.4.47)(ts-node@10.9.2(@types/node@20.16.10)(typescript@5.6.2)) postcss-modules: specifier: ^6.0.0 version: 6.0.0(postcss@8.4.47) @@ -384,7 +384,7 @@ importers: version: 2.0.2 rollup-plugin-dts: specifier: ^6.1.1 - version: 6.1.1(rollup@4.22.5)(typescript@5.5.3) + version: 6.1.1(rollup@4.22.5)(typescript@5.6.2) rollup-plugin-esbuild: specifier: ^6.1.1 version: 6.1.1(esbuild@0.24.0)(rollup@4.22.5) @@ -411,7 +411,7 @@ importers: version: 2.1.0 tsconfck: specifier: ^3.1.4 - version: 3.1.4(typescript@5.5.3) + version: 3.1.4(typescript@5.6.2) tslib: specifier: ^2.7.0 version: 2.7.0 @@ -499,7 +499,7 @@ importers: version: '@vitejs/test-aliased-module@file:playground/alias/dir/module' vue: specifier: ^3.5.11 - version: 3.5.11(typescript@5.5.3) + version: 3.5.11(typescript@5.6.2) devDependencies: '@vitejs/test-resolve-linked': specifier: workspace:* @@ -521,7 +521,7 @@ importers: version: 1.79.4 tailwindcss: specifier: ^3.4.13 - version: 3.4.13(ts-node@10.9.2(@types/node@20.16.10)(typescript@5.5.3)) + version: 3.4.13(ts-node@10.9.2(@types/node@20.16.10)(typescript@5.6.2)) playground/build-old: {} @@ -706,16 +706,16 @@ importers: dependencies: vue: specifier: ^3.5.11 - version: 3.5.11(typescript@5.5.3) + version: 3.5.11(typescript@5.6.2) playground/external: dependencies: '@vitejs/test-dep-that-imports': specifier: file:./dep-that-imports - version: file:playground/external/dep-that-imports(typescript@5.5.3) + version: file:playground/external/dep-that-imports(typescript@5.6.2) '@vitejs/test-dep-that-requires': specifier: file:./dep-that-requires - version: file:playground/external/dep-that-requires(typescript@5.5.3) + version: file:playground/external/dep-that-requires(typescript@5.6.2) devDependencies: slash3: specifier: npm:slash@^3.0.0 @@ -728,7 +728,7 @@ importers: version: link:../../packages/vite vue: specifier: ^3.5.11 - version: 3.5.11(typescript@5.5.3) + version: 3.5.11(typescript@5.6.2) vue32: specifier: npm:vue@~3.2.0 version: vue@3.2.0 @@ -743,7 +743,7 @@ importers: version: slash@5.1.0 vue: specifier: ^3.5.11 - version: 3.5.11(typescript@5.5.3) + version: 3.5.11(typescript@5.6.2) playground/external/dep-that-requires: dependencies: @@ -755,7 +755,7 @@ importers: version: slash@5.1.0 vue: specifier: ^3.5.11 - version: 3.5.11(typescript@5.5.3) + version: 3.5.11(typescript@5.6.2) playground/fs-serve: {} @@ -804,7 +804,7 @@ importers: version: 4.21.0 vue: specifier: ^3.5.11 - version: 3.5.11(typescript@5.5.3) + version: 3.5.11(typescript@5.6.2) playground/json/json-module: {} @@ -906,7 +906,7 @@ importers: dependencies: vue: specifier: ^3.5.11 - version: 3.5.11(typescript@5.5.3) + version: 3.5.11(typescript@5.6.2) playground/optimize-deps: dependencies: @@ -1026,10 +1026,10 @@ importers: version: 0.11.4 vue: specifier: ^3.5.11 - version: 3.5.11(typescript@5.5.3) + version: 3.5.11(typescript@5.6.2) vuex: specifier: ^4.1.0 - version: 4.1.0(vue@3.5.11(typescript@5.5.3)) + version: 4.1.0(vue@3.5.11(typescript@5.6.2)) playground/optimize-deps-no-discovery: dependencies: @@ -1038,10 +1038,10 @@ importers: version: file:playground/optimize-deps-no-discovery/dep-no-discovery vue: specifier: ^3.5.11 - version: 3.5.11(typescript@5.5.3) + version: 3.5.11(typescript@5.6.2) vuex: specifier: ^4.1.0 - version: 4.1.0(vue@3.5.11(typescript@5.5.3)) + version: 4.1.0(vue@3.5.11(typescript@5.6.2)) playground/optimize-deps-no-discovery/dep-no-discovery: {} @@ -1579,23 +1579,23 @@ importers: version: 10.4.20(postcss@8.4.47) tailwindcss: specifier: ^3.4.13 - version: 3.4.13(ts-node@10.9.2(@types/node@20.16.10)(typescript@5.5.3)) + version: 3.4.13(ts-node@10.9.2(@types/node@20.16.10)(typescript@5.6.2)) vue: specifier: ^3.5.11 - version: 3.5.11(typescript@5.5.3) + version: 3.5.11(typescript@5.6.2) vue-router: specifier: ^4.4.5 - version: 4.4.5(vue@3.5.11(typescript@5.5.3)) + version: 4.4.5(vue@3.5.11(typescript@5.6.2)) devDependencies: ts-node: specifier: ^10.9.2 - version: 10.9.2(@types/node@20.16.10)(typescript@5.5.3) + version: 10.9.2(@types/node@20.16.10)(typescript@5.6.2) playground/tailwind-sourcemap: dependencies: tailwindcss: specifier: ^3.4.13 - version: 3.4.13(ts-node@10.9.2(@types/node@20.16.10)(typescript@5.5.3)) + version: 3.4.13(ts-node@10.9.2(@types/node@20.16.10)(typescript@5.6.2)) playground/transform-plugin: {} @@ -3085,63 +3085,63 @@ packages: '@polka/url@1.0.0-next.24': resolution: {integrity: sha512-2LuNTFBIO0m7kKIQvvPHN6UE63VjpmL9rnEEaOOaiSPbZK+zUOYIzBAWcED+3XYzhYsd/0mD57VdxAEqqV52CQ==} - '@rolldown/binding-darwin-arm64@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-darwin-arm64@4caa0a9': - resolution: {tarball: https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-darwin-arm64@4caa0a9} + '@rolldown/binding-darwin-arm64@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-darwin-arm64@9a0db67': + resolution: {tarball: https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-darwin-arm64@9a0db67} version: 0.13.2 os: [darwin] - '@rolldown/binding-darwin-x64@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-darwin-x64@4caa0a9': - resolution: {tarball: https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-darwin-x64@4caa0a9} + '@rolldown/binding-darwin-x64@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-darwin-x64@9a0db67': + resolution: {tarball: https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-darwin-x64@9a0db67} version: 0.13.2 os: [darwin] - '@rolldown/binding-freebsd-x64@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-freebsd-x64@4caa0a9': - resolution: {tarball: https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-freebsd-x64@4caa0a9} + '@rolldown/binding-freebsd-x64@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-freebsd-x64@9a0db67': + resolution: {tarball: https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-freebsd-x64@9a0db67} version: 0.13.2 os: [freebsd] - '@rolldown/binding-linux-arm-gnueabihf@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-linux-arm-gnueabihf@4caa0a9': - resolution: {tarball: https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-linux-arm-gnueabihf@4caa0a9} + '@rolldown/binding-linux-arm-gnueabihf@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-linux-arm-gnueabihf@9a0db67': + resolution: {tarball: https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-linux-arm-gnueabihf@9a0db67} version: 0.13.2 os: [linux] - '@rolldown/binding-linux-arm64-gnu@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-linux-arm64-gnu@4caa0a9': - resolution: {tarball: https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-linux-arm64-gnu@4caa0a9} + '@rolldown/binding-linux-arm64-gnu@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-linux-arm64-gnu@9a0db67': + resolution: {tarball: https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-linux-arm64-gnu@9a0db67} version: 0.13.2 os: [linux] - '@rolldown/binding-linux-arm64-musl@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-linux-arm64-musl@4caa0a9': - resolution: {tarball: https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-linux-arm64-musl@4caa0a9} + '@rolldown/binding-linux-arm64-musl@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-linux-arm64-musl@9a0db67': + resolution: {tarball: https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-linux-arm64-musl@9a0db67} version: 0.13.2 os: [linux] - '@rolldown/binding-linux-x64-gnu@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-linux-x64-gnu@4caa0a9': - resolution: {tarball: https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-linux-x64-gnu@4caa0a9} + '@rolldown/binding-linux-x64-gnu@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-linux-x64-gnu@9a0db67': + resolution: {tarball: https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-linux-x64-gnu@9a0db67} version: 0.13.2 os: [linux] - '@rolldown/binding-linux-x64-musl@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-linux-x64-musl@4caa0a9': - resolution: {tarball: https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-linux-x64-musl@4caa0a9} + '@rolldown/binding-linux-x64-musl@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-linux-x64-musl@9a0db67': + resolution: {tarball: https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-linux-x64-musl@9a0db67} version: 0.13.2 os: [linux] - '@rolldown/binding-wasm32-wasi@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-wasm32-wasi@4caa0a9': - resolution: {tarball: https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-wasm32-wasi@4caa0a9} + '@rolldown/binding-wasm32-wasi@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-wasm32-wasi@9a0db67': + resolution: {tarball: https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-wasm32-wasi@9a0db67} version: 0.13.2 engines: {node: '>=14.21.3'} - '@rolldown/binding-win32-arm64-msvc@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-win32-arm64-msvc@4caa0a9': - resolution: {tarball: https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-win32-arm64-msvc@4caa0a9} + '@rolldown/binding-win32-arm64-msvc@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-win32-arm64-msvc@9a0db67': + resolution: {tarball: https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-win32-arm64-msvc@9a0db67} version: 0.13.2 os: [win32] - '@rolldown/binding-win32-ia32-msvc@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-win32-ia32-msvc@4caa0a9': - resolution: {tarball: https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-win32-ia32-msvc@4caa0a9} + '@rolldown/binding-win32-ia32-msvc@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-win32-ia32-msvc@9a0db67': + resolution: {tarball: https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-win32-ia32-msvc@9a0db67} version: 0.13.2 os: [win32] - '@rolldown/binding-win32-x64-msvc@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-win32-x64-msvc@4caa0a9': - resolution: {tarball: https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-win32-x64-msvc@4caa0a9} + '@rolldown/binding-win32-x64-msvc@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-win32-x64-msvc@9a0db67': + resolution: {tarball: https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-win32-x64-msvc@9a0db67} version: 0.13.2 os: [win32] @@ -3333,21 +3333,33 @@ packages: '@shikijs/core@1.21.1': resolution: {integrity: sha512-scBQo4V4O4WZLEDg11e75UPmXoCMq4Ya2A16U6efi/aTiR4o7T/GMNWZs2rq1U8dEvFKGxJZxiUy+tXgmr/4vw==} + '@shikijs/core@1.22.0': + resolution: {integrity: sha512-S8sMe4q71TJAW+qG93s5VaiihujRK6rqDFqBnxqvga/3LvqHEnxqBIOPkt//IdXVtHkQWKu4nOQNk0uBGicU7Q==} + '@shikijs/engine-javascript@1.21.1': resolution: {integrity: sha512-29EG4KYKlAona8yikEx8uoKbK7N2YoXUO26LS1GOIxpMMIAlQS9UFONg95lkGmIfp1rRcvCvSpYYIJ/blsQxvg==} + '@shikijs/engine-javascript@1.22.0': + resolution: {integrity: sha512-AeEtF4Gcck2dwBqCFUKYfsCq0s+eEbCEbkUuFou53NZ0sTGnJnJ/05KHQFZxpii5HMXbocV9URYVowOP2wH5kw==} + '@shikijs/engine-oniguruma@1.21.1': resolution: {integrity: sha512-PvfEtXCDbQZc9ud0SC0bPiuMbul44Cv0Ky2go4SsvVkYAAKYJsMe/Hx7nxThW8yS0r+w8USa0WfOtQKsD9DU9A==} + '@shikijs/engine-oniguruma@1.22.0': + resolution: {integrity: sha512-5iBVjhu/DYs1HB0BKsRRFipRrD7rqjxlWTj4F2Pf+nQSPqc3kcyqFFeZXnBMzDf0HdqaFVvhDRAGiYNvyLP+Mw==} + '@shikijs/transformers@1.14.1': resolution: {integrity: sha512-JJqL8QBVCJh3L61jqqEXgFq1cTycwjcGj7aSmqOEsbxnETM9hRlaB74QuXvY/fVJNjbNt8nvWo0VwAXKvMSLRg==} - '@shikijs/twoslash@1.21.1': - resolution: {integrity: sha512-pgjphKzovOoLOi12ZmzSCjyvJhMhNl2ff9MYHF5EyXVsBrRIbNvAH/aZ658OTTB4EjpdRGPiT1wdKI1qICHmBw==} + '@shikijs/twoslash@1.22.0': + resolution: {integrity: sha512-r5F/x4GTh18XzhAREehgT9lCDFZlISBSIsOFZQQaqjiOLG81PIqJN1I1D6XY58UN9OJt+3mffuKq19K4FOJKJA==} '@shikijs/types@1.21.1': resolution: {integrity: sha512-yLuTJTCHmYznerJ0nxF+f2rBKHQf2FMAd08QL/3du2xNBy/7yQ8CjuKN4Zc+Pk0vfIFzdBoxdzvEXE4JtXoR4Q==} + '@shikijs/types@1.22.0': + resolution: {integrity: sha512-Fw/Nr7FGFhlQqHfxzZY8Cwtwk5E9nKDUgeLjZgt3UuhcM3yJR9xj3ZGNravZZok8XmEZMiYkSMTPlPkULB8nww==} + '@shikijs/vitepress-twoslash@1.21.1': resolution: {integrity: sha512-ALyias4OZgcUwNvmi+/huT7S4caDDUbeA4sCye9q2MG/Fy8vS1yEfWbtce1Akb1SgnYRA0OsXR3K3jZlVwVMBQ==} @@ -3544,10 +3556,6 @@ packages: typescript: optional: true - '@typescript-eslint/scope-manager@8.7.0': - resolution: {integrity: sha512-87rC0k3ZlDOuz82zzXRtQ7Akv3GKhHs0ti4YcbAJtaomllXoSO8hi7Ix3ccEvCd824dy9aIX+j3d2UMAfCtVpg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/scope-manager@8.8.0': resolution: {integrity: sha512-EL8eaGC6gx3jDd8GwEFEV091210U97J0jeEHrAYvIYosmEGet4wJ+g0SYmLu+oRiAwbSA5AVrt6DxLHfdd+bUg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -3561,23 +3569,10 @@ packages: typescript: optional: true - '@typescript-eslint/types@8.7.0': - resolution: {integrity: sha512-LLt4BLHFwSfASHSF2K29SZ+ZCsbQOM+LuarPjRUuHm+Qd09hSe3GCeaQbcCr+Mik+0QFRmep/FyZBO6fJ64U3w==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/types@8.8.0': resolution: {integrity: sha512-QJwc50hRCgBd/k12sTykOJbESe1RrzmX6COk8Y525C9l7oweZ+1lw9JiU56im7Amm8swlz00DRIlxMYLizr2Vw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/typescript-estree@8.7.0': - resolution: {integrity: sha512-MC8nmcGHsmfAKxwnluTQpNqceniT8SteVwd2voYlmiSWGOtjvGXdPl17dYu2797GVscK30Z04WRM28CrKS9WOg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - '@typescript-eslint/typescript-estree@8.8.0': resolution: {integrity: sha512-ZaMJwc/0ckLz5DaAZ+pNLmHv8AMVGtfWxZe/x2JVEkD5LnmhWiQMMcYT7IY7gkdJuzJ9P14fRy28lUrlDSWYdw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -3587,22 +3582,12 @@ packages: typescript: optional: true - '@typescript-eslint/utils@8.7.0': - resolution: {integrity: sha512-ZbdUdwsl2X/s3CiyAu3gOlfQzpbuG3nTWKPoIvAu1pu5r8viiJvv2NPN2AqArL35NCYtw/lrPPfM4gxrMLNLPw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - eslint: ^8.57.0 || ^9.0.0 - '@typescript-eslint/utils@8.8.0': resolution: {integrity: sha512-QE2MgfOTem00qrlPgyByaCHay9yb1+9BjnMFnSFkUKQfu7adBXDTnCAivURnuPPAG/qiB+kzKkZKmKfaMT0zVg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 - '@typescript-eslint/visitor-keys@8.7.0': - resolution: {integrity: sha512-b1tx0orFCCh/THWPQa2ZwWzvOeyzzp36vkJYOpVg0u8UVOIsfVrnuC9FqAw9gRKn+rG2VmWQ/zDJZzkxUnj/XQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/visitor-keys@8.8.0': resolution: {integrity: sha512-8mq51Lx6Hpmd7HnA2fcHQo3YgfX1qbccxQOgZcb4tvasu//zXRaA1j5ZRFeCw/VRAdFi4mRM9DnZw0Nu0Q2d1g==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -3910,18 +3895,12 @@ packages: '@vue/compiler-core@3.2.0': resolution: {integrity: sha512-+kfA4pisto26tcEh9Naf/qrizplYWnkBLHu3fX5Yu0c47RVBteVG3dHENFczl3Egwra+5NP5f3YuOgxK1ZMbNQ==} - '@vue/compiler-core@3.5.10': - resolution: {integrity: sha512-iXWlk+Cg/ag7gLvY0SfVucU8Kh2CjysYZjhhP70w9qI4MvSox4frrP+vDGvtQuzIcgD8+sxM6lZvCtdxGunTAA==} - '@vue/compiler-core@3.5.11': resolution: {integrity: sha512-PwAdxs7/9Hc3ieBO12tXzmTD+Ln4qhT/56S+8DvrrZ4kLDn4Z/AMUr8tXJD0axiJBS0RKIoNaR0yMuQB9v9Udg==} '@vue/compiler-dom@3.2.0': resolution: {integrity: sha512-CqfATmX04+58LNBTTUPRBLyYGLP0bxtL+8b7B8pEvXja7fpmxiYcKBQsdaXfyqoRJsaTzA7eVXQt/t0dYhu/SQ==} - '@vue/compiler-dom@3.5.10': - resolution: {integrity: sha512-DyxHC6qPcktwYGKOIy3XqnHRrrXyWR2u91AjP+nLkADko380srsC2DC3s7Y1Rk6YfOlxOlvEQKa9XXmLI+W4ZA==} - '@vue/compiler-dom@3.5.11': resolution: {integrity: sha512-pyGf8zdbDDRkBrEzf8p7BQlMKNNF5Fk/Cf/fQ6PiUz9at4OaUfyXW0dGJTo2Vl1f5U9jSLCNf0EZJEogLXoeew==} @@ -3986,9 +3965,6 @@ packages: '@vue/shared@3.4.38': resolution: {integrity: sha512-q0xCiLkuWWQLzVrecPb0RMsNWyxICOjPrcrwxTUEHb1fsnvni4dcuyG7RT/Ie7VPTvnjzIaWzRMUBsrqNj/hhw==} - '@vue/shared@3.5.10': - resolution: {integrity: sha512-VkkBhU97Ki+XJ0xvl4C9YJsIZ2uIlQ7HqPpZOS3m9VCvmROPaChZU6DexdMJqvz9tbgG+4EtFVrSuailUq5KGQ==} - '@vue/shared@3.5.11': resolution: {integrity: sha512-W8GgysJVnFo81FthhzurdRAWP/byq3q2qIw70e0JWblzVhjgOMiC2GyovXrZTFQJnFVryYaKGP3Tc9vYzYm6PQ==} @@ -6396,8 +6372,8 @@ packages: resolution: {integrity: sha512-l0OE8wL34P4nJH/H2ffoaniAokM2qSmrtXHmlpvYr5AVVX8msAyW0l8NVJFDxlSK4u3Uh/f41cQheDVdnYijwQ==} hasBin: true - rolldown@https://pkg.pr.new/rolldown@4caa0a9: - resolution: {tarball: https://pkg.pr.new/rolldown@4caa0a9} + rolldown@https://pkg.pr.new/rolldown@9a0db67: + resolution: {tarball: https://pkg.pr.new/rolldown@9a0db67} version: 0.13.2 hasBin: true @@ -7015,8 +6991,8 @@ packages: typescript: optional: true - typescript@5.5.3: - resolution: {integrity: sha512-/hreyEujaB0w76zKo6717l3L0o/qEUtRgdvUBvlkhoWeOVMjMuHNHk0BRBzikzuGDqNmPQbg5ifMEqsHLiIUcQ==} + typescript@5.6.2: + resolution: {integrity: sha512-NW8ByodCSNCwZeghjN3o+JX5OFH0Ojg6sadjEKY4huZ52TqbJTJnDo5+Tw98lSy63NZvi4n+ez5m2u5d4PkZyw==} engines: {node: '>=14.17'} hasBin: true @@ -8753,42 +8729,42 @@ snapshots: '@polka/url@1.0.0-next.24': {} - '@rolldown/binding-darwin-arm64@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-darwin-arm64@4caa0a9': + '@rolldown/binding-darwin-arm64@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-darwin-arm64@9a0db67': optional: true - '@rolldown/binding-darwin-x64@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-darwin-x64@4caa0a9': + '@rolldown/binding-darwin-x64@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-darwin-x64@9a0db67': optional: true - '@rolldown/binding-freebsd-x64@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-freebsd-x64@4caa0a9': + '@rolldown/binding-freebsd-x64@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-freebsd-x64@9a0db67': optional: true - '@rolldown/binding-linux-arm-gnueabihf@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-linux-arm-gnueabihf@4caa0a9': + '@rolldown/binding-linux-arm-gnueabihf@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-linux-arm-gnueabihf@9a0db67': optional: true - '@rolldown/binding-linux-arm64-gnu@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-linux-arm64-gnu@4caa0a9': + '@rolldown/binding-linux-arm64-gnu@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-linux-arm64-gnu@9a0db67': optional: true - '@rolldown/binding-linux-arm64-musl@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-linux-arm64-musl@4caa0a9': + '@rolldown/binding-linux-arm64-musl@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-linux-arm64-musl@9a0db67': optional: true - '@rolldown/binding-linux-x64-gnu@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-linux-x64-gnu@4caa0a9': + '@rolldown/binding-linux-x64-gnu@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-linux-x64-gnu@9a0db67': optional: true - '@rolldown/binding-linux-x64-musl@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-linux-x64-musl@4caa0a9': + '@rolldown/binding-linux-x64-musl@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-linux-x64-musl@9a0db67': optional: true - '@rolldown/binding-wasm32-wasi@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-wasm32-wasi@4caa0a9': + '@rolldown/binding-wasm32-wasi@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-wasm32-wasi@9a0db67': dependencies: '@napi-rs/wasm-runtime': 0.2.4 optional: true - '@rolldown/binding-win32-arm64-msvc@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-win32-arm64-msvc@4caa0a9': + '@rolldown/binding-win32-arm64-msvc@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-win32-arm64-msvc@9a0db67': optional: true - '@rolldown/binding-win32-ia32-msvc@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-win32-ia32-msvc@4caa0a9': + '@rolldown/binding-win32-ia32-msvc@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-win32-ia32-msvc@9a0db67': optional: true - '@rolldown/binding-win32-x64-msvc@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-win32-x64-msvc@4caa0a9': + '@rolldown/binding-win32-x64-msvc@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-win32-x64-msvc@9a0db67': optional: true '@rollup/plugin-alias@5.1.0(rollup@3.29.4)': @@ -8961,26 +8937,46 @@ snapshots: '@types/hast': 3.0.4 hast-util-to-html: 9.0.3 + '@shikijs/core@1.22.0': + dependencies: + '@shikijs/engine-javascript': 1.22.0 + '@shikijs/engine-oniguruma': 1.22.0 + '@shikijs/types': 1.22.0 + '@shikijs/vscode-textmate': 9.3.0 + '@types/hast': 3.0.4 + hast-util-to-html: 9.0.3 + '@shikijs/engine-javascript@1.21.1': dependencies: '@shikijs/types': 1.21.1 '@shikijs/vscode-textmate': 9.3.0 oniguruma-to-js: 0.4.3 + '@shikijs/engine-javascript@1.22.0': + dependencies: + '@shikijs/types': 1.22.0 + '@shikijs/vscode-textmate': 9.3.0 + oniguruma-to-js: 0.4.3 + '@shikijs/engine-oniguruma@1.21.1': dependencies: '@shikijs/types': 1.21.1 '@shikijs/vscode-textmate': 9.3.0 + '@shikijs/engine-oniguruma@1.22.0': + dependencies: + '@shikijs/types': 1.22.0 + '@shikijs/vscode-textmate': 9.3.0 + '@shikijs/transformers@1.14.1': dependencies: shiki: 1.14.1 - '@shikijs/twoslash@1.21.1(typescript@5.5.3)': + '@shikijs/twoslash@1.22.0(typescript@5.6.2)': dependencies: - '@shikijs/core': 1.21.1 - '@shikijs/types': 1.21.1 - twoslash: 0.2.12(typescript@5.5.3) + '@shikijs/core': 1.22.0 + '@shikijs/types': 1.22.0 + twoslash: 0.2.12(typescript@5.6.2) transitivePeerDependencies: - supports-color - typescript @@ -8990,17 +8986,22 @@ snapshots: '@shikijs/vscode-textmate': 9.3.0 '@types/hast': 3.0.4 - '@shikijs/vitepress-twoslash@1.21.1(typescript@5.5.3)': + '@shikijs/types@1.22.0': dependencies: - '@shikijs/twoslash': 1.21.1(typescript@5.5.3) - floating-vue: 5.2.2(vue@3.5.11(typescript@5.5.3)) + '@shikijs/vscode-textmate': 9.3.0 + '@types/hast': 3.0.4 + + '@shikijs/vitepress-twoslash@1.21.1(typescript@5.6.2)': + dependencies: + '@shikijs/twoslash': 1.22.0(typescript@5.6.2) + floating-vue: 5.2.2(vue@3.5.11(typescript@5.6.2)) mdast-util-from-markdown: 2.0.1 mdast-util-gfm: 3.0.0 mdast-util-to-hast: 13.2.0 shiki: 1.21.1 - twoslash: 0.2.12(typescript@5.5.3) - twoslash-vue: 0.2.12(typescript@5.5.3) - vue: 3.5.11(typescript@5.5.3) + twoslash: 0.2.12(typescript@5.6.2) + twoslash-vue: 0.2.12(typescript@5.6.2) + vue: 3.5.11(typescript@5.6.2) transitivePeerDependencies: - '@nuxt/kit' - supports-color @@ -9189,79 +9190,57 @@ snapshots: dependencies: '@types/node': 20.16.10 - '@typescript-eslint/eslint-plugin@8.8.0(@typescript-eslint/parser@8.8.0(eslint@9.12.0(jiti@1.21.0))(typescript@5.5.3))(eslint@9.12.0(jiti@1.21.0))(typescript@5.5.3)': + '@typescript-eslint/eslint-plugin@8.8.0(@typescript-eslint/parser@8.8.0(eslint@9.12.0(jiti@1.21.0))(typescript@5.6.2))(eslint@9.12.0(jiti@1.21.0))(typescript@5.6.2)': dependencies: '@eslint-community/regexpp': 4.11.0 - '@typescript-eslint/parser': 8.8.0(eslint@9.12.0(jiti@1.21.0))(typescript@5.5.3) + '@typescript-eslint/parser': 8.8.0(eslint@9.12.0(jiti@1.21.0))(typescript@5.6.2) '@typescript-eslint/scope-manager': 8.8.0 - '@typescript-eslint/type-utils': 8.8.0(eslint@9.12.0(jiti@1.21.0))(typescript@5.5.3) - '@typescript-eslint/utils': 8.8.0(eslint@9.12.0(jiti@1.21.0))(typescript@5.5.3) + '@typescript-eslint/type-utils': 8.8.0(eslint@9.12.0(jiti@1.21.0))(typescript@5.6.2) + '@typescript-eslint/utils': 8.8.0(eslint@9.12.0(jiti@1.21.0))(typescript@5.6.2) '@typescript-eslint/visitor-keys': 8.8.0 eslint: 9.12.0(jiti@1.21.0) graphemer: 1.4.0 ignore: 5.3.1 natural-compare: 1.4.0 - ts-api-utils: 1.3.0(typescript@5.5.3) + ts-api-utils: 1.3.0(typescript@5.6.2) optionalDependencies: - typescript: 5.5.3 + typescript: 5.6.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.8.0(eslint@9.12.0(jiti@1.21.0))(typescript@5.5.3)': + '@typescript-eslint/parser@8.8.0(eslint@9.12.0(jiti@1.21.0))(typescript@5.6.2)': dependencies: '@typescript-eslint/scope-manager': 8.8.0 '@typescript-eslint/types': 8.8.0 - '@typescript-eslint/typescript-estree': 8.8.0(typescript@5.5.3) + '@typescript-eslint/typescript-estree': 8.8.0(typescript@5.6.2) '@typescript-eslint/visitor-keys': 8.8.0 debug: 4.3.7 eslint: 9.12.0(jiti@1.21.0) optionalDependencies: - typescript: 5.5.3 + typescript: 5.6.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@8.7.0': - dependencies: - '@typescript-eslint/types': 8.7.0 - '@typescript-eslint/visitor-keys': 8.7.0 - '@typescript-eslint/scope-manager@8.8.0': dependencies: '@typescript-eslint/types': 8.8.0 '@typescript-eslint/visitor-keys': 8.8.0 - '@typescript-eslint/type-utils@8.8.0(eslint@9.12.0(jiti@1.21.0))(typescript@5.5.3)': + '@typescript-eslint/type-utils@8.8.0(eslint@9.12.0(jiti@1.21.0))(typescript@5.6.2)': dependencies: - '@typescript-eslint/typescript-estree': 8.8.0(typescript@5.5.3) - '@typescript-eslint/utils': 8.8.0(eslint@9.12.0(jiti@1.21.0))(typescript@5.5.3) + '@typescript-eslint/typescript-estree': 8.8.0(typescript@5.6.2) + '@typescript-eslint/utils': 8.8.0(eslint@9.12.0(jiti@1.21.0))(typescript@5.6.2) debug: 4.3.7 - ts-api-utils: 1.3.0(typescript@5.5.3) + ts-api-utils: 1.3.0(typescript@5.6.2) optionalDependencies: - typescript: 5.5.3 + typescript: 5.6.2 transitivePeerDependencies: - eslint - supports-color - '@typescript-eslint/types@8.7.0': {} - '@typescript-eslint/types@8.8.0': {} - '@typescript-eslint/typescript-estree@8.7.0(typescript@5.5.3)': - dependencies: - '@typescript-eslint/types': 8.7.0 - '@typescript-eslint/visitor-keys': 8.7.0 - debug: 4.3.7 - fast-glob: 3.3.2 - is-glob: 4.0.3 - minimatch: 9.0.5 - semver: 7.6.3 - ts-api-utils: 1.3.0(typescript@5.5.3) - optionalDependencies: - typescript: 5.5.3 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/typescript-estree@8.8.0(typescript@5.5.3)': + '@typescript-eslint/typescript-estree@8.8.0(typescript@5.6.2)': dependencies: '@typescript-eslint/types': 8.8.0 '@typescript-eslint/visitor-keys': 8.8.0 @@ -9270,48 +9249,32 @@ snapshots: is-glob: 4.0.3 minimatch: 9.0.5 semver: 7.6.3 - ts-api-utils: 1.3.0(typescript@5.5.3) + ts-api-utils: 1.3.0(typescript@5.6.2) optionalDependencies: - typescript: 5.5.3 + typescript: 5.6.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.7.0(eslint@9.12.0(jiti@1.21.0))(typescript@5.5.3)': - dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@9.12.0(jiti@1.21.0)) - '@typescript-eslint/scope-manager': 8.7.0 - '@typescript-eslint/types': 8.7.0 - '@typescript-eslint/typescript-estree': 8.7.0(typescript@5.5.3) - eslint: 9.12.0(jiti@1.21.0) - transitivePeerDependencies: - - supports-color - - typescript - - '@typescript-eslint/utils@8.8.0(eslint@9.12.0(jiti@1.21.0))(typescript@5.5.3)': + '@typescript-eslint/utils@8.8.0(eslint@9.12.0(jiti@1.21.0))(typescript@5.6.2)': dependencies: '@eslint-community/eslint-utils': 4.4.0(eslint@9.12.0(jiti@1.21.0)) '@typescript-eslint/scope-manager': 8.8.0 '@typescript-eslint/types': 8.8.0 - '@typescript-eslint/typescript-estree': 8.8.0(typescript@5.5.3) + '@typescript-eslint/typescript-estree': 8.8.0(typescript@5.6.2) eslint: 9.12.0(jiti@1.21.0) transitivePeerDependencies: - supports-color - typescript - '@typescript-eslint/visitor-keys@8.7.0': - dependencies: - '@typescript-eslint/types': 8.7.0 - eslint-visitor-keys: 3.4.3 - '@typescript-eslint/visitor-keys@8.8.0': dependencies: '@typescript-eslint/types': 8.8.0 eslint-visitor-keys: 3.4.3 - '@typescript/vfs@1.6.0(typescript@5.5.3)': + '@typescript/vfs@1.6.0(typescript@5.6.2)': dependencies: debug: 4.3.7 - typescript: 5.5.3 + typescript: 5.6.2 transitivePeerDependencies: - supports-color @@ -9319,10 +9282,10 @@ snapshots: '@vitejs/longfilename-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa@file:playground/optimize-deps/longfilename': {} - '@vitejs/plugin-vue@5.1.2(vite@packages+vite)(vue@3.5.11(typescript@5.5.3))': + '@vitejs/plugin-vue@5.1.2(vite@packages+vite)(vue@3.5.11(typescript@5.6.2))': dependencies: vite: link:packages/vite - vue: 3.5.11(typescript@5.5.3) + vue: 3.5.11(typescript@5.6.2) '@vitejs/release-scripts@1.3.2': dependencies: @@ -9405,19 +9368,19 @@ snapshots: '@vitejs/test-dep-self-reference-url-worker@file:playground/worker/dep-self-reference-url-worker': {} - '@vitejs/test-dep-that-imports@file:playground/external/dep-that-imports(typescript@5.5.3)': + '@vitejs/test-dep-that-imports@file:playground/external/dep-that-imports(typescript@5.6.2)': dependencies: slash3: slash@3.0.0 slash5: slash@5.1.0 - vue: 3.5.11(typescript@5.5.3) + vue: 3.5.11(typescript@5.6.2) transitivePeerDependencies: - typescript - '@vitejs/test-dep-that-requires@file:playground/external/dep-that-requires(typescript@5.5.3)': + '@vitejs/test-dep-that-requires@file:playground/external/dep-that-requires(typescript@5.6.2)': dependencies: slash3: slash@3.0.0 slash5: slash@5.1.0 - vue: 3.5.11(typescript@5.5.3) + vue: 3.5.11(typescript@5.6.2) transitivePeerDependencies: - typescript @@ -9577,14 +9540,6 @@ snapshots: estree-walker: 2.0.2 source-map: 0.6.1 - '@vue/compiler-core@3.5.10': - dependencies: - '@babel/parser': 7.25.7 - '@vue/shared': 3.5.10 - entities: 4.5.0 - estree-walker: 2.0.2 - source-map-js: 1.2.1 - '@vue/compiler-core@3.5.11': dependencies: '@babel/parser': 7.25.7 @@ -9598,11 +9553,6 @@ snapshots: '@vue/compiler-core': 3.2.0 '@vue/shared': 3.2.0 - '@vue/compiler-dom@3.5.10': - dependencies: - '@vue/compiler-core': 3.5.10 - '@vue/shared': 3.5.10 - '@vue/compiler-dom@3.5.11': dependencies: '@vue/compiler-core': 3.5.11 @@ -9652,10 +9602,10 @@ snapshots: dependencies: rfdc: 1.4.1 - '@vue/language-core@2.1.6(typescript@5.5.3)': + '@vue/language-core@2.1.6(typescript@5.6.2)': dependencies: '@volar/language-core': 2.4.1 - '@vue/compiler-dom': 3.5.10 + '@vue/compiler-dom': 3.5.11 '@vue/compiler-vue2': 2.7.16 '@vue/shared': 3.5.11 computeds: 0.0.1 @@ -9663,7 +9613,7 @@ snapshots: muggle-string: 0.4.1 path-browserify: 1.0.1 optionalDependencies: - typescript: 5.5.3 + typescript: 5.6.2 '@vue/reactivity@3.2.0': dependencies: @@ -9696,35 +9646,33 @@ snapshots: '@vue/shared': 3.5.11 csstype: 3.1.3 - '@vue/server-renderer@3.5.11(vue@3.5.11(typescript@5.5.3))': + '@vue/server-renderer@3.5.11(vue@3.5.11(typescript@5.6.2))': dependencies: '@vue/compiler-ssr': 3.5.11 '@vue/shared': 3.5.11 - vue: 3.5.11(typescript@5.5.3) + vue: 3.5.11(typescript@5.6.2) '@vue/shared@3.2.0': {} '@vue/shared@3.4.38': {} - '@vue/shared@3.5.10': {} - '@vue/shared@3.5.11': {} - '@vueuse/core@11.0.0(vue@3.5.11(typescript@5.5.3))': + '@vueuse/core@11.0.0(vue@3.5.11(typescript@5.6.2))': dependencies: '@types/web-bluetooth': 0.0.20 '@vueuse/metadata': 11.0.0 - '@vueuse/shared': 11.0.0(vue@3.5.11(typescript@5.5.3)) - vue-demi: 0.14.10(vue@3.5.11(typescript@5.5.3)) + '@vueuse/shared': 11.0.0(vue@3.5.11(typescript@5.6.2)) + vue-demi: 0.14.10(vue@3.5.11(typescript@5.6.2)) transitivePeerDependencies: - '@vue/composition-api' - vue - '@vueuse/integrations@11.0.0(axios@1.7.7)(focus-trap@7.5.4)(vue@3.5.11(typescript@5.5.3))': + '@vueuse/integrations@11.0.0(axios@1.7.7)(focus-trap@7.5.4)(vue@3.5.11(typescript@5.6.2))': dependencies: - '@vueuse/core': 11.0.0(vue@3.5.11(typescript@5.5.3)) - '@vueuse/shared': 11.0.0(vue@3.5.11(typescript@5.5.3)) - vue-demi: 0.14.10(vue@3.5.11(typescript@5.5.3)) + '@vueuse/core': 11.0.0(vue@3.5.11(typescript@5.6.2)) + '@vueuse/shared': 11.0.0(vue@3.5.11(typescript@5.6.2)) + vue-demi: 0.14.10(vue@3.5.11(typescript@5.6.2)) optionalDependencies: axios: 1.7.7 focus-trap: 7.5.4 @@ -9734,9 +9682,9 @@ snapshots: '@vueuse/metadata@11.0.0': {} - '@vueuse/shared@11.0.0(vue@3.5.11(typescript@5.5.3))': + '@vueuse/shared@11.0.0(vue@3.5.11(typescript@5.6.2))': dependencies: - vue-demi: 0.14.10(vue@3.5.11(typescript@5.5.3)) + vue-demi: 0.14.10(vue@3.5.11(typescript@5.6.2)) transitivePeerDependencies: - '@vue/composition-api' - vue @@ -10533,9 +10481,9 @@ snapshots: eslint: 9.12.0(jiti@1.21.0) eslint-compat-utils: 0.5.1(eslint@9.12.0(jiti@1.21.0)) - eslint-plugin-import-x@4.3.1(eslint@9.12.0(jiti@1.21.0))(typescript@5.5.3): + eslint-plugin-import-x@4.3.1(eslint@9.12.0(jiti@1.21.0))(typescript@5.6.2): dependencies: - '@typescript-eslint/utils': 8.7.0(eslint@9.12.0(jiti@1.21.0))(typescript@5.5.3) + '@typescript-eslint/utils': 8.8.0(eslint@9.12.0(jiti@1.21.0))(typescript@5.6.2) debug: 4.3.7 doctrine: 3.0.0 eslint: 9.12.0(jiti@1.21.0) @@ -10816,11 +10764,11 @@ snapshots: flatted@3.3.1: {} - floating-vue@5.2.2(vue@3.5.11(typescript@5.5.3)): + floating-vue@5.2.2(vue@3.5.11(typescript@5.6.2)): dependencies: '@floating-ui/dom': 1.1.1 - vue: 3.5.11(typescript@5.5.3) - vue-resize: 2.0.0-alpha.1(vue@3.5.11(typescript@5.5.3)) + vue: 3.5.11(typescript@5.6.2) + vue-resize: 2.0.0-alpha.1(vue@3.5.11(typescript@5.6.2)) focus-trap@7.5.4: dependencies: @@ -11760,7 +11708,7 @@ snapshots: mkdirp@1.0.4: {} - mkdist@1.3.0(sass@1.79.4)(typescript@5.5.3): + mkdist@1.3.0(sass@1.79.4)(typescript@5.6.2): dependencies: citty: 0.1.4 defu: 6.1.2 @@ -11773,7 +11721,7 @@ snapshots: pathe: 1.1.2 optionalDependencies: sass: 1.79.4 - typescript: 5.5.3 + typescript: 5.6.2 mlly@1.7.1: dependencies: @@ -12054,13 +12002,13 @@ snapshots: camelcase-css: 2.0.1 postcss: 8.4.47 - postcss-load-config@4.0.2(postcss@8.4.47)(ts-node@10.9.2(@types/node@20.16.10)(typescript@5.5.3)): + postcss-load-config@4.0.2(postcss@8.4.47)(ts-node@10.9.2(@types/node@20.16.10)(typescript@5.6.2)): dependencies: lilconfig: 3.1.2 yaml: 2.5.0 optionalDependencies: postcss: 8.4.47 - ts-node: 10.9.2(@types/node@20.16.10)(typescript@5.5.3) + ts-node: 10.9.2(@types/node@20.16.10)(typescript@5.6.2) postcss-modules-extract-imports@3.0.0(postcss@8.4.47): dependencies: @@ -12370,36 +12318,36 @@ snapshots: dependencies: glob: 10.4.5 - rolldown@https://pkg.pr.new/rolldown@4caa0a9: + rolldown@https://pkg.pr.new/rolldown@9a0db67: dependencies: zod: 3.23.8 optionalDependencies: - '@rolldown/binding-darwin-arm64': https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-darwin-arm64@4caa0a9 - '@rolldown/binding-darwin-x64': https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-darwin-x64@4caa0a9 - '@rolldown/binding-freebsd-x64': https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-freebsd-x64@4caa0a9 - '@rolldown/binding-linux-arm-gnueabihf': https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-linux-arm-gnueabihf@4caa0a9 - '@rolldown/binding-linux-arm64-gnu': https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-linux-arm64-gnu@4caa0a9 - '@rolldown/binding-linux-arm64-musl': https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-linux-arm64-musl@4caa0a9 - '@rolldown/binding-linux-x64-gnu': https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-linux-x64-gnu@4caa0a9 - '@rolldown/binding-linux-x64-musl': https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-linux-x64-musl@4caa0a9 - '@rolldown/binding-wasm32-wasi': https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-wasm32-wasi@4caa0a9 - '@rolldown/binding-win32-arm64-msvc': https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-win32-arm64-msvc@4caa0a9 - '@rolldown/binding-win32-ia32-msvc': https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-win32-ia32-msvc@4caa0a9 - '@rolldown/binding-win32-x64-msvc': https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-win32-x64-msvc@4caa0a9 - - rollup-plugin-dts@6.1.1(rollup@3.29.4)(typescript@5.5.3): + '@rolldown/binding-darwin-arm64': https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-darwin-arm64@9a0db67 + '@rolldown/binding-darwin-x64': https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-darwin-x64@9a0db67 + '@rolldown/binding-freebsd-x64': https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-freebsd-x64@9a0db67 + '@rolldown/binding-linux-arm-gnueabihf': https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-linux-arm-gnueabihf@9a0db67 + '@rolldown/binding-linux-arm64-gnu': https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-linux-arm64-gnu@9a0db67 + '@rolldown/binding-linux-arm64-musl': https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-linux-arm64-musl@9a0db67 + '@rolldown/binding-linux-x64-gnu': https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-linux-x64-gnu@9a0db67 + '@rolldown/binding-linux-x64-musl': https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-linux-x64-musl@9a0db67 + '@rolldown/binding-wasm32-wasi': https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-wasm32-wasi@9a0db67 + '@rolldown/binding-win32-arm64-msvc': https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-win32-arm64-msvc@9a0db67 + '@rolldown/binding-win32-ia32-msvc': https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-win32-ia32-msvc@9a0db67 + '@rolldown/binding-win32-x64-msvc': https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-win32-x64-msvc@9a0db67 + + rollup-plugin-dts@6.1.1(rollup@3.29.4)(typescript@5.6.2): dependencies: magic-string: 0.30.11 rollup: 3.29.4 - typescript: 5.5.3 + typescript: 5.6.2 optionalDependencies: '@babel/code-frame': 7.24.7 - rollup-plugin-dts@6.1.1(rollup@4.22.5)(typescript@5.5.3): + rollup-plugin-dts@6.1.1(rollup@4.22.5)(typescript@5.6.2): dependencies: magic-string: 0.30.11 rollup: 4.22.5 - typescript: 5.5.3 + typescript: 5.6.2 optionalDependencies: '@babel/code-frame': 7.24.7 @@ -12852,7 +12800,7 @@ snapshots: tabbable@6.2.0: {} - tailwindcss@3.4.13(ts-node@10.9.2(@types/node@20.16.10)(typescript@5.5.3)): + tailwindcss@3.4.13(ts-node@10.9.2(@types/node@20.16.10)(typescript@5.6.2)): dependencies: '@alloc/quick-lru': 5.2.0 arg: 5.0.2 @@ -12871,7 +12819,7 @@ snapshots: postcss: 8.4.47 postcss-import: 15.1.0(postcss@8.4.47) postcss-js: 4.0.1(postcss@8.4.47) - postcss-load-config: 4.0.2(postcss@8.4.47)(ts-node@10.9.2(@types/node@20.16.10)(typescript@5.5.3)) + postcss-load-config: 4.0.2(postcss@8.4.47)(ts-node@10.9.2(@types/node@20.16.10)(typescript@5.6.2)) postcss-nested: 6.2.0(postcss@8.4.47) postcss-selector-parser: 6.1.1 resolve: 1.22.8 @@ -12943,13 +12891,13 @@ snapshots: trim-lines@3.0.1: {} - ts-api-utils@1.3.0(typescript@5.5.3): + ts-api-utils@1.3.0(typescript@5.6.2): dependencies: - typescript: 5.5.3 + typescript: 5.6.2 ts-interface-checker@0.1.13: {} - ts-node@10.9.2(@types/node@20.16.10)(typescript@5.5.3): + ts-node@10.9.2(@types/node@20.16.10)(typescript@5.6.2): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.8 @@ -12963,13 +12911,13 @@ snapshots: create-require: 1.1.1 diff: 4.0.2 make-error: 1.3.6 - typescript: 5.5.3 + typescript: 5.6.2 v8-compile-cache-lib: 3.0.1 yn: 3.1.1 - tsconfck@3.1.4(typescript@5.5.3): + tsconfck@3.1.4(typescript@5.6.2): optionalDependencies: - typescript: 5.5.3 + typescript: 5.6.2 tslib@2.7.0: {} @@ -12982,20 +12930,20 @@ snapshots: twoslash-protocol@0.2.12: {} - twoslash-vue@0.2.12(typescript@5.5.3): + twoslash-vue@0.2.12(typescript@5.6.2): dependencies: - '@vue/language-core': 2.1.6(typescript@5.5.3) - twoslash: 0.2.12(typescript@5.5.3) + '@vue/language-core': 2.1.6(typescript@5.6.2) + twoslash: 0.2.12(typescript@5.6.2) twoslash-protocol: 0.2.12 - typescript: 5.5.3 + typescript: 5.6.2 transitivePeerDependencies: - supports-color - twoslash@0.2.12(typescript@5.5.3): + twoslash@0.2.12(typescript@5.6.2): dependencies: - '@typescript/vfs': 1.6.0(typescript@5.5.3) + '@typescript/vfs': 1.6.0(typescript@5.6.2) twoslash-protocol: 0.2.12 - typescript: 5.5.3 + typescript: 5.6.2 transitivePeerDependencies: - supports-color @@ -13014,25 +12962,25 @@ snapshots: type@2.7.2: {} - typescript-eslint@8.8.0(eslint@9.12.0(jiti@1.21.0))(typescript@5.5.3): + typescript-eslint@8.8.0(eslint@9.12.0(jiti@1.21.0))(typescript@5.6.2): dependencies: - '@typescript-eslint/eslint-plugin': 8.8.0(@typescript-eslint/parser@8.8.0(eslint@9.12.0(jiti@1.21.0))(typescript@5.5.3))(eslint@9.12.0(jiti@1.21.0))(typescript@5.5.3) - '@typescript-eslint/parser': 8.8.0(eslint@9.12.0(jiti@1.21.0))(typescript@5.5.3) - '@typescript-eslint/utils': 8.8.0(eslint@9.12.0(jiti@1.21.0))(typescript@5.5.3) + '@typescript-eslint/eslint-plugin': 8.8.0(@typescript-eslint/parser@8.8.0(eslint@9.12.0(jiti@1.21.0))(typescript@5.6.2))(eslint@9.12.0(jiti@1.21.0))(typescript@5.6.2) + '@typescript-eslint/parser': 8.8.0(eslint@9.12.0(jiti@1.21.0))(typescript@5.6.2) + '@typescript-eslint/utils': 8.8.0(eslint@9.12.0(jiti@1.21.0))(typescript@5.6.2) optionalDependencies: - typescript: 5.5.3 + typescript: 5.6.2 transitivePeerDependencies: - eslint - supports-color - typescript@5.5.3: {} + typescript@5.6.2: {} ufo@1.5.4: {} uglify-js@3.18.0: optional: true - unbuild@2.0.0(sass@1.79.4)(typescript@5.5.3): + unbuild@2.0.0(sass@1.79.4)(typescript@5.6.2): dependencies: '@rollup/plugin-alias': 5.1.0(rollup@3.29.4) '@rollup/plugin-commonjs': 25.0.4(rollup@3.29.4) @@ -13049,17 +12997,17 @@ snapshots: hookable: 5.5.3 jiti: 1.21.0 magic-string: 0.30.11 - mkdist: 1.3.0(sass@1.79.4)(typescript@5.5.3) + mkdist: 1.3.0(sass@1.79.4)(typescript@5.6.2) mlly: 1.7.1 pathe: 1.1.2 pkg-types: 1.1.1 pretty-bytes: 6.1.1 rollup: 3.29.4 - rollup-plugin-dts: 6.1.1(rollup@3.29.4)(typescript@5.5.3) + rollup-plugin-dts: 6.1.1(rollup@3.29.4)(typescript@5.6.2) scule: 1.0.0 untyped: 1.4.0 optionalDependencies: - typescript: 5.5.3 + typescript: 5.6.2 transitivePeerDependencies: - sass - supports-color @@ -13184,24 +13132,24 @@ snapshots: transitivePeerDependencies: - supports-color - vitepress@1.3.4(@algolia/client-search@4.20.0)(@types/react@18.3.11)(axios@1.7.7)(postcss@8.4.47)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.5.3): + vitepress@1.3.4(@algolia/client-search@4.20.0)(@types/react@18.3.11)(axios@1.7.7)(postcss@8.4.47)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.2): dependencies: '@docsearch/css': 3.6.1 '@docsearch/js': 3.6.1(@algolia/client-search@4.20.0)(@types/react@18.3.11)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@shikijs/core': 1.14.1 '@shikijs/transformers': 1.14.1 '@types/markdown-it': 14.1.2 - '@vitejs/plugin-vue': 5.1.2(vite@packages+vite)(vue@3.5.11(typescript@5.5.3)) + '@vitejs/plugin-vue': 5.1.2(vite@packages+vite)(vue@3.5.11(typescript@5.6.2)) '@vue/devtools-api': 7.3.8 '@vue/shared': 3.4.38 - '@vueuse/core': 11.0.0(vue@3.5.11(typescript@5.5.3)) - '@vueuse/integrations': 11.0.0(axios@1.7.7)(focus-trap@7.5.4)(vue@3.5.11(typescript@5.5.3)) + '@vueuse/core': 11.0.0(vue@3.5.11(typescript@5.6.2)) + '@vueuse/integrations': 11.0.0(axios@1.7.7)(focus-trap@7.5.4)(vue@3.5.11(typescript@5.6.2)) focus-trap: 7.5.4 mark.js: 8.11.1 minisearch: 7.1.0 shiki: 1.14.1 vite: link:packages/vite - vue: 3.5.11(typescript@5.5.3) + vue: 3.5.11(typescript@5.6.2) optionalDependencies: postcss: 8.4.47 transitivePeerDependencies: @@ -13253,18 +13201,18 @@ snapshots: void-elements@3.1.0: {} - vue-demi@0.14.10(vue@3.5.11(typescript@5.5.3)): + vue-demi@0.14.10(vue@3.5.11(typescript@5.6.2)): dependencies: - vue: 3.5.11(typescript@5.5.3) + vue: 3.5.11(typescript@5.6.2) - vue-resize@2.0.0-alpha.1(vue@3.5.11(typescript@5.5.3)): + vue-resize@2.0.0-alpha.1(vue@3.5.11(typescript@5.6.2)): dependencies: - vue: 3.5.11(typescript@5.5.3) + vue: 3.5.11(typescript@5.6.2) - vue-router@4.4.5(vue@3.5.11(typescript@5.5.3)): + vue-router@4.4.5(vue@3.5.11(typescript@5.6.2)): dependencies: '@vue/devtools-api': 6.6.4 - vue: 3.5.11(typescript@5.5.3) + vue: 3.5.11(typescript@5.6.2) vue@3.2.0: dependencies: @@ -13272,20 +13220,20 @@ snapshots: '@vue/runtime-dom': 3.2.0 '@vue/shared': 3.2.0 - vue@3.5.11(typescript@5.5.3): + vue@3.5.11(typescript@5.6.2): dependencies: '@vue/compiler-dom': 3.5.11 '@vue/compiler-sfc': 3.5.11 '@vue/runtime-dom': 3.5.11 - '@vue/server-renderer': 3.5.11(vue@3.5.11(typescript@5.5.3)) + '@vue/server-renderer': 3.5.11(vue@3.5.11(typescript@5.6.2)) '@vue/shared': 3.5.11 optionalDependencies: - typescript: 5.5.3 + typescript: 5.6.2 - vuex@4.1.0(vue@3.5.11(typescript@5.5.3)): + vuex@4.1.0(vue@3.5.11(typescript@5.6.2)): dependencies: '@vue/devtools-api': 6.6.3 - vue: 3.5.11(typescript@5.5.3) + vue: 3.5.11(typescript@5.6.2) web-streams-polyfill@3.2.1: {} From 4a7c5d778f644d67cbabd799f55f57e045b88af6 Mon Sep 17 00:00:00 2001 From: sapphi-red <49056869+sapphi-red@users.noreply.github.com> Date: Sat, 5 Oct 2024 02:29:23 +0900 Subject: [PATCH 24/43] feat: convert `optimizeDeps.esbuildOptions` to `optimizeDeps.rollupOptions` --- packages/vite/src/node/config.ts | 116 ++++++++++++++++++++++ packages/vite/src/node/optimizer/index.ts | 23 ++++- packages/vite/src/node/optimizer/scan.ts | 10 +- 3 files changed, 136 insertions(+), 13 deletions(-) diff --git a/packages/vite/src/node/config.ts b/packages/vite/src/node/config.ts index 6792ed9e0d27bc..11f52f2395ff10 100644 --- a/packages/vite/src/node/config.ts +++ b/packages/vite/src/node/config.ts @@ -598,6 +598,7 @@ export function resolveDevEnvironmentOptions( preserverSymlinks: boolean, environmentName: string | undefined, consumer: 'client' | 'server' | undefined, + logger: Logger, // Backward compatibility skipSsrTransform?: boolean, ): ResolvedDevEnvironmentOptions { @@ -613,6 +614,7 @@ export function resolveDevEnvironmentOptions( dev?.optimizeDeps, preserverSymlinks, consumer, + logger, ), createEnvironment: dev?.createEnvironment ?? @@ -658,6 +660,7 @@ function resolveEnvironmentOptions( resolve.preserveSymlinks, environmentName, consumer, + logger, skipSsrTransform, ), build: resolveBuildEnvironmentOptions( @@ -793,8 +796,120 @@ function resolveDepOptimizationOptions( optimizeDeps: DepOptimizationOptions | undefined, preserveSymlinks: boolean, consumer: 'client' | 'server' | undefined, + logger: Logger, ): DepOptimizationOptions { optimizeDeps ??= {} + + if (optimizeDeps.esbuildOptions) { + logger.warn( + colors.yellow( + `You have set \`optimizeDeps.esbuildOptions\` but this options is now deprecated. ` + + `Vite now uses Rolldown to optimize the dependencies. ` + + `Please use \`optimizeDeps.rollupOptions\` instead.`, + ), + ) + + optimizeDeps.rollupOptions ??= {} + optimizeDeps.rollupOptions.resolve ??= {} + optimizeDeps.rollupOptions.output ??= {} + + const setResolveOptions = < + T extends keyof Exclude, + >( + key: T, + value: Exclude[T], + ) => { + if ( + value !== undefined && + optimizeDeps.rollupOptions!.resolve![key] === undefined + ) { + optimizeDeps.rollupOptions!.resolve![key] = value + } + } + + if ( + optimizeDeps.esbuildOptions.minify !== undefined && + optimizeDeps.rollupOptions.output.minify === undefined + ) { + optimizeDeps.rollupOptions.output.minify = + optimizeDeps.esbuildOptions.minify + } + if ( + optimizeDeps.esbuildOptions.treeShaking !== undefined && + optimizeDeps.rollupOptions.treeshake === undefined + ) { + optimizeDeps.rollupOptions.treeshake = + optimizeDeps.esbuildOptions.treeShaking + } + if ( + optimizeDeps.esbuildOptions.define !== undefined && + optimizeDeps.rollupOptions.define === undefined + ) { + optimizeDeps.rollupOptions.define = optimizeDeps.esbuildOptions.define + } + if (optimizeDeps.esbuildOptions.loader !== undefined) { + const loader = optimizeDeps.esbuildOptions.loader + optimizeDeps.rollupOptions.moduleTypes ??= {} + for (const [key, value] of Object.entries(loader)) { + if ( + optimizeDeps.rollupOptions.moduleTypes[key] === undefined && + value !== 'copy' && + value !== 'css' && + value !== 'default' && + value !== 'file' && + value !== 'local-css' + ) { + optimizeDeps.rollupOptions.moduleTypes[key] = value + } + } + } + setResolveOptions('symlinks', optimizeDeps.esbuildOptions.preserveSymlinks) + setResolveOptions( + 'extensions', + optimizeDeps.esbuildOptions.resolveExtensions, + ) + setResolveOptions('mainFields', optimizeDeps.esbuildOptions.mainFields) + setResolveOptions('conditionNames', optimizeDeps.esbuildOptions.conditions) + + // NOTE: the following options cannot be converted + // - legalComments + // - target, supported (Vite used to transpile down to `ESBUILD_MODULES_TARGET`) + // - ignoreAnnotations + // - jsx, jsxFactory, jsxFragment, jsxImportSource, jsxDev, jsxSideEffects + // - tsconfigRaw, tsconfig + + // NOTE: the following options can be converted but probably not worth it + // - sourceRoot + // - sourcesContent (`output.sourcemapExcludeSources` is not supported by rolldown) + // - drop + // - dropLabels + // - mangleProps, reserveProps, mangleQuoted, mangleCache + // - minifyWhitespace, minifyIdentifiers, minifySyntax + // - lineLimit + // - charset + // - pure (`treeshake.manualPureFunctions` is not supported by rolldown) + // - alias (it probably does not work the same with `resolve.alias`) + // - inject + // - banner, footer + // - plugins (not sure if it's possible and need to check if it's worth it before) + // - nodePaths + + // NOTE: the following options does not make sense to set / convert it + // - globalName (we only use ESM format) + // - keepNames (probably rolldown does not need it? not sure) + // - color + // - logLimit + // - logOverride + // - splitting + // - outbase + // - packages (this should not be set) + // - allowOverwrite + // - publicPath (`file` loader is not supported by rolldown) + // - entryNames, chunkNames, assetNames (Vite does not support changing these options) + // - stdin + // - absWorkingDir + } + return { include: optimizeDeps.include ?? [], exclude: optimizeDeps.exclude ?? [], @@ -1018,6 +1133,7 @@ export async function resolveConfig( // default environment options undefined, undefined, + logger, ) const resolvedBuildOptions = resolveBuildEnvironmentOptions( diff --git a/packages/vite/src/node/optimizer/index.ts b/packages/vite/src/node/optimizer/index.ts index c28018196a3cd7..bc6775ee810171 100644 --- a/packages/vite/src/node/optimizer/index.ts +++ b/packages/vite/src/node/optimizer/index.ts @@ -7,7 +7,12 @@ import colors from 'picocolors' import type { BuildOptions as EsbuildBuildOptions } from 'esbuild' import { init, parse } from 'es-module-lexer' import glob from 'fast-glob' -import { type RollupOptions, type RollupOutput, rolldown } from 'rolldown' +import { + type RollupOptions, + type RollupOutput, + type OutputOptions as RollupOutputOptions, + rolldown, +} from 'rolldown' import type { ResolvedConfig } from '../config' import { asyncFlatten, @@ -103,7 +108,15 @@ export interface DepOptimizationConfig { | 'outExtension' | 'metafile' > - rollupOptions?: RollupOptions + rollupOptions?: Omit< + RollupOptions, + 'input' | 'logLevel' | 'platform' | 'output' + > & { + output?: Omit< + RollupOutputOptions, + 'format' | 'sourcemap' | 'dir' | 'banner' + > + } /** * List of file extensions that can be optimized. A corresponding esbuild * plugin must exist to handle the specific extension. @@ -770,9 +783,11 @@ async function prepareRolldownOptimizerRun( let canceled = false async function build() { const bundle = await rolldown({ + ...rollupOptions, input: flatIdDeps, logLevel: 'warn', plugins, + platform, resolve: { // TODO: set aliasFields, conditionNames depending on `platform` mainFields: ['module', 'main'], @@ -780,7 +795,6 @@ async function prepareRolldownOptimizerRun( extensions: ['.js', '.css'], conditionNames: ['browser'], }, - ...rollupOptions, // TODO: remove this and enable rolldown's CSS support later moduleTypes: { '.css': 'js', @@ -792,6 +806,7 @@ async function prepareRolldownOptimizerRun( throw new Error('The build was canceled') } const result = await bundle.write({ + ...rollupOptions.output, format: 'esm', sourcemap: true, dir: processingCacheDir, @@ -799,7 +814,6 @@ async function prepareRolldownOptimizerRun( platform === 'node' ? `import { createRequire } from 'module';const require = createRequire(import.meta.url);` : undefined, - ...rollupOptions.output, }) await bundle.close() return result @@ -1076,6 +1090,7 @@ export async function extractExportsData( const result = await build.generate({ ...rollupOptions.output, format: 'esm', + sourcemap: false, }) const [, exports, , hasModuleSyntax] = parse(result.output[0].code) return { diff --git a/packages/vite/src/node/optimizer/scan.ts b/packages/vite/src/node/optimizer/scan.ts index 2ad292daf5b1b4..606f14b31cba23 100644 --- a/packages/vite/src/node/optimizer/scan.ts +++ b/packages/vite/src/node/optimizer/scan.ts @@ -253,14 +253,6 @@ async function prepareRolldownScanner( ): Promise<{ build: () => Promise } | undefined> { if (scanContext?.cancelled) return - if (environment.config.dev.optimizeDeps.esbuildOptions) { - environment.logger.error( - `You've set "optimizeDeps.esbuildOptions" in your config. ` + - `This is deprecated and vite already use rollup to optimize packages. ` + - `Please use "optimizeDeps.rollupOptions" instead.`, - ) - } - const { plugins: pluginsFromConfig = [], ...rollupOptions } = environment.config.dev.optimizeDeps.rollupOptions ?? {} @@ -270,10 +262,10 @@ async function prepareRolldownScanner( async function build() { await scan({ + ...rollupOptions, input: entries, logLevel: 'silent', plugins, - ...rollupOptions, }) } From 3e2abc06e9b5bba5051ed6fe376aae6193e2e9e3 Mon Sep 17 00:00:00 2001 From: sapphi-red <49056869+sapphi-red@users.noreply.github.com> Date: Wed, 9 Oct 2024 12:26:45 +0900 Subject: [PATCH 25/43] fix: optimizeDeps test pass on windows --- packages/vite/src/node/optimizer/rolldownDepPlugin.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/vite/src/node/optimizer/rolldownDepPlugin.ts b/packages/vite/src/node/optimizer/rolldownDepPlugin.ts index 1464cfc7f9c248..5af5f3547abf95 100644 --- a/packages/vite/src/node/optimizer/rolldownDepPlugin.ts +++ b/packages/vite/src/node/optimizer/rolldownDepPlugin.ts @@ -14,6 +14,7 @@ import { browserExternalId, optionalPeerDepId } from '../plugins/resolve' import { isCSSRequest, isModuleCSSRequest } from '../plugins/css' import type { Environment } from '../environment' import { createBackCompatIdResolver } from '../idResolver' +import { isWindows } from '../../shared/utils' const externalWithConversionNamespace = 'vite:dep-pre-bundle:external-conversion' @@ -170,7 +171,8 @@ export function rolldownDepPlugin( // or package name (e.g. import "some-package.pdf") if (JS_TYPES_RE.test(resolved)) { return { - id: resolved, + // normalize to \\ on windows for esbuild/rolldown behavior difference: https://github.com/sapphi-red-repros/rolldown-esbuild-path-normalization + id: isWindows ? resolved.replaceAll('/', '\\') : resolved, external: false, } } From 4d5874b56596fe6718fef8de1fb111145684263c Mon Sep 17 00:00:00 2001 From: sapphi-red <49056869+sapphi-red@users.noreply.github.com> Date: Wed, 9 Oct 2024 13:01:50 +0900 Subject: [PATCH 26/43] chore: bump rolldown --- packages/vite/LICENSE.md | 15 --- packages/vite/package.json | 2 +- .../vite/src/node/server/pluginContainer.ts | 6 +- packages/vite/src/node/utils.ts | 7 +- pnpm-lock.yaml | 106 +++++++++--------- 5 files changed, 63 insertions(+), 73 deletions(-) diff --git a/packages/vite/LICENSE.md b/packages/vite/LICENSE.md index 11ac798890d552..f9b38e12ad666e 100644 --- a/packages/vite/LICENSE.md +++ b/packages/vite/LICENSE.md @@ -1266,21 +1266,6 @@ Repository: git+https://github.com/mcollina/fastq.git --------------------------------------- -## fdir -License: MIT -By: thecodrr -Repository: git+https://github.com/thecodrr/fdir.git - -> Copyright 2023 Abdullah Atta -> -> Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: -> -> The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -> -> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - ---------------------------------------- - ## fill-range License: MIT By: Jon Schlinkert, Edo Rivai, Paul Miller, Rouven Weßling diff --git a/packages/vite/package.json b/packages/vite/package.json index 4ca389b37429ca..fd8413a29047d5 100644 --- a/packages/vite/package.json +++ b/packages/vite/package.json @@ -87,7 +87,7 @@ "dependencies": { "esbuild": "^0.24.0", "postcss": "^8.4.47", - "rolldown": "https://pkg.pr.new/rolldown@9a0db67", + "rolldown": "https://pkg.pr.new/rolldown@7bc51f0", "rollup": "^4.22.5" }, "optionalDependencies": { diff --git a/packages/vite/src/node/server/pluginContainer.ts b/packages/vite/src/node/server/pluginContainer.ts index 7b445f5597bed1..eaf37ea60b58f6 100644 --- a/packages/vite/src/node/server/pluginContainer.ts +++ b/packages/vite/src/node/server/pluginContainer.ts @@ -73,6 +73,7 @@ import { normalizePath, numberToPos, prettifyUrl, + rolldownVersion, rollupVersion, timeFrom, } from '../utils' @@ -178,6 +179,7 @@ class EnvironmentPluginContainer { this.minimalContext = { meta: { rollupVersion, + rolldownVersion, watchMode: true, }, debug: noop, @@ -539,7 +541,7 @@ class PluginContext implements Omit { _activeId: string | null = null _activeCode: string | null = null _resolveSkips?: Set - // meta: RollupPluginContext['meta'] + meta: RollupPluginContext['meta'] environment: Environment constructor( @@ -547,7 +549,7 @@ class PluginContext implements Omit { public _container: EnvironmentPluginContainer, ) { this.environment = this._container.environment - // this.meta = this._container.minimalContext.meta + this.meta = this._container.minimalContext.meta } parse(code: string, opts: any) { diff --git a/packages/vite/src/node/utils.ts b/packages/vite/src/node/utils.ts index fede0a45d63bd6..674b34b6eea56c 100644 --- a/packages/vite/src/node/utils.ts +++ b/packages/vite/src/node/utils.ts @@ -145,8 +145,11 @@ const _require = createRequire(import.meta.url) const _dirname = path.dirname(fileURLToPath(import.meta.url)) -// NOTE: we don't use VERSION variable exported from rollup to avoid importing rollup in dev -export const rollupVersion = +// https://github.com/rolldown/rolldown/blob/7bc51f099a916dbe31bc0582995c58cf0d0f8924/packages/rolldown/src/log/logger.ts#L67 +export const rollupVersion = '4.23.0' + +// NOTE: we don't use VERSION variable exported from rolldown to avoid importing rolldown in dev +export const rolldownVersion = resolvePackageData('rolldown', _dirname, true)?.data.version ?? '' // set in bin/vite.js diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index bbc5816ceceba6..9d9bef486de579 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -234,8 +234,8 @@ importers: specifier: ^8.4.47 version: 8.4.47 rolldown: - specifier: https://pkg.pr.new/rolldown@9a0db67 - version: https://pkg.pr.new/rolldown@9a0db67 + specifier: https://pkg.pr.new/rolldown@7bc51f0 + version: https://pkg.pr.new/rolldown@7bc51f0 rollup: specifier: ^4.22.5 version: 4.22.5 @@ -3085,63 +3085,63 @@ packages: '@polka/url@1.0.0-next.24': resolution: {integrity: sha512-2LuNTFBIO0m7kKIQvvPHN6UE63VjpmL9rnEEaOOaiSPbZK+zUOYIzBAWcED+3XYzhYsd/0mD57VdxAEqqV52CQ==} - '@rolldown/binding-darwin-arm64@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-darwin-arm64@9a0db67': - resolution: {tarball: https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-darwin-arm64@9a0db67} + '@rolldown/binding-darwin-arm64@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-darwin-arm64@7bc51f0': + resolution: {tarball: https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-darwin-arm64@7bc51f0} version: 0.13.2 os: [darwin] - '@rolldown/binding-darwin-x64@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-darwin-x64@9a0db67': - resolution: {tarball: https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-darwin-x64@9a0db67} + '@rolldown/binding-darwin-x64@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-darwin-x64@7bc51f0': + resolution: {tarball: https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-darwin-x64@7bc51f0} version: 0.13.2 os: [darwin] - '@rolldown/binding-freebsd-x64@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-freebsd-x64@9a0db67': - resolution: {tarball: https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-freebsd-x64@9a0db67} + '@rolldown/binding-freebsd-x64@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-freebsd-x64@7bc51f0': + resolution: {tarball: https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-freebsd-x64@7bc51f0} version: 0.13.2 os: [freebsd] - '@rolldown/binding-linux-arm-gnueabihf@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-linux-arm-gnueabihf@9a0db67': - resolution: {tarball: https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-linux-arm-gnueabihf@9a0db67} + '@rolldown/binding-linux-arm-gnueabihf@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-linux-arm-gnueabihf@7bc51f0': + resolution: {tarball: https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-linux-arm-gnueabihf@7bc51f0} version: 0.13.2 os: [linux] - '@rolldown/binding-linux-arm64-gnu@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-linux-arm64-gnu@9a0db67': - resolution: {tarball: https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-linux-arm64-gnu@9a0db67} + '@rolldown/binding-linux-arm64-gnu@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-linux-arm64-gnu@7bc51f0': + resolution: {tarball: https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-linux-arm64-gnu@7bc51f0} version: 0.13.2 os: [linux] - '@rolldown/binding-linux-arm64-musl@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-linux-arm64-musl@9a0db67': - resolution: {tarball: https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-linux-arm64-musl@9a0db67} + '@rolldown/binding-linux-arm64-musl@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-linux-arm64-musl@7bc51f0': + resolution: {tarball: https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-linux-arm64-musl@7bc51f0} version: 0.13.2 os: [linux] - '@rolldown/binding-linux-x64-gnu@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-linux-x64-gnu@9a0db67': - resolution: {tarball: https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-linux-x64-gnu@9a0db67} + '@rolldown/binding-linux-x64-gnu@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-linux-x64-gnu@7bc51f0': + resolution: {tarball: https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-linux-x64-gnu@7bc51f0} version: 0.13.2 os: [linux] - '@rolldown/binding-linux-x64-musl@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-linux-x64-musl@9a0db67': - resolution: {tarball: https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-linux-x64-musl@9a0db67} + '@rolldown/binding-linux-x64-musl@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-linux-x64-musl@7bc51f0': + resolution: {tarball: https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-linux-x64-musl@7bc51f0} version: 0.13.2 os: [linux] - '@rolldown/binding-wasm32-wasi@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-wasm32-wasi@9a0db67': - resolution: {tarball: https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-wasm32-wasi@9a0db67} + '@rolldown/binding-wasm32-wasi@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-wasm32-wasi@7bc51f0': + resolution: {tarball: https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-wasm32-wasi@7bc51f0} version: 0.13.2 engines: {node: '>=14.21.3'} - '@rolldown/binding-win32-arm64-msvc@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-win32-arm64-msvc@9a0db67': - resolution: {tarball: https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-win32-arm64-msvc@9a0db67} + '@rolldown/binding-win32-arm64-msvc@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-win32-arm64-msvc@7bc51f0': + resolution: {tarball: https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-win32-arm64-msvc@7bc51f0} version: 0.13.2 os: [win32] - '@rolldown/binding-win32-ia32-msvc@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-win32-ia32-msvc@9a0db67': - resolution: {tarball: https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-win32-ia32-msvc@9a0db67} + '@rolldown/binding-win32-ia32-msvc@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-win32-ia32-msvc@7bc51f0': + resolution: {tarball: https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-win32-ia32-msvc@7bc51f0} version: 0.13.2 os: [win32] - '@rolldown/binding-win32-x64-msvc@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-win32-x64-msvc@9a0db67': - resolution: {tarball: https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-win32-x64-msvc@9a0db67} + '@rolldown/binding-win32-x64-msvc@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-win32-x64-msvc@7bc51f0': + resolution: {tarball: https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-win32-x64-msvc@7bc51f0} version: 0.13.2 os: [win32] @@ -6372,8 +6372,8 @@ packages: resolution: {integrity: sha512-l0OE8wL34P4nJH/H2ffoaniAokM2qSmrtXHmlpvYr5AVVX8msAyW0l8NVJFDxlSK4u3Uh/f41cQheDVdnYijwQ==} hasBin: true - rolldown@https://pkg.pr.new/rolldown@9a0db67: - resolution: {tarball: https://pkg.pr.new/rolldown@9a0db67} + rolldown@https://pkg.pr.new/rolldown@7bc51f0: + resolution: {tarball: https://pkg.pr.new/rolldown@7bc51f0} version: 0.13.2 hasBin: true @@ -8729,42 +8729,42 @@ snapshots: '@polka/url@1.0.0-next.24': {} - '@rolldown/binding-darwin-arm64@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-darwin-arm64@9a0db67': + '@rolldown/binding-darwin-arm64@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-darwin-arm64@7bc51f0': optional: true - '@rolldown/binding-darwin-x64@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-darwin-x64@9a0db67': + '@rolldown/binding-darwin-x64@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-darwin-x64@7bc51f0': optional: true - '@rolldown/binding-freebsd-x64@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-freebsd-x64@9a0db67': + '@rolldown/binding-freebsd-x64@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-freebsd-x64@7bc51f0': optional: true - '@rolldown/binding-linux-arm-gnueabihf@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-linux-arm-gnueabihf@9a0db67': + '@rolldown/binding-linux-arm-gnueabihf@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-linux-arm-gnueabihf@7bc51f0': optional: true - '@rolldown/binding-linux-arm64-gnu@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-linux-arm64-gnu@9a0db67': + '@rolldown/binding-linux-arm64-gnu@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-linux-arm64-gnu@7bc51f0': optional: true - '@rolldown/binding-linux-arm64-musl@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-linux-arm64-musl@9a0db67': + '@rolldown/binding-linux-arm64-musl@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-linux-arm64-musl@7bc51f0': optional: true - '@rolldown/binding-linux-x64-gnu@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-linux-x64-gnu@9a0db67': + '@rolldown/binding-linux-x64-gnu@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-linux-x64-gnu@7bc51f0': optional: true - '@rolldown/binding-linux-x64-musl@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-linux-x64-musl@9a0db67': + '@rolldown/binding-linux-x64-musl@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-linux-x64-musl@7bc51f0': optional: true - '@rolldown/binding-wasm32-wasi@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-wasm32-wasi@9a0db67': + '@rolldown/binding-wasm32-wasi@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-wasm32-wasi@7bc51f0': dependencies: '@napi-rs/wasm-runtime': 0.2.4 optional: true - '@rolldown/binding-win32-arm64-msvc@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-win32-arm64-msvc@9a0db67': + '@rolldown/binding-win32-arm64-msvc@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-win32-arm64-msvc@7bc51f0': optional: true - '@rolldown/binding-win32-ia32-msvc@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-win32-ia32-msvc@9a0db67': + '@rolldown/binding-win32-ia32-msvc@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-win32-ia32-msvc@7bc51f0': optional: true - '@rolldown/binding-win32-x64-msvc@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-win32-x64-msvc@9a0db67': + '@rolldown/binding-win32-x64-msvc@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-win32-x64-msvc@7bc51f0': optional: true '@rollup/plugin-alias@5.1.0(rollup@3.29.4)': @@ -12318,22 +12318,22 @@ snapshots: dependencies: glob: 10.4.5 - rolldown@https://pkg.pr.new/rolldown@9a0db67: + rolldown@https://pkg.pr.new/rolldown@7bc51f0: dependencies: zod: 3.23.8 optionalDependencies: - '@rolldown/binding-darwin-arm64': https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-darwin-arm64@9a0db67 - '@rolldown/binding-darwin-x64': https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-darwin-x64@9a0db67 - '@rolldown/binding-freebsd-x64': https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-freebsd-x64@9a0db67 - '@rolldown/binding-linux-arm-gnueabihf': https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-linux-arm-gnueabihf@9a0db67 - '@rolldown/binding-linux-arm64-gnu': https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-linux-arm64-gnu@9a0db67 - '@rolldown/binding-linux-arm64-musl': https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-linux-arm64-musl@9a0db67 - '@rolldown/binding-linux-x64-gnu': https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-linux-x64-gnu@9a0db67 - '@rolldown/binding-linux-x64-musl': https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-linux-x64-musl@9a0db67 - '@rolldown/binding-wasm32-wasi': https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-wasm32-wasi@9a0db67 - '@rolldown/binding-win32-arm64-msvc': https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-win32-arm64-msvc@9a0db67 - '@rolldown/binding-win32-ia32-msvc': https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-win32-ia32-msvc@9a0db67 - '@rolldown/binding-win32-x64-msvc': https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-win32-x64-msvc@9a0db67 + '@rolldown/binding-darwin-arm64': https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-darwin-arm64@7bc51f0 + '@rolldown/binding-darwin-x64': https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-darwin-x64@7bc51f0 + '@rolldown/binding-freebsd-x64': https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-freebsd-x64@7bc51f0 + '@rolldown/binding-linux-arm-gnueabihf': https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-linux-arm-gnueabihf@7bc51f0 + '@rolldown/binding-linux-arm64-gnu': https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-linux-arm64-gnu@7bc51f0 + '@rolldown/binding-linux-arm64-musl': https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-linux-arm64-musl@7bc51f0 + '@rolldown/binding-linux-x64-gnu': https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-linux-x64-gnu@7bc51f0 + '@rolldown/binding-linux-x64-musl': https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-linux-x64-musl@7bc51f0 + '@rolldown/binding-wasm32-wasi': https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-wasm32-wasi@7bc51f0 + '@rolldown/binding-win32-arm64-msvc': https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-win32-arm64-msvc@7bc51f0 + '@rolldown/binding-win32-ia32-msvc': https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-win32-ia32-msvc@7bc51f0 + '@rolldown/binding-win32-x64-msvc': https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-win32-x64-msvc@7bc51f0 rollup-plugin-dts@6.1.1(rollup@3.29.4)(typescript@5.6.2): dependencies: From e341fcbc190f834cb7212dbff3ca577f3b0c4a5d Mon Sep 17 00:00:00 2001 From: sapphi-red <49056869+sapphi-red@users.noreply.github.com> Date: Wed, 9 Oct 2024 17:55:26 +0900 Subject: [PATCH 27/43] chore: make some tests passing --- .../__tests__/backend-integration.spec.ts | 9 ++++++--- .../dynamic-import/__tests__/dynamic-import.spec.ts | 2 ++ vitest.config.e2e.ts | 5 ++--- 3 files changed, 10 insertions(+), 6 deletions(-) diff --git a/playground/backend-integration/__tests__/backend-integration.spec.ts b/playground/backend-integration/__tests__/backend-integration.spec.ts index c6ac1aaf59cb91..fe90be8c532cbc 100644 --- a/playground/backend-integration/__tests__/backend-integration.spec.ts +++ b/playground/backend-integration/__tests__/backend-integration.spec.ts @@ -56,10 +56,13 @@ describe.runIf(isBuild)('build', () => { const imgAssetEntry = manifest['../images/logo.png'] const dirFooAssetEntry = manifest['../../dir/foo.css'] const iconEntrypointEntry = manifest['icon.png'] - expect(htmlEntry.css.length).toEqual(1) + expect(htmlEntry.css.length).toEqual(2) expect(htmlEntry.assets.length).toEqual(1) - expect(mainTsEntry.assets?.length ?? 0).toBeGreaterThanOrEqual(1) - expect(mainTsEntry.assets).toContainEqual( + expect(mainTsEntry.imports.length).toBeGreaterThanOrEqual(1) + const mainTsEntryImported = manifest[mainTsEntry.imports[0]] + expect(mainTsEntryImported).toBeDefined() + expect(mainTsEntryImported.assets?.length ?? 0).toBeGreaterThanOrEqual(1) + expect(mainTsEntryImported.assets).toContainEqual( expect.stringMatching(/assets\/url-[-\w]{8}\.css/), ) expect(cssAssetEntry?.file).not.toBeUndefined() diff --git a/playground/dynamic-import/__tests__/dynamic-import.spec.ts b/playground/dynamic-import/__tests__/dynamic-import.spec.ts index a1a843a0b04f29..d1d5d6716391c6 100644 --- a/playground/dynamic-import/__tests__/dynamic-import.spec.ts +++ b/playground/dynamic-import/__tests__/dynamic-import.spec.ts @@ -170,6 +170,8 @@ test('should work a load path that contains parentheses.', async () => { test.runIf(isBuild)( 'should rollup warn when static and dynamic import a module in same chunk', + // NOTE: this is a warning related to rollup's chunking behavior + { skip: true }, async () => { const log = serverLogs.join('\n') expect(log).toContain( diff --git a/vitest.config.e2e.ts b/vitest.config.e2e.ts index 20603ce18f5901..005035225fc6f7 100644 --- a/vitest.config.e2e.ts +++ b/vitest.config.e2e.ts @@ -17,9 +17,8 @@ export default defineConfig({ './playground/legacy/**/*.spec.[tj]s', // system format ...(isBuild ? [ - './playground/backend-integration/**/*.spec.[tj]s', // https://github.com/rolldown/rolldown/issues/2207 - './playground/css-dynamic-import/**/*.spec.[tj]s', // https://github.com/rolldown/rolldown/issues/1842 - './playground/dynamic-import/**/*.spec.[tj]s', // https://github.com/rolldown/rolldown/issues/1842, https://github.com/rolldown/rolldown/issues/1843 + './playground/backend-integration/**/*.spec.[tj]s', // https://github.com/rolldown/rolldown/issues/2392 + './playground/dynamic-import/**/*.spec.[tj]s', // https://github.com/rolldown/rolldown/issues/1843 './playground/external/**/*.spec.[tj]s', // https://github.com/rolldown/rolldown/issues/2041 './playground/glob-import/**/*.spec.[tj]s', // remove empty CSS generate chunk https://github.com/rolldown/rolldown/issues/1842 './playground/lib/**/*.spec.[tj]s', // umd format From 47239cf44d1a7b5cbbf3934c1fa47d7c7da42a05 Mon Sep 17 00:00:00 2001 From: sapphi-red <49056869+sapphi-red@users.noreply.github.com> Date: Wed, 9 Oct 2024 18:48:36 +0900 Subject: [PATCH 28/43] chore: make glob-import test pass with workarounds --- packages/vite/src/node/plugins/css.ts | 9 +++++++-- vitest.config.e2e.ts | 1 - 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/packages/vite/src/node/plugins/css.ts b/packages/vite/src/node/plugins/css.ts index 560a900164beb1..1e6ade6a0e4823 100644 --- a/packages/vite/src/node/plugins/css.ts +++ b/packages/vite/src/node/plugins/css.ts @@ -577,7 +577,8 @@ export function cssPostPlugin(config: ResolvedConfig): RolldownPlugin { code = `export default ${JSON.stringify(content)}` } else { // empty module when it's not a CSS module nor `?inline` - code = '' + // NOTE: add `export {}` otherwise rolldown treats the module as CJS (https://github.com/rolldown/rolldown/issues/2394) + code = 'export {}' } return { @@ -596,7 +597,11 @@ export function cssPostPlugin(config: ResolvedConfig): RolldownPlugin { let chunkCSS = '' // the chunk is empty if it's a dynamic entry chunk that only contains a CSS import const isJsChunkEmpty = code === '' && !chunk.isEntry - let isPureCssChunk = chunk.exports.length === 0 + // NOTE: use this instead of "chunk.exports.length === 0" because of https://github.com/rolldown/rolldown/issues/2395 + let isPureCssChunk = + opts.format === 'es' + ? !/export\s+/.test(code) + : !/exports(?:\.\w|\[)/.test(code) const ids = Object.keys(chunk.modules) for (const id of ids) { if (styles.has(id)) { diff --git a/vitest.config.e2e.ts b/vitest.config.e2e.ts index 005035225fc6f7..363c2be35ad3b0 100644 --- a/vitest.config.e2e.ts +++ b/vitest.config.e2e.ts @@ -20,7 +20,6 @@ export default defineConfig({ './playground/backend-integration/**/*.spec.[tj]s', // https://github.com/rolldown/rolldown/issues/2392 './playground/dynamic-import/**/*.spec.[tj]s', // https://github.com/rolldown/rolldown/issues/1843 './playground/external/**/*.spec.[tj]s', // https://github.com/rolldown/rolldown/issues/2041 - './playground/glob-import/**/*.spec.[tj]s', // remove empty CSS generate chunk https://github.com/rolldown/rolldown/issues/1842 './playground/lib/**/*.spec.[tj]s', // umd format './playground/object-hooks/**/*.spec.[tj]s', // object hook sequential './playground/optimize-deps/**/*.spec.[tj]s', // https://github.com/rolldown/rolldown/issues/2031 From 82bb8e8612ee66e581c36243d5a0b546c770fdf1 Mon Sep 17 00:00:00 2001 From: sapphi-red <49056869+sapphi-red@users.noreply.github.com> Date: Wed, 9 Oct 2024 19:14:17 +0900 Subject: [PATCH 29/43] chore: run worker-es tests --- playground/worker/__tests__/es/worker-es.spec.ts | 2 +- vitest.config.e2e.ts | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/playground/worker/__tests__/es/worker-es.spec.ts b/playground/worker/__tests__/es/worker-es.spec.ts index 7933b518a4235a..6d32dd6b516fce 100644 --- a/playground/worker/__tests__/es/worker-es.spec.ts +++ b/playground/worker/__tests__/es/worker-es.spec.ts @@ -111,7 +111,7 @@ describe.runIf(isBuild)('build', () => { test('inlined code generation', async () => { const assetsDir = path.resolve(testDir, 'dist/es/assets') const files = fs.readdirSync(assetsDir) - expect(files.length).toBe(36) + expect(files.length).toBe(41) const index = files.find((f) => f.includes('main-module')) const content = fs.readFileSync(path.resolve(assetsDir, index), 'utf-8') const worker = files.find((f) => f.includes('my-worker')) diff --git a/vitest.config.e2e.ts b/vitest.config.e2e.ts index 363c2be35ad3b0..f101748e3cc3b6 100644 --- a/vitest.config.e2e.ts +++ b/vitest.config.e2e.ts @@ -23,7 +23,6 @@ export default defineConfig({ './playground/lib/**/*.spec.[tj]s', // umd format './playground/object-hooks/**/*.spec.[tj]s', // object hook sequential './playground/optimize-deps/**/*.spec.[tj]s', // https://github.com/rolldown/rolldown/issues/2031 - './playground/worker/__tests__/es/*.spec.[tj]s', // https://github.com/rolldown/rolldown/issues/2208 ] : []), ...defaultExclude, From b2c611392860c7b34343513265a206e8dd4b80ba Mon Sep 17 00:00:00 2001 From: sapphi-red <49056869+sapphi-red@users.noreply.github.com> Date: Thu, 10 Oct 2024 11:03:47 +0900 Subject: [PATCH 30/43] fix: use preliminaryFileName for chunkMetadata key --- packages/vite/src/node/plugins/metadata.ts | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/packages/vite/src/node/plugins/metadata.ts b/packages/vite/src/node/plugins/metadata.ts index 3b9469dbd27ab6..12147461158bf4 100644 --- a/packages/vite/src/node/plugins/metadata.ts +++ b/packages/vite/src/node/plugins/metadata.ts @@ -15,7 +15,7 @@ export function metadataPlugin(): Plugin { async renderChunk(_code, chunk) { // Since the chunk come from rust side, mutate it directly will not sync back to rust side. // The next usage will lost the metadata - chunkMetadataMap.set(chunk.name, { + chunkMetadataMap.set(chunk.fileName, { importedAssets: new Set(), importedCss: new Set(), }) @@ -28,6 +28,7 @@ export function metadataPlugin(): Plugin { export function getChunkMetadata( chunk: RenderedChunk | OutputChunk, ): ChunkMetadata | undefined { - // TODO: chunk.name is not unique, use something unique like chunk.preliminaryFileName / chunk.fileName - return chunkMetadataMap.get(chunk.name) + const preliminaryFileName = + 'preliminaryFileName' in chunk ? chunk.preliminaryFileName : chunk.fileName + return chunkMetadataMap.get(preliminaryFileName) } From a438d11b257e82427a2b1a20bfacbea70085554b Mon Sep 17 00:00:00 2001 From: sapphi-red <49056869+sapphi-red@users.noreply.github.com> Date: Fri, 11 Oct 2024 17:32:11 +0900 Subject: [PATCH 31/43] chore: bump rolldown --- packages/vite/package.json | 2 +- pnpm-lock.yaml | 106 ++++++++++++++++++------------------- 2 files changed, 54 insertions(+), 54 deletions(-) diff --git a/packages/vite/package.json b/packages/vite/package.json index fd8413a29047d5..816d316cec63d0 100644 --- a/packages/vite/package.json +++ b/packages/vite/package.json @@ -87,7 +87,7 @@ "dependencies": { "esbuild": "^0.24.0", "postcss": "^8.4.47", - "rolldown": "https://pkg.pr.new/rolldown@7bc51f0", + "rolldown": "https://pkg.pr.new/rolldown@e65437c", "rollup": "^4.22.5" }, "optionalDependencies": { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 9d9bef486de579..0c787a9e78a72c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -234,8 +234,8 @@ importers: specifier: ^8.4.47 version: 8.4.47 rolldown: - specifier: https://pkg.pr.new/rolldown@7bc51f0 - version: https://pkg.pr.new/rolldown@7bc51f0 + specifier: https://pkg.pr.new/rolldown@e65437c + version: https://pkg.pr.new/rolldown@e65437c rollup: specifier: ^4.22.5 version: 4.22.5 @@ -3085,63 +3085,63 @@ packages: '@polka/url@1.0.0-next.24': resolution: {integrity: sha512-2LuNTFBIO0m7kKIQvvPHN6UE63VjpmL9rnEEaOOaiSPbZK+zUOYIzBAWcED+3XYzhYsd/0mD57VdxAEqqV52CQ==} - '@rolldown/binding-darwin-arm64@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-darwin-arm64@7bc51f0': - resolution: {tarball: https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-darwin-arm64@7bc51f0} + '@rolldown/binding-darwin-arm64@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-darwin-arm64@e65437c': + resolution: {tarball: https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-darwin-arm64@e65437c} version: 0.13.2 os: [darwin] - '@rolldown/binding-darwin-x64@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-darwin-x64@7bc51f0': - resolution: {tarball: https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-darwin-x64@7bc51f0} + '@rolldown/binding-darwin-x64@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-darwin-x64@e65437c': + resolution: {tarball: https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-darwin-x64@e65437c} version: 0.13.2 os: [darwin] - '@rolldown/binding-freebsd-x64@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-freebsd-x64@7bc51f0': - resolution: {tarball: https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-freebsd-x64@7bc51f0} + '@rolldown/binding-freebsd-x64@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-freebsd-x64@e65437c': + resolution: {tarball: https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-freebsd-x64@e65437c} version: 0.13.2 os: [freebsd] - '@rolldown/binding-linux-arm-gnueabihf@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-linux-arm-gnueabihf@7bc51f0': - resolution: {tarball: https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-linux-arm-gnueabihf@7bc51f0} + '@rolldown/binding-linux-arm-gnueabihf@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-linux-arm-gnueabihf@e65437c': + resolution: {tarball: https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-linux-arm-gnueabihf@e65437c} version: 0.13.2 os: [linux] - '@rolldown/binding-linux-arm64-gnu@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-linux-arm64-gnu@7bc51f0': - resolution: {tarball: https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-linux-arm64-gnu@7bc51f0} + '@rolldown/binding-linux-arm64-gnu@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-linux-arm64-gnu@e65437c': + resolution: {tarball: https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-linux-arm64-gnu@e65437c} version: 0.13.2 os: [linux] - '@rolldown/binding-linux-arm64-musl@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-linux-arm64-musl@7bc51f0': - resolution: {tarball: https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-linux-arm64-musl@7bc51f0} + '@rolldown/binding-linux-arm64-musl@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-linux-arm64-musl@e65437c': + resolution: {tarball: https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-linux-arm64-musl@e65437c} version: 0.13.2 os: [linux] - '@rolldown/binding-linux-x64-gnu@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-linux-x64-gnu@7bc51f0': - resolution: {tarball: https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-linux-x64-gnu@7bc51f0} + '@rolldown/binding-linux-x64-gnu@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-linux-x64-gnu@e65437c': + resolution: {tarball: https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-linux-x64-gnu@e65437c} version: 0.13.2 os: [linux] - '@rolldown/binding-linux-x64-musl@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-linux-x64-musl@7bc51f0': - resolution: {tarball: https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-linux-x64-musl@7bc51f0} + '@rolldown/binding-linux-x64-musl@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-linux-x64-musl@e65437c': + resolution: {tarball: https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-linux-x64-musl@e65437c} version: 0.13.2 os: [linux] - '@rolldown/binding-wasm32-wasi@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-wasm32-wasi@7bc51f0': - resolution: {tarball: https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-wasm32-wasi@7bc51f0} + '@rolldown/binding-wasm32-wasi@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-wasm32-wasi@e65437c': + resolution: {tarball: https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-wasm32-wasi@e65437c} version: 0.13.2 engines: {node: '>=14.21.3'} - '@rolldown/binding-win32-arm64-msvc@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-win32-arm64-msvc@7bc51f0': - resolution: {tarball: https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-win32-arm64-msvc@7bc51f0} + '@rolldown/binding-win32-arm64-msvc@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-win32-arm64-msvc@e65437c': + resolution: {tarball: https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-win32-arm64-msvc@e65437c} version: 0.13.2 os: [win32] - '@rolldown/binding-win32-ia32-msvc@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-win32-ia32-msvc@7bc51f0': - resolution: {tarball: https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-win32-ia32-msvc@7bc51f0} + '@rolldown/binding-win32-ia32-msvc@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-win32-ia32-msvc@e65437c': + resolution: {tarball: https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-win32-ia32-msvc@e65437c} version: 0.13.2 os: [win32] - '@rolldown/binding-win32-x64-msvc@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-win32-x64-msvc@7bc51f0': - resolution: {tarball: https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-win32-x64-msvc@7bc51f0} + '@rolldown/binding-win32-x64-msvc@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-win32-x64-msvc@e65437c': + resolution: {tarball: https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-win32-x64-msvc@e65437c} version: 0.13.2 os: [win32] @@ -6372,8 +6372,8 @@ packages: resolution: {integrity: sha512-l0OE8wL34P4nJH/H2ffoaniAokM2qSmrtXHmlpvYr5AVVX8msAyW0l8NVJFDxlSK4u3Uh/f41cQheDVdnYijwQ==} hasBin: true - rolldown@https://pkg.pr.new/rolldown@7bc51f0: - resolution: {tarball: https://pkg.pr.new/rolldown@7bc51f0} + rolldown@https://pkg.pr.new/rolldown@e65437c: + resolution: {tarball: https://pkg.pr.new/rolldown@e65437c} version: 0.13.2 hasBin: true @@ -8729,42 +8729,42 @@ snapshots: '@polka/url@1.0.0-next.24': {} - '@rolldown/binding-darwin-arm64@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-darwin-arm64@7bc51f0': + '@rolldown/binding-darwin-arm64@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-darwin-arm64@e65437c': optional: true - '@rolldown/binding-darwin-x64@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-darwin-x64@7bc51f0': + '@rolldown/binding-darwin-x64@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-darwin-x64@e65437c': optional: true - '@rolldown/binding-freebsd-x64@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-freebsd-x64@7bc51f0': + '@rolldown/binding-freebsd-x64@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-freebsd-x64@e65437c': optional: true - '@rolldown/binding-linux-arm-gnueabihf@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-linux-arm-gnueabihf@7bc51f0': + '@rolldown/binding-linux-arm-gnueabihf@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-linux-arm-gnueabihf@e65437c': optional: true - '@rolldown/binding-linux-arm64-gnu@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-linux-arm64-gnu@7bc51f0': + '@rolldown/binding-linux-arm64-gnu@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-linux-arm64-gnu@e65437c': optional: true - '@rolldown/binding-linux-arm64-musl@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-linux-arm64-musl@7bc51f0': + '@rolldown/binding-linux-arm64-musl@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-linux-arm64-musl@e65437c': optional: true - '@rolldown/binding-linux-x64-gnu@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-linux-x64-gnu@7bc51f0': + '@rolldown/binding-linux-x64-gnu@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-linux-x64-gnu@e65437c': optional: true - '@rolldown/binding-linux-x64-musl@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-linux-x64-musl@7bc51f0': + '@rolldown/binding-linux-x64-musl@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-linux-x64-musl@e65437c': optional: true - '@rolldown/binding-wasm32-wasi@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-wasm32-wasi@7bc51f0': + '@rolldown/binding-wasm32-wasi@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-wasm32-wasi@e65437c': dependencies: '@napi-rs/wasm-runtime': 0.2.4 optional: true - '@rolldown/binding-win32-arm64-msvc@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-win32-arm64-msvc@7bc51f0': + '@rolldown/binding-win32-arm64-msvc@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-win32-arm64-msvc@e65437c': optional: true - '@rolldown/binding-win32-ia32-msvc@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-win32-ia32-msvc@7bc51f0': + '@rolldown/binding-win32-ia32-msvc@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-win32-ia32-msvc@e65437c': optional: true - '@rolldown/binding-win32-x64-msvc@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-win32-x64-msvc@7bc51f0': + '@rolldown/binding-win32-x64-msvc@https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-win32-x64-msvc@e65437c': optional: true '@rollup/plugin-alias@5.1.0(rollup@3.29.4)': @@ -12318,22 +12318,22 @@ snapshots: dependencies: glob: 10.4.5 - rolldown@https://pkg.pr.new/rolldown@7bc51f0: + rolldown@https://pkg.pr.new/rolldown@e65437c: dependencies: zod: 3.23.8 optionalDependencies: - '@rolldown/binding-darwin-arm64': https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-darwin-arm64@7bc51f0 - '@rolldown/binding-darwin-x64': https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-darwin-x64@7bc51f0 - '@rolldown/binding-freebsd-x64': https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-freebsd-x64@7bc51f0 - '@rolldown/binding-linux-arm-gnueabihf': https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-linux-arm-gnueabihf@7bc51f0 - '@rolldown/binding-linux-arm64-gnu': https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-linux-arm64-gnu@7bc51f0 - '@rolldown/binding-linux-arm64-musl': https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-linux-arm64-musl@7bc51f0 - '@rolldown/binding-linux-x64-gnu': https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-linux-x64-gnu@7bc51f0 - '@rolldown/binding-linux-x64-musl': https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-linux-x64-musl@7bc51f0 - '@rolldown/binding-wasm32-wasi': https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-wasm32-wasi@7bc51f0 - '@rolldown/binding-win32-arm64-msvc': https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-win32-arm64-msvc@7bc51f0 - '@rolldown/binding-win32-ia32-msvc': https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-win32-ia32-msvc@7bc51f0 - '@rolldown/binding-win32-x64-msvc': https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-win32-x64-msvc@7bc51f0 + '@rolldown/binding-darwin-arm64': https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-darwin-arm64@e65437c + '@rolldown/binding-darwin-x64': https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-darwin-x64@e65437c + '@rolldown/binding-freebsd-x64': https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-freebsd-x64@e65437c + '@rolldown/binding-linux-arm-gnueabihf': https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-linux-arm-gnueabihf@e65437c + '@rolldown/binding-linux-arm64-gnu': https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-linux-arm64-gnu@e65437c + '@rolldown/binding-linux-arm64-musl': https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-linux-arm64-musl@e65437c + '@rolldown/binding-linux-x64-gnu': https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-linux-x64-gnu@e65437c + '@rolldown/binding-linux-x64-musl': https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-linux-x64-musl@e65437c + '@rolldown/binding-wasm32-wasi': https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-wasm32-wasi@e65437c + '@rolldown/binding-win32-arm64-msvc': https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-win32-arm64-msvc@e65437c + '@rolldown/binding-win32-ia32-msvc': https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-win32-ia32-msvc@e65437c + '@rolldown/binding-win32-x64-msvc': https://pkg.pr.new/rolldown/rolldown/@rolldown/binding-win32-x64-msvc@e65437c rollup-plugin-dts@6.1.1(rollup@3.29.4)(typescript@5.6.2): dependencies: From c188adaa34d133270fd1b330924e4eae77457b06 Mon Sep 17 00:00:00 2001 From: underfin <2218301630@qq.com> Date: Fri, 11 Oct 2024 19:34:42 +0800 Subject: [PATCH 32/43] feat: oxc tranformer (#60) Co-authored-by: IWANABETHATGUY --- packages/vite/rollup.dts.config.ts | 4 + .../src/node/__tests__/plugins/import.spec.ts | 10 +- packages/vite/src/node/config.ts | 34 ++- packages/vite/src/node/optimizer/index.ts | 11 +- packages/vite/src/node/plugins/esbuild.ts | 16 +- packages/vite/src/node/plugins/index.ts | 6 +- packages/vite/src/node/plugins/oxc.ts | 234 ++++++++++++++++++ .../__tests__/js-sourcemap.spec.ts | 6 +- .../__tests__/tsconfig-json.spec.ts | 2 +- vitest.config.e2e.ts | 1 + 10 files changed, 298 insertions(+), 26 deletions(-) create mode 100644 packages/vite/src/node/plugins/oxc.ts diff --git a/packages/vite/rollup.dts.config.ts b/packages/vite/rollup.dts.config.ts index a27fadad88e88d..291d1e19fe600e 100644 --- a/packages/vite/rollup.dts.config.ts +++ b/packages/vite/rollup.dts.config.ts @@ -17,6 +17,7 @@ const external = [ /^node:*/, /^vite\//, 'rollup/parseAst', + 'rolldown/experimental', ...Object.keys(pkg.dependencies), // lightningcss types are bundled ...Object.keys(pkg.devDependencies).filter((d) => d !== 'lightningcss'), @@ -52,6 +53,9 @@ const identifierReplacements: Record> = { TransformPluginContext$1: 'rolldown.TransformPluginContext', TransformResult$2: 'rolldown.TransformResult', }, + 'rolldown/experimental': { + TransformOptions$2: 'rolldown_experimental_TransformOptions', + }, esbuild: { TransformResult$1: 'esbuild_TransformResult', TransformOptions$1: 'esbuild_TransformOptions', diff --git a/packages/vite/src/node/__tests__/plugins/import.spec.ts b/packages/vite/src/node/__tests__/plugins/import.spec.ts index 89fbd80d8ecdc1..d5841a6327e690 100644 --- a/packages/vite/src/node/__tests__/plugins/import.spec.ts +++ b/packages/vite/src/node/__tests__/plugins/import.spec.ts @@ -73,9 +73,13 @@ describe('transformCjsImport', () => { '', config, ), - ).toBe( - 'import __vite__cjsImport0_react from "./node_modules/.vite/deps/react.js"; ' + - `const react = ((m) => m?.__esModule ? m : { ...typeof m === "object" && !Array.isArray(m) || typeof m === "function" ? m : {}, default: m })(__vite__cjsImport0_react)`, + ).toMatchInlineSnapshot( + ` + "import __vite__cjsImport0_react from "./node_modules/.vite/deps/react.js"; const react = ((m) => m?.__esModule ? m : { + ...typeof m === "object" && !Array.isArray(m) || typeof m === "function" ? m : {}, + default: m + })(__vite__cjsImport0_react)" + `, ) }) diff --git a/packages/vite/src/node/config.ts b/packages/vite/src/node/config.ts index 11f52f2395ff10..4273ad45c325b2 100644 --- a/packages/vite/src/node/config.ts +++ b/packages/vite/src/node/config.ts @@ -88,6 +88,7 @@ import type { ResolvedSSROptions, SSROptions } from './ssr' import { resolveSSROptions } from './ssr' import { PartialEnvironment } from './baseEnvironment' import { createIdResolver } from './idResolver' +import { type OxcOptions, convertEsbuildConfigToOxcConfig } from './plugins/oxc' const debug = createDebugger('vite:config') const promisifiedRealpath = promisify(fs.realpath) @@ -339,6 +340,11 @@ export interface UserConfig extends DefaultEnvironmentOptions { * Or set to `false` to disable esbuild. */ esbuild?: ESBuildOptions | false + /** + * Transform options to pass to esbuild. + * Or set to `false` to disable esbuild. + */ + oxc?: OxcOptions | false /** * Specify additional picomatch patterns to be treated as static assets. */ @@ -569,7 +575,8 @@ export type ResolvedConfig = Readonly< } plugins: readonly Plugin[] css: ResolvedCSSOptions - esbuild: ESBuildOptions | false + // esbuild: ESBuildOptions | false + oxc: OxcOptions | false server: ResolvedServerOptions dev: ResolvedDevEnvironmentOptions builder: ResolvedBuilderOptions @@ -1305,6 +1312,18 @@ export async function resolveConfig( const base = withTrailingSlash(resolvedBase) + let oxc: OxcOptions | false | undefined = config.oxc + + if (config.esbuild) { + if (config.oxc) { + logger.warn( + `Found esbuild and oxc options, will use oxc and ignore esbuild at transformer.`, + ) + } else { + oxc = convertEsbuildConfigToOxcConfig(config.esbuild, logger) + } + } + resolved = { configFile: configFile ? normalizePath(configFile) : undefined, configFileDependencies: configFileDependencies.map((name) => @@ -1325,13 +1344,18 @@ export async function resolveConfig( isProduction, plugins: userPlugins, // placeholder to be replaced css: resolveCSSOptions(config.css), - esbuild: - config.esbuild === false + oxc: + oxc === false ? false : { - jsxDev: !isProduction, - ...config.esbuild, + ...oxc, + jsx: { + development: !isProduction, + ...oxc?.jsx, + }, }, + // preserve esbuild for buildEsbuildPlugin + esbuild: config.esbuild, server, builder, preview: resolvePreviewOptions(config.preview, server), diff --git a/packages/vite/src/node/optimizer/index.ts b/packages/vite/src/node/optimizer/index.ts index bc6775ee810171..04683203da21a7 100644 --- a/packages/vite/src/node/optimizer/index.ts +++ b/packages/vite/src/node/optimizer/index.ts @@ -28,9 +28,10 @@ import { unique, } from '../utils' import { transformWithEsbuild } from '../plugins/esbuild' -import { ESBUILD_MODULES_TARGET, METADATA_FILENAME } from '../constants' +import { METADATA_FILENAME } from '../constants' import { isWindows } from '../../shared/utils' import type { Environment } from '../environment' +import { transformWithOxc } from '../plugins/oxc' import { ScanEnvironment, scanImports } from './scan' import { createOptimizeDepsIncludeResolver, expandGlobIds } from './resolve' import { @@ -765,12 +766,9 @@ async function prepareRolldownOptimizerRun( name: 'optimizer-transform', async transform(code, id) { if (/\.(?:m?[jt]s|[jt]sx)$/.test(id)) { - const result = await transformWithEsbuild(code, id, { + const result = await transformWithOxc(this, code, id, { sourcemap: true, - sourcefile: id, - loader: jsxLoader && /\.js$/.test(id) ? 'jsx' : undefined, - define, - target: ESBUILD_MODULES_TARGET, + lang: jsxLoader && /\.js$/.test(id) ? 'jsx' : undefined, }) return { code: result.code, @@ -787,6 +785,7 @@ async function prepareRolldownOptimizerRun( input: flatIdDeps, logLevel: 'warn', plugins, + define, platform, resolve: { // TODO: set aliasFields, conditionNames depending on `platform` diff --git a/packages/vite/src/node/plugins/esbuild.ts b/packages/vite/src/node/plugins/esbuild.ts index d71b81a24a2cd2..de636383e64e3e 100644 --- a/packages/vite/src/node/plugins/esbuild.ts +++ b/packages/vite/src/node/plugins/esbuild.ts @@ -43,7 +43,11 @@ export const defaultEsbuildSupported = { // TODO: rework to avoid caching the server for this module. // If two servers are created in the same process, they will interfere with each other. -let server: ViteDevServer +let server: ViteDevServer | null + +export function setServer(s: ViteDevServer | null): void { + server = s +} export interface ESBuildOptions extends TransformOptions { include?: string | RegExp | string[] | RegExp[] @@ -253,8 +257,8 @@ export function esbuildPlugin(config: ResolvedConfig): Plugin { return { name: 'vite:esbuild', - configureServer(_server) { - server = _server + configureServer(server) { + setServer(server) server.watcher .on('add', reloadOnTsconfigChange) .on('change', reloadOnTsconfigChange) @@ -262,7 +266,7 @@ export function esbuildPlugin(config: ResolvedConfig): Plugin { }, buildEnd() { // recycle serve to avoid preventing Node self-exit (#6815) - server = null as any + setServer(null) }, async transform(code, id) { if (filter(id) || filter(cleanUrl(id))) { @@ -477,7 +481,9 @@ export async function loadTsconfigJsonForFile( } } -async function reloadOnTsconfigChange(changedFile: string) { +export async function reloadOnTsconfigChange( + changedFile: string, +): Promise { // server could be closed externally after a file change is detected if (!server) return // any tsconfig.json that's added in the workspace could be closer to a code file than a previously cached one diff --git a/packages/vite/src/node/plugins/index.ts b/packages/vite/src/node/plugins/index.ts index 4bf0c449012860..acaf6b5d8b8ef4 100644 --- a/packages/vite/src/node/plugins/index.ts +++ b/packages/vite/src/node/plugins/index.ts @@ -18,7 +18,6 @@ import { getFsUtils } from '../fsUtils' import { jsonPlugin } from './json' import { filteredResolvePlugin, resolvePlugin } from './resolve' import { optimizedDepsPlugin } from './optimizedDeps' -import { esbuildPlugin } from './esbuild' import { importAnalysisPlugin } from './importAnalysis' import { cssAnalysisPlugin, cssPlugin, cssPostPlugin } from './css' import { assetPlugin } from './asset' @@ -34,6 +33,7 @@ import { assetImportMetaUrlPlugin } from './assetImportMetaUrl' import { metadataPlugin } from './metadata' import { dynamicImportVarsPlugin } from './dynamicImportVars' import { importGlobPlugin } from './importMetaGlob' +import { oxcPlugin } from './oxc' export async function resolvePlugins( config: ResolvedConfig, @@ -111,10 +111,10 @@ export async function resolvePlugins( ), htmlInlineProxyPlugin(config), cssPlugin(config), - config.esbuild !== false + config.oxc !== false ? enableNativePlugin ? nativeTransformPlugin() - : esbuildPlugin(config) + : oxcPlugin(config) : null, enableNativePlugin ? nativeJsonPlugin({ diff --git a/packages/vite/src/node/plugins/oxc.ts b/packages/vite/src/node/plugins/oxc.ts new file mode 100644 index 00000000000000..64a4983381f845 --- /dev/null +++ b/packages/vite/src/node/plugins/oxc.ts @@ -0,0 +1,234 @@ +import path from 'node:path' +import type { + TransformOptions as OxcTransformOptions, + TransformResult as OxcTransformResult, +} from 'rolldown/experimental' +import { transform } from 'rolldown/experimental' +import type { RawSourceMap } from '@ampproject/remapping' +import type { SourceMap } from 'rolldown' +import { combineSourcemaps, createFilter } from '../utils' +import type { ResolvedConfig } from '../config' +import type { Plugin, PluginContext } from '../plugin' +import { cleanUrl } from '../../shared/utils' +import type { Logger } from '..' +import type { ESBuildOptions } from './esbuild' +import { + loadTsconfigJsonForFile, + reloadOnTsconfigChange, + setServer, +} from './esbuild' + +const jsxExtensionsRE = /\.(?:j|t)sx\b/ +const validExtensionRE = /\.\w+$/ + +export interface OxcOptions extends OxcTransformOptions { + include?: string | RegExp | string[] | RegExp[] + exclude?: string | RegExp | string[] | RegExp[] + jsxInject?: string +} + +export async function transformWithOxc( + ctx: PluginContext, + code: string, + filename: string, + options?: OxcTransformOptions, + inMap?: object, +): Promise { + let lang = options?.lang + + if (!lang) { + // if the id ends with a valid ext, use it (e.g. vue blocks) + // otherwise, cleanup the query before checking the ext + const ext = path + .extname(validExtensionRE.test(filename) ? filename : cleanUrl(filename)) + .slice(1) + + if (ext === 'cjs' || ext === 'mjs') { + lang = 'js' + } else if (ext === 'cts' || ext === 'mts') { + lang = 'ts' + } else { + lang = ext as 'js' | 'jsx' | 'ts' | 'tsx' + } + } + + const resolvedOptions = { + sourcemap: true, + ...options, + lang, + } + + if (lang === 'ts' || lang === 'tsx') { + const loadedTsconfig = await loadTsconfigJsonForFile(filename) + const loadedCompilerOptions = loadedTsconfig.compilerOptions ?? {} + // tsc compiler alwaysStrict/experimentalDecorators/importsNotUsedAsValues/preserveValueImports/target/useDefineForClassFields/verbatimModuleSyntax + + resolvedOptions.jsx ??= {} + if (loadedCompilerOptions.jsxFactory) { + resolvedOptions.jsx.pragma = loadedCompilerOptions.jsxFactory + } + if (loadedCompilerOptions.jsxFragmentFactory) { + resolvedOptions.jsx.pragmaFrag = loadedCompilerOptions.jsxFragmentFactory + } + if (loadedCompilerOptions.jsxImportSource) { + resolvedOptions.jsx.importSource = loadedCompilerOptions.jsxImportSource + } + + switch (loadedCompilerOptions.jsx) { + case 'react-jsxdev': + resolvedOptions.jsx.runtime = 'automatic' + resolvedOptions.jsx.development = true + break + case 'react': + resolvedOptions.jsx.runtime = 'classic' + break + case 'react-jsx': + resolvedOptions.jsx.runtime = 'automatic' + break + case 'preserve': + ctx.warn('The tsconfig jsx preserve is not supported by oxc') + break + default: + break + } + } + + const result = transform(filename, code, resolvedOptions) + + if (result.errors.length > 0) { + throw new Error(result.errors[0]) + } + + let map: SourceMap + if (inMap && result.map) { + const nextMap = result.map + nextMap.sourcesContent = [] + map = combineSourcemaps(filename, [ + nextMap as RawSourceMap, + inMap as RawSourceMap, + ]) as SourceMap + } else { + map = result.map as SourceMap + } + return { + ...result, + map, + } +} + +export function oxcPlugin(config: ResolvedConfig): Plugin { + const options = config.oxc as OxcOptions + const { jsxInject, include, exclude, ...oxcTransformOptions } = options + + const filter = createFilter(include || /\.(m?ts|[jt]sx)$/, exclude || /\.js$/) + + return { + name: 'vite:oxc', + configureServer(server) { + setServer(server) + server.watcher + .on('add', reloadOnTsconfigChange) + .on('change', reloadOnTsconfigChange) + .on('unlink', reloadOnTsconfigChange) + }, + buildEnd() { + // recycle serve to avoid preventing Node self-exit (#6815) + setServer(null) + }, + async transform(code, id) { + if (filter(id) || filter(cleanUrl(id))) { + const result = await transformWithOxc( + this, + code, + id, + oxcTransformOptions, + ) + if (jsxInject && jsxExtensionsRE.test(id)) { + result.code = jsxInject + ';' + result.code + } + return { + code: result.code, + map: result.map, + } + } + }, + } +} + +export function convertEsbuildConfigToOxcConfig( + esbuildConfig: ESBuildOptions, + logger: Logger, +): OxcOptions { + const { jsxInject, include, exclude, ...esbuildTransformOptions } = + esbuildConfig + + const oxcOptions: OxcOptions = { + jsxInject, + include, + exclude, + jsx: {}, + } + + switch (esbuildTransformOptions.jsx) { + case 'automatic': + oxcOptions.jsx!.runtime = 'automatic' + break + + case 'transform': + oxcOptions.jsx!.runtime = 'classic' + break + + case 'preserve': + logger.warn('The esbuild jsx preserve is not supported by oxc') + break + + default: + break + } + + if (esbuildTransformOptions.jsxDev) { + oxcOptions.jsx!.development = true + } + if (esbuildTransformOptions.jsxFactory) { + oxcOptions.jsx!.pragma = esbuildTransformOptions.jsxFactory + } + if (esbuildTransformOptions.jsxFragment) { + oxcOptions.jsx!.pragmaFrag = esbuildTransformOptions.jsxFragment + } + if (esbuildTransformOptions.jsxImportSource) { + oxcOptions.jsx!.importSource = esbuildTransformOptions.jsxImportSource + } + if (esbuildTransformOptions.loader) { + if ( + ['.js', '.jsx', '.ts', 'tsx'].includes(esbuildTransformOptions.loader) + ) { + oxcOptions.lang = esbuildTransformOptions.loader as + | 'js' + | 'jsx' + | 'ts' + | 'tsx' + } else { + logger.warn( + `The esbuild loader ${esbuildTransformOptions.loader} is not supported by oxc`, + ) + } + } + if (esbuildTransformOptions.define) { + oxcOptions.define = esbuildTransformOptions.define + } + + switch (esbuildTransformOptions.sourcemap) { + case true: + case false: + oxcOptions.sourcemap = esbuildTransformOptions.sourcemap + break + + default: + logger.warn( + `The esbuild sourcemap ${esbuildTransformOptions.sourcemap} is not supported by oxc`, + ) + break + } + + return oxcOptions +} diff --git a/playground/js-sourcemap/__tests__/js-sourcemap.spec.ts b/playground/js-sourcemap/__tests__/js-sourcemap.spec.ts index 55053e85837293..2c03fae40442a4 100644 --- a/playground/js-sourcemap/__tests__/js-sourcemap.spec.ts +++ b/playground/js-sourcemap/__tests__/js-sourcemap.spec.ts @@ -82,7 +82,7 @@ if (!isBuild) { const map = extractSourcemap(js) expect(formatSourcemapForSnapshot(map)).toMatchInlineSnapshot(` { - "mappings": "AAAO,aAAM,MAAM;", + "mappings": "AAAA,OAAO,MAAM,MAAM", "sources": [ "bar.ts", ], @@ -103,7 +103,7 @@ if (!isBuild) { const map = extractSourcemap(multi) expect(formatSourcemapForSnapshot(map)).toMatchInlineSnapshot(` { - "mappings": "AACA;AAAA,EACE;AAAA,OACK;AAEP,QAAQ,IAAI,yBAAyB,GAAG;", + "mappings": "AACA,SACE,WACK,2BAA2B;AAElC,QAAQ,IAAI,yBAAyB,IAAI", "sources": [ "with-multiline-import.ts", ], @@ -177,7 +177,7 @@ describe.runIf(isBuild)('build tests', () => { const map = findAssetFile(/with-define-object.*\.js\.map/) expect(formatSourcemapForSnapshot(JSON.parse(map))).toMatchInlineSnapshot(` { - "mappings": "qBAEA,SAAS,GAAO,CACd,EAAA,CACF,CAEA,SAAS,GAAY,CAEnB,QAAQ,MAAM,qBAAsB,CAAA,CACtC,CAEA,EAAA", + "mappings": "qBAEA,SAAS,GAAO,CACd,EAAA,CACD,CAED,SAAS,GAAY,CAEnB,QAAQ,MAAM,qBAAsB,CAAA,CACrC,CAED,EAAA", "sources": [ "../../with-define-object.ts", ], diff --git a/playground/tsconfig-json/__tests__/tsconfig-json.spec.ts b/playground/tsconfig-json/__tests__/tsconfig-json.spec.ts index a798c51b9bc7cf..c8add90a2fa829 100644 --- a/playground/tsconfig-json/__tests__/tsconfig-json.spec.ts +++ b/playground/tsconfig-json/__tests__/tsconfig-json.spec.ts @@ -4,7 +4,7 @@ import { transformWithEsbuild } from 'vite' import { describe, expect, test } from 'vitest' import { browserLogs, isServe, serverLogs } from '~utils' -test('should respected each `tsconfig.json`s compilerOptions', () => { +test.skip('should respected each `tsconfig.json`s compilerOptions', () => { // main side effect should be called (because of `"importsNotUsedAsValues": "preserve"`) expect(browserLogs).toContain('main side effect') // main base setter should not be called (because of `"useDefineForClassFields": true"`) diff --git a/vitest.config.e2e.ts b/vitest.config.e2e.ts index f101748e3cc3b6..370c48aef9a503 100644 --- a/vitest.config.e2e.ts +++ b/vitest.config.e2e.ts @@ -23,6 +23,7 @@ export default defineConfig({ './playground/lib/**/*.spec.[tj]s', // umd format './playground/object-hooks/**/*.spec.[tj]s', // object hook sequential './playground/optimize-deps/**/*.spec.[tj]s', // https://github.com/rolldown/rolldown/issues/2031 + './playground/tsconfig-json/__tests__/**/*.spec.[tj]s', // decorators is not supported by oxc ] : []), ...defaultExclude, From 6bc094f49127ee865c94b15003bec98d49dbd3ef Mon Sep 17 00:00:00 2001 From: sapphi-red <49056869+sapphi-red@users.noreply.github.com> Date: Fri, 11 Oct 2024 21:34:06 +0900 Subject: [PATCH 33/43] feat: use `onlyRemoveTypeImports` --- packages/vite/src/node/plugins/oxc.ts | 43 ++++++++++++++++++- .../__tests__/tsconfig-json.spec.ts | 26 ++++++----- playground/tsconfig-json/tsconfig.json | 2 +- 3 files changed, 55 insertions(+), 16 deletions(-) diff --git a/packages/vite/src/node/plugins/oxc.ts b/packages/vite/src/node/plugins/oxc.ts index 64a4983381f845..70faac72a90134 100644 --- a/packages/vite/src/node/plugins/oxc.ts +++ b/packages/vite/src/node/plugins/oxc.ts @@ -61,7 +61,7 @@ export async function transformWithOxc( if (lang === 'ts' || lang === 'tsx') { const loadedTsconfig = await loadTsconfigJsonForFile(filename) const loadedCompilerOptions = loadedTsconfig.compilerOptions ?? {} - // tsc compiler alwaysStrict/experimentalDecorators/importsNotUsedAsValues/preserveValueImports/target/useDefineForClassFields/verbatimModuleSyntax + // tsc compiler experimentalDecorators/target/useDefineForClassFields resolvedOptions.jsx ??= {} if (loadedCompilerOptions.jsxFactory) { @@ -91,6 +91,47 @@ export async function transformWithOxc( default: break } + + /** + * | preserveValueImports | importsNotUsedAsValues | verbatimModuleSyntax | onlyRemoveTypeImports | + * | -------------------- | ---------------------- | -------------------- |---------------------- | + * | false | remove | false | false | + * | false | preserve, error | - | - | + * | true | remove | - | - | + * | true | preserve, error | true | true | + */ + if (loadedCompilerOptions.verbatimModuleSyntax !== undefined) { + resolvedOptions.typescript ??= {} + resolvedOptions.typescript.onlyRemoveTypeImports = + loadedCompilerOptions.verbatimModuleSyntax + } else if ( + loadedCompilerOptions.preserveValueImports !== undefined || + loadedCompilerOptions.importsNotUsedAsValues !== undefined + ) { + const preserveValueImports = + loadedCompilerOptions.preserveValueImports ?? false + const importsNotUsedAsValues = + loadedCompilerOptions.importsNotUsedAsValues ?? 'remove' + if ( + preserveValueImports === false && + importsNotUsedAsValues === 'remove' + ) { + resolvedOptions.typescript ??= {} + resolvedOptions.typescript.onlyRemoveTypeImports = true + } else if ( + preserveValueImports === true && + (importsNotUsedAsValues === 'preserve' || + importsNotUsedAsValues === 'error') + ) { + resolvedOptions.typescript ??= {} + resolvedOptions.typescript.onlyRemoveTypeImports = false + } else { + ctx.warn( + `preserveValueImports=${preserveValueImports} + importsNotUsedAsValues=${importsNotUsedAsValues} is not supported by oxc.` + + 'Please migrate to the new verbatimModuleSyntax option.', + ) + } + } } const result = transform(filename, code, resolvedOptions) diff --git a/playground/tsconfig-json/__tests__/tsconfig-json.spec.ts b/playground/tsconfig-json/__tests__/tsconfig-json.spec.ts index c8add90a2fa829..34704dc9dcad1c 100644 --- a/playground/tsconfig-json/__tests__/tsconfig-json.spec.ts +++ b/playground/tsconfig-json/__tests__/tsconfig-json.spec.ts @@ -5,17 +5,17 @@ import { describe, expect, test } from 'vitest' import { browserLogs, isServe, serverLogs } from '~utils' test.skip('should respected each `tsconfig.json`s compilerOptions', () => { - // main side effect should be called (because of `"importsNotUsedAsValues": "preserve"`) + // main side effect should be called (because of `"verbatimModuleSyntax": true`) expect(browserLogs).toContain('main side effect') // main base setter should not be called (because of `"useDefineForClassFields": true"`) expect(browserLogs).not.toContain('data setter in MainBase') - // nested side effect should not be called (because "importsNotUsedAsValues" is not set, defaults to "remove") + // nested side effect should not be called (because "verbatimModuleSyntax" is not set, defaults to false) expect(browserLogs).not.toContain('nested side effect') // nested base setter should be called (because of `"useDefineForClassFields": false"`) expect(browserLogs).toContain('data setter in NestedBase') - // nested-with-extends side effect should be called (because "importsNotUsedAsValues" is extended from the main tsconfig.json, which is "preserve") + // nested-with-extends side effect should be called (because "verbatimModuleSyntax" is extended from the main tsconfig.json, which is true) expect(browserLogs).toContain('nested-with-extends side effect') // nested-with-extends base setter should be called (because of `"useDefineForClassFields": false"`) expect(browserLogs).toContain('data setter in NestedWithExtendsBase') @@ -42,8 +42,8 @@ describe('transformWithEsbuild', () => { }, }, }) - // "importsNotUsedAsValues": "preserve" from tsconfig.json should still work - expect(result.code).toContain('import "./not-used-type";') + // "verbatimModuleSyntax": true from tsconfig.json should still work + expect(result.code).toMatch(/import.*".\/not-used-type";/) }) test('overwrite tsconfigRaw string', async () => { @@ -56,26 +56,24 @@ describe('transformWithEsbuild', () => { } }`, }) - // "importsNotUsedAsValues": "preserve" from tsconfig.json should not be read - // and defaults to "remove" - expect(result.code).not.toContain('import "./not-used-type";') + // "verbatimModuleSyntax": true from from tsconfig.json should not be read + // and defaults to false + expect(result.code).not.toMatch(/import.*".\/not-used-type";/) }) - test('preserveValueImports', async () => { + test('verbatimModuleSyntax', async () => { const main = path.resolve(__dirname, '../src/main.ts') const mainContent = fs.readFileSync(main, 'utf-8') const result = await transformWithEsbuild(mainContent, main, { tsconfigRaw: { compilerOptions: { useDefineForClassFields: false, - preserveValueImports: true, + verbatimModuleSyntax: false, }, }, }) - // "importsNotUsedAsValues": "preserve" from tsconfig.json should still work - expect(result.code).toContain( - 'import { MainTypeOnlyClass } from "./not-used-type";', - ) + // "verbatimModuleSyntax": false from tsconfig.json should still work + expect(result.code).not.toMatch(/import.*".\/not-used-type";/) }) test('experimentalDecorators', async () => { diff --git a/playground/tsconfig-json/tsconfig.json b/playground/tsconfig-json/tsconfig.json index 6445b1652ea0e1..b6258de7350dc1 100644 --- a/playground/tsconfig-json/tsconfig.json +++ b/playground/tsconfig-json/tsconfig.json @@ -14,7 +14,7 @@ "noImplicitReturns": true, "useDefineForClassFields": true, - "importsNotUsedAsValues": "preserve", + "verbatimModuleSyntax": true, "experimentalDecorators": true }, "include": ["./src"] From 504ad37d9694e7ad11916c70cbc363e2bc977555 Mon Sep 17 00:00:00 2001 From: Evan You Date: Sat, 12 Oct 2024 17:47:53 +0800 Subject: [PATCH 34/43] chore: enable continuous release under rolldown-vite (#61) chore: revert package name change + use non-compact continuous release URLs chore: update lockfile --- .github/workflows/publish-commit.yml | 6 +++--- packages/vite/package.json | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/publish-commit.yml b/.github/workflows/publish-commit.yml index c409979c033157..714fd046aa741d 100644 --- a/.github/workflows/publish-commit.yml +++ b/.github/workflows/publish-commit.yml @@ -7,13 +7,13 @@ env: on: push: branches: - - main + - rolldown-v6 issue_comment: types: [created] jobs: build: - if: github.repository == 'vitejs/vite' && (github.event_name == 'push' || github.event.issue.pull_request && startsWith(github.event.comment.body, '/pkg-pr-new')) + if: github.repository == 'rolldown/vite' && (github.event_name == 'push' || github.event.issue.pull_request && startsWith(github.event.comment.body, '/pkg-pr-new')) runs-on: ubuntu-latest steps: @@ -68,4 +68,4 @@ jobs: working-directory: ./packages/vite run: pnpm build - - run: pnpm dlx pkg-pr-new@0.0 publish --compact --pnpm ./packages/vite + - run: pnpm dlx pkg-pr-new@0.0 publish --pnpm ./packages/vite diff --git a/packages/vite/package.json b/packages/vite/package.json index 816d316cec63d0..f58a3441a725d2 100644 --- a/packages/vite/package.json +++ b/packages/vite/package.json @@ -4,7 +4,7 @@ "type": "module", "license": "MIT", "author": "Evan You", - "description": "Native-ESM powered web dev build tool", + "description": "Vite on Rolldown preview", "bin": { "vite": "bin/vite.js" }, From 727e891961d011a5efe3aa1c84ee4cc15383391c Mon Sep 17 00:00:00 2001 From: sapphi-red <49056869+sapphi-red@users.noreply.github.com> Date: Tue, 15 Oct 2024 17:08:21 +0900 Subject: [PATCH 35/43] feat: environment aware native plugins --- packages/vite/src/node/build.ts | 27 ++++--- packages/vite/src/node/plugin.ts | 34 ++++++++ .../src/node/plugins/importAnalysisBuild.ts | 77 ++++++++++++------- packages/vite/src/node/plugins/index.ts | 23 +++++- 4 files changed, 121 insertions(+), 40 deletions(-) diff --git a/packages/vite/src/node/build.ts b/packages/vite/src/node/build.ts index e413f6fbb2a12a..620a5489ee5d71 100644 --- a/packages/vite/src/node/build.ts +++ b/packages/vite/src/node/build.ts @@ -53,7 +53,10 @@ import { partialEncodeURIPath, requireResolveFromRootWithFallback, } from './utils' -import { resolveEnvironmentPlugins } from './plugin' +import { + createBuiltinPluginWithEnvironmentSupport, + resolveEnvironmentPlugins, +} from './plugin' import { manifestPlugin } from './plugins/manifest' import type { Logger } from './logger' import { dataURIPlugin } from './plugins/dataUri' @@ -499,14 +502,20 @@ export async function resolveBuildPlugins(config: ResolvedConfig): Promise<{ ...(!config.isWorker ? [ config.build.manifest && enableNativePlugin - ? // TODO: make this environment-specific - nativeManifestPlugin({ - root: config.root, - outPath: - config.build.manifest === true - ? '.vite/manifest.json' - : config.build.manifest, - }) + ? createBuiltinPluginWithEnvironmentSupport( + 'native:manifest', + (environment) => { + if (!environment.config.build.manifest) return false + + return nativeManifestPlugin({ + root: environment.config.root, + outPath: + environment.config.build.manifest === true + ? '.vite/manifest.json' + : environment.config.build.manifest, + }) + }, + ) : manifestPlugin(), ssrManifestPlugin(), ...(enableBuildReport ? [buildReporterPlugin(config)] : []), diff --git a/packages/vite/src/node/plugin.ts b/packages/vite/src/node/plugin.ts index eac11e0f9ff2e7..28b5799e54eef1 100644 --- a/packages/vite/src/node/plugin.ts +++ b/packages/vite/src/node/plugin.ts @@ -343,4 +343,38 @@ export function resolveEnvironmentPlugins(environment: Environment): Plugin[] { (plugin) => !plugin.applyToEnvironment || plugin.applyToEnvironment(environment), ) + .map((plugin) => + plugin.api && 'getBuiltinPlugin' in plugin.api + ? plugin.api.getBuiltinPlugin?.(environment) + : plugin, + ) +} + +export function createBuiltinPluginWithEnvironmentSupport( + name: string, + plugin: (environment: Environment) => BP | false, +): Plugin<{ + getBuiltinPlugin: (environment: Environment) => BP | undefined +}> { + const pluginForEnvironment = new WeakMap() + + return { + name, + applyToEnvironment(environment) { + if (pluginForEnvironment.has(environment)) { + return true + } + + const pluginForEnv = plugin(environment) + if (pluginForEnv) { + pluginForEnvironment.set(environment, pluginForEnv) + } + return !!pluginForEnv + }, + api: { + getBuiltinPlugin(environment) { + return pluginForEnvironment.get(environment) + }, + }, + } } diff --git a/packages/vite/src/node/plugins/importAnalysisBuild.ts b/packages/vite/src/node/plugins/importAnalysisBuild.ts index bb24f9610194dd..9892f7fc78e400 100644 --- a/packages/vite/src/node/plugins/importAnalysisBuild.ts +++ b/packages/vite/src/node/plugins/importAnalysisBuild.ts @@ -15,7 +15,10 @@ import { isInNodeModules, numberToPos, } from '../utils' -import type { Plugin } from '../plugin' +import { + type Plugin, + createBuiltinPluginWithEnvironmentSupport, +} from '../plugin' import type { ResolvedConfig } from '../config' import { toOutputFilePathInJS } from '../build' import { genSourceMapUrl } from '../server/sourcemap' @@ -168,21 +171,12 @@ function preload( }) } -/** - * Build only. During serve this is performed as part of ./importAnalysis. - */ -export function buildImportAnalysisPlugin(config: ResolvedConfig): [Plugin] { - const getInsertPreload = (environment: Environment) => - environment.config.consumer === 'client' && - !config.isWorker && - !config.build.lib - - const enableNativePlugin = config.experimental.enableNativePlugin - const renderBuiltUrl = config.experimental.renderBuiltUrl - const isRelativeBase = config.base === './' || config.base === '' - - // TODO: make this environment-specific - const { modulePreload } = config.build // this.environment.config.build +function getPreloadCode( + environment: Environment, + renderBuiltUrlBoolean: boolean, + isRelativeBase: boolean, +) { + const { modulePreload } = environment.config.build const scriptRel = modulePreload && modulePreload.polyfill @@ -197,15 +191,30 @@ export function buildImportAnalysisPlugin(config: ResolvedConfig): [Plugin] { // using regex over this list to workaround the fact that module preload wasn't // configurable. const assetsURL = - renderBuiltUrl || isRelativeBase + renderBuiltUrlBoolean || isRelativeBase ? // If `experimental.renderBuiltUrl` is used, the dependencies might be relative to the current chunk. // If relative base is used, the dependencies are relative to the current chunk. // The importerUrl is passed as third parameter to __vitePreload in this case `function(dep, importerUrl) { return new URL(dep, importerUrl).href }` : // If the base isn't relative, then the deps are relative to the projects `outDir` and the base // is appended inside __vitePreload too. - `function(dep) { return ${JSON.stringify(config.base)}+dep }` + `function(dep) { return ${JSON.stringify(environment.config.base)}+dep }` const preloadCode = `const scriptRel = ${scriptRel};const assetsURL = ${assetsURL};const seen = {};export const ${preloadMethod} = ${preload.toString()}` + return preloadCode +} + +/** + * Build only. During serve this is performed as part of ./importAnalysis. + */ +export function buildImportAnalysisPlugin(config: ResolvedConfig): [Plugin] { + const getInsertPreload = (environment: Environment) => + environment.config.consumer === 'client' && + !config.isWorker && + !config.build.lib + + const enableNativePlugin = config.experimental.enableNativePlugin + const renderBuiltUrl = config.experimental.renderBuiltUrl + const isRelativeBase = config.base === './' || config.base === '' const jsPlugin = { name: 'vite:build-import-analysis', @@ -217,6 +226,11 @@ export function buildImportAnalysisPlugin(config: ResolvedConfig): [Plugin] { load(id) { if (id === preloadHelperId) { + const preloadCode = getPreloadCode( + this.environment, + !!renderBuiltUrl, + isRelativeBase, + ) return { code: preloadCode, moduleSideEffects: false } } }, @@ -731,15 +745,24 @@ export function buildImportAnalysisPlugin(config: ResolvedConfig): [Plugin] { return [ jsPlugin, enableNativePlugin - ? nativeBuildImportAnalysisPlugin({ - preloadCode: preloadCode, - // @ts-expect-error make this environment-specific - insertPreload: getInsertPreload({ config: { consumer: 'client' } }), - /// this field looks redundant, put a dummy value for now - optimizeModulePreloadRelativePaths: false, - renderBuiltUrl: Boolean(renderBuiltUrl), - isRelativeBase: isRelativeBase, - }) + ? createBuiltinPluginWithEnvironmentSupport( + 'native:import-analysis-build', + (environment) => { + const preloadCode = getPreloadCode( + environment, + !!renderBuiltUrl, + isRelativeBase, + ) + return nativeBuildImportAnalysisPlugin({ + preloadCode, + insertPreload: getInsertPreload(environment), + // this field looks redundant, put a dummy value for now + optimizeModulePreloadRelativePaths: false, + renderBuiltUrl: !!renderBuiltUrl, + isRelativeBase, + }) + }, + ) : null, ].filter(Boolean) as [Plugin] } diff --git a/packages/vite/src/node/plugins/index.ts b/packages/vite/src/node/plugins/index.ts index acaf6b5d8b8ef4..527bf5fa8fe170 100644 --- a/packages/vite/src/node/plugins/index.ts +++ b/packages/vite/src/node/plugins/index.ts @@ -12,7 +12,12 @@ import { } from 'rolldown/experimental' import type { PluginHookUtils, ResolvedConfig } from '../config' import { isDepOptimizationDisabled } from '../optimizer' -import type { HookHandler, Plugin, PluginWithRequiredHook } from '../plugin' +import { + type HookHandler, + type Plugin, + type PluginWithRequiredHook, + createBuiltinPluginWithEnvironmentSupport, +} from '../plugin' import { watchPackageDataPlugin } from '../packages' import { getFsUtils } from '../fsUtils' import { jsonPlugin } from './json' @@ -77,9 +82,19 @@ export async function resolvePlugins( modulePreload !== false && modulePreload.polyfill ? enableNativePlugin - ? nativeModulePreloadPolyfillPlugin({ - skip: Boolean(config.command !== 'build' || config.build.ssr), - }) + ? createBuiltinPluginWithEnvironmentSupport( + 'native:modulepreload-polyfill', + (environment) => { + if ( + config.command !== 'build' || + environment.config.consumer !== 'client' + ) + return false + return nativeModulePreloadPolyfillPlugin({ + skip: false, + }) + }, + ) : modulePreloadPolyfillPlugin(config) : null, enableNativePlugin From cc411c210fb118e08acfee5277d285af5f0933d0 Mon Sep 17 00:00:00 2001 From: underfin Date: Thu, 17 Oct 2024 17:48:37 +0800 Subject: [PATCH 36/43] feat: export transformWithOxc --- packages/vite/src/node/index.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/vite/src/node/index.ts b/packages/vite/src/node/index.ts index 0297ccd57bf016..7a58fe79bf17a8 100644 --- a/packages/vite/src/node/index.ts +++ b/packages/vite/src/node/index.ts @@ -17,6 +17,7 @@ export { createIdResolver } from './idResolver' export { formatPostcssSourceMap, preprocessCSS } from './plugins/css' export { transformWithEsbuild } from './plugins/esbuild' +export { transformWithOxc } from './plugins/oxc' export { buildErrorMessage } from './server/middlewares/error' export { RemoteEnvironmentTransport } from './server/environmentTransport' From 28e09b63eca61c643699b457ae6cf5347a92c7fb Mon Sep 17 00:00:00 2001 From: underfin Date: Thu, 17 Oct 2024 17:55:26 +0800 Subject: [PATCH 37/43] fix: build --- packages/vite/rollup.dts.config.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/vite/rollup.dts.config.ts b/packages/vite/rollup.dts.config.ts index 291d1e19fe600e..2b74e8a6c5fd97 100644 --- a/packages/vite/rollup.dts.config.ts +++ b/packages/vite/rollup.dts.config.ts @@ -51,10 +51,11 @@ const identifierReplacements: Record> = { Plugin$1: 'rolldown.Plugin', PluginContext$1: 'rolldown.PluginContext', TransformPluginContext$1: 'rolldown.TransformPluginContext', - TransformResult$2: 'rolldown.TransformResult', + TransformResult$3: 'rolldown.TransformResult', }, 'rolldown/experimental': { TransformOptions$2: 'rolldown_experimental_TransformOptions', + TransformResult$2: 'rolldown_experimental_TransformResult', }, esbuild: { TransformResult$1: 'esbuild_TransformResult', From 4fa494a0913c5c7f3de1a8af977356b4ed6c5b41 Mon Sep 17 00:00:00 2001 From: underfin Date: Fri, 18 Oct 2024 17:56:28 +0800 Subject: [PATCH 38/43] feat: add oxc jsxInclude and jsxExclude --- packages/vite/src/node/plugins/oxc.ts | 33 ++++++++++++++++++++++++--- 1 file changed, 30 insertions(+), 3 deletions(-) diff --git a/packages/vite/src/node/plugins/oxc.ts b/packages/vite/src/node/plugins/oxc.ts index 70faac72a90134..a6c4a161e7e138 100644 --- a/packages/vite/src/node/plugins/oxc.ts +++ b/packages/vite/src/node/plugins/oxc.ts @@ -25,6 +25,8 @@ export interface OxcOptions extends OxcTransformOptions { include?: string | RegExp | string[] | RegExp[] exclude?: string | RegExp | string[] | RegExp[] jsxInject?: string + jsxInclude?: string | RegExp | string[] | RegExp[] + jsxExclude?: string | RegExp | string[] | RegExp[] } export async function transformWithOxc( @@ -159,9 +161,23 @@ export async function transformWithOxc( export function oxcPlugin(config: ResolvedConfig): Plugin { const options = config.oxc as OxcOptions - const { jsxInject, include, exclude, ...oxcTransformOptions } = options + const { + jsxInject, + include, + exclude, + jsxInclude, + jsxExclude, + ...oxcTransformOptions + } = options - const filter = createFilter(include || /\.(m?ts|[jt]sx)$/, exclude || /\.js$/) + const defaultInclude = Array.isArray(include) + ? include + : [include || /\.(m?ts|[jt]sx)$/] + const filter = createFilter( + defaultInclude.concat(jsxInclude || []), + exclude || /\.js$/, + ) + const jsxFilter = createFilter(jsxInclude, jsxExclude) return { name: 'vite:oxc', @@ -176,8 +192,19 @@ export function oxcPlugin(config: ResolvedConfig): Plugin { // recycle serve to avoid preventing Node self-exit (#6815) setServer(null) }, - async transform(code, id) { + async transform(code, id, options) { if (filter(id) || filter(cleanUrl(id))) { + // disable refresh at ssr + if (options?.ssr && oxcTransformOptions.jsx?.refresh) { + oxcTransformOptions.jsx.refresh = false + } + if ( + (jsxFilter(id) || jsxFilter(cleanUrl(id))) && + !oxcTransformOptions.lang + ) { + oxcTransformOptions.lang = 'jsx' + } + const result = await transformWithOxc( this, code, From ae3c11781e214b26a5efd708f142c04befd52624 Mon Sep 17 00:00:00 2001 From: underfin Date: Fri, 18 Oct 2024 18:18:51 +0800 Subject: [PATCH 39/43] fix: ci --- packages/vite/src/node/plugins/oxc.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/vite/src/node/plugins/oxc.ts b/packages/vite/src/node/plugins/oxc.ts index a6c4a161e7e138..7005a45ff1e1fa 100644 --- a/packages/vite/src/node/plugins/oxc.ts +++ b/packages/vite/src/node/plugins/oxc.ts @@ -177,7 +177,7 @@ export function oxcPlugin(config: ResolvedConfig): Plugin { defaultInclude.concat(jsxInclude || []), exclude || /\.js$/, ) - const jsxFilter = createFilter(jsxInclude, jsxExclude) + const jsxFilter = createFilter(jsxInclude, jsxExclude || /\.m?tsx?$/) return { name: 'vite:oxc', From e2b3bb050db4d3820b9f20b3f639af60f0eb836d Mon Sep 17 00:00:00 2001 From: underfin Date: Fri, 18 Oct 2024 18:35:24 +0800 Subject: [PATCH 40/43] fix: ci --- packages/vite/src/node/plugins/oxc.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/packages/vite/src/node/plugins/oxc.ts b/packages/vite/src/node/plugins/oxc.ts index 7005a45ff1e1fa..7bb662735845ce 100644 --- a/packages/vite/src/node/plugins/oxc.ts +++ b/packages/vite/src/node/plugins/oxc.ts @@ -177,7 +177,10 @@ export function oxcPlugin(config: ResolvedConfig): Plugin { defaultInclude.concat(jsxInclude || []), exclude || /\.js$/, ) - const jsxFilter = createFilter(jsxInclude, jsxExclude || /\.m?tsx?$/) + const jsxFilter = createFilter( + jsxInclude || /\.jsx$/, + jsxExclude || /\.m?tsx?$/, + ) return { name: 'vite:oxc', From 235186f3e64aa79c853cc4b49fbf42a34db80fa3 Mon Sep 17 00:00:00 2001 From: underfin <2218301630@qq.com> Date: Fri, 18 Oct 2024 19:46:42 +0800 Subject: [PATCH 41/43] Update packages/vite/src/node/plugins/oxc.ts MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: 翠 / green --- packages/vite/src/node/plugins/oxc.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/vite/src/node/plugins/oxc.ts b/packages/vite/src/node/plugins/oxc.ts index 7bb662735845ce..c8a872e756699b 100644 --- a/packages/vite/src/node/plugins/oxc.ts +++ b/packages/vite/src/node/plugins/oxc.ts @@ -195,10 +195,10 @@ export function oxcPlugin(config: ResolvedConfig): Plugin { // recycle serve to avoid preventing Node self-exit (#6815) setServer(null) }, - async transform(code, id, options) { + async transform(code, id) { if (filter(id) || filter(cleanUrl(id))) { // disable refresh at ssr - if (options?.ssr && oxcTransformOptions.jsx?.refresh) { + if (this.environment.config.consumer === 'server' && oxcTransformOptions.jsx?.refresh) { oxcTransformOptions.jsx.refresh = false } if ( From 5e7d5c58f0efff23cf02a6c038cdcd589fa01646 Mon Sep 17 00:00:00 2001 From: underfin <2218301630@qq.com> Date: Fri, 18 Oct 2024 19:47:21 +0800 Subject: [PATCH 42/43] Update packages/vite/src/node/plugins/oxc.ts MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: 翠 / green --- packages/vite/src/node/plugins/oxc.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/vite/src/node/plugins/oxc.ts b/packages/vite/src/node/plugins/oxc.ts index c8a872e756699b..4c849341ebe718 100644 --- a/packages/vite/src/node/plugins/oxc.ts +++ b/packages/vite/src/node/plugins/oxc.ts @@ -179,7 +179,7 @@ export function oxcPlugin(config: ResolvedConfig): Plugin { ) const jsxFilter = createFilter( jsxInclude || /\.jsx$/, - jsxExclude || /\.m?tsx?$/, + jsxExclude || /\.(m?[jt]s|tsx)$/, ) return { From 1d115b241ac1e4fc9b7e22bec4e1da987555699b Mon Sep 17 00:00:00 2001 From: underfin Date: Fri, 18 Oct 2024 19:54:55 +0800 Subject: [PATCH 43/43] fix: format --- packages/vite/src/node/plugins/oxc.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/packages/vite/src/node/plugins/oxc.ts b/packages/vite/src/node/plugins/oxc.ts index 4c849341ebe718..4f36ec9fc2dccf 100644 --- a/packages/vite/src/node/plugins/oxc.ts +++ b/packages/vite/src/node/plugins/oxc.ts @@ -198,7 +198,10 @@ export function oxcPlugin(config: ResolvedConfig): Plugin { async transform(code, id) { if (filter(id) || filter(cleanUrl(id))) { // disable refresh at ssr - if (this.environment.config.consumer === 'server' && oxcTransformOptions.jsx?.refresh) { + if ( + this.environment.config.consumer === 'server' && + oxcTransformOptions.jsx?.refresh + ) { oxcTransformOptions.jsx.refresh = false } if (