@leadconnector/vibe-tagger 0.3.0 → 0.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +3 -9
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +3 -9
- package/dist/index.js.map +1 -1
- package/package.json +2 -1
package/dist/index.cjs
CHANGED
|
@@ -207,6 +207,7 @@ function createJsxTaggerFeature() {
|
|
|
207
207
|
}
|
|
208
208
|
|
|
209
209
|
// src/features/tailwindConfig.ts
|
|
210
|
+
var import_chokidar = __toESM(require("chokidar"), 1);
|
|
210
211
|
var esbuild = __toESM(require("esbuild"), 1);
|
|
211
212
|
var import_promises = __toESM(require("fs/promises"), 1);
|
|
212
213
|
var import_path = __toESM(require("path"), 1);
|
|
@@ -361,20 +362,13 @@ function createTailwindConfigFeature() {
|
|
|
361
362
|
async onBuildStart() {
|
|
362
363
|
await run();
|
|
363
364
|
},
|
|
364
|
-
onConfigureServer(
|
|
365
|
+
onConfigureServer() {
|
|
365
366
|
try {
|
|
366
367
|
const v3ConfigFile = import_path.default.resolve(projectRoot, V3_CONFIG_RELATIVE);
|
|
367
368
|
const v4Candidates = V4_CSS_CANDIDATES.map(
|
|
368
369
|
(c) => import_path.default.resolve(projectRoot, c)
|
|
369
370
|
);
|
|
370
|
-
|
|
371
|
-
for (const p of watchPaths)
|
|
372
|
-
server.watcher.add(p);
|
|
373
|
-
const normalized = new Set(watchPaths.map((p) => import_path.default.normalize(p)));
|
|
374
|
-
server.watcher.on("change", async (changedPath) => {
|
|
375
|
-
if (normalized.has(import_path.default.normalize(changedPath)))
|
|
376
|
-
await run();
|
|
377
|
-
});
|
|
371
|
+
import_chokidar.default.watch([v3ConfigFile, ...v4Candidates], { ignoreInitial: true }).on("change", run);
|
|
378
372
|
} catch (error) {
|
|
379
373
|
console.error("[vibe-tagger] Error adding tailwind watcher:", error);
|
|
380
374
|
}
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/devRuntimeCode.ts","../src/features/jsxSource.ts","../src/features/tailwindConfig.ts","../src/plugin.ts"],"sourcesContent":["export { vibeTagger as componentTagger } from \"./plugin\";\nexport type { VibeTaggerOptions } from \"./plugin\";\n","// Runtime code that replaces react/jsx-dev-runtime in the browser.\n// Served as a virtual module by the Vite plugin.\n\nconst devRuntimeCode = [\n 'import * as ReactJSXDevRuntime from \"react/jsx-dev-runtime\";',\n \"\",\n \"const _jsxDEV = ReactJSXDevRuntime.jsxDEV;\",\n \"export const Fragment = ReactJSXDevRuntime.Fragment;\",\n \"\",\n // SSR/test guard. Vite SSR, vitest, and Node prerender contexts have no\n // `window` — touching it at module init would crash before any component\n // renders. We still install the wrapper so React's JSX dev runtime stays\n // wired up, but skip the per-element tagging path entirely. Matches\n // lovable-tagger >=1.3.0.\n 'const _isBrowser = typeof window !== \"undefined\";',\n \"\",\n 'const SOURCE_KEY = Symbol.for(\"__jsxSource__\");',\n \"\",\n \"const cleanFileName = (fileName) => {\",\n ' if (!fileName) return \"\";',\n ' if (fileName.includes(\"dev_server\")) {',\n ' fileName = fileName.split(\"dev_server\")[1].slice(1);',\n \" }\",\n ' if (fileName.includes(\"sandbox-scheduler/sandbox\")) {',\n ' const sandboxPart = fileName.split(\"sandbox-scheduler/\")[1];',\n ' fileName = sandboxPart.split(\"/\").slice(1).join(\"/\");',\n \" }\",\n ' return fileName.replace(/^\\\\/dev-server\\\\//, \"\");',\n \"};\",\n \"\",\n \"const sourceElementMap = new Map();\",\n \"if (_isBrowser) {\",\n \" window.sourceElementMap = sourceElementMap;\",\n \"}\",\n \"\",\n \"function getSourceKey(sourceInfo) {\",\n \" return `${cleanFileName(sourceInfo.fileName)}:${sourceInfo.lineNumber}:${sourceInfo.columnNumber}`;\",\n \"}\",\n \"\",\n \"function unregisterElement(node, sourceInfo) {\",\n \" const key = getSourceKey(sourceInfo);\",\n \" const refs = sourceElementMap.get(key);\",\n \" if (refs) {\",\n \" for (const ref of refs) {\",\n \" if (ref.deref() === node) {\",\n \" refs.delete(ref);\",\n \" break;\",\n \" }\",\n \" }\",\n \" if (refs.size === 0) {\",\n \" sourceElementMap.delete(key);\",\n \" }\",\n \" }\",\n \"}\",\n \"\",\n \"function registerElement(node, sourceInfo) {\",\n \" const key = getSourceKey(sourceInfo);\",\n \" if (!sourceElementMap.has(key)) {\",\n \" sourceElementMap.set(key, new Set());\",\n \" }\",\n \" sourceElementMap.get(key).add(new WeakRef(node));\",\n \"}\",\n \"\",\n \"function getTypeName(type) {\",\n ' if (typeof type === \"string\") return type;',\n ' if (typeof type === \"function\") return type.displayName || type.name || \"Unknown\";',\n ' if (typeof type === \"object\" && type !== null) {',\n ' return type.displayName || type.render?.displayName || type.render?.name || \"Unknown\";',\n \" }\",\n ' return \"Unknown\";',\n \"}\",\n \"\",\n \"export function jsxDEV(type, props, key, isStatic, source, self) {\",\n \" // During SSR / non-browser execution, skip all tagging and pass\",\n \" // straight through to React. Touching DOM refs or the source map\",\n \" // here would crash on Node-only paths (Vite SSR, vitest, etc.).\",\n \" if (!_isBrowser) {\",\n \" return _jsxDEV(type, props, key, isStatic, source, self);\",\n \" }\",\n \"\",\n \" // For custom components (like <Icon />, <Button />), tag their rendered output\",\n \" // This captures the JSX element name for library components that don't have source info\",\n ' if (source?.fileName && typeof type !== \"string\" && type !== Fragment) {',\n \" const typeName = getTypeName(type);\",\n \" const jsxSourceInfo = {\",\n \" fileName: cleanFileName(source.fileName),\",\n \" lineNumber: source.lineNumber,\",\n \" columnNumber: source.columnNumber,\",\n \" displayName: typeName,\",\n \" };\",\n \"\",\n \" const originalRef = props?.ref;\",\n \" const enhancedProps = {\",\n \" ...props,\",\n \" ref: (node) => {\",\n \" if (node) {\",\n \" // Only tag if this element doesn't already have source info\",\n \" // (library components won't have it, user components will)\",\n \" if (!node[SOURCE_KEY]) {\",\n \" node[SOURCE_KEY] = jsxSourceInfo;\",\n \" registerElement(node, jsxSourceInfo);\",\n \" }\",\n \" }\",\n ' if (typeof originalRef === \"function\") {',\n \" originalRef(node);\",\n ' } else if (originalRef && typeof originalRef === \"object\") {',\n \" originalRef.current = node;\",\n \" }\",\n \" },\",\n \" };\",\n \"\",\n \" return _jsxDEV(type, enhancedProps, key, isStatic, source, self);\",\n \" }\",\n \"\",\n \" // For host elements (div, span, etc.), tag with component context\",\n ' if (source?.fileName && typeof type === \"string\") {',\n \" const sourceInfo = {\",\n \" fileName: cleanFileName(source.fileName),\",\n \" lineNumber: source.lineNumber,\",\n \" columnNumber: source.columnNumber,\",\n \" displayName: type,\",\n \" };\",\n \"\",\n \" const originalRef = props?.ref;\",\n \"\",\n \" const enhancedProps = {\",\n \" ...props,\",\n \" ref: (node) => {\",\n \" if (node) {\",\n \" const existingSource = node[SOURCE_KEY];\",\n \" if (existingSource) {\",\n \" if (getSourceKey(existingSource) !== getSourceKey(sourceInfo)) {\",\n \" unregisterElement(node, existingSource);\",\n \" node[SOURCE_KEY] = sourceInfo;\",\n \" registerElement(node, sourceInfo);\",\n \" }\",\n \" } else {\",\n \" node[SOURCE_KEY] = sourceInfo;\",\n \" registerElement(node, sourceInfo);\",\n \" }\",\n \" }\",\n ' if (typeof originalRef === \"function\") {',\n \" originalRef(node);\",\n ' } else if (originalRef && typeof originalRef === \"object\") {',\n \" originalRef.current = node;\",\n \" }\",\n \" },\",\n \" };\",\n \" return _jsxDEV(type, enhancedProps, key, isStatic, source, self);\",\n \" }\",\n \"\",\n \" return _jsxDEV(type, props, key, isStatic, source, self);\",\n \"}\",\n].join(\"\\n\");\n\nexport default devRuntimeCode;\n","import devRuntimeCode from \"../devRuntimeCode\";\n\nexport interface JsxSourceFeature {\n resolveId(id: string, importer?: string): string | null;\n load(id: string): string | null;\n}\n\nexport function createJsxTaggerFeature(): JsxSourceFeature {\n return {\n resolveId(id: string, importer?: string): string | null {\n if (id === \"react/jsx-dev-runtime\" && !importer?.includes(\"\\0jsx-source\")) {\n return \"\\0jsx-source/jsx-dev-runtime\";\n }\n return null;\n },\n load(id: string): string | null {\n if (id === \"\\0jsx-source/jsx-dev-runtime\") {\n return devRuntimeCode;\n }\n return null;\n },\n };\n}\n","import type { ResolvedConfig, ViteDevServer } from \"vite\";\nimport * as esbuild from \"esbuild\";\nimport fs from \"fs/promises\";\nimport path from \"path\";\nimport resolveConfig from \"tailwindcss/resolveConfig.js\";\n\nexport interface TailwindConfigFeature {\n onConfigResolved(config: ResolvedConfig): void;\n onBuildStart(): Promise<void>;\n onConfigureServer(server: ViteDevServer): void;\n}\n\nconst V4_CSS_CANDIDATES = [\n \"src/styles.css\",\n \"src/index.css\",\n \"src/globals.css\",\n \"src/app.css\",\n];\n\nconst V4_NAMESPACES: Record<string, string> = {\n colors: \"--color\",\n screens: \"--breakpoint\",\n spacing: \"--spacing\",\n borderRadius: \"--radius\",\n fontFamily: \"--font\",\n opacity: \"--opacity\",\n};\n\nconst OUTFILE_RELATIVE = \"./src/tailwind.config.vibe.json\";\nconst INTERMEDIATE_RELATIVE = \"./.vibe.tailwind.config.js\";\nconst V3_CONFIG_RELATIVE = \"./tailwind.config.ts\";\n\nasync function findV4CssEntry(projectRoot: string): Promise<string | null> {\n for (const candidate of V4_CSS_CANDIDATES) {\n const abs = path.resolve(projectRoot, candidate);\n try {\n const contents = await fs.readFile(abs, \"utf8\");\n if (/@import\\s+[\"']tailwindcss/.test(contents)) return abs;\n } catch {\n // missing file — try next\n }\n }\n return null;\n}\n\ntype LoadDesignSystem = (\n css: string,\n opts: { base: string },\n) => Promise<{\n theme: {\n namespace(ns: string): Iterable<[string | null, string]>;\n };\n}>;\n\nasync function loadDesignSystemFromProject(): Promise<LoadDesignSystem | null> {\n try {\n // Dynamic import so consumers not on v4 don't need the package installed.\n const modName = \"@tailwindcss/node\";\n const mod = (await import(modName)) as {\n __unstable__loadDesignSystem?: LoadDesignSystem;\n };\n return mod.__unstable__loadDesignSystem ?? null;\n } catch {\n return null;\n }\n}\n\nfunction parseRootVars(css: string): Record<string, string> {\n const vars: Record<string, string> = {};\n const rootMatch = css.match(/:root\\s*\\{([^}]*)\\}/s);\n if (!rootMatch) return vars;\n for (const decl of rootMatch[1]!.split(\";\")) {\n const trimmed = decl.trim();\n if (!trimmed.startsWith(\"--\")) continue;\n const colon = trimmed.indexOf(\":\");\n if (colon === -1) continue;\n const key = trimmed.slice(0, colon).trim();\n const value = trimmed.slice(colon + 1).trim();\n if (key && value) vars[key] = value;\n }\n return vars;\n}\n\nfunction resolveVars(\n value: string,\n rootVars: Record<string, string>,\n depth = 0,\n): string {\n if (depth > 8) return value;\n return value.replace(\n /var\\(\\s*(--[\\w-]+)(?:\\s*,\\s*([^)]+))?\\s*\\)/g,\n (match, name: string, fallback: string | undefined) => {\n const resolved = rootVars[name];\n if (resolved !== undefined) return resolveVars(resolved, rootVars, depth + 1);\n return fallback ?? match;\n },\n );\n}\n\nasync function generateV4Config(\n cssEntry: string,\n outfile: string,\n load: LoadDesignSystem,\n): Promise<void> {\n const css = await fs.readFile(cssEntry, \"utf8\");\n const ds = await load(css, { base: path.dirname(cssEntry) });\n const rootVars = parseRootVars(css);\n const theme: Record<string, Record<string, string>> = {};\n for (const [configKey, namespace] of Object.entries(V4_NAMESPACES)) {\n const entries: Record<string, string> = {};\n for (const [key, rawValue] of ds.theme.namespace(namespace)) {\n if (key === null) continue;\n entries[key] = resolveVars(rawValue, rootVars);\n }\n theme[configKey] = entries;\n }\n await fs.mkdir(path.dirname(outfile), { recursive: true });\n await fs.writeFile(outfile, JSON.stringify({ theme }, null, 2));\n}\n\nasync function generateV3Config(\n tailwindInputFile: string,\n tailwindIntermediateFile: string,\n tailwindJsonOutfile: string,\n): Promise<void> {\n await esbuild.build({\n entryPoints: [tailwindInputFile],\n outfile: tailwindIntermediateFile,\n bundle: true,\n format: \"esm\",\n banner: {\n js: 'import { createRequire } from \"module\"; const require = createRequire(import.meta.url);',\n },\n });\n try {\n const userConfig = (await import(\n tailwindIntermediateFile + \"?update=\" + Date.now()\n )) as { default?: unknown };\n if (!userConfig || !userConfig.default) {\n throw new Error(\"Invalid Tailwind config structure\");\n }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const resolved = (resolveConfig as any)(userConfig.default);\n await fs.writeFile(tailwindJsonOutfile, JSON.stringify(resolved, null, 2));\n } finally {\n await fs.unlink(tailwindIntermediateFile).catch(() => {});\n }\n}\n\nexport function createTailwindConfigFeature(): TailwindConfigFeature {\n let projectRoot = \"\";\n\n const run = async (): Promise<void> => {\n if (!projectRoot) return;\n const outfile = path.resolve(projectRoot, OUTFILE_RELATIVE);\n\n // Prefer v4 when the CSS entry uses `@import \"tailwindcss\"` and\n // @tailwindcss/node is available.\n const cssEntry = await findV4CssEntry(projectRoot);\n if (cssEntry) {\n const load = await loadDesignSystemFromProject();\n if (load) {\n try {\n await generateV4Config(cssEntry, outfile, load);\n console.log(`[vibe-tagger] wrote ${outfile}`);\n return;\n } catch (error) {\n console.error(\"[vibe-tagger] Error generating v4 tailwind config:\", error);\n return;\n }\n }\n }\n\n // Fall back to v3: compile tailwind.config.ts via esbuild, then resolveConfig.\n const v3ConfigFile = path.resolve(projectRoot, V3_CONFIG_RELATIVE);\n try {\n await fs.access(v3ConfigFile);\n } catch {\n return;\n }\n const intermediate = path.resolve(projectRoot, INTERMEDIATE_RELATIVE);\n try {\n await generateV3Config(v3ConfigFile, intermediate, outfile);\n console.log(`[vibe-tagger] wrote ${outfile}`);\n } catch (error) {\n console.error(\"[vibe-tagger] Error generating v3 tailwind config:\", error);\n }\n };\n\n return {\n onConfigResolved(config) {\n projectRoot = config.root;\n },\n async onBuildStart() {\n await run();\n },\n onConfigureServer(server) {\n try {\n const v3ConfigFile = path.resolve(projectRoot, V3_CONFIG_RELATIVE);\n const v4Candidates = V4_CSS_CANDIDATES.map((c) =>\n path.resolve(projectRoot, c),\n );\n const watchPaths = [v3ConfigFile, ...v4Candidates];\n for (const p of watchPaths) server.watcher.add(p);\n const normalized = new Set(watchPaths.map((p) => path.normalize(p)));\n server.watcher.on(\"change\", async (changedPath) => {\n if (normalized.has(path.normalize(changedPath))) await run();\n });\n } catch (error) {\n console.error(\"[vibe-tagger] Error adding tailwind watcher:\", error);\n }\n },\n };\n}\n","import type { Plugin, ResolvedConfig, ViteDevServer } from \"vite\";\nimport { createJsxTaggerFeature } from \"./features/jsxSource\";\nimport { createTailwindConfigFeature } from \"./features/tailwindConfig\";\n\nexport interface VibeTaggerOptions {\n /** Enable JSX source tagging. Default: true */\n jsxSource?: boolean;\n /**\n * Emit a resolved Tailwind theme JSON to `src/tailwind.config.vibe.json`\n * on build start and on config-file changes. Supports Tailwind v3\n * (reads `tailwind.config.ts`) and v4 (reads `src/styles.css` etc.).\n * Default: false\n */\n tailwindConfig?: boolean;\n /** Enable debug logging. Default: false */\n debug?: boolean;\n}\n\ninterface Feature {\n resolveId?(id: string, importer?: string): string | null;\n load?(id: string): string | null;\n onConfigResolved?(config: ResolvedConfig): void;\n onBuildStart?(): void | Promise<void>;\n onConfigureServer?(server: ViteDevServer): void;\n}\n\nexport function vibeTagger({\n jsxSource = true,\n tailwindConfig = false,\n debug: _debug = false,\n}: VibeTaggerOptions = {}): Plugin {\n const features: Feature[] = [];\n\n if (jsxSource) features.push(createJsxTaggerFeature());\n if (tailwindConfig) features.push(createTailwindConfigFeature());\n\n return {\n name: \"vibe-tagger\",\n enforce: \"pre\",\n\n configResolved(config) {\n for (const feature of features) feature.onConfigResolved?.(config);\n },\n\n async buildStart() {\n for (const feature of features) await feature.onBuildStart?.();\n },\n\n configureServer(server) {\n for (const feature of features) feature.onConfigureServer?.(server);\n },\n\n resolveId(id: string, importer?: string) {\n for (const feature of features) {\n const result = feature.resolveId?.(id, importer);\n if (result !== null && result !== undefined) return result;\n }\n return null;\n },\n\n load(id: string) {\n for (const feature of features) {\n const result = feature.load?.(id);\n if (result !== null && result !== undefined) return result;\n }\n return null;\n },\n };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACGA,IAAM,iBAAiB;AAAA,EACrB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;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","names":["path","fs","resolveConfig"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/devRuntimeCode.ts","../src/features/jsxSource.ts","../src/features/tailwindConfig.ts","../src/plugin.ts"],"sourcesContent":["export { vibeTagger as componentTagger } from \"./plugin\";\nexport type { VibeTaggerOptions } from \"./plugin\";\n","// Runtime code that replaces react/jsx-dev-runtime in the browser.\n// Served as a virtual module by the Vite plugin.\n\nconst devRuntimeCode = [\n 'import * as ReactJSXDevRuntime from \"react/jsx-dev-runtime\";',\n \"\",\n \"const _jsxDEV = ReactJSXDevRuntime.jsxDEV;\",\n \"export const Fragment = ReactJSXDevRuntime.Fragment;\",\n \"\",\n // SSR/test guard. Vite SSR, vitest, and Node prerender contexts have no\n // `window` — touching it at module init would crash before any component\n // renders. We still install the wrapper so React's JSX dev runtime stays\n // wired up, but skip the per-element tagging path entirely. Matches\n // lovable-tagger >=1.3.0.\n 'const _isBrowser = typeof window !== \"undefined\";',\n \"\",\n 'const SOURCE_KEY = Symbol.for(\"__jsxSource__\");',\n \"\",\n \"const cleanFileName = (fileName) => {\",\n ' if (!fileName) return \"\";',\n ' if (fileName.includes(\"dev_server\")) {',\n ' fileName = fileName.split(\"dev_server\")[1].slice(1);',\n \" }\",\n ' if (fileName.includes(\"sandbox-scheduler/sandbox\")) {',\n ' const sandboxPart = fileName.split(\"sandbox-scheduler/\")[1];',\n ' fileName = sandboxPart.split(\"/\").slice(1).join(\"/\");',\n \" }\",\n ' return fileName.replace(/^\\\\/dev-server\\\\//, \"\");',\n \"};\",\n \"\",\n \"const sourceElementMap = new Map();\",\n \"if (_isBrowser) {\",\n \" window.sourceElementMap = sourceElementMap;\",\n \"}\",\n \"\",\n \"function getSourceKey(sourceInfo) {\",\n \" return `${cleanFileName(sourceInfo.fileName)}:${sourceInfo.lineNumber}:${sourceInfo.columnNumber}`;\",\n \"}\",\n \"\",\n \"function unregisterElement(node, sourceInfo) {\",\n \" const key = getSourceKey(sourceInfo);\",\n \" const refs = sourceElementMap.get(key);\",\n \" if (refs) {\",\n \" for (const ref of refs) {\",\n \" if (ref.deref() === node) {\",\n \" refs.delete(ref);\",\n \" break;\",\n \" }\",\n \" }\",\n \" if (refs.size === 0) {\",\n \" sourceElementMap.delete(key);\",\n \" }\",\n \" }\",\n \"}\",\n \"\",\n \"function registerElement(node, sourceInfo) {\",\n \" const key = getSourceKey(sourceInfo);\",\n \" if (!sourceElementMap.has(key)) {\",\n \" sourceElementMap.set(key, new Set());\",\n \" }\",\n \" sourceElementMap.get(key).add(new WeakRef(node));\",\n \"}\",\n \"\",\n \"function getTypeName(type) {\",\n ' if (typeof type === \"string\") return type;',\n ' if (typeof type === \"function\") return type.displayName || type.name || \"Unknown\";',\n ' if (typeof type === \"object\" && type !== null) {',\n ' return type.displayName || type.render?.displayName || type.render?.name || \"Unknown\";',\n \" }\",\n ' return \"Unknown\";',\n \"}\",\n \"\",\n \"export function jsxDEV(type, props, key, isStatic, source, self) {\",\n \" // During SSR / non-browser execution, skip all tagging and pass\",\n \" // straight through to React. Touching DOM refs or the source map\",\n \" // here would crash on Node-only paths (Vite SSR, vitest, etc.).\",\n \" if (!_isBrowser) {\",\n \" return _jsxDEV(type, props, key, isStatic, source, self);\",\n \" }\",\n \"\",\n \" // For custom components (like <Icon />, <Button />), tag their rendered output\",\n \" // This captures the JSX element name for library components that don't have source info\",\n ' if (source?.fileName && typeof type !== \"string\" && type !== Fragment) {',\n \" const typeName = getTypeName(type);\",\n \" const jsxSourceInfo = {\",\n \" fileName: cleanFileName(source.fileName),\",\n \" lineNumber: source.lineNumber,\",\n \" columnNumber: source.columnNumber,\",\n \" displayName: typeName,\",\n \" };\",\n \"\",\n \" const originalRef = props?.ref;\",\n \" const enhancedProps = {\",\n \" ...props,\",\n \" ref: (node) => {\",\n \" if (node) {\",\n \" // Only tag if this element doesn't already have source info\",\n \" // (library components won't have it, user components will)\",\n \" if (!node[SOURCE_KEY]) {\",\n \" node[SOURCE_KEY] = jsxSourceInfo;\",\n \" registerElement(node, jsxSourceInfo);\",\n \" }\",\n \" }\",\n ' if (typeof originalRef === \"function\") {',\n \" originalRef(node);\",\n ' } else if (originalRef && typeof originalRef === \"object\") {',\n \" originalRef.current = node;\",\n \" }\",\n \" },\",\n \" };\",\n \"\",\n \" return _jsxDEV(type, enhancedProps, key, isStatic, source, self);\",\n \" }\",\n \"\",\n \" // For host elements (div, span, etc.), tag with component context\",\n ' if (source?.fileName && typeof type === \"string\") {',\n \" const sourceInfo = {\",\n \" fileName: cleanFileName(source.fileName),\",\n \" lineNumber: source.lineNumber,\",\n \" columnNumber: source.columnNumber,\",\n \" displayName: type,\",\n \" };\",\n \"\",\n \" const originalRef = props?.ref;\",\n \"\",\n \" const enhancedProps = {\",\n \" ...props,\",\n \" ref: (node) => {\",\n \" if (node) {\",\n \" const existingSource = node[SOURCE_KEY];\",\n \" if (existingSource) {\",\n \" if (getSourceKey(existingSource) !== getSourceKey(sourceInfo)) {\",\n \" unregisterElement(node, existingSource);\",\n \" node[SOURCE_KEY] = sourceInfo;\",\n \" registerElement(node, sourceInfo);\",\n \" }\",\n \" } else {\",\n \" node[SOURCE_KEY] = sourceInfo;\",\n \" registerElement(node, sourceInfo);\",\n \" }\",\n \" }\",\n ' if (typeof originalRef === \"function\") {',\n \" originalRef(node);\",\n ' } else if (originalRef && typeof originalRef === \"object\") {',\n \" originalRef.current = node;\",\n \" }\",\n \" },\",\n \" };\",\n \" return _jsxDEV(type, enhancedProps, key, isStatic, source, self);\",\n \" }\",\n \"\",\n \" return _jsxDEV(type, props, key, isStatic, source, self);\",\n \"}\",\n].join(\"\\n\");\n\nexport default devRuntimeCode;\n","import devRuntimeCode from \"../devRuntimeCode\";\n\nexport interface JsxSourceFeature {\n resolveId(id: string, importer?: string): string | null;\n load(id: string): string | null;\n}\n\nexport function createJsxTaggerFeature(): JsxSourceFeature {\n return {\n resolveId(id: string, importer?: string): string | null {\n if (id === \"react/jsx-dev-runtime\" && !importer?.includes(\"\\0jsx-source\")) {\n return \"\\0jsx-source/jsx-dev-runtime\";\n }\n return null;\n },\n load(id: string): string | null {\n if (id === \"\\0jsx-source/jsx-dev-runtime\") {\n return devRuntimeCode;\n }\n return null;\n },\n };\n}\n","import type { ResolvedConfig, ViteDevServer } from \"vite\";\nimport chokidar from \"chokidar\";\nimport * as esbuild from \"esbuild\";\nimport fs from \"fs/promises\";\nimport path from \"path\";\nimport resolveConfig from \"tailwindcss/resolveConfig.js\";\n\nexport interface TailwindConfigFeature {\n onConfigResolved(config: ResolvedConfig): void;\n onBuildStart(): Promise<void>;\n onConfigureServer(server: ViteDevServer): void;\n}\n\nconst V4_CSS_CANDIDATES = [\n \"src/styles.css\",\n \"src/index.css\",\n \"src/globals.css\",\n \"src/app.css\",\n];\n\nconst V4_NAMESPACES: Record<string, string> = {\n colors: \"--color\",\n screens: \"--breakpoint\",\n spacing: \"--spacing\",\n borderRadius: \"--radius\",\n fontFamily: \"--font\",\n opacity: \"--opacity\",\n};\n\nconst OUTFILE_RELATIVE = \"./src/tailwind.config.vibe.json\";\nconst INTERMEDIATE_RELATIVE = \"./.vibe.tailwind.config.js\";\nconst V3_CONFIG_RELATIVE = \"./tailwind.config.ts\";\n\nasync function findV4CssEntry(projectRoot: string): Promise<string | null> {\n for (const candidate of V4_CSS_CANDIDATES) {\n const abs = path.resolve(projectRoot, candidate);\n try {\n const contents = await fs.readFile(abs, \"utf8\");\n if (/@import\\s+[\"']tailwindcss/.test(contents)) return abs;\n } catch {\n // missing file — try next\n }\n }\n return null;\n}\n\ntype LoadDesignSystem = (\n css: string,\n opts: { base: string },\n) => Promise<{\n theme: {\n namespace(ns: string): Iterable<[string | null, string]>;\n };\n}>;\n\nasync function loadDesignSystemFromProject(): Promise<LoadDesignSystem | null> {\n try {\n // Dynamic import so consumers not on v4 don't need the package installed.\n const modName = \"@tailwindcss/node\";\n const mod = (await import(modName)) as {\n __unstable__loadDesignSystem?: LoadDesignSystem;\n };\n return mod.__unstable__loadDesignSystem ?? null;\n } catch {\n return null;\n }\n}\n\nfunction parseRootVars(css: string): Record<string, string> {\n const vars: Record<string, string> = {};\n const rootMatch = css.match(/:root\\s*\\{([^}]*)\\}/s);\n if (!rootMatch) return vars;\n for (const decl of rootMatch[1]!.split(\";\")) {\n const trimmed = decl.trim();\n if (!trimmed.startsWith(\"--\")) continue;\n const colon = trimmed.indexOf(\":\");\n if (colon === -1) continue;\n const key = trimmed.slice(0, colon).trim();\n const value = trimmed.slice(colon + 1).trim();\n if (key && value) vars[key] = value;\n }\n return vars;\n}\n\nfunction resolveVars(\n value: string,\n rootVars: Record<string, string>,\n depth = 0,\n): string {\n if (depth > 8) return value;\n return value.replace(\n /var\\(\\s*(--[\\w-]+)(?:\\s*,\\s*([^)]+))?\\s*\\)/g,\n (match, name: string, fallback: string | undefined) => {\n const resolved = rootVars[name];\n if (resolved !== undefined) return resolveVars(resolved, rootVars, depth + 1);\n return fallback ?? match;\n },\n );\n}\n\nasync function generateV4Config(\n cssEntry: string,\n outfile: string,\n load: LoadDesignSystem,\n): Promise<void> {\n const css = await fs.readFile(cssEntry, \"utf8\");\n const ds = await load(css, { base: path.dirname(cssEntry) });\n const rootVars = parseRootVars(css);\n const theme: Record<string, Record<string, string>> = {};\n for (const [configKey, namespace] of Object.entries(V4_NAMESPACES)) {\n const entries: Record<string, string> = {};\n for (const [key, rawValue] of ds.theme.namespace(namespace)) {\n if (key === null) continue;\n entries[key] = resolveVars(rawValue, rootVars);\n }\n theme[configKey] = entries;\n }\n await fs.mkdir(path.dirname(outfile), { recursive: true });\n await fs.writeFile(outfile, JSON.stringify({ theme }, null, 2));\n}\n\nasync function generateV3Config(\n tailwindInputFile: string,\n tailwindIntermediateFile: string,\n tailwindJsonOutfile: string,\n): Promise<void> {\n await esbuild.build({\n entryPoints: [tailwindInputFile],\n outfile: tailwindIntermediateFile,\n bundle: true,\n format: \"esm\",\n banner: {\n js: 'import { createRequire } from \"module\"; const require = createRequire(import.meta.url);',\n },\n });\n try {\n const userConfig = (await import(\n tailwindIntermediateFile + \"?update=\" + Date.now()\n )) as { default?: unknown };\n if (!userConfig || !userConfig.default) {\n throw new Error(\"Invalid Tailwind config structure\");\n }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const resolved = (resolveConfig as any)(userConfig.default);\n await fs.writeFile(tailwindJsonOutfile, JSON.stringify(resolved, null, 2));\n } finally {\n await fs.unlink(tailwindIntermediateFile).catch(() => {});\n }\n}\n\nexport function createTailwindConfigFeature(): TailwindConfigFeature {\n let projectRoot = \"\";\n\n const run = async (): Promise<void> => {\n if (!projectRoot) return;\n const outfile = path.resolve(projectRoot, OUTFILE_RELATIVE);\n\n // Prefer v4 when the CSS entry uses `@import \"tailwindcss\"` and\n // @tailwindcss/node is available.\n const cssEntry = await findV4CssEntry(projectRoot);\n if (cssEntry) {\n const load = await loadDesignSystemFromProject();\n if (load) {\n try {\n await generateV4Config(cssEntry, outfile, load);\n console.log(`[vibe-tagger] wrote ${outfile}`);\n return;\n } catch (error) {\n console.error(\"[vibe-tagger] Error generating v4 tailwind config:\", error);\n return;\n }\n }\n }\n\n // Fall back to v3: compile tailwind.config.ts via esbuild, then resolveConfig.\n const v3ConfigFile = path.resolve(projectRoot, V3_CONFIG_RELATIVE);\n try {\n await fs.access(v3ConfigFile);\n } catch {\n return;\n }\n const intermediate = path.resolve(projectRoot, INTERMEDIATE_RELATIVE);\n try {\n await generateV3Config(v3ConfigFile, intermediate, outfile);\n console.log(`[vibe-tagger] wrote ${outfile}`);\n } catch (error) {\n console.error(\"[vibe-tagger] Error generating v3 tailwind config:\", error);\n }\n };\n\n return {\n onConfigResolved(config) {\n projectRoot = config.root;\n },\n async onBuildStart() {\n await run();\n },\n onConfigureServer() {\n // Use a *separate* chokidar watcher rather than mutating Vite's primary\n // `server.watcher`. On Modal's overlayfs, calling `server.watcher.add()`\n // after Vite initializes its watcher silently disrupts inotify delivery\n // for `src/*.tsx`, breaking HMR for the whole project.\n try {\n const v3ConfigFile = path.resolve(projectRoot, V3_CONFIG_RELATIVE);\n const v4Candidates = V4_CSS_CANDIDATES.map((c) =>\n path.resolve(projectRoot, c),\n );\n chokidar.watch([v3ConfigFile, ...v4Candidates], { ignoreInitial: true })\n .on(\"change\", run);\n } catch (error) {\n console.error(\"[vibe-tagger] Error adding tailwind watcher:\", error);\n }\n },\n };\n}\n","import type { Plugin, ResolvedConfig, ViteDevServer } from \"vite\";\nimport { createJsxTaggerFeature } from \"./features/jsxSource\";\nimport { createTailwindConfigFeature } from \"./features/tailwindConfig\";\n\nexport interface VibeTaggerOptions {\n /** Enable JSX source tagging. Default: true */\n jsxSource?: boolean;\n /**\n * Emit a resolved Tailwind theme JSON to `src/tailwind.config.vibe.json`\n * on build start and on config-file changes. Supports Tailwind v3\n * (reads `tailwind.config.ts`) and v4 (reads `src/styles.css` etc.).\n * Default: false\n */\n tailwindConfig?: boolean;\n /** Enable debug logging. Default: false */\n debug?: boolean;\n}\n\ninterface Feature {\n resolveId?(id: string, importer?: string): string | null;\n load?(id: string): string | null;\n onConfigResolved?(config: ResolvedConfig): void;\n onBuildStart?(): void | Promise<void>;\n onConfigureServer?(server: ViteDevServer): void;\n}\n\nexport function vibeTagger({\n jsxSource = true,\n tailwindConfig = false,\n debug: _debug = false,\n}: VibeTaggerOptions = {}): Plugin {\n const features: Feature[] = [];\n\n if (jsxSource) features.push(createJsxTaggerFeature());\n if (tailwindConfig) features.push(createTailwindConfigFeature());\n\n return {\n name: \"vibe-tagger\",\n enforce: \"pre\",\n\n configResolved(config) {\n for (const feature of features) feature.onConfigResolved?.(config);\n },\n\n async buildStart() {\n for (const feature of features) await feature.onBuildStart?.();\n },\n\n configureServer(server) {\n for (const feature of features) feature.onConfigureServer?.(server);\n },\n\n resolveId(id: string, importer?: string) {\n for (const feature of features) {\n const result = feature.resolveId?.(id, importer);\n if (result !== null && result !== undefined) return result;\n }\n return null;\n },\n\n load(id: string) {\n for (const feature of features) {\n const result = feature.load?.(id);\n if (result !== null && result !== undefined) return result;\n }\n return null;\n },\n };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACGA,IAAM,iBAAiB;AAAA,EACrB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;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","names":["path","fs","resolveConfig","chokidar"]}
|
package/dist/index.js
CHANGED
|
@@ -171,6 +171,7 @@ function createJsxTaggerFeature() {
|
|
|
171
171
|
}
|
|
172
172
|
|
|
173
173
|
// src/features/tailwindConfig.ts
|
|
174
|
+
import chokidar from "chokidar";
|
|
174
175
|
import * as esbuild from "esbuild";
|
|
175
176
|
import fs from "fs/promises";
|
|
176
177
|
import path from "path";
|
|
@@ -325,20 +326,13 @@ function createTailwindConfigFeature() {
|
|
|
325
326
|
async onBuildStart() {
|
|
326
327
|
await run();
|
|
327
328
|
},
|
|
328
|
-
onConfigureServer(
|
|
329
|
+
onConfigureServer() {
|
|
329
330
|
try {
|
|
330
331
|
const v3ConfigFile = path.resolve(projectRoot, V3_CONFIG_RELATIVE);
|
|
331
332
|
const v4Candidates = V4_CSS_CANDIDATES.map(
|
|
332
333
|
(c) => path.resolve(projectRoot, c)
|
|
333
334
|
);
|
|
334
|
-
|
|
335
|
-
for (const p of watchPaths)
|
|
336
|
-
server.watcher.add(p);
|
|
337
|
-
const normalized = new Set(watchPaths.map((p) => path.normalize(p)));
|
|
338
|
-
server.watcher.on("change", async (changedPath) => {
|
|
339
|
-
if (normalized.has(path.normalize(changedPath)))
|
|
340
|
-
await run();
|
|
341
|
-
});
|
|
335
|
+
chokidar.watch([v3ConfigFile, ...v4Candidates], { ignoreInitial: true }).on("change", run);
|
|
342
336
|
} catch (error) {
|
|
343
337
|
console.error("[vibe-tagger] Error adding tailwind watcher:", error);
|
|
344
338
|
}
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/devRuntimeCode.ts","../src/features/jsxSource.ts","../src/features/tailwindConfig.ts","../src/plugin.ts"],"sourcesContent":["// Runtime code that replaces react/jsx-dev-runtime in the browser.\n// Served as a virtual module by the Vite plugin.\n\nconst devRuntimeCode = [\n 'import * as ReactJSXDevRuntime from \"react/jsx-dev-runtime\";',\n \"\",\n \"const _jsxDEV = ReactJSXDevRuntime.jsxDEV;\",\n \"export const Fragment = ReactJSXDevRuntime.Fragment;\",\n \"\",\n // SSR/test guard. Vite SSR, vitest, and Node prerender contexts have no\n // `window` — touching it at module init would crash before any component\n // renders. We still install the wrapper so React's JSX dev runtime stays\n // wired up, but skip the per-element tagging path entirely. Matches\n // lovable-tagger >=1.3.0.\n 'const _isBrowser = typeof window !== \"undefined\";',\n \"\",\n 'const SOURCE_KEY = Symbol.for(\"__jsxSource__\");',\n \"\",\n \"const cleanFileName = (fileName) => {\",\n ' if (!fileName) return \"\";',\n ' if (fileName.includes(\"dev_server\")) {',\n ' fileName = fileName.split(\"dev_server\")[1].slice(1);',\n \" }\",\n ' if (fileName.includes(\"sandbox-scheduler/sandbox\")) {',\n ' const sandboxPart = fileName.split(\"sandbox-scheduler/\")[1];',\n ' fileName = sandboxPart.split(\"/\").slice(1).join(\"/\");',\n \" }\",\n ' return fileName.replace(/^\\\\/dev-server\\\\//, \"\");',\n \"};\",\n \"\",\n \"const sourceElementMap = new Map();\",\n \"if (_isBrowser) {\",\n \" window.sourceElementMap = sourceElementMap;\",\n \"}\",\n \"\",\n \"function getSourceKey(sourceInfo) {\",\n \" return `${cleanFileName(sourceInfo.fileName)}:${sourceInfo.lineNumber}:${sourceInfo.columnNumber}`;\",\n \"}\",\n \"\",\n \"function unregisterElement(node, sourceInfo) {\",\n \" const key = getSourceKey(sourceInfo);\",\n \" const refs = sourceElementMap.get(key);\",\n \" if (refs) {\",\n \" for (const ref of refs) {\",\n \" if (ref.deref() === node) {\",\n \" refs.delete(ref);\",\n \" break;\",\n \" }\",\n \" }\",\n \" if (refs.size === 0) {\",\n \" sourceElementMap.delete(key);\",\n \" }\",\n \" }\",\n \"}\",\n \"\",\n \"function registerElement(node, sourceInfo) {\",\n \" const key = getSourceKey(sourceInfo);\",\n \" if (!sourceElementMap.has(key)) {\",\n \" sourceElementMap.set(key, new Set());\",\n \" }\",\n \" sourceElementMap.get(key).add(new WeakRef(node));\",\n \"}\",\n \"\",\n \"function getTypeName(type) {\",\n ' if (typeof type === \"string\") return type;',\n ' if (typeof type === \"function\") return type.displayName || type.name || \"Unknown\";',\n ' if (typeof type === \"object\" && type !== null) {',\n ' return type.displayName || type.render?.displayName || type.render?.name || \"Unknown\";',\n \" }\",\n ' return \"Unknown\";',\n \"}\",\n \"\",\n \"export function jsxDEV(type, props, key, isStatic, source, self) {\",\n \" // During SSR / non-browser execution, skip all tagging and pass\",\n \" // straight through to React. Touching DOM refs or the source map\",\n \" // here would crash on Node-only paths (Vite SSR, vitest, etc.).\",\n \" if (!_isBrowser) {\",\n \" return _jsxDEV(type, props, key, isStatic, source, self);\",\n \" }\",\n \"\",\n \" // For custom components (like <Icon />, <Button />), tag their rendered output\",\n \" // This captures the JSX element name for library components that don't have source info\",\n ' if (source?.fileName && typeof type !== \"string\" && type !== Fragment) {',\n \" const typeName = getTypeName(type);\",\n \" const jsxSourceInfo = {\",\n \" fileName: cleanFileName(source.fileName),\",\n \" lineNumber: source.lineNumber,\",\n \" columnNumber: source.columnNumber,\",\n \" displayName: typeName,\",\n \" };\",\n \"\",\n \" const originalRef = props?.ref;\",\n \" const enhancedProps = {\",\n \" ...props,\",\n \" ref: (node) => {\",\n \" if (node) {\",\n \" // Only tag if this element doesn't already have source info\",\n \" // (library components won't have it, user components will)\",\n \" if (!node[SOURCE_KEY]) {\",\n \" node[SOURCE_KEY] = jsxSourceInfo;\",\n \" registerElement(node, jsxSourceInfo);\",\n \" }\",\n \" }\",\n ' if (typeof originalRef === \"function\") {',\n \" originalRef(node);\",\n ' } else if (originalRef && typeof originalRef === \"object\") {',\n \" originalRef.current = node;\",\n \" }\",\n \" },\",\n \" };\",\n \"\",\n \" return _jsxDEV(type, enhancedProps, key, isStatic, source, self);\",\n \" }\",\n \"\",\n \" // For host elements (div, span, etc.), tag with component context\",\n ' if (source?.fileName && typeof type === \"string\") {',\n \" const sourceInfo = {\",\n \" fileName: cleanFileName(source.fileName),\",\n \" lineNumber: source.lineNumber,\",\n \" columnNumber: source.columnNumber,\",\n \" displayName: type,\",\n \" };\",\n \"\",\n \" const originalRef = props?.ref;\",\n \"\",\n \" const enhancedProps = {\",\n \" ...props,\",\n \" ref: (node) => {\",\n \" if (node) {\",\n \" const existingSource = node[SOURCE_KEY];\",\n \" if (existingSource) {\",\n \" if (getSourceKey(existingSource) !== getSourceKey(sourceInfo)) {\",\n \" unregisterElement(node, existingSource);\",\n \" node[SOURCE_KEY] = sourceInfo;\",\n \" registerElement(node, sourceInfo);\",\n \" }\",\n \" } else {\",\n \" node[SOURCE_KEY] = sourceInfo;\",\n \" registerElement(node, sourceInfo);\",\n \" }\",\n \" }\",\n ' if (typeof originalRef === \"function\") {',\n \" originalRef(node);\",\n ' } else if (originalRef && typeof originalRef === \"object\") {',\n \" originalRef.current = node;\",\n \" }\",\n \" },\",\n \" };\",\n \" return _jsxDEV(type, enhancedProps, key, isStatic, source, self);\",\n \" }\",\n \"\",\n \" return _jsxDEV(type, props, key, isStatic, source, self);\",\n \"}\",\n].join(\"\\n\");\n\nexport default devRuntimeCode;\n","import devRuntimeCode from \"../devRuntimeCode\";\n\nexport interface JsxSourceFeature {\n resolveId(id: string, importer?: string): string | null;\n load(id: string): string | null;\n}\n\nexport function createJsxTaggerFeature(): JsxSourceFeature {\n return {\n resolveId(id: string, importer?: string): string | null {\n if (id === \"react/jsx-dev-runtime\" && !importer?.includes(\"\\0jsx-source\")) {\n return \"\\0jsx-source/jsx-dev-runtime\";\n }\n return null;\n },\n load(id: string): string | null {\n if (id === \"\\0jsx-source/jsx-dev-runtime\") {\n return devRuntimeCode;\n }\n return null;\n },\n };\n}\n","import type { ResolvedConfig, ViteDevServer } from \"vite\";\nimport * as esbuild from \"esbuild\";\nimport fs from \"fs/promises\";\nimport path from \"path\";\nimport resolveConfig from \"tailwindcss/resolveConfig.js\";\n\nexport interface TailwindConfigFeature {\n onConfigResolved(config: ResolvedConfig): void;\n onBuildStart(): Promise<void>;\n onConfigureServer(server: ViteDevServer): void;\n}\n\nconst V4_CSS_CANDIDATES = [\n \"src/styles.css\",\n \"src/index.css\",\n \"src/globals.css\",\n \"src/app.css\",\n];\n\nconst V4_NAMESPACES: Record<string, string> = {\n colors: \"--color\",\n screens: \"--breakpoint\",\n spacing: \"--spacing\",\n borderRadius: \"--radius\",\n fontFamily: \"--font\",\n opacity: \"--opacity\",\n};\n\nconst OUTFILE_RELATIVE = \"./src/tailwind.config.vibe.json\";\nconst INTERMEDIATE_RELATIVE = \"./.vibe.tailwind.config.js\";\nconst V3_CONFIG_RELATIVE = \"./tailwind.config.ts\";\n\nasync function findV4CssEntry(projectRoot: string): Promise<string | null> {\n for (const candidate of V4_CSS_CANDIDATES) {\n const abs = path.resolve(projectRoot, candidate);\n try {\n const contents = await fs.readFile(abs, \"utf8\");\n if (/@import\\s+[\"']tailwindcss/.test(contents)) return abs;\n } catch {\n // missing file — try next\n }\n }\n return null;\n}\n\ntype LoadDesignSystem = (\n css: string,\n opts: { base: string },\n) => Promise<{\n theme: {\n namespace(ns: string): Iterable<[string | null, string]>;\n };\n}>;\n\nasync function loadDesignSystemFromProject(): Promise<LoadDesignSystem | null> {\n try {\n // Dynamic import so consumers not on v4 don't need the package installed.\n const modName = \"@tailwindcss/node\";\n const mod = (await import(modName)) as {\n __unstable__loadDesignSystem?: LoadDesignSystem;\n };\n return mod.__unstable__loadDesignSystem ?? null;\n } catch {\n return null;\n }\n}\n\nfunction parseRootVars(css: string): Record<string, string> {\n const vars: Record<string, string> = {};\n const rootMatch = css.match(/:root\\s*\\{([^}]*)\\}/s);\n if (!rootMatch) return vars;\n for (const decl of rootMatch[1]!.split(\";\")) {\n const trimmed = decl.trim();\n if (!trimmed.startsWith(\"--\")) continue;\n const colon = trimmed.indexOf(\":\");\n if (colon === -1) continue;\n const key = trimmed.slice(0, colon).trim();\n const value = trimmed.slice(colon + 1).trim();\n if (key && value) vars[key] = value;\n }\n return vars;\n}\n\nfunction resolveVars(\n value: string,\n rootVars: Record<string, string>,\n depth = 0,\n): string {\n if (depth > 8) return value;\n return value.replace(\n /var\\(\\s*(--[\\w-]+)(?:\\s*,\\s*([^)]+))?\\s*\\)/g,\n (match, name: string, fallback: string | undefined) => {\n const resolved = rootVars[name];\n if (resolved !== undefined) return resolveVars(resolved, rootVars, depth + 1);\n return fallback ?? match;\n },\n );\n}\n\nasync function generateV4Config(\n cssEntry: string,\n outfile: string,\n load: LoadDesignSystem,\n): Promise<void> {\n const css = await fs.readFile(cssEntry, \"utf8\");\n const ds = await load(css, { base: path.dirname(cssEntry) });\n const rootVars = parseRootVars(css);\n const theme: Record<string, Record<string, string>> = {};\n for (const [configKey, namespace] of Object.entries(V4_NAMESPACES)) {\n const entries: Record<string, string> = {};\n for (const [key, rawValue] of ds.theme.namespace(namespace)) {\n if (key === null) continue;\n entries[key] = resolveVars(rawValue, rootVars);\n }\n theme[configKey] = entries;\n }\n await fs.mkdir(path.dirname(outfile), { recursive: true });\n await fs.writeFile(outfile, JSON.stringify({ theme }, null, 2));\n}\n\nasync function generateV3Config(\n tailwindInputFile: string,\n tailwindIntermediateFile: string,\n tailwindJsonOutfile: string,\n): Promise<void> {\n await esbuild.build({\n entryPoints: [tailwindInputFile],\n outfile: tailwindIntermediateFile,\n bundle: true,\n format: \"esm\",\n banner: {\n js: 'import { createRequire } from \"module\"; const require = createRequire(import.meta.url);',\n },\n });\n try {\n const userConfig = (await import(\n tailwindIntermediateFile + \"?update=\" + Date.now()\n )) as { default?: unknown };\n if (!userConfig || !userConfig.default) {\n throw new Error(\"Invalid Tailwind config structure\");\n }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const resolved = (resolveConfig as any)(userConfig.default);\n await fs.writeFile(tailwindJsonOutfile, JSON.stringify(resolved, null, 2));\n } finally {\n await fs.unlink(tailwindIntermediateFile).catch(() => {});\n }\n}\n\nexport function createTailwindConfigFeature(): TailwindConfigFeature {\n let projectRoot = \"\";\n\n const run = async (): Promise<void> => {\n if (!projectRoot) return;\n const outfile = path.resolve(projectRoot, OUTFILE_RELATIVE);\n\n // Prefer v4 when the CSS entry uses `@import \"tailwindcss\"` and\n // @tailwindcss/node is available.\n const cssEntry = await findV4CssEntry(projectRoot);\n if (cssEntry) {\n const load = await loadDesignSystemFromProject();\n if (load) {\n try {\n await generateV4Config(cssEntry, outfile, load);\n console.log(`[vibe-tagger] wrote ${outfile}`);\n return;\n } catch (error) {\n console.error(\"[vibe-tagger] Error generating v4 tailwind config:\", error);\n return;\n }\n }\n }\n\n // Fall back to v3: compile tailwind.config.ts via esbuild, then resolveConfig.\n const v3ConfigFile = path.resolve(projectRoot, V3_CONFIG_RELATIVE);\n try {\n await fs.access(v3ConfigFile);\n } catch {\n return;\n }\n const intermediate = path.resolve(projectRoot, INTERMEDIATE_RELATIVE);\n try {\n await generateV3Config(v3ConfigFile, intermediate, outfile);\n console.log(`[vibe-tagger] wrote ${outfile}`);\n } catch (error) {\n console.error(\"[vibe-tagger] Error generating v3 tailwind config:\", error);\n }\n };\n\n return {\n onConfigResolved(config) {\n projectRoot = config.root;\n },\n async onBuildStart() {\n await run();\n },\n onConfigureServer(server) {\n try {\n const v3ConfigFile = path.resolve(projectRoot, V3_CONFIG_RELATIVE);\n const v4Candidates = V4_CSS_CANDIDATES.map((c) =>\n path.resolve(projectRoot, c),\n );\n const watchPaths = [v3ConfigFile, ...v4Candidates];\n for (const p of watchPaths) server.watcher.add(p);\n const normalized = new Set(watchPaths.map((p) => path.normalize(p)));\n server.watcher.on(\"change\", async (changedPath) => {\n if (normalized.has(path.normalize(changedPath))) await run();\n });\n } catch (error) {\n console.error(\"[vibe-tagger] Error adding tailwind watcher:\", error);\n }\n },\n };\n}\n","import type { Plugin, ResolvedConfig, ViteDevServer } from \"vite\";\nimport { createJsxTaggerFeature } from \"./features/jsxSource\";\nimport { createTailwindConfigFeature } from \"./features/tailwindConfig\";\n\nexport interface VibeTaggerOptions {\n /** Enable JSX source tagging. Default: true */\n jsxSource?: boolean;\n /**\n * Emit a resolved Tailwind theme JSON to `src/tailwind.config.vibe.json`\n * on build start and on config-file changes. Supports Tailwind v3\n * (reads `tailwind.config.ts`) and v4 (reads `src/styles.css` etc.).\n * Default: false\n */\n tailwindConfig?: boolean;\n /** Enable debug logging. Default: false */\n debug?: boolean;\n}\n\ninterface Feature {\n resolveId?(id: string, importer?: string): string | null;\n load?(id: string): string | null;\n onConfigResolved?(config: ResolvedConfig): void;\n onBuildStart?(): void | Promise<void>;\n onConfigureServer?(server: ViteDevServer): void;\n}\n\nexport function vibeTagger({\n jsxSource = true,\n tailwindConfig = false,\n debug: _debug = false,\n}: VibeTaggerOptions = {}): Plugin {\n const features: Feature[] = [];\n\n if (jsxSource) features.push(createJsxTaggerFeature());\n if (tailwindConfig) features.push(createTailwindConfigFeature());\n\n return {\n name: \"vibe-tagger\",\n enforce: \"pre\",\n\n configResolved(config) {\n for (const feature of features) feature.onConfigResolved?.(config);\n },\n\n async buildStart() {\n for (const feature of features) await feature.onBuildStart?.();\n },\n\n configureServer(server) {\n for (const feature of features) feature.onConfigureServer?.(server);\n },\n\n resolveId(id: string, importer?: string) {\n for (const feature of features) {\n const result = feature.resolveId?.(id, importer);\n if (result !== null && result !== undefined) return result;\n }\n return null;\n },\n\n load(id: string) {\n for (const feature of features) {\n const result = feature.load?.(id);\n if (result !== null && result !== undefined) return result;\n }\n return null;\n },\n };\n}\n"],"mappings":";AAGA,IAAM,iBAAiB;AAAA,EACrB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,E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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/devRuntimeCode.ts","../src/features/jsxSource.ts","../src/features/tailwindConfig.ts","../src/plugin.ts"],"sourcesContent":["// Runtime code that replaces react/jsx-dev-runtime in the browser.\n// Served as a virtual module by the Vite plugin.\n\nconst devRuntimeCode = [\n 'import * as ReactJSXDevRuntime from \"react/jsx-dev-runtime\";',\n \"\",\n \"const _jsxDEV = ReactJSXDevRuntime.jsxDEV;\",\n \"export const Fragment = ReactJSXDevRuntime.Fragment;\",\n \"\",\n // SSR/test guard. Vite SSR, vitest, and Node prerender contexts have no\n // `window` — touching it at module init would crash before any component\n // renders. We still install the wrapper so React's JSX dev runtime stays\n // wired up, but skip the per-element tagging path entirely. Matches\n // lovable-tagger >=1.3.0.\n 'const _isBrowser = typeof window !== \"undefined\";',\n \"\",\n 'const SOURCE_KEY = Symbol.for(\"__jsxSource__\");',\n \"\",\n \"const cleanFileName = (fileName) => {\",\n ' if (!fileName) return \"\";',\n ' if (fileName.includes(\"dev_server\")) {',\n ' fileName = fileName.split(\"dev_server\")[1].slice(1);',\n \" }\",\n ' if (fileName.includes(\"sandbox-scheduler/sandbox\")) {',\n ' const sandboxPart = fileName.split(\"sandbox-scheduler/\")[1];',\n ' fileName = sandboxPart.split(\"/\").slice(1).join(\"/\");',\n \" }\",\n ' return fileName.replace(/^\\\\/dev-server\\\\//, \"\");',\n \"};\",\n \"\",\n \"const sourceElementMap = new Map();\",\n \"if (_isBrowser) {\",\n \" window.sourceElementMap = sourceElementMap;\",\n \"}\",\n \"\",\n \"function getSourceKey(sourceInfo) {\",\n \" return `${cleanFileName(sourceInfo.fileName)}:${sourceInfo.lineNumber}:${sourceInfo.columnNumber}`;\",\n \"}\",\n \"\",\n \"function unregisterElement(node, sourceInfo) {\",\n \" const key = getSourceKey(sourceInfo);\",\n \" const refs = sourceElementMap.get(key);\",\n \" if (refs) {\",\n \" for (const ref of refs) {\",\n \" if (ref.deref() === node) {\",\n \" refs.delete(ref);\",\n \" break;\",\n \" }\",\n \" }\",\n \" if (refs.size === 0) {\",\n \" sourceElementMap.delete(key);\",\n \" }\",\n \" }\",\n \"}\",\n \"\",\n \"function registerElement(node, sourceInfo) {\",\n \" const key = getSourceKey(sourceInfo);\",\n \" if (!sourceElementMap.has(key)) {\",\n \" sourceElementMap.set(key, new Set());\",\n \" }\",\n \" sourceElementMap.get(key).add(new WeakRef(node));\",\n \"}\",\n \"\",\n \"function getTypeName(type) {\",\n ' if (typeof type === \"string\") return type;',\n ' if (typeof type === \"function\") return type.displayName || type.name || \"Unknown\";',\n ' if (typeof type === \"object\" && type !== null) {',\n ' return type.displayName || type.render?.displayName || type.render?.name || \"Unknown\";',\n \" }\",\n ' return \"Unknown\";',\n \"}\",\n \"\",\n \"export function jsxDEV(type, props, key, isStatic, source, self) {\",\n \" // During SSR / non-browser execution, skip all tagging and pass\",\n \" // straight through to React. Touching DOM refs or the source map\",\n \" // here would crash on Node-only paths (Vite SSR, vitest, etc.).\",\n \" if (!_isBrowser) {\",\n \" return _jsxDEV(type, props, key, isStatic, source, self);\",\n \" }\",\n \"\",\n \" // For custom components (like <Icon />, <Button />), tag their rendered output\",\n \" // This captures the JSX element name for library components that don't have source info\",\n ' if (source?.fileName && typeof type !== \"string\" && type !== Fragment) {',\n \" const typeName = getTypeName(type);\",\n \" const jsxSourceInfo = {\",\n \" fileName: cleanFileName(source.fileName),\",\n \" lineNumber: source.lineNumber,\",\n \" columnNumber: source.columnNumber,\",\n \" displayName: typeName,\",\n \" };\",\n \"\",\n \" const originalRef = props?.ref;\",\n \" const enhancedProps = {\",\n \" ...props,\",\n \" ref: (node) => {\",\n \" if (node) {\",\n \" // Only tag if this element doesn't already have source info\",\n \" // (library components won't have it, user components will)\",\n \" if (!node[SOURCE_KEY]) {\",\n \" node[SOURCE_KEY] = jsxSourceInfo;\",\n \" registerElement(node, jsxSourceInfo);\",\n \" }\",\n \" }\",\n ' if (typeof originalRef === \"function\") {',\n \" originalRef(node);\",\n ' } else if (originalRef && typeof originalRef === \"object\") {',\n \" originalRef.current = node;\",\n \" }\",\n \" },\",\n \" };\",\n \"\",\n \" return _jsxDEV(type, enhancedProps, key, isStatic, source, self);\",\n \" }\",\n \"\",\n \" // For host elements (div, span, etc.), tag with component context\",\n ' if (source?.fileName && typeof type === \"string\") {',\n \" const sourceInfo = {\",\n \" fileName: cleanFileName(source.fileName),\",\n \" lineNumber: source.lineNumber,\",\n \" columnNumber: source.columnNumber,\",\n \" displayName: type,\",\n \" };\",\n \"\",\n \" const originalRef = props?.ref;\",\n \"\",\n \" const enhancedProps = {\",\n \" ...props,\",\n \" ref: (node) => {\",\n \" if (node) {\",\n \" const existingSource = node[SOURCE_KEY];\",\n \" if (existingSource) {\",\n \" if (getSourceKey(existingSource) !== getSourceKey(sourceInfo)) {\",\n \" unregisterElement(node, existingSource);\",\n \" node[SOURCE_KEY] = sourceInfo;\",\n \" registerElement(node, sourceInfo);\",\n \" }\",\n \" } else {\",\n \" node[SOURCE_KEY] = sourceInfo;\",\n \" registerElement(node, sourceInfo);\",\n \" }\",\n \" }\",\n ' if (typeof originalRef === \"function\") {',\n \" originalRef(node);\",\n ' } else if (originalRef && typeof originalRef === \"object\") {',\n \" originalRef.current = node;\",\n \" }\",\n \" },\",\n \" };\",\n \" return _jsxDEV(type, enhancedProps, key, isStatic, source, self);\",\n \" }\",\n \"\",\n \" return _jsxDEV(type, props, key, isStatic, source, self);\",\n \"}\",\n].join(\"\\n\");\n\nexport default devRuntimeCode;\n","import devRuntimeCode from \"../devRuntimeCode\";\n\nexport interface JsxSourceFeature {\n resolveId(id: string, importer?: string): string | null;\n load(id: string): string | null;\n}\n\nexport function createJsxTaggerFeature(): JsxSourceFeature {\n return {\n resolveId(id: string, importer?: string): string | null {\n if (id === \"react/jsx-dev-runtime\" && !importer?.includes(\"\\0jsx-source\")) {\n return \"\\0jsx-source/jsx-dev-runtime\";\n }\n return null;\n },\n load(id: string): string | null {\n if (id === \"\\0jsx-source/jsx-dev-runtime\") {\n return devRuntimeCode;\n }\n return null;\n },\n };\n}\n","import type { ResolvedConfig, ViteDevServer } from \"vite\";\nimport chokidar from \"chokidar\";\nimport * as esbuild from \"esbuild\";\nimport fs from \"fs/promises\";\nimport path from \"path\";\nimport resolveConfig from \"tailwindcss/resolveConfig.js\";\n\nexport interface TailwindConfigFeature {\n onConfigResolved(config: ResolvedConfig): void;\n onBuildStart(): Promise<void>;\n onConfigureServer(server: ViteDevServer): void;\n}\n\nconst V4_CSS_CANDIDATES = [\n \"src/styles.css\",\n \"src/index.css\",\n \"src/globals.css\",\n \"src/app.css\",\n];\n\nconst V4_NAMESPACES: Record<string, string> = {\n colors: \"--color\",\n screens: \"--breakpoint\",\n spacing: \"--spacing\",\n borderRadius: \"--radius\",\n fontFamily: \"--font\",\n opacity: \"--opacity\",\n};\n\nconst OUTFILE_RELATIVE = \"./src/tailwind.config.vibe.json\";\nconst INTERMEDIATE_RELATIVE = \"./.vibe.tailwind.config.js\";\nconst V3_CONFIG_RELATIVE = \"./tailwind.config.ts\";\n\nasync function findV4CssEntry(projectRoot: string): Promise<string | null> {\n for (const candidate of V4_CSS_CANDIDATES) {\n const abs = path.resolve(projectRoot, candidate);\n try {\n const contents = await fs.readFile(abs, \"utf8\");\n if (/@import\\s+[\"']tailwindcss/.test(contents)) return abs;\n } catch {\n // missing file — try next\n }\n }\n return null;\n}\n\ntype LoadDesignSystem = (\n css: string,\n opts: { base: string },\n) => Promise<{\n theme: {\n namespace(ns: string): Iterable<[string | null, string]>;\n };\n}>;\n\nasync function loadDesignSystemFromProject(): Promise<LoadDesignSystem | null> {\n try {\n // Dynamic import so consumers not on v4 don't need the package installed.\n const modName = \"@tailwindcss/node\";\n const mod = (await import(modName)) as {\n __unstable__loadDesignSystem?: LoadDesignSystem;\n };\n return mod.__unstable__loadDesignSystem ?? null;\n } catch {\n return null;\n }\n}\n\nfunction parseRootVars(css: string): Record<string, string> {\n const vars: Record<string, string> = {};\n const rootMatch = css.match(/:root\\s*\\{([^}]*)\\}/s);\n if (!rootMatch) return vars;\n for (const decl of rootMatch[1]!.split(\";\")) {\n const trimmed = decl.trim();\n if (!trimmed.startsWith(\"--\")) continue;\n const colon = trimmed.indexOf(\":\");\n if (colon === -1) continue;\n const key = trimmed.slice(0, colon).trim();\n const value = trimmed.slice(colon + 1).trim();\n if (key && value) vars[key] = value;\n }\n return vars;\n}\n\nfunction resolveVars(\n value: string,\n rootVars: Record<string, string>,\n depth = 0,\n): string {\n if (depth > 8) return value;\n return value.replace(\n /var\\(\\s*(--[\\w-]+)(?:\\s*,\\s*([^)]+))?\\s*\\)/g,\n (match, name: string, fallback: string | undefined) => {\n const resolved = rootVars[name];\n if (resolved !== undefined) return resolveVars(resolved, rootVars, depth + 1);\n return fallback ?? match;\n },\n );\n}\n\nasync function generateV4Config(\n cssEntry: string,\n outfile: string,\n load: LoadDesignSystem,\n): Promise<void> {\n const css = await fs.readFile(cssEntry, \"utf8\");\n const ds = await load(css, { base: path.dirname(cssEntry) });\n const rootVars = parseRootVars(css);\n const theme: Record<string, Record<string, string>> = {};\n for (const [configKey, namespace] of Object.entries(V4_NAMESPACES)) {\n const entries: Record<string, string> = {};\n for (const [key, rawValue] of ds.theme.namespace(namespace)) {\n if (key === null) continue;\n entries[key] = resolveVars(rawValue, rootVars);\n }\n theme[configKey] = entries;\n }\n await fs.mkdir(path.dirname(outfile), { recursive: true });\n await fs.writeFile(outfile, JSON.stringify({ theme }, null, 2));\n}\n\nasync function generateV3Config(\n tailwindInputFile: string,\n tailwindIntermediateFile: string,\n tailwindJsonOutfile: string,\n): Promise<void> {\n await esbuild.build({\n entryPoints: [tailwindInputFile],\n outfile: tailwindIntermediateFile,\n bundle: true,\n format: \"esm\",\n banner: {\n js: 'import { createRequire } from \"module\"; const require = createRequire(import.meta.url);',\n },\n });\n try {\n const userConfig = (await import(\n tailwindIntermediateFile + \"?update=\" + Date.now()\n )) as { default?: unknown };\n if (!userConfig || !userConfig.default) {\n throw new Error(\"Invalid Tailwind config structure\");\n }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const resolved = (resolveConfig as any)(userConfig.default);\n await fs.writeFile(tailwindJsonOutfile, JSON.stringify(resolved, null, 2));\n } finally {\n await fs.unlink(tailwindIntermediateFile).catch(() => {});\n }\n}\n\nexport function createTailwindConfigFeature(): TailwindConfigFeature {\n let projectRoot = \"\";\n\n const run = async (): Promise<void> => {\n if (!projectRoot) return;\n const outfile = path.resolve(projectRoot, OUTFILE_RELATIVE);\n\n // Prefer v4 when the CSS entry uses `@import \"tailwindcss\"` and\n // @tailwindcss/node is available.\n const cssEntry = await findV4CssEntry(projectRoot);\n if (cssEntry) {\n const load = await loadDesignSystemFromProject();\n if (load) {\n try {\n await generateV4Config(cssEntry, outfile, load);\n console.log(`[vibe-tagger] wrote ${outfile}`);\n return;\n } catch (error) {\n console.error(\"[vibe-tagger] Error generating v4 tailwind config:\", error);\n return;\n }\n }\n }\n\n // Fall back to v3: compile tailwind.config.ts via esbuild, then resolveConfig.\n const v3ConfigFile = path.resolve(projectRoot, V3_CONFIG_RELATIVE);\n try {\n await fs.access(v3ConfigFile);\n } catch {\n return;\n }\n const intermediate = path.resolve(projectRoot, INTERMEDIATE_RELATIVE);\n try {\n await generateV3Config(v3ConfigFile, intermediate, outfile);\n console.log(`[vibe-tagger] wrote ${outfile}`);\n } catch (error) {\n console.error(\"[vibe-tagger] Error generating v3 tailwind config:\", error);\n }\n };\n\n return {\n onConfigResolved(config) {\n projectRoot = config.root;\n },\n async onBuildStart() {\n await run();\n },\n onConfigureServer() {\n // Use a *separate* chokidar watcher rather than mutating Vite's primary\n // `server.watcher`. On Modal's overlayfs, calling `server.watcher.add()`\n // after Vite initializes its watcher silently disrupts inotify delivery\n // for `src/*.tsx`, breaking HMR for the whole project.\n try {\n const v3ConfigFile = path.resolve(projectRoot, V3_CONFIG_RELATIVE);\n const v4Candidates = V4_CSS_CANDIDATES.map((c) =>\n path.resolve(projectRoot, c),\n );\n chokidar.watch([v3ConfigFile, ...v4Candidates], { ignoreInitial: true })\n .on(\"change\", run);\n } catch (error) {\n console.error(\"[vibe-tagger] Error adding tailwind watcher:\", error);\n }\n },\n };\n}\n","import type { Plugin, ResolvedConfig, ViteDevServer } from \"vite\";\nimport { createJsxTaggerFeature } from \"./features/jsxSource\";\nimport { createTailwindConfigFeature } from \"./features/tailwindConfig\";\n\nexport interface VibeTaggerOptions {\n /** Enable JSX source tagging. Default: true */\n jsxSource?: boolean;\n /**\n * Emit a resolved Tailwind theme JSON to `src/tailwind.config.vibe.json`\n * on build start and on config-file changes. Supports Tailwind v3\n * (reads `tailwind.config.ts`) and v4 (reads `src/styles.css` etc.).\n * Default: false\n */\n tailwindConfig?: boolean;\n /** Enable debug logging. Default: false */\n debug?: boolean;\n}\n\ninterface Feature {\n resolveId?(id: string, importer?: string): string | null;\n load?(id: string): string | null;\n onConfigResolved?(config: ResolvedConfig): void;\n onBuildStart?(): void | Promise<void>;\n onConfigureServer?(server: ViteDevServer): void;\n}\n\nexport function vibeTagger({\n jsxSource = true,\n tailwindConfig = false,\n debug: _debug = false,\n}: VibeTaggerOptions = {}): Plugin {\n const features: Feature[] = [];\n\n if (jsxSource) features.push(createJsxTaggerFeature());\n if (tailwindConfig) features.push(createTailwindConfigFeature());\n\n return {\n name: \"vibe-tagger\",\n enforce: \"pre\",\n\n configResolved(config) {\n for (const feature of features) feature.onConfigResolved?.(config);\n },\n\n async buildStart() {\n for (const feature of features) await feature.onBuildStart?.();\n },\n\n configureServer(server) {\n for (const feature of features) feature.onConfigureServer?.(server);\n },\n\n resolveId(id: string, importer?: string) {\n for (const feature of features) {\n const result = feature.resolveId?.(id, importer);\n if (result !== null && result !== undefined) return result;\n }\n return null;\n },\n\n load(id: string) {\n for (const feature of features) {\n const result = feature.load?.(id);\n if (result !== null && result !== undefined) return result;\n }\n return null;\n },\n };\n}\n"],"mappings":";AAGA,IAAM,iBAAiB;AAAA,EACrB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,E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","names":[]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@leadconnector/vibe-tagger",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.1",
|
|
4
4
|
"description": "Vite plugin that instruments React JSX elements with source-location metadata for visual editing",
|
|
5
5
|
"main": "./dist/index.js",
|
|
6
6
|
"module": "./dist/index.mjs",
|
|
@@ -37,6 +37,7 @@
|
|
|
37
37
|
}
|
|
38
38
|
},
|
|
39
39
|
"dependencies": {
|
|
40
|
+
"chokidar": "^3.6.0",
|
|
40
41
|
"esbuild": "^0.25.0",
|
|
41
42
|
"tailwindcss": "^3.4.0"
|
|
42
43
|
},
|