globalThis.IMBA_MANIFEST={} var __require = /* @__PURE__ */ ((x) => typeof require < "u" ? require : typeof Proxy < "u" ? new Proxy(x, { get: (a, b) => (typeof require < "u" ? require : a)[b] }) : x)(function(x) { if (typeof require < "u") return require.apply(this, arguments); throw new Error('Dynamic require of "' + x + '" is not supported'); }); // src/utils/compile.ts import { compile } from "imba/compiler"; // src/utils/hash.ts import * as crypto from "crypto"; var hashes = /* @__PURE__ */ Object.create(null), hash_length = 12; function safeBase64Hash(input) { if (hashes[input]) return hashes[input]; let md5 = crypto.createHash("md5"); md5.update(input); let hash = toSafe(md5.digest("base64")).slice(0, hash_length); return hashes[input] = hash, hash; } var replacements = { "+": "-", "/": "_", "=": "" }, replaceRE = new RegExp(`[${Object.keys(replacements).join("")}]`, "g"); function toSafe(base64) { return base64.replace(replaceRE, (x) => replacements[x]); } // src/utils/log.ts import { cyan, yellow, red } from "kleur/colors"; import debug from "debug"; var levels = ["debug", "info", "warn", "error", "silent"], prefix = "vite-plugin-imba", loggers = { debug: { log: debug(`vite:${prefix}`), enabled: !1, isDebug: !0 }, info: { color: cyan, log: console.log, enabled: !0 }, warn: { color: yellow, log: console.warn, enabled: !0 }, error: { color: red, log: console.error, enabled: !0 }, silent: { enabled: !1 } }, _level = "info"; function setLevel(level) { if (level === _level) return; let 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} `); } function _log(logger, message, payload) { !logger.enabled || (logger.isDebug ? payload !== void 0 ? logger.log(message, payload) : logger.log(message) : (logger.log(logger.color(`${new Date().toLocaleTimeString()} [${prefix}] ${message}`)), payload && logger.log(payload))); } function createLogger(level) { let logger = loggers[level], logFn = _log.bind(null, logger), logged = /* @__PURE__ */ new Set(), once = function(message, payload) { logged.has(message) || (logged.add(message), logFn.apply(null, [message, payload])); }; return Object.defineProperty(logFn, "enabled", { get() { return logger.enabled; } }), Object.defineProperty(logFn, "once", { get() { return once; } }), logFn; } var log = { debug: createLogger("debug"), info: createLogger("info"), warn: createLogger("warn"), error: createLogger("error"), setLevel }; function logCompilerWarnings(imbaRequest, warnings, options) { var _a, _b, _c; let { emitCss, onwarn, isBuild } = options, sendViaWS = !isBuild && ((_a = options.experimental) == null ? void 0 : _a.sendWarningsToBrowser), warn = isBuild ? warnBuild : warnDev, handledByDefaultWarn = [], notIgnored = warnings == null ? void 0 : warnings.filter((w) => !ignoreCompilerWarning(w, isBuild, emitCss)), extra = buildExtraWarnings(warnings, isBuild), allWarnings = [...notIgnored, ...extra]; if (sendViaWS) { let _warn = warn; warn = (w) => { handledByDefaultWarn.push(w), _warn(w); }; } if (allWarnings.forEach((warning) => { onwarn ? onwarn(warning, warn) : warn(warning); }), sendViaWS) { let message = { id: imbaRequest.id, filename: imbaRequest.filename, normalizedFilename: imbaRequest.normalizedFilename, timestamp: imbaRequest.timestamp, warnings: handledByDefaultWarn, allWarnings, rawWarnings: warnings }; log.debug(`sending imba:warnings message for ${imbaRequest.normalizedFilename}`), (_c = (_b = options.server) == null ? void 0 : _b.ws) == null || _c.send("imba:warnings", message); } } function ignoreCompilerWarning(warning, isBuild, emitCss) { return !emitCss && warning.code === "css-unused-selector" || !isBuild && isNoScopableElementWarning(warning); } function isNoScopableElementWarning(warning) { return warning.code === "css-unused-selector" && warning.message.includes('"*"'); } function buildExtraWarnings(warnings, isBuild) { let extraWarnings = []; if (!isBuild) { let noScopableElementWarnings = warnings.filter((w) => isNoScopableElementWarning(w)); if (noScopableElementWarnings.length > 0) { let noScopableElementWarning = noScopableElementWarnings[noScopableElementWarnings.length - 1]; extraWarnings.push({ ...noScopableElementWarning, code: "vite-plugin-imba-css-no-scopable-elements", message: "No scopable elements found in template. If you're using global styles in the style tag, you should move it into an external stylesheet file and import it in JS. See https://github.com/imbajs/vite-plugin-imba/blob/main/docs/faq.md#where-should-i-put-my-global-styles." }); } } return extraWarnings; } function warnDev(w) { log.info.enabled && log.info(buildExtendedLogMessage(w)); } function warnBuild(w) { log.warn.enabled && log.warn(buildExtendedLogMessage(w), w.frame); } function buildExtendedLogMessage(w) { let parts = []; return w.filename && parts.push(w.filename), w.start && parts.push(":", w.start.line, ":", w.start.column), w.message && (parts.length > 0 && parts.push(" "), parts.push(w.message)), parts.join(""); } // src/utils/compile.ts var scriptLangRE = /<script [^>]*lang=["']?([^"' >]+)["']?[^>]*>/, _createCompileImba = (makeHot) => async function(imbaRequest, code, options) { var _a, _b, _c; let { filename, normalizedFilename, cssId, ssr } = imbaRequest, { emitCss = !0 } = options, dependencies = [], compileOptions = { ...options.compilerOptions, filename, generate: ssr ? "ssr" : "dom", format: "esm", resolveColors: !0, sourcePath: filename, sourcemap: options.compilerOptions.sourcemap ?? "inline" }; if (options.hot && options.emitCss) { let hash = `s-${safeBase64Hash(normalizedFilename)}`; log.debug(`setting cssHash ${hash} for ${normalizedFilename}`), compileOptions.cssHash = () => hash; } ssr && compileOptions.enableSourcemap !== !1 && (typeof compileOptions.enableSourcemap == "object" ? compileOptions.enableSourcemap.css = !1 : compileOptions.enableSourcemap = { js: !0, css: !1 }); let preprocessed, finalCode = preprocessed ? preprocessed.code : code, dynamicCompileOptions = await ((_b = (_a = options.experimental) == null ? void 0 : _a.dynamicCompileOptions) == null ? void 0 : _b.call(_a, { filename, code: finalCode, compileOptions })); dynamicCompileOptions && log.debug.enabled && log.debug( `dynamic compile options for ${filename}: ${JSON.stringify(dynamicCompileOptions)}` ); let finalCompileOptions = dynamicCompileOptions ? { ...compileOptions, ...dynamicCompileOptions } : compileOptions; finalCompileOptions.config = finalCompileOptions, finalCompileOptions.styles = "extern"; let compiled = compile(finalCode, finalCompileOptions); return compiled.js = { code: compiled.js }, compiled.css = { code: compiled.css }, emitCss && compiled.css.code && (compiled.js.code += ` /*__css_import__*/import ${JSON.stringify(cssId)}; `), !ssr && makeHot && (compiled.js.code = makeHot({ id: filename, compiledCode: compiled.js.code, hotOptions: options.hot, compiled, originalCode: code, compileOptions: finalCompileOptions })), compiled.js.dependencies = dependencies, { filename, normalizedFilename, lang: ((_c = code.match(scriptLangRE)) == null ? void 0 : _c[1]) || "js", compiled, ssr, dependencies }; }; function createCompileImba(options) { return _createCompileImba(); } // src/svg-plugin.imba import { readFileSync } from "fs"; import { parseAsset } from "imba/compiler"; function compileΞsvg(body, url2) { let js, parsed = parseAsset({ body }); return js = `export default /* @__PURE__ */ Object.assign({ type: 'svg' },` + JSON.stringify(parsed) + ")"; } function svgΞplugin(options = {}) { let cache = /* @__PURE__ */ new Map(); return { name: "vite-plugin-imba-svg", transform: async function(source, id, opts) { if (id.endsWith(".svg")) { let result2 = cache.get(id); if (!result2) { let body = readFileSync(id, "utf-8"); result2 = await compileΞsvg(body, id), cache.set(id, result2); } return result2; } } }; } // src/utils/id.ts import { createFilter } from "@rollup/pluginutils"; import { normalizePath } from "vite"; import * as fs2 from "fs"; var VITE_FS_PREFIX = "/@fs/", IS_WINDOWS = process.platform === "win32"; function splitId(id) { let parts = id.split("?", 2), filename = parts[0], rawQuery = parts[1]; return { filename, rawQuery }; } function parseToImbaRequest(id, filename, rawQuery, root, timestamp, ssr) { let query = parseRequestQuery(rawQuery); if (query.url || query.raw) return; let normalizedFilename = normalize(filename, root), cssId = createVirtualImportId(filename, root, "style"); return { id, filename, normalizedFilename, cssId, query, timestamp, ssr }; } function createVirtualImportId(filename, root, type) { let parts = ["imba", `type=${type}`]; return type === "style" && parts.push("lang.css"), existsInRoot(filename, root) ? filename = root + filename : filename.startsWith(VITE_FS_PREFIX) && (filename = IS_WINDOWS ? filename.slice(VITE_FS_PREFIX.length) : filename.slice(VITE_FS_PREFIX.length - 1)), `${filename}?${parts.join("&")}`; } function parseRequestQuery(rawQuery) { let query = Object.fromEntries(new URLSearchParams(rawQuery)); for (let key in query) query[key] === "" && (query[key] = !0); return query; } function normalize(filename, normalizedRoot) { return stripRoot(normalizePath(filename), normalizedRoot); } function existsInRoot(filename, root) { return filename.startsWith(VITE_FS_PREFIX) ? !1 : fs2.existsSync(root + filename); } function stripRoot(normalizedFilename, normalizedRoot) { return normalizedFilename.startsWith(normalizedRoot + "/") ? normalizedFilename.slice(normalizedRoot.length) : normalizedFilename; } function buildFilter(include, exclude, extensions) { let rollupFilter = createFilter(include, exclude); return (filename) => rollupFilter(filename) && extensions.some((ext) => filename.endsWith(ext)); } function buildIdParser(options) { let { include, exclude, extensions, root } = options, normalizedRoot = normalizePath(root), filter = buildFilter(include, exclude, extensions); return (id, ssr, timestamp = Date.now()) => { let { filename, rawQuery } = splitId(id); if (filter(filename)) return parseToImbaRequest(id, filename, rawQuery, normalizedRoot, timestamp, ssr); }; } // src/utils/options.ts import { normalizePath as normalizePath2 } from "vite"; // src/utils/load-imba-config.ts import { createRequire } from "module"; import path from "path"; import fs3 from "fs"; import { pathToFileURL } from "url"; var esmRequire, knownImbaConfigNames = [ "imba.config.js", "imbaconfig.json", "imba.config.json" ], dynamicImportDefault = new Function( "path", "timestamp", 'return import(path + "?t=" + timestamp).then(m => m.default)' ), dynamicImportJSON = new Function( "path", "timestamp", 'return import(path + "?t=" + timestamp, {assert: {type: "json"}}).then(m => m.default)' ); async function loadImbaConfig(viteConfig, inlineOptions) { if ((inlineOptions == null ? void 0 : inlineOptions.configFile) === !1) return; let configFile = findConfigToLoad(viteConfig, inlineOptions); if (configFile) { let err; if (configFile.endsWith(".json")) try { let result = await dynamicImportJSON( pathToFileURL(configFile).href, fs3.statSync(configFile).mtimeMs ); if (result != null) return { ...result, configFile }; throw new Error(`invalid export in ${configFile}`); } catch (e) { log.error(`failed to import config ${configFile}`, e), err = e; } if (configFile.endsWith(".js") || configFile.endsWith(".mjs") || configFile.endsWith(".json")) try { let result = await dynamicImportDefault( pathToFileURL(configFile).href, fs3.statSync(configFile).mtimeMs ); if (result != null) return { ...result, configFile }; throw new Error(`invalid export in ${configFile}`); } catch (e) { log.error(`failed to import config ${configFile}`, e), err = e; } if (!configFile.endsWith(".mjs")) try { let _require = import.meta.url ? esmRequire ?? (esmRequire = createRequire(import.meta.url)) : __require; delete _require.cache[_require.resolve(configFile)]; let result = _require(configFile); if (result != null) return { ...result, configFile }; throw new Error(`invalid export in ${configFile}`); } catch (e) { log.error(`failed to require config ${configFile}`, e), err || (err = e); } throw err; } } function findConfigToLoad(viteConfig, inlineOptions) { let root = (viteConfig == null ? void 0 : viteConfig.root) || process.cwd(); if (inlineOptions != null && inlineOptions.configFile) { let abolutePath = path.isAbsolute(inlineOptions.configFile) ? inlineOptions.configFile : path.resolve(root, inlineOptions.configFile); if (!fs3.existsSync(abolutePath)) throw new Error(`failed to find imba config file ${abolutePath}.`); return abolutePath; } else { let existingKnownConfigFiles = knownImbaConfigNames.map((candidate) => path.resolve(root, candidate)).filter((file) => fs3.existsSync(file)); if (existingKnownConfigFiles.length === 0) { log.debug(`no imba config found at ${root}`); return; } else existingKnownConfigFiles.length > 1 && log.warn( `found more than one imba config file, using ${existingKnownConfigFiles[0]}. you should only have one!`, existingKnownConfigFiles ); return existingKnownConfigFiles[0]; } } // src/utils/constants.ts var VITE_RESOLVE_MAIN_FIELDS = ["module", "jsnext:main", "jsnext"], IMBA_RESOLVE_MAIN_FIELDS = ["imba", ...VITE_RESOLVE_MAIN_FIELDS], IMBA_IMPORTS = [], IMBA_HMR_IMPORTS = []; // src/utils/options.ts import path4 from "path"; // src/utils/dependencies.ts import path2 from "path"; import fs4 from "fs"; import { createRequire as createRequire2 } from "module"; function findRootImbaDependencies(root, cwdFallback = !0) { log.debug(`findImbaDependencies: searching imba dependencies in ${root}`); let pkgFile = path2.join(root, "package.json"); if (!fs4.existsSync(pkgFile)) { if (cwdFallback) { let cwd = process.cwd(); if (root !== cwd) return log.debug(`no package.json found in vite root ${root}`), findRootImbaDependencies(cwd, !1); } return log.warn("no package.json found, findRootImbaDependencies failed"), []; } let pkg = parsePkg(root); if (!pkg) return []; let deps = [ ...Object.keys(pkg.dependencies || {}), ...Object.keys(pkg.devDependencies || {}) ].filter((dep) => !is_common_without_imba_field(dep)); return getImbaDependencies(deps, root); } function getImbaDependencies(deps, pkgDir, path7 = []) { let result = [], localRequire = createRequire2(`${pkgDir}/package.json`), resolvedDeps = deps.map((dep) => resolveDependencyData(dep, localRequire)).filter(Boolean); for (let { pkg, dir } of resolvedDeps) { let type = getImbaDependencyType(pkg); if (!!type && (result.push({ name: pkg.name, type, pkg, dir, path: path7 }), type === "component-library" && pkg.dependencies)) { let dependencyNames = Object.keys(pkg.dependencies), circular = dependencyNames.filter((name) => path7.includes(name)); circular.length > 0 && (log.warn.enabled && log.warn( "skipping circular imba dependencies in automated vite optimizeDeps handling", circular.map((x) => path7.concat(x).join(">")) ), dependencyNames = dependencyNames.filter((name) => !path7.includes(name))), path7.length === 3 && log.debug.once(`encountered deep imba dependency tree: ${path7.join(">")}`), result.push(...getImbaDependencies(dependencyNames, dir, path7.concat(pkg.name))); } } return result; } function resolveDependencyData(dep, localRequire) { try { let pkgJson = `${dep}/package.json`, pkg = localRequire(pkgJson); return { dir: path2.dirname(localRequire.resolve(pkgJson)), pkg }; } catch (e) { log.debug.once(`dependency ${dep} does not export package.json`, e); try { let dir = path2.dirname(localRequire.resolve(dep)); for (; dir; ) { let pkg = parsePkg(dir, !0); if (pkg && pkg.name === dep) return { dir, pkg }; let parent = path2.dirname(dir); if (parent === dir) break; dir = parent; } } catch (e2) { log.debug.once(`error while trying to find package.json of ${dep}`, e2); } } log.debug.once(`failed to resolve ${dep}`); } function parsePkg(dir, silent = !1) { let pkgFile = path2.join(dir, "package.json"); try { return JSON.parse(fs4.readFileSync(pkgFile, "utf-8")); } catch (e) { !silent && log.warn.enabled && log.warn(`failed to parse ${pkgFile}`, e); } } function getImbaDependencyType(pkg) { return isImbaComponentLib(pkg) ? "component-library" : isImbaLib(pkg) ? "js-library" : void 0; } function isImbaComponentLib(pkg) { return !!pkg.imba; } function isImbaLib(pkg) { var _a, _b; return !!((_a = pkg.dependencies) != null && _a.imba) || !!((_b = pkg.peerDependencies) != null && _b.imba); } var COMMON_DEPENDENCIES_WITHOUT_IMBA_FIELD = [ "@lukeed/uuid", "@playwright/test", "@imbajs/vite-plugin-imba", "@imbajs/kit", "autoprefixer", "cookie", "dotenv", "esbuild", "eslint", "jest", "mdsvex", "playwright", "postcss", "prettier", "imba", "imba-check", "imba-hmr", "imba-preprocess", "tslib", "typescript", "vite", "vitest", "__vite-browser-external" ], COMMON_PREFIXES_WITHOUT_IMBA_FIELD = [ "@fontsource/", "@postcss-plugins/", "@rollup/", "@imbajs/adapter-", "@types/", "@typescript-eslint/", "eslint-", "jest-", "postcss-plugin-", "prettier-plugin-", "rollup-plugin-", "vite-plugin-" ]; function is_common_without_imba_field(dependency) { return COMMON_DEPENDENCIES_WITHOUT_IMBA_FIELD.includes(dependency) || COMMON_PREFIXES_WITHOUT_IMBA_FIELD.some( (prefix2) => prefix2.startsWith("@") ? dependency.startsWith(prefix2) : dependency.substring(dependency.lastIndexOf("/") + 1).startsWith(prefix2) ); } function needsOptimization(dep, localRequire) { let depData = resolveDependencyData(dep, localRequire); if (!depData) return !1; let pkg = depData.pkg; if (pkg.module || pkg.exports) return !1; if (pkg.main) { let entryExt = path2.extname(pkg.main); return !entryExt || entryExt === ".js" || entryExt === ".cjs"; } else try { return localRequire.resolve(`${dep}/index.js`), !0; } catch { return !1; } } // src/utils/options.ts import { createRequire as createRequire3 } from "module"; // src/utils/esbuild.ts import { promises as fs5 } from "fs"; import { compile as compile2 } from "imba/compiler"; // src/utils/error.ts function toRollupError(error, options) { let { filename, frame, start, code, name, stack } = error, rollupError = { name, id: filename, message: buildExtendedLogMessage(error), frame: formatFrameForVite(frame), code, stack: options.isBuild || options.isDebug || !frame ? stack : "" }; return start && (rollupError.loc = { line: start.line, column: start.column, file: filename }), rollupError; } function formatFrameForVite(frame) { return frame ? frame.split(` `).map((line) => line.match(/^\s+\^/) ? " " + line : " " + line.replace(":", " | ")).join(` `) : ""; } // src/utils/esbuild.ts var facadeEsbuildImbaPluginName = "vite-plugin-imba:facade"; // src/utils/preprocess.ts import MagicString2 from "magic-string"; // src/utils/sourcemap.ts import MagicString from "magic-string"; async function buildMagicString(from, to, options) { let diff_match_patch, DIFF_DELETE, DIFF_INSERT; try { let dmpPkg = await import("diff-match-patch"); diff_match_patch = dmpPkg.diff_match_patch, DIFF_INSERT = dmpPkg.DIFF_INSERT, DIFF_DELETE = dmpPkg.DIFF_DELETE; } catch { return log.error.once( 'Failed to import optional dependency "diff-match-patch". Please install it to enable generated sourcemaps.' ), null; } let dmp = new diff_match_patch(), diffs = dmp.diff_main(from, to); dmp.diff_cleanupSemantic(diffs); let m = new MagicString(from, options), pos = 0; for (let i = 0; i < diffs.length; i++) { let diff = diffs[i], nextDiff = diffs[i + 1]; diff[0] === DIFF_DELETE ? ((nextDiff == null ? void 0 : nextDiff[0]) === DIFF_INSERT ? (m.overwrite(pos, pos + diff[1].length, nextDiff[1]), i++) : m.remove(pos, pos + diff[1].length), pos += diff[1].length) : diff[0] === DIFF_INSERT ? nextDiff ? m.appendRight(pos, diff[1]) : m.append(diff[1]) : pos += diff[1].length; } return m; } async function buildSourceMap(from, to, filename) { let m = await buildMagicString(from, to, { filename }); return m ? m.generateDecodedMap({ source: filename, hires: !0, includeContent: !1 }) : null; } // src/utils/preprocess.ts import path3 from "path"; function createInjectScopeEverythingRulePreprocessorGroup() { return { style({ content, filename }) { let s = new MagicString2(content); return s.append(" *{}"), { code: s.toString(), map: s.generateDecodedMap({ source: filename ? path3.basename(filename) : void 0, hires: !0 }) }; } }; } function buildExtraPreprocessors(options, config) { var _a; let prependPreprocessors = [], appendPreprocessors = [], pluginsWithPreprocessorsDeprecated = config.plugins.filter((p) => p == null ? void 0 : p.imbaPreprocess); pluginsWithPreprocessorsDeprecated.length > 0 && (log.warn( `The following plugins use the deprecated 'plugin.imbaPreprocess' field. Please contact their maintainers and ask them to move it to 'plugin.api.imbaPreprocess': ${pluginsWithPreprocessorsDeprecated.map((p) => p.name).join(", ")}` ), pluginsWithPreprocessorsDeprecated.forEach((p) => { p.api || (p.api = {}), p.api.imbaPreprocess === void 0 ? p.api.imbaPreprocess = p.imbaPreprocess : log.error( `ignoring plugin.imbaPreprocess of ${p.name} because it already defined plugin.api.imbaPreprocess.` ); })); let pluginsWithPreprocessors = config.plugins.filter((p) => { var _a2; return (_a2 = p == null ? void 0 : p.api) == null ? void 0 : _a2.imbaPreprocess; }), ignored = [], included = []; for (let p of pluginsWithPreprocessors) options.ignorePluginPreprocessors === !0 || Array.isArray(options.ignorePluginPreprocessors) && ((_a = options.ignorePluginPreprocessors) == null ? void 0 : _a.includes(p.name)) ? ignored.push(p) : included.push(p); return ignored.length > 0 && log.debug( `Ignoring imba preprocessors defined by these vite plugins: ${ignored.map((p) => p.name).join(", ")}` ), included.length > 0 && (log.debug( `Adding imba preprocessors defined by these vite plugins: ${included.map((p) => p.name).join(", ")}` ), appendPreprocessors.push(...pluginsWithPreprocessors.map((p) => p.api.imbaPreprocess))), options.hot && options.emitCss && appendPreprocessors.push(createInjectScopeEverythingRulePreprocessorGroup()), { prependPreprocessors, appendPreprocessors }; } function addExtraPreprocessors(options, config) { var _a; let { prependPreprocessors, appendPreprocessors } = buildExtraPreprocessors(options, config); (prependPreprocessors.length > 0 || appendPreprocessors.length > 0) && (options.preprocess ? Array.isArray(options.preprocess) ? (options.preprocess.unshift(...prependPreprocessors), options.preprocess.push(...appendPreprocessors)) : options.preprocess = [...prependPreprocessors, options.preprocess, ...appendPreprocessors] : options.preprocess = [...prependPreprocessors, ...appendPreprocessors]); let generateMissingSourceMaps = !!((_a = options.experimental) != null && _a.generateMissingPreprocessorSourcemaps); options.preprocess && generateMissingSourceMaps && (options.preprocess = Array.isArray(options.preprocess) ? options.preprocess.map((p, i) => validateSourceMapOutputWrapper(p, i)) : validateSourceMapOutputWrapper(options.preprocess, 0)); } function validateSourceMapOutputWrapper(group, i) { let wrapper = {}; for (let [processorType, processorFn] of Object.entries(group)) wrapper[processorType] = async (options) => { var _a; let result = await processorFn(options); if (result && result.code !== options.content) { let invalidMap = !1; if (result.map ? ((_a = result.map) == null ? void 0 : _a.mappings) === "" && (invalidMap = !0, log.warn.enabled && log.warn.once( `preprocessor at index ${i} returned an invalid empty sourcemap for ${processorType} transform`, { filename: options.filename, type: processorType, processor: processorFn.toString() } )) : (invalidMap = !0, log.warn.enabled && log.warn.once( `preprocessor at index ${i} did not return a sourcemap for ${processorType} transform`, { filename: options.filename, type: processorType, processor: processorFn.toString() } )), invalidMap) try { let map = await buildSourceMap(options.content, result.code, options.filename); map && (log.debug.enabled && log.debug( `adding generated sourcemap to preprocesor result for ${options.filename}` ), result.map = map); } catch (e) { log.error("failed to build sourcemap", e); } } return result; }; return wrapper; } // src/utils/options.ts import deepmerge from "deepmerge"; var allowedPluginOptions = /* @__PURE__ */ new Set([ "include", "exclude", "emitCss", "hot", "ignorePluginPreprocessors", "disableDependencyReinclusion", "experimental", "ssr" ]), knownRootOptions = /* @__PURE__ */ new Set(["extensions", "compilerOptions", "preprocess", "onwarn"]), allowedInlineOptions = /* @__PURE__ */ new Set([ "configFile", "kit", ...allowedPluginOptions, ...knownRootOptions ]); function validateInlineOptions(inlineOptions) { let invalidKeys = Object.keys(inlineOptions || {}).filter( (key) => !allowedInlineOptions.has(key) ); invalidKeys.length && log.warn(`invalid plugin options "${invalidKeys.join(", ")}" in inline config`, inlineOptions); } function convertPluginOptions(config) { if (!config) return; let invalidRootOptions = Object.keys(config).filter((key) => allowedPluginOptions.has(key)); if (invalidRootOptions.length > 0) throw new Error( `Invalid options in imba config. Move the following options into 'vitePlugin:{...}': ${invalidRootOptions.join( ", " )}` ); if (!config.vitePlugin) return { compilerOptions: config }; let pluginOptions = config.vitePlugin, pluginOptionKeys = Object.keys(pluginOptions), rootOptionsInPluginOptions = pluginOptionKeys.filter((key) => knownRootOptions.has(key)); if (rootOptionsInPluginOptions.length > 0) throw new Error( `Invalid options in imba config under vitePlugin:{...}', move them to the config root : ${rootOptionsInPluginOptions.join( ", " )}` ); let duplicateOptions = pluginOptionKeys.filter( (key) => Object.prototype.hasOwnProperty.call(config, key) ); if (duplicateOptions.length > 0) throw new Error( `Invalid duplicate options in imba config under vitePlugin:{...}', they are defined in root too and must only exist once: ${duplicateOptions.join( ", " )}` ); let unknownPluginOptions = pluginOptionKeys.filter((key) => !allowedPluginOptions.has(key)); unknownPluginOptions.length > 0 && (log.warn( `ignoring unknown plugin options in imba config under vitePlugin:{...}: ${unknownPluginOptions.join( ", " )}` ), unknownPluginOptions.forEach((unkownOption) => { delete pluginOptions[unkownOption]; })); let result = { ...config, ...pluginOptions }; return delete result.vitePlugin, { compilerOptions: result }; } async function preResolveOptions(inlineOptions = {}, viteUserConfig, viteEnv) { let viteConfigWithResolvedRoot = { ...viteUserConfig, root: resolveViteRoot(viteUserConfig) }, defaultOptions = { extensions: [".imba", ".imba1"], emitCss: !0 }, imbaConfig = convertPluginOptions( await loadImbaConfig(viteConfigWithResolvedRoot, inlineOptions) ), extraOptions = { root: viteConfigWithResolvedRoot.root, isBuild: viteEnv.command === "build", isServe: viteEnv.command === "serve", isDebug: process.env.DEBUG != null }, merged = mergeConfigs( defaultOptions, imbaConfig, inlineOptions, extraOptions ); return imbaConfig != null && imbaConfig.configFile && (merged.configFile = imbaConfig.configFile, merged.config = imbaConfig), merged; } function mergeConfigs(...configs) { let result = {}; for (let config of configs.filter(Boolean)) result = deepmerge(result, config, { arrayMerge: (target, source) => source ?? target }); return result; } function resolveOptions(preResolveOptions2, viteConfig) { let defaultOptions = { hot: viteConfig.isProduction ? !1 : { injectCss: !preResolveOptions2.emitCss }, compilerOptions: { css: !preResolveOptions2.emitCss, dev: !viteConfig.isProduction } }, extraOptions = { root: viteConfig.root, isProduction: viteConfig.isProduction }, merged = mergeConfigs(defaultOptions, preResolveOptions2, extraOptions); return removeIgnoredOptions(merged), addImbaKitOptions(merged), addExtraPreprocessors(merged, viteConfig), enforceOptionsForHmr(merged), enforceOptionsForProduction(merged), merged; } function enforceOptionsForHmr(options) { options.hot && (options.compilerOptions.dev || (log.warn("hmr is enabled but compilerOptions.dev is false, forcing it to true"), options.compilerOptions.dev = !0), options.emitCss ? (options.hot !== !0 && options.hot.injectCss && (log.warn("hmr and emitCss are enabled but hot.injectCss is true, forcing it to false"), options.hot.injectCss = !1), options.compilerOptions.css && (log.warn( "hmr and emitCss are enabled but compilerOptions.css is true, forcing it to false" ), options.compilerOptions.css = !1)) : ((options.hot === !0 || !options.hot.injectCss) && (log.warn( "hmr with emitCss disabled requires option hot.injectCss to be enabled, forcing it to true" ), options.hot === !0 ? options.hot = { injectCss: !0 } : options.hot.injectCss = !0), options.compilerOptions.css || (log.warn( "hmr with emitCss disabled requires compilerOptions.css to be enabled, forcing it to true" ), options.compilerOptions.css = !0))); } function enforceOptionsForProduction(options) { options.isProduction && (options.hot && (log.warn("options.hot is enabled but does not work on production build, forcing it to false"), options.hot = !1), options.compilerOptions.dev && (log.warn( "you are building for production but compilerOptions.dev is true, forcing it to false" ), options.compilerOptions.dev = !1)); } function removeIgnoredOptions(options) { let ignoredCompilerOptions = ["generate", "format", "filename"]; options.hot && options.emitCss && ignoredCompilerOptions.push("cssHash"); let passedIgnored = Object.keys(options.compilerOptions || {}).filter((o) => ignoredCompilerOptions.includes(o)); passedIgnored.length && (log.warn( `The following Imba compilerOptions are controlled by vite-plugin-imba and essential to its functionality. User-specified values are ignored. Please remove them from your configuration: ${passedIgnored.join( ", " )}` ), passedIgnored.forEach((ignored) => { delete options.compilerOptions[ignored]; })); } function addImbaKitOptions(options) { var _a; if ((options == null ? void 0 : options.kit) != null) { let kit_browser_hydrate = (_a = options.kit.browser) == null ? void 0 : _a.hydrate, hydratable = kit_browser_hydrate !== !1; options.compilerOptions.hydratable != null && options.compilerOptions.hydratable !== hydratable && log.warn( `Conflicting values "compilerOptions.hydratable: ${options.compilerOptions.hydratable}" and "kit.browser.hydrate: ${kit_browser_hydrate}" in your imba config. You should remove "compilerOptions.hydratable".` ), log.debug(`Setting compilerOptions.hydratable: ${hydratable} for ImbaKit`), options.compilerOptions.hydratable = hydratable; } } function resolveViteRoot(viteConfig) { return normalizePath2(viteConfig.root ? path4.resolve(viteConfig.root) : process.cwd()); } function buildExtraViteConfig(options, config) { var _a; let imbaDeps = findRootImbaDependencies(options.root), extraViteConfig = { resolve: { mainFields: [...IMBA_RESOLVE_MAIN_FIELDS], dedupe: [...IMBA_IMPORTS, ...IMBA_HMR_IMPORTS] } }; return extraViteConfig.optimizeDeps = buildOptimizeDepsForImba( imbaDeps, options, config.optimizeDeps ), (_a = options.experimental) != null && _a.prebundleImbaLibraries && (extraViteConfig.optimizeDeps = { ...extraViteConfig.optimizeDeps, extensions: options.extensions ?? [".imba", ".imba1"], esbuildOptions: { plugins: [{ name: facadeEsbuildImbaPluginName, setup: () => { } }] } }), extraViteConfig.ssr = buildSSROptionsForImba(imbaDeps, options, config, extraViteConfig), extraViteConfig; } function buildOptimizeDepsForImba(imbaDeps, options, optimizeDeps) { var _a; let include = [], exclude = ["imba-hmr"], isIncluded = (dep) => { var _a2; return include.includes(dep) || ((_a2 = optimizeDeps == null ? void 0 : optimizeDeps.include) == null ? void 0 : _a2.includes(dep)); }, isExcluded = (dep) => { var _a2; return exclude.includes(dep) || ((_a2 = optimizeDeps == null ? void 0 : optimizeDeps.exclude) == null ? void 0 : _a2.some((id) => dep === id || id.startsWith(`${dep}/`))); }; if (isExcluded("imba")) log.debug('"imba" is excluded in optimizeDeps.exclude, skipped adding it to include.'); else { let imbaImportsToInclude = IMBA_IMPORTS.filter((x) => x !== "imba/ssr"); log.debug( `adding bare imba packages to optimizeDeps.include: ${imbaImportsToInclude.join(", ")} ` ), include.push(...imbaImportsToInclude.filter((x) => !isIncluded(x))); } if ((_a = options.experimental) != null && _a.prebundleImbaLibraries) return { include, exclude }; imbaDeps = imbaDeps.filter((dep) => dep.type === "component-library"); let imbaDepsToExclude = Array.from(new Set(imbaDeps.map((dep) => dep.name))).filter( (dep) => !isIncluded(dep) ); if (log.debug(`automatically excluding found imba dependencies: ${imbaDepsToExclude.join(", ")}`), exclude.push(...imbaDepsToExclude.filter((x) => !isExcluded(x))), options.disableDependencyReinclusion !== !0) { let disabledReinclusions = options.disableDependencyReinclusion || []; disabledReinclusions.length > 0 && log.debug("not reincluding transitive dependencies of", disabledReinclusions); let transitiveDepsToInclude = imbaDeps.filter((dep) => !disabledReinclusions.includes(dep.name) && isExcluded(dep.name)).flatMap((dep) => { let localRequire = createRequire3(`${dep.dir}/package.json`); return Object.keys(dep.pkg.dependencies || {}).filter((depOfDep) => !isExcluded(depOfDep) && needsOptimization(depOfDep, localRequire)).map((depOfDep) => dep.path.concat(dep.name, depOfDep).join(" > ")); }); log.debug( "reincluding transitive dependencies of excluded imba dependencies", transitiveDepsToInclude ), include.push(...transitiveDepsToInclude); } return { include, exclude }; } function buildSSROptionsForImba(imbaDeps, options, config) { var _a, _b; let noExternal = []; (_b = (_a = config.ssr) == null ? void 0 : _a.external) != null && _b.includes("imba") || noExternal.push("imba", /^imba\//), noExternal.push( ...Array.from(new Set(imbaDeps.map((s) => s.name))).filter( (x) => { var _a2, _b2; return !((_b2 = (_a2 = config.ssr) == null ? void 0 : _a2.external) != null && _b2.includes(x)); } ) ); let ssr = { noExternal, external: [] }; return options.isServe && (ssr.external = Array.from( new Set(imbaDeps.flatMap((dep) => Object.keys(dep.pkg.dependencies || {}))) ).filter( (dep) => { var _a2, _b2; return !ssr.noExternal.includes(dep) && !((_b2 = (_a2 = config.ssr) == null ? void 0 : _a2.external) != null && _b2.includes(dep)); } )), ssr; } // src/utils/vite-plugin-imba-cache.ts var VitePluginImbaCache = class { constructor() { this._css = /* @__PURE__ */ new Map(); this._js = /* @__PURE__ */ new Map(); this._dependencies = /* @__PURE__ */ new Map(); this._dependants = /* @__PURE__ */ new Map(); this._resolvedImbaFields = /* @__PURE__ */ new Map(); this._errors = /* @__PURE__ */ new Map(); } update(compileData) { this._errors.delete(compileData.normalizedFilename), this.updateCSS(compileData), this.updateJS(compileData), this.updateDependencies(compileData); } has(imbaRequest) { let id = imbaRequest.normalizedFilename; return this._errors.has(id) || this._js.has(id) || this._css.has(id); } setError(imbaRequest, error) { this.remove(imbaRequest, !0), this._errors.set(imbaRequest.normalizedFilename, error); } updateCSS(compileData) { this._css.set(compileData.normalizedFilename, compileData.compiled.css); } updateJS(compileData) { compileData.ssr || this._js.set(compileData.normalizedFilename, compileData.compiled.js); } updateDependencies(compileData) { let id = compileData.normalizedFilename, prevDependencies = this._dependencies.get(id) || [], dependencies = compileData.dependencies; this._dependencies.set(id, dependencies); let removed = prevDependencies.filter((d) => !dependencies.includes(d)); dependencies.filter((d) => !prevDependencies.includes(d)).forEach((d) => { this._dependants.has(d) || this._dependants.set(d, /* @__PURE__ */ new Set()), this._dependants.get(d).add(compileData.filename); }), removed.forEach((d) => { this._dependants.get(d).delete(compileData.filename); }); } remove(imbaRequest, keepDependencies = !1) { let id = imbaRequest.normalizedFilename, removed = !1; if (this._errors.delete(id) && (removed = !0), this._js.delete(id) && (removed = !0), this._css.delete(id) && (removed = !0), !keepDependencies) { let dependencies = this._dependencies.get(id); dependencies && (removed = !0, dependencies.forEach((d) => { let dependants = this._dependants.get(d); dependants && dependants.has(imbaRequest.filename) && dependants.delete(imbaRequest.filename); }), this._dependencies.delete(id)); } return removed; } getCSS(imbaRequest) { return this._css.get(imbaRequest.normalizedFilename); } getJS(imbaRequest) { if (!imbaRequest.ssr) return this._js.get(imbaRequest.normalizedFilename); } getError(imbaRequest) { return this._errors.get(imbaRequest.normalizedFilename); } getDependants(path7) { let dependants = this._dependants.get(path7); return dependants ? [...dependants] : []; } getResolvedImbaField(name, importer) { return this._resolvedImbaFields.get(this._getResolvedImbaFieldKey(name, importer)); } setResolvedImbaField(importee, importer = void 0, resolvedImba) { this._resolvedImbaFields.set( this._getResolvedImbaFieldKey(importee, importer), resolvedImba ); } _getResolvedImbaFieldKey(importee, importer) { return importer ? `${importer} > ${importee}` : importee; } }; // src/utils/resolve.ts import path5 from "path"; import { builtinModules, createRequire as createRequire4 } from "module"; function resolveViaPackageJsonImba(importee, importer, cache) { if (importer && isBareImport(importee) && !isNodeInternal(importee) && !is_common_without_imba_field(importee)) { let cached = cache.getResolvedImbaField(importee, importer); if (cached) return cached; let localRequire = createRequire4(importer), pkgData = resolveDependencyData(importee, localRequire); if (pkgData) { let { pkg, dir } = pkgData; if (pkg.imba) { let result = path5.resolve(dir, pkg.imba); return cache.setResolvedImbaField(importee, importer, result), result; } } } } function isNodeInternal(importee) { return importee.startsWith("node:") || builtinModules.includes(importee); } function isBareImport(importee) { if (!importee || importee[0] === "." || importee[0] === "\0" || importee.includes(":") || path5.isAbsolute(importee)) return !1; let parts = importee.split("/"); switch (parts.length) { case 1: return !0; case 2: return parts[0].startsWith("@"); default: return !1; } } // src/utils/watch.ts import fs6 from "fs"; import path6 from "path"; function setupWatchers(options, cache, requestParser) { let { server, configFile: imbaConfigFile } = options; if (!server) return; let { watcher, ws } = server, { root, server: serverConfig } = server.config, emitChangeEventOnDependants = (filename) => { cache.getDependants(filename).forEach((dependant) => { fs6.existsSync(dependant) && (log.debug( `emitting virtual change event for "${dependant}" because depdendency "${filename}" changed` ), watcher.emit("change", dependant)); }); }, removeUnlinkedFromCache = (filename) => { let imbaRequest = requestParser(filename, !1); imbaRequest && cache.remove(imbaRequest) && log.debug(`cleared VitePluginImbaCache for deleted file ${filename}`); }, triggerViteRestart = (filename) => { if (serverConfig.middlewareMode) { let message = "Imba config change detected, restart your dev process to apply the changes."; log.info(message, filename), ws.send({ type: "error", err: { message, stack: "", plugin: "vite-plugin-imba", id: filename } }); } else log.info(`imba config changed: restarting vite server. - file: ${filename}`), server.restart(); }, listenerCollection = { add: [], change: [emitChangeEventOnDependants], unlink: [removeUnlinkedFromCache, emitChangeEventOnDependants] }; if (imbaConfigFile !== !1) { let possibleImbaConfigs = knownImbaConfigNames.map((cfg) => path6.join(root, cfg)), restartOnConfigAdd = (filename) => { possibleImbaConfigs.includes(filename) && triggerViteRestart(filename); }, restartOnConfigChange = (filename) => { filename === imbaConfigFile && triggerViteRestart(filename); }; imbaConfigFile ? (listenerCollection.change.push(restartOnConfigChange), listenerCollection.unlink.push(restartOnConfigChange)) : listenerCollection.add.push(restartOnConfigAdd); } Object.entries(listenerCollection).forEach(([evt, listeners]) => { listeners.length > 0 && watcher.on(evt, (filename) => listeners.forEach((listener) => listener(filename))); }); } function ensureWatchedFile(watcher, file, root) { file && !file.startsWith(root + "/") && !file.includes("\0") && fs6.existsSync(file) && watcher.add(path6.resolve(file)); } // src/handle-imba-hot-update.imba import "vite"; import * as Diff from "diff"; async function handleImbaHotUpdate(compileImba, ctx, imbaRequest, cache, options) { if (!cache.has(imbaRequest)) { log.debug("handleHotUpdate called before initial transform for " + imbaRequest.id); return; } let { read, server } = ctx, cachedJS = cache.getJS(imbaRequest), cachedCss = cache.getCSS(imbaRequest), content = await read(), compileData; try { options.compilerOptions.sourcemap = !1, compileData = await compileImba(imbaRequest, content, options), cache.update(compileData); } catch (e) { throw cache.setError(imbaRequest, e), e; } let affectedModules = /* @__PURE__ */ new Set(), cssModule = server.moduleGraph.getModuleById(imbaRequest.cssId), mainModule = server.moduleGraph.getModuleById(imbaRequest.id); cssModule && cssChanged(cachedCss, compileData.compiled.css) && (log.debug("handleHotUpdate css changed for " + imbaRequest.cssId), affectedModules.add(cssModule)); let jsUpdated = mainModule && jsChanged(cachedJS, compileData.compiled.js, imbaRequest.filename); jsUpdated && (log.debug("handleHotUpdate js changed for " + imbaRequest.id), affectedModules.add(mainModule)), jsUpdated || logCompilerWarnings(imbaRequest, compileData.compiled.warnings, options); let result = [...affectedModules].filter(Boolean), ssrModulesToInvalidate = result.filter(function(m) { return !!m.ssrTransformResult; }); return ssrModulesToInvalidate.length > 0 && (log.debug("invalidating modules " + ssrModulesToInvalidate.map(function(_0) { return _0.id; }).join(", ")), ssrModulesToInvalidate.forEach(function(moduleNode) { return server.moduleGraph.invalidateModule(moduleNode); })), result.length > 0 && log.debug("handleHotUpdate for " + imbaRequest.id + " result: " + result.map(function(_0) { return _0.id; }).join(", ")), result; } function isCodeEqual(prev, next) { return !prev && !next ? !0 : !prev && next || prev && !next ? !1 : prev === next; } function cssChanged(prev, next) { return !isCodeEqual(prev == null ? void 0 : prev.code, next == null ? void 0 : next.code); } function jsChanged(prev, next, filename) { let prevJs = prev == null ? void 0 : prev.code; if (!prevJs) return !0; let i = prevJs.indexOf(` /*__css_import__*/`); prevJs = prevJs.replace(/^\/\/#\ssourceMapp(.*)$/mg, "").replace(` /*__css_import__*/`, "/*__css_import__*/"); let nextJs = next == null ? void 0 : next.code, diff = Diff.diffChars(prevJs, nextJs), addedOrRemoved = []; return diff.forEach(function(part) { let color = part.added ? "\x1B[32m" : part.removed ? "\x1B[31m" : "\x1B[33m", what = part.added ? "part.added" : part.removed ? "part.removed" : "no change"; if (part.added || part.removed) return addedOrRemoved.push({ color, what, value: part.value }); }), !!addedOrRemoved.find(function(_0) { return _0.value.replace(/\n/g, "") !== ""; }); } // src/index.imba import "url"; function imba(inlineOptions = {}) { let name = "vite-plugin-imba", enforce = "pre", requestParser, compileImba, options, viteConfig, api = {}, resolvedImbaSSR, testΦ; validateInlineOptions(inlineOptions); let cache = new VitePluginImbaCache(), plugins = []; async function config(config2, configEnv) { process.env.DEBUG ? log.setLevel("debug") : config2.logLevel && log.setLevel(config2.logLevel), options = await preResolveOptions(inlineOptions, config2, configEnv); let extraViteConfig = buildExtraViteConfig(options, config2); return log.debug("additional vite config", extraViteConfig), testΦ = configEnv.mode === "test", extraViteConfig; } function configResolved(config2) { return options = resolveOptions(options, config2), requestParser = buildIdParser(options), compileImba = createCompileImba(options), viteConfig = config2, api.options = options, log.debug("resolved options", options); } async function transform(code, id, opts) { let ssr = !!(opts != null && opts.ssr), imbaRequest = requestParser(id, ssr); if (!imbaRequest || imbaRequest.query.imba) return; let compiledData; try { compiledData = await compileImba(imbaRequest, code, options); } catch (e) { throw cache.setError(imbaRequest, e), toRollupError(e, options); } return logCompilerWarnings( imbaRequest, compiledData.compiled.warnings, options ), cache.update(compiledData), compiledData.dependencies.length && options.server && compiledData.dependencies.forEach(function(d) { return ensureWatchedFile(options.server.watcher, d, options.root); }), log.debug("transform returns compiled js for " + imbaRequest.filename), { ...compiledData.compiled.js, meta: { vite: { lang: compiledData.lang } } }; } function load(id, opts) { let ssr = !!(opts != null && opts.ssr), imbaRequest = requestParser(id, !!ssr); if (imbaRequest) { let { filename, query } = imbaRequest; if (query.imba && query.type === "style") { let _css = cache.getCSS(imbaRequest); if (_css) return log.debug("load returns css for " + filename), _css; console.log("cache empty: loading " + id); } if (viteConfig.assetsInclude(filename)) return log.debug("load returns raw content for " + filename), fs.readFileSync(filename, "utf-8"); } } function resolveId(importee, importer, opts) { let ssr = !!(opts != null && opts.ssr) || options.ssr; testΦ && (ssr = !1); let imbaRequest = requestParser(importee, ssr); if (imbaRequest != null && imbaRequest.query.imba) return imbaRequest.query.type === "style" ? (log.debug("resolveId resolved virtual css module " + imbaRequest.cssId), imbaRequest.cssId) : (log.debug("resolveId resolved " + importee), importee); if (ssr && importee === "imba") return resolvedImbaSSR || (resolvedImbaSSR = this.resolve("imba/server", void 0, { skipSelf: !0 }).then(function(imbaSSR) { return log.debug("resolved imba to imba/server"), imbaSSR; })), resolvedImbaSSR; try { let resolved = resolveViaPackageJsonImba(importee, importer, cache); if (resolved) return log.debug("resolveId resolved $" + resolved + " via package.json imba field of " + importee), resolved; } catch (e) { return log.debug.once("error trying to resolve " + importee + " from " + importer + " via package.json imba field ", e); } } function configureServer(server) { return options.server = server, setupWatchers(options, cache, requestParser); } async function handleHotUpdate(ctx) { if (!options.hot || !options.emitCss) return; let imbaRequest = requestParser(ctx.file, !1, ctx.timestamp); if (imbaRequest) try { return await handleImbaHotUpdate(compileImba, ctx, imbaRequest, cache, options); } catch (e) { throw toRollupError(e, options); } } return plugins.push(svgΞplugin()), plugins.push( { name: "vite-plugin-imba", enforce: "pre", api, config, configResolved, transform, load, resolveId, configureServer, handleHotUpdate } ), plugins; } export { imba }; //__FOOT__