Urara-Blog/node_modules/.pnpm-store/v3/files/60/e3627de61fe2fc7f0c6a5ec10d93fc5ffa54a8e4b5d2200d89b7a840cff0714fb63e23f97d19fb05dbb012c36b6d06334b829ebde5e275fe47e109fbf1cb16
2022-08-14 01:14:53 +08:00

84 lines
2.6 KiB
Text

import { promises as fs } from 'fs';
import { compile, preprocess } from 'svelte/compiler';
import { DepOptimizationOptions } from 'vite';
import { Compiled } from './compile';
import { log } from './log';
import { CompileOptions, ResolvedOptions } from './options';
import { toESBuildError } from './error';
type EsbuildOptions = NonNullable<DepOptimizationOptions['esbuildOptions']>;
type EsbuildPlugin = NonNullable<EsbuildOptions['plugins']>[number];
export const facadeEsbuildSveltePluginName = 'vite-plugin-svelte:facade';
export function esbuildSveltePlugin(options: ResolvedOptions): EsbuildPlugin {
return {
name: 'vite-plugin-svelte:optimize-svelte',
setup(build) {
// Skip in scanning phase as Vite already handles scanning Svelte files.
// Otherwise this would heavily slow down the scanning phase.
if (build.initialOptions.plugins?.some((v) => v.name === 'vite:dep-scan')) return;
const svelteExtensions = (options.extensions ?? ['.svelte']).map((ext) => ext.slice(1));
const svelteFilter = new RegExp(`\\.(` + svelteExtensions.join('|') + `)(\\?.*)?$`);
build.onLoad({ filter: svelteFilter }, async ({ path: filename }) => {
const code = await fs.readFile(filename, 'utf8');
try {
const contents = await compileSvelte(options, { filename, code });
return { contents };
} catch (e) {
return { errors: [toESBuildError(e, options)] };
}
});
}
};
}
async function compileSvelte(
options: ResolvedOptions,
{ filename, code }: { filename: string; code: string }
): Promise<string> {
const compileOptions: CompileOptions = {
...options.compilerOptions,
css: true,
filename,
format: 'esm',
generate: 'dom'
};
let preprocessed;
if (options.preprocess) {
try {
preprocessed = await preprocess(code, options.preprocess, { filename });
} catch (e) {
e.message = `Error while preprocessing ${filename}${e.message ? ` - ${e.message}` : ''}`;
throw e;
}
if (preprocessed.map) compileOptions.sourcemap = preprocessed.map;
}
const finalCode = preprocessed ? preprocessed.code : code;
const dynamicCompileOptions = await options.experimental?.dynamicCompileOptions?.({
filename,
code: finalCode,
compileOptions
});
if (dynamicCompileOptions && log.debug.enabled) {
log.debug(`dynamic compile options for ${filename}: ${JSON.stringify(dynamicCompileOptions)}`);
}
const finalCompileOptions = dynamicCompileOptions
? {
...compileOptions,
...dynamicCompileOptions
}
: compileOptions;
const compiled = compile(finalCode, finalCompileOptions) as Compiled;
return compiled.js.code + '//# sourceMappingURL=' + compiled.js.map.toUrl();
}