var __create = Object.create; var __defProp = Object.defineProperty; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __getOwnPropNames = Object.getOwnPropertyNames; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropSymbols = Object.getOwnPropertySymbols; var __propIsEnum = Object.prototype.propertyIsEnumerable; var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, {enumerable: true, configurable: true, writable: true, value}) : obj[key] = value; var __assign = (a, b) => { for (var prop in b || (b = {})) if (__hasOwnProp.call(b, prop)) __defNormalProp(a, prop, b[prop]); if (__getOwnPropSymbols) for (var prop of __getOwnPropSymbols(b)) { if (__propIsEnum.call(b, prop)) __defNormalProp(a, prop, b[prop]); } return a; }; var __markAsModule = (target) => __defProp(target, "__esModule", {value: true}); var __export = (target, all) => { for (var name in all) __defProp(target, name, {get: all[name], enumerable: true}); }; var __exportStar = (target, module2, desc) => { if (module2 && typeof module2 === "object" || typeof module2 === "function") { for (let key of __getOwnPropNames(module2)) if (!__hasOwnProp.call(target, key) && key !== "default") __defProp(target, key, {get: () => module2[key], enumerable: !(desc = __getOwnPropDesc(module2, key)) || desc.enumerable}); } return target; }; var __toModule = (module2) => { return __exportStar(__markAsModule(__defProp(module2 != null ? __create(__getProtoOf(module2)) : {}, "default", module2 && module2.__esModule && "default" in module2 ? {get: () => module2.default, enumerable: true} : {value: module2, enumerable: true})), module2); }; // src/index.ts __markAsModule(exports); __export(exports, { default: () => vitePluginSvelte }); var path2 = __toModule(require("path")); var relative = __toModule(require("require-relative")); // src/utils/log.ts var import_chalk = __toModule(require("chalk")); var import_debug = __toModule(require("debug")); var levels = ["debug", "info", "warn", "error", "silent"]; var prefix = "vite-plugin-svelte"; var loggers = { debug: { log: (0, import_debug.default)(`vite:${prefix}`), enabled: false, isDebug: true }, info: { color: import_chalk.default.cyan, log: console.log, enabled: true }, warn: { color: import_chalk.default.yellow, log: console.warn, enabled: true }, error: { color: import_chalk.default.red, log: console.error, enabled: true }, silent: { enabled: false } }; var _level = "info"; function setLevel(level) { if (level === _level) { return; } const levelIndex = levels.indexOf(level); if (levelIndex > -1) { _level = level; for (let i = 0; i < levels.length; i++) { loggers[levels[i]].enabled = i >= levelIndex; } } else { _log(loggers.error, `invalid log level: ${level} `); } } var _viteLogOverwriteProtection = false; function setViteLogOverwriteProtection(viteLogOverwriteProtection) { _viteLogOverwriteProtection = viteLogOverwriteProtection; } function _log(logger, message, payload) { if (!logger.enabled) { return; } if (logger.isDebug) { payload !== void 0 ? logger.log(message, payload) : logger.log(message); } else { logger.log(logger.color(`[${prefix}] ${message}`)); if (payload) { logger.log(payload); } } if (_viteLogOverwriteProtection) { logger.log(""); } } function createLogger(level) { const logger = loggers[level]; const logFn = _log.bind(null, logger); Object.defineProperty(logFn, "enabled", { get() { return logger.enabled; } }); return logFn; } var log = { debug: createLogger("debug"), info: createLogger("info"), warn: createLogger("warn"), error: createLogger("error"), setLevel, setViteLogOverwriteProtection }; // src/handleHotUpdate.ts async function handleHotUpdate(compileSvelte, ctx, svelteRequest, cache) { const {read, server} = ctx; const cachedCompileData = cache.getCompileData(svelteRequest, false); if (!cachedCompileData) { log.debug(`handleHotUpdate first call ${svelteRequest.id}`); return; } const content = await read(); const compileData = await compileSvelte(svelteRequest, content, cachedCompileData.options); cache.setCompileData(compileData); const affectedModules = new Set(); const cssModule = server.moduleGraph.getModuleById(svelteRequest.cssId); const mainModule = server.moduleGraph.getModuleById(svelteRequest.id); if (cssModule && cssChanged(cachedCompileData, compileData)) { log.debug("handleHotUpdate css changed"); affectedModules.add(cssModule); } if (mainModule && jsChanged(cachedCompileData, compileData)) { log.debug("handleHotUpdate js changed"); affectedModules.add(mainModule); } const result = [...affectedModules].filter(Boolean); log.debug(`handleHotUpdate result for ${svelteRequest.id}`, result); const ssrModulesToInvalidate = result.filter((m) => !!m.ssrTransformResult); if (ssrModulesToInvalidate.length > 0) { log.debug(`invalidating modules ${ssrModulesToInvalidate.map((m) => m.id).join(", ")}`); ssrModulesToInvalidate.forEach((moduleNode) => server.moduleGraph.invalidateModule(moduleNode)); } return result; } function cssChanged(prev, next) { var _a, _b; return !isCodeEqual((_a = prev.compiled.css) == null ? void 0 : _a.code, (_b = next.compiled.css) == null ? void 0 : _b.code); } function jsChanged(prev, next) { const prevJs = prev.compiled.js.code; const nextJs = next.compiled.js.code; const isStrictEqual = isCodeEqual(prevJs, nextJs); if (isStrictEqual) { return false; } const isLooseEqual = isCodeEqual(normalizeJsCode(prevJs), normalizeJsCode(nextJs)); if (!isStrictEqual && isLooseEqual) { log.warn(`ignoring compiler output js change for ${next.filename} as it is equal to previous output after normalization`); } return !isLooseEqual; } function isCodeEqual(prev, next) { if (!prev && !next) { return true; } if (!prev && next || prev && !next) { return false; } return prev === next; } function normalizeJsCode(code) { if (!code) { return code; } return code.replace(/\s*\badd_location\s*\([^)]*\)\s*;?/g, ""); } // src/utils/compile.ts var import_compiler = __toModule(require("svelte/compiler")); var import_svelte_hmr = __toModule(require("svelte-hmr")); // src/utils/hash.ts var crypto = __toModule(require("crypto")); var hashes = Object.create(null); var hash_length = 12; function safeBase64Hash(input) { if (hashes[input]) { return hashes[input]; } const md5 = crypto.createHash("md5"); md5.update(input); const hash = toSafe(md5.digest("base64")).substr(0, hash_length); hashes[input] = hash; return hash; } var replacements = { "+": "-", "/": "_", "=": "" }; var replaceRE = new RegExp(`[${Object.keys(replacements).join("")}]`, "g"); function toSafe(base64) { return base64.replace(replaceRE, (x) => replacements[x]); } // src/utils/preprocess.ts var supportedStyleLangs = ["css", "less", "sass", "scss", "styl", "stylus", "postcss"]; var supportedScriptLangs = ["ts"]; function createPreprocessorFromVitePlugin(config, options, pluginName, supportedLangs) { const plugin = config.plugins.find((p) => p.name === pluginName); if (!plugin) { throw new Error(`failed to find plugin ${pluginName}`); } if (!plugin.transform) { throw new Error(`plugin ${pluginName} has no transform`); } const pluginTransform = plugin.transform.bind(null); return async ({attributes, content, filename}) => { var _a, _b, _c, _d; const lang = attributes.lang; if (!supportedLangs.includes(lang)) { return {code: content}; } const moduleId = `${filename}.${lang}`; const moduleGraph = (_a = options.server) == null ? void 0 : _a.moduleGraph; if (moduleGraph && !moduleGraph.getModuleById(moduleId)) { await moduleGraph.ensureEntryFromUrl(moduleId); } const transformResult = await pluginTransform(content, moduleId); const hasMap = !!((_b = transformResult.map) == null ? void 0 : _b.mappings); if (((_d = (_c = transformResult.map) == null ? void 0 : _c.sources) == null ? void 0 : _d[0]) === moduleId) { transformResult.map.sources[0] = filename; } return { code: transformResult.code, map: hasMap ? transformResult.map : null, dependencies: transformResult.deps }; }; } function createVitePreprocessorGroup(config, options) { return { script: createPreprocessorFromVitePlugin(config, options, "vite:esbuild", supportedScriptLangs), style: createPreprocessorFromVitePlugin(config, options, "vite:css", supportedStyleLangs) }; } function createInjectScopeEverythingRulePreprocessorGroup() { return { style({content}) { return { code: `${content} *{}` }; } }; } function buildExtraPreprocessors(options, config) { const extraPreprocessors = []; if (options.useVitePreprocess) { log.debug("adding vite preprocessor"); extraPreprocessors.push(createVitePreprocessorGroup(config, options)); } const pluginsWithPreprocessors = config.plugins.filter((p) => p == null ? void 0 : p.sveltePreprocess); if (pluginsWithPreprocessors.length > 0) { log.debug(`adding preprocessors from other vite plugins: ${pluginsWithPreprocessors.map((p) => p.name).join(", ")}`); extraPreprocessors.push(...pluginsWithPreprocessors.map((p) => p.sveltePreprocess)); } if (options.hot && !options.disableCssHmr) { extraPreprocessors.push(createInjectScopeEverythingRulePreprocessorGroup()); } return extraPreprocessors; } // src/utils/compile.ts var _createCompileSvelte = (makeHot, extraPreprocessors) => async function compileSvelte(svelteRequest, code, options) { const {filename, normalizedFilename, cssId, ssr} = svelteRequest; const {onwarn, emitCss = true} = options; const dependencies = []; const finalCompilerOptions = __assign(__assign({}, options.compilerOptions), { filename, generate: ssr ? "ssr" : "dom", css: !emitCss, hydratable: true }); if (options.hot) { const hash = `s-${safeBase64Hash(normalizedFilename)}`; log.debug(`setting cssHash ${hash} for ${normalizedFilename}`); finalCompilerOptions.cssHash = () => hash; } let preprocessed; const preprocessors = []; if (options.preprocess) { if (Array.isArray(options.preprocess)) { preprocessors.push(...options.preprocess); } else { preprocessors.push(options.preprocess); } } preprocessors.push(...extraPreprocessors || []); if (preprocessors.length > 0) { preprocessed = await (0, import_compiler.preprocess)(code, preprocessors, {filename}); if (preprocessed.dependencies) dependencies.push(...preprocessed.dependencies); if (preprocessed.map) finalCompilerOptions.sourcemap = preprocessed.map; } const compiled = (0, import_compiler.compile)(preprocessed ? preprocessed.code : code, finalCompilerOptions); (compiled.warnings || []).forEach((warning) => { if (!emitCss && warning.code === "css-unused-selector") return; if (onwarn) onwarn(warning); }); if (emitCss && compiled.css.code) { compiled.js.code += ` import ${JSON.stringify(cssId)}; `; } if (!ssr && makeHot) { compiled.js.code = makeHot({ id: filename, compiledCode: compiled.js.code, hotOptions: options.hot, compiled, originalCode: code, compileOptions: finalCompilerOptions }); } compiled.js.dependencies = dependencies; const result = { filename, normalizedFilename, cssId, code, preprocessed, compiled, compilerOptions: finalCompilerOptions, options, ssr }; return result; }; function buildMakeHot(options) { var _a, _b; const needsMakeHot = options.hot !== false && options.isServe && !options.isProduction; if (needsMakeHot) { const hotApi = (_a = options == null ? void 0 : options.hot) == null ? void 0 : _a.hotApi; const adapter = (_b = options == null ? void 0 : options.hot) == null ? void 0 : _b.adapter; return (0, import_svelte_hmr.createMakeHot)({ walk: import_compiler.walk, hotApi, adapter, hotOptions: __assign({noOverlay: true}, options.hot) }); } } function createCompileSvelte(options, config) { const makeHot = buildMakeHot(options); const extraPreprocessors = buildExtraPreprocessors(options, config); return _createCompileSvelte(makeHot, extraPreprocessors); } // src/utils/id.ts var import_querystring = __toModule(require("querystring")); var import_pluginutils = __toModule(require("@rollup/pluginutils")); var import_vite = __toModule(require("vite")); var fs = __toModule(require("fs")); var VITE_FS_PREFIX = "/@fs/"; var IS_WINDOWS = process.platform === "win32"; function splitId(id) { const parts = id.split(`?`, 2); const filename = parts[0]; const rawQuery = parts[1]; return {filename, rawQuery}; } function parseToSvelteRequest(id, filename, rawQuery, root, timestamp, ssr) { const query = import_querystring.default.parse(rawQuery); if (query.svelte != null) { query.svelte = true; } const normalizedFilename = normalize(filename, root); const cssId = createVirtualImportId(filename, root, "style"); return { id, filename, normalizedFilename, cssId, query, timestamp, ssr }; } function createVirtualImportId(filename, root, type) { const parts = ["svelte", `type=${type}`]; if (type === "style") { parts.push("lang.css"); } if (existsInRoot(filename, root)) { filename = root + filename; } else if (filename.startsWith(VITE_FS_PREFIX)) { filename = IS_WINDOWS ? filename.slice(VITE_FS_PREFIX.length) : filename.slice(VITE_FS_PREFIX.length - 1); } return `${filename}?${parts.join("&")}`; } function normalize(filename, normalizedRoot) { return stripRoot((0, import_vite.normalizePath)(filename), normalizedRoot); } function existsInRoot(filename, root) { if (filename.startsWith(VITE_FS_PREFIX)) { return false; } return fs.existsSync(root + filename); } function stripRoot(normalizedFilename, normalizedRoot) { return normalizedFilename.startsWith(normalizedRoot + "/") ? normalizedFilename.slice(normalizedRoot.length) : normalizedFilename; } function buildFilter(include, exclude, extensions) { const rollupFilter = (0, import_pluginutils.createFilter)(include, exclude); return (filename) => rollupFilter(filename) && extensions.some((ext) => filename.endsWith(ext)); } function buildIdParser(options) { const {include, exclude, extensions, root} = options; const normalizedRoot = (0, import_vite.normalizePath)(root); const filter = buildFilter(include, exclude, extensions); return (id, ssr, timestamp = Date.now()) => { const {filename, rawQuery} = splitId(id); if (filter(filename)) { return parseToSvelteRequest(id, filename, rawQuery, normalizedRoot, timestamp, ssr); } }; } // src/utils/loadSvelteConfig.ts var import_path = __toModule(require("path")); var import_fs = __toModule(require("fs")); var knownSvelteConfigNames = ["svelte.config.js", "svelte.config.cjs"]; function loadSvelteConfig(root = process.cwd()) { const foundConfigs = knownSvelteConfigNames.map((candidate) => import_path.default.resolve(root, candidate)).filter((file) => import_fs.default.existsSync(file)); if (foundConfigs.length === 0) { log.debug(`no svelte config found at ${root}`); return; } else if (foundConfigs.length > 1) { log.warn(`found more than one svelte config file, using ${foundConfigs[0]}. you should only have one!`, foundConfigs); } try { const config = require(foundConfigs[0]); log.debug(`loaded svelte config ${foundConfigs[0]}`, config); return config; } catch (e) { log.error(`failed to load config ${foundConfigs[0]}`, e); } } // src/utils/options.ts var knownOptions = new Set([ "include", "exclude", "extensions", "emitCss", "compilerOptions", "preprocess", "hot", "disableTransformCache", "disableCssHmr", "useVitePreprocess" ]); function buildDefaultOptions({isProduction}, options) { const disableCssHmr = !!(options == null ? void 0 : options.disableCssHmr); const emitCss = isProduction || !disableCssHmr; const hot = isProduction ? false : { injectCss: !emitCss }; const defaultOptions = { extensions: [".svelte"], hot, emitCss, compilerOptions: { format: "esm", css: !emitCss, dev: !isProduction } }; log.debug(`default options for ${isProduction ? "production" : "development"} ${!isProduction && disableCssHmr ? " with css hmr disabled" : ""}`, defaultOptions); return defaultOptions; } function validateInlineOptions(inlineOptions) { const invalidKeys = Object.keys(inlineOptions || {}).filter((key) => !knownOptions.has(key)); if (invalidKeys.length) { log.warn(`invalid plugin options "${invalidKeys.join(", ")}" in config`, inlineOptions); } } function enforceOptionsForHmr(options) { if (options.hot) { if (!options.compilerOptions.dev) { log.warn("hmr is enabled but compilerOptions.dev is false, forcing it to true"); options.compilerOptions.dev = true; } if (options.emitCss) { if (options.hot !== true && options.hot.injectCss) { log.warn("hmr and emitCss are enabled but hot.injectCss is true, forcing it to false"); options.hot.injectCss = false; } if (options.compilerOptions.css) { log.warn("hmr and emitCss are enabled but compilerOptions.css is true, forcing it to false"); options.compilerOptions.css = false; } } } } function enforceOptionsForProduction(options) { if (options.isProduction) { if (options.hot) { log.warn("options.hot is enabled but does not work on production build, forcing it to false"); options.hot = false; } if (!options.emitCss) { log.warn("you are building for production but emitCss is disabled. forcing it to true"); options.emitCss = true; } if (options.compilerOptions.dev) { log.warn("you are building for production but compilerOptions.dev is true, forcing it to false"); options.compilerOptions.dev = false; } } } function mergeOptions(defaultOptions, svelteConfig, inlineOptions, viteConfig) { return __assign(__assign(__assign(__assign({}, defaultOptions), svelteConfig), inlineOptions), { compilerOptions: __assign(__assign(__assign({}, defaultOptions.compilerOptions), (svelteConfig == null ? void 0 : svelteConfig.compilerOptions) || {}), (inlineOptions == null ? void 0 : inlineOptions.compilerOptions) || {}), root: viteConfig.root, isProduction: viteConfig.isProduction, isBuild: viteConfig.command === "build", isServe: viteConfig.command === "serve" }); } function resolveOptions(inlineOptions = {}, viteConfig) { const defaultOptions = buildDefaultOptions(viteConfig, inlineOptions); const svelteConfig = loadSvelteConfig(viteConfig.root) || {}; const resolvedOptions = mergeOptions(defaultOptions, svelteConfig, inlineOptions, viteConfig); enforceOptionsForProduction(resolvedOptions); enforceOptionsForHmr(resolvedOptions); log.debug("resolved options", resolvedOptions); return resolvedOptions; } // src/utils/VitePluginSvelteCache.ts var VitePluginSvelteCache = class { constructor() { this._compile = new Map(); this._compileSSR = new Map(); } selectCache(ssr) { return ssr ? this._compileSSR : this._compile; } getCompileData(svelteRequest, errorOnMissing = true) { const cache = this.selectCache(svelteRequest.ssr); const id = svelteRequest.normalizedFilename; if (cache.has(id)) { return cache.get(id); } if (errorOnMissing) { throw new Error(`${id} has no corresponding entry in the ${svelteRequest.ssr ? "ssr" : ""}cache. This is a @sveltejs/vite-plugin-svelte internal error, please open an issue.`); } } setCompileData(compileData) { const cache = this.selectCache(!!compileData.ssr); const id = compileData.normalizedFilename; cache.set(id, compileData); } }; // src/utils/constants.ts var VITE_RESOLVE_MAIN_FIELDS = ["module", "jsnext:main", "jsnext"]; var SVELTE_RESOLVE_MAIN_FIELDS = ["svelte", ...VITE_RESOLVE_MAIN_FIELDS]; var SVELTE_IMPORTS = [ "svelte/animate", "svelte/easing", "svelte/internal", "svelte/motion", "svelte/store", "svelte/transition", "svelte", "svelte-hmr/runtime/hot-api-esm.js", "svelte-hmr/runtime/proxy-adapter-dom.js", "svelte-hmr" ]; // src/index.ts var pkg_export_errors = new Set(); function vitePluginSvelte(inlineOptions) { if (process.env.DEBUG != null) { log.setLevel("debug"); } validateInlineOptions(inlineOptions); const cache = new VitePluginSvelteCache(); let requestParser; let options; let compileSvelte; return { name: "vite-plugin-svelte", enforce: "pre", config(config) { if (process.env.DEBUG) { log.setLevel("debug"); } else if (config.logLevel) { log.setLevel(config.logLevel); } const extraViteConfig = { optimizeDeps: { exclude: [...SVELTE_IMPORTS] }, resolve: { mainFields: [...SVELTE_RESOLVE_MAIN_FIELDS], dedupe: [...SVELTE_IMPORTS] } }; if (inlineOptions == null ? void 0 : inlineOptions.useVitePreprocess) { extraViteConfig.esbuild = { tsconfigRaw: { compilerOptions: { importsNotUsedAsValues: "preserve" } } }; } log.debug("additional vite config", extraViteConfig); return extraViteConfig; }, configResolved(config) { options = resolveOptions(inlineOptions, config); requestParser = buildIdParser(options); compileSvelte = createCompileSvelte(options, config); }, configureServer(server) { options.server = server; }, load(id, ssr) { var _a; const svelteRequest = requestParser(id, !!ssr); if (!svelteRequest) { return; } log.debug("load", svelteRequest); const {filename, query} = svelteRequest; if (query.svelte) { if (query.type === "style") { const compileData = cache.getCompileData(svelteRequest, false); if ((_a = compileData == null ? void 0 : compileData.compiled) == null ? void 0 : _a.css) { log.debug(`load returns css for ${filename}`); return compileData.compiled.css; } } } }, async resolveId(importee, importer, customOptions, ssr) { const svelteRequest = requestParser(importee, !!ssr); log.debug("resolveId", svelteRequest || importee); if (svelteRequest == null ? void 0 : svelteRequest.query.svelte) { if (svelteRequest.query.type === "style") { log.debug(`resolveId resolved virtual css module ${svelteRequest.cssId}`); return svelteRequest.cssId; } log.debug(`resolveId resolved ${importee}`); return importee; } if (!importer || importee[0] === "." || importee[0] === "\0" || path2.isAbsolute(importee)) { return null; } const parts = importee.split("/"); let dir, pkg, name = parts.shift(); if (name && name[0] === "@") { name += `/${parts.shift()}`; } try { const file = `${name}/package.json`; const resolved = relative.resolve(file, path2.dirname(importer)); dir = path2.dirname(resolved); pkg = require(resolved); } catch (err) { if (err.code === "MODULE_NOT_FOUND") return null; if (err.code === "ERR_PACKAGE_PATH_NOT_EXPORTED") { pkg_export_errors.add(name); return null; } throw err; } if (parts.length === 0 && pkg.svelte) { return path2.resolve(dir, pkg.svelte); } log.debug(`resolveId did not resolve ${importee}`); }, async transform(code, id, ssr) { var _a; const svelteRequest = requestParser(id, !!ssr); if (!svelteRequest) { return; } log.debug("transform", svelteRequest); const {filename, query} = svelteRequest; const cachedCompileData = cache.getCompileData(svelteRequest, false); if (query.svelte) { if (query.type === "style" && ((_a = cachedCompileData == null ? void 0 : cachedCompileData.compiled) == null ? void 0 : _a.css)) { log.debug(`transform returns css for ${filename}`); return cachedCompileData.compiled.css; } log.error("failed to transform tagged svelte request", svelteRequest); throw new Error(`failed to transform tagged svelte request for id ${id}`); } if (cachedCompileData && !options.disableTransformCache) { log.debug(`transform returns cached js for ${filename}`); return cachedCompileData.compiled.js; } const compileData = await compileSvelte(svelteRequest, code, options); cache.setCompileData(compileData); log.debug(`transform returns compiled js for ${filename}`); return compileData.compiled.js; }, handleHotUpdate(ctx) { if (!options.emitCss || options.disableCssHmr) { return; } const svelteRequest = requestParser(ctx.file, false, ctx.timestamp); if (!svelteRequest) { return; } log.debug("handleHotUpdate", svelteRequest); return handleHotUpdate(compileSvelte, ctx, svelteRequest, cache); }, transformIndexHtml(html, ctx) { log.debug("transformIndexHtml", html); }, buildEnd() { if (pkg_export_errors.size > 0) { log.warn(`The following packages did not export their \`package.json\` file so we could not check the "svelte" field.If you had difficulties importing svelte components from a package, then please contact the author and ask them to export the package.json file.`, Array.from(pkg_export_errors, (s) => `- ${s}`).join("\n")); } } }; } module.exports = vitePluginSvelte; vitePluginSvelte["default"] = vitePluginSvelte; // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = {});